opendevbrowser 0.0.27 → 0.0.29
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/README.md +2 -2
- package/dist/accessibility-snapshot-PA6NWNS7.js +39 -0
- package/dist/accessibility-snapshot-PA6NWNS7.js.map +1 -0
- package/dist/active-window-YNYTIPZN.js +37 -0
- package/dist/active-window-YNYTIPZN.js.map +1 -0
- package/dist/annotate-STYHXZYJ.js +205 -0
- package/dist/annotate-STYHXZYJ.js.map +1 -0
- package/dist/artifacts-KJ6RNDO2.js +120 -0
- package/dist/artifacts-KJ6RNDO2.js.map +1 -0
- package/dist/attr-GHFZZ4SA.js +84 -0
- package/dist/attr-GHFZZ4SA.js.map +1 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -1
- package/dist/browser/ops-client.d.ts +1 -0
- package/dist/browser/ops-client.d.ts.map +1 -1
- package/dist/canvas/document-store.d.ts.map +1 -1
- package/dist/canvas/guidance.d.ts +22 -0
- package/dist/canvas/guidance.d.ts.map +1 -0
- package/dist/canvas-54FBOEGP.js +309 -0
- package/dist/canvas-54FBOEGP.js.map +1 -0
- package/dist/capture-desktop-SNABC24E.js +38 -0
- package/dist/capture-desktop-SNABC24E.js.map +1 -0
- package/dist/capture-window-UJSB5AMP.js +40 -0
- package/dist/capture-window-UJSB5AMP.js.map +1 -0
- package/dist/check-ST5UQ2F5.js +71 -0
- package/dist/check-ST5UQ2F5.js.map +1 -0
- package/dist/checked-IEMWI5CU.js +71 -0
- package/dist/checked-IEMWI5CU.js.map +1 -0
- package/dist/chunk-2CG4SW3E.js +64 -0
- package/dist/chunk-2CG4SW3E.js.map +1 -0
- package/dist/chunk-2SIMIPLY.js +67 -0
- package/dist/chunk-2SIMIPLY.js.map +1 -0
- package/dist/chunk-37VSRUW4.js +141 -0
- package/dist/chunk-37VSRUW4.js.map +1 -0
- package/dist/chunk-5SWZDVOW.js +144 -0
- package/dist/chunk-5SWZDVOW.js.map +1 -0
- package/dist/chunk-6PVZ2ABC.js +429 -0
- package/dist/chunk-6PVZ2ABC.js.map +1 -0
- package/dist/chunk-7GVOUZMQ.js +64 -0
- package/dist/chunk-7GVOUZMQ.js.map +1 -0
- package/dist/chunk-7THCPS52.js +84 -0
- package/dist/chunk-7THCPS52.js.map +1 -0
- package/dist/chunk-ASMHEEKY.js +10 -0
- package/dist/chunk-ASMHEEKY.js.map +1 -0
- package/dist/chunk-DBF5OKH3.js +111 -0
- package/dist/chunk-DBF5OKH3.js.map +1 -0
- package/dist/chunk-DW4TX7MU.js +54 -0
- package/dist/chunk-DW4TX7MU.js.map +1 -0
- package/dist/chunk-IPE7TF2P.js +54 -0
- package/dist/chunk-IPE7TF2P.js.map +1 -0
- package/dist/chunk-IQTJHXZJ.js +126 -0
- package/dist/chunk-IQTJHXZJ.js.map +1 -0
- package/dist/chunk-J47N77VG.js +2969 -0
- package/dist/chunk-J47N77VG.js.map +1 -0
- package/dist/chunk-JZXD6FWR.js +25 -0
- package/dist/chunk-JZXD6FWR.js.map +1 -0
- package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
- package/dist/chunk-KDSNXS6N.js.map +1 -0
- package/dist/chunk-KZ2IXVQT.js +219 -0
- package/dist/chunk-KZ2IXVQT.js.map +1 -0
- package/dist/chunk-LBPELU7L.js +3649 -0
- package/dist/chunk-LBPELU7L.js.map +1 -0
- package/dist/chunk-MX3NFLCE.js +940 -0
- package/dist/chunk-MX3NFLCE.js.map +1 -0
- package/dist/chunk-N44UXKIB.js +26 -0
- package/dist/chunk-N44UXKIB.js.map +1 -0
- package/dist/chunk-OW5HMYMI.js +19 -0
- package/dist/chunk-OW5HMYMI.js.map +1 -0
- package/dist/chunk-OYNLAZQU.js +838 -0
- package/dist/chunk-OYNLAZQU.js.map +1 -0
- package/dist/chunk-PDPJN2OP.js +17 -0
- package/dist/chunk-PDPJN2OP.js.map +1 -0
- package/dist/chunk-RCZZGGJS.js +226 -0
- package/dist/chunk-RCZZGGJS.js.map +1 -0
- package/dist/chunk-RJNI3BHT.js +1 -0
- package/dist/chunk-RPXWUCQQ.js +112 -0
- package/dist/chunk-RPXWUCQQ.js.map +1 -0
- package/dist/chunk-S5KZQJJI.js +107 -0
- package/dist/chunk-S5KZQJJI.js.map +1 -0
- package/dist/{chunk-V5DJUSPV.js → chunk-S6S2UP6U.js} +2255 -1577
- package/dist/chunk-S6S2UP6U.js.map +1 -0
- package/dist/{chunk-MWBDO2L5.js → chunk-SXAGSEKZ.js} +1369 -9584
- package/dist/chunk-SXAGSEKZ.js.map +1 -0
- package/dist/chunk-T4GMCW6Z.js +46 -0
- package/dist/chunk-T4GMCW6Z.js.map +1 -0
- package/dist/chunk-WHQZBUNY.js +982 -0
- package/dist/chunk-WHQZBUNY.js.map +1 -0
- package/dist/chunk-WOXBLP7V.js +610 -0
- package/dist/chunk-WOXBLP7V.js.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts +2 -0
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/commands/macro-resolve.d.ts +5 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
- package/dist/cli/commands/product-video.d.ts +2 -0
- package/dist/cli/commands/product-video.d.ts.map +1 -1
- package/dist/cli/commands/research.d.ts +2 -0
- package/dist/cli/commands/research.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/shopping.d.ts.map +1 -1
- package/dist/cli/commands/workflow-output.d.ts +2 -0
- package/dist/cli/commands/workflow-output.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +207 -8029
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/postinstall-skill-sync.js +2 -1
- package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
- package/dist/cli/remote-relay.d.ts.map +1 -1
- package/dist/cli/utils/workflow-message.d.ts +3 -0
- package/dist/cli/utils/workflow-message.d.ts.map +1 -1
- package/dist/click-TENZA3Y6.js +81 -0
- package/dist/click-TENZA3Y6.js.map +1 -0
- package/dist/clone-component-STH5AR6M.js +82 -0
- package/dist/clone-component-STH5AR6M.js.map +1 -0
- package/dist/clone-page-BSTWAPAJ.js +69 -0
- package/dist/clone-page-BSTWAPAJ.js.map +1 -0
- package/dist/close-CEMMAAM7.js +63 -0
- package/dist/close-CEMMAAM7.js.map +1 -0
- package/dist/close-QCWUNRAI.js +63 -0
- package/dist/close-QCWUNRAI.js.map +1 -0
- package/dist/connect-J3RVSEZF.js +107 -0
- package/dist/connect-J3RVSEZF.js.map +1 -0
- package/dist/console-poll-HL7BVIVX.js +76 -0
- package/dist/console-poll-HL7BVIVX.js.map +1 -0
- package/dist/cookie-import-WMUCIIHN.js +177 -0
- package/dist/cookie-import-WMUCIIHN.js.map +1 -0
- package/dist/cookie-list-PB2N4RPH.js +117 -0
- package/dist/cookie-list-PB2N4RPH.js.map +1 -0
- package/dist/daemon-5KSVMGN4.js +194 -0
- package/dist/daemon-5KSVMGN4.js.map +1 -0
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/debug-trace-snapshot-RK7KDXA5.js +136 -0
- package/dist/debug-trace-snapshot-RK7KDXA5.js.map +1 -0
- package/dist/dialog-P6P4U7XE.js +75 -0
- package/dist/dialog-P6P4U7XE.js.map +1 -0
- package/dist/disconnect-32F7IDIP.js +58 -0
- package/dist/disconnect-32F7IDIP.js.map +1 -0
- package/dist/enabled-A6C6ZM2O.js +71 -0
- package/dist/enabled-A6C6ZM2O.js.map +1 -0
- package/dist/extension-extractor-GKWSFHPN.js +11 -0
- package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
- package/dist/global-D6WLWBXA.js +56 -0
- package/dist/global-D6WLWBXA.js.map +1 -0
- package/dist/goto-ULTSABDM.js +98 -0
- package/dist/goto-ULTSABDM.js.map +1 -0
- package/dist/help-EKKKEDL5.js +491 -0
- package/dist/help-EKKKEDL5.js.map +1 -0
- package/dist/hover-UF2ZUMTQ.js +71 -0
- package/dist/hover-UF2ZUMTQ.js.map +1 -0
- package/dist/html-B6TX7GK7.js +84 -0
- package/dist/html-B6TX7GK7.js.map +1 -0
- package/dist/index.js +100 -42
- package/dist/index.js.map +1 -1
- package/dist/inspector-6S5FKUZQ.js +62 -0
- package/dist/inspector-6S5FKUZQ.js.map +1 -0
- package/dist/inspector-audit-ARGEGOS7.js +84 -0
- package/dist/inspector-audit-ARGEGOS7.js.map +1 -0
- package/dist/inspector-plan-CSG5HZOC.js +69 -0
- package/dist/inspector-plan-CSG5HZOC.js.map +1 -0
- package/dist/inspiredesign/contract.d.ts +52 -1
- package/dist/inspiredesign/contract.d.ts.map +1 -1
- package/dist/inspiredesign/handoff.d.ts +12 -0
- package/dist/inspiredesign/handoff.d.ts.map +1 -1
- package/dist/inspiredesign/reference-pattern-board.d.ts +1 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
- package/dist/inspiredesign-7VRMMZN4.js +234 -0
- package/dist/inspiredesign-7VRMMZN4.js.map +1 -0
- package/dist/install-autostart-output-5DOMKCQL.js +41 -0
- package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
- package/dist/launch-REYCIR3Z.js +225 -0
- package/dist/launch-REYCIR3Z.js.map +1 -0
- package/dist/list-NPRXRQY2.js +51 -0
- package/dist/list-NPRXRQY2.js.map +1 -0
- package/dist/list-STYD2ZWA.js +54 -0
- package/dist/list-STYD2ZWA.js.map +1 -0
- package/dist/local-HXJLUUNT.js +54 -0
- package/dist/local-HXJLUUNT.js.map +1 -0
- package/dist/macro-resolve-ZIJZ65QI.js +253 -0
- package/dist/macro-resolve-ZIJZ65QI.js.map +1 -0
- package/dist/macros/execute-runtime.d.ts +4 -1
- package/dist/macros/execute-runtime.d.ts.map +1 -1
- package/dist/macros/execute.d.ts +6 -2
- package/dist/macros/execute.d.ts.map +1 -1
- package/dist/native-UPLVQ2SG.js +22 -0
- package/dist/native-UPLVQ2SG.js.map +1 -0
- package/dist/network-poll-HLDOSC72.js +76 -0
- package/dist/network-poll-HLDOSC72.js.map +1 -0
- package/dist/new-HXLLN6UT.js +69 -0
- package/dist/new-HXLLN6UT.js.map +1 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
- package/dist/open-KDR25LQZ.js +81 -0
- package/dist/open-KDR25LQZ.js.map +1 -0
- package/dist/opendevbrowser.js +100 -42
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/perf-EM6SWFJ6.js +58 -0
- package/dist/perf-EM6SWFJ6.js.map +1 -0
- package/dist/pointer-down-ZYWRZNCH.js +55 -0
- package/dist/pointer-down-ZYWRZNCH.js.map +1 -0
- package/dist/pointer-drag-LVEAVJO4.js +54 -0
- package/dist/pointer-drag-LVEAVJO4.js.map +1 -0
- package/dist/pointer-move-7SRKUS66.js +52 -0
- package/dist/pointer-move-7SRKUS66.js.map +1 -0
- package/dist/pointer-up-KLDBSK37.js +55 -0
- package/dist/pointer-up-KLDBSK37.js.map +1 -0
- package/dist/press-UIIXFTD7.js +83 -0
- package/dist/press-UIIXFTD7.js.map +1 -0
- package/dist/product-video-PYOXJVAI.js +235 -0
- package/dist/product-video-PYOXJVAI.js.map +1 -0
- package/dist/providers/artifacts.d.ts +0 -2
- package/dist/providers/artifacts.d.ts.map +1 -1
- package/dist/providers/blocker.d.ts.map +1 -1
- package/dist/providers/bounded-map.d.ts +2 -0
- package/dist/providers/bounded-map.d.ts.map +1 -0
- package/dist/providers/browser-fallback.d.ts +7 -0
- package/dist/providers/browser-fallback.d.ts.map +1 -1
- package/dist/providers/community/index.d.ts.map +1 -1
- package/dist/providers/constraint.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/research-compiler.d.ts +1 -1
- package/dist/providers/research-compiler.d.ts.map +1 -1
- package/dist/providers/research-executor.d.ts.map +1 -1
- package/dist/providers/runtime-bundle.d.ts +1 -1
- package/dist/providers/runtime-bundle.d.ts.map +1 -1
- package/dist/providers/runtime-factory.d.ts.map +1 -1
- package/dist/providers/shared/traversal-url.d.ts +3 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts.map +1 -1
- package/dist/providers/social/platform.d.ts.map +1 -1
- package/dist/providers/social/search-quality.d.ts.map +1 -1
- package/dist/providers/social/youtube.d.ts.map +1 -1
- package/dist/providers/workflow-handoff.d.ts +22 -1
- package/dist/providers/workflow-handoff.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +3 -0
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-TR3DUJZV.js → providers-4YY2BLXG.js} +19 -14
- package/dist/providers-4YY2BLXG.js.map +1 -0
- package/dist/public-surface/generated-manifest.d.ts +6 -6
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +8 -8
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/relay/protocol.d.ts +3 -1
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +6 -0
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/research-CKXMJ2DK.js +295 -0
- package/dist/research-CKXMJ2DK.js.map +1 -0
- package/dist/review-7HWJPZOD.js +48 -0
- package/dist/review-7HWJPZOD.js.map +1 -0
- package/dist/review-desktop-2IBJHFB5.js +54 -0
- package/dist/review-desktop-2IBJHFB5.js.map +1 -0
- package/dist/rpc-3HGIEJUO.js +159 -0
- package/dist/rpc-3HGIEJUO.js.map +1 -0
- package/dist/run-ADRYI3MS.js +180 -0
- package/dist/run-ADRYI3MS.js.map +1 -0
- package/dist/screencast-start-DTLUHD5H.js +67 -0
- package/dist/screencast-start-DTLUHD5H.js.map +1 -0
- package/dist/screencast-stop-54C5LRSS.js +59 -0
- package/dist/screencast-stop-54C5LRSS.js.map +1 -0
- package/dist/screenshot-HOAKR7P7.js +68 -0
- package/dist/screenshot-HOAKR7P7.js.map +1 -0
- package/dist/scroll-IAOO5COY.js +84 -0
- package/dist/scroll-IAOO5COY.js.map +1 -0
- package/dist/scroll-into-view-RKWSLAPH.js +71 -0
- package/dist/scroll-into-view-RKWSLAPH.js.map +1 -0
- package/dist/select-IGD3T6X4.js +86 -0
- package/dist/select-IGD3T6X4.js.map +1 -0
- package/dist/serve-7X4INUCU.js +498 -0
- package/dist/serve-7X4INUCU.js.map +1 -0
- package/dist/shopping-FC6DRW76.js +273 -0
- package/dist/shopping-FC6DRW76.js.map +1 -0
- package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
- package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
- package/dist/skills-NSXDX6YM.js +26 -0
- package/dist/skills-NSXDX6YM.js.map +1 -0
- package/dist/snapshot-X22GG324.js +113 -0
- package/dist/snapshot-X22GG324.js.map +1 -0
- package/dist/status-SP55LMNW.js +132 -0
- package/dist/status-SP55LMNW.js.map +1 -0
- package/dist/status-VH2WXIDG.js +35 -0
- package/dist/status-VH2WXIDG.js.map +1 -0
- package/dist/status-capabilities-YBERLRRA.js +57 -0
- package/dist/status-capabilities-YBERLRRA.js.map +1 -0
- package/dist/text-6TB5WNLI.js +84 -0
- package/dist/text-6TB5WNLI.js.map +1 -0
- package/dist/tools/inspiredesign_run.d.ts.map +1 -1
- package/dist/tools/macro_resolve.d.ts.map +1 -1
- package/dist/tools/product_video_run.d.ts.map +1 -1
- package/dist/tools/research_run.d.ts.map +1 -1
- package/dist/tools/shopping_run.d.ts.map +1 -1
- package/dist/type-3UI3TQH3.js +94 -0
- package/dist/type-3UI3TQH3.js.map +1 -0
- package/dist/uncheck-5L3D2D4U.js +71 -0
- package/dist/uncheck-5L3D2D4U.js.map +1 -0
- package/dist/uninstall-KYKGJAX7.js +91 -0
- package/dist/uninstall-KYKGJAX7.js.map +1 -0
- package/dist/update-SMXPYGXS.js +305 -0
- package/dist/update-SMXPYGXS.js.map +1 -0
- package/dist/update-skill-modes-BVX7IVMW.js +38 -0
- package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
- package/dist/upload-YG4J2EMI.js +56 -0
- package/dist/upload-YG4J2EMI.js.map +1 -0
- package/dist/use-V3LGFP3K.js +63 -0
- package/dist/use-V3LGFP3K.js.map +1 -0
- package/dist/value-3247D57X.js +71 -0
- package/dist/value-3247D57X.js.map +1 -0
- package/dist/visible-A7HEV36U.js +71 -0
- package/dist/visible-A7HEV36U.js.map +1 -0
- package/dist/wait-UZPP4Y4R.js +109 -0
- package/dist/wait-UZPP4Y4R.js.map +1 -0
- package/dist/windows-76TR3AIP.js +37 -0
- package/dist/windows-76TR3AIP.js.map +1 -0
- package/extension/dist/background.js +99 -22
- package/extension/dist/ops/ops-runtime.js +85 -7
- package/extension/dist/ops/ops-session-store.js +3 -0
- package/extension/dist/ops/target-session-coordinator.js +3 -0
- package/extension/dist/services/CDPRouter.js +9 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +13 -11
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
- package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
- package/skills/opendevbrowser-design-agent/SKILL.md +5 -0
- package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +6 -1
- package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +15 -1
- package/skills/opendevbrowser-design-agent/assets/templates/inspiredesign-advanced-brief.v1.json +5 -2
- package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +2 -0
- package/skills/opendevbrowser-research/SKILL.md +64 -12
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
- package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
- package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
- package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
- package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
- package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
- package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
- package/dist/chunk-MWBDO2L5.js.map +0 -1
- package/dist/chunk-QVWOPIZJ.js.map +0 -1
- package/dist/chunk-V5DJUSPV.js.map +0 -1
- /package/dist/{providers-TR3DUJZV.js.map → chunk-RJNI3BHT.js.map} +0 -0
|
@@ -13,7 +13,10 @@ const MAX_NETWORK_EVENTS = 300;
|
|
|
13
13
|
const SESSION_TTL_MS = 20_000;
|
|
14
14
|
const SCREENSHOT_TIMEOUT_MS = 8000;
|
|
15
15
|
const TAB_CLOSE_TIMEOUT_MS = 5000;
|
|
16
|
+
const OPS_SESSION_DETACH_TIMEOUT_MS = 3000;
|
|
16
17
|
const POPUP_ATTACH_RETRY_DELAY_MS = 100;
|
|
18
|
+
const ROOT_DETACH_VERIFY_DELAY_MS = 250;
|
|
19
|
+
const ROOT_DETACH_VERIFY_ATTEMPTS = 4;
|
|
17
20
|
const STALE_REF_ERROR_SUFFIX = "Take a new snapshot first.";
|
|
18
21
|
const DOM_OUTER_HTML_DECLARATION = `
|
|
19
22
|
function() {
|
|
@@ -305,6 +308,12 @@ export class OpsRuntime {
|
|
|
305
308
|
});
|
|
306
309
|
}
|
|
307
310
|
}
|
|
311
|
+
handleRelayDisconnected() {
|
|
312
|
+
this.cdp.markClientClosed();
|
|
313
|
+
for (const session of this.sessions.list()) {
|
|
314
|
+
void this.cleanupSession(session, "ops_session_expired");
|
|
315
|
+
}
|
|
316
|
+
}
|
|
308
317
|
handleHello(message) {
|
|
309
318
|
if (message.version !== OPS_PROTOCOL_VERSION) {
|
|
310
319
|
const error = {
|
|
@@ -2576,10 +2585,19 @@ export class OpsRuntime {
|
|
|
2576
2585
|
await this.cdp.setDiscoverTargetsEnabled?.(true);
|
|
2577
2586
|
}
|
|
2578
2587
|
catch (error) {
|
|
2588
|
+
if (isAttachBlockedError(error)) {
|
|
2589
|
+
return;
|
|
2590
|
+
}
|
|
2579
2591
|
logError("ops.discover_targets", error, {
|
|
2580
2592
|
code: "discover_targets_enable_failed",
|
|
2581
2593
|
extra: baseDetails
|
|
2582
2594
|
});
|
|
2595
|
+
if (baseDetails.strict) {
|
|
2596
|
+
throw this.decorateCdpFailure(error, {
|
|
2597
|
+
...baseDetails,
|
|
2598
|
+
enablementStage: "set_discover_targets"
|
|
2599
|
+
});
|
|
2600
|
+
}
|
|
2583
2601
|
}
|
|
2584
2602
|
}
|
|
2585
2603
|
async enableTargetDomainsOnDebuggee(debuggee, baseDetails) {
|
|
@@ -4006,7 +4024,7 @@ export class OpsRuntime {
|
|
|
4006
4024
|
}
|
|
4007
4025
|
throw new Error("Wait for selector timed out");
|
|
4008
4026
|
}
|
|
4009
|
-
cleanupSession(session, event) {
|
|
4027
|
+
async cleanupSession(session, event) {
|
|
4010
4028
|
this.clearClosingTimer(session.id);
|
|
4011
4029
|
const waiters = this.parallelWaiters.get(session.id);
|
|
4012
4030
|
if (waiters) {
|
|
@@ -4020,8 +4038,25 @@ export class OpsRuntime {
|
|
|
4020
4038
|
this.parallelWaiters.delete(session.id);
|
|
4021
4039
|
}
|
|
4022
4040
|
this.sessions.delete(session.id);
|
|
4023
|
-
|
|
4024
|
-
|
|
4041
|
+
const targets = Array.from(session.targets.values());
|
|
4042
|
+
try {
|
|
4043
|
+
const results = await withTimeout(Promise.allSettled(targets.map(async (target) => this.cdp.detachTab(target.tabId))), OPS_SESSION_DETACH_TIMEOUT_MS, "Ops session detach timed out");
|
|
4044
|
+
const failedTabIds = results.flatMap((result, index) => {
|
|
4045
|
+
const target = targets[index];
|
|
4046
|
+
return result.status === "rejected" && target ? [target.tabId] : [];
|
|
4047
|
+
});
|
|
4048
|
+
if (failedTabIds.length > 0) {
|
|
4049
|
+
logError("ops.session_detach", new Error("One or more ops session targets failed to detach"), {
|
|
4050
|
+
code: "session_detach_failed",
|
|
4051
|
+
extra: { sessionId: session.id, event, failedTabIds }
|
|
4052
|
+
});
|
|
4053
|
+
}
|
|
4054
|
+
}
|
|
4055
|
+
catch (error) {
|
|
4056
|
+
logError("ops.session_detach", error, {
|
|
4057
|
+
code: "session_detach_failed",
|
|
4058
|
+
extra: { sessionId: session.id, event }
|
|
4059
|
+
});
|
|
4025
4060
|
}
|
|
4026
4061
|
this.emitSessionEvent(session, event);
|
|
4027
4062
|
}
|
|
@@ -4036,7 +4071,7 @@ export class OpsRuntime {
|
|
|
4036
4071
|
if (!removedTarget)
|
|
4037
4072
|
return;
|
|
4038
4073
|
if (targetId === session.targetId || session.targets.size === 0) {
|
|
4039
|
-
this.cleanupSession(session, event);
|
|
4074
|
+
void this.cleanupSession(session, event);
|
|
4040
4075
|
}
|
|
4041
4076
|
}
|
|
4042
4077
|
async handleDebuggerDetachForTab(tabId) {
|
|
@@ -4044,7 +4079,8 @@ export class OpsRuntime {
|
|
|
4044
4079
|
if (!session)
|
|
4045
4080
|
return;
|
|
4046
4081
|
if (tabId === session.tabId) {
|
|
4047
|
-
// Root tab detach can be transient during child-target shutdown
|
|
4082
|
+
// Root tab detach can be transient during child-target shutdown, but it must not retain ownership forever.
|
|
4083
|
+
this.scheduleRootDebuggerDetachVerification(session.id, tabId);
|
|
4048
4084
|
return;
|
|
4049
4085
|
}
|
|
4050
4086
|
const targetId = this.sessions.getTargetIdByTabId(session.id, tabId);
|
|
@@ -4064,6 +4100,48 @@ export class OpsRuntime {
|
|
|
4064
4100
|
}
|
|
4065
4101
|
this.handleClosedTarget(tabId, "ops_session_closed");
|
|
4066
4102
|
}
|
|
4103
|
+
scheduleRootDebuggerDetachVerification(sessionId, tabId) {
|
|
4104
|
+
if (typeof this.cdp.getTabDebuggee !== "function") {
|
|
4105
|
+
return;
|
|
4106
|
+
}
|
|
4107
|
+
setTimeout(() => {
|
|
4108
|
+
void this.verifyRootDebuggerDetach(sessionId, tabId, ROOT_DETACH_VERIFY_ATTEMPTS);
|
|
4109
|
+
}, ROOT_DETACH_VERIFY_DELAY_MS);
|
|
4110
|
+
}
|
|
4111
|
+
async verifyRootDebuggerDetach(sessionId, tabId, attemptsRemaining) {
|
|
4112
|
+
const session = this.sessions.get(sessionId);
|
|
4113
|
+
if (!session || session.tabId !== tabId) {
|
|
4114
|
+
return;
|
|
4115
|
+
}
|
|
4116
|
+
if (this.isConcreteDebuggee(this.cdp.getTabDebuggee?.(tabId))) {
|
|
4117
|
+
return;
|
|
4118
|
+
}
|
|
4119
|
+
let liveTab = null;
|
|
4120
|
+
try {
|
|
4121
|
+
liveTab = await this.tabs.getTab(tabId);
|
|
4122
|
+
}
|
|
4123
|
+
catch {
|
|
4124
|
+
liveTab = null;
|
|
4125
|
+
}
|
|
4126
|
+
const current = this.sessions.get(sessionId);
|
|
4127
|
+
if (!current || current.tabId !== tabId) {
|
|
4128
|
+
return;
|
|
4129
|
+
}
|
|
4130
|
+
if (!liveTab) {
|
|
4131
|
+
void this.cleanupSession(current, "ops_session_closed");
|
|
4132
|
+
return;
|
|
4133
|
+
}
|
|
4134
|
+
if (this.isConcreteDebuggee(this.cdp.getTabDebuggee?.(tabId))) {
|
|
4135
|
+
return;
|
|
4136
|
+
}
|
|
4137
|
+
if (attemptsRemaining > 1) {
|
|
4138
|
+
setTimeout(() => {
|
|
4139
|
+
void this.verifyRootDebuggerDetach(sessionId, tabId, attemptsRemaining - 1);
|
|
4140
|
+
}, ROOT_DETACH_VERIFY_DELAY_MS);
|
|
4141
|
+
return;
|
|
4142
|
+
}
|
|
4143
|
+
void this.cleanupSession(current, "ops_session_closed");
|
|
4144
|
+
}
|
|
4067
4145
|
async closeTabBestEffort(tabId) {
|
|
4068
4146
|
try {
|
|
4069
4147
|
await withTimeout(this.tabs.closeTab(tabId), TAB_CLOSE_TIMEOUT_MS, "Ops tab close timed out");
|
|
@@ -4081,7 +4159,7 @@ export class OpsRuntime {
|
|
|
4081
4159
|
if (!session) {
|
|
4082
4160
|
return;
|
|
4083
4161
|
}
|
|
4084
|
-
this.cleanupSession(session, event);
|
|
4162
|
+
void this.cleanupSession(session, event);
|
|
4085
4163
|
}, 0);
|
|
4086
4164
|
}
|
|
4087
4165
|
sendResponse(message, payload) {
|
|
@@ -4159,7 +4237,7 @@ export class OpsRuntime {
|
|
|
4159
4237
|
this.closingTimers.delete(session.id);
|
|
4160
4238
|
const current = this.sessions.get(session.id);
|
|
4161
4239
|
if (current && current.state === "closing") {
|
|
4162
|
-
this.cleanupSession(current, "ops_session_expired");
|
|
4240
|
+
void this.cleanupSession(current, "ops_session_expired");
|
|
4163
4241
|
}
|
|
4164
4242
|
}, SESSION_TTL_MS);
|
|
4165
4243
|
this.closingTimers.set(session.id, timeoutId);
|
|
@@ -44,6 +44,9 @@ export class TargetSessionCoordinator {
|
|
|
44
44
|
listOwnedBy(clientId) {
|
|
45
45
|
return Array.from(this.sessions.values()).filter((session) => session.ownerClientId === clientId);
|
|
46
46
|
}
|
|
47
|
+
list() {
|
|
48
|
+
return Array.from(this.sessions.values());
|
|
49
|
+
}
|
|
47
50
|
delete(sessionId) {
|
|
48
51
|
const session = this.sessions.get(sessionId) ?? null;
|
|
49
52
|
if (!session) {
|
|
@@ -912,6 +912,9 @@ export class CDPRouter {
|
|
|
912
912
|
return;
|
|
913
913
|
}
|
|
914
914
|
catch (error) {
|
|
915
|
+
if (this.isExpectedDebuggerCleanupError(error)) {
|
|
916
|
+
continue;
|
|
917
|
+
}
|
|
915
918
|
logError("cdp.restore_root_attach", error, {
|
|
916
919
|
code: "restore_root_attach_failed",
|
|
917
920
|
extra: { tabId }
|
|
@@ -2021,6 +2024,9 @@ export class CDPRouter {
|
|
|
2021
2024
|
const message = error instanceof Error ? error.message : String(error);
|
|
2022
2025
|
return STALE_TAB_ERROR_MARKERS.some((marker) => message.includes(marker));
|
|
2023
2026
|
}
|
|
2027
|
+
isExpectedDebuggerCleanupError(error) {
|
|
2028
|
+
return this.isStaleTabError(error);
|
|
2029
|
+
}
|
|
2024
2030
|
markExpectedRootDetach(tabId) {
|
|
2025
2031
|
this.expectedRootDetachDeadlines.set(tabId, Date.now() + 1000);
|
|
2026
2032
|
}
|
|
@@ -2074,6 +2080,9 @@ export class CDPRouter {
|
|
|
2074
2080
|
});
|
|
2075
2081
|
}
|
|
2076
2082
|
catch (error) {
|
|
2083
|
+
if (this.isExpectedDebuggerCleanupError(error)) {
|
|
2084
|
+
return;
|
|
2085
|
+
}
|
|
2077
2086
|
logError("cdp.safe_detach", error, { code: "detach_failed" });
|
|
2078
2087
|
}
|
|
2079
2088
|
}
|
package/extension/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opendevbrowser",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.29",
|
|
4
4
|
"description": "Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -100,7 +100,7 @@ Load this section directly with:
|
|
|
100
100
|
opendevbrowser_skill_load opendevbrowser-best-practices "validated capability lanes"
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
Current
|
|
103
|
+
Current validated lanes:
|
|
104
104
|
|
|
105
105
|
1. Public-first YouTube transcript retrieval.
|
|
106
106
|
|
|
@@ -113,23 +113,25 @@ Rules:
|
|
|
113
113
|
- browser-assisted transcript fallback is opt-in only
|
|
114
114
|
- if browser fallback is enabled, use an isolated automation profile instead of a daily logged-in Google profile
|
|
115
115
|
|
|
116
|
-
2.
|
|
116
|
+
2. Evidence-gated research primitive with explicit public source families.
|
|
117
117
|
|
|
118
118
|
```bash
|
|
119
|
-
npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --
|
|
119
|
+
npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --sources web,community --browser-mode managed --mode json --output-format json
|
|
120
120
|
```
|
|
121
121
|
|
|
122
122
|
Rules:
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
123
|
+
- load `opendevbrowser-research` before research tasks so planning, evidence review, confidence, and limitations stay skill-guided
|
|
124
|
+
- treat `research run` as provider-constrained and low-level; inspect `summary.md`, `report.md`, `records.json`, `context.json`, `meta.json`, and `bundle-manifest.json` before publishing claims
|
|
125
|
+
- use `--source-selection` only to explain selector semantics; use explicit `--sources web,community` for public topical examples
|
|
126
|
+
- add shopping only with `--source-selection shopping` or explicit `--sources ...shopping...` when the task is deliberately commercial
|
|
127
|
+
- in the current contract, `auto` and `all` both resolve to `web`, `community`, and `social`, but neither value guarantees reliability
|
|
126
128
|
|
|
127
129
|
3. Deterministic shopping reruns with explicit providers.
|
|
128
130
|
|
|
129
131
|
```bash
|
|
130
|
-
npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json
|
|
131
|
-
npx opendevbrowser shopping run --query "27 inch 4k monitor" --providers shopping/bestbuy,shopping/ebay --budget 350 --sort lowest_price --browser-mode managed --mode json --output-format json
|
|
132
|
-
npx opendevbrowser shopping run --query "wireless earbuds" --providers shopping/amazon --region us --browser-mode managed --mode json --output-format json
|
|
132
|
+
npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
|
|
133
|
+
npx opendevbrowser shopping run --query "27 inch 4k monitor" --providers shopping/bestbuy,shopping/ebay --budget 350 --sort lowest_price --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
|
|
134
|
+
npx opendevbrowser shopping run --query "wireless earbuds" --providers shopping/amazon --region us --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json
|
|
133
135
|
```
|
|
134
136
|
|
|
135
137
|
Rules:
|
|
@@ -142,7 +144,7 @@ Rules:
|
|
|
142
144
|
4. Design-contract synthesis with repeated public references.
|
|
143
145
|
|
|
144
146
|
```bash
|
|
145
|
-
npx opendevbrowser inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --include-prototype-guidance --mode json --output-format json
|
|
147
|
+
npx opendevbrowser inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --include-prototype-guidance --mode json --output-format json
|
|
146
148
|
```
|
|
147
149
|
|
|
148
150
|
Rules:
|
|
@@ -308,7 +310,7 @@ Surface inventory source of truth:
|
|
|
308
310
|
|
|
309
311
|
Direct-run release note:
|
|
310
312
|
- `scripts/live-regression-direct.mjs` is the preferred release harness for `/canvas`, annotate, and CLI smoke. It uses temporary managed profiles for managed probes, waits for `/ops` drain before the legacy `/cdp` step, and keeps manual annotation timeouts as explicit `skipped` boundaries in `--release-gate` mode.
|
|
311
|
-
- `scripts/provider-direct-runs.mjs --
|
|
313
|
+
- `scripts/provider-direct-runs.mjs --include-high-friction --include-auth-gated` is the preferred provider release harness. Treat `provider-live-matrix` and `live-regression-matrix` as debug-only helpers, not refreshed release evidence.
|
|
312
314
|
|
|
313
315
|
## Skill Runtime Audit and Realignment
|
|
314
316
|
|
|
@@ -13,7 +13,7 @@ Canonical inventory of repo-local OpenDevBrowser skill packs and the audit evide
|
|
|
13
13
|
| `opendevbrowser-form-testing` | `workflow` | `./skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh` | snapshot -> type/click -> validation loop, multi-step forms, challenge checkpoints, network correlation | `node scripts/cli-smoke-test.mjs` plus `node scripts/login-fixture-live-probe.mjs` for invalid-submit, MFA, and persistence branches | extension unavailable at start if extension mode is audited separately |
|
|
14
14
|
| `opendevbrowser-login-automation` | `workflow` | `./skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh` | login branching, invalid credential handling, MFA step-up, session validation | `node scripts/login-fixture-live-probe.mjs` | none; proof lane is repo-local |
|
|
15
15
|
| `opendevbrowser-product-presentation-asset` | `workflow` | `./skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh` | `product-video run`, asset-pack assembly, screenshots, evidence mapping | `node scripts/product-video-fixture-live-probe.mjs` | none; proof lane is repo-local |
|
|
16
|
-
| `opendevbrowser-research` | `workflow` | `./skills/opendevbrowser-research/scripts/validate-skill-assets.sh` | `research run`, timebox resolution, multi-source artifact generation | `opendevbrowser research run --topic "<topic>" --
|
|
16
|
+
| `opendevbrowser-research` | `workflow` | `./skills/opendevbrowser-research/scripts/validate-skill-assets.sh` | `research run`, timebox resolution, multi-source artifact generation | `opendevbrowser research run --topic "<topic>" --sources web,community --mode json` via `scripts/skill-runtime-audit.mjs` | auth walls, rate limits, upstream source failure |
|
|
17
17
|
| `opendevbrowser-shopping` | `workflow` | `./skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh` | `shopping run`, offer normalization, market analysis, direct provider workflows | `node scripts/provider-direct-runs.mjs` | auth walls, anti-bot challenges, rate limits, upstream outage |
|
|
18
18
|
|
|
19
19
|
## Shared runtime families
|
|
@@ -188,8 +188,9 @@ EOF
|
|
|
188
188
|
# Public-first YouTube transcript probe
|
|
189
189
|
node $TRANSCRIPT_PROBE_PATH --url "https://www.youtube.com/watch?v=aircAruvnKk" --youtube-mode auto --out artifacts/capability-fix/youtube-transcript-auto.json
|
|
190
190
|
|
|
191
|
-
#
|
|
192
|
-
|
|
191
|
+
# Evidence-gated research primitive with explicit public source families
|
|
192
|
+
# Load opendevbrowser-research first, then inspect records.json, context.json, meta.json, and report.md before publishing claims.
|
|
193
|
+
$CLI_PREFIX research run --topic "Chrome extension debugging workflows" --days 30 --sources web,community --mode json --output-format json
|
|
193
194
|
|
|
194
195
|
# Deterministic shopping reruns with explicit providers
|
|
195
196
|
$CLI_PREFIX shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json
|
|
@@ -118,7 +118,29 @@ if (domain === "research" && command === "run") {
|
|
|
118
118
|
);
|
|
119
119
|
fs.writeFileSync(
|
|
120
120
|
path.join(bundleDir, "report.md"),
|
|
121
|
-
|
|
121
|
+
[
|
|
122
|
+
"# Research Report",
|
|
123
|
+
"",
|
|
124
|
+
`- Topic: ${topic}`,
|
|
125
|
+
`- Days: ${days}`,
|
|
126
|
+
`- Source selection: ${sourceSelection}`,
|
|
127
|
+
`- Sources: ${sources}`,
|
|
128
|
+
"",
|
|
129
|
+
"## Search Direction",
|
|
130
|
+
"Fixture provider pass suggested destination follow-up.",
|
|
131
|
+
"",
|
|
132
|
+
"## Candidate Triage",
|
|
133
|
+
"Accepted fixture destination and rejected shell candidates.",
|
|
134
|
+
"",
|
|
135
|
+
"## Rejected Candidates",
|
|
136
|
+
"Rejected privacy, login, and search shell examples.",
|
|
137
|
+
"",
|
|
138
|
+
"## Deep Dives",
|
|
139
|
+
"Opened the fixture destination page.",
|
|
140
|
+
"",
|
|
141
|
+
"## Synthesis Feedback",
|
|
142
|
+
"Remaining gap is independent corroboration."
|
|
143
|
+
].join("\n")
|
|
122
144
|
);
|
|
123
145
|
fs.writeFileSync(
|
|
124
146
|
path.join(bundleDir, "compact.md"),
|
|
@@ -148,7 +170,22 @@ if (domain === "research" && command === "run") {
|
|
|
148
170
|
`- Days: ${days}`,
|
|
149
171
|
`- Source selection: ${sourceSelection}`,
|
|
150
172
|
`- Sources: ${sources}`,
|
|
151
|
-
"- Finding: ISSUE-09 pagination/result drift across sources"
|
|
173
|
+
"- Finding: ISSUE-09 pagination/result drift across sources",
|
|
174
|
+
"",
|
|
175
|
+
"## Search Direction",
|
|
176
|
+
"Fixture provider pass suggested destination follow-up.",
|
|
177
|
+
"",
|
|
178
|
+
"## Candidate Triage",
|
|
179
|
+
"Accepted fixture destination and rejected shell candidates.",
|
|
180
|
+
"",
|
|
181
|
+
"## Rejected Candidates",
|
|
182
|
+
"Rejected privacy, login, and search shell examples.",
|
|
183
|
+
"",
|
|
184
|
+
"## Deep Dives",
|
|
185
|
+
"Opened the fixture destination page.",
|
|
186
|
+
"",
|
|
187
|
+
"## Synthesis Feedback",
|
|
188
|
+
"Remaining gap is independent corroboration."
|
|
152
189
|
]);
|
|
153
190
|
process.exit(0);
|
|
154
191
|
}
|
|
@@ -72,6 +72,7 @@ Use this skill for frontend work that must be visually strong, contract-first, a
|
|
|
72
72
|
## Supporting Surfaces
|
|
73
73
|
|
|
74
74
|
- Use browser replay (`screencast-start` / `screencast-stop`) during real-surface validation when motion, sequencing, or transition timing matters.
|
|
75
|
+
- Treat shader, WebGL, Spline-style, and custom 3D motion references as advisory cues unless current runtime evidence proves support.
|
|
75
76
|
- Desktop observation stays read-only and is only for external window or OS-level evidence around the workflow; it is not a design-surface control lane.
|
|
76
77
|
- Browser-scoped computer use remains a challenge posture knob via `--challenge-automation-mode`, not a desktop-agent capability.
|
|
77
78
|
|
|
@@ -97,6 +98,8 @@ Use this skill for frontend work that must be visually strong, contract-first, a
|
|
|
97
98
|
- For non-canvas frontend work, still fill the same design-contract fields before coding so decisions stay consistent across code, preview, and docs.
|
|
98
99
|
- Use one owner for overlays, drawers, sheets, and detail panels; prefer item-backed state over boolean sprawl.
|
|
99
100
|
- If motion depends on scroll or viewport progress, define the driver and reduced-motion fallback before implementation.
|
|
101
|
+
- Carry advanced motion cues through `designVectors` and `motionSystem` as design intent only; they do not authorize new runtime libraries.
|
|
102
|
+
- Keep `libraryPolicy.motion` and `libraryPolicy.threeD` empty in samples unless a separate runtime change explicitly approves those lanes.
|
|
100
103
|
- Use `artifacts/scroll-reveal-surface-planning.md` whenever the design depends on pinned sections, reveal stages, or viewport-driven sequencing.
|
|
101
104
|
- Validate new patterns in isolation or `/canvas` preview with `artifacts/isolated-preview-validation.md`, including deterministic fixtures and installed dependencies, before declaring the integrated screen finished.
|
|
102
105
|
- Verify default, hover, focus, empty, loading, success, and error states when they are relevant.
|
|
@@ -139,6 +142,8 @@ The `generationPlan` block must include:
|
|
|
139
142
|
- `accessibilityPosture`
|
|
140
143
|
- `validationTargets`
|
|
141
144
|
|
|
145
|
+
Optional `designVectors` may carry advanced motion advisories, but it must not change the required CanvasGenerationPlan fields or imply shader, WebGL, Spline, or 3D runtime support.
|
|
146
|
+
|
|
142
147
|
Use `scripts/extract-canvas-plan.sh` when the full contract already exists and only the `/canvas` payload is needed.
|
|
143
148
|
|
|
144
149
|
## Recommended Workflow Modes
|
|
@@ -90,6 +90,8 @@ Motion must help comprehension.
|
|
|
90
90
|
- where motion is allowed
|
|
91
91
|
- reduced-motion posture
|
|
92
92
|
- whether depth, 3D, or parallax are justified
|
|
93
|
+
- advisory-only shader, WebGL, Spline-style, or spatial cues when references suggest them
|
|
94
|
+
- confirmation that motion cues do not authorize `libraryPolicy.motion` or `libraryPolicy.threeD`
|
|
93
95
|
|
|
94
96
|
## 9. Performance Model
|
|
95
97
|
|
|
@@ -139,6 +141,8 @@ Required keys:
|
|
|
139
141
|
- `accessibilityPosture`
|
|
140
142
|
- `validationTargets`
|
|
141
143
|
|
|
144
|
+
Optional `designVectors` can carry advanced motion advisories when references suggest shader-like, WebGL-style, Spline-style, or spatial behavior. Keep those values descriptive. They do not add runtime support, change the required plan shape, or approve new motion or 3D libraries.
|
|
145
|
+
|
|
142
146
|
Use `scripts/extract-canvas-plan.sh` to derive this from the full contract.
|
|
143
147
|
|
|
144
148
|
## Review Questions
|
|
@@ -154,4 +158,5 @@ Before implementation, answer:
|
|
|
154
158
|
7. Where is the canonical theme or token source?
|
|
155
159
|
8. Which list, grid, or pane is most likely to become render-heavy under realistic data?
|
|
156
160
|
9. What part of the design is most likely to regress on mobile?
|
|
157
|
-
10.
|
|
161
|
+
10. Are advanced motion cues advisory only, with no runtime or library-policy authorization implied?
|
|
162
|
+
11. What evidence will prove the design works on a real browser surface?
|
|
@@ -128,7 +128,13 @@
|
|
|
128
128
|
"section reveal",
|
|
129
129
|
"primary CTA feedback"
|
|
130
130
|
],
|
|
131
|
-
"parallaxPolicy": "off unless explicitly justified"
|
|
131
|
+
"parallaxPolicy": "off unless explicitly justified",
|
|
132
|
+
"advancedMotionAdvisory": [
|
|
133
|
+
"Advisory shader-like gradient depth: describe intent only; implement with approved runtime primitives unless a separate runtime change authorizes more.",
|
|
134
|
+
"Advisory WebGL-style spatial reveal: document depth and hierarchy without implying WebGL runtime support.",
|
|
135
|
+
"Advisory Spline-style product orbit: document scene posture and static fallback without approving custom 3D runtime dependencies.",
|
|
136
|
+
"Runtime boundary: libraryPolicy.motion and libraryPolicy.threeD stay empty unless separately approved."
|
|
137
|
+
]
|
|
132
138
|
},
|
|
133
139
|
"performanceModel": {
|
|
134
140
|
"renderHotspots": [
|
|
@@ -221,6 +227,14 @@
|
|
|
221
227
|
"spinner-stacking",
|
|
222
228
|
"scan-surface-jank"
|
|
223
229
|
]
|
|
230
|
+
},
|
|
231
|
+
"designVectors": {
|
|
232
|
+
"advancedMotionAdvisory": [
|
|
233
|
+
"Advisory shader-like gradient depth",
|
|
234
|
+
"Advisory WebGL-style spatial reveal",
|
|
235
|
+
"Advisory Spline-style product orbit",
|
|
236
|
+
"Runtime support: none. Library policy authorization: none."
|
|
237
|
+
]
|
|
224
238
|
}
|
|
225
239
|
}
|
|
226
240
|
}
|
package/skills/opendevbrowser-design-agent/assets/templates/inspiredesign-advanced-brief.v1.json
CHANGED
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
"commonRules": [
|
|
5
5
|
"Preserve only the product, brand, audience, platform, and tone cues that are explicitly present in the source brief.",
|
|
6
6
|
"Treat missing details as open constraints instead of inventing brand facts or user needs.",
|
|
7
|
-
"Use inspiration references to extract transferable design logic rather than copying a single layout, visual treatment, or narrative beat literally."
|
|
7
|
+
"Use inspiration references to extract transferable design logic rather than copying a single layout, visual treatment, or narrative beat literally.",
|
|
8
|
+
"Treat shader, WebGL, Spline-style, and 3D motion ideas as advisory design cues only, not as runtime support or dependency approval.",
|
|
9
|
+
"Carry accepted advanced motion cues in designVectors and motionSystem as intent, and keep libraryPolicy authorization separate."
|
|
8
10
|
],
|
|
9
11
|
"outputRequirements": [
|
|
10
12
|
"Return a reusable design contract that can drive design.md, implementation-plan artifacts, and a Canvas-ready prototype path.",
|
|
11
|
-
"Keep the direction premium, specific, and implementable instead of generic or template-driven."
|
|
13
|
+
"Keep the direction premium, specific, and implementable instead of generic or template-driven.",
|
|
14
|
+
"Keep libraryPolicy.motion and libraryPolicy.threeD empty in generated samples unless a separate runtime change explicitly approves those libraries."
|
|
12
15
|
],
|
|
13
16
|
"formats": [
|
|
14
17
|
{
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"contentHierarchy": [],
|
|
16
16
|
"componentFamilies": [],
|
|
17
17
|
"motionPosture": "",
|
|
18
|
+
"advancedMotionAdvisory": [],
|
|
18
19
|
"loadingStrategy": "",
|
|
19
20
|
"tokenNotes": [],
|
|
20
21
|
"patternsToBorrow": [],
|
|
@@ -26,6 +27,7 @@
|
|
|
26
27
|
"dominantDirection": "",
|
|
27
28
|
"sharedStrengths": [],
|
|
28
29
|
"sharedFailuresToAvoid": [],
|
|
30
|
+
"motionContractDeltas": [],
|
|
29
31
|
"contractDeltas": []
|
|
30
32
|
}
|
|
31
33
|
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opendevbrowser-research
|
|
3
|
-
description:
|
|
3
|
+
description: Skill-guided, evidence-gated research workflow for provider-constrained public source gathering and auditable artifact review.
|
|
4
4
|
version: 2.1.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Research Skill
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Load this skill before research tasks. Use it to plan source families, gather provider-constrained evidence, review artifacts, and publish only claims that survive the evidence gate.
|
|
10
|
+
|
|
11
|
+
`opendevbrowser research run` is a low-level, best-effort primitive. It can collect and render provider results, but the skill owns source planning, blocker review, confidence, limitations, and final synthesis.
|
|
10
12
|
|
|
11
13
|
## Pack Contents
|
|
12
14
|
|
|
@@ -24,7 +26,7 @@ Use this skill when you need benchmark-style research across public `web|communi
|
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
28
|
./skills/opendevbrowser-research/scripts/validate-skill-assets.sh
|
|
27
|
-
./skills/opendevbrowser-research/scripts/run-research.sh "browser automation" 30 context
|
|
29
|
+
./skills/opendevbrowser-research/scripts/run-research.sh "browser automation" 30 context "web,community"
|
|
28
30
|
./skills/opendevbrowser-research/scripts/render-output.sh "browser automation" compact
|
|
29
31
|
```
|
|
30
32
|
|
|
@@ -37,11 +39,59 @@ Use this skill when you need benchmark-style research across public `web|communi
|
|
|
37
39
|
## Core Rules
|
|
38
40
|
|
|
39
41
|
- Define timebox first (`--days` or `--from/--to`).
|
|
40
|
-
-
|
|
42
|
+
- Choose explicit source families before invoking the CLI primitive: `web`, `community`, `social`, `shopping`, or a deliberate combination such as `web,community`.
|
|
43
|
+
- Treat `auto` as a source-family selector, not a reliability guarantee.
|
|
41
44
|
- Persist artifacts and return reproducible paths.
|
|
42
|
-
- Mark unsupported claims as tentative
|
|
45
|
+
- Mark unsupported claims as tentative or exclude them from the final answer.
|
|
43
46
|
- Honor bounded retries and backoff windows under 429 pressure.
|
|
44
47
|
|
|
48
|
+
## Evidence Gate
|
|
49
|
+
|
|
50
|
+
Review artifacts before publishing claims. A successful command exit or rendered report is not enough.
|
|
51
|
+
|
|
52
|
+
Preserved artifact files:
|
|
53
|
+
|
|
54
|
+
- `summary.md`
|
|
55
|
+
- `report.md`
|
|
56
|
+
- `records.json`
|
|
57
|
+
- `context.json`
|
|
58
|
+
- `meta.json`
|
|
59
|
+
- `bundle-manifest.json`
|
|
60
|
+
|
|
61
|
+
Required review:
|
|
62
|
+
|
|
63
|
+
1. Read `records.json` for fetched source records, timestamps, providers, extraction quality, and blockers.
|
|
64
|
+
2. Read `context.json` for source ledger, evidence gaps, unsupported claims, staleness checks, and search-engine provenance when used.
|
|
65
|
+
3. Read `meta.json` for provider limits, warnings, no-evidence failures, cookie diagnostics, challenge/auth/token failures, and artifact generation details.
|
|
66
|
+
4. When gated providers such as Reddit block evidence, rerun with user-authorized recovery only after candidate triage has exhausted relevant public destination pages: `--browser-mode extension` for an existing signed-in relay session, `--use-cookies` only when legitimate cookies are available, and `--challenge-automation-mode browser_with_helper` for browser-scoped assistance.
|
|
67
|
+
5. Use `report.md` and `summary.md` only after confirming claims map back to accepted evidence.
|
|
68
|
+
6. Do not use shell-only, stale-only, login-only, not-found-only, or zero-source-evidence runs to support final claims.
|
|
69
|
+
|
|
70
|
+
## Guided Research Loop
|
|
71
|
+
|
|
72
|
+
Research is iterative. Do not stop at the first provider page or SERP shell.
|
|
73
|
+
|
|
74
|
+
1. Start with provider or search-engine direction: query, capture candidate URLs, rank, title, and blocker notes.
|
|
75
|
+
2. Reject navigation dead ends before treating them as evidence: login routes, privacy or cookie preference pages, consent gates, search result shells, not-found pages, and JavaScript-only shells.
|
|
76
|
+
3. Open destination pages from the candidate set, not account, privacy, cookie, or login links. For Reddit, prefer concrete `/r/.../comments/...` result URLs over `/login`, `/search`, `/account`, `/submit`, or root navigation.
|
|
77
|
+
4. If a destination is blocked, record the blocker and choose the next candidate from the same result set before escalating to cookies or an authenticated browser.
|
|
78
|
+
5. Escalate to `--browser-mode extension`, `--use-cookies`, or `--challenge-automation-mode browser_with_helper` only when the selected evidence page itself needs authorized browser recovery and the user has legitimate access.
|
|
79
|
+
6. Continue until you have enough accepted destination evidence for the claims, or every relevant candidate is blocked, stale, irrelevant, or unsupported.
|
|
80
|
+
7. Synthesize only after the loop produces accepted evidence. If no destination evidence survives, return limitations and next-step options instead of a research answer.
|
|
81
|
+
|
|
82
|
+
## Search Engine Discovery Lane
|
|
83
|
+
|
|
84
|
+
This lane is optional, skill-guided, provider-constrained, and discovery-only. It can improve breadth, but it is not a reliable default and does not replace `opendevbrowser research run` or the evidence gate.
|
|
85
|
+
|
|
86
|
+
1. Choose up to five engines based on topic and availability. Candidate set: Google, Bing, Brave, DuckDuckGo or Yahoo for overlap checks, Yandex for regional or index diversity, Baidu for China-specific topics, and Kagi only when the user has account access.
|
|
87
|
+
2. Record engine choice rationale, query variants, region and language assumptions, auth or cookie needs, and blockers.
|
|
88
|
+
3. Collect up to 10 result URLs per selected engine. Preserve engine, query, rank, URL, title if available, and retrieval notes.
|
|
89
|
+
4. Dedupe canonical URLs, then select the strongest 5 to 10 destination pages for extraction.
|
|
90
|
+
5. Extract selected destination pages through OpenDevBrowser browsing primitives when useful, including DOM interaction and screenshots. Use cookies or authenticated browsing only after destination-candidate triage shows the selected evidence page itself requires authorized access.
|
|
91
|
+
6. Do not violate robots restrictions, login walls, consent gates, CAPTCHAs, rate limits, anti-bot controls, or access controls. Stand down and record limitations instead.
|
|
92
|
+
7. Keep SERPs discovery-only. SERP snippets, result pages, shells, and blocked pages cannot be final evidence.
|
|
93
|
+
8. Final claims must cite destination pages or other fetched evidence that survived review.
|
|
94
|
+
|
|
45
95
|
## Parallel Multitab Alignment
|
|
46
96
|
|
|
47
97
|
- Apply shared concurrency policy from `../opendevbrowser-best-practices/SKILL.md` ("Parallel Operations").
|
|
@@ -60,22 +110,24 @@ Matrix source: `../opendevbrowser-best-practices/artifacts/browser-agent-known-i
|
|
|
60
110
|
## Workflow
|
|
61
111
|
|
|
62
112
|
1. Resolve timebox (`days` or `from/to`).
|
|
63
|
-
2. Choose
|
|
64
|
-
3.
|
|
65
|
-
4.
|
|
113
|
+
2. Choose explicit source families and document why they fit the topic.
|
|
114
|
+
3. Optionally run the search-engine discovery lane to find destination candidates.
|
|
115
|
+
4. Run `opendevbrowser research run` as a low-level best-effort primitive.
|
|
116
|
+
5. Review `records.json`, `context.json`, and `meta.json` before trusting `report.md`.
|
|
117
|
+
6. If `meta.json` shows auth, token, challenge, or cookie-gated providers, make the next run skill-first only after the candidate queue has no relevant public destination evidence left: use the existing signed-in browser session when authorized, cookies only when legitimate cookies are available, and browser-scoped challenge assistance only for that browser session.
|
|
118
|
+
7. Return final claims only when they are supported by accepted evidence.
|
|
66
119
|
|
|
67
120
|
## Commands
|
|
68
121
|
|
|
69
122
|
```bash
|
|
70
|
-
opendevbrowser research run --topic "<topic>" --days 30 --
|
|
71
|
-
opendevbrowser research run --topic "<topic>" --
|
|
123
|
+
opendevbrowser research run --topic "<topic>" --days 30 --sources web,community --mode context
|
|
124
|
+
opendevbrowser research run --topic "<topic>" --sources web --mode json
|
|
72
125
|
opendevbrowser research run --topic "<topic>" --sources web,shopping --mode md
|
|
73
126
|
```
|
|
74
127
|
|
|
75
128
|
## Notes
|
|
76
129
|
|
|
77
|
-
- `auto`
|
|
78
|
-
- In the current contract, both `auto` and `all` resolve to `web|community|social`.
|
|
130
|
+
- `auto` and `all` are selector values in the current source-family contract, not promises of reliable coverage.
|
|
79
131
|
- Use `--source-selection shopping` or explicit `--sources ...shopping...` to include shopping only when commercial intent is explicit.
|
|
80
132
|
- Use `--mode path` with `scripts/write-artifacts.sh` when you need replayable handoff bundles.
|
|
81
133
|
- For browser-backed release proof and mode sweeps, follow the canonical direct-run evidence policy in `../opendevbrowser-best-practices/SKILL.md`.
|