opendevbrowser 0.0.28 → 0.0.30

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 (325) hide show
  1. package/README.md +2 -2
  2. package/dist/accessibility-snapshot-CQ4ZKWKC.js +39 -0
  3. package/dist/accessibility-snapshot-CQ4ZKWKC.js.map +1 -0
  4. package/dist/active-window-TD5HYJ72.js +37 -0
  5. package/dist/active-window-TD5HYJ72.js.map +1 -0
  6. package/dist/annotate-VTLFS2XV.js +205 -0
  7. package/dist/annotate-VTLFS2XV.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-BCI5KYCW.js +84 -0
  11. package/dist/attr-BCI5KYCW.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-5DFEEOKM.js +309 -0
  15. package/dist/canvas-5DFEEOKM.js.map +1 -0
  16. package/dist/capture-desktop-HFTTWY4Z.js +38 -0
  17. package/dist/capture-desktop-HFTTWY4Z.js.map +1 -0
  18. package/dist/capture-window-X63XPIFF.js +40 -0
  19. package/dist/capture-window-X63XPIFF.js.map +1 -0
  20. package/dist/check-LWAUY7GC.js +71 -0
  21. package/dist/check-LWAUY7GC.js.map +1 -0
  22. package/dist/checked-ZSOUKVYT.js +71 -0
  23. package/dist/checked-ZSOUKVYT.js.map +1 -0
  24. package/dist/chunk-2SIMIPLY.js +67 -0
  25. package/dist/chunk-2SIMIPLY.js.map +1 -0
  26. package/dist/chunk-37VSRUW4.js +141 -0
  27. package/dist/chunk-37VSRUW4.js.map +1 -0
  28. package/dist/{chunk-T3VVHJTK.js → chunk-4BEJVZRK.js} +1078 -1458
  29. package/dist/chunk-4BEJVZRK.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-AHEWXOKY.js +64 -0
  39. package/dist/chunk-AHEWXOKY.js.map +1 -0
  40. package/dist/chunk-ASMHEEKY.js +10 -0
  41. package/dist/chunk-ASMHEEKY.js.map +1 -0
  42. package/dist/chunk-COAOWH3G.js +3651 -0
  43. package/dist/chunk-COAOWH3G.js.map +1 -0
  44. package/dist/chunk-DBF5OKH3.js +111 -0
  45. package/dist/chunk-DBF5OKH3.js.map +1 -0
  46. package/dist/chunk-DW4TX7MU.js +54 -0
  47. package/dist/chunk-DW4TX7MU.js.map +1 -0
  48. package/dist/chunk-GQJ5S3BL.js +20 -0
  49. package/dist/chunk-GQJ5S3BL.js.map +1 -0
  50. package/dist/chunk-IPE7TF2P.js +54 -0
  51. package/dist/chunk-IPE7TF2P.js.map +1 -0
  52. package/dist/chunk-IQTJHXZJ.js +126 -0
  53. package/dist/chunk-IQTJHXZJ.js.map +1 -0
  54. package/dist/chunk-J47N77VG.js +2969 -0
  55. package/dist/chunk-J47N77VG.js.map +1 -0
  56. package/dist/chunk-JZXD6FWR.js +25 -0
  57. package/dist/chunk-JZXD6FWR.js.map +1 -0
  58. package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
  59. package/dist/chunk-KDSNXS6N.js.map +1 -0
  60. package/dist/chunk-KZ2IXVQT.js +219 -0
  61. package/dist/chunk-KZ2IXVQT.js.map +1 -0
  62. package/dist/chunk-MD655IPO.js +838 -0
  63. package/dist/chunk-MD655IPO.js.map +1 -0
  64. package/dist/chunk-MX3NFLCE.js +940 -0
  65. package/dist/chunk-MX3NFLCE.js.map +1 -0
  66. package/dist/chunk-OW5HMYMI.js +19 -0
  67. package/dist/chunk-OW5HMYMI.js.map +1 -0
  68. package/dist/chunk-PPUWQKIC.js +26 -0
  69. package/dist/chunk-PPUWQKIC.js.map +1 -0
  70. package/dist/{chunk-I5ZCOZZV.js → chunk-QOMWCRE3.js} +1202 -9561
  71. package/dist/chunk-QOMWCRE3.js.map +1 -0
  72. package/dist/chunk-RCZZGGJS.js +226 -0
  73. package/dist/chunk-RCZZGGJS.js.map +1 -0
  74. package/dist/chunk-RJNI3BHT.js +1 -0
  75. package/dist/chunk-RPXWUCQQ.js +112 -0
  76. package/dist/chunk-RPXWUCQQ.js.map +1 -0
  77. package/dist/chunk-S5KZQJJI.js +107 -0
  78. package/dist/chunk-S5KZQJJI.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-2AILSEIZ.js +81 -0
  102. package/dist/click-2AILSEIZ.js.map +1 -0
  103. package/dist/clone-component-TPJS3PEG.js +82 -0
  104. package/dist/clone-component-TPJS3PEG.js.map +1 -0
  105. package/dist/clone-page-LE74CIFC.js +69 -0
  106. package/dist/clone-page-LE74CIFC.js.map +1 -0
  107. package/dist/close-HN4YI47K.js +63 -0
  108. package/dist/close-HN4YI47K.js.map +1 -0
  109. package/dist/close-WFERRHX6.js +63 -0
  110. package/dist/close-WFERRHX6.js.map +1 -0
  111. package/dist/connect-RWBV2UCQ.js +107 -0
  112. package/dist/connect-RWBV2UCQ.js.map +1 -0
  113. package/dist/console-poll-PP4YYPDF.js +76 -0
  114. package/dist/console-poll-PP4YYPDF.js.map +1 -0
  115. package/dist/cookie-import-6IP776FC.js +177 -0
  116. package/dist/cookie-import-6IP776FC.js.map +1 -0
  117. package/dist/cookie-list-O2KG6DPU.js +117 -0
  118. package/dist/cookie-list-O2KG6DPU.js.map +1 -0
  119. package/dist/daemon-2BSAZXLT.js +194 -0
  120. package/dist/daemon-2BSAZXLT.js.map +1 -0
  121. package/dist/daemon-fingerprint.json +1 -1
  122. package/dist/debug-trace-snapshot-F3BDVZXS.js +136 -0
  123. package/dist/debug-trace-snapshot-F3BDVZXS.js.map +1 -0
  124. package/dist/dialog-6JQYUWMQ.js +75 -0
  125. package/dist/dialog-6JQYUWMQ.js.map +1 -0
  126. package/dist/disconnect-763TP7GH.js +58 -0
  127. package/dist/disconnect-763TP7GH.js.map +1 -0
  128. package/dist/enabled-DLYQFNIP.js +71 -0
  129. package/dist/enabled-DLYQFNIP.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-S346TJJH.js +98 -0
  135. package/dist/goto-S346TJJH.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-6JVJFGO7.js +71 -0
  139. package/dist/hover-6JVJFGO7.js.map +1 -0
  140. package/dist/html-EVOSPBIT.js +84 -0
  141. package/dist/html-EVOSPBIT.js.map +1 -0
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +87 -38
  144. package/dist/index.js.map +1 -1
  145. package/dist/inspector-H57BVUJP.js +62 -0
  146. package/dist/inspector-H57BVUJP.js.map +1 -0
  147. package/dist/inspector-audit-NQBAJWC7.js +84 -0
  148. package/dist/inspector-audit-NQBAJWC7.js.map +1 -0
  149. package/dist/inspector-plan-ZDIQVND3.js +69 -0
  150. package/dist/inspector-plan-ZDIQVND3.js.map +1 -0
  151. package/dist/inspiredesign-IEUL4PX3.js +234 -0
  152. package/dist/inspiredesign-IEUL4PX3.js.map +1 -0
  153. package/dist/install-autostart-output-5DOMKCQL.js +41 -0
  154. package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
  155. package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
  156. package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
  157. package/dist/launch-EK66VQPF.js +225 -0
  158. package/dist/launch-EK66VQPF.js.map +1 -0
  159. package/dist/list-ADZAQ2IU.js +51 -0
  160. package/dist/list-ADZAQ2IU.js.map +1 -0
  161. package/dist/list-KKUKN467.js +54 -0
  162. package/dist/list-KKUKN467.js.map +1 -0
  163. package/dist/local-HXJLUUNT.js +54 -0
  164. package/dist/local-HXJLUUNT.js.map +1 -0
  165. package/dist/macro-resolve-6DOQJ7CA.js +253 -0
  166. package/dist/macro-resolve-6DOQJ7CA.js.map +1 -0
  167. package/dist/macros/execute-runtime.d.ts +3 -1
  168. package/dist/macros/execute-runtime.d.ts.map +1 -1
  169. package/dist/macros/execute.d.ts +2 -0
  170. package/dist/macros/execute.d.ts.map +1 -1
  171. package/dist/native-UPLVQ2SG.js +22 -0
  172. package/dist/native-UPLVQ2SG.js.map +1 -0
  173. package/dist/network-poll-NUL4PDPY.js +76 -0
  174. package/dist/network-poll-NUL4PDPY.js.map +1 -0
  175. package/dist/new-5NKYPEFT.js +69 -0
  176. package/dist/new-5NKYPEFT.js.map +1 -0
  177. package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
  178. package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
  179. package/dist/open-NR3BPLXV.js +81 -0
  180. package/dist/open-NR3BPLXV.js.map +1 -0
  181. package/dist/opendevbrowser.d.ts.map +1 -1
  182. package/dist/opendevbrowser.js +87 -38
  183. package/dist/opendevbrowser.js.map +1 -1
  184. package/dist/perf-HJ36ZI6H.js +58 -0
  185. package/dist/perf-HJ36ZI6H.js.map +1 -0
  186. package/dist/pointer-down-IYTTQWXZ.js +55 -0
  187. package/dist/pointer-down-IYTTQWXZ.js.map +1 -0
  188. package/dist/pointer-drag-A2YC5PWI.js +54 -0
  189. package/dist/pointer-drag-A2YC5PWI.js.map +1 -0
  190. package/dist/pointer-move-W5K5FUI4.js +52 -0
  191. package/dist/pointer-move-W5K5FUI4.js.map +1 -0
  192. package/dist/pointer-up-6GWVO64Y.js +55 -0
  193. package/dist/pointer-up-6GWVO64Y.js.map +1 -0
  194. package/dist/press-A3V5WB3S.js +83 -0
  195. package/dist/press-A3V5WB3S.js.map +1 -0
  196. package/dist/product-video-52REKWF3.js +235 -0
  197. package/dist/product-video-52REKWF3.js.map +1 -0
  198. package/dist/providers/artifacts.d.ts +0 -2
  199. package/dist/providers/artifacts.d.ts.map +1 -1
  200. package/dist/providers/blocker.d.ts.map +1 -1
  201. package/dist/providers/bounded-map.d.ts +2 -0
  202. package/dist/providers/bounded-map.d.ts.map +1 -0
  203. package/dist/providers/community/index.d.ts.map +1 -1
  204. package/dist/providers/constraint.d.ts.map +1 -1
  205. package/dist/providers/index.d.ts +1 -0
  206. package/dist/providers/index.d.ts.map +1 -1
  207. package/dist/providers/renderer.d.ts.map +1 -1
  208. package/dist/providers/research-compiler.d.ts +1 -1
  209. package/dist/providers/research-compiler.d.ts.map +1 -1
  210. package/dist/providers/research-executor.d.ts.map +1 -1
  211. package/dist/providers/runtime-factory.d.ts.map +1 -1
  212. package/dist/providers/shared/traversal-url.d.ts +3 -0
  213. package/dist/providers/shared/traversal-url.d.ts.map +1 -1
  214. package/dist/providers/shopping/index.d.ts.map +1 -1
  215. package/dist/providers/social/search-quality.d.ts.map +1 -1
  216. package/dist/providers/workflow-handoff.d.ts +4 -0
  217. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  218. package/dist/providers/workflow-output-root.d.ts +6 -0
  219. package/dist/providers/workflow-output-root.d.ts.map +1 -0
  220. package/dist/providers/workflows.d.ts.map +1 -1
  221. package/dist/{providers-QF2RFB4J.js → providers-IMFYMMHQ.js} +19 -14
  222. package/dist/providers-IMFYMMHQ.js.map +1 -0
  223. package/dist/public-surface/generated-manifest.d.ts +2 -2
  224. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  225. package/dist/public-surface/source.d.ts +2 -2
  226. package/dist/public-surface/source.d.ts.map +1 -1
  227. package/dist/relay/protocol.d.ts +3 -1
  228. package/dist/relay/protocol.d.ts.map +1 -1
  229. package/dist/relay/relay-server.d.ts +6 -0
  230. package/dist/relay/relay-server.d.ts.map +1 -1
  231. package/dist/research-WB6BBCDD.js +295 -0
  232. package/dist/research-WB6BBCDD.js.map +1 -0
  233. package/dist/review-BGWVY4RA.js +48 -0
  234. package/dist/review-BGWVY4RA.js.map +1 -0
  235. package/dist/review-desktop-LEORC5VS.js +54 -0
  236. package/dist/review-desktop-LEORC5VS.js.map +1 -0
  237. package/dist/rpc-4TSKSFGC.js +159 -0
  238. package/dist/rpc-4TSKSFGC.js.map +1 -0
  239. package/dist/run-3NBLVWXD.js +180 -0
  240. package/dist/run-3NBLVWXD.js.map +1 -0
  241. package/dist/screencast-start-UZVIT3IN.js +67 -0
  242. package/dist/screencast-start-UZVIT3IN.js.map +1 -0
  243. package/dist/screencast-stop-NOSJSIUO.js +59 -0
  244. package/dist/screencast-stop-NOSJSIUO.js.map +1 -0
  245. package/dist/screenshot-LARG4JQG.js +68 -0
  246. package/dist/screenshot-LARG4JQG.js.map +1 -0
  247. package/dist/scroll-VNFMV6TW.js +84 -0
  248. package/dist/scroll-VNFMV6TW.js.map +1 -0
  249. package/dist/scroll-into-view-VYRT3JPT.js +71 -0
  250. package/dist/scroll-into-view-VYRT3JPT.js.map +1 -0
  251. package/dist/select-KJTUZDVO.js +86 -0
  252. package/dist/select-KJTUZDVO.js.map +1 -0
  253. package/dist/serve-EV7K4HKR.js +498 -0
  254. package/dist/serve-EV7K4HKR.js.map +1 -0
  255. package/dist/shopping-DTXHVQ2X.js +273 -0
  256. package/dist/shopping-DTXHVQ2X.js.map +1 -0
  257. package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
  258. package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
  259. package/dist/skills-NSXDX6YM.js +26 -0
  260. package/dist/skills-NSXDX6YM.js.map +1 -0
  261. package/dist/snapshot-3XQMCMRJ.js +113 -0
  262. package/dist/snapshot-3XQMCMRJ.js.map +1 -0
  263. package/dist/status-OXSYA5XD.js +35 -0
  264. package/dist/status-OXSYA5XD.js.map +1 -0
  265. package/dist/status-YUMDP5KY.js +132 -0
  266. package/dist/status-YUMDP5KY.js.map +1 -0
  267. package/dist/status-capabilities-P4KDSE2Y.js +57 -0
  268. package/dist/status-capabilities-P4KDSE2Y.js.map +1 -0
  269. package/dist/text-V3B7UVIH.js +84 -0
  270. package/dist/text-V3B7UVIH.js.map +1 -0
  271. package/dist/tools/deps.d.ts +1 -0
  272. package/dist/tools/deps.d.ts.map +1 -1
  273. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  274. package/dist/tools/macro_resolve.d.ts.map +1 -1
  275. package/dist/tools/product_video_run.d.ts.map +1 -1
  276. package/dist/tools/research_run.d.ts.map +1 -1
  277. package/dist/tools/shopping_run.d.ts.map +1 -1
  278. package/dist/tools/workflow-output.d.ts +3 -0
  279. package/dist/tools/workflow-output.d.ts.map +1 -0
  280. package/dist/type-IYBN3ZLR.js +94 -0
  281. package/dist/type-IYBN3ZLR.js.map +1 -0
  282. package/dist/uncheck-SG737EGI.js +71 -0
  283. package/dist/uncheck-SG737EGI.js.map +1 -0
  284. package/dist/uninstall-KYKGJAX7.js +91 -0
  285. package/dist/uninstall-KYKGJAX7.js.map +1 -0
  286. package/dist/update-SMXPYGXS.js +305 -0
  287. package/dist/update-SMXPYGXS.js.map +1 -0
  288. package/dist/update-skill-modes-BVX7IVMW.js +38 -0
  289. package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
  290. package/dist/upload-KH6ZABJA.js +56 -0
  291. package/dist/upload-KH6ZABJA.js.map +1 -0
  292. package/dist/use-7YDKO3U4.js +63 -0
  293. package/dist/use-7YDKO3U4.js.map +1 -0
  294. package/dist/value-RZBWSKKM.js +71 -0
  295. package/dist/value-RZBWSKKM.js.map +1 -0
  296. package/dist/visible-BSFTAKXR.js +71 -0
  297. package/dist/visible-BSFTAKXR.js.map +1 -0
  298. package/dist/wait-TMTEAYOP.js +109 -0
  299. package/dist/wait-TMTEAYOP.js.map +1 -0
  300. package/dist/windows-HIZ23OHS.js +37 -0
  301. package/dist/windows-HIZ23OHS.js.map +1 -0
  302. package/extension/dist/background.js +99 -22
  303. package/extension/dist/ops/ops-runtime.js +85 -7
  304. package/extension/dist/ops/ops-session-store.js +3 -0
  305. package/extension/dist/ops/target-session-coordinator.js +3 -0
  306. package/extension/dist/services/CDPRouter.js +9 -0
  307. package/extension/manifest.json +1 -1
  308. package/package.json +1 -1
  309. package/skills/opendevbrowser-best-practices/SKILL.md +8 -6
  310. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
  311. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
  312. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
  313. package/skills/opendevbrowser-research/SKILL.md +64 -12
  314. package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
  315. package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
  316. package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
  317. package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
  318. package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
  319. package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
  320. package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
  321. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
  322. package/dist/chunk-I5ZCOZZV.js.map +0 -1
  323. package/dist/chunk-QVWOPIZJ.js.map +0 -1
  324. package/dist/chunk-T3VVHJTK.js.map +0 -1
  325. /package/dist/{providers-QF2RFB4J.js.map → chunk-RJNI3BHT.js.map} +0 -0
@@ -0,0 +1,838 @@
1
+ import {
2
+ DAEMON_STOP_DEBUG_ENV,
3
+ createDaemonStopHeaders,
4
+ fetchDaemonStatus,
5
+ fetchWithTimeout,
6
+ fetchWithTimeoutContext,
7
+ getCacheRoot,
8
+ isCurrentDaemonFingerprint,
9
+ persistDaemonStatusMetadata,
10
+ readDaemonMetadata,
11
+ readResponseJsonWithTimeout,
12
+ readResponseTextWithTimeout,
13
+ resolveCurrentDaemonEntrypointPath
14
+ } from "./chunk-COAOWH3G.js";
15
+ import {
16
+ loadGlobalConfig
17
+ } from "./chunk-MX3NFLCE.js";
18
+ import {
19
+ CliError,
20
+ EXIT_EXECUTION,
21
+ createDisconnectedError
22
+ } from "./chunk-IPE7TF2P.js";
23
+ import {
24
+ writeFileAtomic
25
+ } from "./chunk-TBUCZX4A.js";
26
+
27
+ // src/cli/daemon-client.ts
28
+ import { spawn } from "child_process";
29
+ import { existsSync, readFileSync } from "fs";
30
+ import { join, resolve } from "path";
31
+ import { randomUUID } from "crypto";
32
+ import { fileURLToPath } from "url";
33
+ var CLIENT_ID_FILE = "client.json";
34
+ var DEFAULT_RENEW_AFTER_MS = 2e4;
35
+ var MIN_RENEW_AFTER_MS = 5e3;
36
+ var TRANSPORT_TIMEOUT_BUFFER_MS = 5e3;
37
+ var MAX_DERIVED_TRANSPORT_TIMEOUT_MS = 3e5;
38
+ var TRANSPORT_TIMEOUT_HINT_KEYS = ["timeoutMs", "waitTimeoutMs"];
39
+ var DAEMON_STATUS_RETRY_OPTIONS = {
40
+ retryAttempts: 5,
41
+ retryDelayMs: 250
42
+ };
43
+ var DAEMON_CONFIG_PREFER_OPTIONS = {
44
+ timeoutMs: 500,
45
+ retryAttempts: 3,
46
+ retryDelayMs: 250
47
+ };
48
+ var DAEMON_RESTART_STATUS_TIMEOUT_MS = 5e3;
49
+ var DAEMON_RECOVERY_READY_TIMEOUT_MS = 5e3;
50
+ var DAEMON_RESTART_READY_TIMEOUT_MS = 15e3;
51
+ var DAEMON_RESTART_POLL_DELAY_MS = 250;
52
+ var cachedClientState;
53
+ var logDaemonStopDebug = (message, details) => {
54
+ if (process.env[DAEMON_STOP_DEBUG_ENV] !== "1") {
55
+ return;
56
+ }
57
+ const suffix = details ? ` ${JSON.stringify(details)}` : "";
58
+ console.error(`[daemon-stop-debug] ${message}${suffix}`);
59
+ };
60
+ var getClientStateFilePath = () => {
61
+ const cacheRoot = getCacheRoot();
62
+ return join(cacheRoot, CLIENT_ID_FILE);
63
+ };
64
+ var readCachedClientState = () => {
65
+ if (cachedClientState !== void 0) {
66
+ return cachedClientState;
67
+ }
68
+ const filePath = getClientStateFilePath();
69
+ if (existsSync(filePath)) {
70
+ try {
71
+ const content = readFileSync(filePath, "utf-8");
72
+ const parsed = JSON.parse(content);
73
+ if (typeof parsed.clientId === "string" && parsed.clientId.trim()) {
74
+ cachedClientState = {
75
+ clientId: parsed.clientId.trim(),
76
+ createdAt: typeof parsed.createdAt === "string" && parsed.createdAt.trim() ? parsed.createdAt : (/* @__PURE__ */ new Date()).toISOString(),
77
+ ...parsed.binding && typeof parsed.binding === "object" ? { binding: parsed.binding } : {}
78
+ };
79
+ return cachedClientState;
80
+ }
81
+ } catch {
82
+ }
83
+ }
84
+ cachedClientState = null;
85
+ return cachedClientState;
86
+ };
87
+ var writeCachedClientState = (state) => {
88
+ const filePath = getClientStateFilePath();
89
+ writeFileAtomic(filePath, JSON.stringify(state, null, 2), { mode: 384 });
90
+ cachedClientState = state;
91
+ };
92
+ var loadClientState = () => {
93
+ const existing = readCachedClientState();
94
+ if (existing) {
95
+ return existing;
96
+ }
97
+ const state = {
98
+ clientId: randomUUID(),
99
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
100
+ };
101
+ writeCachedClientState(state);
102
+ return state;
103
+ };
104
+ var parseBindingResponse = (data) => {
105
+ const expiresAtMs = Date.parse(data.expiresAt);
106
+ if (!Number.isFinite(expiresAtMs)) {
107
+ throw new Error("Invalid binding expiry timestamp");
108
+ }
109
+ const renewAfterMs = Math.max(
110
+ MIN_RENEW_AFTER_MS,
111
+ typeof data.renewAfterMs === "number" && Number.isFinite(data.renewAfterMs) ? data.renewAfterMs : DEFAULT_RENEW_AFTER_MS
112
+ );
113
+ return {
114
+ bindingId: data.bindingId,
115
+ expiresAtMs,
116
+ renewAfterMs
117
+ };
118
+ };
119
+ var serializeBindingState = (binding) => ({
120
+ bindingId: binding.bindingId,
121
+ expiresAt: new Date(binding.expiresAtMs).toISOString(),
122
+ renewAfterMs: binding.renewAfterMs
123
+ });
124
+ var updateCachedBindingState = (clientId, binding) => {
125
+ const current = loadClientState();
126
+ const base = current.clientId === clientId ? current : { clientId, createdAt: (/* @__PURE__ */ new Date()).toISOString() };
127
+ if (binding) {
128
+ writeCachedClientState({
129
+ ...base,
130
+ binding: serializeBindingState(binding)
131
+ });
132
+ return;
133
+ }
134
+ writeCachedClientState({
135
+ clientId: base.clientId,
136
+ createdAt: base.createdAt
137
+ });
138
+ };
139
+ var isBindingRequiredError = (error) => {
140
+ const message = error instanceof Error ? error.message : String(error ?? "");
141
+ return message.startsWith("RELAY_BINDING_REQUIRED") || message.startsWith("RELAY_BINDING_INVALID");
142
+ };
143
+ var isLeaseInvalidError = (error) => {
144
+ const message = error instanceof Error ? error.message : String(error ?? "");
145
+ return message.startsWith("RELAY_LEASE_INVALID");
146
+ };
147
+ var isTransportTimeoutError = (error) => {
148
+ const message = error instanceof Error ? error.message : String(error ?? "");
149
+ return message.startsWith("Request timed out after ");
150
+ };
151
+ var DaemonClient = class {
152
+ binding = null;
153
+ renewTimer = null;
154
+ clientId;
155
+ autoRenew;
156
+ bindingAcquiredInProcess = false;
157
+ sessionLeases = /* @__PURE__ */ new Map();
158
+ constructor(options = {}) {
159
+ const cachedState = loadClientState();
160
+ this.clientId = options.clientId ?? cachedState.clientId;
161
+ this.autoRenew = options.autoRenew ?? false;
162
+ if (cachedState.clientId === this.clientId && cachedState.binding) {
163
+ try {
164
+ this.setBinding(parseBindingResponse(cachedState.binding), { acquiredInProcess: false });
165
+ } catch {
166
+ updateCachedBindingState(this.clientId, null);
167
+ }
168
+ }
169
+ }
170
+ async call(name, params = {}, options = {}) {
171
+ try {
172
+ const result = await this.callWithBinding(name, params, options);
173
+ this.maybeTrackLease(name, params, result);
174
+ return result;
175
+ } catch (error) {
176
+ const sessionId = typeof params.sessionId === "string" ? params.sessionId : void 0;
177
+ if (sessionId && !("leaseId" in params) && isLeaseInvalidError(error) && this.sessionLeases.has(sessionId)) {
178
+ this.sessionLeases.delete(sessionId);
179
+ const result = await this.callWithBinding(name, params, options);
180
+ this.maybeTrackLease(name, params, result);
181
+ return result;
182
+ }
183
+ if (isBindingRequiredError(error)) {
184
+ if (this.binding) {
185
+ this.clearBinding();
186
+ }
187
+ await this.ensureBinding();
188
+ const result = await this.callWithBinding(name, params, { ...options, requireBinding: true });
189
+ this.maybeTrackLease(name, params, result);
190
+ return result;
191
+ }
192
+ throw error;
193
+ }
194
+ }
195
+ async releaseBinding() {
196
+ if (!this.binding) return;
197
+ if (!this.bindingAcquiredInProcess) {
198
+ this.clearBinding({ persist: false });
199
+ return;
200
+ }
201
+ const bindingId = this.binding.bindingId;
202
+ try {
203
+ await this.callRaw("relay.release", { clientId: this.clientId, bindingId });
204
+ } finally {
205
+ this.clearBinding();
206
+ }
207
+ }
208
+ async callWithBinding(name, params, options) {
209
+ const requireBinding = options.requireBinding ?? false;
210
+ const bindingId = requireBinding ? await this.ensureBinding() : this.binding?.bindingId;
211
+ const sessionId = typeof params.sessionId === "string" ? params.sessionId : void 0;
212
+ const leaseId = sessionId ? this.sessionLeases.get(sessionId) : void 0;
213
+ const payload = {
214
+ ...params,
215
+ clientId: this.clientId,
216
+ ...bindingId ? { bindingId } : {},
217
+ ...leaseId ? { leaseId } : {}
218
+ };
219
+ return await this.callRaw(name, payload, deriveTransportTimeoutMs(params, options.timeoutMs));
220
+ }
221
+ maybeTrackLease(name, params, result) {
222
+ if (name === "session.disconnect") {
223
+ const sessionId2 = typeof params.sessionId === "string" ? params.sessionId : void 0;
224
+ if (sessionId2) {
225
+ this.sessionLeases.delete(sessionId2);
226
+ }
227
+ if (result && typeof result === "object" && result.bindingReleased === true) {
228
+ this.clearBinding();
229
+ }
230
+ return;
231
+ }
232
+ if (name !== "session.launch" && name !== "session.connect") return;
233
+ if (!result || typeof result !== "object") return;
234
+ const record = result;
235
+ const sessionId = record.sessionId;
236
+ const leaseId = record.leaseId;
237
+ if (typeof sessionId === "string" && typeof leaseId === "string") {
238
+ this.sessionLeases.set(sessionId, leaseId);
239
+ }
240
+ }
241
+ async ensureBinding() {
242
+ if (this.binding && Date.now() < this.binding.expiresAtMs - MIN_RENEW_AFTER_MS) {
243
+ return this.binding.bindingId;
244
+ }
245
+ const data = await this.callRaw("relay.bind", { clientId: this.clientId });
246
+ const state = await this.resolveBindingState(data);
247
+ this.setBinding(state, { acquiredInProcess: true });
248
+ return state.bindingId;
249
+ }
250
+ async resolveBindingState(data) {
251
+ if ("queued" in data && data.queued) {
252
+ const waitMs = typeof data.waitMs === "number" && Number.isFinite(data.waitMs) ? data.waitMs : null;
253
+ const timeoutMs = waitMs ? Math.max(1e3, waitMs) : data.bindingConfig?.waitMaxMs;
254
+ const waitResponse = await this.callRaw("relay.wait", {
255
+ clientId: this.clientId,
256
+ ...timeoutMs ? { timeoutMs } : {}
257
+ });
258
+ if ("queued" in waitResponse && waitResponse.queued) {
259
+ throw new Error("RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.");
260
+ }
261
+ return parseBindingResponse(waitResponse);
262
+ }
263
+ return parseBindingResponse(data);
264
+ }
265
+ async renewBinding() {
266
+ if (!this.binding) return;
267
+ const data = await this.callRaw("relay.renew", {
268
+ clientId: this.clientId,
269
+ bindingId: this.binding.bindingId
270
+ });
271
+ this.setBinding(parseBindingResponse(data), { acquiredInProcess: this.bindingAcquiredInProcess });
272
+ }
273
+ setBinding(state, options = {}) {
274
+ this.binding = state;
275
+ if (options.acquiredInProcess !== void 0) {
276
+ this.bindingAcquiredInProcess = options.acquiredInProcess;
277
+ }
278
+ updateCachedBindingState(this.clientId, state);
279
+ if (this.autoRenew) {
280
+ this.scheduleRenew(resolveRenewDelayMs(state));
281
+ }
282
+ }
283
+ scheduleRenew(delayMs) {
284
+ if (!this.autoRenew) return;
285
+ this.clearRenewTimer();
286
+ this.renewTimer = setTimeout(() => {
287
+ this.renewTimer = null;
288
+ this.renewBinding().catch(() => this.clearBinding());
289
+ }, delayMs);
290
+ }
291
+ clearBinding(options = {}) {
292
+ this.binding = null;
293
+ this.bindingAcquiredInProcess = false;
294
+ if (options.persist !== false) {
295
+ updateCachedBindingState(this.clientId, null);
296
+ }
297
+ this.clearRenewTimer();
298
+ }
299
+ clearRenewTimer() {
300
+ if (this.renewTimer) {
301
+ clearTimeout(this.renewTimer);
302
+ this.renewTimer = null;
303
+ }
304
+ }
305
+ async callRaw(name, params, timeoutMs) {
306
+ const budget = createTimeoutBudget(timeoutMs);
307
+ const connection = await resolveDaemonConnection(budget, {
308
+ preferConfiguredRecovery: requiresConfiguredRecovery(name)
309
+ });
310
+ let timedResponse;
311
+ try {
312
+ timedResponse = await openDaemonCommand(
313
+ connection.port,
314
+ connection.token,
315
+ name,
316
+ params,
317
+ readRemainingBudgetMs(budget)
318
+ );
319
+ } catch (error) {
320
+ if (isTransportTimeoutError(error)) {
321
+ throw error;
322
+ }
323
+ timedResponse = await retryWithRefreshedConnection(name, params, budget);
324
+ }
325
+ try {
326
+ if (!timedResponse.response.ok) {
327
+ const message = await readDaemonErrorMessage(timedResponse);
328
+ if (message.includes("Unauthorized") || timedResponse.response.status === 401) {
329
+ timedResponse.dispose();
330
+ timedResponse = await retryWithRefreshedConnection(name, params, budget);
331
+ if (!timedResponse.response.ok) {
332
+ throw new CliError(await readDaemonErrorMessage(timedResponse), EXIT_EXECUTION);
333
+ }
334
+ } else {
335
+ throw new CliError(message, EXIT_EXECUTION);
336
+ }
337
+ }
338
+ const payload = await readResponseJsonWithTimeout(
339
+ timedResponse.response,
340
+ timedResponse.signal,
341
+ timedResponse.timeoutMs
342
+ );
343
+ if (!payload.ok) {
344
+ throw new CliError(payload.error || "Daemon command failed.", EXIT_EXECUTION);
345
+ }
346
+ return payload.data;
347
+ } finally {
348
+ timedResponse.dispose();
349
+ }
350
+ }
351
+ };
352
+ var asPositiveNumber = (value) => {
353
+ return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
354
+ };
355
+ var createTransportTimeoutError = (timeoutMs) => {
356
+ return new Error(`Request timed out after ${timeoutMs}ms`);
357
+ };
358
+ var createTimeoutBudget = (timeoutMs) => {
359
+ const resolved = asPositiveNumber(timeoutMs);
360
+ return resolved === void 0 ? null : { timeoutMs: resolved, deadlineMs: Date.now() + resolved };
361
+ };
362
+ var readRemainingBudgetMs = (budget) => {
363
+ if (!budget) {
364
+ return void 0;
365
+ }
366
+ const remainingMs = budget.deadlineMs - Date.now();
367
+ if (remainingMs <= 0) {
368
+ throw createTransportTimeoutError(budget.timeoutMs);
369
+ }
370
+ return remainingMs;
371
+ };
372
+ var capTimeoutToBudget = (timeoutMs, budget) => {
373
+ const remainingMs = readRemainingBudgetMs(budget);
374
+ return remainingMs === void 0 ? timeoutMs : Math.max(1, Math.min(timeoutMs, remainingMs));
375
+ };
376
+ var resolveReadyDeadlineMs = (readyTimeoutMs, budget) => {
377
+ const localDeadlineMs = Date.now() + readyTimeoutMs;
378
+ return budget ? Math.min(localDeadlineMs, budget.deadlineMs) : localDeadlineMs;
379
+ };
380
+ var hasBudgetTimedOut = (budget, deadlineMs) => {
381
+ if (!budget) {
382
+ return false;
383
+ }
384
+ return deadlineMs >= budget.deadlineMs && Date.now() >= budget.deadlineMs;
385
+ };
386
+ var deriveTransportTimeoutMs = (params, explicitTimeoutMs) => {
387
+ const explicit = asPositiveNumber(explicitTimeoutMs);
388
+ if (explicit !== void 0) {
389
+ return explicit;
390
+ }
391
+ for (const key of TRANSPORT_TIMEOUT_HINT_KEYS) {
392
+ const value = asPositiveNumber(params[key]);
393
+ if (value !== void 0) {
394
+ return Math.min(value + TRANSPORT_TIMEOUT_BUFFER_MS, MAX_DERIVED_TRANSPORT_TIMEOUT_MS);
395
+ }
396
+ }
397
+ return void 0;
398
+ };
399
+ var resolveRenewDelayMs = (binding) => {
400
+ const remainingMs = Math.max(0, binding.expiresAtMs - Date.now() - MIN_RENEW_AFTER_MS);
401
+ return Math.max(0, Math.min(binding.renewAfterMs, remainingMs));
402
+ };
403
+ var cliClient = new DaemonClient({ autoRenew: false });
404
+ async function callDaemon(command, params, options) {
405
+ return cliClient.call(command, params ?? {}, options);
406
+ }
407
+ var TYPESCRIPT_ENTRY_RE = /\.[cm]?ts$/i;
408
+ var RESTART_LOADER_ARG_FLAGS = /* @__PURE__ */ new Set(["--experimental-loader", "--import", "--loader", "--require", "-r"]);
409
+ var RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS = /* @__PURE__ */ new Set(["--experimental-strip-types", "--experimental-transform-types"]);
410
+ var RESTART_DEBUG_ARG_FLAGS = /* @__PURE__ */ new Set(["--inspect", "--inspect-brk", "--inspect-port", "--debug", "--debug-brk"]);
411
+ var isInlineRestartArg = (arg, flags) => {
412
+ for (const flag of flags) {
413
+ if (arg.startsWith(`${flag}=`)) {
414
+ return true;
415
+ }
416
+ }
417
+ return false;
418
+ };
419
+ var isRestartLoaderArg = (arg) => {
420
+ return RESTART_LOADER_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_LOADER_ARG_FLAGS);
421
+ };
422
+ var isRestartTypeScriptContextArg = (arg) => {
423
+ return RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS);
424
+ };
425
+ var isRestartDebugArg = (arg) => {
426
+ return RESTART_DEBUG_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_DEBUG_ARG_FLAGS);
427
+ };
428
+ var resolveRestartSplitArgValue = (arg, value) => {
429
+ if (arg.includes("=")) return null;
430
+ if (typeof value !== "string") return null;
431
+ return value.startsWith("-") ? null : value;
432
+ };
433
+ var resolveRestartExecArgv = (entryPath, execArgv) => {
434
+ const preserved = [];
435
+ let hasLoaderContext = false;
436
+ for (let index = 0; index < execArgv.length; index += 1) {
437
+ const arg = execArgv[index];
438
+ if (!arg) {
439
+ continue;
440
+ }
441
+ if (isRestartDebugArg(arg)) {
442
+ const next = resolveRestartSplitArgValue(arg, execArgv[index + 1]);
443
+ if (RESTART_DEBUG_ARG_FLAGS.has(arg) && next) {
444
+ index += 1;
445
+ }
446
+ continue;
447
+ }
448
+ preserved.push(arg);
449
+ if (isRestartLoaderArg(arg) || isRestartTypeScriptContextArg(arg)) {
450
+ hasLoaderContext = true;
451
+ }
452
+ const value = resolveRestartSplitArgValue(arg, execArgv[index + 1]);
453
+ if (!value) continue;
454
+ preserved.push(value);
455
+ index += 1;
456
+ }
457
+ return TYPESCRIPT_ENTRY_RE.test(entryPath) && !hasLoaderContext ? [] : preserved;
458
+ };
459
+ var fetchCurrentDaemonStatus = async (connection, options, budget = null) => {
460
+ const attempts = typeof options.retryAttempts === "number" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1 ? Math.floor(options.retryAttempts) : 1;
461
+ const retryDelayMs = typeof options.retryDelayMs === "number" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0 ? options.retryDelayMs : 0;
462
+ for (let attempt = 1; attempt <= attempts; attempt += 1) {
463
+ const status = await fetchDaemonStatus(connection.port, connection.token, {
464
+ timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)
465
+ });
466
+ if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {
467
+ return status;
468
+ }
469
+ if (attempt < attempts) {
470
+ await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));
471
+ }
472
+ }
473
+ return null;
474
+ };
475
+ var fetchAnyDaemonStatus = async (connection, options, budget = null) => {
476
+ const attempts = typeof options.retryAttempts === "number" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1 ? Math.floor(options.retryAttempts) : 1;
477
+ const retryDelayMs = typeof options.retryDelayMs === "number" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0 ? options.retryDelayMs : 0;
478
+ for (let attempt = 1; attempt <= attempts; attempt += 1) {
479
+ const status = await fetchDaemonStatus(connection.port, connection.token, {
480
+ timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)
481
+ });
482
+ if (status?.ok) {
483
+ return status;
484
+ }
485
+ if (attempt < attempts) {
486
+ await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));
487
+ }
488
+ }
489
+ return null;
490
+ };
491
+ var sleep = async (delayMs) => {
492
+ if (!(Number.isFinite(delayMs) && delayMs > 0)) {
493
+ return;
494
+ }
495
+ await new Promise((resolve2) => setTimeout(resolve2, delayMs));
496
+ };
497
+ var requiresConfiguredRecovery = (name) => {
498
+ return name === "canvas.execute" || name === "inspiredesign.run";
499
+ };
500
+ var getConfiguredDaemonConnection = () => {
501
+ const config = loadGlobalConfig();
502
+ if (!(config.daemonPort > 0 && config.daemonToken)) {
503
+ return null;
504
+ }
505
+ return { port: config.daemonPort, token: config.daemonToken };
506
+ };
507
+ var sameDaemonConnection = (left, right) => {
508
+ return left.port === right.port && left.token === right.token;
509
+ };
510
+ var persistResolvedDaemonStatus = (connection, status) => {
511
+ const config = loadGlobalConfig();
512
+ persistDaemonStatusMetadata({
513
+ port: connection.port,
514
+ token: connection.token,
515
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
516
+ fingerprint: status.fingerprint
517
+ }, status, config);
518
+ };
519
+ var persistCurrentConfiguredConnection = async (configuredConnection, status, staleMetadata) => {
520
+ if (staleMetadata && !sameDaemonConnection(staleMetadata.connection, configuredConnection)) {
521
+ void stopDaemonConnection(staleMetadata.connection, null, "persistCurrentConfiguredConnection.staleMetadata").catch(() => void 0);
522
+ }
523
+ persistResolvedDaemonStatus(configuredConnection, status);
524
+ return configuredConnection;
525
+ };
526
+ var resolveConfiguredPreferenceOptions = (budget) => {
527
+ if (!budget) {
528
+ return DAEMON_CONFIG_PREFER_OPTIONS;
529
+ }
530
+ const remainingMs = readRemainingBudgetMs(budget);
531
+ if (remainingMs === void 0 || remainingMs <= 1) {
532
+ return null;
533
+ }
534
+ const timeoutMs = Math.min(DAEMON_CONFIG_PREFER_OPTIONS.timeoutMs ?? remainingMs, remainingMs);
535
+ const retryDelayMs = Math.max(0, DAEMON_CONFIG_PREFER_OPTIONS.retryDelayMs ?? 0);
536
+ const maxAttempts = Math.max(1, DAEMON_CONFIG_PREFER_OPTIONS.retryAttempts ?? 1);
537
+ let retryAttempts = 1;
538
+ while (retryAttempts < maxAttempts) {
539
+ const nextAttempts = retryAttempts + 1;
540
+ const nextWorstCaseMs = nextAttempts * timeoutMs + (nextAttempts - 1) * retryDelayMs;
541
+ if (nextWorstCaseMs > remainingMs) {
542
+ break;
543
+ }
544
+ retryAttempts = nextAttempts;
545
+ }
546
+ return {
547
+ timeoutMs,
548
+ retryAttempts,
549
+ retryDelayMs: retryAttempts > 1 ? retryDelayMs : 0
550
+ };
551
+ };
552
+ var stopDaemonConnection = async (connection, budget = null, reason = "unknown") => {
553
+ const stopTimeoutMs = capTimeoutToBudget(DAEMON_RESTART_STATUS_TIMEOUT_MS, budget);
554
+ logDaemonStopDebug("client.stop.request", { reason, port: connection.port });
555
+ try {
556
+ const response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/stop`, {
557
+ method: "POST",
558
+ headers: createDaemonStopHeaders(connection.token, reason)
559
+ }, stopTimeoutMs);
560
+ if (response.status === 409) {
561
+ logDaemonStopDebug("client.stop.fingerprintRejected", { reason, port: connection.port });
562
+ return "fingerprint_rejected";
563
+ }
564
+ if (!response.ok) {
565
+ logDaemonStopDebug("client.stop.rejected", { reason, port: connection.port, status: response.status });
566
+ return "unreachable";
567
+ }
568
+ logDaemonStopDebug("client.stop.complete", { reason, port: connection.port });
569
+ return "stopped";
570
+ } catch {
571
+ logDaemonStopDebug("client.stop.error", { reason, port: connection.port });
572
+ return "unreachable";
573
+ }
574
+ };
575
+ function resolveDaemonRestartCommand(options = {}) {
576
+ const execPath = options.execPath ?? process.execPath;
577
+ const execArgv = options.execArgv ?? process.execArgv;
578
+ const moduleUrl = options.moduleUrl ?? import.meta.url;
579
+ const argv1 = options.argv1 ?? process.argv[1];
580
+ const entryPath = resolveCurrentDaemonEntrypointPath({
581
+ argv1,
582
+ moduleUrl,
583
+ entryExists: options.entryExists ?? existsSync
584
+ });
585
+ if (!(typeof argv1 === "string" && argv1.trim().length > 0)) {
586
+ const modulePath = resolve(fileURLToPath(moduleUrl));
587
+ if (entryPath === modulePath) {
588
+ throw createDisconnectedError("Daemon restart requires a stable CLI entrypoint. Start with `opendevbrowser serve`.");
589
+ }
590
+ }
591
+ const restartExecArgv = resolveRestartExecArgv(entryPath, execArgv);
592
+ if (TYPESCRIPT_ENTRY_RE.test(entryPath) && restartExecArgv.length === 0) {
593
+ throw createDisconnectedError("Daemon restart requires the original loader context. Start with `opendevbrowser serve`.");
594
+ }
595
+ return {
596
+ command: execPath,
597
+ args: [...restartExecArgv, entryPath]
598
+ };
599
+ }
600
+ var restartDaemonConnection = async (connection) => {
601
+ const restart = resolveDaemonRestartCommand();
602
+ const child = spawn(restart.command, [
603
+ ...restart.args,
604
+ "serve",
605
+ "--port",
606
+ String(connection.port),
607
+ "--token",
608
+ connection.token,
609
+ "--output-format",
610
+ "json"
611
+ ], {
612
+ detached: true,
613
+ stdio: "ignore"
614
+ });
615
+ child.unref();
616
+ };
617
+ var waitForCurrentDaemonStatus = async (connection, readyTimeoutMs = DAEMON_RESTART_READY_TIMEOUT_MS, budget = null) => {
618
+ const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);
619
+ while (true) {
620
+ const remainingMs = deadline - Date.now();
621
+ if (remainingMs <= 0) {
622
+ if (hasBudgetTimedOut(budget, deadline)) {
623
+ throw createTransportTimeoutError(budget.timeoutMs);
624
+ }
625
+ return null;
626
+ }
627
+ const status = await fetchDaemonStatus(connection.port, connection.token, {
628
+ timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)
629
+ });
630
+ if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {
631
+ return status;
632
+ }
633
+ if (Date.now() >= deadline) {
634
+ return null;
635
+ }
636
+ await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));
637
+ }
638
+ };
639
+ var waitForDaemonShutdown = async (connection, readyTimeoutMs = DAEMON_RECOVERY_READY_TIMEOUT_MS, budget = null) => {
640
+ const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);
641
+ while (true) {
642
+ const remainingMs = deadline - Date.now();
643
+ if (remainingMs <= 0) {
644
+ if (hasBudgetTimedOut(budget, deadline)) {
645
+ throw createTransportTimeoutError(budget.timeoutMs);
646
+ }
647
+ return null;
648
+ }
649
+ const status = await fetchDaemonStatus(connection.port, connection.token, {
650
+ timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)
651
+ });
652
+ if (!status?.ok) {
653
+ return "stopped";
654
+ }
655
+ if (isCurrentDaemonFingerprint(status.fingerprint)) {
656
+ return status;
657
+ }
658
+ if (Date.now() >= deadline) {
659
+ return null;
660
+ }
661
+ await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));
662
+ }
663
+ };
664
+ var resolveMetadataConnection = async (metadataConnection, configuredConnection, budget = null) => {
665
+ const status = await fetchAnyDaemonStatus(metadataConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);
666
+ if (!status?.ok) {
667
+ return null;
668
+ }
669
+ if (isCurrentDaemonFingerprint(status.fingerprint)) {
670
+ persistResolvedDaemonStatus(metadataConnection, status);
671
+ return { connection: metadataConnection, status };
672
+ }
673
+ if (sameDaemonConnection(metadataConnection, configuredConnection)) {
674
+ return null;
675
+ }
676
+ return { connection: metadataConnection, status };
677
+ };
678
+ var resolveFreshDaemonConnection = async (budget = null, options = {}) => {
679
+ const configuredConnection = getConfiguredDaemonConnection();
680
+ if (!configuredConnection) {
681
+ throw createDisconnectedError("Daemon not running. Start with `opendevbrowser serve`.");
682
+ }
683
+ const configuredStatus = await fetchAnyDaemonStatus(configuredConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);
684
+ let currentConfiguredStatus = configuredStatus?.ok && isCurrentDaemonFingerprint(configuredStatus.fingerprint) ? configuredStatus : null;
685
+ const metadata = readDaemonMetadata();
686
+ const metadataConnection = metadata ? { port: metadata.port, token: metadata.token } : null;
687
+ const staleMetadata = metadataConnection ? await resolveMetadataConnection(metadataConnection, configuredConnection, budget) : null;
688
+ if (currentConfiguredStatus?.ok) {
689
+ return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);
690
+ }
691
+ if (options.preferConfiguredRecovery && staleMetadata) {
692
+ currentConfiguredStatus = await waitForCurrentDaemonStatus(
693
+ configuredConnection,
694
+ DAEMON_RECOVERY_READY_TIMEOUT_MS,
695
+ budget
696
+ );
697
+ if (currentConfiguredStatus?.ok) {
698
+ return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);
699
+ }
700
+ if (!configuredStatus?.ok) {
701
+ throw createDisconnectedError("Daemon not running. Start with `opendevbrowser serve`.");
702
+ }
703
+ }
704
+ if (!options.preferConfiguredRecovery && staleMetadata?.status.ok && isCurrentDaemonFingerprint(staleMetadata.status.fingerprint)) {
705
+ if (configuredStatus?.ok) {
706
+ void stopDaemonConnection(configuredConnection, budget, "resolveFreshDaemonConnection.configuredCurrentMetadataPreferred").catch(() => void 0);
707
+ }
708
+ return staleMetadata.connection;
709
+ }
710
+ if (!configuredStatus?.ok && staleMetadata) {
711
+ currentConfiguredStatus = await waitForCurrentDaemonStatus(
712
+ configuredConnection,
713
+ DAEMON_RECOVERY_READY_TIMEOUT_MS,
714
+ budget
715
+ );
716
+ if (currentConfiguredStatus?.ok) {
717
+ return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);
718
+ }
719
+ throw createDisconnectedError("Daemon not running. Start with `opendevbrowser serve`.");
720
+ }
721
+ const staleConnections = [];
722
+ if (configuredStatus?.ok) {
723
+ staleConnections.push({ connection: configuredConnection, status: configuredStatus });
724
+ }
725
+ if (staleConnections.length === 0) {
726
+ const recoveringStatus = await waitForCurrentDaemonStatus(
727
+ configuredConnection,
728
+ DAEMON_RECOVERY_READY_TIMEOUT_MS,
729
+ budget
730
+ );
731
+ if (recoveringStatus?.ok) {
732
+ persistResolvedDaemonStatus(configuredConnection, recoveringStatus);
733
+ return configuredConnection;
734
+ }
735
+ throw createDisconnectedError("Daemon not running. Start with `opendevbrowser serve`.");
736
+ }
737
+ for (const staleConnection of staleConnections) {
738
+ const stopOutcome = await stopDaemonConnection(
739
+ staleConnection.connection,
740
+ budget,
741
+ "resolveFreshDaemonConnection.staleConnections"
742
+ );
743
+ if (stopOutcome === "fingerprint_rejected") {
744
+ throw createDisconnectedError(
745
+ `Daemon on 127.0.0.1:${staleConnection.connection.port} pid=${staleConnection.status.pid} is protected by a different opendevbrowser build. Start with \`opendevbrowser serve\`.`
746
+ );
747
+ }
748
+ }
749
+ if (configuredStatus?.ok) {
750
+ const shutdownOutcome = await waitForDaemonShutdown(configuredConnection, DAEMON_RECOVERY_READY_TIMEOUT_MS, budget);
751
+ if (!shutdownOutcome) {
752
+ throw createDisconnectedError("Daemon restart could not reclaim the configured port after fingerprint mismatch. Start with `opendevbrowser serve`.");
753
+ }
754
+ if (shutdownOutcome !== "stopped") {
755
+ persistResolvedDaemonStatus(configuredConnection, shutdownOutcome);
756
+ return configuredConnection;
757
+ }
758
+ }
759
+ await restartDaemonConnection(configuredConnection);
760
+ const refreshedStatus = await waitForCurrentDaemonStatus(configuredConnection, DAEMON_RESTART_READY_TIMEOUT_MS, budget);
761
+ if (!refreshedStatus?.ok) {
762
+ throw createDisconnectedError("Daemon restart failed after fingerprint mismatch. Start with `opendevbrowser serve`.");
763
+ }
764
+ persistResolvedDaemonStatus(configuredConnection, refreshedStatus);
765
+ return configuredConnection;
766
+ };
767
+ var resolveDaemonConnection = async (budget = null, options = {}) => {
768
+ const metadata = readDaemonMetadata();
769
+ if (metadata && isCurrentDaemonFingerprint(metadata.fingerprint)) {
770
+ const metadataConnection = { port: metadata.port, token: metadata.token };
771
+ const configuredConnection = getConfiguredDaemonConnection();
772
+ if (!configuredConnection || sameDaemonConnection(metadataConnection, configuredConnection)) {
773
+ return metadataConnection;
774
+ }
775
+ const configuredOptions = resolveConfiguredPreferenceOptions(budget);
776
+ if (!configuredOptions) {
777
+ if (options.preferConfiguredRecovery) {
778
+ return await resolveFreshDaemonConnection(budget, options);
779
+ }
780
+ return metadataConnection;
781
+ }
782
+ const configuredStatus = await fetchCurrentDaemonStatus(configuredConnection, configuredOptions, budget);
783
+ if (configuredStatus?.ok) {
784
+ return await persistCurrentConfiguredConnection(
785
+ configuredConnection,
786
+ configuredStatus,
787
+ { connection: metadataConnection }
788
+ );
789
+ }
790
+ if (options.preferConfiguredRecovery) {
791
+ return await resolveFreshDaemonConnection(budget, options);
792
+ }
793
+ return metadataConnection;
794
+ }
795
+ return await resolveFreshDaemonConnection(budget, options);
796
+ };
797
+ var retryWithRefreshedConnection = async (name, params, budget) => {
798
+ const connection = await resolveFreshDaemonConnection(budget, {
799
+ preferConfiguredRecovery: requiresConfiguredRecovery(name)
800
+ });
801
+ return await openDaemonCommand(connection.port, connection.token, name, params, readRemainingBudgetMs(budget));
802
+ };
803
+ var openDaemonCommand = async (port, token, name, params, timeoutMs) => {
804
+ return await fetchWithTimeoutContext(`http://127.0.0.1:${port}/command`, {
805
+ method: "POST",
806
+ headers: {
807
+ "Content-Type": "application/json",
808
+ Authorization: `Bearer ${token}`
809
+ },
810
+ body: JSON.stringify({ name, params })
811
+ }, timeoutMs);
812
+ };
813
+ var readDaemonErrorMessage = async (timedResponse) => {
814
+ const text = await readResponseTextWithTimeout(
815
+ timedResponse.response,
816
+ timedResponse.signal,
817
+ timedResponse.timeoutMs
818
+ );
819
+ let message = text || String(timedResponse.response.status);
820
+ try {
821
+ const parsed = JSON.parse(text);
822
+ if (parsed && typeof parsed === "object") {
823
+ if (typeof parsed.error === "string" && parsed.error.trim()) {
824
+ message = parsed.error;
825
+ } else if (typeof parsed.message === "string" && parsed.message.trim()) {
826
+ message = parsed.message;
827
+ }
828
+ }
829
+ } catch {
830
+ }
831
+ return message;
832
+ };
833
+
834
+ export {
835
+ DaemonClient,
836
+ callDaemon
837
+ };
838
+ //# sourceMappingURL=chunk-MD655IPO.js.map