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,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseNumberFlag
|
|
3
|
+
} from "./chunk-RPXWUCQQ.js";
|
|
4
|
+
import {
|
|
5
|
+
createUsageError
|
|
6
|
+
} from "./chunk-IPE7TF2P.js";
|
|
7
|
+
|
|
8
|
+
// src/cli/commands/session/inspector-shared.ts
|
|
9
|
+
function parseSessionInspectorArgs(rawArgs) {
|
|
10
|
+
const parsed = {};
|
|
11
|
+
for (let index = 0; index < rawArgs.length; index += 1) {
|
|
12
|
+
const arg = rawArgs[index];
|
|
13
|
+
if (arg === "--include-urls") {
|
|
14
|
+
parsed.includeUrls = true;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (arg === "--session-id" || arg?.startsWith("--session-id=")) {
|
|
18
|
+
parsed.sessionId = readStringFlag(rawArgs, index, "--session-id");
|
|
19
|
+
index += stepForValue(arg);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (arg === "--since-console-seq" || arg?.startsWith("--since-console-seq=")) {
|
|
23
|
+
parsed.sinceConsoleSeq = readNumberFlag(rawArgs, index, "--since-console-seq", { min: 0 });
|
|
24
|
+
index += stepForValue(arg);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (arg === "--since-network-seq" || arg?.startsWith("--since-network-seq=")) {
|
|
28
|
+
parsed.sinceNetworkSeq = readNumberFlag(rawArgs, index, "--since-network-seq", { min: 0 });
|
|
29
|
+
index += stepForValue(arg);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (arg === "--since-exception-seq" || arg?.startsWith("--since-exception-seq=")) {
|
|
33
|
+
parsed.sinceExceptionSeq = readNumberFlag(rawArgs, index, "--since-exception-seq", { min: 0 });
|
|
34
|
+
index += stepForValue(arg);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (arg === "--max" || arg?.startsWith("--max=")) {
|
|
38
|
+
parsed.max = readNumberFlag(rawArgs, index, "--max", { min: 1 });
|
|
39
|
+
index += stepForValue(arg);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (arg === "--request-id" || arg?.startsWith("--request-id=")) {
|
|
43
|
+
parsed.requestId = readStringFlag(rawArgs, index, "--request-id");
|
|
44
|
+
index += stepForValue(arg);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
function stepForValue(flag) {
|
|
50
|
+
return flag.includes("=") ? 0 : 1;
|
|
51
|
+
}
|
|
52
|
+
function readNumberFlag(rawArgs, index, flag, options) {
|
|
53
|
+
return parseNumberFlag(readStringFlag(rawArgs, index, flag), flag, options);
|
|
54
|
+
}
|
|
55
|
+
function readStringFlag(rawArgs, index, flag) {
|
|
56
|
+
const arg = rawArgs[index];
|
|
57
|
+
const value = arg?.includes("=") ? arg.split("=", 2)[1] : rawArgs[index + 1];
|
|
58
|
+
if (!value) {
|
|
59
|
+
throw createUsageError(`Missing value for ${flag}`);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
parseSessionInspectorArgs
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=chunk-2SIMIPLY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/session/inspector-shared.ts"],"sourcesContent":["import { createUsageError } from \"../../errors\";\nimport { parseNumberFlag } from \"../../utils/parse\";\n\nexport type SessionInspectorArgs = {\n sessionId?: string;\n includeUrls?: boolean;\n sinceConsoleSeq?: number;\n sinceNetworkSeq?: number;\n sinceExceptionSeq?: number;\n max?: number;\n requestId?: string;\n};\n\nexport function parseSessionInspectorArgs(rawArgs: string[]): SessionInspectorArgs {\n const parsed: SessionInspectorArgs = {};\n\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index];\n if (arg === \"--include-urls\") {\n parsed.includeUrls = true;\n continue;\n }\n if (arg === \"--session-id\" || arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = readStringFlag(rawArgs, index, \"--session-id\");\n index += stepForValue(arg);\n continue;\n }\n if (arg === \"--since-console-seq\" || arg?.startsWith(\"--since-console-seq=\")) {\n parsed.sinceConsoleSeq = readNumberFlag(rawArgs, index, \"--since-console-seq\", { min: 0 });\n index += stepForValue(arg);\n continue;\n }\n if (arg === \"--since-network-seq\" || arg?.startsWith(\"--since-network-seq=\")) {\n parsed.sinceNetworkSeq = readNumberFlag(rawArgs, index, \"--since-network-seq\", { min: 0 });\n index += stepForValue(arg);\n continue;\n }\n if (arg === \"--since-exception-seq\" || arg?.startsWith(\"--since-exception-seq=\")) {\n parsed.sinceExceptionSeq = readNumberFlag(rawArgs, index, \"--since-exception-seq\", { min: 0 });\n index += stepForValue(arg);\n continue;\n }\n if (arg === \"--max\" || arg?.startsWith(\"--max=\")) {\n parsed.max = readNumberFlag(rawArgs, index, \"--max\", { min: 1 });\n index += stepForValue(arg);\n continue;\n }\n if (arg === \"--request-id\" || arg?.startsWith(\"--request-id=\")) {\n parsed.requestId = readStringFlag(rawArgs, index, \"--request-id\");\n index += stepForValue(arg);\n }\n }\n\n return parsed;\n}\n\nfunction stepForValue(flag: string): number {\n return flag.includes(\"=\") ? 0 : 1;\n}\n\nfunction readNumberFlag(\n rawArgs: string[],\n index: number,\n flag: string,\n options: { min?: number }\n): number {\n return parseNumberFlag(readStringFlag(rawArgs, index, flag), flag, options);\n}\n\nfunction readStringFlag(rawArgs: string[], index: number, flag: string): string {\n const arg = rawArgs[index];\n const value = arg?.includes(\"=\")\n ? arg.split(\"=\", 2)[1]\n : rawArgs[index + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n}\n"],"mappings":";;;;;;;;AAaO,SAAS,0BAA0B,SAAyC;AACjF,QAAM,SAA+B,CAAC;AAEtC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,MAAM,QAAQ,KAAK;AACzB,QAAI,QAAQ,kBAAkB;AAC5B,aAAO,cAAc;AACrB;AAAA,IACF;AACA,QAAI,QAAQ,kBAAkB,KAAK,WAAW,eAAe,GAAG;AAC9D,aAAO,YAAY,eAAe,SAAS,OAAO,cAAc;AAChE,eAAS,aAAa,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,yBAAyB,KAAK,WAAW,sBAAsB,GAAG;AAC5E,aAAO,kBAAkB,eAAe,SAAS,OAAO,uBAAuB,EAAE,KAAK,EAAE,CAAC;AACzF,eAAS,aAAa,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,yBAAyB,KAAK,WAAW,sBAAsB,GAAG;AAC5E,aAAO,kBAAkB,eAAe,SAAS,OAAO,uBAAuB,EAAE,KAAK,EAAE,CAAC;AACzF,eAAS,aAAa,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,2BAA2B,KAAK,WAAW,wBAAwB,GAAG;AAChF,aAAO,oBAAoB,eAAe,SAAS,OAAO,yBAAyB,EAAE,KAAK,EAAE,CAAC;AAC7F,eAAS,aAAa,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,KAAK,WAAW,QAAQ,GAAG;AAChD,aAAO,MAAM,eAAe,SAAS,OAAO,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,eAAS,aAAa,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,kBAAkB,KAAK,WAAW,eAAe,GAAG;AAC9D,aAAO,YAAY,eAAe,SAAS,OAAO,cAAc;AAChE,eAAS,aAAa,GAAG;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,SAAS,GAAG,IAAI,IAAI;AAClC;AAEA,SAAS,eACP,SACA,OACA,MACA,SACQ;AACR,SAAO,gBAAgB,eAAe,SAAS,OAAO,IAAI,GAAG,MAAM,OAAO;AAC5E;AAEA,SAAS,eAAe,SAAmB,OAAe,MAAsB;AAC9E,QAAM,MAAM,QAAQ,KAAK;AACzB,QAAM,QAAQ,KAAK,SAAS,GAAG,IAC3B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,IACnB,QAAQ,QAAQ,CAAC;AACrB,MAAI,CAAC,OAAO;AACV,UAAM,iBAAiB,qBAAqB,IAAI,EAAE;AAAA,EACpD;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
summarizePrimaryProviderIssue
|
|
3
|
+
} from "./chunk-WHQZBUNY.js";
|
|
4
|
+
|
|
5
|
+
// src/cli/utils/workflow-message.ts
|
|
6
|
+
var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
7
|
+
var readNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
8
|
+
var UNRESOLVED_COMMAND_PLACEHOLDER_RE = /<[^>\n]+>/;
|
|
9
|
+
var readRunnableStepCommand = (step) => {
|
|
10
|
+
const command = readNonEmptyString(step.command);
|
|
11
|
+
if (!command) return null;
|
|
12
|
+
return UNRESOLVED_COMMAND_PLACEHOLDER_RE.test(command) ? null : command;
|
|
13
|
+
};
|
|
14
|
+
var readDisplayableNextStep = (value) => {
|
|
15
|
+
const text = readNonEmptyString(value);
|
|
16
|
+
if (!text) return null;
|
|
17
|
+
return UNRESOLVED_COMMAND_PLACEHOLDER_RE.test(text) ? null : text;
|
|
18
|
+
};
|
|
19
|
+
var readMeta = (data) => {
|
|
20
|
+
return asRecord(asRecord(data)?.meta);
|
|
21
|
+
};
|
|
22
|
+
var readPrimaryConstraint = (data) => {
|
|
23
|
+
const meta = readMeta(data);
|
|
24
|
+
if (!meta) return null;
|
|
25
|
+
return asRecord(meta.primaryConstraint);
|
|
26
|
+
};
|
|
27
|
+
var readPrimarySummary = (data) => {
|
|
28
|
+
const meta = readMeta(data);
|
|
29
|
+
return readNonEmptyString(meta?.primaryConstraintSummary);
|
|
30
|
+
};
|
|
31
|
+
var readPrimaryNextStep = (data) => {
|
|
32
|
+
const constraint = readPrimaryConstraint(data);
|
|
33
|
+
if (!constraint) return null;
|
|
34
|
+
const guidance = asRecord(constraint.guidance);
|
|
35
|
+
if (!guidance) return null;
|
|
36
|
+
const commands = guidance.recommendedNextCommands;
|
|
37
|
+
if (!Array.isArray(commands)) return null;
|
|
38
|
+
const nextStep = commands.find((entry) => typeof entry === "string" && entry.trim().length > 0);
|
|
39
|
+
return nextStep?.trim() ?? null;
|
|
40
|
+
};
|
|
41
|
+
var inferPrimaryIssueNextStep = (data) => {
|
|
42
|
+
return summarizePrimaryProviderIssue(readFailures(data))?.guidance?.recommendedNextCommands[0] ?? null;
|
|
43
|
+
};
|
|
44
|
+
var readFailures = (data) => {
|
|
45
|
+
const meta = readMeta(data);
|
|
46
|
+
if (!meta) return [];
|
|
47
|
+
const failures = meta.failures;
|
|
48
|
+
return Array.isArray(failures) ? failures.filter((entry) => Boolean(entry) && typeof entry === "object") : [];
|
|
49
|
+
};
|
|
50
|
+
var readFollowthroughSummary = (data) => {
|
|
51
|
+
const record = asRecord(data);
|
|
52
|
+
return readNonEmptyString(record?.followthroughSummary) ?? readNonEmptyString(readMeta(data)?.followthroughSummary);
|
|
53
|
+
};
|
|
54
|
+
var readSuggestedSteps = (data) => {
|
|
55
|
+
const steps = asRecord(data)?.suggestedSteps;
|
|
56
|
+
return Array.isArray(steps) ? steps.flatMap((step) => {
|
|
57
|
+
const record = asRecord(step);
|
|
58
|
+
return record ? [record] : [];
|
|
59
|
+
}) : [];
|
|
60
|
+
};
|
|
61
|
+
var buildNextStepMessage = (message, nextStep) => {
|
|
62
|
+
const displayableNextStep = readDisplayableNextStep(nextStep);
|
|
63
|
+
return displayableNextStep ? `${message} Next step: ${displayableNextStep}` : message;
|
|
64
|
+
};
|
|
65
|
+
var buildProviderFollowupErrorMessage = (message) => {
|
|
66
|
+
const normalized = message.toLowerCase();
|
|
67
|
+
if (normalized.includes("next step:")) return message;
|
|
68
|
+
if (normalized.includes("requires login or an existing session")) {
|
|
69
|
+
return buildNextStepMessage(
|
|
70
|
+
message,
|
|
71
|
+
"Reuse an authenticated browser session, import logged-in cookies, or use the provider sign-in flow."
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
if (normalized.includes("requires manual browser follow-up") || normalized.includes("requires a live browser-rendered page")) {
|
|
75
|
+
return buildNextStepMessage(message, "Retry with browser assistance or a headed browser session.");
|
|
76
|
+
}
|
|
77
|
+
return message;
|
|
78
|
+
};
|
|
79
|
+
var readSuggestedNextAction = (data) => {
|
|
80
|
+
const record = asRecord(data);
|
|
81
|
+
if (!record) return null;
|
|
82
|
+
return readDisplayableNextStep(record.suggestedNextAction) ?? readDisplayableNextStep(asRecord(record.sessionInspector)?.suggestedNextAction);
|
|
83
|
+
};
|
|
84
|
+
var readSuggestedStepCommand = (data) => {
|
|
85
|
+
let current = asRecord(data);
|
|
86
|
+
while (current) {
|
|
87
|
+
const command = readSuggestedSteps(current).map(readRunnableStepCommand).find((step) => Boolean(step));
|
|
88
|
+
if (command) {
|
|
89
|
+
return command;
|
|
90
|
+
}
|
|
91
|
+
current = asRecord(current.challengePlan);
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
};
|
|
95
|
+
var readSuggestedStepReason = (data) => {
|
|
96
|
+
let current = asRecord(data);
|
|
97
|
+
while (current) {
|
|
98
|
+
const [firstStep] = readSuggestedSteps(current);
|
|
99
|
+
if (firstStep) {
|
|
100
|
+
return readDisplayableNextStep(firstStep.reason);
|
|
101
|
+
}
|
|
102
|
+
current = asRecord(current.challengePlan);
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
};
|
|
106
|
+
var readWorkflowGuidanceNextStep = (data) => readSuggestedNextAction(data) ?? readSuggestedStepCommand(data) ?? readSuggestedStepReason(data);
|
|
107
|
+
var buildWorkflowCompletionMessage = (workflowLabel, data) => {
|
|
108
|
+
const explicitSummary = readPrimarySummary(data);
|
|
109
|
+
if (explicitSummary) {
|
|
110
|
+
return buildNextStepMessage(
|
|
111
|
+
`${workflowLabel} completed with provider follow-up required: ${explicitSummary}`,
|
|
112
|
+
readPrimaryNextStep(data) ?? inferPrimaryIssueNextStep(data)
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
const inferred = summarizePrimaryProviderIssue(readFailures(data));
|
|
116
|
+
if (inferred) {
|
|
117
|
+
return buildNextStepMessage(
|
|
118
|
+
`${workflowLabel} completed with provider follow-up required: ${inferred.summary}`,
|
|
119
|
+
inferred.guidance?.recommendedNextCommands[0] ?? null
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
const followthroughSummary = readFollowthroughSummary(data);
|
|
123
|
+
if (followthroughSummary) {
|
|
124
|
+
return buildNextStepMessage(
|
|
125
|
+
`${workflowLabel} completed. ${followthroughSummary}`,
|
|
126
|
+
readWorkflowGuidanceNextStep(data)
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
return `${workflowLabel} completed.`;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
readFollowthroughSummary,
|
|
134
|
+
buildNextStepMessage,
|
|
135
|
+
buildProviderFollowupErrorMessage,
|
|
136
|
+
readSuggestedNextAction,
|
|
137
|
+
readSuggestedStepReason,
|
|
138
|
+
readWorkflowGuidanceNextStep,
|
|
139
|
+
buildWorkflowCompletionMessage
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=chunk-37VSRUW4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils/workflow-message.ts"],"sourcesContent":["import { summarizePrimaryProviderIssue } from \"../../providers/constraint\";\n\ntype FailureShape = {\n provider?: string;\n error?: {\n reasonCode?: unknown;\n code?: unknown;\n message?: unknown;\n details?: Record<string, unknown>;\n };\n};\n\nconst asRecord = (value: unknown): Record<string, unknown> | null => (\n value && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown>\n : null\n);\n\nconst readNonEmptyString = (value: unknown): string | null => (\n typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : null\n);\n\nconst UNRESOLVED_COMMAND_PLACEHOLDER_RE = /<[^>\\n]+>/;\n\nconst readRunnableStepCommand = (step: Record<string, unknown>): string | null => {\n const command = readNonEmptyString(step.command);\n if (!command) return null;\n return UNRESOLVED_COMMAND_PLACEHOLDER_RE.test(command) ? null : command;\n};\n\nconst readDisplayableNextStep = (value: unknown): string | null => {\n const text = readNonEmptyString(value);\n if (!text) return null;\n return UNRESOLVED_COMMAND_PLACEHOLDER_RE.test(text) ? null : text;\n};\n\nconst readMeta = (data: unknown): Record<string, unknown> | null => {\n return asRecord(asRecord(data)?.meta);\n};\n\nconst readPrimaryConstraint = (data: unknown): Record<string, unknown> | null => {\n const meta = readMeta(data);\n if (!meta) return null;\n return asRecord(meta.primaryConstraint);\n};\n\nconst readPrimarySummary = (data: unknown): string | null => {\n const meta = readMeta(data);\n return readNonEmptyString(meta?.primaryConstraintSummary);\n};\n\nconst readPrimaryNextStep = (data: unknown): string | null => {\n const constraint = readPrimaryConstraint(data);\n if (!constraint) return null;\n const guidance = asRecord(constraint.guidance);\n if (!guidance) return null;\n const commands = guidance.recommendedNextCommands;\n if (!Array.isArray(commands)) return null;\n const nextStep = commands.find((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0);\n return nextStep?.trim() ?? null;\n};\n\nconst inferPrimaryIssueNextStep = (data: unknown): string | null => {\n return summarizePrimaryProviderIssue(readFailures(data))?.guidance?.recommendedNextCommands[0] ?? null;\n};\n\nconst readFailures = (data: unknown): FailureShape[] => {\n const meta = readMeta(data);\n if (!meta) return [];\n const failures = meta.failures;\n return Array.isArray(failures)\n ? failures.filter((entry): entry is FailureShape => Boolean(entry) && typeof entry === \"object\")\n : [];\n};\n\nexport const readFollowthroughSummary = (data: unknown): string | null => {\n const record = asRecord(data);\n return readNonEmptyString(record?.followthroughSummary)\n ?? readNonEmptyString(readMeta(data)?.followthroughSummary);\n};\n\nconst readSuggestedSteps = (data: unknown): readonly Record<string, unknown>[] => {\n const steps = asRecord(data)?.suggestedSteps;\n return Array.isArray(steps)\n ? steps.flatMap((step) => {\n const record = asRecord(step);\n return record ? [record] : [];\n })\n : [];\n};\n\nexport const buildNextStepMessage = (message: string, nextStep: string | null): string => {\n const displayableNextStep = readDisplayableNextStep(nextStep);\n return displayableNextStep ? `${message} Next step: ${displayableNextStep}` : message;\n};\n\nexport const buildProviderFollowupErrorMessage = (message: string): string => {\n const normalized = message.toLowerCase();\n if (normalized.includes(\"next step:\")) return message;\n if (normalized.includes(\"requires login or an existing session\")) {\n return buildNextStepMessage(\n message,\n \"Reuse an authenticated browser session, import logged-in cookies, or use the provider sign-in flow.\"\n );\n }\n if (\n normalized.includes(\"requires manual browser follow-up\")\n || normalized.includes(\"requires a live browser-rendered page\")\n ) {\n return buildNextStepMessage(message, \"Retry with browser assistance or a headed browser session.\");\n }\n return message;\n};\n\nexport const readSuggestedNextAction = (data: unknown): string | null => {\n const record = asRecord(data);\n if (!record) return null;\n return readDisplayableNextStep(record.suggestedNextAction)\n ?? readDisplayableNextStep(asRecord(record.sessionInspector)?.suggestedNextAction);\n};\n\nexport const readSuggestedStepCommand = (data: unknown): string | null => {\n let current = asRecord(data);\n\n while (current) {\n const command = readSuggestedSteps(current)\n .map(readRunnableStepCommand)\n .find((step): step is string => Boolean(step));\n if (command) {\n return command;\n }\n current = asRecord(current.challengePlan);\n }\n\n return null;\n};\n\nexport const readSuggestedStepReason = (data: unknown): string | null => {\n let current = asRecord(data);\n\n while (current) {\n const [firstStep] = readSuggestedSteps(current);\n if (firstStep) {\n return readDisplayableNextStep(firstStep.reason);\n }\n current = asRecord(current.challengePlan);\n }\n\n return null;\n};\n\nexport const readWorkflowGuidanceNextStep = (data: unknown): string | null => (\n readSuggestedNextAction(data) ?? readSuggestedStepCommand(data) ?? readSuggestedStepReason(data)\n);\n\nexport const buildWorkflowCompletionMessage = (workflowLabel: string, data: unknown): string => {\n const explicitSummary = readPrimarySummary(data);\n if (explicitSummary) {\n return buildNextStepMessage(\n `${workflowLabel} completed with provider follow-up required: ${explicitSummary}`,\n readPrimaryNextStep(data) ?? inferPrimaryIssueNextStep(data)\n );\n }\n const inferred = summarizePrimaryProviderIssue(readFailures(data));\n if (inferred) {\n return buildNextStepMessage(\n `${workflowLabel} completed with provider follow-up required: ${inferred.summary}`,\n inferred.guidance?.recommendedNextCommands[0] ?? null\n );\n }\n const followthroughSummary = readFollowthroughSummary(data);\n if (followthroughSummary) {\n return buildNextStepMessage(\n `${workflowLabel} completed. ${followthroughSummary}`,\n readWorkflowGuidanceNextStep(data)\n );\n }\n return `${workflowLabel} completed.`;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// src/extension-extractor.ts
|
|
2
|
+
import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, rmSync, renameSync } from "fs";
|
|
3
|
+
import { dirname, join } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
var EXTENSION_DIR_NAME = "opendevbrowser";
|
|
7
|
+
var VERSION_FILE = ".version";
|
|
8
|
+
function getConfigDir() {
|
|
9
|
+
return join(homedir(), ".config", "opencode", EXTENSION_DIR_NAME, "extension");
|
|
10
|
+
}
|
|
11
|
+
function getPackageVersion() {
|
|
12
|
+
try {
|
|
13
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
|
14
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
15
|
+
return pkg.version || "0.0.0";
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.warn("[opendevbrowser] Failed to read package.json for extension version:", error);
|
|
18
|
+
return "0.0.0";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function getInstalledVersion(destDir) {
|
|
22
|
+
try {
|
|
23
|
+
const versionPath = join(destDir, VERSION_FILE);
|
|
24
|
+
if (existsSync(versionPath)) {
|
|
25
|
+
return readFileSync(versionPath, "utf-8").trim();
|
|
26
|
+
}
|
|
27
|
+
} catch (error) {
|
|
28
|
+
console.warn("[opendevbrowser] Failed to read installed extension version:", error);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
function getBundledExtensionPath() {
|
|
33
|
+
const candidates = [
|
|
34
|
+
join(dirname(fileURLToPath(import.meta.url)), "..", "extension"),
|
|
35
|
+
join(dirname(fileURLToPath(import.meta.url)), "..", "..", "extension")
|
|
36
|
+
];
|
|
37
|
+
for (const candidate of candidates) {
|
|
38
|
+
if (existsSync(join(candidate, "manifest.json"))) {
|
|
39
|
+
return candidate;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function isCompleteInstall(dir) {
|
|
45
|
+
const required = ["manifest.json", VERSION_FILE];
|
|
46
|
+
return required.every((file) => existsSync(join(dir, file)));
|
|
47
|
+
}
|
|
48
|
+
function hasRequiredFiles(dir, requiredFiles) {
|
|
49
|
+
return requiredFiles.every((file) => existsSync(join(dir, file)));
|
|
50
|
+
}
|
|
51
|
+
function extractExtension() {
|
|
52
|
+
const bundledPath = getBundledExtensionPath();
|
|
53
|
+
if (!bundledPath) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const destDir = getConfigDir();
|
|
57
|
+
const currentVersion = getPackageVersion();
|
|
58
|
+
const installedVersion = getInstalledVersion(destDir);
|
|
59
|
+
if (installedVersion === currentVersion && isCompleteInstall(destDir)) {
|
|
60
|
+
return destDir;
|
|
61
|
+
}
|
|
62
|
+
const parentDir = dirname(destDir);
|
|
63
|
+
const stagingDir = join(parentDir, `.opendevbrowser-staging-${process.pid}-${Date.now()}`);
|
|
64
|
+
const backupDir = join(parentDir, `.opendevbrowser-backup-${process.pid}-${Date.now()}`);
|
|
65
|
+
try {
|
|
66
|
+
mkdirSync(stagingDir, { recursive: true });
|
|
67
|
+
const itemsToCopy = ["manifest.json", "popup.html", "canvas.html", "dist", "icons"];
|
|
68
|
+
for (const item of itemsToCopy) {
|
|
69
|
+
const src = join(bundledPath, item);
|
|
70
|
+
const dest = join(stagingDir, item);
|
|
71
|
+
if (existsSync(src)) {
|
|
72
|
+
cpSync(src, dest, { recursive: true, force: true });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
writeFileSync(join(stagingDir, VERSION_FILE), currentVersion, "utf-8");
|
|
76
|
+
if (!isCompleteInstall(stagingDir)) {
|
|
77
|
+
throw new Error("Staging directory incomplete after copy");
|
|
78
|
+
}
|
|
79
|
+
if (existsSync(destDir)) {
|
|
80
|
+
renameSync(destDir, backupDir);
|
|
81
|
+
}
|
|
82
|
+
renameSync(stagingDir, destDir);
|
|
83
|
+
if (existsSync(backupDir)) {
|
|
84
|
+
rmSync(backupDir, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
return destDir;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (existsSync(backupDir) && !existsSync(destDir)) {
|
|
89
|
+
try {
|
|
90
|
+
renameSync(backupDir, destDir);
|
|
91
|
+
} catch (rollbackError) {
|
|
92
|
+
console.warn(`[opendevbrowser] Warning: Rollback failed for ${backupDir}:`, rollbackError);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (existsSync(stagingDir)) {
|
|
96
|
+
try {
|
|
97
|
+
rmSync(stagingDir, { recursive: true, force: true });
|
|
98
|
+
} catch (stagingCleanupError) {
|
|
99
|
+
console.warn(`[opendevbrowser] Warning: Failed to clean up staging directory ${stagingDir}:`, stagingCleanupError);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (existsSync(backupDir)) {
|
|
103
|
+
try {
|
|
104
|
+
rmSync(backupDir, { recursive: true, force: true });
|
|
105
|
+
} catch (backupCleanupError) {
|
|
106
|
+
console.warn(`[opendevbrowser] Warning: Failed to clean up backup directory ${backupDir}:`, backupCleanupError);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function getExtensionPath() {
|
|
113
|
+
const destDir = getConfigDir();
|
|
114
|
+
if (isCompleteInstall(destDir)) {
|
|
115
|
+
return destDir;
|
|
116
|
+
}
|
|
117
|
+
return getBundledExtensionPath();
|
|
118
|
+
}
|
|
119
|
+
function getExtensionRuntimePath(options = {}) {
|
|
120
|
+
const requiredFiles = options.requiredFiles ?? [];
|
|
121
|
+
const destDir = getConfigDir();
|
|
122
|
+
const candidates = [
|
|
123
|
+
options.bundledPath ?? getBundledExtensionPath(),
|
|
124
|
+
options.installedPath ?? (isCompleteInstall(destDir) ? destDir : null)
|
|
125
|
+
];
|
|
126
|
+
const seen = /* @__PURE__ */ new Set();
|
|
127
|
+
for (const candidate of candidates) {
|
|
128
|
+
if (!candidate || seen.has(candidate)) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
seen.add(candidate);
|
|
132
|
+
if (requiredFiles.length === 0 || hasRequiredFiles(candidate, requiredFiles)) {
|
|
133
|
+
return candidate;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
extractExtension,
|
|
141
|
+
getExtensionPath,
|
|
142
|
+
getExtensionRuntimePath
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=chunk-5SWZDVOW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extension-extractor.ts"],"sourcesContent":["import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, rmSync, renameSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst EXTENSION_DIR_NAME = \"opendevbrowser\";\nconst VERSION_FILE = \".version\";\n\nexport type ExtensionRuntimePathOptions = {\n requiredFiles?: string[];\n bundledPath?: string | null;\n installedPath?: string | null;\n};\n\nfunction getConfigDir(): string {\n return join(homedir(), \".config\", \"opencode\", EXTENSION_DIR_NAME, \"extension\");\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read package.json for extension version:\", error);\n return \"0.0.0\";\n }\n}\n\nfunction getInstalledVersion(destDir: string): string | null {\n try {\n const versionPath = join(destDir, VERSION_FILE);\n if (existsSync(versionPath)) {\n return readFileSync(versionPath, \"utf-8\").trim();\n }\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read installed extension version:\", error);\n }\n return null;\n}\n\nfunction getBundledExtensionPath(): string | null {\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"extension\"),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\")\n ];\n for (const candidate of candidates) {\n if (existsSync(join(candidate, \"manifest.json\"))) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction isCompleteInstall(dir: string): boolean {\n const required = [\"manifest.json\", VERSION_FILE];\n return required.every(file => existsSync(join(dir, file)));\n}\n\nfunction hasRequiredFiles(dir: string, requiredFiles: string[]): boolean {\n return requiredFiles.every((file) => existsSync(join(dir, file)));\n}\n\nexport function extractExtension(): string | null {\n const bundledPath = getBundledExtensionPath();\n if (!bundledPath) {\n return null;\n }\n\n const destDir = getConfigDir();\n const currentVersion = getPackageVersion();\n const installedVersion = getInstalledVersion(destDir);\n\n // Early return if version matches and installation is complete\n if (installedVersion === currentVersion && isCompleteInstall(destDir)) {\n return destDir;\n }\n\n // Create staging directory (sibling to destDir for same-device rename)\n const parentDir = dirname(destDir);\n const stagingDir = join(parentDir, `.opendevbrowser-staging-${process.pid}-${Date.now()}`);\n const backupDir = join(parentDir, `.opendevbrowser-backup-${process.pid}-${Date.now()}`);\n\n try {\n // Step 1: Copy to staging\n mkdirSync(stagingDir, { recursive: true });\n const itemsToCopy = [\"manifest.json\", \"popup.html\", \"canvas.html\", \"dist\", \"icons\"];\n for (const item of itemsToCopy) {\n const src = join(bundledPath, item);\n const dest = join(stagingDir, item);\n if (existsSync(src)) {\n cpSync(src, dest, { recursive: true, force: true });\n }\n }\n writeFileSync(join(stagingDir, VERSION_FILE), currentVersion, \"utf-8\");\n\n // Step 2: Validate staging is complete\n if (!isCompleteInstall(stagingDir)) {\n throw new Error(\"Staging directory incomplete after copy\");\n }\n\n // Step 3: Atomic swap\n if (existsSync(destDir)) {\n renameSync(destDir, backupDir);\n }\n renameSync(stagingDir, destDir);\n\n // Step 4: Cleanup backup\n if (existsSync(backupDir)) {\n rmSync(backupDir, { recursive: true, force: true });\n }\n\n return destDir;\n } catch (error) {\n // Rollback: restore backup if it exists\n if (existsSync(backupDir) && !existsSync(destDir)) {\n try {\n renameSync(backupDir, destDir);\n } catch (rollbackError) {\n console.warn(`[opendevbrowser] Warning: Rollback failed for ${backupDir}:`, rollbackError);\n }\n }\n // Cleanup staging\n if (existsSync(stagingDir)) {\n try {\n rmSync(stagingDir, { recursive: true, force: true });\n } catch (stagingCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up staging directory ${stagingDir}:`, stagingCleanupError);\n }\n }\n // Cleanup backup\n if (existsSync(backupDir)) {\n try {\n rmSync(backupDir, { recursive: true, force: true });\n } catch (backupCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up backup directory ${backupDir}:`, backupCleanupError);\n }\n }\n throw error;\n }\n}\n\nexport function getExtensionPath(): string | null {\n const destDir = getConfigDir();\n if (isCompleteInstall(destDir)) {\n return destDir;\n }\n return getBundledExtensionPath();\n}\n\nexport function getExtensionRuntimePath(options: ExtensionRuntimePathOptions = {}): string | null {\n const requiredFiles = options.requiredFiles ?? [];\n const destDir = getConfigDir();\n const candidates = [\n options.bundledPath ?? getBundledExtensionPath(),\n options.installedPath ?? (isCompleteInstall(destDir) ? destDir : null)\n ];\n const seen = new Set<string>();\n for (const candidate of candidates) {\n if (!candidate || seen.has(candidate)) {\n continue;\n }\n seen.add(candidate);\n if (requiredFiles.length === 0 || hasRequiredFiles(candidate, requiredFiles)) {\n return candidate;\n }\n }\n return null;\n}\n"],"mappings":"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","names":[]}
|