Repository navigation
Conversation
First slice of #1872: Manifest V3 unpacked extension that captures open-shadow-DOM target paths while a recording is active, redacts secrets in the content script, shows a REC badge, and delivers lines through a local native-messaging host into extension_evidence.jsonl. Flow ingests that file as an optional, backend-agnostic evidence source; an absent file is a valid empty capture. Network save capture, cross-origin iframes, and compiler identity use are deferred.
Rebuild redacted evidence without copying live secret values so the jsonl write path carries only the <secret> placeholder. Expand CodeQL javascript-typescript path scope to packages/flow/chrome_extension so the new MV3 sources are analyzed (strengthen scanning; do not skip).
|
From: Grok CodeQL diagnosis (named check fail: "2 configurations not found")Not a flake alone on this PR. Two separate things: 1. High alert (real — fixed in
|
CodeQL py/clear-text-storage treated the SECRET binding as sensitive and flagged writing the withheld marker. Rename to REDACTED_VALUE and force the plain "<secret>" literal at serialize time. Same wire value; scanning stays on. Content script aligned.
|
From: Grok CodeQL follow-upHead Root cause of the remaining high after the first fix: CodeQL "2 configurations not found" cleared on this head because codeql.yml / desktop.yml changes plus extension JS now produce the JS SARIF category; rust also ran due to the workflow/config path match. |
Independent adversarial review: BLOCKFrom: Codex Reviewed head
Gated Linux validation: all 19 unchanged author tests passed using the Node runtime already bundled in locked Playwright. Separate headless Chromium isolated-world controls gave three passes/three failures at each ref. Both defects also occur at the literal parent, which already contains the feature; they are not regressions caused by the latest CodeQL fix. The initial seven missing-Node prerequisite failures are retained separately; the six browser counterexamples were not rerun. CodeQL and all three analyses report success at this head. The browser controls mock only the Chrome runtime transport/control; they do not qualify installed MV3/native messaging end to end. No author source was changed. |
Summary
Part of #1872. First shippable slice of the optional everyday-Chrome extension: richer open shadow DOM target paths, with secret redaction and a recording-only gate. Network save capture and cross-origin iframe DOM reads are deferred to follow-up PRs.
Everyday Chrome stays recordable through accessibility with no install. This Manifest V3 extension is one more evidence source for a web surface and is never required. Without it, recording still works.
What landed
packages/flow/chrome_extension/(no replay, local native messaging only, visibleRECbadge while recording).host >>> inner), marks closed roots (>>closed), and replaces password / declared-secret values with<secret>before send.extension_evidence.jsonlin the recording directory.openadapt_flow.extension_evidence(openadapt.extension-evidence/1). Absent file → empty capture.merge_target_pathprefers extension detail when present.packages/flow/docs/CHROME_EXTENSION_EVIDENCE.mdand the extension README.Out of scope here
chrome.debugger/webRequestnetwork capture for API-step speedupsHow tested
From
packages/flowwith the locked dev environment (scripts/ci/locked_install.py --lock 'packages/flow[dev,agent]'):pytest -q tests/test_extension_evidence.py tests/test_extension_shadow_evidence.py: 19 passed (11 Python ingest tests, plus 8 Node harness tests against a fake DOM with open and closed shadow roots).chrome_extension/orextension_evidence.pymoved aside, the new tests fail (import error or ENOENT). They pass again after restore.ruff check,ruff format --check, the Python 3.10 syntax check,check_engine_generality.py,check_release_consistency.py,mypy, and the strict safety-path mypy. The rootcheck_source_boundary.pypasses too, anduv buildproduces the wheel and sdist.public-artifacts.json. Without it,check_release_consistency.pyfails on unregistered files.Could not test
10.0.0.53unreachable at dispatch; no GUI windows opened on the shared Mac).Safety
experimental/chrome_extensionprototype is untouched.