opendevbrowser 0.0.30 → 0.0.32

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