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,610 @@
|
|
|
1
|
+
// src/cli/daemon-autostart.ts
|
|
2
|
+
import { execFileSync } from "child_process";
|
|
3
|
+
import { existsSync, mkdirSync, statSync, unlinkSync, writeFileSync } from "fs";
|
|
4
|
+
import { homedir, tmpdir } from "os";
|
|
5
|
+
import { dirname, isAbsolute, join, relative, resolve } from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
var MAC_LABEL = "com.opendevbrowser.daemon";
|
|
8
|
+
var WIN_TASK_NAME = "OpenDevBrowser Daemon";
|
|
9
|
+
var STABLE_DAEMON_INSTALL_GUIDANCE = "Run opendevbrowser daemon install from a stable install location (for example, a global npm install or a persistent local package install).";
|
|
10
|
+
var defaultDeps = () => ({
|
|
11
|
+
platform: process.platform,
|
|
12
|
+
argv1: process.argv[1] ?? "",
|
|
13
|
+
moduleUrl: import.meta.url,
|
|
14
|
+
uid: typeof process.getuid === "function" ? process.getuid() : 0,
|
|
15
|
+
homedir,
|
|
16
|
+
existsSync,
|
|
17
|
+
mkdirSync,
|
|
18
|
+
statSync,
|
|
19
|
+
writeFileSync,
|
|
20
|
+
unlinkSync,
|
|
21
|
+
execFileSync,
|
|
22
|
+
transientEntrypointRoots: void 0
|
|
23
|
+
});
|
|
24
|
+
var NPX_CACHE_SEGMENT_PATTERN = /[\\/]_npx(?:[\\/]|$)/;
|
|
25
|
+
var formatCommand = (programArguments) => {
|
|
26
|
+
return programArguments.map((value) => `"${value}"`).join(" ");
|
|
27
|
+
};
|
|
28
|
+
var resolveMacWorkingDirectory = (home) => {
|
|
29
|
+
return join(home, ".cache", "opendevbrowser");
|
|
30
|
+
};
|
|
31
|
+
var pathIsDirectory = (path, deps) => {
|
|
32
|
+
if (!deps.existsSync(path)) return false;
|
|
33
|
+
try {
|
|
34
|
+
return deps.statSync(path).isDirectory();
|
|
35
|
+
} catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var resolveCliPathFromModule = (moduleUrl, exists) => {
|
|
40
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
41
|
+
const candidate = resolve(dirname(modulePath), "..", "index.js");
|
|
42
|
+
if (!exists(candidate)) {
|
|
43
|
+
throw new Error(`CLI entrypoint not found at ${candidate}`);
|
|
44
|
+
}
|
|
45
|
+
return candidate;
|
|
46
|
+
};
|
|
47
|
+
var normalizeComparisonPath = (value, platform) => {
|
|
48
|
+
const resolvedPath = resolve(value);
|
|
49
|
+
return platform === "win32" ? resolvedPath.toLowerCase() : resolvedPath;
|
|
50
|
+
};
|
|
51
|
+
var isPathInsideRoot = (candidate, root, platform) => {
|
|
52
|
+
const normalizedCandidate = normalizeComparisonPath(candidate, platform);
|
|
53
|
+
const normalizedRoot = normalizeComparisonPath(root, platform);
|
|
54
|
+
const relation = relative(normalizedRoot, normalizedCandidate);
|
|
55
|
+
return relation === "" || !relation.startsWith("..") && !isAbsolute(relation);
|
|
56
|
+
};
|
|
57
|
+
var getTransientEntrypointRoots = (deps) => {
|
|
58
|
+
const configuredRoots = deps.transientEntrypointRoots;
|
|
59
|
+
if (configuredRoots && configuredRoots.length > 0) {
|
|
60
|
+
return [...new Set(configuredRoots.map((root) => normalizeComparisonPath(root, deps.platform)))];
|
|
61
|
+
}
|
|
62
|
+
const roots = [tmpdir()];
|
|
63
|
+
if (deps.platform === "darwin") {
|
|
64
|
+
roots.push("/tmp", "/private/tmp");
|
|
65
|
+
}
|
|
66
|
+
return [...new Set(roots.map((root) => normalizeComparisonPath(root, deps.platform)))];
|
|
67
|
+
};
|
|
68
|
+
var isTransientCliPath = (cliPath, deps) => {
|
|
69
|
+
const normalizedCliPath = normalizeComparisonPath(cliPath, deps.platform);
|
|
70
|
+
return getTransientEntrypointRoots(deps).some((root) => isPathInsideRoot(cliPath, root, deps.platform)) || NPX_CACHE_SEGMENT_PATTERN.test(normalizedCliPath);
|
|
71
|
+
};
|
|
72
|
+
var TRANSIENT_AUTOSTART_INSTALL_ERROR_PREFIX = "Cannot install daemon autostart from transient CLI path";
|
|
73
|
+
var isTransientAutostartInstallError = (error) => {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
return message.startsWith(TRANSIENT_AUTOSTART_INSTALL_ERROR_PREFIX);
|
|
76
|
+
};
|
|
77
|
+
var resolveCliEntrypoint = (deps = {}) => {
|
|
78
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
79
|
+
const exists = resolved.existsSync;
|
|
80
|
+
let cliPath = null;
|
|
81
|
+
let source = "module";
|
|
82
|
+
if (resolved.argv1) {
|
|
83
|
+
const candidate = resolve(resolved.argv1);
|
|
84
|
+
if (exists(candidate)) {
|
|
85
|
+
cliPath = candidate;
|
|
86
|
+
source = "argv1";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!cliPath) {
|
|
90
|
+
cliPath = resolveCliPathFromModule(resolved.moduleUrl, exists);
|
|
91
|
+
}
|
|
92
|
+
const nodePath = process.execPath;
|
|
93
|
+
const args = [cliPath, "serve"];
|
|
94
|
+
const command = formatCommand([nodePath, ...args]);
|
|
95
|
+
const isTransient = isTransientCliPath(cliPath, resolved);
|
|
96
|
+
return { nodePath, cliPath, args, command, source, isTransient };
|
|
97
|
+
};
|
|
98
|
+
var getLaunchAgentPath = (home = homedir()) => {
|
|
99
|
+
return join(home, "Library", "LaunchAgents", `${MAC_LABEL}.plist`);
|
|
100
|
+
};
|
|
101
|
+
var escapePlistString = (value) => value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
102
|
+
var buildLaunchAgentPlist = (entrypoint, options = {}) => {
|
|
103
|
+
const label = options.label ?? MAC_LABEL;
|
|
104
|
+
const stdoutPath = options.stdoutPath ?? join(homedir(), "Library", "Logs", "opendevbrowser-daemon.log");
|
|
105
|
+
const stderrPath = options.stderrPath ?? join(homedir(), "Library", "Logs", "opendevbrowser-daemon.err.log");
|
|
106
|
+
const workingDirectory = options.workingDirectory ?? resolveMacWorkingDirectory(homedir());
|
|
107
|
+
const programArgs = [entrypoint.nodePath, ...entrypoint.args].map((value) => ` <string>${escapePlistString(value)}</string>`).join("\n");
|
|
108
|
+
return [
|
|
109
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
110
|
+
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
111
|
+
'<plist version="1.0">',
|
|
112
|
+
"<dict>",
|
|
113
|
+
` <key>Label</key>`,
|
|
114
|
+
` <string>${escapePlistString(label)}</string>`,
|
|
115
|
+
" <key>ProgramArguments</key>",
|
|
116
|
+
" <array>",
|
|
117
|
+
programArgs,
|
|
118
|
+
" </array>",
|
|
119
|
+
" <key>RunAtLoad</key>",
|
|
120
|
+
" <true/>",
|
|
121
|
+
" <key>KeepAlive</key>",
|
|
122
|
+
" <true/>",
|
|
123
|
+
" <key>WorkingDirectory</key>",
|
|
124
|
+
` <string>${escapePlistString(workingDirectory)}</string>`,
|
|
125
|
+
" <key>StandardOutPath</key>",
|
|
126
|
+
` <string>${escapePlistString(stdoutPath)}</string>`,
|
|
127
|
+
" <key>StandardErrorPath</key>",
|
|
128
|
+
` <string>${escapePlistString(stderrPath)}</string>`,
|
|
129
|
+
"</dict>",
|
|
130
|
+
"</plist>",
|
|
131
|
+
""
|
|
132
|
+
].join("\n");
|
|
133
|
+
};
|
|
134
|
+
var buildWindowsTaskArgs = (entrypoint, taskName = WIN_TASK_NAME) => {
|
|
135
|
+
const command = formatCommand([entrypoint.nodePath, entrypoint.cliPath, "serve"]);
|
|
136
|
+
const args = [
|
|
137
|
+
"/Create",
|
|
138
|
+
"/TN",
|
|
139
|
+
taskName,
|
|
140
|
+
"/TR",
|
|
141
|
+
command,
|
|
142
|
+
"/SC",
|
|
143
|
+
"ONLOGON",
|
|
144
|
+
"/RL",
|
|
145
|
+
"LIMITED",
|
|
146
|
+
"/F"
|
|
147
|
+
];
|
|
148
|
+
return { taskName, command, args };
|
|
149
|
+
};
|
|
150
|
+
var createAutostartStatus = (status) => status;
|
|
151
|
+
var createMacAutostartStatus = (entrypoint, location, overrides) => {
|
|
152
|
+
return createAutostartStatus({
|
|
153
|
+
platform: "darwin",
|
|
154
|
+
supported: true,
|
|
155
|
+
installed: false,
|
|
156
|
+
health: "missing",
|
|
157
|
+
needsRepair: false,
|
|
158
|
+
location,
|
|
159
|
+
label: MAC_LABEL,
|
|
160
|
+
expectedCommand: entrypoint.isTransient ? void 0 : entrypoint.command,
|
|
161
|
+
...overrides
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
var createWindowsAutostartStatus = (entrypoint, overrides) => {
|
|
165
|
+
return createAutostartStatus({
|
|
166
|
+
platform: "win32",
|
|
167
|
+
supported: true,
|
|
168
|
+
installed: false,
|
|
169
|
+
health: "missing",
|
|
170
|
+
needsRepair: false,
|
|
171
|
+
taskName: WIN_TASK_NAME,
|
|
172
|
+
expectedCommand: entrypoint.isTransient ? void 0 : entrypoint.command,
|
|
173
|
+
...overrides
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
var classifyPersistedProgramArguments = (programArguments, deps) => {
|
|
177
|
+
const actualNodePath = programArguments[0];
|
|
178
|
+
const actualCliPath = programArguments[1];
|
|
179
|
+
if (!actualNodePath || !deps.existsSync(actualNodePath)) {
|
|
180
|
+
return { health: "needs_repair", reason: "missing_node_path" };
|
|
181
|
+
}
|
|
182
|
+
if (!actualCliPath || !deps.existsSync(actualCliPath)) {
|
|
183
|
+
return { health: "needs_repair", reason: "missing_cli_path" };
|
|
184
|
+
}
|
|
185
|
+
if (isTransientCliPath(actualCliPath, deps)) {
|
|
186
|
+
return { health: "needs_repair", reason: "transient_cli_path" };
|
|
187
|
+
}
|
|
188
|
+
if (programArguments.length !== 3 || programArguments[2] !== "serve") {
|
|
189
|
+
return { health: "needs_repair", reason: "entrypoint_mismatch" };
|
|
190
|
+
}
|
|
191
|
+
return { health: "healthy" };
|
|
192
|
+
};
|
|
193
|
+
var hasMatchingProgramArgument = (programArguments, expectedValue, deps, isPath = false) => {
|
|
194
|
+
const normalizedExpected = isPath ? normalizeComparisonPath(expectedValue, deps.platform) : expectedValue;
|
|
195
|
+
return programArguments.some((value) => {
|
|
196
|
+
const normalizedValue = isPath ? normalizeComparisonPath(value, deps.platform) : value;
|
|
197
|
+
return normalizedValue === normalizedExpected;
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
var classifyExpectedProgramArguments = (expectedArgs, actualArgs, deps) => {
|
|
201
|
+
if (!hasMatchingProgramArgument([actualArgs[0] ?? ""], expectedArgs[0] ?? "", deps, true)) {
|
|
202
|
+
return hasMatchingProgramArgument(actualArgs, expectedArgs[0] ?? "", deps, true) ? "entrypoint_mismatch" : "missing_node_path";
|
|
203
|
+
}
|
|
204
|
+
if (!hasMatchingProgramArgument([actualArgs[1] ?? ""], expectedArgs[1] ?? "", deps, true)) {
|
|
205
|
+
return hasMatchingProgramArgument(actualArgs, expectedArgs[1] ?? "", deps, true) ? "entrypoint_mismatch" : "missing_cli_path";
|
|
206
|
+
}
|
|
207
|
+
if (actualArgs.length !== expectedArgs.length || !actualArgs.every((value, index) => {
|
|
208
|
+
const expectedValue = expectedArgs[index] ?? "";
|
|
209
|
+
return index < 2 ? normalizeComparisonPath(value, deps.platform) === normalizeComparisonPath(expectedValue, deps.platform) : value === expectedValue;
|
|
210
|
+
})) {
|
|
211
|
+
return "entrypoint_mismatch";
|
|
212
|
+
}
|
|
213
|
+
return void 0;
|
|
214
|
+
};
|
|
215
|
+
var readMacLaunchAgentProgramArguments = (plistPath, deps) => {
|
|
216
|
+
try {
|
|
217
|
+
const text = deps.execFileSync("plutil", ["-convert", "json", "-o", "-", plistPath], { encoding: "utf-8" });
|
|
218
|
+
const parsed = JSON.parse(text);
|
|
219
|
+
const programArguments = parsed?.ProgramArguments;
|
|
220
|
+
const workingDirectory = typeof parsed?.WorkingDirectory === "string" ? parsed.WorkingDirectory : void 0;
|
|
221
|
+
if (!Array.isArray(programArguments) || programArguments.length < 2 || programArguments.some((value) => typeof value !== "string")) {
|
|
222
|
+
return { ok: false, reason: "missing_program_arguments" };
|
|
223
|
+
}
|
|
224
|
+
const commandArgs = programArguments;
|
|
225
|
+
return {
|
|
226
|
+
ok: true,
|
|
227
|
+
command: formatCommand(commandArgs),
|
|
228
|
+
programArguments: commandArgs,
|
|
229
|
+
...workingDirectory ? { workingDirectory } : {}
|
|
230
|
+
};
|
|
231
|
+
} catch {
|
|
232
|
+
return { ok: false, reason: "malformed_plist" };
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
var classifyMacAutostartStatus = (entrypoint, location, deps) => {
|
|
236
|
+
if (!deps.existsSync(location)) {
|
|
237
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
238
|
+
installed: false,
|
|
239
|
+
health: "missing",
|
|
240
|
+
needsRepair: false,
|
|
241
|
+
reason: "missing_plist"
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const parsed = readMacLaunchAgentProgramArguments(location, deps);
|
|
245
|
+
const expectedWorkingDirectory = resolveMacWorkingDirectory(deps.homedir());
|
|
246
|
+
if (!parsed.ok) {
|
|
247
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
248
|
+
installed: true,
|
|
249
|
+
health: "malformed",
|
|
250
|
+
needsRepair: true,
|
|
251
|
+
expectedWorkingDirectory,
|
|
252
|
+
reason: parsed.reason
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const expectedNodePath = entrypoint.nodePath;
|
|
256
|
+
const expectedCliPath = entrypoint.cliPath;
|
|
257
|
+
const expectedArgs = [expectedNodePath, ...entrypoint.args];
|
|
258
|
+
const actualArgs = parsed.programArguments;
|
|
259
|
+
const actualStatus = classifyPersistedProgramArguments(actualArgs, deps);
|
|
260
|
+
if (actualStatus.health !== "healthy") {
|
|
261
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
262
|
+
installed: true,
|
|
263
|
+
health: "needs_repair",
|
|
264
|
+
needsRepair: true,
|
|
265
|
+
command: parsed.command,
|
|
266
|
+
workingDirectory: parsed.workingDirectory,
|
|
267
|
+
expectedWorkingDirectory,
|
|
268
|
+
reason: actualStatus.reason
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
if (parsed.workingDirectory !== expectedWorkingDirectory) {
|
|
272
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
273
|
+
installed: true,
|
|
274
|
+
health: "needs_repair",
|
|
275
|
+
needsRepair: true,
|
|
276
|
+
command: parsed.command,
|
|
277
|
+
workingDirectory: parsed.workingDirectory,
|
|
278
|
+
expectedWorkingDirectory,
|
|
279
|
+
reason: "working_directory_mismatch"
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
if (!pathIsDirectory(expectedWorkingDirectory, deps)) {
|
|
283
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
284
|
+
installed: true,
|
|
285
|
+
health: "needs_repair",
|
|
286
|
+
needsRepair: true,
|
|
287
|
+
command: parsed.command,
|
|
288
|
+
workingDirectory: parsed.workingDirectory,
|
|
289
|
+
expectedWorkingDirectory,
|
|
290
|
+
reason: "working_directory_mismatch"
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
if (entrypoint.isTransient) {
|
|
294
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
295
|
+
installed: true,
|
|
296
|
+
health: "healthy",
|
|
297
|
+
needsRepair: false,
|
|
298
|
+
command: parsed.command,
|
|
299
|
+
workingDirectory: parsed.workingDirectory,
|
|
300
|
+
expectedWorkingDirectory
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
const mismatchReason = classifyExpectedProgramArguments(expectedArgs, actualArgs, deps);
|
|
304
|
+
if (mismatchReason) {
|
|
305
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
306
|
+
installed: true,
|
|
307
|
+
health: "needs_repair",
|
|
308
|
+
needsRepair: true,
|
|
309
|
+
command: parsed.command,
|
|
310
|
+
workingDirectory: parsed.workingDirectory,
|
|
311
|
+
expectedWorkingDirectory,
|
|
312
|
+
reason: mismatchReason
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
return createMacAutostartStatus(entrypoint, location, {
|
|
316
|
+
installed: true,
|
|
317
|
+
health: "healthy",
|
|
318
|
+
needsRepair: false,
|
|
319
|
+
command: parsed.command,
|
|
320
|
+
workingDirectory: parsed.workingDirectory,
|
|
321
|
+
expectedWorkingDirectory
|
|
322
|
+
});
|
|
323
|
+
};
|
|
324
|
+
var runCommand = (exec, command, args, ignoreFailure = false) => {
|
|
325
|
+
try {
|
|
326
|
+
exec(command, args, { stdio: "ignore" });
|
|
327
|
+
} catch (error) {
|
|
328
|
+
if (ignoreFailure) return;
|
|
329
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
330
|
+
throw new Error(`${command} ${args.join(" ")} failed: ${message}`);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
var assertPersistentEntrypoint = (entrypoint) => {
|
|
334
|
+
if (!entrypoint.isTransient) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
throw new Error(
|
|
338
|
+
`${TRANSIENT_AUTOSTART_INSTALL_ERROR_PREFIX} "${entrypoint.cliPath}". ${STABLE_DAEMON_INSTALL_GUIDANCE} Do not use a temporary npx cache or onboarding workspace.`
|
|
339
|
+
);
|
|
340
|
+
};
|
|
341
|
+
var installMacAutostart = (deps = {}) => {
|
|
342
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
343
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
344
|
+
assertPersistentEntrypoint(entrypoint);
|
|
345
|
+
const home = resolved.homedir();
|
|
346
|
+
const plistPath = getLaunchAgentPath(home);
|
|
347
|
+
const stdoutPath = join(home, "Library", "Logs", "opendevbrowser-daemon.log");
|
|
348
|
+
const stderrPath = join(home, "Library", "Logs", "opendevbrowser-daemon.err.log");
|
|
349
|
+
const workingDirectory = resolveMacWorkingDirectory(home);
|
|
350
|
+
const logsDir = dirname(stdoutPath);
|
|
351
|
+
resolved.mkdirSync(dirname(plistPath), { recursive: true });
|
|
352
|
+
resolved.mkdirSync(logsDir, { recursive: true });
|
|
353
|
+
resolved.mkdirSync(workingDirectory, { recursive: true });
|
|
354
|
+
resolved.writeFileSync(
|
|
355
|
+
plistPath,
|
|
356
|
+
buildLaunchAgentPlist(entrypoint, { stdoutPath, stderrPath, workingDirectory }),
|
|
357
|
+
{ encoding: "utf-8" }
|
|
358
|
+
);
|
|
359
|
+
const uid = resolved.uid;
|
|
360
|
+
runCommand(resolved.execFileSync, "launchctl", ["bootout", `gui/${uid}`, plistPath], true);
|
|
361
|
+
runCommand(resolved.execFileSync, "launchctl", ["bootstrap", `gui/${uid}`, plistPath]);
|
|
362
|
+
runCommand(resolved.execFileSync, "launchctl", ["enable", `gui/${uid}/${MAC_LABEL}`], true);
|
|
363
|
+
runCommand(resolved.execFileSync, "launchctl", ["kickstart", "-k", `gui/${uid}/${MAC_LABEL}`], true);
|
|
364
|
+
return createMacAutostartStatus(entrypoint, plistPath, {
|
|
365
|
+
installed: true,
|
|
366
|
+
health: "healthy",
|
|
367
|
+
needsRepair: false,
|
|
368
|
+
command: entrypoint.command,
|
|
369
|
+
workingDirectory,
|
|
370
|
+
expectedWorkingDirectory: workingDirectory
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
var uninstallMacAutostart = (deps = {}) => {
|
|
374
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
375
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
376
|
+
const plistPath = getLaunchAgentPath(resolved.homedir());
|
|
377
|
+
const uid = resolved.uid;
|
|
378
|
+
runCommand(resolved.execFileSync, "launchctl", ["bootout", `gui/${uid}`, plistPath], true);
|
|
379
|
+
if (resolved.existsSync(plistPath)) {
|
|
380
|
+
resolved.unlinkSync(plistPath);
|
|
381
|
+
}
|
|
382
|
+
return createMacAutostartStatus(entrypoint, plistPath, {
|
|
383
|
+
installed: false,
|
|
384
|
+
health: "missing",
|
|
385
|
+
needsRepair: false,
|
|
386
|
+
reason: "missing_plist"
|
|
387
|
+
});
|
|
388
|
+
};
|
|
389
|
+
var isWindowsTaskInstalled = (deps = {}) => {
|
|
390
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
391
|
+
try {
|
|
392
|
+
resolved.execFileSync("schtasks", ["/Query", "/TN", WIN_TASK_NAME], { stdio: "ignore" });
|
|
393
|
+
return true;
|
|
394
|
+
} catch {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
var decodeXmlText = (value) => {
|
|
399
|
+
return value.replace(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
400
|
+
};
|
|
401
|
+
var readXmlTag = (xml, tagName) => {
|
|
402
|
+
const match = xml.match(new RegExp(`<${tagName}>([\\s\\S]*?)</${tagName}>`, "i"));
|
|
403
|
+
return match?.[1] ? decodeXmlText(match[1]) : void 0;
|
|
404
|
+
};
|
|
405
|
+
var splitCommandLine = (value) => {
|
|
406
|
+
const args = [];
|
|
407
|
+
let current = "";
|
|
408
|
+
let inQuotes = false;
|
|
409
|
+
let backslashes = 0;
|
|
410
|
+
for (const char of value) {
|
|
411
|
+
if (char === "\\") {
|
|
412
|
+
backslashes += 1;
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if (char === '"') {
|
|
416
|
+
if (backslashes > 0) {
|
|
417
|
+
current += "\\".repeat(Math.floor(backslashes / 2));
|
|
418
|
+
if (backslashes % 2 === 1) {
|
|
419
|
+
current += '"';
|
|
420
|
+
backslashes = 0;
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
backslashes = 0;
|
|
425
|
+
inQuotes = !inQuotes;
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
if (backslashes > 0) {
|
|
429
|
+
current += "\\".repeat(backslashes);
|
|
430
|
+
backslashes = 0;
|
|
431
|
+
}
|
|
432
|
+
if (!inQuotes && /\s/.test(char)) {
|
|
433
|
+
if (current.length > 0) {
|
|
434
|
+
args.push(current);
|
|
435
|
+
current = "";
|
|
436
|
+
}
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
current += char;
|
|
440
|
+
}
|
|
441
|
+
if (backslashes > 0) {
|
|
442
|
+
current += "\\".repeat(backslashes);
|
|
443
|
+
}
|
|
444
|
+
if (current.length > 0) {
|
|
445
|
+
args.push(current);
|
|
446
|
+
}
|
|
447
|
+
return args;
|
|
448
|
+
};
|
|
449
|
+
var readWindowsTaskAction = (taskName, deps) => {
|
|
450
|
+
try {
|
|
451
|
+
const xml = deps.execFileSync("schtasks", ["/Query", "/TN", taskName, "/XML"], { encoding: "utf-8" });
|
|
452
|
+
const command = readXmlTag(xml, "Command");
|
|
453
|
+
const argumentsValue = readXmlTag(xml, "Arguments");
|
|
454
|
+
if (!command) {
|
|
455
|
+
return { ok: false };
|
|
456
|
+
}
|
|
457
|
+
const programArguments = argumentsValue !== void 0 ? [command, ...splitCommandLine(argumentsValue)] : splitCommandLine(command);
|
|
458
|
+
if (programArguments.length === 0) {
|
|
459
|
+
return { ok: false };
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
ok: true,
|
|
463
|
+
command: formatCommand(programArguments),
|
|
464
|
+
programArguments
|
|
465
|
+
};
|
|
466
|
+
} catch {
|
|
467
|
+
return { ok: false };
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
var classifyWindowsAutostartStatus = (entrypoint, deps) => {
|
|
471
|
+
const installed = isWindowsTaskInstalled(deps);
|
|
472
|
+
if (!installed) {
|
|
473
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
474
|
+
installed: false,
|
|
475
|
+
health: "missing",
|
|
476
|
+
needsRepair: false
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
const parsed = readWindowsTaskAction(WIN_TASK_NAME, deps);
|
|
480
|
+
if (!parsed.ok) {
|
|
481
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
482
|
+
installed: true,
|
|
483
|
+
health: "needs_repair",
|
|
484
|
+
needsRepair: true,
|
|
485
|
+
reason: "entrypoint_mismatch"
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
const expectedArgs = [entrypoint.nodePath, ...entrypoint.args];
|
|
489
|
+
const actualStatus = classifyPersistedProgramArguments(parsed.programArguments, deps);
|
|
490
|
+
if (actualStatus.health !== "healthy") {
|
|
491
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
492
|
+
installed: true,
|
|
493
|
+
health: "needs_repair",
|
|
494
|
+
needsRepair: true,
|
|
495
|
+
command: parsed.command,
|
|
496
|
+
reason: actualStatus.reason
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
if (entrypoint.isTransient) {
|
|
500
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
501
|
+
installed: true,
|
|
502
|
+
health: "healthy",
|
|
503
|
+
needsRepair: false,
|
|
504
|
+
command: parsed.command
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
const mismatchReason = classifyExpectedProgramArguments(expectedArgs, parsed.programArguments, deps);
|
|
508
|
+
if (mismatchReason) {
|
|
509
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
510
|
+
installed: true,
|
|
511
|
+
health: "needs_repair",
|
|
512
|
+
needsRepair: true,
|
|
513
|
+
command: parsed.command,
|
|
514
|
+
reason: mismatchReason
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
518
|
+
installed: true,
|
|
519
|
+
health: "healthy",
|
|
520
|
+
needsRepair: false,
|
|
521
|
+
command: parsed.command
|
|
522
|
+
});
|
|
523
|
+
};
|
|
524
|
+
var installWindowsAutostart = (deps = {}) => {
|
|
525
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
526
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
527
|
+
assertPersistentEntrypoint(entrypoint);
|
|
528
|
+
const { args } = buildWindowsTaskArgs(entrypoint, WIN_TASK_NAME);
|
|
529
|
+
runCommand(resolved.execFileSync, "schtasks", args);
|
|
530
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
531
|
+
installed: true,
|
|
532
|
+
health: "healthy",
|
|
533
|
+
needsRepair: false,
|
|
534
|
+
command: entrypoint.command
|
|
535
|
+
});
|
|
536
|
+
};
|
|
537
|
+
var uninstallWindowsAutostart = (deps = {}) => {
|
|
538
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
539
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
540
|
+
runCommand(resolved.execFileSync, "schtasks", ["/Delete", "/TN", WIN_TASK_NAME, "/F"], true);
|
|
541
|
+
return createWindowsAutostartStatus(entrypoint, {
|
|
542
|
+
installed: false,
|
|
543
|
+
health: "missing",
|
|
544
|
+
needsRepair: false
|
|
545
|
+
});
|
|
546
|
+
};
|
|
547
|
+
var getAutostartStatus = (deps = {}) => {
|
|
548
|
+
const resolved = { ...defaultDeps(), ...deps };
|
|
549
|
+
const platform = resolved.platform;
|
|
550
|
+
if (platform === "darwin") {
|
|
551
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
552
|
+
const location = getLaunchAgentPath(resolved.homedir());
|
|
553
|
+
return classifyMacAutostartStatus(entrypoint, location, resolved);
|
|
554
|
+
}
|
|
555
|
+
if (platform === "win32") {
|
|
556
|
+
const entrypoint = resolveCliEntrypoint(resolved);
|
|
557
|
+
return classifyWindowsAutostartStatus(entrypoint, resolved);
|
|
558
|
+
}
|
|
559
|
+
return createAutostartStatus({
|
|
560
|
+
platform,
|
|
561
|
+
supported: false,
|
|
562
|
+
installed: false,
|
|
563
|
+
health: "unsupported",
|
|
564
|
+
needsRepair: false,
|
|
565
|
+
reason: "unsupported_platform"
|
|
566
|
+
});
|
|
567
|
+
};
|
|
568
|
+
var installAutostart = (deps = {}) => {
|
|
569
|
+
const platform = deps.platform ?? process.platform;
|
|
570
|
+
if (platform === "darwin") {
|
|
571
|
+
return installMacAutostart(deps);
|
|
572
|
+
}
|
|
573
|
+
if (platform === "win32") {
|
|
574
|
+
return installWindowsAutostart(deps);
|
|
575
|
+
}
|
|
576
|
+
return createAutostartStatus({
|
|
577
|
+
platform,
|
|
578
|
+
supported: false,
|
|
579
|
+
installed: false,
|
|
580
|
+
health: "unsupported",
|
|
581
|
+
needsRepair: false,
|
|
582
|
+
reason: "unsupported_platform"
|
|
583
|
+
});
|
|
584
|
+
};
|
|
585
|
+
var uninstallAutostart = (deps = {}) => {
|
|
586
|
+
const platform = deps.platform ?? process.platform;
|
|
587
|
+
if (platform === "darwin") {
|
|
588
|
+
return uninstallMacAutostart(deps);
|
|
589
|
+
}
|
|
590
|
+
if (platform === "win32") {
|
|
591
|
+
return uninstallWindowsAutostart(deps);
|
|
592
|
+
}
|
|
593
|
+
return createAutostartStatus({
|
|
594
|
+
platform,
|
|
595
|
+
supported: false,
|
|
596
|
+
installed: false,
|
|
597
|
+
health: "unsupported",
|
|
598
|
+
needsRepair: false,
|
|
599
|
+
reason: "unsupported_platform"
|
|
600
|
+
});
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
export {
|
|
604
|
+
STABLE_DAEMON_INSTALL_GUIDANCE,
|
|
605
|
+
isTransientAutostartInstallError,
|
|
606
|
+
getAutostartStatus,
|
|
607
|
+
installAutostart,
|
|
608
|
+
uninstallAutostart
|
|
609
|
+
};
|
|
610
|
+
//# sourceMappingURL=chunk-WOXBLP7V.js.map
|