opendevbrowser 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/accessibility-snapshot-PA6NWNS7.js +39 -0
- package/dist/accessibility-snapshot-PA6NWNS7.js.map +1 -0
- package/dist/active-window-YNYTIPZN.js +37 -0
- package/dist/active-window-YNYTIPZN.js.map +1 -0
- package/dist/annotate-STYHXZYJ.js +205 -0
- package/dist/annotate-STYHXZYJ.js.map +1 -0
- package/dist/artifacts-KJ6RNDO2.js +120 -0
- package/dist/artifacts-KJ6RNDO2.js.map +1 -0
- package/dist/attr-GHFZZ4SA.js +84 -0
- package/dist/attr-GHFZZ4SA.js.map +1 -0
- package/dist/browser/canvas-manager.d.ts.map +1 -1
- package/dist/browser/ops-client.d.ts +1 -0
- package/dist/browser/ops-client.d.ts.map +1 -1
- package/dist/canvas/document-store.d.ts.map +1 -1
- package/dist/canvas/guidance.d.ts +22 -0
- package/dist/canvas/guidance.d.ts.map +1 -0
- package/dist/canvas-54FBOEGP.js +309 -0
- package/dist/canvas-54FBOEGP.js.map +1 -0
- package/dist/capture-desktop-SNABC24E.js +38 -0
- package/dist/capture-desktop-SNABC24E.js.map +1 -0
- package/dist/capture-window-UJSB5AMP.js +40 -0
- package/dist/capture-window-UJSB5AMP.js.map +1 -0
- package/dist/check-ST5UQ2F5.js +71 -0
- package/dist/check-ST5UQ2F5.js.map +1 -0
- package/dist/checked-IEMWI5CU.js +71 -0
- package/dist/checked-IEMWI5CU.js.map +1 -0
- package/dist/chunk-2CG4SW3E.js +64 -0
- package/dist/chunk-2CG4SW3E.js.map +1 -0
- package/dist/chunk-2SIMIPLY.js +67 -0
- package/dist/chunk-2SIMIPLY.js.map +1 -0
- package/dist/chunk-37VSRUW4.js +141 -0
- package/dist/chunk-37VSRUW4.js.map +1 -0
- package/dist/chunk-5SWZDVOW.js +144 -0
- package/dist/chunk-5SWZDVOW.js.map +1 -0
- package/dist/chunk-6PVZ2ABC.js +429 -0
- package/dist/chunk-6PVZ2ABC.js.map +1 -0
- package/dist/chunk-7GVOUZMQ.js +64 -0
- package/dist/chunk-7GVOUZMQ.js.map +1 -0
- package/dist/chunk-7THCPS52.js +84 -0
- package/dist/chunk-7THCPS52.js.map +1 -0
- package/dist/chunk-ASMHEEKY.js +10 -0
- package/dist/chunk-ASMHEEKY.js.map +1 -0
- package/dist/chunk-DBF5OKH3.js +111 -0
- package/dist/chunk-DBF5OKH3.js.map +1 -0
- package/dist/chunk-DW4TX7MU.js +54 -0
- package/dist/chunk-DW4TX7MU.js.map +1 -0
- package/dist/chunk-IPE7TF2P.js +54 -0
- package/dist/chunk-IPE7TF2P.js.map +1 -0
- package/dist/chunk-IQTJHXZJ.js +126 -0
- package/dist/chunk-IQTJHXZJ.js.map +1 -0
- package/dist/chunk-J47N77VG.js +2969 -0
- package/dist/chunk-J47N77VG.js.map +1 -0
- package/dist/chunk-JZXD6FWR.js +25 -0
- package/dist/chunk-JZXD6FWR.js.map +1 -0
- package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
- package/dist/chunk-KDSNXS6N.js.map +1 -0
- package/dist/chunk-KZ2IXVQT.js +219 -0
- package/dist/chunk-KZ2IXVQT.js.map +1 -0
- package/dist/chunk-LBPELU7L.js +3649 -0
- package/dist/chunk-LBPELU7L.js.map +1 -0
- package/dist/chunk-MX3NFLCE.js +940 -0
- package/dist/chunk-MX3NFLCE.js.map +1 -0
- package/dist/chunk-N44UXKIB.js +26 -0
- package/dist/chunk-N44UXKIB.js.map +1 -0
- package/dist/chunk-OW5HMYMI.js +19 -0
- package/dist/chunk-OW5HMYMI.js.map +1 -0
- package/dist/chunk-OYNLAZQU.js +838 -0
- package/dist/chunk-OYNLAZQU.js.map +1 -0
- package/dist/chunk-PDPJN2OP.js +17 -0
- package/dist/chunk-PDPJN2OP.js.map +1 -0
- package/dist/chunk-RCZZGGJS.js +226 -0
- package/dist/chunk-RCZZGGJS.js.map +1 -0
- package/dist/chunk-RJNI3BHT.js +1 -0
- package/dist/chunk-RPXWUCQQ.js +112 -0
- package/dist/chunk-RPXWUCQQ.js.map +1 -0
- package/dist/chunk-S5KZQJJI.js +107 -0
- package/dist/chunk-S5KZQJJI.js.map +1 -0
- package/dist/{chunk-V5DJUSPV.js → chunk-S6S2UP6U.js} +2255 -1577
- package/dist/chunk-S6S2UP6U.js.map +1 -0
- package/dist/{chunk-MWBDO2L5.js → chunk-SXAGSEKZ.js} +1369 -9584
- package/dist/chunk-SXAGSEKZ.js.map +1 -0
- package/dist/chunk-T4GMCW6Z.js +46 -0
- package/dist/chunk-T4GMCW6Z.js.map +1 -0
- package/dist/chunk-WHQZBUNY.js +982 -0
- package/dist/chunk-WHQZBUNY.js.map +1 -0
- package/dist/chunk-WOXBLP7V.js +610 -0
- package/dist/chunk-WOXBLP7V.js.map +1 -0
- package/dist/cli/commands/inspiredesign.d.ts +2 -0
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/commands/macro-resolve.d.ts +5 -0
- package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
- package/dist/cli/commands/product-video.d.ts +2 -0
- package/dist/cli/commands/product-video.d.ts.map +1 -1
- package/dist/cli/commands/research.d.ts +2 -0
- package/dist/cli/commands/research.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/shopping.d.ts.map +1 -1
- package/dist/cli/commands/workflow-output.d.ts +2 -0
- package/dist/cli/commands/workflow-output.d.ts.map +1 -0
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +207 -8029
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/postinstall-skill-sync.js +2 -1
- package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
- package/dist/cli/remote-relay.d.ts.map +1 -1
- package/dist/cli/utils/workflow-message.d.ts +3 -0
- package/dist/cli/utils/workflow-message.d.ts.map +1 -1
- package/dist/click-TENZA3Y6.js +81 -0
- package/dist/click-TENZA3Y6.js.map +1 -0
- package/dist/clone-component-STH5AR6M.js +82 -0
- package/dist/clone-component-STH5AR6M.js.map +1 -0
- package/dist/clone-page-BSTWAPAJ.js +69 -0
- package/dist/clone-page-BSTWAPAJ.js.map +1 -0
- package/dist/close-CEMMAAM7.js +63 -0
- package/dist/close-CEMMAAM7.js.map +1 -0
- package/dist/close-QCWUNRAI.js +63 -0
- package/dist/close-QCWUNRAI.js.map +1 -0
- package/dist/connect-J3RVSEZF.js +107 -0
- package/dist/connect-J3RVSEZF.js.map +1 -0
- package/dist/console-poll-HL7BVIVX.js +76 -0
- package/dist/console-poll-HL7BVIVX.js.map +1 -0
- package/dist/cookie-import-WMUCIIHN.js +177 -0
- package/dist/cookie-import-WMUCIIHN.js.map +1 -0
- package/dist/cookie-list-PB2N4RPH.js +117 -0
- package/dist/cookie-list-PB2N4RPH.js.map +1 -0
- package/dist/daemon-5KSVMGN4.js +194 -0
- package/dist/daemon-5KSVMGN4.js.map +1 -0
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/debug-trace-snapshot-RK7KDXA5.js +136 -0
- package/dist/debug-trace-snapshot-RK7KDXA5.js.map +1 -0
- package/dist/dialog-P6P4U7XE.js +75 -0
- package/dist/dialog-P6P4U7XE.js.map +1 -0
- package/dist/disconnect-32F7IDIP.js +58 -0
- package/dist/disconnect-32F7IDIP.js.map +1 -0
- package/dist/enabled-A6C6ZM2O.js +71 -0
- package/dist/enabled-A6C6ZM2O.js.map +1 -0
- package/dist/extension-extractor-GKWSFHPN.js +11 -0
- package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
- package/dist/global-D6WLWBXA.js +56 -0
- package/dist/global-D6WLWBXA.js.map +1 -0
- package/dist/goto-ULTSABDM.js +98 -0
- package/dist/goto-ULTSABDM.js.map +1 -0
- package/dist/help-EKKKEDL5.js +491 -0
- package/dist/help-EKKKEDL5.js.map +1 -0
- package/dist/hover-UF2ZUMTQ.js +71 -0
- package/dist/hover-UF2ZUMTQ.js.map +1 -0
- package/dist/html-B6TX7GK7.js +84 -0
- package/dist/html-B6TX7GK7.js.map +1 -0
- package/dist/index.js +100 -42
- package/dist/index.js.map +1 -1
- package/dist/inspector-6S5FKUZQ.js +62 -0
- package/dist/inspector-6S5FKUZQ.js.map +1 -0
- package/dist/inspector-audit-ARGEGOS7.js +84 -0
- package/dist/inspector-audit-ARGEGOS7.js.map +1 -0
- package/dist/inspector-plan-CSG5HZOC.js +69 -0
- package/dist/inspector-plan-CSG5HZOC.js.map +1 -0
- package/dist/inspiredesign/contract.d.ts +52 -1
- package/dist/inspiredesign/contract.d.ts.map +1 -1
- package/dist/inspiredesign/handoff.d.ts +12 -0
- package/dist/inspiredesign/handoff.d.ts.map +1 -1
- package/dist/inspiredesign/reference-pattern-board.d.ts +1 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
- package/dist/inspiredesign-7VRMMZN4.js +234 -0
- package/dist/inspiredesign-7VRMMZN4.js.map +1 -0
- package/dist/install-autostart-output-5DOMKCQL.js +41 -0
- package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
- package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
- package/dist/launch-REYCIR3Z.js +225 -0
- package/dist/launch-REYCIR3Z.js.map +1 -0
- package/dist/list-NPRXRQY2.js +51 -0
- package/dist/list-NPRXRQY2.js.map +1 -0
- package/dist/list-STYD2ZWA.js +54 -0
- package/dist/list-STYD2ZWA.js.map +1 -0
- package/dist/local-HXJLUUNT.js +54 -0
- package/dist/local-HXJLUUNT.js.map +1 -0
- package/dist/macro-resolve-ZIJZ65QI.js +253 -0
- package/dist/macro-resolve-ZIJZ65QI.js.map +1 -0
- package/dist/macros/execute-runtime.d.ts +4 -1
- package/dist/macros/execute-runtime.d.ts.map +1 -1
- package/dist/macros/execute.d.ts +6 -2
- package/dist/macros/execute.d.ts.map +1 -1
- package/dist/native-UPLVQ2SG.js +22 -0
- package/dist/native-UPLVQ2SG.js.map +1 -0
- package/dist/network-poll-HLDOSC72.js +76 -0
- package/dist/network-poll-HLDOSC72.js.map +1 -0
- package/dist/new-HXLLN6UT.js +69 -0
- package/dist/new-HXLLN6UT.js.map +1 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
- package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
- package/dist/open-KDR25LQZ.js +81 -0
- package/dist/open-KDR25LQZ.js.map +1 -0
- package/dist/opendevbrowser.js +100 -42
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/perf-EM6SWFJ6.js +58 -0
- package/dist/perf-EM6SWFJ6.js.map +1 -0
- package/dist/pointer-down-ZYWRZNCH.js +55 -0
- package/dist/pointer-down-ZYWRZNCH.js.map +1 -0
- package/dist/pointer-drag-LVEAVJO4.js +54 -0
- package/dist/pointer-drag-LVEAVJO4.js.map +1 -0
- package/dist/pointer-move-7SRKUS66.js +52 -0
- package/dist/pointer-move-7SRKUS66.js.map +1 -0
- package/dist/pointer-up-KLDBSK37.js +55 -0
- package/dist/pointer-up-KLDBSK37.js.map +1 -0
- package/dist/press-UIIXFTD7.js +83 -0
- package/dist/press-UIIXFTD7.js.map +1 -0
- package/dist/product-video-PYOXJVAI.js +235 -0
- package/dist/product-video-PYOXJVAI.js.map +1 -0
- package/dist/providers/artifacts.d.ts +0 -2
- package/dist/providers/artifacts.d.ts.map +1 -1
- package/dist/providers/blocker.d.ts.map +1 -1
- package/dist/providers/bounded-map.d.ts +2 -0
- package/dist/providers/bounded-map.d.ts.map +1 -0
- package/dist/providers/browser-fallback.d.ts +7 -0
- package/dist/providers/browser-fallback.d.ts.map +1 -1
- package/dist/providers/community/index.d.ts.map +1 -1
- package/dist/providers/constraint.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/research-compiler.d.ts +1 -1
- package/dist/providers/research-compiler.d.ts.map +1 -1
- package/dist/providers/research-executor.d.ts.map +1 -1
- package/dist/providers/runtime-bundle.d.ts +1 -1
- package/dist/providers/runtime-bundle.d.ts.map +1 -1
- package/dist/providers/runtime-factory.d.ts.map +1 -1
- package/dist/providers/shared/traversal-url.d.ts +3 -0
- package/dist/providers/shared/traversal-url.d.ts.map +1 -1
- package/dist/providers/shopping/index.d.ts.map +1 -1
- package/dist/providers/social/platform.d.ts.map +1 -1
- package/dist/providers/social/search-quality.d.ts.map +1 -1
- package/dist/providers/social/youtube.d.ts.map +1 -1
- package/dist/providers/workflow-handoff.d.ts +22 -1
- package/dist/providers/workflow-handoff.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +3 -0
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-TR3DUJZV.js → providers-4YY2BLXG.js} +19 -14
- package/dist/providers-4YY2BLXG.js.map +1 -0
- package/dist/public-surface/generated-manifest.d.ts +6 -6
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +8 -8
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/relay/protocol.d.ts +3 -1
- package/dist/relay/protocol.d.ts.map +1 -1
- package/dist/relay/relay-server.d.ts +6 -0
- package/dist/relay/relay-server.d.ts.map +1 -1
- package/dist/research-CKXMJ2DK.js +295 -0
- package/dist/research-CKXMJ2DK.js.map +1 -0
- package/dist/review-7HWJPZOD.js +48 -0
- package/dist/review-7HWJPZOD.js.map +1 -0
- package/dist/review-desktop-2IBJHFB5.js +54 -0
- package/dist/review-desktop-2IBJHFB5.js.map +1 -0
- package/dist/rpc-3HGIEJUO.js +159 -0
- package/dist/rpc-3HGIEJUO.js.map +1 -0
- package/dist/run-ADRYI3MS.js +180 -0
- package/dist/run-ADRYI3MS.js.map +1 -0
- package/dist/screencast-start-DTLUHD5H.js +67 -0
- package/dist/screencast-start-DTLUHD5H.js.map +1 -0
- package/dist/screencast-stop-54C5LRSS.js +59 -0
- package/dist/screencast-stop-54C5LRSS.js.map +1 -0
- package/dist/screenshot-HOAKR7P7.js +68 -0
- package/dist/screenshot-HOAKR7P7.js.map +1 -0
- package/dist/scroll-IAOO5COY.js +84 -0
- package/dist/scroll-IAOO5COY.js.map +1 -0
- package/dist/scroll-into-view-RKWSLAPH.js +71 -0
- package/dist/scroll-into-view-RKWSLAPH.js.map +1 -0
- package/dist/select-IGD3T6X4.js +86 -0
- package/dist/select-IGD3T6X4.js.map +1 -0
- package/dist/serve-7X4INUCU.js +498 -0
- package/dist/serve-7X4INUCU.js.map +1 -0
- package/dist/shopping-FC6DRW76.js +273 -0
- package/dist/shopping-FC6DRW76.js.map +1 -0
- package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
- package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
- package/dist/skills-NSXDX6YM.js +26 -0
- package/dist/skills-NSXDX6YM.js.map +1 -0
- package/dist/snapshot-X22GG324.js +113 -0
- package/dist/snapshot-X22GG324.js.map +1 -0
- package/dist/status-SP55LMNW.js +132 -0
- package/dist/status-SP55LMNW.js.map +1 -0
- package/dist/status-VH2WXIDG.js +35 -0
- package/dist/status-VH2WXIDG.js.map +1 -0
- package/dist/status-capabilities-YBERLRRA.js +57 -0
- package/dist/status-capabilities-YBERLRRA.js.map +1 -0
- package/dist/text-6TB5WNLI.js +84 -0
- package/dist/text-6TB5WNLI.js.map +1 -0
- package/dist/tools/inspiredesign_run.d.ts.map +1 -1
- package/dist/tools/macro_resolve.d.ts.map +1 -1
- package/dist/tools/product_video_run.d.ts.map +1 -1
- package/dist/tools/research_run.d.ts.map +1 -1
- package/dist/tools/shopping_run.d.ts.map +1 -1
- package/dist/type-3UI3TQH3.js +94 -0
- package/dist/type-3UI3TQH3.js.map +1 -0
- package/dist/uncheck-5L3D2D4U.js +71 -0
- package/dist/uncheck-5L3D2D4U.js.map +1 -0
- package/dist/uninstall-KYKGJAX7.js +91 -0
- package/dist/uninstall-KYKGJAX7.js.map +1 -0
- package/dist/update-SMXPYGXS.js +305 -0
- package/dist/update-SMXPYGXS.js.map +1 -0
- package/dist/update-skill-modes-BVX7IVMW.js +38 -0
- package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
- package/dist/upload-YG4J2EMI.js +56 -0
- package/dist/upload-YG4J2EMI.js.map +1 -0
- package/dist/use-V3LGFP3K.js +63 -0
- package/dist/use-V3LGFP3K.js.map +1 -0
- package/dist/value-3247D57X.js +71 -0
- package/dist/value-3247D57X.js.map +1 -0
- package/dist/visible-A7HEV36U.js +71 -0
- package/dist/visible-A7HEV36U.js.map +1 -0
- package/dist/wait-UZPP4Y4R.js +109 -0
- package/dist/wait-UZPP4Y4R.js.map +1 -0
- package/dist/windows-76TR3AIP.js +37 -0
- package/dist/windows-76TR3AIP.js.map +1 -0
- package/extension/dist/background.js +99 -22
- package/extension/dist/ops/ops-runtime.js +85 -7
- package/extension/dist/ops/ops-session-store.js +3 -0
- package/extension/dist/ops/target-session-coordinator.js +3 -0
- package/extension/dist/services/CDPRouter.js +9 -0
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +13 -11
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
- package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
- package/skills/opendevbrowser-design-agent/SKILL.md +5 -0
- package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +6 -1
- package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +15 -1
- package/skills/opendevbrowser-design-agent/assets/templates/inspiredesign-advanced-brief.v1.json +5 -2
- package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +2 -0
- package/skills/opendevbrowser-research/SKILL.md +64 -12
- package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
- package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
- package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
- package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
- package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
- package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
- package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
- package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
- package/dist/chunk-MWBDO2L5.js.map +0 -1
- package/dist/chunk-QVWOPIZJ.js.map +0 -1
- package/dist/chunk-V5DJUSPV.js.map +0 -1
- /package/dist/{providers-TR3DUJZV.js.map → chunk-RJNI3BHT.js.map} +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
generateSecureToken
|
|
3
|
+
} from "./chunk-ASMHEEKY.js";
|
|
4
|
+
import {
|
|
5
|
+
writeFileAtomic
|
|
6
|
+
} from "./chunk-TBUCZX4A.js";
|
|
7
|
+
|
|
8
|
+
// src/cli/templates/config.ts
|
|
9
|
+
import * as fs from "fs";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
import * as os from "os";
|
|
12
|
+
function buildConfigTemplate(relayToken, daemonToken) {
|
|
13
|
+
return `{
|
|
14
|
+
// OpenDevBrowser Plugin Configuration
|
|
15
|
+
// See: https://github.com/anthropics/opendevbrowser#configuration
|
|
16
|
+
|
|
17
|
+
"headless": false,
|
|
18
|
+
"profile": "default",
|
|
19
|
+
"persistProfile": true,
|
|
20
|
+
|
|
21
|
+
"snapshot": {
|
|
22
|
+
"maxChars": 16000,
|
|
23
|
+
"maxNodes": 1000
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
"export": {
|
|
27
|
+
"maxNodes": 1000,
|
|
28
|
+
"inlineStyles": true
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
"devtools": {
|
|
32
|
+
"showFullUrls": false,
|
|
33
|
+
"showFullConsole": false
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
"security": {
|
|
37
|
+
"allowRawCDP": false,
|
|
38
|
+
"allowNonLocalCdp": false,
|
|
39
|
+
"allowUnsafeExport": false
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
"skillPaths": [],
|
|
43
|
+
"skills": {
|
|
44
|
+
"nudge": {
|
|
45
|
+
"enabled": true,
|
|
46
|
+
"keywords": ["quick start", "getting started", "launch", "connect", "setup"],
|
|
47
|
+
"maxAgeMs": 60000
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
"continuity": {
|
|
52
|
+
"enabled": true,
|
|
53
|
+
"filePath": "opendevbrowser_continuity.md",
|
|
54
|
+
"nudge": {
|
|
55
|
+
"enabled": true,
|
|
56
|
+
"keywords": [
|
|
57
|
+
"plan",
|
|
58
|
+
"multi-step",
|
|
59
|
+
"multi step",
|
|
60
|
+
"long-running",
|
|
61
|
+
"long running",
|
|
62
|
+
"refactor",
|
|
63
|
+
"migration",
|
|
64
|
+
"rollout",
|
|
65
|
+
"release",
|
|
66
|
+
"upgrade",
|
|
67
|
+
"investigate",
|
|
68
|
+
"follow-up",
|
|
69
|
+
"continue"
|
|
70
|
+
],
|
|
71
|
+
"maxAgeMs": 60000
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
"relayPort": 8787,
|
|
76
|
+
"relayToken": "${relayToken}",
|
|
77
|
+
"daemonPort": 8788,
|
|
78
|
+
"daemonToken": "${daemonToken}",
|
|
79
|
+
|
|
80
|
+
"flags": [],
|
|
81
|
+
|
|
82
|
+
"checkForUpdates": false
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
function getPluginConfigPath(mode) {
|
|
87
|
+
if (mode === "global") {
|
|
88
|
+
const configDir = process.env.OPENCODE_CONFIG_DIR || path.join(os.homedir(), ".config", "opencode");
|
|
89
|
+
return path.join(configDir, "opendevbrowser.jsonc");
|
|
90
|
+
}
|
|
91
|
+
return path.join(process.cwd(), "opendevbrowser.jsonc");
|
|
92
|
+
}
|
|
93
|
+
function createPluginConfig(mode) {
|
|
94
|
+
const configPath = getPluginConfigPath(mode);
|
|
95
|
+
if (fs.existsSync(configPath)) {
|
|
96
|
+
return { created: false, path: configPath };
|
|
97
|
+
}
|
|
98
|
+
const dir = path.dirname(configPath);
|
|
99
|
+
if (!fs.existsSync(dir)) {
|
|
100
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
const relayToken = generateSecureToken();
|
|
103
|
+
const daemonToken = generateSecureToken();
|
|
104
|
+
writeFileAtomic(configPath, buildConfigTemplate(relayToken, daemonToken));
|
|
105
|
+
return { created: true, path: configPath };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export {
|
|
109
|
+
createPluginConfig
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=chunk-DBF5OKH3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/templates/config.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { generateSecureToken } from \"../../utils/crypto\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nfunction buildConfigTemplate(relayToken: string, daemonToken: string): string {\n return `{\n // OpenDevBrowser Plugin Configuration\n // See: https://github.com/anthropics/opendevbrowser#configuration\n\n \"headless\": false,\n \"profile\": \"default\",\n \"persistProfile\": true,\n\n \"snapshot\": {\n \"maxChars\": 16000,\n \"maxNodes\": 1000\n },\n\n \"export\": {\n \"maxNodes\": 1000,\n \"inlineStyles\": true\n },\n\n \"devtools\": {\n \"showFullUrls\": false,\n \"showFullConsole\": false\n },\n\n \"security\": {\n \"allowRawCDP\": false,\n \"allowNonLocalCdp\": false,\n \"allowUnsafeExport\": false\n },\n\n \"skillPaths\": [],\n \"skills\": {\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\"quick start\", \"getting started\", \"launch\", \"connect\", \"setup\"],\n \"maxAgeMs\": 60000\n }\n },\n\n \"continuity\": {\n \"enabled\": true,\n \"filePath\": \"opendevbrowser_continuity.md\",\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ],\n \"maxAgeMs\": 60000\n }\n },\n\n \"relayPort\": 8787,\n \"relayToken\": \"${relayToken}\",\n \"daemonPort\": 8788,\n \"daemonToken\": \"${daemonToken}\",\n\n \"flags\": [],\n\n \"checkForUpdates\": false\n}\n`;\n}\n\nexport function getPluginConfigPath(mode: \"global\" | \"local\"): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nexport function createPluginConfig(mode: \"global\" | \"local\"): { created: boolean; path: string } {\n const configPath = getPluginConfigPath(mode);\n\n if (fs.existsSync(configPath)) {\n return { created: false, path: configPath };\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const relayToken = generateSecureToken();\n const daemonToken = generateSecureToken();\n writeFileAtomic(configPath, buildConfigTemplate(relayToken, daemonToken));\n return { created: true, path: configPath };\n}\n\nexport function getConfigTemplate(): string {\n return buildConfigTemplate(generateSecureToken(), generateSecureToken());\n}\n"],"mappings":";;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAIpB,SAAS,oBAAoB,YAAoB,aAA6B;AAC5E,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBA+DU,UAAU;AAAA;AAAA,oBAET,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/B;AAEO,SAAS,oBAAoB,MAAkC;AACpE,MAAI,SAAS,UAAU;AACrB,UAAM,YAAY,QAAQ,IAAI,uBACpB,UAAQ,WAAQ,GAAG,WAAW,UAAU;AAClD,WAAY,UAAK,WAAW,sBAAsB;AAAA,EACpD;AACA,SAAY,UAAK,QAAQ,IAAI,GAAG,sBAAsB;AACxD;AAEO,SAAS,mBAAmB,MAA8D;AAC/F,QAAM,aAAa,oBAAoB,IAAI;AAE3C,MAAO,cAAW,UAAU,GAAG;AAC7B,WAAO,EAAE,SAAS,OAAO,MAAM,WAAW;AAAA,EAC5C;AAEA,QAAM,MAAW,aAAQ,UAAU;AACnC,MAAI,CAAI,cAAW,GAAG,GAAG;AACvB,IAAG,aAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,QAAM,aAAa,oBAAoB;AACvC,QAAM,cAAc,oBAAoB;AACxC,kBAAgB,YAAY,oBAAoB,YAAY,WAAW,CAAC;AACxE,SAAO,EAAE,SAAS,MAAM,MAAM,WAAW;AAC3C;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/cli/onboarding-metadata.json
|
|
2
|
+
var sectionTitle = "Agent Quick Start";
|
|
3
|
+
var sectionSummary = 'Start with opendevbrowser_prompting_guide or opendevbrowser_skill_load opendevbrowser-best-practices "quick start" before low-level browser commands, then load validated capability lanes when you need the current transcript, evidence-gated research, shopping, browser replay, desktop observation, and browser-scoped computer-use workflows.';
|
|
4
|
+
var skillName = "opendevbrowser-best-practices";
|
|
5
|
+
var skillTopic = "quick start";
|
|
6
|
+
var validatedSkillTopic = "validated capability lanes";
|
|
7
|
+
var designSkillName = "opendevbrowser-design-agent";
|
|
8
|
+
var designSkillTopic = "canvas-contract";
|
|
9
|
+
var localOnlyToolNames = [
|
|
10
|
+
"opendevbrowser_prompting_guide",
|
|
11
|
+
"opendevbrowser_skill_list",
|
|
12
|
+
"opendevbrowser_skill_load"
|
|
13
|
+
];
|
|
14
|
+
var quickStartCommands = {
|
|
15
|
+
promptingGuide: "opendevbrowser_prompting_guide",
|
|
16
|
+
skillList: "opendevbrowser_skill_list",
|
|
17
|
+
skillLoad: 'opendevbrowser_skill_load opendevbrowser-best-practices "quick start"',
|
|
18
|
+
validatedLanes: 'opendevbrowser_skill_load opendevbrowser-best-practices "validated capability lanes"',
|
|
19
|
+
validatedResearch: 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --sources web,community --browser-mode managed --mode json --output-format json',
|
|
20
|
+
validatedShopping: 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json',
|
|
21
|
+
computerUseEntry: 'npx opendevbrowser research run --topic "account recovery flow" --sources web,community --challenge-automation-mode browser --mode json --output-format json',
|
|
22
|
+
happyPath: "npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json"
|
|
23
|
+
};
|
|
24
|
+
var referencePaths = {
|
|
25
|
+
onboardingDoc: "docs/FIRST_RUN_ONBOARDING.md",
|
|
26
|
+
skillDoc: "skills/opendevbrowser-best-practices/SKILL.md"
|
|
27
|
+
};
|
|
28
|
+
var onboarding_metadata_default = {
|
|
29
|
+
sectionTitle,
|
|
30
|
+
sectionSummary,
|
|
31
|
+
skillName,
|
|
32
|
+
skillTopic,
|
|
33
|
+
validatedSkillTopic,
|
|
34
|
+
designSkillName,
|
|
35
|
+
designSkillTopic,
|
|
36
|
+
localOnlyToolNames,
|
|
37
|
+
quickStartCommands,
|
|
38
|
+
referencePaths
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
sectionTitle,
|
|
43
|
+
sectionSummary,
|
|
44
|
+
skillName,
|
|
45
|
+
skillTopic,
|
|
46
|
+
validatedSkillTopic,
|
|
47
|
+
designSkillName,
|
|
48
|
+
designSkillTopic,
|
|
49
|
+
localOnlyToolNames,
|
|
50
|
+
quickStartCommands,
|
|
51
|
+
referencePaths,
|
|
52
|
+
onboarding_metadata_default
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=chunk-DW4TX7MU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/onboarding-metadata.json"],"sourcesContent":["{\n \"sectionTitle\": \"Agent Quick Start\",\n \"sectionSummary\": \"Start with opendevbrowser_prompting_guide or opendevbrowser_skill_load opendevbrowser-best-practices \\\"quick start\\\" before low-level browser commands, then load validated capability lanes when you need the current transcript, evidence-gated research, shopping, browser replay, desktop observation, and browser-scoped computer-use workflows.\",\n \"skillName\": \"opendevbrowser-best-practices\",\n \"skillTopic\": \"quick start\",\n \"validatedSkillTopic\": \"validated capability lanes\",\n \"designSkillName\": \"opendevbrowser-design-agent\",\n \"designSkillTopic\": \"canvas-contract\",\n \"localOnlyToolNames\": [\n \"opendevbrowser_prompting_guide\",\n \"opendevbrowser_skill_list\",\n \"opendevbrowser_skill_load\"\n ],\n \"quickStartCommands\": {\n \"promptingGuide\": \"opendevbrowser_prompting_guide\",\n \"skillList\": \"opendevbrowser_skill_list\",\n \"skillLoad\": \"opendevbrowser_skill_load opendevbrowser-best-practices \\\"quick start\\\"\",\n \"validatedLanes\": \"opendevbrowser_skill_load opendevbrowser-best-practices \\\"validated capability lanes\\\"\",\n \"validatedResearch\": \"npx opendevbrowser research run --topic \\\"Chrome extension debugging workflows\\\" --days 30 --sources web,community --browser-mode managed --mode json --output-format json\",\n \"validatedShopping\": \"npx opendevbrowser shopping run --query \\\"wireless ergonomic mouse\\\" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json\",\n \"computerUseEntry\": \"npx opendevbrowser research run --topic \\\"account recovery flow\\\" --sources web,community --challenge-automation-mode browser --mode json --output-format json\",\n \"happyPath\": \"npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json\"\n },\n \"referencePaths\": {\n \"onboardingDoc\": \"docs/FIRST_RUN_ONBOARDING.md\",\n \"skillDoc\": \"skills/opendevbrowser-best-practices/SKILL.md\"\n }\n}\n"],"mappings":";AACE,mBAAgB;AAChB,qBAAkB;AAClB,gBAAa;AACb,iBAAc;AACd,0BAAuB;AACvB,sBAAmB;AACnB,uBAAoB;AACpB,yBAAsB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AACA,yBAAsB;AAAA,EACpB,gBAAkB;AAAA,EAClB,WAAa;AAAA,EACb,WAAa;AAAA,EACb,gBAAkB;AAAA,EAClB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,kBAAoB;AAAA,EACpB,WAAa;AACf;AACA,qBAAkB;AAAA,EAChB,eAAiB;AAAA,EACjB,UAAY;AACd;AA1BF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EAUA;AAIF;","names":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/cli/errors.ts
|
|
2
|
+
var EXIT_SUCCESS = 0;
|
|
3
|
+
var EXIT_USAGE = 1;
|
|
4
|
+
var EXIT_EXECUTION = 2;
|
|
5
|
+
var EXIT_DISCONNECTED = 10;
|
|
6
|
+
var CliError = class extends Error {
|
|
7
|
+
exitCode;
|
|
8
|
+
constructor(message, exitCode) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.exitCode = exitCode;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
function createUsageError(message) {
|
|
14
|
+
return new CliError(message, EXIT_USAGE);
|
|
15
|
+
}
|
|
16
|
+
function createDisconnectedError(message) {
|
|
17
|
+
return new CliError(message, EXIT_DISCONNECTED);
|
|
18
|
+
}
|
|
19
|
+
function toCliError(error, fallbackExitCode = EXIT_EXECUTION) {
|
|
20
|
+
if (error instanceof CliError) {
|
|
21
|
+
return error;
|
|
22
|
+
}
|
|
23
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
24
|
+
return new CliError(message, fallbackExitCode);
|
|
25
|
+
}
|
|
26
|
+
function formatErrorPayload(error) {
|
|
27
|
+
return {
|
|
28
|
+
success: false,
|
|
29
|
+
error: error.message,
|
|
30
|
+
exitCode: error.exitCode
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function resolveExitCode(result) {
|
|
34
|
+
if (result.exitCode === null) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
if (typeof result.exitCode === "number") {
|
|
38
|
+
return result.exitCode;
|
|
39
|
+
}
|
|
40
|
+
return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
EXIT_USAGE,
|
|
45
|
+
EXIT_EXECUTION,
|
|
46
|
+
EXIT_DISCONNECTED,
|
|
47
|
+
CliError,
|
|
48
|
+
createUsageError,
|
|
49
|
+
createDisconnectedError,
|
|
50
|
+
toCliError,
|
|
51
|
+
formatErrorPayload,
|
|
52
|
+
resolveExitCode
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=chunk-IPE7TF2P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/errors.ts"],"sourcesContent":["import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n"],"mappings":";AAEO,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EAEA,YAAY,SAAiB,UAAkB;AAC7C,UAAM,OAAO;AACb,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,SAAO,IAAI,SAAS,SAAS,UAAU;AACzC;AAEO,SAAS,wBAAwB,SAA2B;AACjE,SAAO,IAAI,SAAS,SAAS,iBAAiB;AAChD;AAEO,SAAS,WAAW,OAAgB,mBAAmB,gBAA0B;AACtF,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,IAAI,SAAS,SAAS,gBAAgB;AAC/C;AAQO,SAAS,mBAAmB,OAA+B;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,EAClB;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,MAAI,OAAO,aAAa,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,UAAU,eAAe;AACzC;","names":[]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/annotate/output.ts
|
|
2
|
+
import { randomUUID } from "crypto";
|
|
3
|
+
import { promises as fs } from "fs";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import os from "os";
|
|
6
|
+
var MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;
|
|
7
|
+
var sanitizeScreenshotLabel = (label) => {
|
|
8
|
+
const safe = label.replace(/[^a-z0-9-_]+/gi, "-").slice(0, 40);
|
|
9
|
+
return safe || "annotation";
|
|
10
|
+
};
|
|
11
|
+
var writeAnnotationScreenshots = async (screenshots) => {
|
|
12
|
+
const results = [];
|
|
13
|
+
for (const screenshot of screenshots) {
|
|
14
|
+
if (!screenshot.base64) continue;
|
|
15
|
+
const buffer = Buffer.from(screenshot.base64, "base64");
|
|
16
|
+
if (buffer.length > MAX_SCREENSHOT_BYTES) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const safeLabel = sanitizeScreenshotLabel(screenshot.label);
|
|
20
|
+
const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;
|
|
21
|
+
const filePath = path.join(os.tmpdir(), fileName);
|
|
22
|
+
await fs.writeFile(filePath, buffer);
|
|
23
|
+
results.push({ id: screenshot.id, path: filePath });
|
|
24
|
+
}
|
|
25
|
+
return results;
|
|
26
|
+
};
|
|
27
|
+
var roundNumber = (value) => {
|
|
28
|
+
return Math.round(value).toString();
|
|
29
|
+
};
|
|
30
|
+
var formatRect = (rect) => {
|
|
31
|
+
return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;
|
|
32
|
+
};
|
|
33
|
+
var truncateText = (value, max) => {
|
|
34
|
+
if (value.length <= max) return value;
|
|
35
|
+
return `${value.slice(0, max)}...`;
|
|
36
|
+
};
|
|
37
|
+
var isSensitiveKey = (key) => {
|
|
38
|
+
const lowered = key.toLowerCase();
|
|
39
|
+
return ["password", "passwd", "token", "secret", "api-key", "apikey", "auth", "session", "csrf", "value"].some((term) => lowered.includes(term));
|
|
40
|
+
};
|
|
41
|
+
var looksSensitive = (value) => {
|
|
42
|
+
const trimmed = value.trim();
|
|
43
|
+
if (trimmed.length < 12) return false;
|
|
44
|
+
if (/[A-Z0-9]{20,}/.test(trimmed)) return true;
|
|
45
|
+
if (/(token|secret|apikey|password)/i.test(trimmed)) return true;
|
|
46
|
+
if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;
|
|
47
|
+
return false;
|
|
48
|
+
};
|
|
49
|
+
var redactAnnotationItem = (item) => {
|
|
50
|
+
const attributes = {};
|
|
51
|
+
for (const [key, value] of Object.entries(item.attributes)) {
|
|
52
|
+
if (isSensitiveKey(key)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (looksSensitive(value)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
attributes[key] = value;
|
|
59
|
+
}
|
|
60
|
+
const note = item.note && looksSensitive(item.note) ? "[redacted]" : item.note;
|
|
61
|
+
const text = item.text && looksSensitive(item.text) ? "[redacted]" : item.text;
|
|
62
|
+
return {
|
|
63
|
+
...item,
|
|
64
|
+
attributes,
|
|
65
|
+
note,
|
|
66
|
+
text
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
var redactAnnotationPayload = (payload) => {
|
|
70
|
+
const redacted = {
|
|
71
|
+
...payload,
|
|
72
|
+
annotations: payload.annotations.map((item) => redactAnnotationItem(item))
|
|
73
|
+
};
|
|
74
|
+
return redacted;
|
|
75
|
+
};
|
|
76
|
+
var formatAnnotationMarkdown = (payload, screenshotPaths) => {
|
|
77
|
+
const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));
|
|
78
|
+
const lines = [];
|
|
79
|
+
lines.push("# Annotation Summary");
|
|
80
|
+
lines.push("");
|
|
81
|
+
lines.push(`- URL: ${payload.url}`);
|
|
82
|
+
if (payload.title) {
|
|
83
|
+
lines.push(`- Title: ${payload.title}`);
|
|
84
|
+
}
|
|
85
|
+
lines.push(`- Timestamp: ${payload.timestamp}`);
|
|
86
|
+
lines.push(`- Screenshot mode: ${payload.screenshotMode}`);
|
|
87
|
+
if (payload.context) {
|
|
88
|
+
lines.push(`- Context: ${payload.context}`);
|
|
89
|
+
}
|
|
90
|
+
lines.push("");
|
|
91
|
+
payload.annotations.forEach((annotation, index) => {
|
|
92
|
+
lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : ""}`);
|
|
93
|
+
if (annotation.note) {
|
|
94
|
+
lines.push(`> ${annotation.note}`);
|
|
95
|
+
}
|
|
96
|
+
lines.push(`- Selector: \`${annotation.selector}\``);
|
|
97
|
+
lines.push(`- Rect: ${formatRect(annotation.rect)}`);
|
|
98
|
+
if (annotation.a11y.role || annotation.a11y.label) {
|
|
99
|
+
lines.push(`- A11y: role=${annotation.a11y.role ?? "n/a"}, label=${annotation.a11y.label ?? "n/a"}`);
|
|
100
|
+
}
|
|
101
|
+
if (annotation.text) {
|
|
102
|
+
lines.push(`- Text: ${truncateText(annotation.text, 160)}`);
|
|
103
|
+
}
|
|
104
|
+
const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;
|
|
105
|
+
if (shot) {
|
|
106
|
+
lines.push(`- Screenshot: ${shot}`);
|
|
107
|
+
}
|
|
108
|
+
lines.push("");
|
|
109
|
+
});
|
|
110
|
+
return lines.join("\n");
|
|
111
|
+
};
|
|
112
|
+
var buildAnnotateResult = async (payload) => {
|
|
113
|
+
const redacted = redactAnnotationPayload(payload);
|
|
114
|
+
const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);
|
|
115
|
+
const message = formatAnnotationMarkdown(redacted, screenshots);
|
|
116
|
+
return {
|
|
117
|
+
message,
|
|
118
|
+
details: redacted,
|
|
119
|
+
screenshots
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export {
|
|
124
|
+
buildAnnotateResult
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=chunk-IQTJHXZJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/annotate/output.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport type { AnnotationPayload, AnnotationItem, AnnotationScreenshot } from \"../relay/protocol\";\n\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\nconst sanitizeScreenshotLabel = (label: string): string => {\n const safe = label.replace(/[^a-z0-9-_]+/gi, \"-\").slice(0, 40);\n return safe || \"annotation\";\n};\n\nconst writeAnnotationScreenshots = async (\n screenshots: AnnotationScreenshot[]\n): Promise<Array<{ id: string; path: string }>> => {\n const results: Array<{ id: string; path: string }> = [];\n for (const screenshot of screenshots) {\n if (!screenshot.base64) continue;\n const buffer = Buffer.from(screenshot.base64, \"base64\");\n if (buffer.length > MAX_SCREENSHOT_BYTES) {\n continue;\n }\n const safeLabel = sanitizeScreenshotLabel(screenshot.label);\n const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;\n const filePath = path.join(os.tmpdir(), fileName);\n await fs.writeFile(filePath, buffer);\n results.push({ id: screenshot.id, path: filePath });\n }\n return results;\n};\n\nconst roundNumber = (value: number): string => {\n return Math.round(value).toString();\n};\n\nconst formatRect = (rect: AnnotationPayload[\"annotations\"][number][\"rect\"]): string => {\n return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;\n};\n\nconst truncateText = (value: string, max: number): string => {\n if (value.length <= max) return value;\n return `${value.slice(0, max)}...`;\n};\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowered = key.toLowerCase();\n return [\"password\", \"passwd\", \"token\", \"secret\", \"api-key\", \"apikey\", \"auth\", \"session\", \"csrf\", \"value\"].some((term) => lowered.includes(term));\n};\n\nconst looksSensitive = (value: string): boolean => {\n const trimmed = value.trim();\n if (trimmed.length < 12) return false;\n if (/[A-Z0-9]{20,}/.test(trimmed)) return true;\n if (/(token|secret|apikey|password)/i.test(trimmed)) return true;\n if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;\n return false;\n};\n\nconst redactAnnotationItem = (item: AnnotationItem): AnnotationItem => {\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(item.attributes)) {\n if (isSensitiveKey(key)) {\n continue;\n }\n if (looksSensitive(value)) {\n continue;\n }\n attributes[key] = value;\n }\n const note = item.note && looksSensitive(item.note) ? \"[redacted]\" : item.note;\n const text = item.text && looksSensitive(item.text) ? \"[redacted]\" : item.text;\n return {\n ...item,\n attributes,\n note,\n text\n };\n};\n\nconst redactAnnotationPayload = (payload: AnnotationPayload): AnnotationPayload => {\n const redacted: AnnotationPayload = {\n ...payload,\n annotations: payload.annotations.map((item) => redactAnnotationItem(item))\n };\n return redacted;\n};\n\nconst formatAnnotationMarkdown = (\n payload: AnnotationPayload,\n screenshotPaths: Array<{ id: string; path: string }>\n): string => {\n const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));\n\n const lines: string[] = [];\n lines.push(\"# Annotation Summary\");\n lines.push(\"\");\n lines.push(`- URL: ${payload.url}`);\n if (payload.title) {\n lines.push(`- Title: ${payload.title}`);\n }\n lines.push(`- Timestamp: ${payload.timestamp}`);\n lines.push(`- Screenshot mode: ${payload.screenshotMode}`);\n if (payload.context) {\n lines.push(`- Context: ${payload.context}`);\n }\n lines.push(\"\");\n\n payload.annotations.forEach((annotation, index) => {\n lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : \"\"}`);\n if (annotation.note) {\n lines.push(`> ${annotation.note}`);\n }\n lines.push(`- Selector: \\`${annotation.selector}\\``);\n lines.push(`- Rect: ${formatRect(annotation.rect)}`);\n if (annotation.a11y.role || annotation.a11y.label) {\n lines.push(`- A11y: role=${annotation.a11y.role ?? \"n/a\"}, label=${annotation.a11y.label ?? \"n/a\"}`);\n }\n if (annotation.text) {\n lines.push(`- Text: ${truncateText(annotation.text, 160)}`);\n }\n const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;\n if (shot) {\n lines.push(`- Screenshot: ${shot}`);\n }\n lines.push(\"\");\n });\n\n return lines.join(\"\\n\");\n};\n\nexport const buildAnnotateResult = async (\n payload: AnnotationPayload\n): Promise<{ message: string; details: AnnotationPayload; screenshots: Array<{ id: string; path: string }> }> => {\n const redacted = redactAnnotationPayload(payload);\n const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);\n const message = formatAnnotationMarkdown(redacted, screenshots);\n return {\n message,\n details: redacted,\n screenshots\n };\n};\n"],"mappings":"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","names":[]}
|