oh-my-opencode 5.0.0-beta.85 → 5.0.0-beta.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/codex-qa/SKILL.md +2 -0
- package/.agents/skills/hyperplan/SKILL.md +1 -1
- package/.agents/skills/senpi-qa/SKILL.md +9 -3
- package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +4 -4
- package/.opencode/skills/hyperplan/SKILL.md +1 -1
- package/README.md +1 -1
- package/dist/cli/index.js +68 -41
- package/dist/cli-node/index.js +68 -41
- package/dist/index.js +126 -107
- package/dist/skills/browser/ATTRIBUTION.md +26 -14
- package/dist/skills/browser/SKILL.md +65 -52
- package/dist/skills/browser/references/commands.md +81 -66
- package/dist/skills/browser/references/install.md +31 -34
- package/dist/skills/browser/references/owned-engine/README.md +41 -21
- package/dist/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/dist/skills/browser/references/owned-engine/ladder.md +24 -22
- package/dist/skills/browser/references/owned-engine/network.md +35 -15
- package/dist/skills/browser/references/recipes/1password.md +13 -11
- package/dist/skills/browser/references/remote.md +5 -4
- package/dist/skills/browser/runtime/omowright/index.js +1534 -0
- package/dist/skills/browser/runtime/omowright/manifest.json +9 -0
- package/dist/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/dist/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/dist/skills/browser/scripts/browser-install.mjs +31 -44
- package/dist/skills/browser/scripts/omowright.mjs +25 -0
- package/dist/skills/debugging/SKILL.md +2 -2
- package/dist/skills/debugging/references/methodology/06-fix.md +3 -3
- package/dist/skills/debugging/references/methodology/08-qa.md +1 -1
- package/dist/skills/debugging/references/tools/browser-qa.md +104 -0
- package/dist/skills/frontend/SKILL.md +1 -1
- package/dist/skills/frontend/references/design/clone-from-url.md +1 -1
- package/dist/skills/programming/SKILL.md +12 -18
- package/dist/skills/programming/references/rust/README.md +43 -15
- package/dist/skills/programming/references/rust/api-design.md +81 -0
- package/dist/skills/programming/references/rust/async-tokio.md +60 -28
- package/dist/skills/programming/references/rust/axum-stack.md +1 -13
- package/dist/skills/programming/references/rust/cargo-strict.md +44 -8
- package/dist/skills/programming/references/rust/clap-stack.md +8 -3
- package/dist/skills/programming/references/rust/concurrency.md +66 -52
- package/dist/skills/programming/references/rust/libraries.md +35 -25
- package/dist/skills/programming/references/rust/macros.md +63 -0
- package/dist/skills/programming/references/rust/one-liners.md +5 -3
- package/dist/skills/programming/references/rust/proptest-insta.md +8 -0
- package/dist/skills/programming/references/rust/type-state.md +50 -12
- package/dist/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/dist/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/dist/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/dist/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/dist/skills/programming/scripts/rust/new-project.py +31 -28
- package/dist/skills/review-work/SKILL.md +1 -1
- package/dist/skills/ultimate-browsing/SKILL.md +27 -20
- package/dist/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/dist/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/dist/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/dist/skills/ulw-execute/SKILL.md +4 -4
- package/dist/skills/visual-qa/SKILL.md +1 -1
- package/dist/skills/visual-qa/references/browser-setup.md +46 -46
- package/dist/tui.js +47 -23
- package/package.json +15 -14
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +63 -89
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +63 -89
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
- package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +65 -52
- package/packages/omo-codex/plugin/skills/browser/references/commands.md +81 -66
- package/packages/omo-codex/plugin/skills/browser/references/install.md +31 -34
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +13 -11
- package/packages/omo-codex/plugin/skills/browser/references/remote.md +5 -4
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
- package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
- package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
- package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
- package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +63 -89
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +46 -46
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
- package/packages/prompts-core/prompts/ultrawork/codex.md +63 -89
- package/packages/shared-skills/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/shared-skills/skills/browser/SKILL.md +65 -52
- package/packages/shared-skills/skills/browser/references/commands.md +81 -66
- package/packages/shared-skills/skills/browser/references/install.md +31 -34
- package/packages/shared-skills/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/shared-skills/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/shared-skills/skills/browser/references/recipes/1password.md +13 -11
- package/packages/shared-skills/skills/browser/references/remote.md +5 -4
- package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -2
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +12 -18
- package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
- package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
- package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
- package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
- package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
- package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +4 -4
- package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +46 -46
- package/dist/skills/browser/scripts/browser-env.mjs +0 -41
- package/dist/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/dist/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
|
@@ -5,12 +5,12 @@ defect.** The failure itself selects the next rung; never pause to ask which.
|
|
|
5
5
|
|
|
6
6
|
| Rung | Use | Climb when |
|
|
7
7
|
|---|---|---|
|
|
8
|
-
| 1. snapshot + locator(ref) | anything with a usable ref | the ref is absent, stale, obscured, or the click lands on the wrong node twice |
|
|
9
|
-
| 1b.
|
|
10
|
-
| 2. coordinates | canvas, extension popups, custom controls, drag surfaces | the click misses, or the screenshot and the coordinates disagree |
|
|
11
|
-
| 3. pin the viewport, redo rung 2 | coordinate drift after a resize, a DPI change, or a foreign tab | coordinates land correctly but the widget still refuses input |
|
|
12
|
-
| 4.
|
|
13
|
-
| 5. read the browser log | a browser-level failure | the log names a cause outside the page |
|
|
8
|
+
| 1. `page.snapshot()` + `page.locator(ref)` | anything with a usable ref | the ref is absent, stale, obscured, or the click lands on the wrong node twice |
|
|
9
|
+
| 1b. `snapshotWithLayers(page)` / `describeLayers(page)` | a blocking overlay explains two identical misses | `@layers none`, or the overlay is gone and the click still misses |
|
|
10
|
+
| 2. `createCua(page)` coordinates | canvas, extension popups, custom controls, drag surfaces | the click misses, or the screenshot and the coordinates disagree |
|
|
11
|
+
| 3. pin the viewport (`emulate(page, "desktop-1440")` / `repinViewport`), redo rung 2 | coordinate drift after a resize, a DPI change, or a foreign tab | coordinates land correctly but the widget still refuses input |
|
|
12
|
+
| 4. `createCaptcha(page)` | a challenge is the blocker | it clears and the flow still stalls |
|
|
13
|
+
| 5. read the browser log (`browser.close()` surfaces the stdio tail) | a browser-level failure | the log names a cause outside the page |
|
|
14
14
|
|
|
15
15
|
**Rung 5 ends in a written diagnosis, never a speculative code change.** A missing entitlement, a
|
|
16
16
|
dead extension service worker, an unavailable authenticator — none of those is fixed by editing
|
|
@@ -18,38 +18,40 @@ automation code.
|
|
|
18
18
|
|
|
19
19
|
## Pin the viewport before trusting any coordinate
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
`createCua(page)` acts in viewport pixels. When the render surface and the coordinate space
|
|
22
22
|
disagree, every coordinate is off by the same constant and retrying just repeats the miss. Set the
|
|
23
|
-
device metrics explicitly (width, height, `deviceScaleFactor
|
|
24
|
-
the page's viewport size, then take a **fresh**
|
|
25
|
-
screenshot are stale. Pin every page you act on, including tabs
|
|
23
|
+
device metrics explicitly (`emulate` applies width, height, `deviceScaleFactor` and touch
|
|
24
|
+
together), re-read the page's viewport size, then take a **fresh** `cua.getVisibleScreenshot()`.
|
|
25
|
+
Coordinates read off an unpinned screenshot are stale. Pin every page you act on, including tabs
|
|
26
|
+
you did not open (`createAgentTabs` re-pins on create).
|
|
26
27
|
|
|
27
28
|
## Refs
|
|
28
29
|
|
|
29
30
|
- Refs die on every new snapshot. Pass a ref straight from the latest snapshot; never reuse one
|
|
30
31
|
across snapshots and never put one in a CSS selector.
|
|
31
|
-
- Refs stay page-level. A child-frame ref still resolves through
|
|
32
|
-
frame handle to click inside an iframe.
|
|
33
|
-
- Always
|
|
32
|
+
- Refs stay page-level. A child-frame ref (`f1e3`) still resolves through `page.locator`, so you
|
|
33
|
+
never fetch a frame handle to click inside an iframe.
|
|
34
|
+
- Always `compactSnapshot()` before sending a snapshot to a model.
|
|
34
35
|
|
|
35
36
|
## Challenge widgets
|
|
36
37
|
|
|
37
38
|
A challenge is an obstacle on the path, not a stop sign: clear it, confirm it cleared, continue.
|
|
38
|
-
|
|
39
|
+
`createCaptcha(page)` gives three techniques:
|
|
39
40
|
|
|
40
|
-
- **Checkbox** (the common embedded widgets): the control lives in a nested frame, so
|
|
41
|
-
by viewport coordinates.
|
|
42
|
-
- **Slider / puzzle**: drag
|
|
43
|
-
human. Raise the step count before you change the endpoints.
|
|
44
|
-
- **Text or number**:
|
|
45
|
-
|
|
46
|
-
- **Image grid**: annotate a screenshot, then click per cell
|
|
41
|
+
- **Checkbox** (the common embedded widgets): the control lives in a nested frame, so
|
|
42
|
+
`captcha.click(bounds)` addresses it by viewport coordinates.
|
|
43
|
+
- **Slider / puzzle**: `captcha.drag(from, to, { steps })` with enough intermediate steps that the
|
|
44
|
+
motion reads as human. Raise the step count before you change the endpoints.
|
|
45
|
+
- **Text or number**: `captcha.readText(bounds)` OCRs the region — the macOS Vision framework by
|
|
46
|
+
default, or pass your own `ocr` function or a vision model.
|
|
47
|
+
- **Image grid**: annotate a screenshot, then click per cell with `createCua`.
|
|
47
48
|
|
|
48
49
|
**Bounds measured against an unpinned viewport are wrong by a constant offset.** If clicks have
|
|
49
50
|
been landing wrong, drop to rung 3 first, then re-read the bounds.
|
|
50
51
|
|
|
51
52
|
Verify with a fresh snapshot that the challenge is gone. Verification is part of the action, not a
|
|
52
|
-
separate optimistic assumption.
|
|
53
|
+
separate optimistic assumption. When every technique fails on a page a real browser passes, the
|
|
54
|
+
engine is the variable: relaunch through `connectCloakProfile()`.
|
|
53
55
|
|
|
54
56
|
## Delegating the pixel loop
|
|
55
57
|
|
|
@@ -6,37 +6,57 @@ next week. Watching traffic costs nothing on a target you own, and the page cann
|
|
|
6
6
|
|
|
7
7
|
**Snoop before you scrape.** Scroll-and-parse is the fallback, not the default.
|
|
8
8
|
|
|
9
|
+
```js
|
|
10
|
+
const snoop = omowright.createNetworkSnoop(page, { maxBodyBytes: 512 * 1024 })
|
|
11
|
+
await page.goto(url)
|
|
12
|
+
const hit = await snoop.waitFor({ url: /\/api\/search/, mimeType: "application/json" }, { timeoutMs: 10_000 })
|
|
13
|
+
const rows = snoop.popJson() // every buffered JSON body, drained
|
|
14
|
+
console.log(snoop.summary({ max: 20 })) // one line per request: method status mime size url
|
|
15
|
+
snoop.dispose()
|
|
16
|
+
```
|
|
17
|
+
|
|
9
18
|
## Wait for a request, never for a clock
|
|
10
19
|
|
|
11
|
-
A fixed sleep is a guess that fails on a slower machine and wastes time on a faster one.
|
|
12
|
-
to the response you expect **before**
|
|
13
|
-
timeout. This is the same rule that governs test code, for the same
|
|
20
|
+
A fixed sleep is a guess that fails on a slower machine and wastes time on a faster one.
|
|
21
|
+
`snoop.waitFor(match)` subscribes to the response you expect **before** you trigger the action,
|
|
22
|
+
then awaits it with a bounded timeout. This is the same rule that governs test code, for the same
|
|
23
|
+
reason.
|
|
14
24
|
|
|
15
25
|
## Collecting through infinite scroll
|
|
16
26
|
|
|
17
|
-
|
|
18
|
-
|
|
27
|
+
```js
|
|
28
|
+
for await (const batch of omowright.collectWhileScrolling(page, snoop, { minItems: 200, maxScrolls: 10, extract: (json) => json.items })) {
|
|
29
|
+
items.push(...batch)
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Scroll, collect what is new, stop on a target count or a scroll ceiling. Bound both, so a page
|
|
34
|
+
that keeps producing cannot run forever.
|
|
19
35
|
|
|
20
36
|
## Flight traces
|
|
21
37
|
|
|
22
|
-
For QA evidence,
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
For QA evidence, `createTrace(page, { dir })` records one entry per `trace.step(name, fn)` with
|
|
39
|
+
before/after screenshots, the network log and console output, written as `trace.jsonl` plus
|
|
40
|
+
`trace.har` (`toHar` builds the HAR from snoop entries). That triple is what makes a failure
|
|
41
|
+
reconstructable afterwards instead of re-runnable-in-theory. Call `trace.stop()` in `finally`.
|
|
25
42
|
|
|
26
43
|
Cap recorded body sizes. An untrimmed trace of a media-heavy page is mostly bytes nobody reads.
|
|
27
44
|
|
|
28
45
|
## Request interception
|
|
29
46
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
47
|
+
`createRoutes(page)` matches by glob, regular expression, or predicate and lets a handler
|
|
48
|
+
`continue`, `fulfill({ status, body })` or `abort()`: stub an endpoint, fail one request to test an
|
|
49
|
+
error path, block third-party noise. Interception is enabled on the first route and disabled on
|
|
50
|
+
`dispose()` — leaving it on slows every later navigation and changes the timing fingerprint, so
|
|
51
|
+
prefer passive snooping on bot-scored targets.
|
|
33
52
|
|
|
34
53
|
## Cookies
|
|
35
54
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
55
|
+
`injectCookies(page, cookies)` sanitizes what it injects (drops expired entries, keeps
|
|
56
|
+
host-prefixed cookies secure and root-scoped). Injecting an export into your own profile is
|
|
57
|
+
legitimate for ordinary sessions and useless for the ones you most want: accounts whose risk
|
|
58
|
+
engines bind a session to a device will invalidate it, and a password manager's session is
|
|
59
|
+
tab-bound and never portable.
|
|
40
60
|
|
|
41
61
|
**Never copy a session out of the user's real browser profile.** If you need their login, that is
|
|
42
62
|
the attached engine's job.
|
|
@@ -16,25 +16,27 @@ not in a cookie. So:
|
|
|
16
16
|
Therefore: borrow the existing tab, read, return it. Do not open, do not navigate away, do not
|
|
17
17
|
"refresh to fix" anything.
|
|
18
18
|
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
```js
|
|
20
|
+
const { tabs } = await session.tabList({ scope: "user" }) // find the already-signed-in tab by URL
|
|
21
|
+
const vault = tabs.find((t) => /my\.1password\.com\/(?:vaults|app)/.test(t.url))
|
|
22
|
+
await session.tabBorrow(vault.tab_id) // the user confirms
|
|
23
|
+
// ... read ...
|
|
24
|
+
await session.tabReturn(vault.tab_id)
|
|
24
25
|
```
|
|
25
26
|
|
|
26
27
|
## Check liveness by URL, never by title
|
|
27
28
|
|
|
28
29
|
The app mutates its URL hash without updating the document title, so a signed-in vault can still
|
|
29
30
|
report a sign-in title. A live session's `location.href` contains the app path and never the
|
|
30
|
-
sign-in path. Read the URL.
|
|
31
|
+
sign-in path. Read the URL from `tabList`, or `session.evaluate("location.href")`.
|
|
31
32
|
|
|
32
33
|
## The browser may be shared
|
|
33
34
|
|
|
34
35
|
Other automation may be driving the same window.
|
|
35
36
|
|
|
36
|
-
- **Clear the search box before typing
|
|
37
|
-
appends to it, returning confident results for the
|
|
37
|
+
- **Clear the search box before typing** (`fill(target, value, { clearBefore: true })`). It often
|
|
38
|
+
holds someone else's query, and typing alone appends to it, returning confident results for the
|
|
39
|
+
wrong search.
|
|
38
40
|
- **Read the autocomplete listbox, not the results grid.** The grid holds whatever query was last
|
|
39
41
|
committed, possibly by another actor. Scraping every option on the page silently merges two
|
|
40
42
|
different searches.
|
|
@@ -42,11 +44,11 @@ Other automation may be driving the same window.
|
|
|
42
44
|
|
|
43
45
|
## If it is locked
|
|
44
46
|
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
+
```js
|
|
48
|
+
await session.requestHelp({ prompt: "Please unlock 1Password in this tab, then continue." })
|
|
47
49
|
```
|
|
48
50
|
|
|
49
|
-
Then
|
|
51
|
+
Then read the page again.
|
|
50
52
|
|
|
51
53
|
## Not in scope
|
|
52
54
|
|
|
@@ -6,18 +6,19 @@ nothing in this package needs to bridge it.
|
|
|
6
6
|
Shape:
|
|
7
7
|
|
|
8
8
|
- The **browser machine** needs only the extension.
|
|
9
|
-
- The **agent machine** runs the `bsk`
|
|
9
|
+
- The **agent machine** runs the `bsk` daemon, omowright and this skill.
|
|
10
10
|
- They are joined by a daemon in server mode plus a pairing link.
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
bsk daemon start --mode server # on the machine the agent runs on
|
|
13
|
+
bsk daemon start --mode server # on the machine the agent runs on; WSS is required off loopback
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
Then follow upstream's pairing guide, which owns the current flag surface and the TLS
|
|
17
17
|
prerequisites: https://github.com/Tencent/BrowserSkill/blob/main/docs/remote-extension-connection.md
|
|
18
18
|
|
|
19
|
-
Once paired,
|
|
20
|
-
the machine that ran the
|
|
19
|
+
Once paired, `connectBrowserSkill()` and every session method behave identically; screenshot
|
|
20
|
+
buffers arrive on the machine that ran the call. Windows named pipes are not discovered
|
|
21
|
+
automatically — pass `sockPath` to `connectBrowserSkill()`.
|
|
21
22
|
|
|
22
23
|
If pairing is not configured, say so and ask. Do not substitute a browser on the agent machine:
|
|
23
24
|
the point of the attached engine is the sessions that live in the user's browser, and a local
|