opendevbrowser 0.0.15 → 0.0.17
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/LICENSE +1 -1
- package/README.md +262 -43
- package/dist/annotate/direct-annotator.d.ts +22 -0
- package/dist/annotate/direct-annotator.d.ts.map +1 -0
- package/dist/annotate/output.d.ts +10 -0
- package/dist/annotate/output.d.ts.map +1 -0
- package/dist/browser/annotation-manager.d.ts +33 -0
- package/dist/browser/annotation-manager.d.ts.map +1 -0
- package/dist/browser/browser-manager.d.ts +402 -0
- package/dist/browser/browser-manager.d.ts.map +1 -0
- package/dist/browser/canvas-client.d.ts +53 -0
- package/dist/browser/canvas-client.d.ts.map +1 -0
- package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
- package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
- package/dist/browser/canvas-manager.d.ts +94 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
- package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
- package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
- package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
- package/dist/browser/fingerprint/adapters.d.ts +26 -0
- package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
- package/dist/browser/fingerprint/canary.d.ts +25 -0
- package/dist/browser/fingerprint/canary.d.ts.map +1 -0
- package/dist/browser/fingerprint/profiles.d.ts +16 -0
- package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
- package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
- package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
- package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
- package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
- package/dist/browser/manager-types.d.ts +15 -0
- package/dist/browser/manager-types.d.ts.map +1 -0
- package/dist/browser/ops-browser-manager.d.ts +141 -0
- package/dist/browser/ops-browser-manager.d.ts.map +1 -0
- package/dist/browser/ops-client.d.ts +56 -0
- package/dist/browser/ops-client.d.ts.map +1 -0
- package/dist/browser/parallelism-governor.d.ts +31 -0
- package/dist/browser/parallelism-governor.d.ts.map +1 -0
- package/dist/browser/script-runner.d.ts +23 -0
- package/dist/browser/script-runner.d.ts.map +1 -0
- package/dist/browser/session-store.d.ts +63 -0
- package/dist/browser/session-store.d.ts.map +1 -0
- package/dist/browser/target-manager.d.ts +36 -0
- package/dist/browser/target-manager.d.ts.map +1 -0
- package/dist/cache/chrome-locator.d.ts +2 -0
- package/dist/cache/chrome-locator.d.ts.map +1 -0
- package/dist/cache/downloader.d.ts +6 -0
- package/dist/cache/downloader.d.ts.map +1 -0
- package/dist/cache/paths.d.ts +9 -0
- package/dist/cache/paths.d.ts.map +1 -0
- package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
- package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
- package/dist/canvas/code-sync/graph.d.ts +5 -0
- package/dist/canvas/code-sync/graph.d.ts.map +1 -0
- package/dist/canvas/code-sync/hash.d.ts +3 -0
- package/dist/canvas/code-sync/hash.d.ts.map +1 -0
- package/dist/canvas/code-sync/import.d.ts +18 -0
- package/dist/canvas/code-sync/import.d.ts.map +1 -0
- package/dist/canvas/code-sync/manifest.d.ts +5 -0
- package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
- package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
- package/dist/canvas/code-sync/types.d.ts +152 -0
- package/dist/canvas/code-sync/types.d.ts.map +1 -0
- package/dist/canvas/code-sync/write.d.ts +9 -0
- package/dist/canvas/code-sync/write.d.ts.map +1 -0
- package/dist/canvas/document-store.d.ts +81 -0
- package/dist/canvas/document-store.d.ts.map +1 -0
- package/dist/canvas/export.d.ts +12 -0
- package/dist/canvas/export.d.ts.map +1 -0
- package/dist/canvas/repo-store.d.ts +10 -0
- package/dist/canvas/repo-store.d.ts.map +1 -0
- package/dist/canvas/surface-palette.d.ts +15 -0
- package/dist/canvas/surface-palette.d.ts.map +1 -0
- package/dist/canvas/types.d.ts +255 -0
- package/dist/canvas/types.d.ts.map +1 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
- package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
- package/dist/chunk-5J3IFL3X.js +16706 -0
- package/dist/chunk-5J3IFL3X.js.map +1 -0
- package/dist/chunk-D633UO34.js +8149 -0
- package/dist/chunk-D633UO34.js.map +1 -0
- package/dist/chunk-FUSXMW3G.js +169 -0
- package/dist/chunk-FUSXMW3G.js.map +1 -0
- package/dist/chunk-TBUCZX4A.js +34 -0
- package/dist/chunk-TBUCZX4A.js.map +1 -0
- package/dist/chunk-V7KUDHDG.js +276 -0
- package/dist/chunk-V7KUDHDG.js.map +1 -0
- package/dist/chunk-Y2KL55OG.js +59 -0
- package/dist/chunk-Y2KL55OG.js.map +1 -0
- package/dist/cli/args.d.ts +25 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/client.d.ts +2 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/commands/annotate.d.ts +38 -0
- package/dist/cli/commands/annotate.d.ts.map +1 -0
- package/dist/cli/commands/artifacts.d.ts +24 -0
- package/dist/cli/commands/artifacts.d.ts.map +1 -0
- package/dist/cli/commands/canvas.d.ts +45 -0
- package/dist/cli/commands/canvas.d.ts.map +1 -0
- package/dist/cli/commands/daemon.d.ts +35 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
- package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
- package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
- package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
- package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
- package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
- package/dist/cli/commands/devtools/perf.d.ts +7 -0
- package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
- package/dist/cli/commands/devtools/screenshot.d.ts +18 -0
- package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
- package/dist/cli/commands/dom/attr.d.ts +7 -0
- package/dist/cli/commands/dom/attr.d.ts.map +1 -0
- package/dist/cli/commands/dom/checked.d.ts +7 -0
- package/dist/cli/commands/dom/checked.d.ts.map +1 -0
- package/dist/cli/commands/dom/enabled.d.ts +7 -0
- package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
- package/dist/cli/commands/dom/html.d.ts +7 -0
- package/dist/cli/commands/dom/html.d.ts.map +1 -0
- package/dist/cli/commands/dom/text.d.ts +7 -0
- package/dist/cli/commands/dom/text.d.ts.map +1 -0
- package/dist/cli/commands/dom/value.d.ts +7 -0
- package/dist/cli/commands/dom/value.d.ts.map +1 -0
- package/dist/cli/commands/dom/visible.d.ts +7 -0
- package/dist/cli/commands/dom/visible.d.ts.map +1 -0
- package/dist/cli/commands/export/clone-component.d.ts +16 -0
- package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
- package/dist/cli/commands/export/clone-page.d.ts +15 -0
- package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
- package/dist/cli/commands/interact/check.d.ts +7 -0
- package/dist/cli/commands/interact/check.d.ts.map +1 -0
- package/dist/cli/commands/interact/click.d.ts +7 -0
- package/dist/cli/commands/interact/click.d.ts.map +1 -0
- package/dist/cli/commands/interact/hover.d.ts +7 -0
- package/dist/cli/commands/interact/hover.d.ts.map +1 -0
- package/dist/cli/commands/interact/press.d.ts +7 -0
- package/dist/cli/commands/interact/press.d.ts.map +1 -0
- package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
- package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
- package/dist/cli/commands/interact/scroll.d.ts +7 -0
- package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
- package/dist/cli/commands/interact/select.d.ts +7 -0
- package/dist/cli/commands/interact/select.d.ts.map +1 -0
- package/dist/cli/commands/interact/type.d.ts +7 -0
- package/dist/cli/commands/interact/type.d.ts.map +1 -0
- package/dist/cli/commands/interact/uncheck.d.ts +7 -0
- package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
- package/dist/cli/commands/macro-resolve.d.ts +18 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
- package/dist/cli/commands/native.d.ts +93 -0
- package/dist/cli/commands/native.d.ts.map +1 -0
- package/dist/cli/commands/nav/goto.d.ts +7 -0
- package/dist/cli/commands/nav/goto.d.ts.map +1 -0
- package/dist/cli/commands/nav/snapshot.d.ts +7 -0
- package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/nav/wait.d.ts +7 -0
- package/dist/cli/commands/nav/wait.d.ts.map +1 -0
- package/dist/cli/commands/pages/close.d.ts +6 -0
- package/dist/cli/commands/pages/close.d.ts.map +1 -0
- package/dist/cli/commands/pages/list.d.ts +7 -0
- package/dist/cli/commands/pages/list.d.ts.map +1 -0
- package/dist/cli/commands/pages/open.d.ts +7 -0
- package/dist/cli/commands/pages/open.d.ts.map +1 -0
- package/dist/cli/commands/product-video.d.ts +25 -0
- package/dist/cli/commands/product-video.d.ts.map +1 -0
- package/dist/cli/commands/registry.d.ts +5 -0
- package/dist/cli/commands/registry.d.ts.map +1 -0
- package/dist/cli/commands/research.d.ts +27 -0
- package/dist/cli/commands/research.d.ts.map +1 -0
- package/dist/cli/commands/rpc.d.ts +28 -0
- package/dist/cli/commands/rpc.d.ts.map +1 -0
- package/dist/cli/commands/run.d.ts +17 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/serve.d.ts +64 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/session/connect.d.ts +9 -0
- package/dist/cli/commands/session/connect.d.ts.map +1 -0
- package/dist/cli/commands/session/cookie-import.d.ts +31 -0
- package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
- package/dist/cli/commands/session/cookie-list.d.ts +17 -0
- package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
- package/dist/cli/commands/session/disconnect.d.ts +6 -0
- package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
- package/dist/cli/commands/session/launch.d.ts +29 -0
- package/dist/cli/commands/session/launch.d.ts.map +1 -0
- package/dist/cli/commands/session/status.d.ts +7 -0
- package/dist/cli/commands/session/status.d.ts.map +1 -0
- package/dist/cli/commands/shopping.d.ts +25 -0
- package/dist/cli/commands/shopping.d.ts.map +1 -0
- package/dist/cli/commands/status.d.ts +24 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/targets/close.d.ts +6 -0
- package/dist/cli/commands/targets/close.d.ts.map +1 -0
- package/dist/cli/commands/targets/list.d.ts +7 -0
- package/dist/cli/commands/targets/list.d.ts.map +1 -0
- package/dist/cli/commands/targets/new.d.ts +7 -0
- package/dist/cli/commands/targets/new.d.ts.map +1 -0
- package/dist/cli/commands/targets/use.d.ts +7 -0
- package/dist/cli/commands/targets/use.d.ts.map +1 -0
- package/dist/cli/commands/types.d.ts +13 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +14 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/update.d.ts +7 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/daemon-autostart.d.ts +46 -0
- package/dist/cli/daemon-autostart.d.ts.map +1 -0
- package/dist/cli/daemon-client.d.ts +33 -0
- package/dist/cli/daemon-client.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts +7 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -0
- package/dist/cli/daemon-state.d.ts +56 -0
- package/dist/cli/daemon-state.d.ts.map +1 -0
- package/dist/cli/daemon-status.d.ts +19 -0
- package/dist/cli/daemon-status.d.ts.map +1 -0
- package/dist/cli/daemon.d.ts +29 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/errors.d.ts +20 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/help.d.ts +33 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2825 -326
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/global.d.ts +9 -0
- package/dist/cli/installers/global.d.ts.map +1 -0
- package/dist/cli/installers/local.d.ts +9 -0
- package/dist/cli/installers/local.d.ts.map +1 -0
- package/dist/cli/installers/skills.d.ts +19 -0
- package/dist/cli/installers/skills.d.ts.map +1 -0
- package/dist/cli/output.d.ts +7 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/remote-canvas-manager.d.ts +8 -0
- package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
- package/dist/cli/remote-manager.d.ts +98 -0
- package/dist/cli/remote-manager.d.ts.map +1 -0
- package/dist/cli/remote-relay.d.ts +19 -0
- package/dist/cli/remote-relay.d.ts.map +1 -0
- package/dist/cli/templates/config.d.ts +7 -0
- package/dist/cli/templates/config.d.ts.map +1 -0
- package/dist/cli/utils/config.d.ts +20 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/http.d.ts +5 -0
- package/dist/cli/utils/http.d.ts.map +1 -0
- package/dist/cli/utils/parse.d.ts +9 -0
- package/dist/cli/utils/parse.d.ts.map +1 -0
- package/dist/cli/utils/skills.d.ts +12 -0
- package/dist/cli/utils/skills.d.ts.map +1 -0
- package/dist/config.d.ts +208 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/core/bootstrap.d.ts +3 -0
- package/dist/core/bootstrap.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/logging.d.ts +34 -0
- package/dist/core/logging.d.ts.map +1 -0
- package/dist/core/types.d.ts +36 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/devtools/console-tracker.d.ts +44 -0
- package/dist/devtools/console-tracker.d.ts.map +1 -0
- package/dist/devtools/exception-tracker.d.ts +42 -0
- package/dist/devtools/exception-tracker.d.ts.map +1 -0
- package/dist/devtools/network-tracker.d.ts +34 -0
- package/dist/devtools/network-tracker.d.ts.map +1 -0
- package/dist/export/css-extract.d.ts +5 -0
- package/dist/export/css-extract.d.ts.map +1 -0
- package/dist/export/dom-capture.d.ts +15 -0
- package/dist/export/dom-capture.d.ts.map +1 -0
- package/dist/export/react-emitter.d.ts +11 -0
- package/dist/export/react-emitter.d.ts.map +1 -0
- package/dist/extension-extractor.d.ts +3 -0
- package/dist/extension-extractor.d.ts.map +1 -0
- package/dist/fs-UMRKOBNN.js +7 -0
- package/dist/fs-UMRKOBNN.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1028 -123
- package/dist/index.js.map +1 -1
- package/dist/macros/execute.d.ts +44 -0
- package/dist/macros/execute.d.ts.map +1 -0
- package/dist/macros/index.d.ts +9 -0
- package/dist/macros/index.d.ts.map +1 -0
- package/dist/macros/packs/core.d.ts +3 -0
- package/dist/macros/packs/core.d.ts.map +1 -0
- package/dist/macros/registry.d.ts +48 -0
- package/dist/macros/registry.d.ts.map +1 -0
- package/dist/macros-ND2M7LWU.js +399 -0
- package/dist/macros-ND2M7LWU.js.map +1 -0
- package/dist/opendevbrowser.d.ts +3 -4
- package/dist/opendevbrowser.d.ts.map +1 -0
- package/dist/opendevbrowser.js +1028 -123
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/providers/adaptive-concurrency.d.ts +42 -0
- package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
- package/dist/providers/artifacts.d.ts +34 -0
- package/dist/providers/artifacts.d.ts.map +1 -0
- package/dist/providers/blocker.d.ts +47 -0
- package/dist/providers/blocker.d.ts.map +1 -0
- package/dist/providers/community/index.d.ts +44 -0
- package/dist/providers/community/index.d.ts.map +1 -0
- package/dist/providers/enrichment.d.ts +33 -0
- package/dist/providers/enrichment.d.ts.map +1 -0
- package/dist/providers/errors.d.ts +41 -0
- package/dist/providers/errors.d.ts.map +1 -0
- package/dist/providers/index.d.ts +121 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/normalize.d.ts +39 -0
- package/dist/providers/normalize.d.ts.map +1 -0
- package/dist/providers/policy.d.ts +5 -0
- package/dist/providers/policy.d.ts.map +1 -0
- package/dist/providers/registry.d.ts +22 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/renderer.d.ts +49 -0
- package/dist/providers/renderer.d.ts.map +1 -0
- package/dist/providers/runtime-factory.d.ts +20 -0
- package/dist/providers/runtime-factory.d.ts.map +1 -0
- package/dist/providers/safety/prompt-guard.d.ts +34 -0
- package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
- package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
- package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
- package/dist/providers/shared/post-policy.d.ts +31 -0
- package/dist/providers/shared/post-policy.d.ts.map +1 -0
- package/dist/providers/shared/request-headers.d.ts +5 -0
- package/dist/providers/shared/request-headers.d.ts.map +1 -0
- package/dist/providers/shared/traversal-url.d.ts +2 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -0
- package/dist/providers/shopping/index.d.ts +63 -0
- package/dist/providers/shopping/index.d.ts.map +1 -0
- package/dist/providers/social/bluesky.d.ts +3 -0
- package/dist/providers/social/bluesky.d.ts.map +1 -0
- package/dist/providers/social/facebook.d.ts +3 -0
- package/dist/providers/social/facebook.d.ts.map +1 -0
- package/dist/providers/social/index.d.ts +31 -0
- package/dist/providers/social/index.d.ts.map +1 -0
- package/dist/providers/social/instagram.d.ts +3 -0
- package/dist/providers/social/instagram.d.ts.map +1 -0
- package/dist/providers/social/linkedin.d.ts +3 -0
- package/dist/providers/social/linkedin.d.ts.map +1 -0
- package/dist/providers/social/platform.d.ts +40 -0
- package/dist/providers/social/platform.d.ts.map +1 -0
- package/dist/providers/social/reddit.d.ts +3 -0
- package/dist/providers/social/reddit.d.ts.map +1 -0
- package/dist/providers/social/threads.d.ts +3 -0
- package/dist/providers/social/threads.d.ts.map +1 -0
- package/dist/providers/social/tiktok.d.ts +3 -0
- package/dist/providers/social/tiktok.d.ts.map +1 -0
- package/dist/providers/social/x.d.ts +3 -0
- package/dist/providers/social/x.d.ts.map +1 -0
- package/dist/providers/social/youtube-resolver.d.ts +78 -0
- package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
- package/dist/providers/social/youtube.d.ts +34 -0
- package/dist/providers/social/youtube.d.ts.map +1 -0
- package/dist/providers/tier-router.d.ts +30 -0
- package/dist/providers/tier-router.d.ts.map +1 -0
- package/dist/providers/timebox.d.ts +20 -0
- package/dist/providers/timebox.d.ts.map +1 -0
- package/dist/providers/types.d.ts +344 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/web/crawl-worker.d.ts +36 -0
- package/dist/providers/web/crawl-worker.d.ts.map +1 -0
- package/dist/providers/web/crawler.d.ts +101 -0
- package/dist/providers/web/crawler.d.ts.map +1 -0
- package/dist/providers/web/extract.d.ts +11 -0
- package/dist/providers/web/extract.d.ts.map +1 -0
- package/dist/providers/web/index.d.ts +24 -0
- package/dist/providers/web/index.d.ts.map +1 -0
- package/dist/providers/web/policy.d.ts +14 -0
- package/dist/providers/web/policy.d.ts.map +1 -0
- package/dist/providers/workflows.d.ts +67 -0
- package/dist/providers/workflows.d.ts.map +1 -0
- package/dist/providers-G3LRHQXX.js +121 -0
- package/dist/providers-G3LRHQXX.js.map +1 -0
- package/dist/relay/protocol.d.ts +399 -0
- package/dist/relay/protocol.d.ts.map +1 -0
- package/dist/relay/relay-endpoints.d.ts +16 -0
- package/dist/relay/relay-endpoints.d.ts.map +1 -0
- package/dist/relay/relay-server.d.ts +124 -0
- package/dist/relay/relay-server.d.ts.map +1 -0
- package/dist/relay/relay-types.d.ts +12 -0
- package/dist/relay/relay-types.d.ts.map +1 -0
- package/dist/runtime-factory-BICHDPE7.js +13 -0
- package/dist/runtime-factory-BICHDPE7.js.map +1 -0
- package/dist/skills/continuity-nudge.d.ts +12 -0
- package/dist/skills/continuity-nudge.d.ts.map +1 -0
- package/dist/skills/skill-loader.d.ts +20 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-nudge.d.ts +18 -0
- package/dist/skills/skill-nudge.d.ts.map +1 -0
- package/dist/skills/types.d.ts +12 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/snapshot/ops-snapshot.d.ts +16 -0
- package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
- package/dist/snapshot/refs.d.ts +23 -0
- package/dist/snapshot/refs.d.ts.map +1 -0
- package/dist/snapshot/snapshotter.d.ts +27 -0
- package/dist/snapshot/snapshotter.d.ts.map +1 -0
- package/dist/tools/annotate.d.ts +4 -0
- package/dist/tools/annotate.d.ts.map +1 -0
- package/dist/tools/canvas.d.ts +4 -0
- package/dist/tools/canvas.d.ts.map +1 -0
- package/dist/tools/check.d.ts +4 -0
- package/dist/tools/check.d.ts.map +1 -0
- package/dist/tools/click.d.ts +4 -0
- package/dist/tools/click.d.ts.map +1 -0
- package/dist/tools/clone_component.d.ts +4 -0
- package/dist/tools/clone_component.d.ts.map +1 -0
- package/dist/tools/clone_page.d.ts +4 -0
- package/dist/tools/clone_page.d.ts.map +1 -0
- package/dist/tools/close.d.ts +4 -0
- package/dist/tools/close.d.ts.map +1 -0
- package/dist/tools/connect.d.ts +4 -0
- package/dist/tools/connect.d.ts.map +1 -0
- package/dist/tools/console_poll.d.ts +4 -0
- package/dist/tools/console_poll.d.ts.map +1 -0
- package/dist/tools/cookie_import.d.ts +25 -0
- package/dist/tools/cookie_import.d.ts.map +1 -0
- package/dist/tools/cookie_list.d.ts +9 -0
- package/dist/tools/cookie_list.d.ts.map +1 -0
- package/dist/tools/debug_trace_snapshot.d.ts +4 -0
- package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
- package/dist/tools/deps.d.ts +28 -0
- package/dist/tools/deps.d.ts.map +1 -0
- package/dist/tools/disconnect.d.ts +4 -0
- package/dist/tools/disconnect.d.ts.map +1 -0
- package/dist/tools/dom_get_html.d.ts +4 -0
- package/dist/tools/dom_get_html.d.ts.map +1 -0
- package/dist/tools/dom_get_text.d.ts +4 -0
- package/dist/tools/dom_get_text.d.ts.map +1 -0
- package/dist/tools/get_attr.d.ts +4 -0
- package/dist/tools/get_attr.d.ts.map +1 -0
- package/dist/tools/get_value.d.ts +4 -0
- package/dist/tools/get_value.d.ts.map +1 -0
- package/dist/tools/goto.d.ts +4 -0
- package/dist/tools/goto.d.ts.map +1 -0
- package/dist/tools/hover.d.ts +4 -0
- package/dist/tools/hover.d.ts.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/is_checked.d.ts +4 -0
- package/dist/tools/is_checked.d.ts.map +1 -0
- package/dist/tools/is_enabled.d.ts +4 -0
- package/dist/tools/is_enabled.d.ts.map +1 -0
- package/dist/tools/is_visible.d.ts +4 -0
- package/dist/tools/is_visible.d.ts.map +1 -0
- package/dist/tools/launch.d.ts +4 -0
- package/dist/tools/launch.d.ts.map +1 -0
- package/dist/tools/list.d.ts +4 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/macro_resolve.d.ts +25 -0
- package/dist/tools/macro_resolve.d.ts.map +1 -0
- package/dist/tools/network_poll.d.ts +4 -0
- package/dist/tools/network_poll.d.ts.map +1 -0
- package/dist/tools/page.d.ts +4 -0
- package/dist/tools/page.d.ts.map +1 -0
- package/dist/tools/perf.d.ts +4 -0
- package/dist/tools/perf.d.ts.map +1 -0
- package/dist/tools/press.d.ts +4 -0
- package/dist/tools/press.d.ts.map +1 -0
- package/dist/tools/product_video_run.d.ts +4 -0
- package/dist/tools/product_video_run.d.ts.map +1 -0
- package/dist/tools/prompting_guide.d.ts +4 -0
- package/dist/tools/prompting_guide.d.ts.map +1 -0
- package/dist/tools/research_run.d.ts +4 -0
- package/dist/tools/research_run.d.ts.map +1 -0
- package/dist/tools/response.d.ts +19 -0
- package/dist/tools/response.d.ts.map +1 -0
- package/dist/tools/run.d.ts +4 -0
- package/dist/tools/run.d.ts.map +1 -0
- package/dist/tools/screenshot.d.ts +4 -0
- package/dist/tools/screenshot.d.ts.map +1 -0
- package/dist/tools/scroll.d.ts +4 -0
- package/dist/tools/scroll.d.ts.map +1 -0
- package/dist/tools/scroll_into_view.d.ts +4 -0
- package/dist/tools/scroll_into_view.d.ts.map +1 -0
- package/dist/tools/select.d.ts +4 -0
- package/dist/tools/select.d.ts.map +1 -0
- package/dist/tools/shopping_run.d.ts +4 -0
- package/dist/tools/shopping_run.d.ts.map +1 -0
- package/dist/tools/skill_list.d.ts +4 -0
- package/dist/tools/skill_list.d.ts.map +1 -0
- package/dist/tools/skill_load.d.ts +4 -0
- package/dist/tools/skill_load.d.ts.map +1 -0
- package/dist/tools/snapshot.d.ts +4 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/status.d.ts +4 -0
- package/dist/tools/status.d.ts.map +1 -0
- package/dist/tools/target_close.d.ts +4 -0
- package/dist/tools/target_close.d.ts.map +1 -0
- package/dist/tools/target_new.d.ts +4 -0
- package/dist/tools/target_new.d.ts.map +1 -0
- package/dist/tools/target_use.d.ts +4 -0
- package/dist/tools/target_use.d.ts.map +1 -0
- package/dist/tools/targets_list.d.ts +4 -0
- package/dist/tools/targets_list.d.ts.map +1 -0
- package/dist/tools/type.d.ts +4 -0
- package/dist/tools/type.d.ts.map +1 -0
- package/dist/tools/uncheck.d.ts +4 -0
- package/dist/tools/uncheck.d.ts.map +1 -0
- package/dist/tools/wait.d.ts +4 -0
- package/dist/tools/wait.d.ts.map +1 -0
- package/dist/tools/workflow-runtime.d.ts +3 -0
- package/dist/tools/workflow-runtime.d.ts.map +1 -0
- package/dist/utils/crypto.d.ts +2 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/endpoint-validation.d.ts +2 -0
- package/dist/utils/endpoint-validation.d.ts.map +1 -0
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/hub-enabled.d.ts +3 -0
- package/dist/utils/hub-enabled.d.ts.map +1 -0
- package/extension/canvas.html +636 -0
- package/extension/dist/annotate-content.css +15 -6
- package/extension/dist/annotate-content.js +119 -9
- package/extension/dist/annotation-payload.js +163 -0
- package/extension/dist/background.js +158 -22
- package/extension/dist/canvas/canvas-runtime.js +1061 -0
- package/extension/dist/canvas/model.js +213 -0
- package/extension/dist/canvas/viewport-fit.js +67 -0
- package/extension/dist/canvas-page.js +1801 -0
- package/extension/dist/ops/dom-bridge.js +116 -3
- package/extension/dist/ops/ops-runtime.js +1014 -48
- package/extension/dist/ops/ops-session-store.js +37 -116
- package/extension/dist/ops/parallelism-governor.js +117 -0
- package/extension/dist/ops/snapshot-shared.js +21 -5
- package/extension/dist/ops/target-session-coordinator.js +157 -0
- package/extension/dist/popup.js +155 -31
- package/extension/dist/services/CDPRouter.js +70 -5
- package/extension/dist/services/ConnectionManager.js +22 -3
- package/extension/dist/services/RelayClient.js +9 -0
- package/extension/dist/services/TabManager.js +35 -12
- package/extension/dist/types.js +2 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/manifest.json +1 -1
- package/extension/popup.html +52 -0
- package/package.json +30 -19
- package/scripts/native/host.cjs +230 -0
- package/scripts/native/install.ps1 +73 -0
- package/scripts/native/install.sh +66 -0
- package/scripts/native/uninstall.ps1 +25 -0
- package/scripts/native/uninstall.sh +26 -0
- package/skills/AGENTS.md +20 -8
- package/skills/opendevbrowser-best-practices/SKILL.md +248 -74
- package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
- package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
- package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +191 -0
- package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
- package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
- package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
- package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
- package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
- package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
- package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
- package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +136 -0
- package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +28 -0
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +170 -0
- package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +164 -0
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +234 -0
- package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
- package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
- package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
- package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
- package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
- package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
- package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
- package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
- package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
- package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
- package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
- package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
- package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
- package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
- package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
- package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
- package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
- package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
- package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
- package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
- package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
- package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
- package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
- package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
- package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
- package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
- package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
- package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
- package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
- package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
- package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
- package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
- package/skills/opendevbrowser-research/SKILL.md +73 -0
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
- package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
- package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
- package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
- package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
- package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
- package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
- package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
- package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
- package/skills/opendevbrowser-shopping/SKILL.md +118 -0
- package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
- package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
- package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
- package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
- package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
- package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
- package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
- package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
- package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
- package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
- package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
- package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
- package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
- package/dist/chunk-JVBMT2O5.js +0 -7173
- package/dist/chunk-JVBMT2O5.js.map +0 -1
- package/skills/data-extraction/SKILL.md +0 -128
- package/skills/form-testing/SKILL.md +0 -106
- package/skills/login-automation/SKILL.md +0 -108
package/dist/opendevbrowser.js
CHANGED
|
@@ -3,10 +3,24 @@ import {
|
|
|
3
3
|
ScriptRunner,
|
|
4
4
|
buildAnnotateResult,
|
|
5
5
|
createOpenDevBrowserCore,
|
|
6
|
+
executeMacroResolution,
|
|
6
7
|
extractExtension,
|
|
7
8
|
fetchDaemonStatusFromMetadata,
|
|
9
|
+
shapeExecutionPayload,
|
|
8
10
|
startDaemon
|
|
9
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-5J3IFL3X.js";
|
|
12
|
+
import "./chunk-Y2KL55OG.js";
|
|
13
|
+
import "./chunk-TBUCZX4A.js";
|
|
14
|
+
import {
|
|
15
|
+
createBrowserFallbackPort,
|
|
16
|
+
createConfiguredProviderRuntime
|
|
17
|
+
} from "./chunk-V7KUDHDG.js";
|
|
18
|
+
import {
|
|
19
|
+
buildBlockerArtifacts,
|
|
20
|
+
classifyBlockerSignal,
|
|
21
|
+
createRequestId
|
|
22
|
+
} from "./chunk-D633UO34.js";
|
|
23
|
+
import "./chunk-FUSXMW3G.js";
|
|
10
24
|
|
|
11
25
|
// src/cli/remote-manager.ts
|
|
12
26
|
function isLegacyRelayEndpoint(wsEndpoint) {
|
|
@@ -29,10 +43,18 @@ var RemoteManager = class {
|
|
|
29
43
|
connect(options) {
|
|
30
44
|
return this.client.call("session.connect", options);
|
|
31
45
|
}
|
|
32
|
-
connectRelay(wsEndpoint) {
|
|
46
|
+
connectRelay(wsEndpoint, options) {
|
|
47
|
+
const startUrl = typeof options?.startUrl === "string" && options.startUrl.trim().length > 0 ? options.startUrl.trim() : void 0;
|
|
33
48
|
return this.client.call(
|
|
34
49
|
"session.connect",
|
|
35
|
-
isLegacyRelayEndpoint(wsEndpoint) ? {
|
|
50
|
+
isLegacyRelayEndpoint(wsEndpoint) ? {
|
|
51
|
+
wsEndpoint,
|
|
52
|
+
extensionLegacy: true,
|
|
53
|
+
...startUrl ? { startUrl } : {}
|
|
54
|
+
} : {
|
|
55
|
+
wsEndpoint,
|
|
56
|
+
...startUrl ? { startUrl } : {}
|
|
57
|
+
}
|
|
36
58
|
);
|
|
37
59
|
}
|
|
38
60
|
disconnect(sessionId, closeBrowser = false) {
|
|
@@ -41,77 +63,202 @@ var RemoteManager = class {
|
|
|
41
63
|
status(sessionId) {
|
|
42
64
|
return this.client.call("session.status", { sessionId });
|
|
43
65
|
}
|
|
44
|
-
|
|
45
|
-
return this.client.call("
|
|
66
|
+
cookieImport(sessionId, cookies, strict = true, requestId) {
|
|
67
|
+
return this.client.call("session.cookieImport", {
|
|
68
|
+
sessionId,
|
|
69
|
+
cookies,
|
|
70
|
+
strict,
|
|
71
|
+
requestId
|
|
72
|
+
});
|
|
46
73
|
}
|
|
47
|
-
|
|
48
|
-
return this.client.call("
|
|
74
|
+
cookieList(sessionId, urls, requestId) {
|
|
75
|
+
return this.client.call("session.cookieList", {
|
|
76
|
+
sessionId,
|
|
77
|
+
...urls && urls.length > 0 ? { urls } : {},
|
|
78
|
+
requestId
|
|
79
|
+
});
|
|
49
80
|
}
|
|
50
|
-
|
|
51
|
-
return this.client.call("nav.
|
|
81
|
+
goto(sessionId, url, waitUntil = "load", timeoutMs = 3e4, _sessionOverride, targetId) {
|
|
82
|
+
return this.client.call("nav.goto", {
|
|
83
|
+
sessionId,
|
|
84
|
+
url,
|
|
85
|
+
waitUntil,
|
|
86
|
+
timeoutMs,
|
|
87
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
88
|
+
});
|
|
52
89
|
}
|
|
53
|
-
|
|
54
|
-
return this.client.call("nav.
|
|
90
|
+
waitForLoad(sessionId, until, timeoutMs = 3e4, targetId) {
|
|
91
|
+
return this.client.call("nav.wait", {
|
|
92
|
+
sessionId,
|
|
93
|
+
until,
|
|
94
|
+
timeoutMs,
|
|
95
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
96
|
+
});
|
|
55
97
|
}
|
|
56
|
-
|
|
57
|
-
return this.client.call("
|
|
98
|
+
waitForRef(sessionId, ref, state = "attached", timeoutMs = 3e4, targetId) {
|
|
99
|
+
return this.client.call("nav.wait", {
|
|
100
|
+
sessionId,
|
|
101
|
+
ref,
|
|
102
|
+
state,
|
|
103
|
+
timeoutMs,
|
|
104
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
105
|
+
});
|
|
58
106
|
}
|
|
59
|
-
|
|
60
|
-
return this.client.call("
|
|
107
|
+
snapshot(sessionId, mode, maxChars, cursor, targetId) {
|
|
108
|
+
return this.client.call("nav.snapshot", {
|
|
109
|
+
sessionId,
|
|
110
|
+
mode,
|
|
111
|
+
maxChars,
|
|
112
|
+
cursor,
|
|
113
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
114
|
+
});
|
|
61
115
|
}
|
|
62
|
-
|
|
63
|
-
return this.client.call("interact.
|
|
116
|
+
click(sessionId, ref, targetId) {
|
|
117
|
+
return this.client.call("interact.click", {
|
|
118
|
+
sessionId,
|
|
119
|
+
ref,
|
|
120
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
121
|
+
});
|
|
64
122
|
}
|
|
65
|
-
|
|
66
|
-
return this.client.call("interact.
|
|
123
|
+
hover(sessionId, ref, targetId) {
|
|
124
|
+
return this.client.call("interact.hover", {
|
|
125
|
+
sessionId,
|
|
126
|
+
ref,
|
|
127
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
128
|
+
});
|
|
67
129
|
}
|
|
68
|
-
|
|
69
|
-
return this.client.call("interact.
|
|
130
|
+
press(sessionId, key, ref, targetId) {
|
|
131
|
+
return this.client.call("interact.press", {
|
|
132
|
+
sessionId,
|
|
133
|
+
key,
|
|
134
|
+
ref,
|
|
135
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
136
|
+
});
|
|
70
137
|
}
|
|
71
|
-
|
|
72
|
-
return this.client.call("interact.
|
|
138
|
+
check(sessionId, ref, targetId) {
|
|
139
|
+
return this.client.call("interact.check", {
|
|
140
|
+
sessionId,
|
|
141
|
+
ref,
|
|
142
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
143
|
+
});
|
|
73
144
|
}
|
|
74
|
-
|
|
75
|
-
return this.client.call("interact.
|
|
145
|
+
uncheck(sessionId, ref, targetId) {
|
|
146
|
+
return this.client.call("interact.uncheck", {
|
|
147
|
+
sessionId,
|
|
148
|
+
ref,
|
|
149
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
150
|
+
});
|
|
76
151
|
}
|
|
77
|
-
|
|
78
|
-
return this.client.call("interact.
|
|
152
|
+
type(sessionId, ref, text, clear = false, submit = false, targetId) {
|
|
153
|
+
return this.client.call("interact.type", {
|
|
154
|
+
sessionId,
|
|
155
|
+
ref,
|
|
156
|
+
text,
|
|
157
|
+
clear,
|
|
158
|
+
submit,
|
|
159
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
160
|
+
});
|
|
79
161
|
}
|
|
80
|
-
|
|
81
|
-
return this.client.call("interact.
|
|
162
|
+
select(sessionId, ref, values, targetId) {
|
|
163
|
+
return this.client.call("interact.select", {
|
|
164
|
+
sessionId,
|
|
165
|
+
ref,
|
|
166
|
+
values,
|
|
167
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
168
|
+
});
|
|
82
169
|
}
|
|
83
|
-
|
|
84
|
-
return this.client.call("
|
|
170
|
+
scroll(sessionId, dy, ref, targetId) {
|
|
171
|
+
return this.client.call("interact.scroll", {
|
|
172
|
+
sessionId,
|
|
173
|
+
dy,
|
|
174
|
+
ref,
|
|
175
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
176
|
+
});
|
|
85
177
|
}
|
|
86
|
-
|
|
87
|
-
return this.client.call("
|
|
178
|
+
scrollIntoView(sessionId, ref, targetId) {
|
|
179
|
+
return this.client.call("interact.scrollIntoView", {
|
|
180
|
+
sessionId,
|
|
181
|
+
ref,
|
|
182
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
183
|
+
});
|
|
88
184
|
}
|
|
89
|
-
|
|
90
|
-
return this.client.call("dom.
|
|
185
|
+
domGetHtml(sessionId, ref, maxChars = 8e3, targetId) {
|
|
186
|
+
return this.client.call("dom.getHtml", {
|
|
187
|
+
sessionId,
|
|
188
|
+
ref,
|
|
189
|
+
maxChars,
|
|
190
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
191
|
+
});
|
|
91
192
|
}
|
|
92
|
-
|
|
93
|
-
return this.client.call("dom.
|
|
193
|
+
domGetText(sessionId, ref, maxChars = 8e3, targetId) {
|
|
194
|
+
return this.client.call("dom.getText", {
|
|
195
|
+
sessionId,
|
|
196
|
+
ref,
|
|
197
|
+
maxChars,
|
|
198
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
199
|
+
});
|
|
94
200
|
}
|
|
95
|
-
|
|
96
|
-
return this.client.call("dom.
|
|
201
|
+
domGetAttr(sessionId, ref, name, targetId) {
|
|
202
|
+
return this.client.call("dom.getAttr", {
|
|
203
|
+
sessionId,
|
|
204
|
+
ref,
|
|
205
|
+
name,
|
|
206
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
207
|
+
});
|
|
97
208
|
}
|
|
98
|
-
|
|
99
|
-
return this.client.call("dom.
|
|
209
|
+
domGetValue(sessionId, ref, targetId) {
|
|
210
|
+
return this.client.call("dom.getValue", {
|
|
211
|
+
sessionId,
|
|
212
|
+
ref,
|
|
213
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
214
|
+
});
|
|
100
215
|
}
|
|
101
|
-
|
|
102
|
-
return this.client.call("dom.
|
|
216
|
+
domIsVisible(sessionId, ref, targetId) {
|
|
217
|
+
return this.client.call("dom.isVisible", {
|
|
218
|
+
sessionId,
|
|
219
|
+
ref,
|
|
220
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
221
|
+
});
|
|
103
222
|
}
|
|
104
|
-
|
|
105
|
-
return this.client.call("
|
|
223
|
+
domIsEnabled(sessionId, ref, targetId) {
|
|
224
|
+
return this.client.call("dom.isEnabled", {
|
|
225
|
+
sessionId,
|
|
226
|
+
ref,
|
|
227
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
228
|
+
});
|
|
106
229
|
}
|
|
107
|
-
|
|
108
|
-
return this.client.call("
|
|
230
|
+
domIsChecked(sessionId, ref, targetId) {
|
|
231
|
+
return this.client.call("dom.isChecked", {
|
|
232
|
+
sessionId,
|
|
233
|
+
ref,
|
|
234
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
235
|
+
});
|
|
109
236
|
}
|
|
110
|
-
|
|
111
|
-
return this.client.call("
|
|
237
|
+
clonePage(sessionId, targetId) {
|
|
238
|
+
return this.client.call("export.clonePage", {
|
|
239
|
+
sessionId,
|
|
240
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
241
|
+
});
|
|
112
242
|
}
|
|
113
|
-
|
|
114
|
-
return this.client.call("
|
|
243
|
+
cloneComponent(sessionId, ref, targetId) {
|
|
244
|
+
return this.client.call("export.cloneComponent", {
|
|
245
|
+
sessionId,
|
|
246
|
+
ref,
|
|
247
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
perfMetrics(sessionId, targetId) {
|
|
251
|
+
return this.client.call("devtools.perf", {
|
|
252
|
+
sessionId,
|
|
253
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
screenshot(sessionId, path, targetId) {
|
|
257
|
+
return this.client.call("page.screenshot", {
|
|
258
|
+
sessionId,
|
|
259
|
+
path,
|
|
260
|
+
...typeof targetId === "string" ? { targetId } : {}
|
|
261
|
+
});
|
|
115
262
|
}
|
|
116
263
|
consolePoll(sessionId, sinceSeq, max = 50) {
|
|
117
264
|
return this.client.call("devtools.consolePoll", { sessionId, sinceSeq, max });
|
|
@@ -145,6 +292,17 @@ var RemoteManager = class {
|
|
|
145
292
|
}
|
|
146
293
|
};
|
|
147
294
|
|
|
295
|
+
// src/cli/remote-canvas-manager.ts
|
|
296
|
+
var RemoteCanvasManager = class {
|
|
297
|
+
client;
|
|
298
|
+
constructor(client) {
|
|
299
|
+
this.client = client;
|
|
300
|
+
}
|
|
301
|
+
execute(command, params = {}) {
|
|
302
|
+
return this.client.call("canvas.execute", { command, params });
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
|
|
148
306
|
// src/cli/remote-relay.ts
|
|
149
307
|
var emptyStatus = {
|
|
150
308
|
running: false,
|
|
@@ -153,6 +311,7 @@ var emptyStatus = {
|
|
|
153
311
|
cdpConnected: false,
|
|
154
312
|
annotationConnected: false,
|
|
155
313
|
opsConnected: false,
|
|
314
|
+
canvasConnected: false,
|
|
156
315
|
pairingRequired: false,
|
|
157
316
|
instanceId: "",
|
|
158
317
|
epoch: 0,
|
|
@@ -164,6 +323,7 @@ var emptyStatus = {
|
|
|
164
323
|
cdpConnected: false,
|
|
165
324
|
annotationConnected: false,
|
|
166
325
|
opsConnected: false,
|
|
326
|
+
canvasConnected: false,
|
|
167
327
|
pairingRequired: false
|
|
168
328
|
}
|
|
169
329
|
};
|
|
@@ -173,6 +333,7 @@ var RemoteRelay = class {
|
|
|
173
333
|
lastCdpUrl = null;
|
|
174
334
|
lastAnnotationUrl = null;
|
|
175
335
|
lastOpsUrl = null;
|
|
336
|
+
lastCanvasUrl = null;
|
|
176
337
|
constructor(client) {
|
|
177
338
|
this.client = client;
|
|
178
339
|
}
|
|
@@ -186,11 +347,14 @@ var RemoteRelay = class {
|
|
|
186
347
|
this.lastAnnotationUrl = typeof annotationUrl === "string" ? annotationUrl : null;
|
|
187
348
|
const opsUrl = await this.client.call("relay.opsUrl");
|
|
188
349
|
this.lastOpsUrl = typeof opsUrl === "string" ? opsUrl : null;
|
|
350
|
+
const canvasUrl = await this.client.call("relay.canvasUrl");
|
|
351
|
+
this.lastCanvasUrl = typeof canvasUrl === "string" ? canvasUrl : null;
|
|
189
352
|
} catch {
|
|
190
353
|
this.lastStatus = emptyStatus;
|
|
191
354
|
this.lastCdpUrl = null;
|
|
192
355
|
this.lastAnnotationUrl = null;
|
|
193
356
|
this.lastOpsUrl = null;
|
|
357
|
+
this.lastCanvasUrl = null;
|
|
194
358
|
}
|
|
195
359
|
}
|
|
196
360
|
status() {
|
|
@@ -205,11 +369,14 @@ var RemoteRelay = class {
|
|
|
205
369
|
getOpsUrl() {
|
|
206
370
|
return this.lastOpsUrl;
|
|
207
371
|
}
|
|
372
|
+
getCanvasUrl() {
|
|
373
|
+
return this.lastCanvasUrl;
|
|
374
|
+
}
|
|
208
375
|
};
|
|
209
376
|
|
|
210
377
|
// src/skills/skill-nudge.ts
|
|
211
378
|
var SKILL_NUDGE_MARKER = "[opendevbrowser:skill-nudge]";
|
|
212
|
-
var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill,
|
|
379
|
+
var SKILL_NUDGE_MESSAGE = `${SKILL_NUDGE_MARKER} If this task likely matches a skill, start with skill("opendevbrowser-best-practices", "quick start"). Use another skill only when it is more relevant.`;
|
|
213
380
|
function createSkillNudgeState() {
|
|
214
381
|
return { pending: false, requestedAtMs: null };
|
|
215
382
|
}
|
|
@@ -272,7 +439,7 @@ function consumeContinuityNudge(state, nowMs, maxAgeMs) {
|
|
|
272
439
|
}
|
|
273
440
|
function buildContinuityNudgeMessage(filePath) {
|
|
274
441
|
const target = filePath?.trim() || DEFAULT_FILE_PATH;
|
|
275
|
-
return `${CONTINUITY_NUDGE_MARKER} For long-running tasks, create or update ${target} at the repo root with Goal, Constraints/Assumptions, Key decisions, State (Done/Now/Next), Open questions, and Working set. Keep it brief.`;
|
|
442
|
+
return `${CONTINUITY_NUDGE_MARKER} For long-running tasks, load skill("opendevbrowser-continuity-ledger") and create or update ${target} at the repo root with Goal, Constraints/Assumptions, Key decisions, State (Done/Now/Next), Open questions, and Working set. Keep it brief.`;
|
|
276
443
|
}
|
|
277
444
|
|
|
278
445
|
// src/tools/launch.ts
|
|
@@ -282,18 +449,25 @@ import { tool } from "@opencode-ai/plugin";
|
|
|
282
449
|
function ok(data) {
|
|
283
450
|
return JSON.stringify({ ok: true, ...data });
|
|
284
451
|
}
|
|
285
|
-
function failure(message, code) {
|
|
452
|
+
function failure(message, code, details) {
|
|
286
453
|
return JSON.stringify({
|
|
287
454
|
ok: false,
|
|
288
455
|
error: {
|
|
289
456
|
message,
|
|
290
|
-
code
|
|
457
|
+
code,
|
|
458
|
+
...details ? { details } : {}
|
|
291
459
|
}
|
|
292
460
|
});
|
|
293
461
|
}
|
|
294
462
|
function serializeError(error) {
|
|
295
463
|
if (error instanceof Error) {
|
|
296
|
-
|
|
464
|
+
const detailCarrier = error;
|
|
465
|
+
const details = detailCarrier.details && typeof detailCarrier.details === "object" && !Array.isArray(detailCarrier.details) ? detailCarrier.details : detailCarrier.blocker && typeof detailCarrier.blocker === "object" && !Array.isArray(detailCarrier.blocker) ? { blocker: detailCarrier.blocker } : void 0;
|
|
466
|
+
return {
|
|
467
|
+
message: error.message,
|
|
468
|
+
code: detailCarrier.code,
|
|
469
|
+
details
|
|
470
|
+
};
|
|
297
471
|
}
|
|
298
472
|
return { message: "Unknown error" };
|
|
299
473
|
}
|
|
@@ -333,6 +507,12 @@ function createLaunchTool(deps) {
|
|
|
333
507
|
const headlessExplicit = args.headless === true;
|
|
334
508
|
const managedExplicit = Boolean(args.noExtension || headlessExplicit);
|
|
335
509
|
const managedHeadless = headlessExplicit ? true : false;
|
|
510
|
+
if (headlessExplicit && !args.noExtension) {
|
|
511
|
+
return failure(
|
|
512
|
+
"Extension mode does not support headless launches. Use noExtension=true with headless=true for managed mode.",
|
|
513
|
+
"unsupported_mode"
|
|
514
|
+
);
|
|
515
|
+
}
|
|
336
516
|
if (args.waitForExtension && !managedExplicit) {
|
|
337
517
|
const observedPort2 = resolveObservedPort(relayStatus, config.relayPort);
|
|
338
518
|
const connected = await waitForExtensionHandshake(deps.relay, observedPort2, waitTimeoutMs);
|
|
@@ -381,7 +561,7 @@ function createLaunchTool(deps) {
|
|
|
381
561
|
return failure(buildExtensionMissingMessage(diagnostics.message), "extension_not_connected");
|
|
382
562
|
}
|
|
383
563
|
try {
|
|
384
|
-
result = await deps.manager.connectRelay(relayUrl);
|
|
564
|
+
result = args.startUrl ? await deps.manager.connectRelay(relayUrl, { startUrl: args.startUrl }) : await deps.manager.connectRelay(relayUrl);
|
|
385
565
|
usedRelay = true;
|
|
386
566
|
} catch (error) {
|
|
387
567
|
const errorMessage = serializeError(error).message;
|
|
@@ -419,9 +599,6 @@ function createLaunchTool(deps) {
|
|
|
419
599
|
return failure(buildManagedFailureMessage(error), "launch_failed");
|
|
420
600
|
}
|
|
421
601
|
}
|
|
422
|
-
if (usedRelay && args.startUrl && result.activeTargetId) {
|
|
423
|
-
await deps.manager.goto(result.sessionId, args.startUrl, "load", 3e4);
|
|
424
|
-
}
|
|
425
602
|
const warnings = result.warnings ?? [];
|
|
426
603
|
return ok({
|
|
427
604
|
sessionId: result.sessionId,
|
|
@@ -628,6 +805,7 @@ function createConnectTool(deps) {
|
|
|
628
805
|
wsEndpoint: z2.string().optional().describe("Full WebSocket endpoint to connect to"),
|
|
629
806
|
host: z2.string().optional().describe("Host for /json/version lookup"),
|
|
630
807
|
port: z2.number().int().optional().describe("Port for /json/version lookup"),
|
|
808
|
+
startUrl: z2.string().optional().describe("Open this URL immediately after connect"),
|
|
631
809
|
extensionLegacy: z2.boolean().optional().describe("Use legacy extension relay (/cdp) instead of ops")
|
|
632
810
|
},
|
|
633
811
|
async execute(args) {
|
|
@@ -635,6 +813,7 @@ function createConnectTool(deps) {
|
|
|
635
813
|
await deps.relay?.refresh?.();
|
|
636
814
|
const wsEndpoint = args.wsEndpoint;
|
|
637
815
|
const extensionLegacy = args.extensionLegacy === true;
|
|
816
|
+
const startUrl = typeof args.startUrl === "string" && args.startUrl.trim().length > 0 ? args.startUrl.trim() : void 0;
|
|
638
817
|
const hasExplicitCdp = Boolean(wsEndpoint || args.host || args.port);
|
|
639
818
|
const relayUrl = extensionLegacy ? deps.relay?.getCdpUrl() ?? null : deps.relay?.getOpsUrl?.() ?? null;
|
|
640
819
|
const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, "ops", true);
|
|
@@ -645,7 +824,7 @@ function createConnectTool(deps) {
|
|
|
645
824
|
const relayEndpoint = relayUrl && wsEndpoint === relayUrl ? relayUrl : extensionLegacy ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint : normalizedOpsEndpoint;
|
|
646
825
|
let result;
|
|
647
826
|
if (relayEndpoint || !hasExplicitCdp && relayUrl) {
|
|
648
|
-
result = await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
|
|
827
|
+
result = startUrl ? await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "", { startUrl }) : await deps.manager.connectRelay(relayEndpoint ?? relayUrl ?? "");
|
|
649
828
|
} else {
|
|
650
829
|
if (!hasExplicitCdp) {
|
|
651
830
|
return failure("Extension relay not available. Connect the extension or pass wsEndpoint/host/port.", "extension_not_connected");
|
|
@@ -653,7 +832,8 @@ function createConnectTool(deps) {
|
|
|
653
832
|
result = await deps.manager.connect({
|
|
654
833
|
wsEndpoint,
|
|
655
834
|
host: args.host,
|
|
656
|
-
port: args.port
|
|
835
|
+
port: args.port,
|
|
836
|
+
startUrl
|
|
657
837
|
});
|
|
658
838
|
}
|
|
659
839
|
return ok({
|
|
@@ -974,6 +1154,7 @@ function createGotoTool(deps) {
|
|
|
974
1154
|
args: {
|
|
975
1155
|
sessionId: z12.string().describe("Session id"),
|
|
976
1156
|
url: z12.string().describe("URL to navigate to"),
|
|
1157
|
+
targetId: z12.string().optional().describe("Optional target id"),
|
|
977
1158
|
waitUntil: waitUntilSchema.optional().describe("Load state to wait for"),
|
|
978
1159
|
timeoutMs: z12.number().int().optional().describe("Timeout in milliseconds")
|
|
979
1160
|
},
|
|
@@ -983,7 +1164,9 @@ function createGotoTool(deps) {
|
|
|
983
1164
|
args.sessionId,
|
|
984
1165
|
args.url,
|
|
985
1166
|
args.waitUntil ?? "load",
|
|
986
|
-
args.timeoutMs ?? 3e4
|
|
1167
|
+
args.timeoutMs ?? 3e4,
|
|
1168
|
+
void 0,
|
|
1169
|
+
args.targetId
|
|
987
1170
|
);
|
|
988
1171
|
return ok(result);
|
|
989
1172
|
} catch (error) {
|
|
@@ -1003,6 +1186,7 @@ function createWaitTool(deps) {
|
|
|
1003
1186
|
description: "Wait for a load state or a ref state.",
|
|
1004
1187
|
args: {
|
|
1005
1188
|
sessionId: z13.string().describe("Session id"),
|
|
1189
|
+
targetId: z13.string().optional().describe("Optional target id"),
|
|
1006
1190
|
until: waitUntilSchema2.optional().describe("Load state to wait for"),
|
|
1007
1191
|
ref: z13.string().optional().describe("Ref to wait for"),
|
|
1008
1192
|
state: waitStateSchema.optional().describe("Ref state to wait for"),
|
|
@@ -1015,7 +1199,8 @@ function createWaitTool(deps) {
|
|
|
1015
1199
|
args.sessionId,
|
|
1016
1200
|
args.ref,
|
|
1017
1201
|
args.state ?? "attached",
|
|
1018
|
-
args.timeoutMs ?? 3e4
|
|
1202
|
+
args.timeoutMs ?? 3e4,
|
|
1203
|
+
args.targetId
|
|
1019
1204
|
);
|
|
1020
1205
|
return ok(result2);
|
|
1021
1206
|
}
|
|
@@ -1025,7 +1210,8 @@ function createWaitTool(deps) {
|
|
|
1025
1210
|
const result = await deps.manager.waitForLoad(
|
|
1026
1211
|
args.sessionId,
|
|
1027
1212
|
args.until,
|
|
1028
|
-
args.timeoutMs ?? 3e4
|
|
1213
|
+
args.timeoutMs ?? 3e4,
|
|
1214
|
+
args.targetId
|
|
1029
1215
|
);
|
|
1030
1216
|
return ok(result);
|
|
1031
1217
|
} catch (error) {
|
|
@@ -1044,6 +1230,7 @@ function createSnapshotTool(deps) {
|
|
|
1044
1230
|
description: "Capture a snapshot of the current page and return refs.",
|
|
1045
1231
|
args: {
|
|
1046
1232
|
sessionId: z14.string().describe("Session id"),
|
|
1233
|
+
targetId: z14.string().optional().describe("Optional target id"),
|
|
1047
1234
|
format: formatSchema.optional().describe("Snapshot format"),
|
|
1048
1235
|
maxChars: z14.number().int().optional().describe("Max characters for snapshot output"),
|
|
1049
1236
|
cursor: z14.string().optional().describe("Cursor for paging")
|
|
@@ -1055,7 +1242,8 @@ function createSnapshotTool(deps) {
|
|
|
1055
1242
|
args.sessionId,
|
|
1056
1243
|
args.format ?? "outline",
|
|
1057
1244
|
args.maxChars ?? config.snapshot.maxChars,
|
|
1058
|
-
args.cursor
|
|
1245
|
+
args.cursor,
|
|
1246
|
+
args.targetId
|
|
1059
1247
|
);
|
|
1060
1248
|
return ok(result);
|
|
1061
1249
|
} catch (error) {
|
|
@@ -1073,11 +1261,12 @@ function createClickTool(deps) {
|
|
|
1073
1261
|
description: "Click a referenced element.",
|
|
1074
1262
|
args: {
|
|
1075
1263
|
sessionId: z15.string().describe("Session id"),
|
|
1264
|
+
targetId: z15.string().optional().describe("Optional target id"),
|
|
1076
1265
|
ref: z15.string().describe("Element ref")
|
|
1077
1266
|
},
|
|
1078
1267
|
async execute(args) {
|
|
1079
1268
|
try {
|
|
1080
|
-
const result = await deps.manager.click(args.sessionId, args.ref);
|
|
1269
|
+
const result = await deps.manager.click(args.sessionId, args.ref, args.targetId);
|
|
1081
1270
|
return ok(result);
|
|
1082
1271
|
} catch (error) {
|
|
1083
1272
|
return failure(serializeError(error).message, "click_failed");
|
|
@@ -1094,11 +1283,12 @@ function createHoverTool(deps) {
|
|
|
1094
1283
|
description: "Hover over an element by ref.",
|
|
1095
1284
|
args: {
|
|
1096
1285
|
sessionId: z16.string().describe("Active browser session id"),
|
|
1286
|
+
targetId: z16.string().optional().describe("Optional target id"),
|
|
1097
1287
|
ref: z16.string().describe("Element ref from snapshot")
|
|
1098
1288
|
},
|
|
1099
1289
|
async execute(args) {
|
|
1100
1290
|
try {
|
|
1101
|
-
const result = await deps.manager.hover(args.sessionId, args.ref);
|
|
1291
|
+
const result = await deps.manager.hover(args.sessionId, args.ref, args.targetId);
|
|
1102
1292
|
return ok(result);
|
|
1103
1293
|
} catch (error) {
|
|
1104
1294
|
return failure(serializeError(error).message, "hover_failed");
|
|
@@ -1115,12 +1305,13 @@ function createPressTool(deps) {
|
|
|
1115
1305
|
description: "Press a keyboard key, optionally focusing a ref first.",
|
|
1116
1306
|
args: {
|
|
1117
1307
|
sessionId: z17.string().describe("Active browser session id"),
|
|
1308
|
+
targetId: z17.string().optional().describe("Optional target id"),
|
|
1118
1309
|
key: z17.string().describe("Keyboard key to press, e.g. Enter or ArrowDown"),
|
|
1119
1310
|
ref: z17.string().optional().describe("Optional element ref to focus first")
|
|
1120
1311
|
},
|
|
1121
1312
|
async execute(args) {
|
|
1122
1313
|
try {
|
|
1123
|
-
const result = await deps.manager.press(args.sessionId, args.key, args.ref);
|
|
1314
|
+
const result = await deps.manager.press(args.sessionId, args.key, args.ref, args.targetId);
|
|
1124
1315
|
return ok(result);
|
|
1125
1316
|
} catch (error) {
|
|
1126
1317
|
return failure(serializeError(error).message, "press_failed");
|
|
@@ -1137,11 +1328,12 @@ function createCheckTool(deps) {
|
|
|
1137
1328
|
description: "Check a checkbox or toggle by ref.",
|
|
1138
1329
|
args: {
|
|
1139
1330
|
sessionId: z18.string().describe("Active browser session id"),
|
|
1331
|
+
targetId: z18.string().optional().describe("Optional target id"),
|
|
1140
1332
|
ref: z18.string().describe("Element ref from snapshot")
|
|
1141
1333
|
},
|
|
1142
1334
|
async execute(args) {
|
|
1143
1335
|
try {
|
|
1144
|
-
const result = await deps.manager.check(args.sessionId, args.ref);
|
|
1336
|
+
const result = await deps.manager.check(args.sessionId, args.ref, args.targetId);
|
|
1145
1337
|
return ok(result);
|
|
1146
1338
|
} catch (error) {
|
|
1147
1339
|
return failure(serializeError(error).message, "check_failed");
|
|
@@ -1158,11 +1350,12 @@ function createUncheckTool(deps) {
|
|
|
1158
1350
|
description: "Uncheck a checkbox or toggle by ref.",
|
|
1159
1351
|
args: {
|
|
1160
1352
|
sessionId: z19.string().describe("Active browser session id"),
|
|
1353
|
+
targetId: z19.string().optional().describe("Optional target id"),
|
|
1161
1354
|
ref: z19.string().describe("Element ref from snapshot")
|
|
1162
1355
|
},
|
|
1163
1356
|
async execute(args) {
|
|
1164
1357
|
try {
|
|
1165
|
-
const result = await deps.manager.uncheck(args.sessionId, args.ref);
|
|
1358
|
+
const result = await deps.manager.uncheck(args.sessionId, args.ref, args.targetId);
|
|
1166
1359
|
return ok(result);
|
|
1167
1360
|
} catch (error) {
|
|
1168
1361
|
return failure(serializeError(error).message, "uncheck_failed");
|
|
@@ -1179,6 +1372,7 @@ function createTypeTool(deps) {
|
|
|
1179
1372
|
description: "Type text into a referenced input.",
|
|
1180
1373
|
args: {
|
|
1181
1374
|
sessionId: z20.string().describe("Session id"),
|
|
1375
|
+
targetId: z20.string().optional().describe("Optional target id"),
|
|
1182
1376
|
ref: z20.string().describe("Element ref"),
|
|
1183
1377
|
text: z20.string().describe("Text to type"),
|
|
1184
1378
|
clear: z20.boolean().optional().describe("Clear before typing"),
|
|
@@ -1191,7 +1385,8 @@ function createTypeTool(deps) {
|
|
|
1191
1385
|
args.ref,
|
|
1192
1386
|
args.text,
|
|
1193
1387
|
Boolean(args.clear),
|
|
1194
|
-
Boolean(args.submit)
|
|
1388
|
+
Boolean(args.submit),
|
|
1389
|
+
args.targetId
|
|
1195
1390
|
);
|
|
1196
1391
|
return ok(result);
|
|
1197
1392
|
} catch (error) {
|
|
@@ -1209,12 +1404,13 @@ function createSelectTool(deps) {
|
|
|
1209
1404
|
description: "Select options in a referenced select element.",
|
|
1210
1405
|
args: {
|
|
1211
1406
|
sessionId: z21.string().describe("Session id"),
|
|
1407
|
+
targetId: z21.string().optional().describe("Optional target id"),
|
|
1212
1408
|
ref: z21.string().describe("Element ref"),
|
|
1213
1409
|
values: z21.array(z21.string()).describe("Values to select")
|
|
1214
1410
|
},
|
|
1215
1411
|
async execute(args) {
|
|
1216
1412
|
try {
|
|
1217
|
-
await deps.manager.select(args.sessionId, args.ref, args.values);
|
|
1413
|
+
await deps.manager.select(args.sessionId, args.ref, args.values, args.targetId);
|
|
1218
1414
|
return ok({});
|
|
1219
1415
|
} catch (error) {
|
|
1220
1416
|
return failure(serializeError(error).message, "select_failed");
|
|
@@ -1231,12 +1427,13 @@ function createScrollTool(deps) {
|
|
|
1231
1427
|
description: "Scroll the page or a referenced element.",
|
|
1232
1428
|
args: {
|
|
1233
1429
|
sessionId: z22.string().describe("Session id"),
|
|
1430
|
+
targetId: z22.string().optional().describe("Optional target id"),
|
|
1234
1431
|
dy: z22.number().describe("Scroll delta in pixels"),
|
|
1235
1432
|
ref: z22.string().optional().describe("Optional element ref to scroll")
|
|
1236
1433
|
},
|
|
1237
1434
|
async execute(args) {
|
|
1238
1435
|
try {
|
|
1239
|
-
await deps.manager.scroll(args.sessionId, args.dy, args.ref);
|
|
1436
|
+
await deps.manager.scroll(args.sessionId, args.dy, args.ref, args.targetId);
|
|
1240
1437
|
return ok({});
|
|
1241
1438
|
} catch (error) {
|
|
1242
1439
|
return failure(serializeError(error).message, "scroll_failed");
|
|
@@ -1253,11 +1450,12 @@ function createScrollIntoViewTool(deps) {
|
|
|
1253
1450
|
description: "Scroll an element into view by ref.",
|
|
1254
1451
|
args: {
|
|
1255
1452
|
sessionId: z23.string().describe("Active browser session id"),
|
|
1453
|
+
targetId: z23.string().optional().describe("Optional target id"),
|
|
1256
1454
|
ref: z23.string().describe("Element ref from snapshot")
|
|
1257
1455
|
},
|
|
1258
1456
|
async execute(args) {
|
|
1259
1457
|
try {
|
|
1260
|
-
const result = await deps.manager.scrollIntoView(args.sessionId, args.ref);
|
|
1458
|
+
const result = await deps.manager.scrollIntoView(args.sessionId, args.ref, args.targetId);
|
|
1261
1459
|
return ok(result);
|
|
1262
1460
|
} catch (error) {
|
|
1263
1461
|
return failure(serializeError(error).message, "scroll_into_view_failed");
|
|
@@ -1274,6 +1472,7 @@ function createDomGetHtmlTool(deps) {
|
|
|
1274
1472
|
description: "Get outerHTML for a referenced element.",
|
|
1275
1473
|
args: {
|
|
1276
1474
|
sessionId: z24.string().describe("Session id"),
|
|
1475
|
+
targetId: z24.string().optional().describe("Optional target id"),
|
|
1277
1476
|
ref: z24.string().describe("Element ref"),
|
|
1278
1477
|
maxChars: z24.number().int().optional().describe("Max characters")
|
|
1279
1478
|
},
|
|
@@ -1282,7 +1481,8 @@ function createDomGetHtmlTool(deps) {
|
|
|
1282
1481
|
const result = await deps.manager.domGetHtml(
|
|
1283
1482
|
args.sessionId,
|
|
1284
1483
|
args.ref,
|
|
1285
|
-
args.maxChars ?? 8e3
|
|
1484
|
+
args.maxChars ?? 8e3,
|
|
1485
|
+
args.targetId
|
|
1286
1486
|
);
|
|
1287
1487
|
return ok({
|
|
1288
1488
|
ref: args.ref,
|
|
@@ -1304,6 +1504,7 @@ function createDomGetTextTool(deps) {
|
|
|
1304
1504
|
description: "Get inner text for a referenced element.",
|
|
1305
1505
|
args: {
|
|
1306
1506
|
sessionId: z25.string().describe("Session id"),
|
|
1507
|
+
targetId: z25.string().optional().describe("Optional target id"),
|
|
1307
1508
|
ref: z25.string().describe("Element ref"),
|
|
1308
1509
|
maxChars: z25.number().int().optional().describe("Max characters")
|
|
1309
1510
|
},
|
|
@@ -1312,7 +1513,8 @@ function createDomGetTextTool(deps) {
|
|
|
1312
1513
|
const result = await deps.manager.domGetText(
|
|
1313
1514
|
args.sessionId,
|
|
1314
1515
|
args.ref,
|
|
1315
|
-
args.maxChars ?? 8e3
|
|
1516
|
+
args.maxChars ?? 8e3,
|
|
1517
|
+
args.targetId
|
|
1316
1518
|
);
|
|
1317
1519
|
return ok({
|
|
1318
1520
|
ref: args.ref,
|
|
@@ -1334,12 +1536,13 @@ function createGetAttrTool(deps) {
|
|
|
1334
1536
|
description: "Get a DOM attribute value by ref.",
|
|
1335
1537
|
args: {
|
|
1336
1538
|
sessionId: z26.string().describe("Active browser session id"),
|
|
1539
|
+
targetId: z26.string().optional().describe("Optional target id"),
|
|
1337
1540
|
ref: z26.string().describe("Element ref from snapshot"),
|
|
1338
1541
|
name: z26.string().describe("Attribute name, e.g. href or aria-label")
|
|
1339
1542
|
},
|
|
1340
1543
|
async execute(args) {
|
|
1341
1544
|
try {
|
|
1342
|
-
const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name);
|
|
1545
|
+
const result = await deps.manager.domGetAttr(args.sessionId, args.ref, args.name, args.targetId);
|
|
1343
1546
|
return ok(result);
|
|
1344
1547
|
} catch (error) {
|
|
1345
1548
|
return failure(serializeError(error).message, "get_attr_failed");
|
|
@@ -1356,11 +1559,12 @@ function createGetValueTool(deps) {
|
|
|
1356
1559
|
description: "Get the input value for an element by ref.",
|
|
1357
1560
|
args: {
|
|
1358
1561
|
sessionId: z27.string().describe("Active browser session id"),
|
|
1562
|
+
targetId: z27.string().optional().describe("Optional target id"),
|
|
1359
1563
|
ref: z27.string().describe("Element ref from snapshot")
|
|
1360
1564
|
},
|
|
1361
1565
|
async execute(args) {
|
|
1362
1566
|
try {
|
|
1363
|
-
const result = await deps.manager.domGetValue(args.sessionId, args.ref);
|
|
1567
|
+
const result = await deps.manager.domGetValue(args.sessionId, args.ref, args.targetId);
|
|
1364
1568
|
return ok(result);
|
|
1365
1569
|
} catch (error) {
|
|
1366
1570
|
return failure(serializeError(error).message, "get_value_failed");
|
|
@@ -1377,11 +1581,12 @@ function createIsVisibleTool(deps) {
|
|
|
1377
1581
|
description: "Check if an element is visible by ref.",
|
|
1378
1582
|
args: {
|
|
1379
1583
|
sessionId: z28.string().describe("Active browser session id"),
|
|
1584
|
+
targetId: z28.string().optional().describe("Optional target id"),
|
|
1380
1585
|
ref: z28.string().describe("Element ref from snapshot")
|
|
1381
1586
|
},
|
|
1382
1587
|
async execute(args) {
|
|
1383
1588
|
try {
|
|
1384
|
-
const result = await deps.manager.domIsVisible(args.sessionId, args.ref);
|
|
1589
|
+
const result = await deps.manager.domIsVisible(args.sessionId, args.ref, args.targetId);
|
|
1385
1590
|
return ok(result);
|
|
1386
1591
|
} catch (error) {
|
|
1387
1592
|
return failure(serializeError(error).message, "is_visible_failed");
|
|
@@ -1398,11 +1603,12 @@ function createIsEnabledTool(deps) {
|
|
|
1398
1603
|
description: "Check if an element is enabled by ref.",
|
|
1399
1604
|
args: {
|
|
1400
1605
|
sessionId: z29.string().describe("Active browser session id"),
|
|
1606
|
+
targetId: z29.string().optional().describe("Optional target id"),
|
|
1401
1607
|
ref: z29.string().describe("Element ref from snapshot")
|
|
1402
1608
|
},
|
|
1403
1609
|
async execute(args) {
|
|
1404
1610
|
try {
|
|
1405
|
-
const result = await deps.manager.domIsEnabled(args.sessionId, args.ref);
|
|
1611
|
+
const result = await deps.manager.domIsEnabled(args.sessionId, args.ref, args.targetId);
|
|
1406
1612
|
return ok(result);
|
|
1407
1613
|
} catch (error) {
|
|
1408
1614
|
return failure(serializeError(error).message, "is_enabled_failed");
|
|
@@ -1419,11 +1625,12 @@ function createIsCheckedTool(deps) {
|
|
|
1419
1625
|
description: "Check if an element is checked by ref.",
|
|
1420
1626
|
args: {
|
|
1421
1627
|
sessionId: z30.string().describe("Active browser session id"),
|
|
1628
|
+
targetId: z30.string().optional().describe("Optional target id"),
|
|
1422
1629
|
ref: z30.string().describe("Element ref from snapshot")
|
|
1423
1630
|
},
|
|
1424
1631
|
async execute(args) {
|
|
1425
1632
|
try {
|
|
1426
|
-
const result = await deps.manager.domIsChecked(args.sessionId, args.ref);
|
|
1633
|
+
const result = await deps.manager.domIsChecked(args.sessionId, args.ref, args.targetId);
|
|
1427
1634
|
return ok(result);
|
|
1428
1635
|
} catch (error) {
|
|
1429
1636
|
return failure(serializeError(error).message, "is_checked_failed");
|
|
@@ -1550,18 +1757,468 @@ function createNetworkPollTool(deps) {
|
|
|
1550
1757
|
});
|
|
1551
1758
|
}
|
|
1552
1759
|
|
|
1553
|
-
// src/tools/
|
|
1760
|
+
// src/tools/debug_trace_snapshot.ts
|
|
1554
1761
|
import { tool as tool35 } from "@opencode-ai/plugin";
|
|
1555
1762
|
var z35 = tool35.schema;
|
|
1556
|
-
function
|
|
1763
|
+
function createDebugTraceSnapshotTool(deps) {
|
|
1557
1764
|
return tool35({
|
|
1765
|
+
description: "Capture a combined debug trace snapshot (page + console + network + exceptions).",
|
|
1766
|
+
args: {
|
|
1767
|
+
sessionId: z35.string().describe("Session id"),
|
|
1768
|
+
sinceConsoleSeq: z35.number().int().optional().describe("Resume cursor for console events"),
|
|
1769
|
+
sinceNetworkSeq: z35.number().int().optional().describe("Resume cursor for network events"),
|
|
1770
|
+
sinceExceptionSeq: z35.number().int().optional().describe("Resume cursor for exception events"),
|
|
1771
|
+
max: z35.number().int().optional().describe("Max events per channel"),
|
|
1772
|
+
requestId: z35.string().optional().describe("Optional trace request id")
|
|
1773
|
+
},
|
|
1774
|
+
async execute(args) {
|
|
1775
|
+
try {
|
|
1776
|
+
const manager = deps.manager;
|
|
1777
|
+
const options = {
|
|
1778
|
+
sinceConsoleSeq: args.sinceConsoleSeq,
|
|
1779
|
+
sinceNetworkSeq: args.sinceNetworkSeq,
|
|
1780
|
+
sinceExceptionSeq: args.sinceExceptionSeq,
|
|
1781
|
+
max: args.max,
|
|
1782
|
+
requestId: args.requestId
|
|
1783
|
+
};
|
|
1784
|
+
if (typeof manager.debugTraceSnapshot === "function") {
|
|
1785
|
+
const result = await manager.debugTraceSnapshot(args.sessionId, options);
|
|
1786
|
+
return ok(result);
|
|
1787
|
+
}
|
|
1788
|
+
const max = args.max ?? 500;
|
|
1789
|
+
const requestId = args.requestId ?? createRequestId();
|
|
1790
|
+
const [page, consoleChannel, networkChannel] = await Promise.all([
|
|
1791
|
+
deps.manager.status(args.sessionId),
|
|
1792
|
+
deps.manager.consolePoll(args.sessionId, args.sinceConsoleSeq, max),
|
|
1793
|
+
deps.manager.networkPoll(args.sessionId, args.sinceNetworkSeq, max)
|
|
1794
|
+
]);
|
|
1795
|
+
const exceptionChannel = typeof manager.exceptionPoll === "function" ? await manager.exceptionPoll(args.sessionId, args.sinceExceptionSeq, max) : {
|
|
1796
|
+
events: [],
|
|
1797
|
+
nextSeq: args.sinceExceptionSeq ?? 0,
|
|
1798
|
+
truncated: false
|
|
1799
|
+
};
|
|
1800
|
+
const annotateTraceContext = (events) => events.map((event) => ({
|
|
1801
|
+
...event,
|
|
1802
|
+
requestId,
|
|
1803
|
+
sessionId: args.sessionId
|
|
1804
|
+
}));
|
|
1805
|
+
const blocker = classifyBlockerSignal({
|
|
1806
|
+
source: "network",
|
|
1807
|
+
url: typeof page.url === "string" ? page.url : void 0,
|
|
1808
|
+
finalUrl: typeof page.url === "string" ? page.url : void 0,
|
|
1809
|
+
title: typeof page.title === "string" ? page.title : void 0,
|
|
1810
|
+
status: findLatestStatus(networkChannel.events),
|
|
1811
|
+
traceRequestId: requestId,
|
|
1812
|
+
networkHosts: extractHosts(networkChannel.events),
|
|
1813
|
+
threshold: deps.config.get().blockerDetectionThreshold,
|
|
1814
|
+
promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true
|
|
1815
|
+
});
|
|
1816
|
+
const blockerArtifacts = blocker ? buildBlockerArtifacts({
|
|
1817
|
+
networkEvents: networkChannel.events,
|
|
1818
|
+
consoleEvents: consoleChannel.events,
|
|
1819
|
+
exceptionEvents: exceptionChannel.events,
|
|
1820
|
+
promptGuardEnabled: deps.config.get().security.promptInjectionGuard?.enabled ?? true,
|
|
1821
|
+
caps: deps.config.get().blockerArtifactCaps
|
|
1822
|
+
}) : void 0;
|
|
1823
|
+
return ok({
|
|
1824
|
+
requestId,
|
|
1825
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1826
|
+
page,
|
|
1827
|
+
channels: {
|
|
1828
|
+
console: {
|
|
1829
|
+
nextSeq: consoleChannel.nextSeq,
|
|
1830
|
+
truncated: consoleChannel.truncated,
|
|
1831
|
+
events: annotateTraceContext(consoleChannel.events)
|
|
1832
|
+
},
|
|
1833
|
+
network: {
|
|
1834
|
+
nextSeq: networkChannel.nextSeq,
|
|
1835
|
+
truncated: networkChannel.truncated,
|
|
1836
|
+
events: annotateTraceContext(networkChannel.events)
|
|
1837
|
+
},
|
|
1838
|
+
exception: {
|
|
1839
|
+
nextSeq: exceptionChannel.nextSeq,
|
|
1840
|
+
truncated: exceptionChannel.truncated,
|
|
1841
|
+
events: annotateTraceContext(exceptionChannel.events)
|
|
1842
|
+
}
|
|
1843
|
+
},
|
|
1844
|
+
meta: {
|
|
1845
|
+
blockerState: blocker ? "active" : "clear",
|
|
1846
|
+
...blocker ? { blocker } : {},
|
|
1847
|
+
...blockerArtifacts ? { blockerArtifacts } : {}
|
|
1848
|
+
}
|
|
1849
|
+
});
|
|
1850
|
+
} catch (error) {
|
|
1851
|
+
return failure(serializeError(error).message, "debug_trace_snapshot_failed");
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
});
|
|
1855
|
+
}
|
|
1856
|
+
function findLatestStatus(events) {
|
|
1857
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
1858
|
+
const status = events[index]?.status;
|
|
1859
|
+
if (typeof status === "number") {
|
|
1860
|
+
return status;
|
|
1861
|
+
}
|
|
1862
|
+
}
|
|
1863
|
+
return void 0;
|
|
1864
|
+
}
|
|
1865
|
+
function extractHosts(events) {
|
|
1866
|
+
const hosts = [];
|
|
1867
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1868
|
+
for (const event of events) {
|
|
1869
|
+
if (typeof event.url !== "string") continue;
|
|
1870
|
+
try {
|
|
1871
|
+
const host = new URL(event.url).hostname.toLowerCase();
|
|
1872
|
+
if (!host || seen.has(host)) continue;
|
|
1873
|
+
seen.add(host);
|
|
1874
|
+
hosts.push(host);
|
|
1875
|
+
} catch {
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
return hosts;
|
|
1879
|
+
}
|
|
1880
|
+
|
|
1881
|
+
// src/tools/cookie_import.ts
|
|
1882
|
+
import { tool as tool36 } from "@opencode-ai/plugin";
|
|
1883
|
+
var z36 = tool36.schema;
|
|
1884
|
+
function validateCookieRecord(cookie) {
|
|
1885
|
+
const name = cookie.name?.trim();
|
|
1886
|
+
if (!name) {
|
|
1887
|
+
return { valid: false, reason: "Cookie name is required.", cookie };
|
|
1888
|
+
}
|
|
1889
|
+
if (!/^[^\s;=]+$/.test(name)) {
|
|
1890
|
+
return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };
|
|
1891
|
+
}
|
|
1892
|
+
if (typeof cookie.value !== "string") {
|
|
1893
|
+
return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
|
|
1894
|
+
}
|
|
1895
|
+
const value = cookie.value;
|
|
1896
|
+
if (/\r|\n|;/.test(value)) {
|
|
1897
|
+
return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
|
|
1898
|
+
}
|
|
1899
|
+
const hasUrl = typeof cookie.url === "string" && cookie.url.trim().length > 0;
|
|
1900
|
+
const hasDomain = typeof cookie.domain === "string" && cookie.domain.trim().length > 0;
|
|
1901
|
+
if (!hasUrl && !hasDomain) {
|
|
1902
|
+
return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };
|
|
1903
|
+
}
|
|
1904
|
+
let normalizedUrl;
|
|
1905
|
+
if (hasUrl) {
|
|
1906
|
+
try {
|
|
1907
|
+
const parsedUrl = new URL(cookie.url);
|
|
1908
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
1909
|
+
return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };
|
|
1910
|
+
}
|
|
1911
|
+
normalizedUrl = parsedUrl.toString();
|
|
1912
|
+
} catch {
|
|
1913
|
+
return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
let normalizedDomain;
|
|
1917
|
+
if (hasDomain) {
|
|
1918
|
+
normalizedDomain = String(cookie.domain).trim().toLowerCase();
|
|
1919
|
+
if (!/^\.?[a-z0-9.-]+$/.test(normalizedDomain)) {
|
|
1920
|
+
return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
|
|
1921
|
+
}
|
|
1922
|
+
if (normalizedDomain.includes("..")) {
|
|
1923
|
+
return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
|
|
1924
|
+
}
|
|
1925
|
+
}
|
|
1926
|
+
const normalizedPath = typeof cookie.path === "string" ? cookie.path.trim() : void 0;
|
|
1927
|
+
if (typeof normalizedPath === "string" && !normalizedPath.startsWith("/")) {
|
|
1928
|
+
return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };
|
|
1929
|
+
}
|
|
1930
|
+
if (typeof cookie.expires !== "undefined") {
|
|
1931
|
+
if (!Number.isFinite(cookie.expires)) {
|
|
1932
|
+
return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
|
|
1933
|
+
}
|
|
1934
|
+
if (cookie.expires < -1) {
|
|
1935
|
+
return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1938
|
+
if (cookie.sameSite === "None" && cookie.secure !== true) {
|
|
1939
|
+
return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };
|
|
1940
|
+
}
|
|
1941
|
+
const normalizedCookie = {
|
|
1942
|
+
name,
|
|
1943
|
+
value,
|
|
1944
|
+
...typeof cookie.expires === "number" ? { expires: cookie.expires } : {},
|
|
1945
|
+
...typeof cookie.httpOnly === "boolean" ? { httpOnly: cookie.httpOnly } : {},
|
|
1946
|
+
...typeof cookie.secure === "boolean" ? { secure: cookie.secure } : {},
|
|
1947
|
+
...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
|
|
1948
|
+
};
|
|
1949
|
+
if (normalizedDomain) {
|
|
1950
|
+
normalizedCookie.domain = normalizedDomain;
|
|
1951
|
+
normalizedCookie.path = normalizedPath ?? "/";
|
|
1952
|
+
} else if (normalizedUrl) {
|
|
1953
|
+
normalizedCookie.url = normalizedUrl;
|
|
1954
|
+
}
|
|
1955
|
+
return {
|
|
1956
|
+
valid: true,
|
|
1957
|
+
reason: "",
|
|
1958
|
+
cookie: normalizedCookie
|
|
1959
|
+
};
|
|
1960
|
+
}
|
|
1961
|
+
function createCookieImportTool(deps) {
|
|
1962
|
+
return tool36({
|
|
1963
|
+
description: "Import validated cookies into the current session context.",
|
|
1964
|
+
args: {
|
|
1965
|
+
sessionId: z36.string().describe("Session id"),
|
|
1966
|
+
cookies: z36.array(z36.object({
|
|
1967
|
+
name: z36.string().min(1),
|
|
1968
|
+
value: z36.string(),
|
|
1969
|
+
url: z36.string().optional(),
|
|
1970
|
+
domain: z36.string().optional(),
|
|
1971
|
+
path: z36.string().optional(),
|
|
1972
|
+
expires: z36.number().optional(),
|
|
1973
|
+
httpOnly: z36.boolean().optional(),
|
|
1974
|
+
secure: z36.boolean().optional(),
|
|
1975
|
+
sameSite: z36.enum(["Strict", "Lax", "None"]).optional()
|
|
1976
|
+
})).min(1).describe("Cookies to import"),
|
|
1977
|
+
strict: z36.boolean().optional().describe("Reject on first invalid cookie (default true)"),
|
|
1978
|
+
requestId: z36.string().optional().describe("Optional trace request id")
|
|
1979
|
+
},
|
|
1980
|
+
async execute(args) {
|
|
1981
|
+
try {
|
|
1982
|
+
const strict = args.strict ?? true;
|
|
1983
|
+
const requestId = args.requestId ?? createRequestId();
|
|
1984
|
+
const manager = deps.manager;
|
|
1985
|
+
const normalized = [];
|
|
1986
|
+
const rejected = [];
|
|
1987
|
+
args.cookies.forEach((cookie, index) => {
|
|
1988
|
+
const validation = validateCookieRecord(cookie);
|
|
1989
|
+
if (!validation.valid) {
|
|
1990
|
+
rejected.push({ index, reason: validation.reason });
|
|
1991
|
+
return;
|
|
1992
|
+
}
|
|
1993
|
+
normalized.push(validation.cookie);
|
|
1994
|
+
});
|
|
1995
|
+
if (typeof manager.cookieImport === "function") {
|
|
1996
|
+
return ok(await manager.cookieImport(args.sessionId, normalized, strict, requestId));
|
|
1997
|
+
}
|
|
1998
|
+
if (strict && rejected.length > 0) {
|
|
1999
|
+
return failure(`Cookie import rejected ${rejected.length} entries.`, "cookie_import_failed");
|
|
2000
|
+
}
|
|
2001
|
+
if (normalized.length > 0) {
|
|
2002
|
+
await deps.manager.withPage(args.sessionId, null, async (page) => {
|
|
2003
|
+
await page.context().addCookies(normalized);
|
|
2004
|
+
return void 0;
|
|
2005
|
+
});
|
|
2006
|
+
}
|
|
2007
|
+
return ok({
|
|
2008
|
+
requestId,
|
|
2009
|
+
imported: normalized.length,
|
|
2010
|
+
rejected
|
|
2011
|
+
});
|
|
2012
|
+
} catch (error) {
|
|
2013
|
+
return failure(serializeError(error).message, "cookie_import_failed");
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
});
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
// src/tools/cookie_list.ts
|
|
2020
|
+
import { tool as tool37 } from "@opencode-ai/plugin";
|
|
2021
|
+
var z37 = tool37.schema;
|
|
2022
|
+
function normalizeCookieUrls(urls) {
|
|
2023
|
+
if (!urls || urls.length === 0) {
|
|
2024
|
+
return void 0;
|
|
2025
|
+
}
|
|
2026
|
+
const normalized = [];
|
|
2027
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2028
|
+
for (const value of urls) {
|
|
2029
|
+
const trimmed = value.trim();
|
|
2030
|
+
if (!trimmed) {
|
|
2031
|
+
throw new Error("Cookie list urls must be non-empty strings.");
|
|
2032
|
+
}
|
|
2033
|
+
let parsedUrl;
|
|
2034
|
+
try {
|
|
2035
|
+
parsedUrl = new URL(trimmed);
|
|
2036
|
+
} catch {
|
|
2037
|
+
throw new Error(`Cookie list url is invalid: ${trimmed}`);
|
|
2038
|
+
}
|
|
2039
|
+
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
|
|
2040
|
+
throw new Error(`Cookie list url must be http(s): ${trimmed}`);
|
|
2041
|
+
}
|
|
2042
|
+
const normalizedUrl = parsedUrl.toString();
|
|
2043
|
+
if (seen.has(normalizedUrl)) {
|
|
2044
|
+
continue;
|
|
2045
|
+
}
|
|
2046
|
+
seen.add(normalizedUrl);
|
|
2047
|
+
normalized.push(normalizedUrl);
|
|
2048
|
+
}
|
|
2049
|
+
return normalized;
|
|
2050
|
+
}
|
|
2051
|
+
function createCookieListTool(deps) {
|
|
2052
|
+
return tool37({
|
|
2053
|
+
description: "List cookies in the current session context with optional URL filtering.",
|
|
2054
|
+
args: {
|
|
2055
|
+
sessionId: z37.string().describe("Session id"),
|
|
2056
|
+
urls: z37.array(z37.string().min(1)).optional().describe("Optional URL filters for cookie scoping"),
|
|
2057
|
+
requestId: z37.string().optional().describe("Optional trace request id")
|
|
2058
|
+
},
|
|
2059
|
+
async execute(args) {
|
|
2060
|
+
try {
|
|
2061
|
+
const manager = deps.manager;
|
|
2062
|
+
const normalizedUrls = normalizeCookieUrls(args.urls);
|
|
2063
|
+
const requestId = args.requestId ?? createRequestId();
|
|
2064
|
+
if (typeof manager.cookieList === "function") {
|
|
2065
|
+
return ok(await manager.cookieList(args.sessionId, normalizedUrls, requestId));
|
|
2066
|
+
}
|
|
2067
|
+
const cookies = await deps.manager.withPage(
|
|
2068
|
+
args.sessionId,
|
|
2069
|
+
null,
|
|
2070
|
+
async (page) => {
|
|
2071
|
+
const listed = normalizedUrls ? await page.context().cookies(normalizedUrls) : await page.context().cookies();
|
|
2072
|
+
return listed.map((cookie) => ({
|
|
2073
|
+
name: cookie.name,
|
|
2074
|
+
value: cookie.value,
|
|
2075
|
+
domain: cookie.domain,
|
|
2076
|
+
path: cookie.path,
|
|
2077
|
+
expires: cookie.expires,
|
|
2078
|
+
httpOnly: cookie.httpOnly,
|
|
2079
|
+
secure: cookie.secure,
|
|
2080
|
+
...cookie.sameSite ? { sameSite: cookie.sameSite } : {}
|
|
2081
|
+
}));
|
|
2082
|
+
}
|
|
2083
|
+
);
|
|
2084
|
+
return ok({
|
|
2085
|
+
requestId,
|
|
2086
|
+
cookies,
|
|
2087
|
+
count: cookies.length
|
|
2088
|
+
});
|
|
2089
|
+
} catch (error) {
|
|
2090
|
+
return failure(serializeError(error).message, "cookie_list_failed");
|
|
2091
|
+
}
|
|
2092
|
+
}
|
|
2093
|
+
});
|
|
2094
|
+
}
|
|
2095
|
+
|
|
2096
|
+
// src/tools/macro_resolve.ts
|
|
2097
|
+
import { tool as tool38 } from "@opencode-ai/plugin";
|
|
2098
|
+
var z38 = tool38.schema;
|
|
2099
|
+
async function loadMacroRuntime() {
|
|
2100
|
+
try {
|
|
2101
|
+
const module = await import("./macros-ND2M7LWU.js");
|
|
2102
|
+
return module;
|
|
2103
|
+
} catch {
|
|
2104
|
+
return null;
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
async function resolveMacroProviderRuntime(deps) {
|
|
2108
|
+
if (deps.providerRuntime) {
|
|
2109
|
+
return deps.providerRuntime;
|
|
2110
|
+
}
|
|
2111
|
+
const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
|
|
2112
|
+
return createConfiguredProviderRuntime2({
|
|
2113
|
+
config: deps.config?.get?.(),
|
|
2114
|
+
manager: deps.manager,
|
|
2115
|
+
browserFallbackPort: deps.browserFallbackPort
|
|
2116
|
+
});
|
|
2117
|
+
}
|
|
2118
|
+
function parseFallbackMacro(expression, defaultProvider) {
|
|
2119
|
+
const raw = expression.trim();
|
|
2120
|
+
if (!raw.startsWith("@")) {
|
|
2121
|
+
throw new Error("Macro expressions must start with '@'");
|
|
2122
|
+
}
|
|
2123
|
+
const body = raw.slice(1).trim();
|
|
2124
|
+
if (!body) {
|
|
2125
|
+
throw new Error("Macro name is required");
|
|
2126
|
+
}
|
|
2127
|
+
const openParen = body.indexOf("(");
|
|
2128
|
+
const closeParen = body.endsWith(")") ? body.length - 1 : -1;
|
|
2129
|
+
const macroName = openParen >= 0 ? body.slice(0, openParen).trim() : body;
|
|
2130
|
+
const argsBody = openParen >= 0 && closeParen > openParen ? body.slice(openParen + 1, closeParen).trim() : "";
|
|
2131
|
+
const positional = argsBody ? argsBody.split(",").map((part) => part.trim().replace(/^['\"]|['\"]$/g, "")).filter(Boolean) : [];
|
|
2132
|
+
const query = positional[0] ?? macroName;
|
|
2133
|
+
const provider = defaultProvider ?? "web/default";
|
|
2134
|
+
return {
|
|
2135
|
+
action: {
|
|
2136
|
+
source: "web",
|
|
2137
|
+
operation: "search",
|
|
2138
|
+
input: {
|
|
2139
|
+
query,
|
|
2140
|
+
limit: 10,
|
|
2141
|
+
providerId: provider
|
|
2142
|
+
}
|
|
2143
|
+
},
|
|
2144
|
+
provenance: {
|
|
2145
|
+
macro: macroName,
|
|
2146
|
+
provider,
|
|
2147
|
+
resolvedQuery: query,
|
|
2148
|
+
pack: "fallback",
|
|
2149
|
+
args: {
|
|
2150
|
+
positional,
|
|
2151
|
+
named: {}
|
|
2152
|
+
}
|
|
2153
|
+
}
|
|
2154
|
+
};
|
|
2155
|
+
}
|
|
2156
|
+
function createMacroResolveTool(deps) {
|
|
2157
|
+
return tool38({
|
|
2158
|
+
description: "Resolve a macro expression to a provider action with provenance metadata.",
|
|
2159
|
+
args: {
|
|
2160
|
+
expression: z38.string().min(2).describe('Macro expression, e.g. @web.search("query")'),
|
|
2161
|
+
defaultProvider: z38.string().optional().describe("Default provider fallback"),
|
|
2162
|
+
includeCatalog: z38.boolean().optional().describe("Include available runtime macro names"),
|
|
2163
|
+
execute: z38.boolean().optional().describe("Execute the resolved provider action and include execution payload")
|
|
2164
|
+
},
|
|
2165
|
+
async execute(args) {
|
|
2166
|
+
try {
|
|
2167
|
+
const runtime = await loadMacroRuntime();
|
|
2168
|
+
const registry = runtime?.createDefaultMacroRegistry?.();
|
|
2169
|
+
let resolvedRuntime = "fallback";
|
|
2170
|
+
let resolution;
|
|
2171
|
+
let catalog;
|
|
2172
|
+
if (registry) {
|
|
2173
|
+
resolvedRuntime = "macros";
|
|
2174
|
+
resolution = await registry.resolve(args.expression, {
|
|
2175
|
+
defaultProvider: args.defaultProvider
|
|
2176
|
+
});
|
|
2177
|
+
catalog = args.includeCatalog ? registry.list().map((entry) => ({
|
|
2178
|
+
name: entry.name,
|
|
2179
|
+
pack: entry.pack,
|
|
2180
|
+
description: entry.description
|
|
2181
|
+
})) : void 0;
|
|
2182
|
+
} else {
|
|
2183
|
+
resolution = parseFallbackMacro(args.expression, args.defaultProvider);
|
|
2184
|
+
}
|
|
2185
|
+
if (!args.execute) {
|
|
2186
|
+
return ok({
|
|
2187
|
+
runtime: resolvedRuntime,
|
|
2188
|
+
resolution,
|
|
2189
|
+
...catalog ? { catalog } : {}
|
|
2190
|
+
});
|
|
2191
|
+
}
|
|
2192
|
+
const providerRuntime = await resolveMacroProviderRuntime(deps);
|
|
2193
|
+
const execution = shapeExecutionPayload(
|
|
2194
|
+
await executeMacroResolution(resolution, providerRuntime)
|
|
2195
|
+
);
|
|
2196
|
+
return ok({
|
|
2197
|
+
runtime: resolvedRuntime,
|
|
2198
|
+
resolution,
|
|
2199
|
+
...catalog ? { catalog } : {},
|
|
2200
|
+
execution
|
|
2201
|
+
});
|
|
2202
|
+
} catch (error) {
|
|
2203
|
+
return failure(serializeError(error).message, "macro_resolve_failed");
|
|
2204
|
+
}
|
|
2205
|
+
}
|
|
2206
|
+
});
|
|
2207
|
+
}
|
|
2208
|
+
|
|
2209
|
+
// src/tools/clone_page.ts
|
|
2210
|
+
import { tool as tool39 } from "@opencode-ai/plugin";
|
|
2211
|
+
var z39 = tool39.schema;
|
|
2212
|
+
function createClonePageTool(deps) {
|
|
2213
|
+
return tool39({
|
|
1558
2214
|
description: "Export the active page as a React component and CSS bundle.",
|
|
1559
2215
|
args: {
|
|
1560
|
-
sessionId:
|
|
2216
|
+
sessionId: z39.string().describe("Active browser session id"),
|
|
2217
|
+
targetId: z39.string().optional().describe("Optional target id")
|
|
1561
2218
|
},
|
|
1562
2219
|
async execute(args) {
|
|
1563
2220
|
try {
|
|
1564
|
-
const result = await deps.manager.clonePage(args.sessionId);
|
|
2221
|
+
const result = await deps.manager.clonePage(args.sessionId, args.targetId);
|
|
1565
2222
|
return ok({ component: result.component, css: result.css, warnings: result.warnings });
|
|
1566
2223
|
} catch (error) {
|
|
1567
2224
|
return failure(serializeError(error).message, "clone_page_failed");
|
|
@@ -1571,18 +2228,19 @@ function createClonePageTool(deps) {
|
|
|
1571
2228
|
}
|
|
1572
2229
|
|
|
1573
2230
|
// src/tools/clone_component.ts
|
|
1574
|
-
import { tool as
|
|
1575
|
-
var
|
|
2231
|
+
import { tool as tool40 } from "@opencode-ai/plugin";
|
|
2232
|
+
var z40 = tool40.schema;
|
|
1576
2233
|
function createCloneComponentTool(deps) {
|
|
1577
|
-
return
|
|
2234
|
+
return tool40({
|
|
1578
2235
|
description: "Export a selected element subtree as a React component and CSS bundle.",
|
|
1579
2236
|
args: {
|
|
1580
|
-
sessionId:
|
|
1581
|
-
|
|
2237
|
+
sessionId: z40.string().describe("Active browser session id"),
|
|
2238
|
+
targetId: z40.string().optional().describe("Optional target id"),
|
|
2239
|
+
ref: z40.string().describe("Element ref from snapshot")
|
|
1582
2240
|
},
|
|
1583
2241
|
async execute(args) {
|
|
1584
2242
|
try {
|
|
1585
|
-
const result = await deps.manager.cloneComponent(args.sessionId, args.ref);
|
|
2243
|
+
const result = await deps.manager.cloneComponent(args.sessionId, args.ref, args.targetId);
|
|
1586
2244
|
return ok({ component: result.component, css: result.css, warnings: result.warnings });
|
|
1587
2245
|
} catch (error) {
|
|
1588
2246
|
return failure(serializeError(error).message, "clone_component_failed");
|
|
@@ -1592,17 +2250,18 @@ function createCloneComponentTool(deps) {
|
|
|
1592
2250
|
}
|
|
1593
2251
|
|
|
1594
2252
|
// src/tools/perf.ts
|
|
1595
|
-
import { tool as
|
|
1596
|
-
var
|
|
2253
|
+
import { tool as tool41 } from "@opencode-ai/plugin";
|
|
2254
|
+
var z41 = tool41.schema;
|
|
1597
2255
|
function createPerfTool(deps) {
|
|
1598
|
-
return
|
|
2256
|
+
return tool41({
|
|
1599
2257
|
description: "Fetch lightweight performance metrics from the active page.",
|
|
1600
2258
|
args: {
|
|
1601
|
-
sessionId:
|
|
2259
|
+
sessionId: z41.string().describe("Active browser session id"),
|
|
2260
|
+
targetId: z41.string().optional().describe("Optional target id")
|
|
1602
2261
|
},
|
|
1603
2262
|
async execute(args) {
|
|
1604
2263
|
try {
|
|
1605
|
-
const result = await deps.manager.perfMetrics(args.sessionId);
|
|
2264
|
+
const result = await deps.manager.perfMetrics(args.sessionId, args.targetId);
|
|
1606
2265
|
return ok({ metrics: result.metrics });
|
|
1607
2266
|
} catch (error) {
|
|
1608
2267
|
return failure(serializeError(error).message, "perf_failed");
|
|
@@ -1612,18 +2271,19 @@ function createPerfTool(deps) {
|
|
|
1612
2271
|
}
|
|
1613
2272
|
|
|
1614
2273
|
// src/tools/screenshot.ts
|
|
1615
|
-
import { tool as
|
|
1616
|
-
var
|
|
2274
|
+
import { tool as tool42 } from "@opencode-ai/plugin";
|
|
2275
|
+
var z42 = tool42.schema;
|
|
1617
2276
|
function createScreenshotTool(deps) {
|
|
1618
|
-
return
|
|
2277
|
+
return tool42({
|
|
1619
2278
|
description: "Capture a screenshot of the active page.",
|
|
1620
2279
|
args: {
|
|
1621
|
-
sessionId:
|
|
1622
|
-
|
|
2280
|
+
sessionId: z42.string().describe("Active browser session id"),
|
|
2281
|
+
targetId: z42.string().optional().describe("Optional target id"),
|
|
2282
|
+
path: z42.string().optional().describe("Optional output file path")
|
|
1623
2283
|
},
|
|
1624
2284
|
async execute(args) {
|
|
1625
2285
|
try {
|
|
1626
|
-
const result = await deps.manager.screenshot(args.sessionId, args.path);
|
|
2286
|
+
const result = await deps.manager.screenshot(args.sessionId, args.path, args.targetId);
|
|
1627
2287
|
return ok(result);
|
|
1628
2288
|
} catch (error) {
|
|
1629
2289
|
return failure(serializeError(error).message, "screenshot_failed");
|
|
@@ -1633,27 +2293,29 @@ function createScreenshotTool(deps) {
|
|
|
1633
2293
|
}
|
|
1634
2294
|
|
|
1635
2295
|
// src/tools/annotate.ts
|
|
1636
|
-
import { tool as
|
|
1637
|
-
var
|
|
1638
|
-
var screenshotModeSchema =
|
|
1639
|
-
var transportSchema =
|
|
2296
|
+
import { tool as tool43 } from "@opencode-ai/plugin";
|
|
2297
|
+
var z43 = tool43.schema;
|
|
2298
|
+
var screenshotModeSchema = z43.enum(["visible", "full", "none"]);
|
|
2299
|
+
var transportSchema = z43.enum(["auto", "direct", "relay"]);
|
|
1640
2300
|
function createAnnotateTool(deps) {
|
|
1641
|
-
return
|
|
2301
|
+
return tool43({
|
|
1642
2302
|
description: "Request interactive annotations via direct (CDP) or relay transport.",
|
|
1643
2303
|
args: {
|
|
1644
|
-
sessionId:
|
|
2304
|
+
sessionId: z43.string().describe("Session id"),
|
|
2305
|
+
stored: z43.boolean().optional().describe("Fetch the latest payload explicitly sent from popup/canvas surfaces"),
|
|
2306
|
+
includeScreenshots: z43.boolean().optional().describe("When fetching stored payloads, prefer screenshots if still available in memory"),
|
|
1645
2307
|
transport: transportSchema.optional().describe("auto | direct | relay (default: auto)"),
|
|
1646
|
-
targetId:
|
|
1647
|
-
tabId:
|
|
1648
|
-
url:
|
|
2308
|
+
targetId: z43.string().optional().describe("Optional target id for direct mode"),
|
|
2309
|
+
tabId: z43.number().int().optional().describe("Optional Chrome tab id for relay mode"),
|
|
2310
|
+
url: z43.string().optional().describe("Optional URL to open before annotating"),
|
|
1649
2311
|
screenshotMode: screenshotModeSchema.optional().describe("visible | full | none (default: visible)"),
|
|
1650
|
-
debug:
|
|
1651
|
-
context:
|
|
1652
|
-
timeoutMs:
|
|
2312
|
+
debug: z43.boolean().optional().describe("Include debug metadata"),
|
|
2313
|
+
context: z43.string().optional().describe("Optional context for the annotator"),
|
|
2314
|
+
timeoutMs: z43.number().int().optional().describe("Timeout in milliseconds")
|
|
1653
2315
|
},
|
|
1654
2316
|
async execute(args) {
|
|
1655
2317
|
try {
|
|
1656
|
-
const transport = args.transport ?? "auto";
|
|
2318
|
+
const transport = args.stored ? "relay" : args.transport ?? "auto";
|
|
1657
2319
|
if (transport === "relay") {
|
|
1658
2320
|
const status = await deps.manager.status(args.sessionId);
|
|
1659
2321
|
if (status.mode !== "extension") {
|
|
@@ -1663,6 +2325,8 @@ function createAnnotateTool(deps) {
|
|
|
1663
2325
|
const response = await deps.annotationManager.requestAnnotation({
|
|
1664
2326
|
sessionId: args.sessionId,
|
|
1665
2327
|
transport,
|
|
2328
|
+
stored: args.stored ?? false,
|
|
2329
|
+
includeScreenshots: args.includeScreenshots ?? true,
|
|
1666
2330
|
targetId: args.targetId,
|
|
1667
2331
|
tabId: args.tabId,
|
|
1668
2332
|
url: args.url,
|
|
@@ -1671,6 +2335,12 @@ function createAnnotateTool(deps) {
|
|
|
1671
2335
|
context: args.context,
|
|
1672
2336
|
timeoutMs: args.timeoutMs
|
|
1673
2337
|
});
|
|
2338
|
+
if (response.status === "cancelled") {
|
|
2339
|
+
return ok({
|
|
2340
|
+
cancelled: true,
|
|
2341
|
+
message: response.error?.message ?? "Annotation cancelled."
|
|
2342
|
+
});
|
|
2343
|
+
}
|
|
1674
2344
|
if (response.status !== "ok" || !response.payload) {
|
|
1675
2345
|
const message2 = response.error?.message ?? "Annotation failed.";
|
|
1676
2346
|
const code = response.error?.code ?? "annotate_failed";
|
|
@@ -1689,10 +2359,221 @@ function createAnnotateTool(deps) {
|
|
|
1689
2359
|
});
|
|
1690
2360
|
}
|
|
1691
2361
|
|
|
2362
|
+
// src/tools/research_run.ts
|
|
2363
|
+
import { tool as tool44 } from "@opencode-ai/plugin";
|
|
2364
|
+
|
|
2365
|
+
// src/tools/workflow-runtime.ts
|
|
2366
|
+
var resolveProviderRuntime = async (deps) => {
|
|
2367
|
+
if (deps.providerRuntime) {
|
|
2368
|
+
return deps.providerRuntime;
|
|
2369
|
+
}
|
|
2370
|
+
const { createConfiguredProviderRuntime: createConfiguredProviderRuntime2 } = await import("./runtime-factory-BICHDPE7.js");
|
|
2371
|
+
return createConfiguredProviderRuntime2({
|
|
2372
|
+
config: deps.config?.get?.(),
|
|
2373
|
+
manager: deps.manager,
|
|
2374
|
+
browserFallbackPort: deps.browserFallbackPort
|
|
2375
|
+
});
|
|
2376
|
+
};
|
|
2377
|
+
|
|
2378
|
+
// src/tools/research_run.ts
|
|
2379
|
+
var z44 = tool44.schema;
|
|
2380
|
+
var sourceSelectionSchema = z44.enum(["auto", "web", "community", "social", "shopping", "all"]);
|
|
2381
|
+
var sourceSchema = z44.enum(["web", "community", "social", "shopping"]);
|
|
2382
|
+
var modeSchema = z44.enum(["compact", "json", "md", "context", "path"]);
|
|
2383
|
+
var cookiePolicySchema = z44.enum(["off", "auto", "required"]);
|
|
2384
|
+
function createResearchRunTool(deps) {
|
|
2385
|
+
return tool44({
|
|
2386
|
+
description: "Run cross-source research with strict timebox and artifact outputs.",
|
|
2387
|
+
args: {
|
|
2388
|
+
topic: z44.string().min(1).describe("Research topic"),
|
|
2389
|
+
days: z44.number().int().positive().optional().describe("Timebox in days"),
|
|
2390
|
+
from: z44.string().optional().describe("ISO start date"),
|
|
2391
|
+
to: z44.string().optional().describe("ISO end date"),
|
|
2392
|
+
sourceSelection: sourceSelectionSchema.optional().describe("auto|web|community|social|shopping|all"),
|
|
2393
|
+
sources: z44.array(sourceSchema).optional().describe("Explicit source list"),
|
|
2394
|
+
mode: modeSchema.optional().describe("compact|json|md|context|path"),
|
|
2395
|
+
includeEngagement: z44.boolean().optional().describe("Include engagement enrichment"),
|
|
2396
|
+
limitPerSource: z44.number().int().positive().optional().describe("Result limit per source"),
|
|
2397
|
+
outputDir: z44.string().optional().describe("Optional artifact output directory"),
|
|
2398
|
+
ttlHours: z44.number().int().positive().optional().describe("Artifact retention TTL in hours"),
|
|
2399
|
+
useCookies: z44.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
|
|
2400
|
+
cookiePolicyOverride: cookiePolicySchema.optional().describe("Override cookie policy: off|auto|required")
|
|
2401
|
+
},
|
|
2402
|
+
async execute(args) {
|
|
2403
|
+
try {
|
|
2404
|
+
const runtime = await resolveProviderRuntime(deps);
|
|
2405
|
+
const { runResearchWorkflow } = await import("./providers-G3LRHQXX.js");
|
|
2406
|
+
const result = await runResearchWorkflow(runtime, {
|
|
2407
|
+
topic: args.topic,
|
|
2408
|
+
days: args.days,
|
|
2409
|
+
from: args.from,
|
|
2410
|
+
to: args.to,
|
|
2411
|
+
sourceSelection: args.sourceSelection,
|
|
2412
|
+
sources: args.sources,
|
|
2413
|
+
mode: args.mode ?? "compact",
|
|
2414
|
+
includeEngagement: args.includeEngagement,
|
|
2415
|
+
limitPerSource: args.limitPerSource,
|
|
2416
|
+
outputDir: args.outputDir,
|
|
2417
|
+
ttlHours: args.ttlHours,
|
|
2418
|
+
useCookies: args.useCookies,
|
|
2419
|
+
cookiePolicyOverride: args.cookiePolicyOverride
|
|
2420
|
+
});
|
|
2421
|
+
return ok(result);
|
|
2422
|
+
} catch (error) {
|
|
2423
|
+
return failure(serializeError(error).message, "research_run_failed");
|
|
2424
|
+
}
|
|
2425
|
+
}
|
|
2426
|
+
});
|
|
2427
|
+
}
|
|
2428
|
+
|
|
2429
|
+
// src/tools/shopping_run.ts
|
|
2430
|
+
import { tool as tool45 } from "@opencode-ai/plugin";
|
|
2431
|
+
var z45 = tool45.schema;
|
|
2432
|
+
var sortSchema = z45.enum(["best_deal", "lowest_price", "highest_rating", "fastest_shipping"]);
|
|
2433
|
+
var modeSchema2 = z45.enum(["compact", "json", "md", "context", "path"]);
|
|
2434
|
+
var cookiePolicySchema2 = z45.enum(["off", "auto", "required"]);
|
|
2435
|
+
function createShoppingRunTool(deps) {
|
|
2436
|
+
return tool45({
|
|
2437
|
+
description: "Run shopping/deal intelligence across shopping providers.",
|
|
2438
|
+
args: {
|
|
2439
|
+
query: z45.string().min(1).describe("Shopping query"),
|
|
2440
|
+
providers: z45.array(z45.string()).optional().describe("Optional provider allow-list"),
|
|
2441
|
+
budget: z45.number().positive().optional().describe("Optional budget amount"),
|
|
2442
|
+
region: z45.string().optional().describe("Region hint"),
|
|
2443
|
+
sort: sortSchema.optional().describe("best_deal|lowest_price|highest_rating|fastest_shipping"),
|
|
2444
|
+
mode: modeSchema2.optional().describe("compact|json|md|context|path"),
|
|
2445
|
+
outputDir: z45.string().optional().describe("Optional artifact output directory"),
|
|
2446
|
+
ttlHours: z45.number().int().positive().optional().describe("Artifact retention TTL in hours"),
|
|
2447
|
+
useCookies: z45.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
|
|
2448
|
+
cookiePolicyOverride: cookiePolicySchema2.optional().describe("Override cookie policy: off|auto|required")
|
|
2449
|
+
},
|
|
2450
|
+
async execute(args) {
|
|
2451
|
+
try {
|
|
2452
|
+
const runtime = await resolveProviderRuntime(deps);
|
|
2453
|
+
const { runShoppingWorkflow } = await import("./providers-G3LRHQXX.js");
|
|
2454
|
+
const result = await runShoppingWorkflow(runtime, {
|
|
2455
|
+
query: args.query,
|
|
2456
|
+
providers: args.providers,
|
|
2457
|
+
budget: args.budget,
|
|
2458
|
+
region: args.region,
|
|
2459
|
+
sort: args.sort,
|
|
2460
|
+
mode: args.mode ?? "compact",
|
|
2461
|
+
outputDir: args.outputDir,
|
|
2462
|
+
ttlHours: args.ttlHours,
|
|
2463
|
+
useCookies: args.useCookies,
|
|
2464
|
+
cookiePolicyOverride: args.cookiePolicyOverride
|
|
2465
|
+
});
|
|
2466
|
+
return ok(result);
|
|
2467
|
+
} catch (error) {
|
|
2468
|
+
return failure(serializeError(error).message, "shopping_run_failed");
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
});
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
// src/tools/product_video_run.ts
|
|
2475
|
+
import { tool as tool46 } from "@opencode-ai/plugin";
|
|
2476
|
+
var z46 = tool46.schema;
|
|
2477
|
+
var cookiePolicySchema3 = z46.enum(["off", "auto", "required"]);
|
|
2478
|
+
async function captureScreenshotBuffer(deps, url) {
|
|
2479
|
+
let sessionId = null;
|
|
2480
|
+
try {
|
|
2481
|
+
const launched = await deps.manager.launch({
|
|
2482
|
+
headless: true,
|
|
2483
|
+
startUrl: url
|
|
2484
|
+
});
|
|
2485
|
+
sessionId = launched.sessionId;
|
|
2486
|
+
const screenshot = await deps.manager.screenshot(sessionId);
|
|
2487
|
+
if (typeof screenshot.base64 === "string" && screenshot.base64.length > 0) {
|
|
2488
|
+
return Buffer.from(screenshot.base64, "base64");
|
|
2489
|
+
}
|
|
2490
|
+
return null;
|
|
2491
|
+
} catch {
|
|
2492
|
+
return null;
|
|
2493
|
+
} finally {
|
|
2494
|
+
if (sessionId) {
|
|
2495
|
+
await deps.manager.disconnect(sessionId, true).catch(() => {
|
|
2496
|
+
});
|
|
2497
|
+
}
|
|
2498
|
+
}
|
|
2499
|
+
}
|
|
2500
|
+
function createProductVideoRunTool(deps) {
|
|
2501
|
+
return tool46({
|
|
2502
|
+
description: "Collect a product presentation asset pack for video/UGC workflows.",
|
|
2503
|
+
args: {
|
|
2504
|
+
product_url: z46.string().optional().describe("Product URL"),
|
|
2505
|
+
product_name: z46.string().optional().describe("Product name"),
|
|
2506
|
+
provider_hint: z46.string().optional().describe("Optional provider hint"),
|
|
2507
|
+
include_screenshots: z46.boolean().optional().describe("Include screenshots (default true)"),
|
|
2508
|
+
include_all_images: z46.boolean().optional().describe("Include all discovered images (default true)"),
|
|
2509
|
+
include_copy: z46.boolean().optional().describe("Include product copy extraction (default true)"),
|
|
2510
|
+
output_dir: z46.string().optional().describe("Optional output directory"),
|
|
2511
|
+
ttl_hours: z46.number().int().positive().optional().describe("Artifact retention TTL in hours"),
|
|
2512
|
+
useCookies: z46.boolean().optional().describe("Enable/disable provider cookie injection for this run"),
|
|
2513
|
+
cookiePolicyOverride: cookiePolicySchema3.optional().describe("Override cookie policy: off|auto|required")
|
|
2514
|
+
},
|
|
2515
|
+
async execute(args) {
|
|
2516
|
+
try {
|
|
2517
|
+
const runtime = await resolveProviderRuntime(deps);
|
|
2518
|
+
const { runProductVideoWorkflow } = await import("./providers-G3LRHQXX.js");
|
|
2519
|
+
const includeScreenshots = args.include_screenshots ?? true;
|
|
2520
|
+
const result = await runProductVideoWorkflow(runtime, {
|
|
2521
|
+
product_url: args.product_url,
|
|
2522
|
+
product_name: args.product_name,
|
|
2523
|
+
provider_hint: args.provider_hint,
|
|
2524
|
+
include_screenshots: includeScreenshots,
|
|
2525
|
+
include_all_images: args.include_all_images,
|
|
2526
|
+
include_copy: args.include_copy,
|
|
2527
|
+
output_dir: args.output_dir,
|
|
2528
|
+
ttl_hours: args.ttl_hours,
|
|
2529
|
+
useCookies: args.useCookies,
|
|
2530
|
+
cookiePolicyOverride: args.cookiePolicyOverride
|
|
2531
|
+
}, {
|
|
2532
|
+
captureScreenshot: includeScreenshots ? async (url) => captureScreenshotBuffer(deps, url) : void 0
|
|
2533
|
+
});
|
|
2534
|
+
return ok(result);
|
|
2535
|
+
} catch (error) {
|
|
2536
|
+
return failure(serializeError(error).message, "product_video_run_failed");
|
|
2537
|
+
}
|
|
2538
|
+
}
|
|
2539
|
+
});
|
|
2540
|
+
}
|
|
2541
|
+
|
|
2542
|
+
// src/tools/canvas.ts
|
|
2543
|
+
import { tool as tool47 } from "@opencode-ai/plugin";
|
|
2544
|
+
var z47 = tool47.schema;
|
|
2545
|
+
function createCanvasTool(deps) {
|
|
2546
|
+
return tool47({
|
|
2547
|
+
description: "Execute a typed design-canvas command such as canvas.session.open or canvas.document.patch.",
|
|
2548
|
+
args: {
|
|
2549
|
+
command: z47.string().min(1).describe("Canvas command name"),
|
|
2550
|
+
params: z47.record(z47.string(), z47.unknown()).optional().describe("Canvas command payload")
|
|
2551
|
+
},
|
|
2552
|
+
async execute(args) {
|
|
2553
|
+
if (!deps.canvasManager) {
|
|
2554
|
+
return failure("Canvas manager unavailable.", "canvas_unavailable");
|
|
2555
|
+
}
|
|
2556
|
+
try {
|
|
2557
|
+
if (!args.command.startsWith("canvas.")) {
|
|
2558
|
+
return failure("Canvas commands must start with 'canvas.'.", "canvas_invalid_command");
|
|
2559
|
+
}
|
|
2560
|
+
const result = await deps.canvasManager.execute(args.command, args.params ?? {});
|
|
2561
|
+
if (result && typeof result === "object" && !Array.isArray(result)) {
|
|
2562
|
+
return ok(result);
|
|
2563
|
+
}
|
|
2564
|
+
return ok({ result });
|
|
2565
|
+
} catch (error) {
|
|
2566
|
+
const serialized = serializeError(error);
|
|
2567
|
+
return failure(serialized.message, serialized.code ?? "canvas_failed", serialized.details);
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
});
|
|
2571
|
+
}
|
|
2572
|
+
|
|
1692
2573
|
// src/tools/skill_list.ts
|
|
1693
|
-
import { tool as
|
|
2574
|
+
import { tool as tool48 } from "@opencode-ai/plugin";
|
|
1694
2575
|
function createSkillListTool(deps) {
|
|
1695
|
-
return
|
|
2576
|
+
return tool48({
|
|
1696
2577
|
description: "List available skills from OpenCode skill directories (compatibility wrapper)",
|
|
1697
2578
|
args: {},
|
|
1698
2579
|
async execute() {
|
|
@@ -1708,14 +2589,14 @@ function createSkillListTool(deps) {
|
|
|
1708
2589
|
}
|
|
1709
2590
|
|
|
1710
2591
|
// src/tools/skill_load.ts
|
|
1711
|
-
import { tool as
|
|
1712
|
-
var
|
|
2592
|
+
import { tool as tool49 } from "@opencode-ai/plugin";
|
|
2593
|
+
var z48 = tool49.schema;
|
|
1713
2594
|
function createSkillLoadTool(deps) {
|
|
1714
|
-
return
|
|
2595
|
+
return tool49({
|
|
1715
2596
|
description: "Load a specific skill by name from OpenCode skill directories (compatibility wrapper)",
|
|
1716
2597
|
args: {
|
|
1717
|
-
name:
|
|
1718
|
-
topic:
|
|
2598
|
+
name: z48.string().describe("Name of the skill to load (e.g., 'opendevbrowser-login-automation', 'opendevbrowser-form-testing')"),
|
|
2599
|
+
topic: z48.string().optional().describe("Optional topic to filter the skill content")
|
|
1719
2600
|
},
|
|
1720
2601
|
async execute(args) {
|
|
1721
2602
|
try {
|
|
@@ -1779,6 +2660,14 @@ function createTools(deps) {
|
|
|
1779
2660
|
opendevbrowser_prompting_guide: wrap(createPromptingGuideTool(deps)),
|
|
1780
2661
|
opendevbrowser_console_poll: wrap(createConsolePollTool(deps)),
|
|
1781
2662
|
opendevbrowser_network_poll: wrap(createNetworkPollTool(deps)),
|
|
2663
|
+
opendevbrowser_debug_trace_snapshot: wrap(createDebugTraceSnapshotTool(deps)),
|
|
2664
|
+
opendevbrowser_cookie_import: wrap(createCookieImportTool(deps)),
|
|
2665
|
+
opendevbrowser_cookie_list: wrap(createCookieListTool(deps)),
|
|
2666
|
+
opendevbrowser_macro_resolve: wrap(createMacroResolveTool(deps)),
|
|
2667
|
+
opendevbrowser_research_run: wrap(createResearchRunTool(deps)),
|
|
2668
|
+
opendevbrowser_shopping_run: wrap(createShoppingRunTool(deps)),
|
|
2669
|
+
opendevbrowser_product_video_run: wrap(createProductVideoRunTool(deps)),
|
|
2670
|
+
opendevbrowser_canvas: wrap(createCanvasTool(deps)),
|
|
1782
2671
|
opendevbrowser_clone_page: wrap(createClonePageTool(deps)),
|
|
1783
2672
|
opendevbrowser_clone_component: wrap(createCloneComponentTool(deps)),
|
|
1784
2673
|
opendevbrowser_perf: wrap(createPerfTool(deps)),
|
|
@@ -1795,8 +2684,11 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
|
|
|
1795
2684
|
const { config, configStore, skills, ensureRelay, cleanup, getExtensionPath } = core;
|
|
1796
2685
|
let relay = core.relay;
|
|
1797
2686
|
let manager = core.manager;
|
|
2687
|
+
let canvasManager = core.canvasManager;
|
|
1798
2688
|
let runner = core.runner;
|
|
1799
2689
|
let annotationManager = core.annotationManager;
|
|
2690
|
+
let providerRuntime = core.providerRuntime;
|
|
2691
|
+
let browserFallbackPort = core.browserFallbackPort;
|
|
1800
2692
|
let hubStop = null;
|
|
1801
2693
|
let daemonClient = null;
|
|
1802
2694
|
const skillNudgeState = createSkillNudgeState();
|
|
@@ -1811,10 +2703,13 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
|
|
|
1811
2703
|
}
|
|
1812
2704
|
const toolDeps = {
|
|
1813
2705
|
manager,
|
|
2706
|
+
canvasManager,
|
|
1814
2707
|
annotationManager,
|
|
1815
2708
|
runner,
|
|
1816
2709
|
config: configStore,
|
|
1817
2710
|
skills,
|
|
2711
|
+
providerRuntime,
|
|
2712
|
+
browserFallbackPort,
|
|
1818
2713
|
relay,
|
|
1819
2714
|
getExtensionPath
|
|
1820
2715
|
};
|
|
@@ -1823,13 +2718,23 @@ var OpenDevBrowserPlugin = async ({ directory, worktree }) => {
|
|
|
1823
2718
|
daemonClient = new DaemonClient({ autoRenew: true });
|
|
1824
2719
|
}
|
|
1825
2720
|
manager = new RemoteManager(daemonClient);
|
|
2721
|
+
canvasManager = new RemoteCanvasManager(daemonClient);
|
|
1826
2722
|
relay = new RemoteRelay(daemonClient);
|
|
1827
2723
|
annotationManager.setRelay(relay);
|
|
1828
2724
|
annotationManager.setBrowserManager(manager);
|
|
1829
2725
|
runner = new ScriptRunner(manager);
|
|
2726
|
+
browserFallbackPort = createBrowserFallbackPort(manager);
|
|
2727
|
+
providerRuntime = createConfiguredProviderRuntime({
|
|
2728
|
+
config: configStore.get(),
|
|
2729
|
+
manager,
|
|
2730
|
+
browserFallbackPort
|
|
2731
|
+
});
|
|
1830
2732
|
toolDeps.manager = manager;
|
|
2733
|
+
toolDeps.canvasManager = canvasManager;
|
|
1831
2734
|
toolDeps.relay = relay;
|
|
1832
2735
|
toolDeps.runner = runner;
|
|
2736
|
+
toolDeps.providerRuntime = providerRuntime;
|
|
2737
|
+
toolDeps.browserFallbackPort = browserFallbackPort;
|
|
1833
2738
|
};
|
|
1834
2739
|
const ensureHub = async () => {
|
|
1835
2740
|
const currentConfig = configStore.get();
|