opendevbrowser 0.0.28 → 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.
Files changed (313) hide show
  1. package/README.md +2 -2
  2. package/dist/accessibility-snapshot-PA6NWNS7.js +39 -0
  3. package/dist/accessibility-snapshot-PA6NWNS7.js.map +1 -0
  4. package/dist/active-window-YNYTIPZN.js +37 -0
  5. package/dist/active-window-YNYTIPZN.js.map +1 -0
  6. package/dist/annotate-STYHXZYJ.js +205 -0
  7. package/dist/annotate-STYHXZYJ.js.map +1 -0
  8. package/dist/artifacts-KJ6RNDO2.js +120 -0
  9. package/dist/artifacts-KJ6RNDO2.js.map +1 -0
  10. package/dist/attr-GHFZZ4SA.js +84 -0
  11. package/dist/attr-GHFZZ4SA.js.map +1 -0
  12. package/dist/browser/ops-client.d.ts +1 -0
  13. package/dist/browser/ops-client.d.ts.map +1 -1
  14. package/dist/canvas-54FBOEGP.js +309 -0
  15. package/dist/canvas-54FBOEGP.js.map +1 -0
  16. package/dist/capture-desktop-SNABC24E.js +38 -0
  17. package/dist/capture-desktop-SNABC24E.js.map +1 -0
  18. package/dist/capture-window-UJSB5AMP.js +40 -0
  19. package/dist/capture-window-UJSB5AMP.js.map +1 -0
  20. package/dist/check-ST5UQ2F5.js +71 -0
  21. package/dist/check-ST5UQ2F5.js.map +1 -0
  22. package/dist/checked-IEMWI5CU.js +71 -0
  23. package/dist/checked-IEMWI5CU.js.map +1 -0
  24. package/dist/chunk-2CG4SW3E.js +64 -0
  25. package/dist/chunk-2CG4SW3E.js.map +1 -0
  26. package/dist/chunk-2SIMIPLY.js +67 -0
  27. package/dist/chunk-2SIMIPLY.js.map +1 -0
  28. package/dist/chunk-37VSRUW4.js +141 -0
  29. package/dist/chunk-37VSRUW4.js.map +1 -0
  30. package/dist/chunk-5SWZDVOW.js +144 -0
  31. package/dist/chunk-5SWZDVOW.js.map +1 -0
  32. package/dist/chunk-6PVZ2ABC.js +429 -0
  33. package/dist/chunk-6PVZ2ABC.js.map +1 -0
  34. package/dist/chunk-7GVOUZMQ.js +64 -0
  35. package/dist/chunk-7GVOUZMQ.js.map +1 -0
  36. package/dist/chunk-7THCPS52.js +84 -0
  37. package/dist/chunk-7THCPS52.js.map +1 -0
  38. package/dist/chunk-ASMHEEKY.js +10 -0
  39. package/dist/chunk-ASMHEEKY.js.map +1 -0
  40. package/dist/chunk-DBF5OKH3.js +111 -0
  41. package/dist/chunk-DBF5OKH3.js.map +1 -0
  42. package/dist/chunk-DW4TX7MU.js +54 -0
  43. package/dist/chunk-DW4TX7MU.js.map +1 -0
  44. package/dist/chunk-IPE7TF2P.js +54 -0
  45. package/dist/chunk-IPE7TF2P.js.map +1 -0
  46. package/dist/chunk-IQTJHXZJ.js +126 -0
  47. package/dist/chunk-IQTJHXZJ.js.map +1 -0
  48. package/dist/chunk-J47N77VG.js +2969 -0
  49. package/dist/chunk-J47N77VG.js.map +1 -0
  50. package/dist/chunk-JZXD6FWR.js +25 -0
  51. package/dist/chunk-JZXD6FWR.js.map +1 -0
  52. package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
  53. package/dist/chunk-KDSNXS6N.js.map +1 -0
  54. package/dist/chunk-KZ2IXVQT.js +219 -0
  55. package/dist/chunk-KZ2IXVQT.js.map +1 -0
  56. package/dist/chunk-LBPELU7L.js +3649 -0
  57. package/dist/chunk-LBPELU7L.js.map +1 -0
  58. package/dist/chunk-MX3NFLCE.js +940 -0
  59. package/dist/chunk-MX3NFLCE.js.map +1 -0
  60. package/dist/chunk-N44UXKIB.js +26 -0
  61. package/dist/chunk-N44UXKIB.js.map +1 -0
  62. package/dist/chunk-OW5HMYMI.js +19 -0
  63. package/dist/chunk-OW5HMYMI.js.map +1 -0
  64. package/dist/chunk-OYNLAZQU.js +838 -0
  65. package/dist/chunk-OYNLAZQU.js.map +1 -0
  66. package/dist/chunk-PDPJN2OP.js +17 -0
  67. package/dist/chunk-PDPJN2OP.js.map +1 -0
  68. package/dist/chunk-RCZZGGJS.js +226 -0
  69. package/dist/chunk-RCZZGGJS.js.map +1 -0
  70. package/dist/chunk-RJNI3BHT.js +1 -0
  71. package/dist/chunk-RPXWUCQQ.js +112 -0
  72. package/dist/chunk-RPXWUCQQ.js.map +1 -0
  73. package/dist/chunk-S5KZQJJI.js +107 -0
  74. package/dist/chunk-S5KZQJJI.js.map +1 -0
  75. package/dist/{chunk-T3VVHJTK.js → chunk-S6S2UP6U.js} +1074 -1459
  76. package/dist/chunk-S6S2UP6U.js.map +1 -0
  77. package/dist/{chunk-I5ZCOZZV.js → chunk-SXAGSEKZ.js} +1202 -9561
  78. package/dist/chunk-SXAGSEKZ.js.map +1 -0
  79. package/dist/chunk-T4GMCW6Z.js +46 -0
  80. package/dist/chunk-T4GMCW6Z.js.map +1 -0
  81. package/dist/chunk-WHQZBUNY.js +982 -0
  82. package/dist/chunk-WHQZBUNY.js.map +1 -0
  83. package/dist/chunk-WOXBLP7V.js +610 -0
  84. package/dist/chunk-WOXBLP7V.js.map +1 -0
  85. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  86. package/dist/cli/commands/macro-resolve.d.ts +4 -1
  87. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  88. package/dist/cli/commands/product-video.d.ts.map +1 -1
  89. package/dist/cli/commands/research.d.ts.map +1 -1
  90. package/dist/cli/commands/serve.d.ts.map +1 -1
  91. package/dist/cli/commands/shopping.d.ts.map +1 -1
  92. package/dist/cli/commands/workflow-output.d.ts +2 -0
  93. package/dist/cli/commands/workflow-output.d.ts.map +1 -0
  94. package/dist/cli/daemon-commands.d.ts.map +1 -1
  95. package/dist/cli/daemon.d.ts.map +1 -1
  96. package/dist/cli/index.js +204 -8123
  97. package/dist/cli/index.js.map +1 -1
  98. package/dist/cli/installers/postinstall-skill-sync.js +2 -1
  99. package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
  100. package/dist/cli/remote-relay.d.ts.map +1 -1
  101. package/dist/click-TENZA3Y6.js +81 -0
  102. package/dist/click-TENZA3Y6.js.map +1 -0
  103. package/dist/clone-component-STH5AR6M.js +82 -0
  104. package/dist/clone-component-STH5AR6M.js.map +1 -0
  105. package/dist/clone-page-BSTWAPAJ.js +69 -0
  106. package/dist/clone-page-BSTWAPAJ.js.map +1 -0
  107. package/dist/close-CEMMAAM7.js +63 -0
  108. package/dist/close-CEMMAAM7.js.map +1 -0
  109. package/dist/close-QCWUNRAI.js +63 -0
  110. package/dist/close-QCWUNRAI.js.map +1 -0
  111. package/dist/connect-J3RVSEZF.js +107 -0
  112. package/dist/connect-J3RVSEZF.js.map +1 -0
  113. package/dist/console-poll-HL7BVIVX.js +76 -0
  114. package/dist/console-poll-HL7BVIVX.js.map +1 -0
  115. package/dist/cookie-import-WMUCIIHN.js +177 -0
  116. package/dist/cookie-import-WMUCIIHN.js.map +1 -0
  117. package/dist/cookie-list-PB2N4RPH.js +117 -0
  118. package/dist/cookie-list-PB2N4RPH.js.map +1 -0
  119. package/dist/daemon-5KSVMGN4.js +194 -0
  120. package/dist/daemon-5KSVMGN4.js.map +1 -0
  121. package/dist/daemon-fingerprint.json +1 -1
  122. package/dist/debug-trace-snapshot-RK7KDXA5.js +136 -0
  123. package/dist/debug-trace-snapshot-RK7KDXA5.js.map +1 -0
  124. package/dist/dialog-P6P4U7XE.js +75 -0
  125. package/dist/dialog-P6P4U7XE.js.map +1 -0
  126. package/dist/disconnect-32F7IDIP.js +58 -0
  127. package/dist/disconnect-32F7IDIP.js.map +1 -0
  128. package/dist/enabled-A6C6ZM2O.js +71 -0
  129. package/dist/enabled-A6C6ZM2O.js.map +1 -0
  130. package/dist/extension-extractor-GKWSFHPN.js +11 -0
  131. package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
  132. package/dist/global-D6WLWBXA.js +56 -0
  133. package/dist/global-D6WLWBXA.js.map +1 -0
  134. package/dist/goto-ULTSABDM.js +98 -0
  135. package/dist/goto-ULTSABDM.js.map +1 -0
  136. package/dist/help-EKKKEDL5.js +491 -0
  137. package/dist/help-EKKKEDL5.js.map +1 -0
  138. package/dist/hover-UF2ZUMTQ.js +71 -0
  139. package/dist/hover-UF2ZUMTQ.js.map +1 -0
  140. package/dist/html-B6TX7GK7.js +84 -0
  141. package/dist/html-B6TX7GK7.js.map +1 -0
  142. package/dist/index.js +68 -34
  143. package/dist/index.js.map +1 -1
  144. package/dist/inspector-6S5FKUZQ.js +62 -0
  145. package/dist/inspector-6S5FKUZQ.js.map +1 -0
  146. package/dist/inspector-audit-ARGEGOS7.js +84 -0
  147. package/dist/inspector-audit-ARGEGOS7.js.map +1 -0
  148. package/dist/inspector-plan-CSG5HZOC.js +69 -0
  149. package/dist/inspector-plan-CSG5HZOC.js.map +1 -0
  150. package/dist/inspiredesign-7VRMMZN4.js +234 -0
  151. package/dist/inspiredesign-7VRMMZN4.js.map +1 -0
  152. package/dist/install-autostart-output-5DOMKCQL.js +41 -0
  153. package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
  154. package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
  155. package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
  156. package/dist/launch-REYCIR3Z.js +225 -0
  157. package/dist/launch-REYCIR3Z.js.map +1 -0
  158. package/dist/list-NPRXRQY2.js +51 -0
  159. package/dist/list-NPRXRQY2.js.map +1 -0
  160. package/dist/list-STYD2ZWA.js +54 -0
  161. package/dist/list-STYD2ZWA.js.map +1 -0
  162. package/dist/local-HXJLUUNT.js +54 -0
  163. package/dist/local-HXJLUUNT.js.map +1 -0
  164. package/dist/macro-resolve-ZIJZ65QI.js +253 -0
  165. package/dist/macro-resolve-ZIJZ65QI.js.map +1 -0
  166. package/dist/macros/execute-runtime.d.ts +3 -1
  167. package/dist/macros/execute-runtime.d.ts.map +1 -1
  168. package/dist/macros/execute.d.ts +2 -0
  169. package/dist/macros/execute.d.ts.map +1 -1
  170. package/dist/native-UPLVQ2SG.js +22 -0
  171. package/dist/native-UPLVQ2SG.js.map +1 -0
  172. package/dist/network-poll-HLDOSC72.js +76 -0
  173. package/dist/network-poll-HLDOSC72.js.map +1 -0
  174. package/dist/new-HXLLN6UT.js +69 -0
  175. package/dist/new-HXLLN6UT.js.map +1 -0
  176. package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
  177. package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
  178. package/dist/open-KDR25LQZ.js +81 -0
  179. package/dist/open-KDR25LQZ.js.map +1 -0
  180. package/dist/opendevbrowser.js +68 -34
  181. package/dist/opendevbrowser.js.map +1 -1
  182. package/dist/perf-EM6SWFJ6.js +58 -0
  183. package/dist/perf-EM6SWFJ6.js.map +1 -0
  184. package/dist/pointer-down-ZYWRZNCH.js +55 -0
  185. package/dist/pointer-down-ZYWRZNCH.js.map +1 -0
  186. package/dist/pointer-drag-LVEAVJO4.js +54 -0
  187. package/dist/pointer-drag-LVEAVJO4.js.map +1 -0
  188. package/dist/pointer-move-7SRKUS66.js +52 -0
  189. package/dist/pointer-move-7SRKUS66.js.map +1 -0
  190. package/dist/pointer-up-KLDBSK37.js +55 -0
  191. package/dist/pointer-up-KLDBSK37.js.map +1 -0
  192. package/dist/press-UIIXFTD7.js +83 -0
  193. package/dist/press-UIIXFTD7.js.map +1 -0
  194. package/dist/product-video-PYOXJVAI.js +235 -0
  195. package/dist/product-video-PYOXJVAI.js.map +1 -0
  196. package/dist/providers/artifacts.d.ts +0 -2
  197. package/dist/providers/artifacts.d.ts.map +1 -1
  198. package/dist/providers/blocker.d.ts.map +1 -1
  199. package/dist/providers/bounded-map.d.ts +2 -0
  200. package/dist/providers/bounded-map.d.ts.map +1 -0
  201. package/dist/providers/community/index.d.ts.map +1 -1
  202. package/dist/providers/constraint.d.ts.map +1 -1
  203. package/dist/providers/index.d.ts +1 -0
  204. package/dist/providers/index.d.ts.map +1 -1
  205. package/dist/providers/renderer.d.ts.map +1 -1
  206. package/dist/providers/research-compiler.d.ts +1 -1
  207. package/dist/providers/research-compiler.d.ts.map +1 -1
  208. package/dist/providers/research-executor.d.ts.map +1 -1
  209. package/dist/providers/runtime-factory.d.ts.map +1 -1
  210. package/dist/providers/shared/traversal-url.d.ts +3 -0
  211. package/dist/providers/shared/traversal-url.d.ts.map +1 -1
  212. package/dist/providers/shopping/index.d.ts.map +1 -1
  213. package/dist/providers/social/search-quality.d.ts.map +1 -1
  214. package/dist/providers/workflow-handoff.d.ts +4 -0
  215. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  216. package/dist/providers/workflows.d.ts.map +1 -1
  217. package/dist/{providers-QF2RFB4J.js → providers-4YY2BLXG.js} +19 -14
  218. package/dist/providers-4YY2BLXG.js.map +1 -0
  219. package/dist/public-surface/generated-manifest.d.ts +2 -2
  220. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  221. package/dist/public-surface/source.d.ts +2 -2
  222. package/dist/public-surface/source.d.ts.map +1 -1
  223. package/dist/relay/protocol.d.ts +3 -1
  224. package/dist/relay/protocol.d.ts.map +1 -1
  225. package/dist/relay/relay-server.d.ts +6 -0
  226. package/dist/relay/relay-server.d.ts.map +1 -1
  227. package/dist/research-CKXMJ2DK.js +295 -0
  228. package/dist/research-CKXMJ2DK.js.map +1 -0
  229. package/dist/review-7HWJPZOD.js +48 -0
  230. package/dist/review-7HWJPZOD.js.map +1 -0
  231. package/dist/review-desktop-2IBJHFB5.js +54 -0
  232. package/dist/review-desktop-2IBJHFB5.js.map +1 -0
  233. package/dist/rpc-3HGIEJUO.js +159 -0
  234. package/dist/rpc-3HGIEJUO.js.map +1 -0
  235. package/dist/run-ADRYI3MS.js +180 -0
  236. package/dist/run-ADRYI3MS.js.map +1 -0
  237. package/dist/screencast-start-DTLUHD5H.js +67 -0
  238. package/dist/screencast-start-DTLUHD5H.js.map +1 -0
  239. package/dist/screencast-stop-54C5LRSS.js +59 -0
  240. package/dist/screencast-stop-54C5LRSS.js.map +1 -0
  241. package/dist/screenshot-HOAKR7P7.js +68 -0
  242. package/dist/screenshot-HOAKR7P7.js.map +1 -0
  243. package/dist/scroll-IAOO5COY.js +84 -0
  244. package/dist/scroll-IAOO5COY.js.map +1 -0
  245. package/dist/scroll-into-view-RKWSLAPH.js +71 -0
  246. package/dist/scroll-into-view-RKWSLAPH.js.map +1 -0
  247. package/dist/select-IGD3T6X4.js +86 -0
  248. package/dist/select-IGD3T6X4.js.map +1 -0
  249. package/dist/serve-7X4INUCU.js +498 -0
  250. package/dist/serve-7X4INUCU.js.map +1 -0
  251. package/dist/shopping-FC6DRW76.js +273 -0
  252. package/dist/shopping-FC6DRW76.js.map +1 -0
  253. package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
  254. package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
  255. package/dist/skills-NSXDX6YM.js +26 -0
  256. package/dist/skills-NSXDX6YM.js.map +1 -0
  257. package/dist/snapshot-X22GG324.js +113 -0
  258. package/dist/snapshot-X22GG324.js.map +1 -0
  259. package/dist/status-SP55LMNW.js +132 -0
  260. package/dist/status-SP55LMNW.js.map +1 -0
  261. package/dist/status-VH2WXIDG.js +35 -0
  262. package/dist/status-VH2WXIDG.js.map +1 -0
  263. package/dist/status-capabilities-YBERLRRA.js +57 -0
  264. package/dist/status-capabilities-YBERLRRA.js.map +1 -0
  265. package/dist/text-6TB5WNLI.js +84 -0
  266. package/dist/text-6TB5WNLI.js.map +1 -0
  267. package/dist/tools/macro_resolve.d.ts.map +1 -1
  268. package/dist/type-3UI3TQH3.js +94 -0
  269. package/dist/type-3UI3TQH3.js.map +1 -0
  270. package/dist/uncheck-5L3D2D4U.js +71 -0
  271. package/dist/uncheck-5L3D2D4U.js.map +1 -0
  272. package/dist/uninstall-KYKGJAX7.js +91 -0
  273. package/dist/uninstall-KYKGJAX7.js.map +1 -0
  274. package/dist/update-SMXPYGXS.js +305 -0
  275. package/dist/update-SMXPYGXS.js.map +1 -0
  276. package/dist/update-skill-modes-BVX7IVMW.js +38 -0
  277. package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
  278. package/dist/upload-YG4J2EMI.js +56 -0
  279. package/dist/upload-YG4J2EMI.js.map +1 -0
  280. package/dist/use-V3LGFP3K.js +63 -0
  281. package/dist/use-V3LGFP3K.js.map +1 -0
  282. package/dist/value-3247D57X.js +71 -0
  283. package/dist/value-3247D57X.js.map +1 -0
  284. package/dist/visible-A7HEV36U.js +71 -0
  285. package/dist/visible-A7HEV36U.js.map +1 -0
  286. package/dist/wait-UZPP4Y4R.js +109 -0
  287. package/dist/wait-UZPP4Y4R.js.map +1 -0
  288. package/dist/windows-76TR3AIP.js +37 -0
  289. package/dist/windows-76TR3AIP.js.map +1 -0
  290. package/extension/dist/background.js +99 -22
  291. package/extension/dist/ops/ops-runtime.js +85 -7
  292. package/extension/dist/ops/ops-session-store.js +3 -0
  293. package/extension/dist/ops/target-session-coordinator.js +3 -0
  294. package/extension/dist/services/CDPRouter.js +9 -0
  295. package/extension/manifest.json +1 -1
  296. package/package.json +1 -1
  297. package/skills/opendevbrowser-best-practices/SKILL.md +8 -6
  298. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
  299. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
  300. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
  301. package/skills/opendevbrowser-research/SKILL.md +64 -12
  302. package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
  303. package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
  304. package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
  305. package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
  306. package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
  307. package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
  308. package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
  309. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
  310. package/dist/chunk-I5ZCOZZV.js.map +0 -1
  311. package/dist/chunk-QVWOPIZJ.js.map +0 -1
  312. package/dist/chunk-T3VVHJTK.js.map +0 -1
  313. /package/dist/{providers-QF2RFB4J.js.map → chunk-RJNI3BHT.js.map} +0 -0
@@ -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 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 `Daemon on 127.0.0.1:${staleConnection.connection.port} pid=${staleConnection.status.pid} is protected by a different opendevbrowser build. Start with \\`opendevbrowser serve\\`.`\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"]}
@@ -0,0 +1,17 @@
1
+ import {
2
+ createUsageError
3
+ } from "./chunk-IPE7TF2P.js";
4
+
5
+ // src/cli/commands/workflow-output.ts
6
+ import { resolve } from "path";
7
+ var resolveWorkflowOutputDirFlag = (value = ".opendevbrowser", flag = "--output-dir") => {
8
+ if (value.trim() === "") {
9
+ throw createUsageError(`Missing value for ${flag}`);
10
+ }
11
+ return resolve(value);
12
+ };
13
+
14
+ export {
15
+ resolveWorkflowOutputDirFlag
16
+ };
17
+ //# sourceMappingURL=chunk-PDPJN2OP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/workflow-output.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { createUsageError } from \"../errors\";\n\nexport const resolveWorkflowOutputDirFlag = (value = \".opendevbrowser\", flag = \"--output-dir\"): string => {\n if (value.trim() === \"\") {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return resolve(value);\n};\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AAGjB,IAAM,+BAA+B,CAAC,QAAQ,mBAAmB,OAAO,mBAA2B;AACxG,MAAI,MAAM,KAAK,MAAM,IAAI;AACvB,UAAM,iBAAiB,qBAAqB,IAAI,EAAE;AAAA,EACpD;AACA,SAAO,QAAQ,KAAK;AACtB;","names":[]}
@@ -0,0 +1,226 @@
1
+ import {
2
+ CLI_COMMANDS,
3
+ VALID_EQUALS_FLAGS,
4
+ VALID_FLAGS
5
+ } from "./chunk-J47N77VG.js";
6
+ import {
7
+ createUsageError
8
+ } from "./chunk-IPE7TF2P.js";
9
+
10
+ // src/cli/args.ts
11
+ var CLI_COMMAND_SET = new Set(CLI_COMMANDS);
12
+ var SHORT_FLAGS = {
13
+ "-g": "--global",
14
+ "-l": "--local",
15
+ "-u": "--update",
16
+ "-h": "--help",
17
+ "-v": "--version",
18
+ "-f": "--full"
19
+ };
20
+ function expandShortFlags(args) {
21
+ return args.map((arg) => SHORT_FLAGS[arg] ?? arg);
22
+ }
23
+ function parseSkillsMode(args) {
24
+ const hasLocal = args.includes("--skills-local");
25
+ const hasGlobal = args.includes("--skills-global");
26
+ if (hasLocal && hasGlobal) {
27
+ throw createUsageError("Choose either --skills-local or --skills-global.");
28
+ }
29
+ if (args.includes("--no-skills")) {
30
+ return "none";
31
+ }
32
+ if (hasLocal) {
33
+ return "local";
34
+ }
35
+ if (hasGlobal) {
36
+ return "global";
37
+ }
38
+ return "global";
39
+ }
40
+ function parseOutputFormat(args) {
41
+ const outputFlag = args.find((arg) => arg.startsWith("--output-format"));
42
+ if (!outputFlag) {
43
+ return "text";
44
+ }
45
+ let value;
46
+ if (outputFlag.includes("=")) {
47
+ value = outputFlag.split("=", 2)[1];
48
+ } else {
49
+ const index = args.indexOf(outputFlag);
50
+ value = index >= 0 ? args[index + 1] : void 0;
51
+ }
52
+ if (value === "text" || value === "json" || value === "stream-json") {
53
+ return value;
54
+ }
55
+ throw createUsageError(`Invalid --output-format: ${value ?? "missing"}`);
56
+ }
57
+ function parseTransport(args) {
58
+ const transportFlag = args.find((arg) => arg.startsWith("--transport"));
59
+ if (!transportFlag) {
60
+ return "relay";
61
+ }
62
+ let value;
63
+ if (transportFlag.includes("=")) {
64
+ value = transportFlag.split("=", 2)[1];
65
+ } else {
66
+ const index = args.indexOf(transportFlag);
67
+ value = index >= 0 ? args[index + 1] : void 0;
68
+ }
69
+ if (value === "relay" || value === "native") {
70
+ return value;
71
+ }
72
+ throw createUsageError(`Invalid --transport: ${value ?? "missing"}`);
73
+ }
74
+ var VALID_FLAG_SET = new Set(VALID_FLAGS);
75
+ var VALID_EQUALS_FLAG_SET = new Set(VALID_EQUALS_FLAGS);
76
+ var SIGNED_VALUE_FLAG_SET = /* @__PURE__ */ new Set(["--dy"]);
77
+ var SIGNED_INTEGER_VALUE = /^-\d+$/;
78
+ function shouldSkipValueToken(flag, value) {
79
+ if (!VALID_EQUALS_FLAG_SET.has(flag) || value === void 0) {
80
+ return false;
81
+ }
82
+ if (!value.startsWith("-")) {
83
+ return true;
84
+ }
85
+ return SIGNED_VALUE_FLAG_SET.has(flag) && SIGNED_INTEGER_VALUE.test(value);
86
+ }
87
+ function parseArgs(argv) {
88
+ let args = expandShortFlags(argv.slice(2));
89
+ let commandOverride = null;
90
+ if (args[0] && !args[0].startsWith("-")) {
91
+ const candidate = args[0];
92
+ if (CLI_COMMAND_SET.has(candidate)) {
93
+ commandOverride = candidate;
94
+ args = args.slice(1);
95
+ } else {
96
+ throw createUsageError(`Unknown command: ${candidate}`);
97
+ }
98
+ }
99
+ const hasGlobal = args.includes("--global");
100
+ const hasLocal = args.includes("--local");
101
+ if (hasGlobal && hasLocal) {
102
+ throw createUsageError("Choose either --global or --local.");
103
+ }
104
+ const skillsMode = parseSkillsMode(args);
105
+ const fullInstall = args.includes("--full");
106
+ const outputFormat = parseOutputFormat(args);
107
+ const transport = commandOverride === "annotate" ? "relay" : parseTransport(args);
108
+ if (commandOverride === "help" || args.includes("--help") || args.includes("-h")) {
109
+ return {
110
+ command: "help",
111
+ withConfig: false,
112
+ noPrompt: false,
113
+ noInteractive: false,
114
+ quiet: false,
115
+ outputFormat,
116
+ transport,
117
+ skillsMode,
118
+ fullInstall,
119
+ rawArgs: args
120
+ };
121
+ }
122
+ if (commandOverride === "version" || args.includes("--version") || args.includes("-v")) {
123
+ return {
124
+ command: "version",
125
+ withConfig: false,
126
+ noPrompt: false,
127
+ noInteractive: false,
128
+ quiet: false,
129
+ outputFormat,
130
+ transport,
131
+ skillsMode,
132
+ fullInstall,
133
+ rawArgs: args
134
+ };
135
+ }
136
+ if (commandOverride === "update" || args.includes("--update")) {
137
+ const mode2 = args.includes("--global") ? "global" : args.includes("--local") ? "local" : void 0;
138
+ return {
139
+ command: "update",
140
+ mode: mode2,
141
+ withConfig: false,
142
+ noPrompt: false,
143
+ noInteractive: false,
144
+ quiet: false,
145
+ outputFormat,
146
+ transport,
147
+ skillsMode,
148
+ fullInstall,
149
+ rawArgs: args
150
+ };
151
+ }
152
+ if (commandOverride === "uninstall" || args.includes("--uninstall")) {
153
+ const mode2 = args.includes("--global") ? "global" : args.includes("--local") ? "local" : void 0;
154
+ const noPrompt2 = args.includes("--no-prompt") || args.includes("--no-interactive");
155
+ return {
156
+ command: "uninstall",
157
+ mode: mode2,
158
+ withConfig: false,
159
+ noPrompt: noPrompt2,
160
+ noInteractive: noPrompt2,
161
+ quiet: args.includes("--quiet"),
162
+ outputFormat,
163
+ transport,
164
+ skillsMode,
165
+ fullInstall,
166
+ rawArgs: args
167
+ };
168
+ }
169
+ const withConfig = args.includes("--with-config") || fullInstall;
170
+ const noPrompt = args.includes("--no-prompt") || args.includes("--no-interactive");
171
+ const noInteractive = args.includes("--no-interactive") || noPrompt;
172
+ const quiet = args.includes("--quiet");
173
+ let mode;
174
+ if (args.includes("--global")) {
175
+ mode = "global";
176
+ } else if (args.includes("--local")) {
177
+ mode = "local";
178
+ } else if (noPrompt) {
179
+ mode = "global";
180
+ }
181
+ for (let index = 0; index < args.length; index += 1) {
182
+ const arg = args[index] ?? "";
183
+ if (arg.startsWith("--") && !VALID_FLAG_SET.has(arg)) {
184
+ if (arg.includes("=")) {
185
+ const baseFlag = arg.split("=", 2)[0] ?? "";
186
+ if (VALID_EQUALS_FLAG_SET.has(baseFlag)) {
187
+ continue;
188
+ }
189
+ }
190
+ throw createUsageError(`Unknown flag: ${arg}`);
191
+ }
192
+ if (arg.startsWith("-") && !arg.startsWith("--") && !SHORT_FLAGS[arg]) {
193
+ throw createUsageError(`Unknown flag: ${arg}`);
194
+ }
195
+ if (shouldSkipValueToken(arg, args[index + 1])) {
196
+ index += 1;
197
+ }
198
+ }
199
+ return {
200
+ command: commandOverride ?? "install",
201
+ mode,
202
+ withConfig,
203
+ noPrompt,
204
+ noInteractive,
205
+ quiet,
206
+ outputFormat,
207
+ transport,
208
+ skillsMode,
209
+ fullInstall,
210
+ rawArgs: args
211
+ };
212
+ }
213
+ function detectOutputFormat(argv) {
214
+ const args = expandShortFlags(argv.slice(2));
215
+ try {
216
+ return parseOutputFormat(args);
217
+ } catch {
218
+ return "text";
219
+ }
220
+ }
221
+
222
+ export {
223
+ parseArgs,
224
+ detectOutputFormat
225
+ };
226
+ //# sourceMappingURL=chunk-RCZZGGJS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/args.ts"],"sourcesContent":["import { createUsageError } from \"./errors\";\nimport {\n CLI_COMMANDS,\n VALID_EQUALS_FLAGS,\n VALID_FLAGS\n} from \"../public-surface/generated-manifest\";\nimport type { PublicSurfaceCliCommandName } from \"../public-surface/source\";\n\nconst CLI_COMMAND_SET = new Set<string>(CLI_COMMANDS);\n\nexport { CLI_COMMANDS, VALID_EQUALS_FLAGS, VALID_FLAGS };\n\nexport type CliCommand = PublicSurfaceCliCommandName;\nexport type InstallMode = \"global\" | \"local\";\nexport type SkillsMode = \"global\" | \"local\" | \"none\";\nexport type OutputFormat = \"text\" | \"json\" | \"stream-json\";\nexport type TransportMode = \"relay\" | \"native\";\n\nexport interface ParsedArgs {\n command: CliCommand;\n mode?: InstallMode;\n withConfig: boolean;\n noPrompt: boolean;\n noInteractive: boolean;\n quiet: boolean;\n outputFormat: OutputFormat;\n transport: TransportMode;\n skillsMode: SkillsMode;\n fullInstall: boolean;\n rawArgs: string[];\n}\n\nconst SHORT_FLAGS: Record<string, string> = {\n \"-g\": \"--global\",\n \"-l\": \"--local\",\n \"-u\": \"--update\",\n \"-h\": \"--help\",\n \"-v\": \"--version\",\n \"-f\": \"--full\"\n};\n\nfunction expandShortFlags(args: string[]): string[] {\n return args.map((arg) => SHORT_FLAGS[arg] ?? arg);\n}\n\nfunction parseSkillsMode(args: string[]): SkillsMode {\n const hasLocal = args.includes(\"--skills-local\");\n const hasGlobal = args.includes(\"--skills-global\");\n if (hasLocal && hasGlobal) {\n throw createUsageError(\"Choose either --skills-local or --skills-global.\");\n }\n if (args.includes(\"--no-skills\")) {\n return \"none\";\n }\n if (hasLocal) {\n return \"local\";\n }\n if (hasGlobal) {\n return \"global\";\n }\n return \"global\";\n}\n\nfunction parseOutputFormat(args: string[]): OutputFormat {\n const outputFlag = args.find((arg) => arg.startsWith(\"--output-format\"));\n if (!outputFlag) {\n return \"text\";\n }\n\n let value: string | undefined;\n if (outputFlag.includes(\"=\")) {\n value = outputFlag.split(\"=\", 2)[1];\n } else {\n const index = args.indexOf(outputFlag);\n value = index >= 0 ? args[index + 1] : undefined;\n }\n\n if (value === \"text\" || value === \"json\" || value === \"stream-json\") {\n return value;\n }\n\n throw createUsageError(`Invalid --output-format: ${value ?? \"missing\"}`);\n}\n\nfunction parseTransport(args: string[]): TransportMode {\n const transportFlag = args.find((arg) => arg.startsWith(\"--transport\"));\n if (!transportFlag) {\n return \"relay\";\n }\n\n let value: string | undefined;\n if (transportFlag.includes(\"=\")) {\n value = transportFlag.split(\"=\", 2)[1];\n } else {\n const index = args.indexOf(transportFlag);\n value = index >= 0 ? args[index + 1] : undefined;\n }\n\n if (value === \"relay\" || value === \"native\") {\n return value;\n }\n\n throw createUsageError(`Invalid --transport: ${value ?? \"missing\"}`);\n}\n\nconst VALID_FLAG_SET = new Set<string>(VALID_FLAGS);\nconst VALID_EQUALS_FLAG_SET = new Set<string>(VALID_EQUALS_FLAGS);\nconst SIGNED_VALUE_FLAG_SET = new Set<string>([\"--dy\"]);\nconst SIGNED_INTEGER_VALUE = /^-\\d+$/;\n\nfunction shouldSkipValueToken(flag: string, value: string | undefined): boolean {\n if (!VALID_EQUALS_FLAG_SET.has(flag) || value === undefined) {\n return false;\n }\n if (!value.startsWith(\"-\")) {\n return true;\n }\n return SIGNED_VALUE_FLAG_SET.has(flag) && SIGNED_INTEGER_VALUE.test(value);\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n let args = expandShortFlags(argv.slice(2));\n let commandOverride: CliCommand | null = null;\n\n if (args[0] && !args[0].startsWith(\"-\")) {\n const candidate = args[0];\n if (CLI_COMMAND_SET.has(candidate)) {\n commandOverride = candidate as CliCommand;\n args = args.slice(1);\n } else {\n throw createUsageError(`Unknown command: ${candidate}`);\n }\n }\n const hasGlobal = args.includes(\"--global\");\n const hasLocal = args.includes(\"--local\");\n if (hasGlobal && hasLocal) {\n throw createUsageError(\"Choose either --global or --local.\");\n }\n\n const skillsMode = parseSkillsMode(args);\n const fullInstall = args.includes(\"--full\");\n const outputFormat = parseOutputFormat(args);\n const transport = commandOverride === \"annotate\" ? \"relay\" : parseTransport(args);\n\n if (commandOverride === \"help\" || args.includes(\"--help\") || args.includes(\"-h\")) {\n return {\n command: \"help\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"version\" || args.includes(\"--version\") || args.includes(\"-v\")) {\n return {\n command: \"version\",\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"update\" || args.includes(\"--update\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n return {\n command: \"update\",\n mode,\n withConfig: false,\n noPrompt: false,\n noInteractive: false,\n quiet: false,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n if (commandOverride === \"uninstall\" || args.includes(\"--uninstall\")) {\n const mode = args.includes(\"--global\") ? \"global\" : args.includes(\"--local\") ? \"local\" : undefined;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n return {\n command: \"uninstall\",\n mode,\n withConfig: false,\n noPrompt,\n noInteractive: noPrompt,\n quiet: args.includes(\"--quiet\"),\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n }\n\n const withConfig = args.includes(\"--with-config\") || fullInstall;\n const noPrompt = args.includes(\"--no-prompt\") || args.includes(\"--no-interactive\");\n const noInteractive = args.includes(\"--no-interactive\") || noPrompt;\n const quiet = args.includes(\"--quiet\");\n\n let mode: InstallMode | undefined;\n if (args.includes(\"--global\")) {\n mode = \"global\";\n } else if (args.includes(\"--local\")) {\n mode = \"local\";\n } else if (noPrompt) {\n mode = \"global\";\n }\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index] ?? \"\";\n if (arg.startsWith(\"--\") && !VALID_FLAG_SET.has(arg)) {\n if (arg.includes(\"=\")) {\n const baseFlag = arg.split(\"=\", 2)[0] ?? \"\";\n if (VALID_EQUALS_FLAG_SET.has(baseFlag)) {\n continue;\n }\n }\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n if (arg.startsWith(\"-\") && !arg.startsWith(\"--\") && !SHORT_FLAGS[arg]) {\n throw createUsageError(`Unknown flag: ${arg}`);\n }\n if (shouldSkipValueToken(arg, args[index + 1])) {\n index += 1;\n }\n }\n\n return {\n command: commandOverride ?? \"install\",\n mode,\n withConfig,\n noPrompt,\n noInteractive,\n quiet,\n outputFormat,\n transport,\n skillsMode,\n fullInstall,\n rawArgs: args\n };\n}\n\nexport function detectOutputFormat(argv: string[]): OutputFormat {\n const args = expandShortFlags(argv.slice(2));\n try {\n return parseOutputFormat(args);\n } catch {\n return \"text\";\n }\n}\n\nexport function detectQuiet(argv: string[]): boolean {\n const args = expandShortFlags(argv.slice(2));\n return args.includes(\"--quiet\");\n}\n"],"mappings":";;;;;;;;;;AAQA,IAAM,kBAAkB,IAAI,IAAY,YAAY;AAwBpD,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEA,SAAS,iBAAiB,MAA0B;AAClD,SAAO,KAAK,IAAI,CAAC,QAAQ,YAAY,GAAG,KAAK,GAAG;AAClD;AAEA,SAAS,gBAAgB,MAA4B;AACnD,QAAM,WAAW,KAAK,SAAS,gBAAgB;AAC/C,QAAM,YAAY,KAAK,SAAS,iBAAiB;AACjD,MAAI,YAAY,WAAW;AACzB,UAAM,iBAAiB,kDAAkD;AAAA,EAC3E;AACA,MAAI,KAAK,SAAS,aAAa,GAAG;AAChC,WAAO;AAAA,EACT;AACA,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAA8B;AACvD,QAAM,aAAa,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,iBAAiB,CAAC;AACvE,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI,WAAW,SAAS,GAAG,GAAG;AAC5B,YAAQ,WAAW,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,EACpC,OAAO;AACL,UAAM,QAAQ,KAAK,QAAQ,UAAU;AACrC,YAAQ,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI;AAAA,EACzC;AAEA,MAAI,UAAU,UAAU,UAAU,UAAU,UAAU,eAAe;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,4BAA4B,SAAS,SAAS,EAAE;AACzE;AAEA,SAAS,eAAe,MAA+B;AACrD,QAAM,gBAAgB,KAAK,KAAK,CAAC,QAAQ,IAAI,WAAW,aAAa,CAAC;AACtE,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI,cAAc,SAAS,GAAG,GAAG;AAC/B,YAAQ,cAAc,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,EACvC,OAAO;AACL,UAAM,QAAQ,KAAK,QAAQ,aAAa;AACxC,YAAQ,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI;AAAA,EACzC;AAEA,MAAI,UAAU,WAAW,UAAU,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,wBAAwB,SAAS,SAAS,EAAE;AACrE;AAEA,IAAM,iBAAiB,IAAI,IAAY,WAAW;AAClD,IAAM,wBAAwB,IAAI,IAAY,kBAAkB;AAChE,IAAM,wBAAwB,oBAAI,IAAY,CAAC,MAAM,CAAC;AACtD,IAAM,uBAAuB;AAE7B,SAAS,qBAAqB,MAAc,OAAoC;AAC9E,MAAI,CAAC,sBAAsB,IAAI,IAAI,KAAK,UAAU,QAAW;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,IAAI,IAAI,KAAK,qBAAqB,KAAK,KAAK;AAC3E;AAEO,SAAS,UAAU,MAA4B;AACpD,MAAI,OAAO,iBAAiB,KAAK,MAAM,CAAC,CAAC;AACzC,MAAI,kBAAqC;AAEzC,MAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,GAAG;AACvC,UAAM,YAAY,KAAK,CAAC;AACxB,QAAI,gBAAgB,IAAI,SAAS,GAAG;AAClC,wBAAkB;AAClB,aAAO,KAAK,MAAM,CAAC;AAAA,IACrB,OAAO;AACL,YAAM,iBAAiB,oBAAoB,SAAS,EAAE;AAAA,IACxD;AAAA,EACF;AACA,QAAM,YAAY,KAAK,SAAS,UAAU;AAC1C,QAAM,WAAW,KAAK,SAAS,SAAS;AACxC,MAAI,aAAa,UAAU;AACzB,UAAM,iBAAiB,oCAAoC;AAAA,EAC7D;AAEA,QAAM,aAAa,gBAAgB,IAAI;AACvC,QAAM,cAAc,KAAK,SAAS,QAAQ;AAC1C,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,YAAY,oBAAoB,aAAa,UAAU,eAAe,IAAI;AAEhF,MAAI,oBAAoB,UAAU,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,IAAI,GAAG;AAChF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,oBAAoB,aAAa,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,IAAI,GAAG;AACtF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,oBAAoB,YAAY,KAAK,SAAS,UAAU,GAAG;AAC7D,UAAMA,QAAO,KAAK,SAAS,UAAU,IAAI,WAAW,KAAK,SAAS,SAAS,IAAI,UAAU;AACzF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAAA;AAAA,MACA,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,oBAAoB,eAAe,KAAK,SAAS,aAAa,GAAG;AACnE,UAAMA,QAAO,KAAK,SAAS,UAAU,IAAI,WAAW,KAAK,SAAS,SAAS,IAAI,UAAU;AACzF,UAAMC,YAAW,KAAK,SAAS,aAAa,KAAK,KAAK,SAAS,kBAAkB;AACjF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAAD;AAAA,MACA,YAAY;AAAA,MACZ,UAAAC;AAAA,MACA,eAAeA;AAAA,MACf,OAAO,KAAK,SAAS,SAAS;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,SAAS,eAAe,KAAK;AACrD,QAAM,WAAW,KAAK,SAAS,aAAa,KAAK,KAAK,SAAS,kBAAkB;AACjF,QAAM,gBAAgB,KAAK,SAAS,kBAAkB,KAAK;AAC3D,QAAM,QAAQ,KAAK,SAAS,SAAS;AAErC,MAAI;AACJ,MAAI,KAAK,SAAS,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT,WAAW,KAAK,SAAS,SAAS,GAAG;AACnC,WAAO;AAAA,EACT,WAAW,UAAU;AACnB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK,KAAK;AAC3B,QAAI,IAAI,WAAW,IAAI,KAAK,CAAC,eAAe,IAAI,GAAG,GAAG;AACpD,UAAI,IAAI,SAAS,GAAG,GAAG;AACrB,cAAM,WAAW,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACzC,YAAI,sBAAsB,IAAI,QAAQ,GAAG;AACvC;AAAA,QACF;AAAA,MACF;AACA,YAAM,iBAAiB,iBAAiB,GAAG,EAAE;AAAA,IAC/C;AACA,QAAI,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,YAAY,GAAG,GAAG;AACrE,YAAM,iBAAiB,iBAAiB,GAAG,EAAE;AAAA,IAC/C;AACA,QAAI,qBAAqB,KAAK,KAAK,QAAQ,CAAC,CAAC,GAAG;AAC9C,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEO,SAAS,mBAAmB,MAA8B;AAC/D,QAAM,OAAO,iBAAiB,KAAK,MAAM,CAAC,CAAC;AAC3C,MAAI;AACF,WAAO,kBAAkB,IAAI;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":["mode","noPrompt"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-RJNI3BHT.js.map
@@ -0,0 +1,112 @@
1
+ import {
2
+ createUsageError
3
+ } from "./chunk-IPE7TF2P.js";
4
+
5
+ // src/cli/utils/parse.ts
6
+ var SIGNED_INTEGER_PATTERN = /^-?\d+$/;
7
+ var UNSIGNED_INTEGER_PATTERN = /^\d+$/;
8
+ var SIGNED_DECIMAL_PATTERN = /^-?(?:\d+|\d+\.\d+|\.\d+)$/;
9
+ var UNSIGNED_DECIMAL_PATTERN = /^(?:\d+|\d+\.\d+|\.\d+)$/;
10
+ function allowsNegative(options) {
11
+ return typeof options.min !== "number" || options.min < 0;
12
+ }
13
+ function decimalPattern(options) {
14
+ const signed = allowsNegative(options);
15
+ if (options.integer ?? true) {
16
+ return signed ? SIGNED_INTEGER_PATTERN : UNSIGNED_INTEGER_PATTERN;
17
+ }
18
+ return signed ? SIGNED_DECIMAL_PATTERN : UNSIGNED_DECIMAL_PATTERN;
19
+ }
20
+ function parseNumberFlag(value, flag, options = {}) {
21
+ if (value.trim() === "" || value !== value.trim() || !decimalPattern(options).test(value)) {
22
+ throw createUsageError(`Invalid ${flag}: ${value}`);
23
+ }
24
+ const parsed = Number(value);
25
+ if (!Number.isFinite(parsed)) {
26
+ throw createUsageError(`Invalid ${flag}: ${value}`);
27
+ }
28
+ const requireInteger = options.integer ?? true;
29
+ if (requireInteger && !Number.isInteger(parsed)) {
30
+ throw createUsageError(`Invalid ${flag}: ${value}`);
31
+ }
32
+ if (typeof options.min === "number" && parsed < options.min) {
33
+ throw createUsageError(`Invalid ${flag}: ${value}`);
34
+ }
35
+ if (typeof options.max === "number" && parsed > options.max) {
36
+ throw createUsageError(`Invalid ${flag}: ${value}`);
37
+ }
38
+ return parsed;
39
+ }
40
+ function parseBooleanFlag(value, flag) {
41
+ const normalized = value.trim().toLowerCase();
42
+ if (normalized === "true" || normalized === "1") {
43
+ return true;
44
+ }
45
+ if (normalized === "false" || normalized === "0") {
46
+ return false;
47
+ }
48
+ throw createUsageError(`Invalid ${flag}: ${value}`);
49
+ }
50
+ function parseOptionalStringFlag(rawArgs, flag) {
51
+ for (let i = 0; i < rawArgs.length; i += 1) {
52
+ const arg = rawArgs[i];
53
+ if (arg === flag) {
54
+ const value = rawArgs[i + 1];
55
+ if (!value) {
56
+ throw createUsageError(`Missing value for ${flag}`);
57
+ }
58
+ return value;
59
+ }
60
+ if (arg?.startsWith(`${flag}=`)) {
61
+ const value = arg.split("=", 2)[1];
62
+ if (!value) {
63
+ throw createUsageError(`Missing value for ${flag}`);
64
+ }
65
+ return value;
66
+ }
67
+ }
68
+ return void 0;
69
+ }
70
+ function parseStringArrayFlag(rawArgs, flag) {
71
+ const value = parseOptionalStringFlag(rawArgs, flag);
72
+ if (typeof value !== "string") {
73
+ return void 0;
74
+ }
75
+ const items = value.split(",").map((item) => item.trim()).filter((item) => item.length > 0);
76
+ if (items.length === 0) {
77
+ throw createUsageError(`Missing value for ${flag}`);
78
+ }
79
+ return items;
80
+ }
81
+ function parseRepeatedStringFlag(rawArgs, flag) {
82
+ const values = [];
83
+ for (let index = 0; index < rawArgs.length; index += 1) {
84
+ const arg = rawArgs[index];
85
+ if (arg === flag) {
86
+ const value = rawArgs[index + 1];
87
+ if (!value) {
88
+ throw createUsageError(`Missing value for ${flag}`);
89
+ }
90
+ values.push(value);
91
+ index += 1;
92
+ continue;
93
+ }
94
+ if (arg?.startsWith(`${flag}=`)) {
95
+ const value = arg.split("=", 2)[1];
96
+ if (!value) {
97
+ throw createUsageError(`Missing value for ${flag}`);
98
+ }
99
+ values.push(value);
100
+ }
101
+ }
102
+ return values.length > 0 ? values : void 0;
103
+ }
104
+
105
+ export {
106
+ parseNumberFlag,
107
+ parseBooleanFlag,
108
+ parseOptionalStringFlag,
109
+ parseStringArrayFlag,
110
+ parseRepeatedStringFlag
111
+ };
112
+ //# sourceMappingURL=chunk-RPXWUCQQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/utils/parse.ts"],"sourcesContent":["import { createUsageError } from \"../errors\";\n\ntype NumberFlagOptions = {\n min?: number;\n max?: number;\n integer?: boolean;\n};\n\nconst SIGNED_INTEGER_PATTERN = /^-?\\d+$/;\nconst UNSIGNED_INTEGER_PATTERN = /^\\d+$/;\nconst SIGNED_DECIMAL_PATTERN = /^-?(?:\\d+|\\d+\\.\\d+|\\.\\d+)$/;\nconst UNSIGNED_DECIMAL_PATTERN = /^(?:\\d+|\\d+\\.\\d+|\\.\\d+)$/;\n\nfunction allowsNegative(options: NumberFlagOptions): boolean {\n return typeof options.min !== \"number\" || options.min < 0;\n}\n\nfunction decimalPattern(options: NumberFlagOptions): RegExp {\n const signed = allowsNegative(options);\n if (options.integer ?? true) {\n return signed ? SIGNED_INTEGER_PATTERN : UNSIGNED_INTEGER_PATTERN;\n }\n return signed ? SIGNED_DECIMAL_PATTERN : UNSIGNED_DECIMAL_PATTERN;\n}\n\nexport function parseNumberFlag(value: string, flag: string, options: NumberFlagOptions = {}): number {\n if (value.trim() === \"\" || value !== value.trim() || !decimalPattern(options).test(value)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n const requireInteger = options.integer ?? true;\n if (requireInteger && !Number.isInteger(parsed)) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n if (typeof options.min === \"number\" && parsed < options.min) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n if (typeof options.max === \"number\" && parsed > options.max) {\n throw createUsageError(`Invalid ${flag}: ${value}`);\n }\n return parsed;\n}\n\nexport function parseBooleanFlag(value: string, flag: string): boolean {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\" || normalized === \"1\") {\n return true;\n }\n if (normalized === \"false\" || normalized === \"0\") {\n return false;\n }\n throw createUsageError(`Invalid ${flag}: ${value}`);\n}\n\nexport function parseOptionalStringFlag(rawArgs: string[], flag: string): string | undefined {\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === flag) {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n }\n if (arg?.startsWith(`${flag}=`)) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n }\n }\n return undefined;\n}\n\nexport function parseStringArrayFlag(rawArgs: string[], flag: string): string[] | undefined {\n const value = parseOptionalStringFlag(rawArgs, flag);\n if (typeof value !== \"string\") {\n return undefined;\n }\n const items = value.split(\",\").map((item) => item.trim()).filter((item) => item.length > 0);\n if (items.length === 0) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return items;\n}\n\nexport function parseRepeatedStringFlag(rawArgs: string[], flag: string): string[] | undefined {\n const values: string[] = [];\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index];\n if (arg === flag) {\n const value = rawArgs[index + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n values.push(value);\n index += 1;\n continue;\n }\n if (arg?.startsWith(`${flag}=`)) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n values.push(value);\n }\n }\n return values.length > 0 ? values : undefined;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,107 @@
1
+ // src/providers/artifacts.ts
2
+ import { mkdir, readdir, readFile, rm, stat, writeFile } from "fs/promises";
3
+ import { dirname, join, resolve } from "path";
4
+ import { randomUUID } from "crypto";
5
+ import { tmpdir } from "os";
6
+ var DEFAULT_ARTIFACT_TTL_HOURS = 72;
7
+ var MAX_ARTIFACT_TTL_HOURS = 168;
8
+ var clampTtlHours = (value) => {
9
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
10
+ return DEFAULT_ARTIFACT_TTL_HOURS;
11
+ }
12
+ return Math.min(MAX_ARTIFACT_TTL_HOURS, Math.floor(value));
13
+ };
14
+ var serializeContent = (content) => {
15
+ if (typeof content === "string" || Buffer.isBuffer(content)) {
16
+ return content;
17
+ }
18
+ return `${JSON.stringify(content, null, 2)}
19
+ `;
20
+ };
21
+ var createArtifactBundle = async (args) => {
22
+ const runId = randomUUID();
23
+ const now = args.now ?? /* @__PURE__ */ new Date();
24
+ const ttlHours = clampTtlHours(args.ttlHours);
25
+ const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1e3);
26
+ const root = args.outputDir ? resolve(args.outputDir) : join(tmpdir(), "opendevbrowser");
27
+ const basePath = join(root, args.namespace, runId);
28
+ await mkdir(basePath, { recursive: true, mode: 448 });
29
+ const writtenFiles = [];
30
+ for (const file of args.files) {
31
+ const filePath = join(basePath, file.path);
32
+ const directory = dirname(filePath);
33
+ if (directory && directory !== basePath) {
34
+ await mkdir(directory, { recursive: true, mode: 448 });
35
+ }
36
+ await writeFile(filePath, serializeContent(file.content), { mode: 384 });
37
+ writtenFiles.push(file.path);
38
+ }
39
+ const manifest = {
40
+ run_id: runId,
41
+ created_at: now.toISOString(),
42
+ ttl_hours: ttlHours,
43
+ expires_at: expiresAt.toISOString(),
44
+ files: [...writtenFiles, "bundle-manifest.json"]
45
+ };
46
+ await writeFile(join(basePath, "bundle-manifest.json"), `${JSON.stringify(manifest, null, 2)}
47
+ `, { mode: 384 });
48
+ return {
49
+ runId,
50
+ basePath,
51
+ manifest
52
+ };
53
+ };
54
+ var isExpired = (manifest, now) => {
55
+ const expiry = new Date(manifest.expires_at);
56
+ if (Number.isNaN(expiry.getTime())) return false;
57
+ return expiry.getTime() <= now.getTime();
58
+ };
59
+ var cleanupExpiredArtifacts = async (rootDir, now = /* @__PURE__ */ new Date()) => {
60
+ const removed = [];
61
+ const skipped = [];
62
+ let namespaces = [];
63
+ try {
64
+ namespaces = await readdir(rootDir);
65
+ } catch {
66
+ return { removed, skipped };
67
+ }
68
+ for (const namespace of namespaces) {
69
+ const namespacePath = join(rootDir, namespace);
70
+ let runs = [];
71
+ try {
72
+ runs = await readdir(namespacePath);
73
+ } catch {
74
+ continue;
75
+ }
76
+ for (const run of runs) {
77
+ const runPath = join(namespacePath, run);
78
+ const manifestPath = join(runPath, "bundle-manifest.json");
79
+ try {
80
+ const metadata = await stat(manifestPath);
81
+ if (!metadata.isFile()) {
82
+ skipped.push(runPath);
83
+ continue;
84
+ }
85
+ const manifestRaw = await readFile(manifestPath, "utf8");
86
+ const manifest = JSON.parse(manifestRaw);
87
+ if (isExpired(manifest, now)) {
88
+ await rm(runPath, { recursive: true, force: true });
89
+ removed.push(runPath);
90
+ } else {
91
+ skipped.push(runPath);
92
+ }
93
+ } catch {
94
+ skipped.push(runPath);
95
+ }
96
+ }
97
+ }
98
+ return { removed, skipped };
99
+ };
100
+
101
+ export {
102
+ DEFAULT_ARTIFACT_TTL_HOURS,
103
+ MAX_ARTIFACT_TTL_HOURS,
104
+ createArtifactBundle,
105
+ cleanupExpiredArtifacts
106
+ };
107
+ //# sourceMappingURL=chunk-S5KZQJJI.js.map