opendevbrowser 0.0.30 → 0.0.32
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 +20 -7
- package/dist/{accessibility-snapshot-CQ4ZKWKC.js → accessibility-snapshot-XOP66CSK.js} +11 -11
- package/dist/{active-window-TD5HYJ72.js → active-window-E3WFOQGX.js} +11 -11
- package/dist/{annotate-VTLFS2XV.js → annotate-MAE7ZJOZ.js} +10 -10
- package/dist/{artifacts-KJ6RNDO2.js → artifacts-JHDUUJGQ.js} +2 -2
- package/dist/{attr-BCI5KYCW.js → attr-M3PFDJ7Q.js} +10 -10
- package/dist/{canvas-5DFEEOKM.js → canvas-3AJVL5I5.js} +10 -10
- package/dist/{capture-desktop-HFTTWY4Z.js → capture-desktop-VJGEETMJ.js} +11 -11
- package/dist/{capture-window-X63XPIFF.js → capture-window-W5UFSFQL.js} +11 -11
- package/dist/{check-LWAUY7GC.js → check-4IR3UJVW.js} +10 -10
- package/dist/{checked-ZSOUKVYT.js → checked-PKNY7724.js} +10 -10
- package/dist/{chunk-KZ2IXVQT.js → chunk-2X4JFMKJ.js} +39 -4
- package/dist/chunk-2X4JFMKJ.js.map +1 -0
- package/dist/{chunk-IPE7TF2P.js → chunk-7BNU6DFI.js} +8 -5
- package/dist/chunk-7BNU6DFI.js.map +1 -0
- package/dist/{chunk-J47N77VG.js → chunk-AKIAGFOE.js} +31 -8
- package/dist/chunk-AKIAGFOE.js.map +1 -0
- package/dist/{chunk-RCZZGGJS.js → chunk-AWQ37HSC.js} +7 -3
- package/dist/chunk-AWQ37HSC.js.map +1 -0
- package/dist/{chunk-3ILXPKSJ.js → chunk-BUVYTJZR.js} +2 -1
- package/dist/chunk-BUVYTJZR.js.map +1 -0
- package/dist/{chunk-AHEWXOKY.js → chunk-BUXFIY2P.js} +4 -4
- package/dist/{chunk-QOMWCRE3.js → chunk-HBK56JST.js} +3 -3
- package/dist/{chunk-T4GMCW6Z.js → chunk-J3KYGJRQ.js} +3 -3
- package/dist/{chunk-6PVZ2ABC.js → chunk-L3YNUGYF.js} +2 -2
- package/dist/{chunk-JZXD6FWR.js → chunk-NURQB55J.js} +2 -2
- package/dist/{chunk-GQJ5S3BL.js → chunk-P5K3ZIPI.js} +3 -3
- package/dist/{chunk-PPUWQKIC.js → chunk-PIFHXKV4.js} +4 -4
- package/dist/{chunk-STGGGVYT.js → chunk-QMHKAFYX.js} +2 -2
- package/dist/{chunk-4BEJVZRK.js → chunk-RO3SMXF3.js} +1073 -138
- package/dist/chunk-RO3SMXF3.js.map +1 -0
- package/dist/{chunk-RPXWUCQQ.js → chunk-SKFB5ICF.js} +2 -2
- package/dist/{chunk-2SIMIPLY.js → chunk-W6YPVNDX.js} +3 -3
- package/dist/{chunk-MD655IPO.js → chunk-XDLJE3RJ.js} +11 -4
- package/dist/chunk-XDLJE3RJ.js.map +1 -0
- package/dist/{chunk-KDSNXS6N.js → chunk-ZMNEWS7A.js} +2 -2
- package/dist/{chunk-COAOWH3G.js → chunk-ZOVMMQO6.js} +119 -27
- package/dist/chunk-ZOVMMQO6.js.map +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/commands/daemon.d.ts +19 -2
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/inspiredesign.d.ts +6 -1
- package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
- package/dist/cli/commands/serve.d.ts +12 -3
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/types.d.ts +1 -0
- package/dist/cli/commands/types.d.ts.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/daemon-client.d.ts.map +1 -1
- package/dist/cli/daemon-commands.d.ts.map +1 -1
- package/dist/cli/daemon-mismatch.d.ts +9 -0
- package/dist/cli/daemon-mismatch.d.ts.map +1 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/errors.d.ts +4 -2
- package/dist/cli/errors.d.ts.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/index.js +91 -90
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installers/postinstall-skill-sync.js +2 -2
- package/dist/{click-2AILSEIZ.js → click-HLNXU4I5.js} +10 -10
- package/dist/{clone-component-TPJS3PEG.js → clone-component-QIKN5PIM.js} +9 -9
- package/dist/{clone-page-LE74CIFC.js → clone-page-5C7DTGZT.js} +9 -9
- package/dist/{close-HN4YI47K.js → close-PCRZHX7F.js} +9 -9
- package/dist/{close-WFERRHX6.js → close-WTXB3EDD.js} +9 -9
- package/dist/{connect-RWBV2UCQ.js → connect-6C2IG55I.js} +10 -10
- package/dist/{console-poll-PP4YYPDF.js → console-poll-VJXCZR3F.js} +10 -10
- package/dist/{cookie-import-6IP776FC.js → cookie-import-5OEDFB6U.js} +9 -9
- package/dist/{cookie-list-O2KG6DPU.js → cookie-list-44UNJJ6D.js} +9 -9
- package/dist/{daemon-2BSAZXLT.js → daemon-CIKGBWEB.js} +25 -12
- package/dist/daemon-CIKGBWEB.js.map +1 -0
- package/dist/daemon-fingerprint.json +1 -1
- package/dist/{debug-trace-snapshot-F3BDVZXS.js → debug-trace-snapshot-RGXAPGWB.js} +10 -10
- package/dist/{dialog-6JQYUWMQ.js → dialog-S64MJUM2.js} +10 -10
- package/dist/{disconnect-763TP7GH.js → disconnect-MTIELIM7.js} +9 -9
- package/dist/{enabled-DLYQFNIP.js → enabled-KF2L7LW4.js} +10 -10
- package/dist/{goto-S346TJJH.js → goto-ULWINUAZ.js} +10 -10
- package/dist/{help-EKKKEDL5.js → help-IG5S5RJD.js} +14 -10
- package/dist/help-IG5S5RJD.js.map +1 -0
- package/dist/{hover-6JVJFGO7.js → hover-NOCOTR6N.js} +10 -10
- package/dist/{html-EVOSPBIT.js → html-LXSYP6BT.js} +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -17
- package/dist/index.js.map +1 -1
- package/dist/{inspector-H57BVUJP.js → inspector-62EPCLYB.js} +11 -11
- package/dist/{inspector-audit-NQBAJWC7.js → inspector-audit-T2IF67RJ.js} +13 -13
- package/dist/{inspector-plan-ZDIQVND3.js → inspector-plan-KQS6LRMW.js} +11 -11
- package/dist/inspiredesign/capture.d.ts +4 -0
- package/dist/inspiredesign/capture.d.ts.map +1 -1
- package/dist/inspiredesign/contract.d.ts +22 -0
- package/dist/inspiredesign/contract.d.ts.map +1 -1
- package/dist/inspiredesign/handoff.d.ts +7 -1
- package/dist/inspiredesign/handoff.d.ts.map +1 -1
- package/dist/inspiredesign/meta-prompt.d.ts +9 -0
- package/dist/inspiredesign/meta-prompt.d.ts.map +1 -0
- package/dist/inspiredesign/reference-discovery.d.ts +29 -0
- package/dist/inspiredesign/reference-discovery.d.ts.map +1 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts +21 -0
- package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
- package/dist/inspiredesign/visual-evidence.d.ts +46 -0
- package/dist/inspiredesign/visual-evidence.d.ts.map +1 -0
- package/dist/inspiredesign/visual-policy.d.ts +17 -0
- package/dist/inspiredesign/visual-policy.d.ts.map +1 -0
- package/dist/{inspiredesign-IEUL4PX3.js → inspiredesign-DB6CHYN3.js} +71 -19
- package/dist/inspiredesign-DB6CHYN3.js.map +1 -0
- package/dist/{launch-EK66VQPF.js → launch-B5ES6FVS.js} +10 -10
- package/dist/{list-KKUKN467.js → list-TIZVR6RO.js} +9 -9
- package/dist/{list-ADZAQ2IU.js → list-XM4BP5GM.js} +9 -9
- package/dist/{macro-resolve-6DOQJ7CA.js → macro-resolve-TTQZVFIW.js} +10 -10
- package/dist/{native-UPLVQ2SG.js → native-J2DFLOLP.js} +3 -3
- package/dist/{network-poll-NUL4PDPY.js → network-poll-NNSY4W63.js} +10 -10
- package/dist/{new-5NKYPEFT.js → new-E6VNAC2A.js} +9 -9
- package/dist/{open-NR3BPLXV.js → open-F55XKMKB.js} +9 -9
- package/dist/opendevbrowser.d.ts.map +1 -1
- package/dist/opendevbrowser.js +46 -17
- package/dist/opendevbrowser.js.map +1 -1
- package/dist/{perf-HJ36ZI6H.js → perf-RE7JE6CP.js} +10 -10
- package/dist/{pointer-down-IYTTQWXZ.js → pointer-down-BCBPC5FJ.js} +11 -11
- package/dist/{pointer-drag-A2YC5PWI.js → pointer-drag-QK7KGF7W.js} +11 -11
- package/dist/{pointer-move-W5K5FUI4.js → pointer-move-VFAZQAXA.js} +11 -11
- package/dist/{pointer-up-6GWVO64Y.js → pointer-up-FA5WE6LS.js} +11 -11
- package/dist/{press-A3V5WB3S.js → press-TNRHNDSW.js} +10 -10
- package/dist/{product-video-52REKWF3.js → product-video-UEANMZ2U.js} +11 -11
- package/dist/providers/renderer.d.ts +7 -1
- package/dist/providers/renderer.d.ts.map +1 -1
- package/dist/providers/workflow-handoff.d.ts +1 -0
- package/dist/providers/workflow-handoff.d.ts.map +1 -1
- package/dist/providers/workflows.d.ts +45 -3
- package/dist/providers/workflows.d.ts.map +1 -1
- package/dist/{providers-IMFYMMHQ.js → providers-AMCNWZUL.js} +3 -3
- package/dist/public-surface/generated-manifest.d.ts +12 -3
- package/dist/public-surface/generated-manifest.d.ts.map +1 -1
- package/dist/public-surface/source.d.ts +6 -6
- package/dist/public-surface/source.d.ts.map +1 -1
- package/dist/{research-WB6BBCDD.js → research-YFY7WJSZ.js} +11 -11
- package/dist/{review-BGWVY4RA.js → review-NHOPLAT7.js} +11 -11
- package/dist/{review-desktop-LEORC5VS.js → review-desktop-OFWPDYGD.js} +11 -11
- package/dist/{rpc-4TSKSFGC.js → rpc-TVVQPUOL.js} +10 -10
- package/dist/{run-3NBLVWXD.js → run-OCBEZRDW.js} +8 -8
- package/dist/{screencast-start-UZVIT3IN.js → screencast-start-GTSDA33J.js} +10 -10
- package/dist/{screencast-stop-NOSJSIUO.js → screencast-stop-FYBUIXAA.js} +10 -10
- package/dist/{screenshot-LARG4JQG.js → screenshot-OEYRT3SP.js} +10 -10
- package/dist/{scroll-VNFMV6TW.js → scroll-35OFEFC5.js} +10 -10
- package/dist/{scroll-into-view-VYRT3JPT.js → scroll-into-view-UQ5RAWIX.js} +10 -10
- package/dist/{select-KJTUZDVO.js → select-K56QELVZ.js} +10 -10
- package/dist/{serve-EV7K4HKR.js → serve-5UJ3VMWC.js} +48 -24
- package/dist/serve-5UJ3VMWC.js.map +1 -0
- package/dist/{shopping-DTXHVQ2X.js → shopping-FJG7XB4Q.js} +11 -11
- package/dist/{skill-lifecycle-5UAZGKSN.js → skill-lifecycle-OWZYBPFS.js} +3 -3
- package/dist/skills/bundled-skill-directories.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +2 -2
- package/dist/{skills-NSXDX6YM.js → skills-KHMRNOE4.js} +3 -3
- package/dist/{snapshot-3XQMCMRJ.js → snapshot-W7RKVZEI.js} +10 -10
- package/dist/{status-YUMDP5KY.js → status-KHYCLGUD.js} +20 -12
- package/dist/status-KHYCLGUD.js.map +1 -0
- package/dist/{status-OXSYA5XD.js → status-R4EV4TWO.js} +11 -11
- package/dist/{status-capabilities-P4KDSE2Y.js → status-capabilities-XD3RGLKF.js} +11 -11
- package/dist/{text-V3B7UVIH.js → text-TANLFZ4O.js} +10 -10
- package/dist/tools/inspiredesign_run.d.ts.map +1 -1
- package/dist/{type-IYBN3ZLR.js → type-Y2Y7LX7Y.js} +10 -10
- package/dist/{uncheck-SG737EGI.js → uncheck-6REVUUB2.js} +10 -10
- package/dist/{uninstall-KYKGJAX7.js → uninstall-FW5ORBIN.js} +3 -3
- package/dist/{update-SMXPYGXS.js → update-FZGSXB74.js} +6 -2
- package/dist/update-FZGSXB74.js.map +1 -0
- package/dist/{update-skill-modes-BVX7IVMW.js → update-skill-modes-3ULKJK3Y.js} +3 -3
- package/dist/{upload-KH6ZABJA.js → upload-GGZC5UQP.js} +10 -10
- package/dist/{use-7YDKO3U4.js → use-B4Q7CFG2.js} +9 -9
- package/dist/{value-RZBWSKKM.js → value-DHOHO55D.js} +10 -10
- package/dist/{visible-BSFTAKXR.js → visible-S5BTWYNH.js} +10 -10
- package/dist/{wait-TMTEAYOP.js → wait-WV6NZUKL.js} +10 -10
- package/dist/{windows-HIZ23OHS.js → windows-GKE36DJQ.js} +11 -11
- package/extension/manifest.json +1 -1
- package/package.json +1 -1
- package/skills/AGENTS.md +2 -1
- package/skills/opendevbrowser-best-practices/SKILL.md +9 -2
- package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +4 -3
- package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +7 -0
- package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +49 -3
- package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +24 -2
- package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +1 -0
- package/skills/opendevbrowser-design-agent/SKILL.md +3 -0
- package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +85 -40
- package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +2 -0
- package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +20 -5
- package/skills/opendevbrowser-motion-design/SKILL.md +129 -0
- package/skills/opendevbrowser-motion-design/artifacts/accessibility-reduced-motion.md +37 -0
- package/skills/opendevbrowser-motion-design/artifacts/device-breakpoint-posture.md +40 -0
- package/skills/opendevbrowser-motion-design/artifacts/motion-anti-patterns.md +29 -0
- package/skills/opendevbrowser-motion-design/artifacts/motion-pattern-catalog.md +430 -0
- package/skills/opendevbrowser-motion-design/artifacts/motion-release-gate.md +28 -0
- package/skills/opendevbrowser-motion-design/artifacts/motion-terminology.md +46 -0
- package/skills/opendevbrowser-motion-design/artifacts/open-dev-browser-motion-evidence.md +48 -0
- package/skills/opendevbrowser-motion-design/artifacts/performance-frame-budget.md +38 -0
- package/skills/opendevbrowser-motion-design/artifacts/platform-framework-guide.md +166 -0
- package/skills/opendevbrowser-motion-design/assets/templates/motion-audit-report.v1.md +70 -0
- package/skills/opendevbrowser-motion-design/assets/templates/motion-contract.v1.json +79 -0
- package/skills/opendevbrowser-motion-design/assets/templates/motion-release-gate.v1.json +18 -0
- package/skills/opendevbrowser-motion-design/assets/templates/motion-viewport-matrix.v1.json +76 -0
- package/skills/opendevbrowser-motion-design/scripts/motion-workflow.sh +163 -0
- package/skills/opendevbrowser-motion-design/scripts/validate-skill-assets.sh +374 -0
- package/dist/chunk-3ILXPKSJ.js.map +0 -1
- package/dist/chunk-4BEJVZRK.js.map +0 -1
- package/dist/chunk-COAOWH3G.js.map +0 -1
- package/dist/chunk-IPE7TF2P.js.map +0 -1
- package/dist/chunk-J47N77VG.js.map +0 -1
- package/dist/chunk-KZ2IXVQT.js.map +0 -1
- package/dist/chunk-MD655IPO.js.map +0 -1
- package/dist/chunk-RCZZGGJS.js.map +0 -1
- package/dist/daemon-2BSAZXLT.js.map +0 -1
- package/dist/help-EKKKEDL5.js.map +0 -1
- package/dist/inspiredesign-IEUL4PX3.js.map +0 -1
- package/dist/serve-EV7K4HKR.js.map +0 -1
- package/dist/status-YUMDP5KY.js.map +0 -1
- package/dist/update-SMXPYGXS.js.map +0 -1
- /package/dist/{accessibility-snapshot-CQ4ZKWKC.js.map → accessibility-snapshot-XOP66CSK.js.map} +0 -0
- /package/dist/{active-window-TD5HYJ72.js.map → active-window-E3WFOQGX.js.map} +0 -0
- /package/dist/{annotate-VTLFS2XV.js.map → annotate-MAE7ZJOZ.js.map} +0 -0
- /package/dist/{artifacts-KJ6RNDO2.js.map → artifacts-JHDUUJGQ.js.map} +0 -0
- /package/dist/{attr-BCI5KYCW.js.map → attr-M3PFDJ7Q.js.map} +0 -0
- /package/dist/{canvas-5DFEEOKM.js.map → canvas-3AJVL5I5.js.map} +0 -0
- /package/dist/{capture-desktop-HFTTWY4Z.js.map → capture-desktop-VJGEETMJ.js.map} +0 -0
- /package/dist/{capture-window-X63XPIFF.js.map → capture-window-W5UFSFQL.js.map} +0 -0
- /package/dist/{check-LWAUY7GC.js.map → check-4IR3UJVW.js.map} +0 -0
- /package/dist/{checked-ZSOUKVYT.js.map → checked-PKNY7724.js.map} +0 -0
- /package/dist/{chunk-AHEWXOKY.js.map → chunk-BUXFIY2P.js.map} +0 -0
- /package/dist/{chunk-QOMWCRE3.js.map → chunk-HBK56JST.js.map} +0 -0
- /package/dist/{chunk-T4GMCW6Z.js.map → chunk-J3KYGJRQ.js.map} +0 -0
- /package/dist/{chunk-6PVZ2ABC.js.map → chunk-L3YNUGYF.js.map} +0 -0
- /package/dist/{chunk-JZXD6FWR.js.map → chunk-NURQB55J.js.map} +0 -0
- /package/dist/{chunk-GQJ5S3BL.js.map → chunk-P5K3ZIPI.js.map} +0 -0
- /package/dist/{chunk-PPUWQKIC.js.map → chunk-PIFHXKV4.js.map} +0 -0
- /package/dist/{chunk-STGGGVYT.js.map → chunk-QMHKAFYX.js.map} +0 -0
- /package/dist/{chunk-RPXWUCQQ.js.map → chunk-SKFB5ICF.js.map} +0 -0
- /package/dist/{chunk-2SIMIPLY.js.map → chunk-W6YPVNDX.js.map} +0 -0
- /package/dist/{chunk-KDSNXS6N.js.map → chunk-ZMNEWS7A.js.map} +0 -0
- /package/dist/{click-2AILSEIZ.js.map → click-HLNXU4I5.js.map} +0 -0
- /package/dist/{clone-component-TPJS3PEG.js.map → clone-component-QIKN5PIM.js.map} +0 -0
- /package/dist/{clone-page-LE74CIFC.js.map → clone-page-5C7DTGZT.js.map} +0 -0
- /package/dist/{close-HN4YI47K.js.map → close-PCRZHX7F.js.map} +0 -0
- /package/dist/{close-WFERRHX6.js.map → close-WTXB3EDD.js.map} +0 -0
- /package/dist/{connect-RWBV2UCQ.js.map → connect-6C2IG55I.js.map} +0 -0
- /package/dist/{console-poll-PP4YYPDF.js.map → console-poll-VJXCZR3F.js.map} +0 -0
- /package/dist/{cookie-import-6IP776FC.js.map → cookie-import-5OEDFB6U.js.map} +0 -0
- /package/dist/{cookie-list-O2KG6DPU.js.map → cookie-list-44UNJJ6D.js.map} +0 -0
- /package/dist/{debug-trace-snapshot-F3BDVZXS.js.map → debug-trace-snapshot-RGXAPGWB.js.map} +0 -0
- /package/dist/{dialog-6JQYUWMQ.js.map → dialog-S64MJUM2.js.map} +0 -0
- /package/dist/{disconnect-763TP7GH.js.map → disconnect-MTIELIM7.js.map} +0 -0
- /package/dist/{enabled-DLYQFNIP.js.map → enabled-KF2L7LW4.js.map} +0 -0
- /package/dist/{goto-S346TJJH.js.map → goto-ULWINUAZ.js.map} +0 -0
- /package/dist/{hover-6JVJFGO7.js.map → hover-NOCOTR6N.js.map} +0 -0
- /package/dist/{html-EVOSPBIT.js.map → html-LXSYP6BT.js.map} +0 -0
- /package/dist/{inspector-H57BVUJP.js.map → inspector-62EPCLYB.js.map} +0 -0
- /package/dist/{inspector-audit-NQBAJWC7.js.map → inspector-audit-T2IF67RJ.js.map} +0 -0
- /package/dist/{inspector-plan-ZDIQVND3.js.map → inspector-plan-KQS6LRMW.js.map} +0 -0
- /package/dist/{launch-EK66VQPF.js.map → launch-B5ES6FVS.js.map} +0 -0
- /package/dist/{list-KKUKN467.js.map → list-TIZVR6RO.js.map} +0 -0
- /package/dist/{list-ADZAQ2IU.js.map → list-XM4BP5GM.js.map} +0 -0
- /package/dist/{macro-resolve-6DOQJ7CA.js.map → macro-resolve-TTQZVFIW.js.map} +0 -0
- /package/dist/{native-UPLVQ2SG.js.map → native-J2DFLOLP.js.map} +0 -0
- /package/dist/{network-poll-NUL4PDPY.js.map → network-poll-NNSY4W63.js.map} +0 -0
- /package/dist/{new-5NKYPEFT.js.map → new-E6VNAC2A.js.map} +0 -0
- /package/dist/{open-NR3BPLXV.js.map → open-F55XKMKB.js.map} +0 -0
- /package/dist/{perf-HJ36ZI6H.js.map → perf-RE7JE6CP.js.map} +0 -0
- /package/dist/{pointer-down-IYTTQWXZ.js.map → pointer-down-BCBPC5FJ.js.map} +0 -0
- /package/dist/{pointer-drag-A2YC5PWI.js.map → pointer-drag-QK7KGF7W.js.map} +0 -0
- /package/dist/{pointer-move-W5K5FUI4.js.map → pointer-move-VFAZQAXA.js.map} +0 -0
- /package/dist/{pointer-up-6GWVO64Y.js.map → pointer-up-FA5WE6LS.js.map} +0 -0
- /package/dist/{press-A3V5WB3S.js.map → press-TNRHNDSW.js.map} +0 -0
- /package/dist/{product-video-52REKWF3.js.map → product-video-UEANMZ2U.js.map} +0 -0
- /package/dist/{providers-IMFYMMHQ.js.map → providers-AMCNWZUL.js.map} +0 -0
- /package/dist/{research-WB6BBCDD.js.map → research-YFY7WJSZ.js.map} +0 -0
- /package/dist/{review-BGWVY4RA.js.map → review-NHOPLAT7.js.map} +0 -0
- /package/dist/{review-desktop-LEORC5VS.js.map → review-desktop-OFWPDYGD.js.map} +0 -0
- /package/dist/{rpc-4TSKSFGC.js.map → rpc-TVVQPUOL.js.map} +0 -0
- /package/dist/{run-3NBLVWXD.js.map → run-OCBEZRDW.js.map} +0 -0
- /package/dist/{screencast-start-UZVIT3IN.js.map → screencast-start-GTSDA33J.js.map} +0 -0
- /package/dist/{screencast-stop-NOSJSIUO.js.map → screencast-stop-FYBUIXAA.js.map} +0 -0
- /package/dist/{screenshot-LARG4JQG.js.map → screenshot-OEYRT3SP.js.map} +0 -0
- /package/dist/{scroll-VNFMV6TW.js.map → scroll-35OFEFC5.js.map} +0 -0
- /package/dist/{scroll-into-view-VYRT3JPT.js.map → scroll-into-view-UQ5RAWIX.js.map} +0 -0
- /package/dist/{select-KJTUZDVO.js.map → select-K56QELVZ.js.map} +0 -0
- /package/dist/{shopping-DTXHVQ2X.js.map → shopping-FJG7XB4Q.js.map} +0 -0
- /package/dist/{skill-lifecycle-5UAZGKSN.js.map → skill-lifecycle-OWZYBPFS.js.map} +0 -0
- /package/dist/{skills-NSXDX6YM.js.map → skills-KHMRNOE4.js.map} +0 -0
- /package/dist/{snapshot-3XQMCMRJ.js.map → snapshot-W7RKVZEI.js.map} +0 -0
- /package/dist/{status-OXSYA5XD.js.map → status-R4EV4TWO.js.map} +0 -0
- /package/dist/{status-capabilities-P4KDSE2Y.js.map → status-capabilities-XD3RGLKF.js.map} +0 -0
- /package/dist/{text-V3B7UVIH.js.map → text-TANLFZ4O.js.map} +0 -0
- /package/dist/{type-IYBN3ZLR.js.map → type-Y2Y7LX7Y.js.map} +0 -0
- /package/dist/{uncheck-SG737EGI.js.map → uncheck-6REVUUB2.js.map} +0 -0
- /package/dist/{uninstall-KYKGJAX7.js.map → uninstall-FW5ORBIN.js.map} +0 -0
- /package/dist/{update-skill-modes-BVX7IVMW.js.map → update-skill-modes-3ULKJK3Y.js.map} +0 -0
- /package/dist/{upload-KH6ZABJA.js.map → upload-GGZC5UQP.js.map} +0 -0
- /package/dist/{use-7YDKO3U4.js.map → use-B4Q7CFG2.js.map} +0 -0
- /package/dist/{value-RZBWSKKM.js.map → value-DHOHO55D.js.map} +0 -0
- /package/dist/{visible-BSFTAKXR.js.map → visible-S5BTWYNH.js.map} +0 -0
- /package/dist/{wait-TMTEAYOP.js.map → wait-WV6NZUKL.js.map} +0 -0
- /package/dist/{windows-HIZ23OHS.js.map → windows-GKE36DJQ.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createUsageError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-7BNU6DFI.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/utils/parse.ts
|
|
6
6
|
var SIGNED_INTEGER_PATTERN = /^-?\d+$/;
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
parseStringArrayFlag,
|
|
110
110
|
parseRepeatedStringFlag
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=chunk-
|
|
112
|
+
//# sourceMappingURL=chunk-SKFB5ICF.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseNumberFlag
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SKFB5ICF.js";
|
|
4
4
|
import {
|
|
5
5
|
createUsageError
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-7BNU6DFI.js";
|
|
7
7
|
|
|
8
8
|
// src/cli/commands/session/inspector-shared.ts
|
|
9
9
|
function parseSessionInspectorArgs(rawArgs) {
|
|
@@ -64,4 +64,4 @@ function readStringFlag(rawArgs, index, flag) {
|
|
|
64
64
|
export {
|
|
65
65
|
parseSessionInspectorArgs
|
|
66
66
|
};
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
67
|
+
//# sourceMappingURL=chunk-W6YPVNDX.js.map
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
DAEMON_FINGERPRINT_MISMATCH_REASON,
|
|
2
3
|
DAEMON_STOP_DEBUG_ENV,
|
|
4
|
+
buildDaemonFingerprintMismatchMessage,
|
|
3
5
|
createDaemonStopHeaders,
|
|
4
6
|
fetchDaemonStatus,
|
|
5
7
|
fetchWithTimeout,
|
|
@@ -11,7 +13,7 @@ import {
|
|
|
11
13
|
readResponseJsonWithTimeout,
|
|
12
14
|
readResponseTextWithTimeout,
|
|
13
15
|
resolveCurrentDaemonEntrypointPath
|
|
14
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ZOVMMQO6.js";
|
|
15
17
|
import {
|
|
16
18
|
loadGlobalConfig
|
|
17
19
|
} from "./chunk-MX3NFLCE.js";
|
|
@@ -19,7 +21,7 @@ import {
|
|
|
19
21
|
CliError,
|
|
20
22
|
EXIT_EXECUTION,
|
|
21
23
|
createDisconnectedError
|
|
22
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-7BNU6DFI.js";
|
|
23
25
|
import {
|
|
24
26
|
writeFileAtomic
|
|
25
27
|
} from "./chunk-TBUCZX4A.js";
|
|
@@ -742,7 +744,12 @@ var resolveFreshDaemonConnection = async (budget = null, options = {}) => {
|
|
|
742
744
|
);
|
|
743
745
|
if (stopOutcome === "fingerprint_rejected") {
|
|
744
746
|
throw createDisconnectedError(
|
|
745
|
-
|
|
747
|
+
buildDaemonFingerprintMismatchMessage({
|
|
748
|
+
label: "Daemon",
|
|
749
|
+
port: staleConnection.connection.port,
|
|
750
|
+
pid: staleConnection.status.pid
|
|
751
|
+
}),
|
|
752
|
+
DAEMON_FINGERPRINT_MISMATCH_REASON
|
|
746
753
|
);
|
|
747
754
|
}
|
|
748
755
|
}
|
|
@@ -835,4 +842,4 @@ export {
|
|
|
835
842
|
DaemonClient,
|
|
836
843
|
callDaemon
|
|
837
844
|
};
|
|
838
|
-
//# sourceMappingURL=chunk-
|
|
845
|
+
//# sourceMappingURL=chunk-XDLJE3RJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/daemon-client.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { fileURLToPath } from \"url\";\nimport {\n DAEMON_STOP_DEBUG_ENV,\n createDaemonStopHeaders,\n getCacheRoot,\n isCurrentDaemonFingerprint,\n readDaemonMetadata,\n resolveCurrentDaemonEntrypointPath\n} from \"./daemon\";\nimport { CliError, createDisconnectedError, EXIT_EXECUTION } from \"./errors\";\nimport { writeFileAtomic } from \"../utils/fs\";\nimport { loadGlobalConfig } from \"../config\";\nimport {\n fetchDaemonStatus,\n persistDaemonStatusMetadata,\n type DaemonStatusFetchOptions,\n type DaemonStatusPayload\n} from \"./daemon-status\";\nimport {\n buildDaemonFingerprintMismatchMessage,\n DAEMON_FINGERPRINT_MISMATCH_REASON\n} from \"./daemon-mismatch\";\nimport {\n fetchWithTimeout,\n fetchWithTimeoutContext,\n readResponseJsonWithTimeout,\n readResponseTextWithTimeout,\n type TimedFetchResponse\n} from \"./utils/http\";\n\nconst CLIENT_ID_FILE = \"client.json\";\nconst DEFAULT_RENEW_AFTER_MS = 20_000;\nconst MIN_RENEW_AFTER_MS = 5_000;\nconst TRANSPORT_TIMEOUT_BUFFER_MS = 5_000;\nconst MAX_DERIVED_TRANSPORT_TIMEOUT_MS = 300_000;\nconst TRANSPORT_TIMEOUT_HINT_KEYS = [\"timeoutMs\", \"waitTimeoutMs\"] as const;\nconst DAEMON_STATUS_RETRY_OPTIONS: DaemonStatusFetchOptions = {\n retryAttempts: 5,\n retryDelayMs: 250\n};\nconst DAEMON_CONFIG_PREFER_OPTIONS: DaemonStatusFetchOptions = {\n timeoutMs: 500,\n retryAttempts: 3,\n retryDelayMs: 250\n};\nconst DAEMON_RESTART_STATUS_TIMEOUT_MS = 5_000;\nconst DAEMON_RECOVERY_READY_TIMEOUT_MS = 5_000;\nconst DAEMON_RESTART_READY_TIMEOUT_MS = 15_000;\nconst DAEMON_RESTART_POLL_DELAY_MS = 250;\n\ntype DaemonResponse<T> = { ok?: boolean; data?: T; error?: string };\n\ntype BindingConfig = {\n ttlMs: number;\n renewIntervalMs: number;\n graceMs: number;\n waitMaxMs: number;\n};\n\ntype BindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs?: number;\n renewAfterMs?: number;\n};\n\ntype QueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs?: number;\n};\n\ntype RelayBindResponse = (BindingResponse | QueueResponse) & {\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayPort?: number | null;\n bindingConfig?: BindingConfig;\n};\n\ntype BindingState = {\n bindingId: string;\n expiresAtMs: number;\n renewAfterMs: number;\n};\n\ntype CachedBindingState = {\n bindingId: string;\n expiresAt: string;\n renewAfterMs?: number;\n};\n\ntype CachedClientState = {\n clientId: string;\n createdAt: string;\n binding?: CachedBindingState;\n};\n\ntype CallOptions = {\n requireBinding?: boolean;\n timeoutMs?: number;\n};\n\nlet cachedClientState: CachedClientState | null | undefined;\n\nconst logDaemonStopDebug = (message: string, details?: Record<string, unknown>): void => {\n if (process.env[DAEMON_STOP_DEBUG_ENV] !== \"1\") {\n return;\n }\n const suffix = details ? ` ${JSON.stringify(details)}` : \"\";\n console.error(`[daemon-stop-debug] ${message}${suffix}`);\n};\n\nconst getClientStateFilePath = (): string => {\n const cacheRoot = getCacheRoot();\n return join(cacheRoot, CLIENT_ID_FILE);\n};\n\nconst readCachedClientState = (): CachedClientState | null => {\n if (cachedClientState !== undefined) {\n return cachedClientState;\n }\n\n const filePath = getClientStateFilePath();\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content) as {\n clientId?: unknown;\n createdAt?: unknown;\n binding?: unknown;\n };\n if (typeof parsed.clientId === \"string\" && parsed.clientId.trim()) {\n cachedClientState = {\n clientId: parsed.clientId.trim(),\n createdAt: typeof parsed.createdAt === \"string\" && parsed.createdAt.trim()\n ? parsed.createdAt\n : new Date().toISOString(),\n ...(parsed.binding && typeof parsed.binding === \"object\"\n ? { binding: parsed.binding as CachedBindingState }\n : {})\n };\n return cachedClientState;\n }\n } catch {\n // fallthrough to regenerate\n }\n }\n\n cachedClientState = null;\n return cachedClientState;\n};\n\nconst writeCachedClientState = (state: CachedClientState): void => {\n const filePath = getClientStateFilePath();\n writeFileAtomic(filePath, JSON.stringify(state, null, 2), { mode: 0o600 });\n cachedClientState = state;\n};\n\nconst loadClientState = (): CachedClientState => {\n const existing = readCachedClientState();\n if (existing) {\n return existing;\n }\n\n const state = {\n clientId: randomUUID(),\n createdAt: new Date().toISOString()\n };\n writeCachedClientState(state);\n return state;\n};\n\nconst parseBindingResponse = (data: BindingResponse): BindingState => {\n const expiresAtMs = Date.parse(data.expiresAt);\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"Invalid binding expiry timestamp\");\n }\n const renewAfterMs = Math.max(\n MIN_RENEW_AFTER_MS,\n typeof data.renewAfterMs === \"number\" && Number.isFinite(data.renewAfterMs)\n ? data.renewAfterMs\n : DEFAULT_RENEW_AFTER_MS\n );\n return {\n bindingId: data.bindingId,\n expiresAtMs,\n renewAfterMs\n };\n};\n\nconst serializeBindingState = (binding: BindingState): CachedBindingState => ({\n bindingId: binding.bindingId,\n expiresAt: new Date(binding.expiresAtMs).toISOString(),\n renewAfterMs: binding.renewAfterMs\n});\n\nconst updateCachedBindingState = (clientId: string, binding: BindingState | null): void => {\n const current = loadClientState();\n const base: CachedClientState = current.clientId === clientId\n ? current\n : { clientId, createdAt: new Date().toISOString() };\n if (binding) {\n writeCachedClientState({\n ...base,\n binding: serializeBindingState(binding)\n });\n return;\n }\n writeCachedClientState({\n clientId: base.clientId,\n createdAt: base.createdAt\n });\n};\n\nconst isBindingRequiredError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_BINDING_REQUIRED\") || message.startsWith(\"RELAY_BINDING_INVALID\");\n};\n\nconst isLeaseInvalidError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_LEASE_INVALID\");\n};\n\nconst isTransportTimeoutError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"Request timed out after \");\n};\n\nexport class DaemonClient {\n private binding: BindingState | null = null;\n private renewTimer: NodeJS.Timeout | null = null;\n private readonly clientId: string;\n private readonly autoRenew: boolean;\n private bindingAcquiredInProcess = false;\n private sessionLeases = new Map<string, string>();\n\n constructor(options: { clientId?: string; autoRenew?: boolean } = {}) {\n const cachedState = loadClientState();\n this.clientId = options.clientId ?? cachedState.clientId;\n this.autoRenew = options.autoRenew ?? false;\n if (cachedState.clientId === this.clientId && cachedState.binding) {\n try {\n this.setBinding(parseBindingResponse(cachedState.binding), { acquiredInProcess: false });\n } catch {\n updateCachedBindingState(this.clientId, null);\n }\n }\n }\n\n async call<T>(name: string, params: Record<string, unknown> = {}, options: CallOptions = {}): Promise<T> {\n try {\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n } catch (error) {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId && !(\"leaseId\" in params) && isLeaseInvalidError(error) && this.sessionLeases.has(sessionId)) {\n this.sessionLeases.delete(sessionId);\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n }\n if (isBindingRequiredError(error)) {\n if (this.binding) {\n this.clearBinding();\n }\n await this.ensureBinding();\n const result = await this.callWithBinding<T>(name, params, { ...options, requireBinding: true });\n this.maybeTrackLease(name, params, result);\n return result;\n }\n throw error;\n }\n }\n\n async releaseBinding(): Promise<void> {\n if (!this.binding) return;\n if (!this.bindingAcquiredInProcess) {\n this.clearBinding({ persist: false });\n return;\n }\n const bindingId = this.binding.bindingId;\n try {\n await this.callRaw(\"relay.release\", { clientId: this.clientId, bindingId });\n } finally {\n this.clearBinding();\n }\n }\n\n private async callWithBinding<T>(name: string, params: Record<string, unknown>, options: CallOptions): Promise<T> {\n const requireBinding = options.requireBinding ?? false;\n const bindingId = requireBinding ? await this.ensureBinding() : this.binding?.bindingId;\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n const leaseId = sessionId ? this.sessionLeases.get(sessionId) : undefined;\n const payload = {\n ...params,\n clientId: this.clientId,\n ...(bindingId ? { bindingId } : {}),\n ...(leaseId ? { leaseId } : {})\n };\n return await this.callRaw<T>(name, payload, deriveTransportTimeoutMs(params, options.timeoutMs));\n }\n\n private maybeTrackLease<T>(name: string, params: Record<string, unknown>, result: T): void {\n if (name === \"session.disconnect\") {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId) {\n this.sessionLeases.delete(sessionId);\n }\n if (result && typeof result === \"object\" && (result as Record<string, unknown>).bindingReleased === true) {\n this.clearBinding();\n }\n return;\n }\n if (name !== \"session.launch\" && name !== \"session.connect\") return;\n if (!result || typeof result !== \"object\") return;\n const record = result as Record<string, unknown>;\n const sessionId = record.sessionId;\n const leaseId = record.leaseId;\n if (typeof sessionId === \"string\" && typeof leaseId === \"string\") {\n this.sessionLeases.set(sessionId, leaseId);\n }\n }\n\n private async ensureBinding(): Promise<string> {\n if (this.binding && Date.now() < this.binding.expiresAtMs - MIN_RENEW_AFTER_MS) {\n return this.binding.bindingId;\n }\n const data = await this.callRaw<RelayBindResponse>(\"relay.bind\", { clientId: this.clientId });\n const state = await this.resolveBindingState(data);\n this.setBinding(state, { acquiredInProcess: true });\n return state.bindingId;\n }\n\n private async resolveBindingState(data: RelayBindResponse): Promise<BindingState> {\n if (\"queued\" in data && data.queued) {\n const waitMs = typeof data.waitMs === \"number\" && Number.isFinite(data.waitMs) ? data.waitMs : null;\n const timeoutMs = waitMs ? Math.max(1000, waitMs) : data.bindingConfig?.waitMaxMs;\n const waitResponse = await this.callRaw<RelayBindResponse>(\"relay.wait\", {\n clientId: this.clientId,\n ...(timeoutMs ? { timeoutMs } : {})\n });\n if (\"queued\" in waitResponse && waitResponse.queued) {\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n }\n return parseBindingResponse(waitResponse as BindingResponse);\n }\n return parseBindingResponse(data as BindingResponse);\n }\n\n private async renewBinding(): Promise<void> {\n if (!this.binding) return;\n const data = await this.callRaw<BindingResponse>(\"relay.renew\", {\n clientId: this.clientId,\n bindingId: this.binding.bindingId\n });\n this.setBinding(parseBindingResponse(data), { acquiredInProcess: this.bindingAcquiredInProcess });\n }\n\n private setBinding(state: BindingState, options: { acquiredInProcess?: boolean } = {}): void {\n this.binding = state;\n if (options.acquiredInProcess !== undefined) {\n this.bindingAcquiredInProcess = options.acquiredInProcess;\n }\n updateCachedBindingState(this.clientId, state);\n if (this.autoRenew) {\n this.scheduleRenew(resolveRenewDelayMs(state));\n }\n }\n\n private scheduleRenew(delayMs: number): void {\n if (!this.autoRenew) return;\n this.clearRenewTimer();\n this.renewTimer = setTimeout(() => {\n this.renewTimer = null;\n this.renewBinding().catch(() => this.clearBinding());\n }, delayMs);\n }\n\n private clearBinding(options: { persist?: boolean } = {}): void {\n this.binding = null;\n this.bindingAcquiredInProcess = false;\n if (options.persist !== false) {\n updateCachedBindingState(this.clientId, null);\n }\n this.clearRenewTimer();\n }\n\n private clearRenewTimer(): void {\n if (this.renewTimer) {\n clearTimeout(this.renewTimer);\n this.renewTimer = null;\n }\n }\n\n private async callRaw<T>(name: string, params: Record<string, unknown>, timeoutMs?: number): Promise<T> {\n const budget = createTimeoutBudget(timeoutMs);\n const connection = await resolveDaemonConnection(budget, {\n preferConfiguredRecovery: requiresConfiguredRecovery(name)\n });\n\n let timedResponse: TimedFetchResponse;\n try {\n timedResponse = await openDaemonCommand(\n connection.port,\n connection.token,\n name,\n params,\n readRemainingBudgetMs(budget)\n );\n } catch (error) {\n if (isTransportTimeoutError(error)) {\n throw error;\n }\n timedResponse = await retryWithRefreshedConnection(name, params, budget);\n }\n\n try {\n if (!timedResponse.response.ok) {\n const message = await readDaemonErrorMessage(timedResponse);\n if (message.includes(\"Unauthorized\") || timedResponse.response.status === 401) {\n timedResponse.dispose();\n timedResponse = await retryWithRefreshedConnection(name, params, budget);\n if (!timedResponse.response.ok) {\n throw new CliError(await readDaemonErrorMessage(timedResponse), EXIT_EXECUTION);\n }\n } else {\n throw new CliError(message, EXIT_EXECUTION);\n }\n }\n\n const payload = await readResponseJsonWithTimeout<DaemonResponse<T>>(\n timedResponse.response,\n timedResponse.signal,\n timedResponse.timeoutMs\n );\n if (!payload.ok) {\n throw new CliError(payload.error || \"Daemon command failed.\", EXIT_EXECUTION);\n }\n\n return payload.data as T;\n } finally {\n timedResponse.dispose();\n }\n }\n}\n\nconst asPositiveNumber = (value: unknown): number | undefined => {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : undefined;\n};\n\nconst createTransportTimeoutError = (timeoutMs: number): Error => {\n return new Error(`Request timed out after ${timeoutMs}ms`);\n};\n\nconst createTimeoutBudget = (timeoutMs?: number): TimeoutBudget | null => {\n const resolved = asPositiveNumber(timeoutMs);\n return resolved === undefined\n ? null\n : { timeoutMs: resolved, deadlineMs: Date.now() + resolved };\n};\n\nconst readRemainingBudgetMs = (budget: TimeoutBudget | null): number | undefined => {\n if (!budget) {\n return undefined;\n }\n const remainingMs = budget.deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw createTransportTimeoutError(budget.timeoutMs);\n }\n return remainingMs;\n};\n\nconst capTimeoutToBudget = (\n timeoutMs: number,\n budget: TimeoutBudget | null\n): number => {\n const remainingMs = readRemainingBudgetMs(budget);\n return remainingMs === undefined\n ? timeoutMs\n : Math.max(1, Math.min(timeoutMs, remainingMs));\n};\n\nconst resolveReadyDeadlineMs = (\n readyTimeoutMs: number,\n budget: TimeoutBudget | null\n): number => {\n const localDeadlineMs = Date.now() + readyTimeoutMs;\n return budget ? Math.min(localDeadlineMs, budget.deadlineMs) : localDeadlineMs;\n};\n\nconst hasBudgetTimedOut = (\n budget: TimeoutBudget | null,\n deadlineMs: number\n): boolean => {\n if (!budget) {\n return false;\n }\n return deadlineMs >= budget.deadlineMs && Date.now() >= budget.deadlineMs;\n};\n\nconst deriveTransportTimeoutMs = (\n params: Record<string, unknown>,\n explicitTimeoutMs?: number\n): number | undefined => {\n const explicit = asPositiveNumber(explicitTimeoutMs);\n if (explicit !== undefined) {\n return explicit;\n }\n for (const key of TRANSPORT_TIMEOUT_HINT_KEYS) {\n const value = asPositiveNumber(params[key]);\n if (value !== undefined) {\n return Math.min(value + TRANSPORT_TIMEOUT_BUFFER_MS, MAX_DERIVED_TRANSPORT_TIMEOUT_MS);\n }\n }\n return undefined;\n};\n\nconst resolveRenewDelayMs = (binding: BindingState): number => {\n const remainingMs = Math.max(0, binding.expiresAtMs - Date.now() - MIN_RENEW_AFTER_MS);\n return Math.max(0, Math.min(binding.renewAfterMs, remainingMs));\n};\n\nconst cliClient = new DaemonClient({ autoRenew: false });\n\nexport async function callDaemon(command: string, params?: Record<string, unknown>, options?: CallOptions): Promise<unknown> {\n return cliClient.call(command, params ?? {}, options);\n}\n\nexport const __test__ = {\n deriveTransportTimeoutMs,\n isTransportTimeoutError,\n resolveDaemonRestartCommand,\n resetCachedClientState: (): void => {\n cachedClientState = undefined;\n }\n};\n\ntype DaemonConnection = {\n port: number;\n token: string;\n};\n\ntype DaemonRestartCommand = {\n command: string;\n args: string[];\n};\n\ntype TimeoutBudget = {\n timeoutMs: number;\n deadlineMs: number;\n};\n\ntype ResolveDaemonConnectionOptions = {\n preferConfiguredRecovery?: boolean;\n};\n\ntype ResolveDaemonRestartCommandOptions = {\n argv1?: string;\n execPath?: string;\n execArgv?: string[];\n moduleUrl?: string;\n entryExists?: (path: string) => boolean;\n};\n\nconst TYPESCRIPT_ENTRY_RE = /\\.[cm]?ts$/i;\nconst RESTART_LOADER_ARG_FLAGS = new Set([\"--experimental-loader\", \"--import\", \"--loader\", \"--require\", \"-r\"]);\nconst RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS = new Set([\"--experimental-strip-types\", \"--experimental-transform-types\"]);\nconst RESTART_DEBUG_ARG_FLAGS = new Set([\"--inspect\", \"--inspect-brk\", \"--inspect-port\", \"--debug\", \"--debug-brk\"]);\n\nconst isInlineRestartArg = (arg: string, flags: Set<string>): boolean => {\n for (const flag of flags) {\n if (arg.startsWith(`${flag}=`)) {\n return true;\n }\n }\n return false;\n};\n\nconst isRestartLoaderArg = (arg: string): boolean => {\n return RESTART_LOADER_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_LOADER_ARG_FLAGS);\n};\n\nconst isRestartTypeScriptContextArg = (arg: string): boolean => {\n return RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS.has(arg)\n || isInlineRestartArg(arg, RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS);\n};\n\nconst isRestartDebugArg = (arg: string): boolean => {\n return RESTART_DEBUG_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_DEBUG_ARG_FLAGS);\n};\n\nconst resolveRestartSplitArgValue = (\n arg: string,\n value: string | undefined\n): string | null => {\n if (arg.includes(\"=\")) return null;\n if (typeof value !== \"string\") return null;\n return value.startsWith(\"-\") ? null : value;\n};\n\nconst resolveRestartExecArgv = (entryPath: string, execArgv: string[]): string[] => {\n const preserved: string[] = [];\n let hasLoaderContext = false;\n for (let index = 0; index < execArgv.length; index += 1) {\n const arg = execArgv[index];\n if (!arg) {\n continue;\n }\n if (isRestartDebugArg(arg)) {\n const next = resolveRestartSplitArgValue(arg, execArgv[index + 1]);\n if (RESTART_DEBUG_ARG_FLAGS.has(arg) && next) {\n index += 1;\n }\n continue;\n }\n preserved.push(arg);\n if (isRestartLoaderArg(arg) || isRestartTypeScriptContextArg(arg)) {\n hasLoaderContext = true;\n }\n const value = resolveRestartSplitArgValue(arg, execArgv[index + 1]);\n if (!value) continue;\n preserved.push(value);\n index += 1;\n }\n return TYPESCRIPT_ENTRY_RE.test(entryPath) && !hasLoaderContext ? [] : preserved;\n};\n\nconst fetchCurrentDaemonStatus = async (\n connection: DaemonConnection,\n options: DaemonStatusFetchOptions,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const attempts = typeof options.retryAttempts === \"number\" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1\n ? Math.floor(options.retryAttempts)\n : 1;\n const retryDelayMs = typeof options.retryDelayMs === \"number\" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0\n ? options.retryDelayMs\n : 0;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)\n });\n if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (attempt < attempts) {\n await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));\n }\n }\n\n return null;\n};\n\nconst fetchAnyDaemonStatus = async (\n connection: DaemonConnection,\n options: DaemonStatusFetchOptions,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const attempts = typeof options.retryAttempts === \"number\" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1\n ? Math.floor(options.retryAttempts)\n : 1;\n const retryDelayMs = typeof options.retryDelayMs === \"number\" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0\n ? options.retryDelayMs\n : 0;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)\n });\n if (status?.ok) {\n return status;\n }\n if (attempt < attempts) {\n await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));\n }\n }\n\n return null;\n};\n\nconst sleep = async (delayMs: number): Promise<void> => {\n if (!(Number.isFinite(delayMs) && delayMs > 0)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n};\n\nconst requiresConfiguredRecovery = (name: string): boolean => {\n return name === \"canvas.execute\" || name === \"inspiredesign.run\";\n};\n\nconst getConfiguredDaemonConnection = (): DaemonConnection | null => {\n const config = loadGlobalConfig();\n if (!(config.daemonPort > 0 && config.daemonToken)) {\n return null;\n }\n return { port: config.daemonPort, token: config.daemonToken };\n};\n\nconst sameDaemonConnection = (left: DaemonConnection, right: DaemonConnection): boolean => {\n return left.port === right.port && left.token === right.token;\n};\n\nconst persistResolvedDaemonStatus = (\n connection: DaemonConnection,\n status: DaemonStatusPayload\n): void => {\n const config = loadGlobalConfig();\n persistDaemonStatusMetadata({\n port: connection.port,\n token: connection.token,\n startedAt: new Date().toISOString(),\n fingerprint: status.fingerprint\n }, status, config);\n};\n\nconst persistCurrentConfiguredConnection = async (\n configuredConnection: DaemonConnection,\n status: DaemonStatusPayload,\n staleMetadata: { connection: DaemonConnection } | null\n): Promise<DaemonConnection> => {\n if (staleMetadata && !sameDaemonConnection(staleMetadata.connection, configuredConnection)) {\n // Once the configured daemon has proven current, stale metadata cleanup must not block the caller.\n void stopDaemonConnection(staleMetadata.connection, null, \"persistCurrentConfiguredConnection.staleMetadata\").catch(() => undefined);\n }\n persistResolvedDaemonStatus(configuredConnection, status);\n return configuredConnection;\n};\n\ntype DaemonShutdownOutcome = \"stopped\" | DaemonStatusPayload;\ntype DaemonStopOutcome = \"stopped\" | \"fingerprint_rejected\" | \"unreachable\";\n\nconst resolveConfiguredPreferenceOptions = (\n budget: TimeoutBudget | null\n): DaemonStatusFetchOptions | null => {\n if (!budget) {\n return DAEMON_CONFIG_PREFER_OPTIONS;\n }\n const remainingMs = readRemainingBudgetMs(budget);\n if (remainingMs === undefined || remainingMs <= 1) {\n return null;\n }\n const timeoutMs = Math.min(DAEMON_CONFIG_PREFER_OPTIONS.timeoutMs ?? remainingMs, remainingMs);\n const retryDelayMs = Math.max(0, DAEMON_CONFIG_PREFER_OPTIONS.retryDelayMs ?? 0);\n const maxAttempts = Math.max(1, DAEMON_CONFIG_PREFER_OPTIONS.retryAttempts ?? 1);\n let retryAttempts = 1;\n while (retryAttempts < maxAttempts) {\n const nextAttempts = retryAttempts + 1;\n const nextWorstCaseMs = (nextAttempts * timeoutMs) + ((nextAttempts - 1) * retryDelayMs);\n if (nextWorstCaseMs > remainingMs) {\n break;\n }\n retryAttempts = nextAttempts;\n }\n return {\n timeoutMs,\n retryAttempts,\n retryDelayMs: retryAttempts > 1 ? retryDelayMs : 0\n };\n};\n\nconst stopDaemonConnection = async (\n connection: DaemonConnection,\n budget: TimeoutBudget | null = null,\n reason = \"unknown\"\n): Promise<DaemonStopOutcome> => {\n const stopTimeoutMs = capTimeoutToBudget(DAEMON_RESTART_STATUS_TIMEOUT_MS, budget);\n logDaemonStopDebug(\"client.stop.request\", { reason, port: connection.port });\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/stop`, {\n method: \"POST\",\n headers: createDaemonStopHeaders(connection.token, reason)\n }, stopTimeoutMs);\n if (response.status === 409) {\n logDaemonStopDebug(\"client.stop.fingerprintRejected\", { reason, port: connection.port });\n return \"fingerprint_rejected\";\n }\n if (!response.ok) {\n logDaemonStopDebug(\"client.stop.rejected\", { reason, port: connection.port, status: response.status });\n return \"unreachable\";\n }\n logDaemonStopDebug(\"client.stop.complete\", { reason, port: connection.port });\n return \"stopped\";\n } catch {\n logDaemonStopDebug(\"client.stop.error\", { reason, port: connection.port });\n return \"unreachable\";\n }\n};\n\nfunction resolveDaemonRestartCommand(\n options: ResolveDaemonRestartCommandOptions = {}\n): DaemonRestartCommand {\n const execPath = options.execPath ?? process.execPath;\n const execArgv = options.execArgv ?? process.execArgv;\n const moduleUrl = options.moduleUrl ?? import.meta.url;\n const argv1 = options.argv1 ?? process.argv[1];\n const entryPath = resolveCurrentDaemonEntrypointPath({\n argv1,\n moduleUrl,\n entryExists: options.entryExists ?? existsSync\n });\n if (!(typeof argv1 === \"string\" && argv1.trim().length > 0)) {\n const modulePath = resolve(fileURLToPath(moduleUrl));\n if (entryPath === modulePath) {\n throw createDisconnectedError(\"Daemon restart requires a stable CLI entrypoint. Start with `opendevbrowser serve`.\");\n }\n }\n const restartExecArgv = resolveRestartExecArgv(entryPath, execArgv);\n if (TYPESCRIPT_ENTRY_RE.test(entryPath) && restartExecArgv.length === 0) {\n throw createDisconnectedError(\"Daemon restart requires the original loader context. Start with `opendevbrowser serve`.\");\n }\n return {\n command: execPath,\n args: [...restartExecArgv, entryPath]\n };\n}\n\nconst restartDaemonConnection = async (connection: DaemonConnection): Promise<void> => {\n const restart = resolveDaemonRestartCommand();\n const child = spawn(restart.command, [\n ...restart.args,\n \"serve\",\n \"--port\",\n String(connection.port),\n \"--token\",\n connection.token,\n \"--output-format\",\n \"json\"\n ], {\n detached: true,\n stdio: \"ignore\"\n });\n child.unref();\n};\n\nconst waitForCurrentDaemonStatus = async (\n connection: DaemonConnection,\n readyTimeoutMs = DAEMON_RESTART_READY_TIMEOUT_MS,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);\n while (true) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n if (hasBudgetTimedOut(budget, deadline)) {\n throw createTransportTimeoutError(budget!.timeoutMs);\n }\n return null;\n }\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)\n });\n if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (Date.now() >= deadline) {\n return null;\n }\n await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));\n }\n};\n\nconst waitForDaemonShutdown = async (\n connection: DaemonConnection,\n readyTimeoutMs = DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget: TimeoutBudget | null = null\n): Promise<DaemonShutdownOutcome | null> => {\n const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);\n while (true) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n if (hasBudgetTimedOut(budget, deadline)) {\n throw createTransportTimeoutError(budget!.timeoutMs);\n }\n return null;\n }\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)\n });\n if (!status?.ok) {\n return \"stopped\";\n }\n if (isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (Date.now() >= deadline) {\n return null;\n }\n await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));\n }\n};\n\nconst resolveMetadataConnection = async (\n metadataConnection: DaemonConnection,\n configuredConnection: DaemonConnection,\n budget: TimeoutBudget | null = null\n): Promise<{ connection: DaemonConnection; status: DaemonStatusPayload } | null> => {\n const status = await fetchAnyDaemonStatus(metadataConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);\n if (!status?.ok) {\n return null;\n }\n if (isCurrentDaemonFingerprint(status.fingerprint)) {\n persistResolvedDaemonStatus(metadataConnection, status);\n return { connection: metadataConnection, status };\n }\n if (sameDaemonConnection(metadataConnection, configuredConnection)) {\n return null;\n }\n return { connection: metadataConnection, status };\n};\n\nconst resolveFreshDaemonConnection = async (\n budget: TimeoutBudget | null = null,\n options: ResolveDaemonConnectionOptions = {}\n): Promise<DaemonConnection> => {\n const configuredConnection = getConfiguredDaemonConnection();\n if (!configuredConnection) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n const configuredStatus = await fetchAnyDaemonStatus(configuredConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);\n\n let currentConfiguredStatus =\n configuredStatus?.ok && isCurrentDaemonFingerprint(configuredStatus.fingerprint)\n ? configuredStatus\n : null;\n\n const metadata = readDaemonMetadata();\n const metadataConnection = metadata\n ? { port: metadata.port, token: metadata.token }\n : null;\n const staleMetadata = metadataConnection\n ? await resolveMetadataConnection(metadataConnection, configuredConnection, budget)\n : null;\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n if (options.preferConfiguredRecovery && staleMetadata) {\n currentConfiguredStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n if (!configuredStatus?.ok) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n }\n if (\n !options.preferConfiguredRecovery\n && staleMetadata?.status.ok\n && isCurrentDaemonFingerprint(staleMetadata.status.fingerprint)\n ) {\n if (configuredStatus?.ok) {\n void stopDaemonConnection(configuredConnection, budget, \"resolveFreshDaemonConnection.configuredCurrentMetadataPreferred\").catch(() => undefined);\n }\n return staleMetadata.connection;\n }\n if (!configuredStatus?.ok && staleMetadata) {\n currentConfiguredStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n const staleConnections: Array<{ connection: DaemonConnection; status: DaemonStatusPayload }> = [];\n if (configuredStatus?.ok) {\n staleConnections.push({ connection: configuredConnection, status: configuredStatus });\n }\n if (staleConnections.length === 0) {\n const recoveringStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (recoveringStatus?.ok) {\n persistResolvedDaemonStatus(configuredConnection, recoveringStatus);\n return configuredConnection;\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n for (const staleConnection of staleConnections) {\n const stopOutcome = await stopDaemonConnection(\n staleConnection.connection,\n budget,\n \"resolveFreshDaemonConnection.staleConnections\"\n );\n if (stopOutcome === \"fingerprint_rejected\") {\n throw createDisconnectedError(\n buildDaemonFingerprintMismatchMessage({\n label: \"Daemon\",\n port: staleConnection.connection.port,\n pid: staleConnection.status.pid\n }),\n DAEMON_FINGERPRINT_MISMATCH_REASON\n );\n }\n }\n if (configuredStatus?.ok) {\n const shutdownOutcome = await waitForDaemonShutdown(configuredConnection, DAEMON_RECOVERY_READY_TIMEOUT_MS, budget);\n if (!shutdownOutcome) {\n throw createDisconnectedError(\"Daemon restart could not reclaim the configured port after fingerprint mismatch. Start with `opendevbrowser serve`.\");\n }\n if (shutdownOutcome !== \"stopped\") {\n persistResolvedDaemonStatus(configuredConnection, shutdownOutcome);\n return configuredConnection;\n }\n }\n await restartDaemonConnection(configuredConnection);\n const refreshedStatus = await waitForCurrentDaemonStatus(configuredConnection, DAEMON_RESTART_READY_TIMEOUT_MS, budget);\n if (!refreshedStatus?.ok) {\n throw createDisconnectedError(\"Daemon restart failed after fingerprint mismatch. Start with `opendevbrowser serve`.\");\n }\n persistResolvedDaemonStatus(configuredConnection, refreshedStatus);\n return configuredConnection;\n};\n\nconst resolveDaemonConnection = async (\n budget: TimeoutBudget | null = null,\n options: ResolveDaemonConnectionOptions = {}\n): Promise<DaemonConnection> => {\n const metadata = readDaemonMetadata();\n if (metadata && isCurrentDaemonFingerprint(metadata.fingerprint)) {\n const metadataConnection = { port: metadata.port, token: metadata.token };\n const configuredConnection = getConfiguredDaemonConnection();\n if (!configuredConnection || sameDaemonConnection(metadataConnection, configuredConnection)) {\n return metadataConnection;\n }\n const configuredOptions = resolveConfiguredPreferenceOptions(budget);\n if (!configuredOptions) {\n if (options.preferConfiguredRecovery) {\n return await resolveFreshDaemonConnection(budget, options);\n }\n return metadataConnection;\n }\n const configuredStatus = await fetchCurrentDaemonStatus(configuredConnection, configuredOptions, budget);\n if (configuredStatus?.ok) {\n return await persistCurrentConfiguredConnection(\n configuredConnection,\n configuredStatus,\n { connection: metadataConnection }\n );\n }\n if (options.preferConfiguredRecovery) {\n return await resolveFreshDaemonConnection(budget, options);\n }\n return metadataConnection;\n }\n return await resolveFreshDaemonConnection(budget, options);\n};\n\nconst retryWithRefreshedConnection = async (\n name: string,\n params: Record<string, unknown>,\n budget: TimeoutBudget | null\n): Promise<TimedFetchResponse> => {\n const connection = await resolveFreshDaemonConnection(budget, {\n preferConfiguredRecovery: requiresConfiguredRecovery(name)\n });\n return await openDaemonCommand(connection.port, connection.token, name, params, readRemainingBudgetMs(budget));\n};\n\nconst openDaemonCommand = async (\n port: number,\n token: string,\n name: string,\n params: Record<string, unknown>,\n timeoutMs?: number\n): Promise<TimedFetchResponse> => {\n return await fetchWithTimeoutContext(`http://127.0.0.1:${port}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n};\n\nconst readDaemonErrorMessage = async (timedResponse: TimedFetchResponse): Promise<string> => {\n const text = await readResponseTextWithTimeout(\n timedResponse.response,\n timedResponse.signal,\n timedResponse.timeoutMs\n );\n let message = text || String(timedResponse.response.status);\n try {\n const parsed = JSON.parse(text) as Record<string, unknown> | null;\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.error === \"string\" && parsed.error.trim()) {\n message = parsed.error;\n } else if (typeof parsed.message === \"string\" && parsed.message.trim()) {\n message = parsed.message;\n }\n }\n } catch {\n // Ignore JSON parse errors; fall back to raw text/status.\n }\n return message;\n};\n"],"mappings":"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","names":["sessionId","resolve"]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
getBundledSkillsDir,
|
|
6
6
|
listBundledSkillDirectories
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-BUVYTJZR.js";
|
|
8
8
|
|
|
9
9
|
// src/cli/installers/skills.ts
|
|
10
10
|
import * as crypto from "crypto";
|
|
@@ -535,4 +535,4 @@ export {
|
|
|
535
535
|
hasBundledSkillArtifacts,
|
|
536
536
|
hasManagedBundledSkillInstall
|
|
537
537
|
};
|
|
538
|
-
//# sourceMappingURL=chunk-
|
|
538
|
+
//# sourceMappingURL=chunk-ZMNEWS7A.js.map
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
readCookiesFromSource,
|
|
8
8
|
resolveBundledProviderRuntime,
|
|
9
9
|
resolveSessionRelayRoute
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-HBK56JST.js";
|
|
11
11
|
import {
|
|
12
12
|
loadGlobalConfig,
|
|
13
13
|
resolveConfig
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
runProductVideoWorkflow,
|
|
25
25
|
runResearchWorkflow,
|
|
26
26
|
runShoppingWorkflow
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-RO3SMXF3.js";
|
|
28
28
|
import {
|
|
29
29
|
buildBlockerArtifacts,
|
|
30
30
|
classifyBlockerSignal,
|
|
@@ -148,12 +148,30 @@ async function readResponseJsonWithTimeout(response, signal, timeoutMs) {
|
|
|
148
148
|
return await readResponseBodyWithTimeout(response, signal, timeoutMs, () => response.json());
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
+
// src/cli/daemon-mismatch.ts
|
|
152
|
+
var DAEMON_FINGERPRINT_MISMATCH_REASON = "daemon_fingerprint_mismatch";
|
|
153
|
+
var STATUS_PREFLIGHT_COMMAND = "opendevbrowser status --daemon --output-format json";
|
|
154
|
+
var FINGERPRINT_CURRENT_ASSERTION = "data.fingerprintCurrent === true";
|
|
155
|
+
var formatPid = (pid) => {
|
|
156
|
+
return Number.isInteger(pid) && Number(pid) > 0 ? ` pid=${pid}` : "";
|
|
157
|
+
};
|
|
158
|
+
function buildDaemonFingerprintMismatchMessage({
|
|
159
|
+
label,
|
|
160
|
+
port,
|
|
161
|
+
pid
|
|
162
|
+
}) {
|
|
163
|
+
return `${label} on 127.0.0.1:${port}${formatPid(pid)} is protected by a different opendevbrowser build. Run \`${STATUS_PREFLIGHT_COMMAND}\` and continue only when \`${FINGERPRINT_CURRENT_ASSERTION}\`. Use the matching binary to stop it, restart the daemon from the current install, or isolate this run with separate OPENCODE_CONFIG_DIR, OPENCODE_CACHE_DIR, daemon port, and relay port.`;
|
|
164
|
+
}
|
|
165
|
+
function buildDaemonFingerprintMismatchStatusGuidance() {
|
|
166
|
+
return `Recovery: run \`${STATUS_PREFLIGHT_COMMAND}\` and proceed only when \`${FINGERPRINT_CURRENT_ASSERTION}\`; use the matching binary, restart the daemon from the current install, or isolate OPENCODE_CONFIG_DIR, OPENCODE_CACHE_DIR, daemon port, and relay port.`;
|
|
167
|
+
}
|
|
168
|
+
|
|
151
169
|
// src/cli/daemon.ts
|
|
152
170
|
import { createServer } from "http";
|
|
153
171
|
import { createHash, timingSafeEqual } from "crypto";
|
|
154
172
|
import { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from "fs";
|
|
155
173
|
import { homedir } from "os";
|
|
156
|
-
import { basename, dirname, join, resolve } from "path";
|
|
174
|
+
import { basename, dirname as dirname2, join, resolve as resolve2 } from "path";
|
|
157
175
|
import { fileURLToPath } from "url";
|
|
158
176
|
|
|
159
177
|
// src/cli/daemon-commands.ts
|
|
@@ -394,10 +412,15 @@ function getBoolean(value) {
|
|
|
394
412
|
}
|
|
395
413
|
|
|
396
414
|
// src/inspiredesign/capture.ts
|
|
415
|
+
import { mkdir } from "fs/promises";
|
|
416
|
+
import { dirname, resolve } from "path";
|
|
397
417
|
var INSPIREDESIGN_CAPTURE_TIMEOUT_MS = 3e4;
|
|
398
418
|
var INSPIREDESIGN_CAPTURE_MAX_CHARS = 12e3;
|
|
399
419
|
var ACTIVE_SESSION_COOKIE_REUSE_UNAVAILABLE_MESSAGE = "Deep capture only honors configured provider cookie sources; active session cookies are not reused.";
|
|
400
420
|
var DOM_CAPTURE_HELPER_UNAVAILABLE_MESSAGE = "DOM capture helper unavailable in this execution lane.";
|
|
421
|
+
var VISUAL_CAPTURE_HELPER_UNAVAILABLE_MESSAGE = "Visual evidence screenshot helper unavailable in this execution lane.";
|
|
422
|
+
var VISUAL_CAPTURE_PATH_UNAVAILABLE_MESSAGE = "Visual evidence path was not configured for screenshot capture.";
|
|
423
|
+
var VISUAL_CAPTURE_EMPTY_MESSAGE = "Visual evidence screenshot did not return a file path.";
|
|
401
424
|
var SNAPSHOT_CAPTURE_EMPTY_MESSAGE = "Snapshot capture returned empty content.";
|
|
402
425
|
var CLONE_CAPTURE_EMPTY_MESSAGE = "Clone capture returned empty component and CSS previews.";
|
|
403
426
|
var DOM_CAPTURE_EMPTY_MESSAGE = "DOM capture returned empty HTML.";
|
|
@@ -605,7 +628,55 @@ var captureDomArtifact = async (manager, sessionId, remainingTimeoutMs) => {
|
|
|
605
628
|
};
|
|
606
629
|
}
|
|
607
630
|
};
|
|
608
|
-
var
|
|
631
|
+
var buildVisualEvidenceMetadata = (status, detail, warnings = [], tempPath) => ({
|
|
632
|
+
status,
|
|
633
|
+
kind: "viewport",
|
|
634
|
+
fullPage: false,
|
|
635
|
+
capturedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
636
|
+
...tempPath ? { tempPath } : {},
|
|
637
|
+
warnings,
|
|
638
|
+
...detail ? { failure: sanitizeInspiredesignCaptureText(detail) } : {}
|
|
639
|
+
});
|
|
640
|
+
var captureVisualEvidenceArtifact = async (manager, sessionId, options, remainingTimeoutMs) => {
|
|
641
|
+
const visualEvidence = options.visualEvidence ?? "off";
|
|
642
|
+
if (visualEvidence === "off") return void 0;
|
|
643
|
+
if (!options.visualEvidencePath) {
|
|
644
|
+
return buildVisualEvidenceMetadata(
|
|
645
|
+
visualEvidence === "required" ? "failed" : "skipped",
|
|
646
|
+
VISUAL_CAPTURE_PATH_UNAVAILABLE_MESSAGE
|
|
647
|
+
);
|
|
648
|
+
}
|
|
649
|
+
if (typeof manager.screenshot !== "function") {
|
|
650
|
+
return buildVisualEvidenceMetadata(
|
|
651
|
+
visualEvidence === "required" ? "failed" : "skipped",
|
|
652
|
+
VISUAL_CAPTURE_HELPER_UNAVAILABLE_MESSAGE
|
|
653
|
+
);
|
|
654
|
+
}
|
|
655
|
+
try {
|
|
656
|
+
await mkdir(dirname(options.visualEvidencePath), { recursive: true });
|
|
657
|
+
const screenshot = await withCaptureDeadline(
|
|
658
|
+
manager.screenshot(sessionId, {
|
|
659
|
+
path: options.visualEvidencePath,
|
|
660
|
+
fullPage: false
|
|
661
|
+
}),
|
|
662
|
+
remainingTimeoutMs(),
|
|
663
|
+
"visual evidence screenshot"
|
|
664
|
+
);
|
|
665
|
+
if (!screenshot.path) {
|
|
666
|
+
return buildVisualEvidenceMetadata("failed", VISUAL_CAPTURE_EMPTY_MESSAGE);
|
|
667
|
+
}
|
|
668
|
+
if (resolve(screenshot.path) !== resolve(options.visualEvidencePath)) {
|
|
669
|
+
return buildVisualEvidenceMetadata("failed", "Visual evidence screenshot path did not match the requested artifact path.");
|
|
670
|
+
}
|
|
671
|
+
return buildVisualEvidenceMetadata("captured", void 0, screenshot.warnings ?? [], options.visualEvidencePath);
|
|
672
|
+
} catch (error) {
|
|
673
|
+
return buildVisualEvidenceMetadata(
|
|
674
|
+
"failed",
|
|
675
|
+
detailFromCaptureError(error, "Visual evidence screenshot failed.")
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
};
|
|
679
|
+
var buildCaptureEvidence = (snapshot, clone, dom, visual) => {
|
|
609
680
|
const attempts = {
|
|
610
681
|
snapshot: snapshot.attempt,
|
|
611
682
|
clone: clone.attempt,
|
|
@@ -615,6 +686,7 @@ var buildCaptureEvidence = (snapshot, clone, dom) => {
|
|
|
615
686
|
...snapshot.snapshot ? { snapshot: snapshot.snapshot } : {},
|
|
616
687
|
...dom.dom ? { dom: dom.dom } : {},
|
|
617
688
|
...clone.clone ? { clone: clone.clone } : {},
|
|
689
|
+
...visual ? { visual } : {},
|
|
618
690
|
attempts
|
|
619
691
|
};
|
|
620
692
|
};
|
|
@@ -630,7 +702,7 @@ var buildTransportTimeoutCaptureEvidence = (snapshot, clone, label) => {
|
|
|
630
702
|
attempts
|
|
631
703
|
};
|
|
632
704
|
};
|
|
633
|
-
var captureInspiredesignArtifacts = async (manager, sessionId, remainingTimeoutMs) => {
|
|
705
|
+
var captureInspiredesignArtifacts = async (manager, sessionId, remainingTimeoutMs, options) => {
|
|
634
706
|
const snapshot = await captureSnapshotArtifact(manager, sessionId, remainingTimeoutMs);
|
|
635
707
|
if (snapshot.transportTimedOut) {
|
|
636
708
|
return buildTransportTimeoutCaptureEvidence(snapshot, void 0, "snapshot capture");
|
|
@@ -640,7 +712,8 @@ var captureInspiredesignArtifacts = async (manager, sessionId, remainingTimeoutM
|
|
|
640
712
|
return buildTransportTimeoutCaptureEvidence(snapshot, clone, "clone capture");
|
|
641
713
|
}
|
|
642
714
|
const dom = await captureDomArtifact(manager, sessionId, remainingTimeoutMs);
|
|
643
|
-
|
|
715
|
+
const visual = await captureVisualEvidenceArtifact(manager, sessionId, options, remainingTimeoutMs);
|
|
716
|
+
return buildCaptureEvidence(snapshot, clone, dom, visual);
|
|
644
717
|
};
|
|
645
718
|
async function captureInspiredesignReferenceFromManager(manager, url, options = {}) {
|
|
646
719
|
const cookiePolicy = resolveInspiredesignCaptureCookiePolicy(options);
|
|
@@ -692,7 +765,7 @@ async function captureInspiredesignReferenceFromManager(manager, url, options =
|
|
|
692
765
|
throw error;
|
|
693
766
|
}
|
|
694
767
|
}
|
|
695
|
-
return await captureInspiredesignArtifacts(manager, session.sessionId, remainingTimeoutMs);
|
|
768
|
+
return await captureInspiredesignArtifacts(manager, session.sessionId, remainingTimeoutMs, options);
|
|
696
769
|
} finally {
|
|
697
770
|
await manager.disconnect(session.sessionId, true).catch(() => void 0);
|
|
698
771
|
}
|
|
@@ -1282,7 +1355,7 @@ var waitForBinding = async (clientId, timeoutMs) => {
|
|
|
1282
1355
|
if (!getQueueEntry(clientId)) {
|
|
1283
1356
|
break;
|
|
1284
1357
|
}
|
|
1285
|
-
await new Promise((
|
|
1358
|
+
await new Promise((resolve3) => setTimeout(resolve3, 250));
|
|
1286
1359
|
}
|
|
1287
1360
|
dequeueClient(clientId);
|
|
1288
1361
|
throw new Error("RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.");
|
|
@@ -2113,10 +2186,15 @@ async function handleDaemonCommand(core, request) {
|
|
|
2113
2186
|
createDaemonWorkflowRuntime(core),
|
|
2114
2187
|
{
|
|
2115
2188
|
brief: requireString(params.brief, "brief"),
|
|
2189
|
+
harvest: optionalBoolean2(params.harvest),
|
|
2190
|
+
query: optionalString(params.query),
|
|
2191
|
+
providers: optionalStringArray2(params.providers),
|
|
2192
|
+
maxReferences: optionalNumber(params.maxReferences, "maxReferences"),
|
|
2193
|
+
visualEvidence: optionalInspiredesignVisualEvidence(params.visualEvidence),
|
|
2116
2194
|
urls: optionalStringArray2(params.urls),
|
|
2117
2195
|
captureMode: optionalInspiredesignCaptureMode(params.captureMode),
|
|
2118
2196
|
includePrototypeGuidance: optionalBoolean2(params.includePrototypeGuidance),
|
|
2119
|
-
mode: optionalRenderMode(params.mode)
|
|
2197
|
+
mode: optionalRenderMode(params.mode),
|
|
2120
2198
|
timeoutMs: inspiredesignTimeoutMs,
|
|
2121
2199
|
outputDir: resolveDaemonWorkflowOutputDir(core, optionalString(params.outputDir)),
|
|
2122
2200
|
ttlHours: optionalNumber(params.ttlHours, "ttlHours"),
|
|
@@ -2165,8 +2243,8 @@ async function handleDaemonCommand(core, request) {
|
|
|
2165
2243
|
await core.manager.goto(session.sessionId, url, "load", captureTimeoutMs);
|
|
2166
2244
|
const screenshot = await Promise.race([
|
|
2167
2245
|
core.manager.screenshot(session.sessionId),
|
|
2168
|
-
new Promise((
|
|
2169
|
-
setTimeout(() =>
|
|
2246
|
+
new Promise((resolve3) => {
|
|
2247
|
+
setTimeout(() => resolve3(null), captureTimeoutMs);
|
|
2170
2248
|
})
|
|
2171
2249
|
]);
|
|
2172
2250
|
if (!screenshot || typeof screenshot.base64 !== "string" || screenshot.base64.length === 0) return null;
|
|
@@ -2895,6 +2973,13 @@ function optionalInspiredesignCaptureMode(value) {
|
|
|
2895
2973
|
}
|
|
2896
2974
|
throw new Error("Invalid captureMode");
|
|
2897
2975
|
}
|
|
2976
|
+
function optionalInspiredesignVisualEvidence(value) {
|
|
2977
|
+
if (typeof value === "undefined") return void 0;
|
|
2978
|
+
if (value === "off" || value === "auto" || value === "required") {
|
|
2979
|
+
return value;
|
|
2980
|
+
}
|
|
2981
|
+
throw new Error("Invalid visualEvidence");
|
|
2982
|
+
}
|
|
2898
2983
|
function requireWaitUntil(value) {
|
|
2899
2984
|
if (value === "domcontentloaded" || value === "load" || value === "networkidle") {
|
|
2900
2985
|
return value;
|
|
@@ -2968,7 +3053,7 @@ async function waitForRelayHandshake(relay, observedPort, timeoutMs) {
|
|
|
2968
3053
|
if (observedStatus?.extensionHandshakeComplete) {
|
|
2969
3054
|
return true;
|
|
2970
3055
|
}
|
|
2971
|
-
await new Promise((
|
|
3056
|
+
await new Promise((resolve3) => setTimeout(resolve3, delay));
|
|
2972
3057
|
delay = Math.min(delay * 2, WAIT_MAX_DELAY_MS);
|
|
2973
3058
|
}
|
|
2974
3059
|
return false;
|
|
@@ -3175,15 +3260,15 @@ function clearDaemonMetadata() {
|
|
|
3175
3260
|
function resolveCurrentDaemonEntrypointPath(options = {}) {
|
|
3176
3261
|
const rawEntry = options.argv1 ?? process.argv[1];
|
|
3177
3262
|
if (typeof rawEntry === "string" && rawEntry.trim().length > 0) {
|
|
3178
|
-
return
|
|
3263
|
+
return resolve2(rawEntry);
|
|
3179
3264
|
}
|
|
3180
3265
|
const moduleUrl = options.moduleUrl ?? import.meta.url;
|
|
3181
|
-
const cliEntrypoint =
|
|
3266
|
+
const cliEntrypoint = resolve2(fileURLToPath(new URL("./index.js", moduleUrl)));
|
|
3182
3267
|
const entryExists = options.entryExists ?? existsSync;
|
|
3183
3268
|
if (entryExists(cliEntrypoint)) {
|
|
3184
3269
|
return cliEntrypoint;
|
|
3185
3270
|
}
|
|
3186
|
-
return
|
|
3271
|
+
return resolve2(fileURLToPath(moduleUrl));
|
|
3187
3272
|
}
|
|
3188
3273
|
function hashFileContents(entryPath) {
|
|
3189
3274
|
try {
|
|
@@ -3193,12 +3278,12 @@ function hashFileContents(entryPath) {
|
|
|
3193
3278
|
}
|
|
3194
3279
|
}
|
|
3195
3280
|
function resolveDaemonFingerprintDistRoot(modulePath) {
|
|
3196
|
-
let currentDir =
|
|
3281
|
+
let currentDir = dirname2(modulePath);
|
|
3197
3282
|
while (true) {
|
|
3198
3283
|
if (basename(currentDir) === "dist") {
|
|
3199
3284
|
return currentDir;
|
|
3200
3285
|
}
|
|
3201
|
-
const parentDir =
|
|
3286
|
+
const parentDir = dirname2(currentDir);
|
|
3202
3287
|
if (parentDir === currentDir) {
|
|
3203
3288
|
break;
|
|
3204
3289
|
}
|
|
@@ -3222,7 +3307,7 @@ function readDaemonFingerprintArtifact(modulePath) {
|
|
|
3222
3307
|
return null;
|
|
3223
3308
|
}
|
|
3224
3309
|
function getCurrentDaemonFingerprint(options = {}) {
|
|
3225
|
-
const modulePath =
|
|
3310
|
+
const modulePath = resolve2(fileURLToPath(options.moduleUrl ?? import.meta.url));
|
|
3226
3311
|
const sharedFingerprint = readDaemonFingerprintArtifact(modulePath);
|
|
3227
3312
|
const fingerprintParts = [
|
|
3228
3313
|
DAEMON_FINGERPRINT_VERSION,
|
|
@@ -3360,7 +3445,11 @@ async function startDaemon(options = {}) {
|
|
|
3360
3445
|
fingerprintMatches: stopFingerprint === fingerprint
|
|
3361
3446
|
});
|
|
3362
3447
|
if (stopFingerprint !== fingerprint) {
|
|
3363
|
-
sendJson(response, 409, {
|
|
3448
|
+
sendJson(response, 409, {
|
|
3449
|
+
ok: false,
|
|
3450
|
+
error: "Stale daemon stop request.",
|
|
3451
|
+
reason: DAEMON_FINGERPRINT_MISMATCH_REASON
|
|
3452
|
+
});
|
|
3364
3453
|
return;
|
|
3365
3454
|
}
|
|
3366
3455
|
sendJson(response, 200, { ok: true });
|
|
@@ -3383,9 +3472,9 @@ async function startDaemon(options = {}) {
|
|
|
3383
3472
|
}
|
|
3384
3473
|
sendJson(response, 404, { error: "Not found" });
|
|
3385
3474
|
});
|
|
3386
|
-
await new Promise((
|
|
3475
|
+
await new Promise((resolve3, reject) => {
|
|
3387
3476
|
server.once("error", reject);
|
|
3388
|
-
server.listen(port, "127.0.0.1", () =>
|
|
3477
|
+
server.listen(port, "127.0.0.1", () => resolve3());
|
|
3389
3478
|
});
|
|
3390
3479
|
const state = {
|
|
3391
3480
|
port,
|
|
@@ -3444,8 +3533,8 @@ async function startDaemon(options = {}) {
|
|
|
3444
3533
|
process.off("uncaughtException", uncaughtExceptionHandler);
|
|
3445
3534
|
process.off("unhandledRejection", unhandledRejectionHandler);
|
|
3446
3535
|
core.cleanup();
|
|
3447
|
-
await new Promise((
|
|
3448
|
-
server.close(() =>
|
|
3536
|
+
await new Promise((resolve3) => {
|
|
3537
|
+
server.close(() => resolve3());
|
|
3449
3538
|
});
|
|
3450
3539
|
logDaemonStopDebug("stop.complete", { reason });
|
|
3451
3540
|
};
|
|
@@ -3464,7 +3553,7 @@ async function startDaemon(options = {}) {
|
|
|
3464
3553
|
return { state, stop };
|
|
3465
3554
|
}
|
|
3466
3555
|
function readJson(request) {
|
|
3467
|
-
return new Promise((
|
|
3556
|
+
return new Promise((resolve3, reject) => {
|
|
3468
3557
|
let data = "";
|
|
3469
3558
|
request.setEncoding("utf8");
|
|
3470
3559
|
request.on("data", (chunk) => {
|
|
@@ -3477,7 +3566,7 @@ function readJson(request) {
|
|
|
3477
3566
|
reject(new Error("Invalid JSON body"));
|
|
3478
3567
|
return;
|
|
3479
3568
|
}
|
|
3480
|
-
|
|
3569
|
+
resolve3(parsed);
|
|
3481
3570
|
} catch (error) {
|
|
3482
3571
|
reject(error);
|
|
3483
3572
|
}
|
|
@@ -3499,7 +3588,7 @@ var sleep = async (delayMs) => {
|
|
|
3499
3588
|
if (!(Number.isFinite(delayMs) && delayMs > 0)) {
|
|
3500
3589
|
return;
|
|
3501
3590
|
}
|
|
3502
|
-
await new Promise((
|
|
3591
|
+
await new Promise((resolve3) => setTimeout(resolve3, delayMs));
|
|
3503
3592
|
};
|
|
3504
3593
|
var resolveRetryAttempts = (retryAttempts) => {
|
|
3505
3594
|
return typeof retryAttempts === "number" && Number.isFinite(retryAttempts) && retryAttempts > 1 ? Math.floor(retryAttempts) : 1;
|
|
@@ -3636,6 +3725,9 @@ export {
|
|
|
3636
3725
|
fetchWithTimeoutContext,
|
|
3637
3726
|
readResponseTextWithTimeout,
|
|
3638
3727
|
readResponseJsonWithTimeout,
|
|
3728
|
+
DAEMON_FINGERPRINT_MISMATCH_REASON,
|
|
3729
|
+
buildDaemonFingerprintMismatchMessage,
|
|
3730
|
+
buildDaemonFingerprintMismatchStatusGuidance,
|
|
3639
3731
|
DAEMON_STOP_DEBUG_ENV,
|
|
3640
3732
|
getCacheRoot,
|
|
3641
3733
|
readDaemonMetadata,
|
|
@@ -3648,4 +3740,4 @@ export {
|
|
|
3648
3740
|
fetchDaemonStatusFromMetadata,
|
|
3649
3741
|
persistDaemonStatusMetadata
|
|
3650
3742
|
};
|
|
3651
|
-
//# sourceMappingURL=chunk-
|
|
3743
|
+
//# sourceMappingURL=chunk-ZOVMMQO6.js.map
|