opendevbrowser 0.0.31 → 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 (294) hide show
  1. package/README.md +18 -5
  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-6B5WAQV7.js → chunk-AKIAGFOE.js} +30 -7
  17. package/dist/chunk-AKIAGFOE.js.map +1 -0
  18. package/dist/{chunk-2I3YS3DV.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/daemon-client.d.ts.map +1 -1
  50. package/dist/cli/daemon-commands.d.ts.map +1 -1
  51. package/dist/cli/daemon-mismatch.d.ts +9 -0
  52. package/dist/cli/daemon-mismatch.d.ts.map +1 -0
  53. package/dist/cli/daemon.d.ts.map +1 -1
  54. package/dist/cli/errors.d.ts +4 -2
  55. package/dist/cli/errors.d.ts.map +1 -1
  56. package/dist/cli/help.d.ts.map +1 -1
  57. package/dist/cli/index.js +89 -88
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/cli/installers/postinstall-skill-sync.js +2 -2
  60. package/dist/{click-2AILSEIZ.js → click-HLNXU4I5.js} +10 -10
  61. package/dist/{clone-component-TPJS3PEG.js → clone-component-QIKN5PIM.js} +9 -9
  62. package/dist/{clone-page-LE74CIFC.js → clone-page-5C7DTGZT.js} +9 -9
  63. package/dist/{close-HN4YI47K.js → close-PCRZHX7F.js} +9 -9
  64. package/dist/{close-WFERRHX6.js → close-WTXB3EDD.js} +9 -9
  65. package/dist/{connect-RWBV2UCQ.js → connect-6C2IG55I.js} +10 -10
  66. package/dist/{console-poll-PP4YYPDF.js → console-poll-VJXCZR3F.js} +10 -10
  67. package/dist/{cookie-import-6IP776FC.js → cookie-import-5OEDFB6U.js} +9 -9
  68. package/dist/{cookie-list-O2KG6DPU.js → cookie-list-44UNJJ6D.js} +9 -9
  69. package/dist/{daemon-2BSAZXLT.js → daemon-CIKGBWEB.js} +25 -12
  70. package/dist/daemon-CIKGBWEB.js.map +1 -0
  71. package/dist/daemon-fingerprint.json +1 -1
  72. package/dist/{debug-trace-snapshot-F3BDVZXS.js → debug-trace-snapshot-RGXAPGWB.js} +10 -10
  73. package/dist/{dialog-6JQYUWMQ.js → dialog-S64MJUM2.js} +10 -10
  74. package/dist/{disconnect-763TP7GH.js → disconnect-MTIELIM7.js} +9 -9
  75. package/dist/{enabled-DLYQFNIP.js → enabled-KF2L7LW4.js} +10 -10
  76. package/dist/{goto-S346TJJH.js → goto-ULWINUAZ.js} +10 -10
  77. package/dist/{help-U7KBQME6.js → help-IG5S5RJD.js} +13 -9
  78. package/dist/help-IG5S5RJD.js.map +1 -0
  79. package/dist/{hover-6JVJFGO7.js → hover-NOCOTR6N.js} +10 -10
  80. package/dist/{html-EVOSPBIT.js → html-LXSYP6BT.js} +10 -10
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +46 -17
  83. package/dist/index.js.map +1 -1
  84. package/dist/{inspector-H57BVUJP.js → inspector-62EPCLYB.js} +11 -11
  85. package/dist/{inspector-audit-NQBAJWC7.js → inspector-audit-T2IF67RJ.js} +13 -13
  86. package/dist/{inspector-plan-ZDIQVND3.js → inspector-plan-KQS6LRMW.js} +11 -11
  87. package/dist/inspiredesign/capture.d.ts +4 -0
  88. package/dist/inspiredesign/capture.d.ts.map +1 -1
  89. package/dist/inspiredesign/contract.d.ts +22 -0
  90. package/dist/inspiredesign/contract.d.ts.map +1 -1
  91. package/dist/inspiredesign/handoff.d.ts +7 -1
  92. package/dist/inspiredesign/handoff.d.ts.map +1 -1
  93. package/dist/inspiredesign/meta-prompt.d.ts +9 -0
  94. package/dist/inspiredesign/meta-prompt.d.ts.map +1 -0
  95. package/dist/inspiredesign/reference-discovery.d.ts +29 -0
  96. package/dist/inspiredesign/reference-discovery.d.ts.map +1 -0
  97. package/dist/inspiredesign/reference-pattern-board.d.ts +21 -0
  98. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  99. package/dist/inspiredesign/visual-evidence.d.ts +46 -0
  100. package/dist/inspiredesign/visual-evidence.d.ts.map +1 -0
  101. package/dist/inspiredesign/visual-policy.d.ts +17 -0
  102. package/dist/inspiredesign/visual-policy.d.ts.map +1 -0
  103. package/dist/{inspiredesign-IEUL4PX3.js → inspiredesign-DB6CHYN3.js} +71 -19
  104. package/dist/inspiredesign-DB6CHYN3.js.map +1 -0
  105. package/dist/{launch-EK66VQPF.js → launch-B5ES6FVS.js} +10 -10
  106. package/dist/{list-KKUKN467.js → list-TIZVR6RO.js} +9 -9
  107. package/dist/{list-ADZAQ2IU.js → list-XM4BP5GM.js} +9 -9
  108. package/dist/{macro-resolve-6DOQJ7CA.js → macro-resolve-TTQZVFIW.js} +10 -10
  109. package/dist/{native-UPLVQ2SG.js → native-J2DFLOLP.js} +3 -3
  110. package/dist/{network-poll-NUL4PDPY.js → network-poll-NNSY4W63.js} +10 -10
  111. package/dist/{new-5NKYPEFT.js → new-E6VNAC2A.js} +9 -9
  112. package/dist/{open-NR3BPLXV.js → open-F55XKMKB.js} +9 -9
  113. package/dist/opendevbrowser.d.ts.map +1 -1
  114. package/dist/opendevbrowser.js +46 -17
  115. package/dist/opendevbrowser.js.map +1 -1
  116. package/dist/{perf-HJ36ZI6H.js → perf-RE7JE6CP.js} +10 -10
  117. package/dist/{pointer-down-IYTTQWXZ.js → pointer-down-BCBPC5FJ.js} +11 -11
  118. package/dist/{pointer-drag-A2YC5PWI.js → pointer-drag-QK7KGF7W.js} +11 -11
  119. package/dist/{pointer-move-W5K5FUI4.js → pointer-move-VFAZQAXA.js} +11 -11
  120. package/dist/{pointer-up-6GWVO64Y.js → pointer-up-FA5WE6LS.js} +11 -11
  121. package/dist/{press-A3V5WB3S.js → press-TNRHNDSW.js} +10 -10
  122. package/dist/{product-video-52REKWF3.js → product-video-UEANMZ2U.js} +11 -11
  123. package/dist/providers/renderer.d.ts +7 -1
  124. package/dist/providers/renderer.d.ts.map +1 -1
  125. package/dist/providers/workflow-handoff.d.ts +1 -0
  126. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  127. package/dist/providers/workflows.d.ts +45 -3
  128. package/dist/providers/workflows.d.ts.map +1 -1
  129. package/dist/{providers-IMFYMMHQ.js → providers-AMCNWZUL.js} +3 -3
  130. package/dist/public-surface/generated-manifest.d.ts +12 -3
  131. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  132. package/dist/public-surface/source.d.ts +5 -5
  133. package/dist/public-surface/source.d.ts.map +1 -1
  134. package/dist/{research-WB6BBCDD.js → research-YFY7WJSZ.js} +11 -11
  135. package/dist/{review-BGWVY4RA.js → review-NHOPLAT7.js} +11 -11
  136. package/dist/{review-desktop-LEORC5VS.js → review-desktop-OFWPDYGD.js} +11 -11
  137. package/dist/{rpc-4TSKSFGC.js → rpc-TVVQPUOL.js} +10 -10
  138. package/dist/{run-3NBLVWXD.js → run-OCBEZRDW.js} +8 -8
  139. package/dist/{screencast-start-UZVIT3IN.js → screencast-start-GTSDA33J.js} +10 -10
  140. package/dist/{screencast-stop-NOSJSIUO.js → screencast-stop-FYBUIXAA.js} +10 -10
  141. package/dist/{screenshot-LARG4JQG.js → screenshot-OEYRT3SP.js} +10 -10
  142. package/dist/{scroll-VNFMV6TW.js → scroll-35OFEFC5.js} +10 -10
  143. package/dist/{scroll-into-view-VYRT3JPT.js → scroll-into-view-UQ5RAWIX.js} +10 -10
  144. package/dist/{select-KJTUZDVO.js → select-K56QELVZ.js} +10 -10
  145. package/dist/{serve-EV7K4HKR.js → serve-5UJ3VMWC.js} +48 -24
  146. package/dist/serve-5UJ3VMWC.js.map +1 -0
  147. package/dist/{shopping-DTXHVQ2X.js → shopping-FJG7XB4Q.js} +11 -11
  148. package/dist/{skill-lifecycle-5UAZGKSN.js → skill-lifecycle-OWZYBPFS.js} +3 -3
  149. package/dist/skills/bundled-skill-directories.d.ts.map +1 -1
  150. package/dist/skills/skill-loader.js +2 -2
  151. package/dist/{skills-NSXDX6YM.js → skills-KHMRNOE4.js} +3 -3
  152. package/dist/{snapshot-3XQMCMRJ.js → snapshot-W7RKVZEI.js} +10 -10
  153. package/dist/{status-YUMDP5KY.js → status-KHYCLGUD.js} +20 -12
  154. package/dist/status-KHYCLGUD.js.map +1 -0
  155. package/dist/{status-OXSYA5XD.js → status-R4EV4TWO.js} +11 -11
  156. package/dist/{status-capabilities-P4KDSE2Y.js → status-capabilities-XD3RGLKF.js} +11 -11
  157. package/dist/{text-V3B7UVIH.js → text-TANLFZ4O.js} +10 -10
  158. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  159. package/dist/{type-IYBN3ZLR.js → type-Y2Y7LX7Y.js} +10 -10
  160. package/dist/{uncheck-SG737EGI.js → uncheck-6REVUUB2.js} +10 -10
  161. package/dist/{uninstall-KYKGJAX7.js → uninstall-FW5ORBIN.js} +3 -3
  162. package/dist/{update-skill-modes-BVX7IVMW.js → update-skill-modes-3ULKJK3Y.js} +3 -3
  163. package/dist/{upload-KH6ZABJA.js → upload-GGZC5UQP.js} +10 -10
  164. package/dist/{use-7YDKO3U4.js → use-B4Q7CFG2.js} +9 -9
  165. package/dist/{value-RZBWSKKM.js → value-DHOHO55D.js} +10 -10
  166. package/dist/{visible-BSFTAKXR.js → visible-S5BTWYNH.js} +10 -10
  167. package/dist/{wait-TMTEAYOP.js → wait-WV6NZUKL.js} +10 -10
  168. package/dist/{windows-HIZ23OHS.js → windows-GKE36DJQ.js} +11 -11
  169. package/extension/manifest.json +1 -1
  170. package/package.json +1 -1
  171. package/skills/AGENTS.md +2 -1
  172. package/skills/opendevbrowser-best-practices/SKILL.md +9 -2
  173. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +4 -3
  174. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +7 -0
  175. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +49 -3
  176. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +24 -2
  177. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +1 -0
  178. package/skills/opendevbrowser-design-agent/SKILL.md +3 -0
  179. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +85 -40
  180. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +2 -0
  181. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +20 -5
  182. package/skills/opendevbrowser-motion-design/SKILL.md +129 -0
  183. package/skills/opendevbrowser-motion-design/artifacts/accessibility-reduced-motion.md +37 -0
  184. package/skills/opendevbrowser-motion-design/artifacts/device-breakpoint-posture.md +40 -0
  185. package/skills/opendevbrowser-motion-design/artifacts/motion-anti-patterns.md +29 -0
  186. package/skills/opendevbrowser-motion-design/artifacts/motion-pattern-catalog.md +430 -0
  187. package/skills/opendevbrowser-motion-design/artifacts/motion-release-gate.md +28 -0
  188. package/skills/opendevbrowser-motion-design/artifacts/motion-terminology.md +46 -0
  189. package/skills/opendevbrowser-motion-design/artifacts/open-dev-browser-motion-evidence.md +48 -0
  190. package/skills/opendevbrowser-motion-design/artifacts/performance-frame-budget.md +38 -0
  191. package/skills/opendevbrowser-motion-design/artifacts/platform-framework-guide.md +166 -0
  192. package/skills/opendevbrowser-motion-design/assets/templates/motion-audit-report.v1.md +70 -0
  193. package/skills/opendevbrowser-motion-design/assets/templates/motion-contract.v1.json +79 -0
  194. package/skills/opendevbrowser-motion-design/assets/templates/motion-release-gate.v1.json +18 -0
  195. package/skills/opendevbrowser-motion-design/assets/templates/motion-viewport-matrix.v1.json +76 -0
  196. package/skills/opendevbrowser-motion-design/scripts/motion-workflow.sh +163 -0
  197. package/skills/opendevbrowser-motion-design/scripts/validate-skill-assets.sh +374 -0
  198. package/dist/chunk-2I3YS3DV.js.map +0 -1
  199. package/dist/chunk-3ILXPKSJ.js.map +0 -1
  200. package/dist/chunk-4BEJVZRK.js.map +0 -1
  201. package/dist/chunk-6B5WAQV7.js.map +0 -1
  202. package/dist/chunk-COAOWH3G.js.map +0 -1
  203. package/dist/chunk-IPE7TF2P.js.map +0 -1
  204. package/dist/chunk-KZ2IXVQT.js.map +0 -1
  205. package/dist/chunk-MD655IPO.js.map +0 -1
  206. package/dist/daemon-2BSAZXLT.js.map +0 -1
  207. package/dist/help-U7KBQME6.js.map +0 -1
  208. package/dist/inspiredesign-IEUL4PX3.js.map +0 -1
  209. package/dist/serve-EV7K4HKR.js.map +0 -1
  210. package/dist/status-YUMDP5KY.js.map +0 -1
  211. /package/dist/{accessibility-snapshot-CQ4ZKWKC.js.map → accessibility-snapshot-XOP66CSK.js.map} +0 -0
  212. /package/dist/{active-window-TD5HYJ72.js.map → active-window-E3WFOQGX.js.map} +0 -0
  213. /package/dist/{annotate-VTLFS2XV.js.map → annotate-MAE7ZJOZ.js.map} +0 -0
  214. /package/dist/{artifacts-KJ6RNDO2.js.map → artifacts-JHDUUJGQ.js.map} +0 -0
  215. /package/dist/{attr-BCI5KYCW.js.map → attr-M3PFDJ7Q.js.map} +0 -0
  216. /package/dist/{canvas-5DFEEOKM.js.map → canvas-3AJVL5I5.js.map} +0 -0
  217. /package/dist/{capture-desktop-HFTTWY4Z.js.map → capture-desktop-VJGEETMJ.js.map} +0 -0
  218. /package/dist/{capture-window-X63XPIFF.js.map → capture-window-W5UFSFQL.js.map} +0 -0
  219. /package/dist/{check-LWAUY7GC.js.map → check-4IR3UJVW.js.map} +0 -0
  220. /package/dist/{checked-ZSOUKVYT.js.map → checked-PKNY7724.js.map} +0 -0
  221. /package/dist/{chunk-AHEWXOKY.js.map → chunk-BUXFIY2P.js.map} +0 -0
  222. /package/dist/{chunk-QOMWCRE3.js.map → chunk-HBK56JST.js.map} +0 -0
  223. /package/dist/{chunk-T4GMCW6Z.js.map → chunk-J3KYGJRQ.js.map} +0 -0
  224. /package/dist/{chunk-6PVZ2ABC.js.map → chunk-L3YNUGYF.js.map} +0 -0
  225. /package/dist/{chunk-JZXD6FWR.js.map → chunk-NURQB55J.js.map} +0 -0
  226. /package/dist/{chunk-GQJ5S3BL.js.map → chunk-P5K3ZIPI.js.map} +0 -0
  227. /package/dist/{chunk-PPUWQKIC.js.map → chunk-PIFHXKV4.js.map} +0 -0
  228. /package/dist/{chunk-STGGGVYT.js.map → chunk-QMHKAFYX.js.map} +0 -0
  229. /package/dist/{chunk-RPXWUCQQ.js.map → chunk-SKFB5ICF.js.map} +0 -0
  230. /package/dist/{chunk-2SIMIPLY.js.map → chunk-W6YPVNDX.js.map} +0 -0
  231. /package/dist/{chunk-KDSNXS6N.js.map → chunk-ZMNEWS7A.js.map} +0 -0
  232. /package/dist/{click-2AILSEIZ.js.map → click-HLNXU4I5.js.map} +0 -0
  233. /package/dist/{clone-component-TPJS3PEG.js.map → clone-component-QIKN5PIM.js.map} +0 -0
  234. /package/dist/{clone-page-LE74CIFC.js.map → clone-page-5C7DTGZT.js.map} +0 -0
  235. /package/dist/{close-HN4YI47K.js.map → close-PCRZHX7F.js.map} +0 -0
  236. /package/dist/{close-WFERRHX6.js.map → close-WTXB3EDD.js.map} +0 -0
  237. /package/dist/{connect-RWBV2UCQ.js.map → connect-6C2IG55I.js.map} +0 -0
  238. /package/dist/{console-poll-PP4YYPDF.js.map → console-poll-VJXCZR3F.js.map} +0 -0
  239. /package/dist/{cookie-import-6IP776FC.js.map → cookie-import-5OEDFB6U.js.map} +0 -0
  240. /package/dist/{cookie-list-O2KG6DPU.js.map → cookie-list-44UNJJ6D.js.map} +0 -0
  241. /package/dist/{debug-trace-snapshot-F3BDVZXS.js.map → debug-trace-snapshot-RGXAPGWB.js.map} +0 -0
  242. /package/dist/{dialog-6JQYUWMQ.js.map → dialog-S64MJUM2.js.map} +0 -0
  243. /package/dist/{disconnect-763TP7GH.js.map → disconnect-MTIELIM7.js.map} +0 -0
  244. /package/dist/{enabled-DLYQFNIP.js.map → enabled-KF2L7LW4.js.map} +0 -0
  245. /package/dist/{goto-S346TJJH.js.map → goto-ULWINUAZ.js.map} +0 -0
  246. /package/dist/{hover-6JVJFGO7.js.map → hover-NOCOTR6N.js.map} +0 -0
  247. /package/dist/{html-EVOSPBIT.js.map → html-LXSYP6BT.js.map} +0 -0
  248. /package/dist/{inspector-H57BVUJP.js.map → inspector-62EPCLYB.js.map} +0 -0
  249. /package/dist/{inspector-audit-NQBAJWC7.js.map → inspector-audit-T2IF67RJ.js.map} +0 -0
  250. /package/dist/{inspector-plan-ZDIQVND3.js.map → inspector-plan-KQS6LRMW.js.map} +0 -0
  251. /package/dist/{launch-EK66VQPF.js.map → launch-B5ES6FVS.js.map} +0 -0
  252. /package/dist/{list-KKUKN467.js.map → list-TIZVR6RO.js.map} +0 -0
  253. /package/dist/{list-ADZAQ2IU.js.map → list-XM4BP5GM.js.map} +0 -0
  254. /package/dist/{macro-resolve-6DOQJ7CA.js.map → macro-resolve-TTQZVFIW.js.map} +0 -0
  255. /package/dist/{native-UPLVQ2SG.js.map → native-J2DFLOLP.js.map} +0 -0
  256. /package/dist/{network-poll-NUL4PDPY.js.map → network-poll-NNSY4W63.js.map} +0 -0
  257. /package/dist/{new-5NKYPEFT.js.map → new-E6VNAC2A.js.map} +0 -0
  258. /package/dist/{open-NR3BPLXV.js.map → open-F55XKMKB.js.map} +0 -0
  259. /package/dist/{perf-HJ36ZI6H.js.map → perf-RE7JE6CP.js.map} +0 -0
  260. /package/dist/{pointer-down-IYTTQWXZ.js.map → pointer-down-BCBPC5FJ.js.map} +0 -0
  261. /package/dist/{pointer-drag-A2YC5PWI.js.map → pointer-drag-QK7KGF7W.js.map} +0 -0
  262. /package/dist/{pointer-move-W5K5FUI4.js.map → pointer-move-VFAZQAXA.js.map} +0 -0
  263. /package/dist/{pointer-up-6GWVO64Y.js.map → pointer-up-FA5WE6LS.js.map} +0 -0
  264. /package/dist/{press-A3V5WB3S.js.map → press-TNRHNDSW.js.map} +0 -0
  265. /package/dist/{product-video-52REKWF3.js.map → product-video-UEANMZ2U.js.map} +0 -0
  266. /package/dist/{providers-IMFYMMHQ.js.map → providers-AMCNWZUL.js.map} +0 -0
  267. /package/dist/{research-WB6BBCDD.js.map → research-YFY7WJSZ.js.map} +0 -0
  268. /package/dist/{review-BGWVY4RA.js.map → review-NHOPLAT7.js.map} +0 -0
  269. /package/dist/{review-desktop-LEORC5VS.js.map → review-desktop-OFWPDYGD.js.map} +0 -0
  270. /package/dist/{rpc-4TSKSFGC.js.map → rpc-TVVQPUOL.js.map} +0 -0
  271. /package/dist/{run-3NBLVWXD.js.map → run-OCBEZRDW.js.map} +0 -0
  272. /package/dist/{screencast-start-UZVIT3IN.js.map → screencast-start-GTSDA33J.js.map} +0 -0
  273. /package/dist/{screencast-stop-NOSJSIUO.js.map → screencast-stop-FYBUIXAA.js.map} +0 -0
  274. /package/dist/{screenshot-LARG4JQG.js.map → screenshot-OEYRT3SP.js.map} +0 -0
  275. /package/dist/{scroll-VNFMV6TW.js.map → scroll-35OFEFC5.js.map} +0 -0
  276. /package/dist/{scroll-into-view-VYRT3JPT.js.map → scroll-into-view-UQ5RAWIX.js.map} +0 -0
  277. /package/dist/{select-KJTUZDVO.js.map → select-K56QELVZ.js.map} +0 -0
  278. /package/dist/{shopping-DTXHVQ2X.js.map → shopping-FJG7XB4Q.js.map} +0 -0
  279. /package/dist/{skill-lifecycle-5UAZGKSN.js.map → skill-lifecycle-OWZYBPFS.js.map} +0 -0
  280. /package/dist/{skills-NSXDX6YM.js.map → skills-KHMRNOE4.js.map} +0 -0
  281. /package/dist/{snapshot-3XQMCMRJ.js.map → snapshot-W7RKVZEI.js.map} +0 -0
  282. /package/dist/{status-OXSYA5XD.js.map → status-R4EV4TWO.js.map} +0 -0
  283. /package/dist/{status-capabilities-P4KDSE2Y.js.map → status-capabilities-XD3RGLKF.js.map} +0 -0
  284. /package/dist/{text-V3B7UVIH.js.map → text-TANLFZ4O.js.map} +0 -0
  285. /package/dist/{type-IYBN3ZLR.js.map → type-Y2Y7LX7Y.js.map} +0 -0
  286. /package/dist/{uncheck-SG737EGI.js.map → uncheck-6REVUUB2.js.map} +0 -0
  287. /package/dist/{uninstall-KYKGJAX7.js.map → uninstall-FW5ORBIN.js.map} +0 -0
  288. /package/dist/{update-skill-modes-BVX7IVMW.js.map → update-skill-modes-3ULKJK3Y.js.map} +0 -0
  289. /package/dist/{upload-KH6ZABJA.js.map → upload-GGZC5UQP.js.map} +0 -0
  290. /package/dist/{use-7YDKO3U4.js.map → use-B4Q7CFG2.js.map} +0 -0
  291. /package/dist/{value-RZBWSKKM.js.map → value-DHOHO55D.js.map} +0 -0
  292. /package/dist/{visible-BSFTAKXR.js.map → visible-S5BTWYNH.js.map} +0 -0
  293. /package/dist/{wait-TMTEAYOP.js.map → wait-WV6NZUKL.js.map} +0 -0
  294. /package/dist/{windows-HIZ23OHS.js.map → windows-GKE36DJQ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/errors.ts"],"sourcesContent":["import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n"],"mappings":";AAEO,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EAEA,YAAY,SAAiB,UAAkB;AAC7C,UAAM,OAAO;AACb,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,SAAO,IAAI,SAAS,SAAS,UAAU;AACzC;AAEO,SAAS,wBAAwB,SAA2B;AACjE,SAAO,IAAI,SAAS,SAAS,iBAAiB;AAChD;AAEO,SAAS,WAAW,OAAgB,mBAAmB,gBAA0B;AACtF,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,IAAI,SAAS,SAAS,gBAAgB;AAC/C;AAQO,SAAS,mBAAmB,OAA+B;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,EAClB;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,MAAI,OAAO,aAAa,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,UAAU,eAAe;AACzC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/inspiredesign/handoff.ts"],"sourcesContent":["export const INSPIREDESIGN_HANDOFF_FILES = {\n designMarkdown: \"design.md\",\n advancedBrief: \"advanced-brief.md\",\n designContract: \"design-contract.json\",\n canvasPlanRequest: \"canvas-plan.request.json\",\n designAgentHandoff: \"design-agent-handoff.json\",\n generationPlan: \"generation-plan.json\",\n implementationPlanMarkdown: \"implementation-plan.md\",\n implementationPlan: \"implementation-plan.json\",\n evidence: \"evidence.json\",\n prototypeGuidance: \"prototype-guidance.md\"\n} as const;\n\nexport type InspiredesignGuideEntry = {\n purpose: string;\n expectedContents: readonly string[];\n howToUse: readonly string[];\n mustNot: readonly string[];\n};\n\ntype InspiredesignHandoffFile =\n (typeof INSPIREDESIGN_HANDOFF_FILES)[keyof typeof INSPIREDESIGN_HANDOFF_FILES];\n\nexport type InspiredesignArtifactGuide = Record<InspiredesignHandoffFile, InspiredesignGuideEntry>;\n\nexport type InspiredesignContractSectionGuide = Record<string, InspiredesignGuideEntry>;\n\nconst INSPIREDESIGN_HANDOFF_SKILLS = {\n bestPractices: {\n name: \"opendevbrowser-best-practices\",\n topic: \"quick start\"\n },\n designAgent: {\n name: \"opendevbrowser-design-agent\",\n topic: \"canvas-contract\"\n }\n} as const;\n\ntype InspiredesignHandoffSkill =\n (typeof INSPIREDESIGN_HANDOFF_SKILLS)[keyof typeof INSPIREDESIGN_HANDOFF_SKILLS];\n\nconst formatSkillReference = (skill: InspiredesignHandoffSkill): string => (\n `${skill.name} \"${skill.topic}\"`\n);\n\nconst formatSkillLoadCommand = (skill: InspiredesignHandoffSkill): string => (\n `opendevbrowser_skill_load ${skill.name} \"${skill.topic}\"`\n);\n\nexport const INSPIREDESIGN_HANDOFF_COMMANDS = {\n loadBestPractices: formatSkillLoadCommand(INSPIREDESIGN_HANDOFF_SKILLS.bestPractices),\n loadDesignAgent: formatSkillLoadCommand(INSPIREDESIGN_HANDOFF_SKILLS.designAgent),\n continueInCanvas: `opendevbrowser canvas --command canvas.plan.set --params-file ./${INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest}`\n} as const;\n\nexport const INSPIREDESIGN_HANDOFF_RECOMMENDED_SKILLS = [\n formatSkillReference(INSPIREDESIGN_HANDOFF_SKILLS.bestPractices),\n formatSkillReference(INSPIREDESIGN_HANDOFF_SKILLS.designAgent)\n] as const;\n\nexport const INSPIREDESIGN_HANDOFF_GUIDANCE = {\n reviewAdvancedBrief: `${INSPIREDESIGN_HANDOFF_FILES.advancedBrief} is the authoritative reference-first brief. When URL references exist, captured evidence leads the creative direction; selected format, profile defaults, layout posture, motion grammar, and anti-patterns are route guardrails only. Read it before touching Canvas or implementation files.`,\n prepareCanvasPlanRequest: `Fill canvasSessionId, leaseId, and documentId in ${INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest} before running ${INSPIREDESIGN_HANDOFF_COMMANDS.continueInCanvas}.`,\n deepCaptureRecommendation: \"Any inspiredesign run with reference URLs already uses captureMode=deep. Rerun with the same URLs only when you need refreshed DOM/layout evidence, restored session state, or capture-specific debugging.\"\n} as const;\n\nexport const INSPIREDESIGN_ARTIFACT_GUIDE: InspiredesignArtifactGuide = {\n [INSPIREDESIGN_HANDOFF_FILES.advancedBrief]: {\n purpose: \"Authoritative reference-first brief for the downstream design agent.\",\n expectedContents: [\"Selected prompt format\", \"reference pattern board\", \"route guardrails\"],\n howToUse: [\"Read first\", \"treat captured evidence as creative priority\", \"use guardrails to avoid route drift\"],\n mustNot: [\"Do not treat defaults as stronger than captured references\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.designMarkdown]: {\n purpose: \"Human-readable design specification and implementation narrative.\",\n expectedContents: [\"inspiration analysis\", \"unified direction\", \"governance summary\", \"deliverables\"],\n howToUse: [\"Use as the readable project brief\", \"cross-check implementation choices against its sections\"],\n mustNot: [\"Do not use prose as a substitute for the JSON contract when patching Canvas\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.designContract]: {\n purpose: \"Narrowed Canvas governance contract for design decisions.\",\n expectedContents: [\"emitted governance blocks\", \"motion system\", \"library policy\", \"runtime budgets\"],\n howToUse: [\"Patch only emitted governance blocks\", \"compare implementation against this contract before shipping\"],\n mustNot: [\"Do not add navigation, async, or performance context as Canvas governance patches\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest]: {\n purpose: \"Ready-to-fill request payload for `canvas.plan.set`.\",\n expectedContents: [\"request ids\", \"Canvas session ids\", \"mutation-safe generationPlan\"],\n howToUse: [\"Fill canvasSessionId, leaseId, and documentId\", \"submit with the provided canvas.plan.set command\"],\n mustNot: [\"Do not add handoff-only fields or reference-only analysis to generationPlan\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.designAgentHandoff]: {\n purpose: \"Downstream index for artifact usage, skills, commands, and omitted implementation context.\",\n expectedContents: [\"skills\", \"commands\", \"contract scope\", \"implementation context\", \"artifact and section guides\"],\n howToUse: [\"Use as the navigation map for the bundle\", \"load recommended skills before implementation\"],\n mustNot: [\"Do not treat handoff context as runtime Canvas schema\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.generationPlan]: {\n purpose: \"Full generated plan for reasoning about design intent.\",\n expectedContents: [\"Canvas plan fields\", \"design vectors\", \"reference analysis when available\"],\n howToUse: [\"Use for agent reasoning and audit traceability\", \"compare with canvas-plan.request.json for runtime subset\"],\n mustNot: [\"Do not submit this file directly to Canvas when it contains non-request context\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.implementationPlanMarkdown]: {\n purpose: \"Human-readable engineering sequence for the first implementation pass.\",\n expectedContents: [\"build sequence\", \"component plan\", \"token strategy\", \"QA and risk checks\"],\n howToUse: [\"Convert sections into implementation tasks\", \"keep tests and browser validation aligned to the plan\"],\n mustNot: [\"Do not implement sections unsupported by brief or reference evidence\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.implementationPlan]: {\n purpose: \"Machine-readable implementation plan matching the Markdown plan.\",\n expectedContents: [\"architecture steps\", \"component inventory\", \"state and validation tasks\"],\n howToUse: [\"Use for structured task extraction\", \"keep it synchronized with implementation-plan.md\"],\n mustNot: [\"Do not treat it as a Canvas document patch payload\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.evidence]: {\n purpose: \"Evidence digest for brief, reference, capture, and design-vector provenance.\",\n expectedContents: [\"brief expansion\", \"reference outcomes\", \"capture attempts\", \"design vectors\"],\n howToUse: [\"Audit why choices were made\", \"prefer evidence over generic template defaults\"],\n mustNot: [\"Do not ignore failed or skipped capture statuses when judging confidence\"]\n },\n [INSPIREDESIGN_HANDOFF_FILES.prototypeGuidance]: {\n purpose: \"Optional first prototype guidance when the workflow requests prototype output.\",\n expectedContents: [\"prototype structure\", \"design-vector guidance\", \"browser proof checklist\"],\n howToUse: [\"Use only for the first prototype pass\", \"promote proven ideas back into contract-aligned work\"],\n mustNot: [\"Do not treat prototype guidance as final implementation authority\"]\n }\n};\n\nexport const INSPIREDESIGN_CONTRACT_SECTION_GUIDE: InspiredesignContractSectionGuide = {\n intent: {\n purpose: \"Define why the design exists and what success means.\",\n expectedContents: [\"audience\", \"task\", \"success criteria\", \"trust posture\"],\n howToUse: [\"Validate the primary user job before styling\", \"reject sections that do not serve the task\"],\n mustNot: [\"Do not start visual polish before the audience and task are clear\"]\n },\n generationPlan: {\n purpose: \"Mutation-safe subset accepted by Canvas planning.\",\n expectedContents: [\"target outcome\", \"visual, layout, content, component, motion, responsive, accessibility posture\"],\n howToUse: [\"Submit only through canvas-plan.request.json\", \"repair generationPlanIssues before mutation\"],\n mustNot: [\"Do not add handoff-only guide fields to the Canvas generation plan\"]\n },\n designLanguage: {\n purpose: \"Name the coherent visual direction and token ownership.\",\n expectedContents: [\"direction\", \"style axes\", \"semantic token source\", \"approved libraries\"],\n howToUse: [\"Keep one design language per task\", \"align repeated components to semantic tokens\"],\n mustNot: [\"Do not mix unrelated visual families inside one surface\"]\n },\n contentModel: {\n purpose: \"Define real content, message hierarchy, and UI states.\",\n expectedContents: [\"primary message\", \"supporting messages\", \"states\", \"loading, empty, and error behavior\"],\n howToUse: [\"Use real content first\", \"plan non-happy-path states before polish\"],\n mustNot: [\"Do not ship placeholder copy as product content\"]\n },\n layoutSystem: {\n purpose: \"Describe page architecture and section rhythm.\",\n expectedContents: [\"grid\", \"containers\", \"spacing rhythm\", \"alignment rules\"],\n howToUse: [\"Use to place sections and scan units consistently\", \"verify desktop and mobile structure\"],\n mustNot: [\"Do not invent one-off layout rules for repeated sections\"]\n },\n typographySystem: {\n purpose: \"Define type families, scale, measure, and loading behavior.\",\n expectedContents: [\"families\", \"scale\", \"measure\", \"fallback policy\", \"loading strategy\"],\n howToUse: [\"Apply type hierarchy consistently\", \"avoid layout shift from font loading\"],\n mustNot: [\"Do not default to unapproved system stacks for a distinctive design\"]\n },\n colorSystem: {\n purpose: \"Define semantic color roles and theme behavior.\",\n expectedContents: [\"primary roles\", \"surface roles\", \"text roles\", \"state colors\"],\n howToUse: [\"Map repeated UI to semantic tokens\", \"validate contrast in every required theme\"],\n mustNot: [\"Do not scatter raw color values across leaf components\"]\n },\n surfaceSystem: {\n purpose: \"Define material, depth, borders, and background behavior.\",\n expectedContents: [\"surface hierarchy\", \"border rules\", \"shadow rules\", \"material effects\"],\n howToUse: [\"Use depth only to clarify hierarchy\", \"align material effects with design vectors\"],\n mustNot: [\"Do not turn every content group into a card by default\"]\n },\n iconSystem: {\n purpose: \"Define icon usage and decorative asset boundaries.\",\n expectedContents: [\"icon family\", \"stroke policy\", \"labeling rules\", \"decorative rules\"],\n howToUse: [\"Use icons to clarify actions\", \"keep accessible names on icon-only controls\"],\n mustNot: [\"Do not rely on icons as the only explanation for critical actions\"]\n },\n motionSystem: {\n purpose: \"Define motion that supports comprehension.\",\n expectedContents: [\"timing\", \"interaction moments\", \"reduced-motion posture\", \"advanced motion advisory\"],\n howToUse: [\"Keep shader, WebGL, and Spline cues advisory\", \"provide reduced-motion replacements\"],\n mustNot: [\"Do not use motion cues to authorize new runtime libraries\"]\n },\n responsiveSystem: {\n purpose: \"Define authored behavior across desktop, tablet, and mobile.\",\n expectedContents: [\"breakpoints\", \"adaptation rules\", \"touch policy\", \"overflow policy\"],\n howToUse: [\"Validate the primary action at every viewport\", \"collapse structure before copy becomes cramped\"],\n mustNot: [\"Do not assume desktop layouts naturally scale down\"]\n },\n accessibilityPolicy: {\n purpose: \"Set accessibility requirements before implementation.\",\n expectedContents: [\"WCAG target\", \"keyboard requirements\", \"focus policy\", \"semantic requirements\"],\n howToUse: [\"Block release on contrast or keyboard regressions\", \"validate focus on every interactive state\"],\n mustNot: [\"Do not defer accessibility until after visual implementation\"]\n },\n libraryPolicy: {\n purpose: \"Declare approved implementation libraries and runtime boundaries.\",\n expectedContents: [\"components\", \"icons\", \"styling\", \"motion\", \"threeD\"],\n howToUse: [\"Use as the dependency authorization boundary\", \"keep motion and threeD empty unless separately approved\"],\n mustNot: [\"Do not infer WebGL, shader, Spline, or 3D runtime support from advisory motion\"]\n },\n runtimeBudgets: {\n purpose: \"Set practical limits for sections, actions, interaction latency, and preview cost.\",\n expectedContents: [\"section budgets\", \"action budgets\", \"latency budgets\", \"preview notes\"],\n howToUse: [\"Use as a constraint during implementation\", \"validate slow or animation-heavy surfaces against it\"],\n mustNot: [\"Do not add decorative weight that violates the budget\"]\n },\n navigationModel: {\n purpose: \"Implementation-only context for route, tab, overlay, and deep-link ownership.\",\n expectedContents: [\"route owner\", \"deep-link policy\", \"invalid route fallback\", \"overlay entry points\"],\n howToUse: [\"Use from design-agent-handoff.json when wiring implementation state\"],\n mustNot: [\"Do not patch this omitted block into Canvas governance\"]\n },\n asyncModel: {\n purpose: \"Implementation-only context for loading, restart, cancellation, and URL-owned query state.\",\n expectedContents: [\"owner\", \"load trigger\", \"restart triggers\", \"cancellation policy\"],\n howToUse: [\"Use when wiring fetch/search state and stale-request handling\"],\n mustNot: [\"Do not let components invent independent async ownership\"]\n },\n performanceModel: {\n purpose: \"Implementation-only context for render hotspots and measurement posture.\",\n expectedContents: [\"render hotspots\", \"stable identity policy\", \"list strategy\", \"measurement plan\"],\n howToUse: [\"Use before building scan-heavy or motion-heavy surfaces\"],\n mustNot: [\"Do not ship heavy interaction surfaces without measurement evidence\"]\n }\n};\n\nexport const buildInspiredesignFollowthroughSummary = (): string => (\n `Read ${INSPIREDESIGN_HANDOFF_FILES.advancedBrief} first, then continue in OpenDevBrowser Canvas with ${INSPIREDESIGN_HANDOFF_FILES.canvasPlanRequest} and ${INSPIREDESIGN_HANDOFF_FILES.designAgentHandoff}, load ${INSPIREDESIGN_HANDOFF_RECOMMENDED_SKILLS[0]} plus ${INSPIREDESIGN_HANDOFF_RECOMMENDED_SKILLS[1]} before implementation, and note that any supplied reference URL already uses captureMode=deep.`\n);\n\nexport const buildInspiredesignNextStep = (): string => (\n `Read ${INSPIREDESIGN_HANDOFF_FILES.advancedBrief} first. ${INSPIREDESIGN_HANDOFF_GUIDANCE.prepareCanvasPlanRequest} Then run ${INSPIREDESIGN_HANDOFF_COMMANDS.continueInCanvas}, confirm planStatus=accepted, then patch only the governance blocks listed in ${INSPIREDESIGN_HANDOFF_FILES.designAgentHandoff}.`\n);\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/daemon-client.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { fileURLToPath } from \"url\";\nimport {\n DAEMON_STOP_DEBUG_ENV,\n createDaemonStopHeaders,\n getCacheRoot,\n isCurrentDaemonFingerprint,\n readDaemonMetadata,\n resolveCurrentDaemonEntrypointPath\n} from \"./daemon\";\nimport { CliError, createDisconnectedError, EXIT_EXECUTION } from \"./errors\";\nimport { writeFileAtomic } from \"../utils/fs\";\nimport { loadGlobalConfig } from \"../config\";\nimport {\n fetchDaemonStatus,\n persistDaemonStatusMetadata,\n type DaemonStatusFetchOptions,\n type DaemonStatusPayload\n} from \"./daemon-status\";\nimport {\n fetchWithTimeout,\n fetchWithTimeoutContext,\n readResponseJsonWithTimeout,\n readResponseTextWithTimeout,\n type TimedFetchResponse\n} from \"./utils/http\";\n\nconst CLIENT_ID_FILE = \"client.json\";\nconst DEFAULT_RENEW_AFTER_MS = 20_000;\nconst MIN_RENEW_AFTER_MS = 5_000;\nconst TRANSPORT_TIMEOUT_BUFFER_MS = 5_000;\nconst MAX_DERIVED_TRANSPORT_TIMEOUT_MS = 300_000;\nconst TRANSPORT_TIMEOUT_HINT_KEYS = [\"timeoutMs\", \"waitTimeoutMs\"] as const;\nconst DAEMON_STATUS_RETRY_OPTIONS: DaemonStatusFetchOptions = {\n retryAttempts: 5,\n retryDelayMs: 250\n};\nconst DAEMON_CONFIG_PREFER_OPTIONS: DaemonStatusFetchOptions = {\n timeoutMs: 500,\n retryAttempts: 3,\n retryDelayMs: 250\n};\nconst DAEMON_RESTART_STATUS_TIMEOUT_MS = 5_000;\nconst DAEMON_RECOVERY_READY_TIMEOUT_MS = 5_000;\nconst DAEMON_RESTART_READY_TIMEOUT_MS = 15_000;\nconst DAEMON_RESTART_POLL_DELAY_MS = 250;\n\ntype DaemonResponse<T> = { ok?: boolean; data?: T; error?: string };\n\ntype BindingConfig = {\n ttlMs: number;\n renewIntervalMs: number;\n graceMs: number;\n waitMaxMs: number;\n};\n\ntype BindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs?: number;\n renewAfterMs?: number;\n};\n\ntype QueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs?: number;\n};\n\ntype RelayBindResponse = (BindingResponse | QueueResponse) & {\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayPort?: number | null;\n bindingConfig?: BindingConfig;\n};\n\ntype BindingState = {\n bindingId: string;\n expiresAtMs: number;\n renewAfterMs: number;\n};\n\ntype CachedBindingState = {\n bindingId: string;\n expiresAt: string;\n renewAfterMs?: number;\n};\n\ntype CachedClientState = {\n clientId: string;\n createdAt: string;\n binding?: CachedBindingState;\n};\n\ntype CallOptions = {\n requireBinding?: boolean;\n timeoutMs?: number;\n};\n\nlet cachedClientState: CachedClientState | null | undefined;\n\nconst logDaemonStopDebug = (message: string, details?: Record<string, unknown>): void => {\n if (process.env[DAEMON_STOP_DEBUG_ENV] !== \"1\") {\n return;\n }\n const suffix = details ? ` ${JSON.stringify(details)}` : \"\";\n console.error(`[daemon-stop-debug] ${message}${suffix}`);\n};\n\nconst getClientStateFilePath = (): string => {\n const cacheRoot = getCacheRoot();\n return join(cacheRoot, CLIENT_ID_FILE);\n};\n\nconst readCachedClientState = (): CachedClientState | null => {\n if (cachedClientState !== undefined) {\n return cachedClientState;\n }\n\n const filePath = getClientStateFilePath();\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content) as {\n clientId?: unknown;\n createdAt?: unknown;\n binding?: unknown;\n };\n if (typeof parsed.clientId === \"string\" && parsed.clientId.trim()) {\n cachedClientState = {\n clientId: parsed.clientId.trim(),\n createdAt: typeof parsed.createdAt === \"string\" && parsed.createdAt.trim()\n ? parsed.createdAt\n : new Date().toISOString(),\n ...(parsed.binding && typeof parsed.binding === \"object\"\n ? { binding: parsed.binding as CachedBindingState }\n : {})\n };\n return cachedClientState;\n }\n } catch {\n // fallthrough to regenerate\n }\n }\n\n cachedClientState = null;\n return cachedClientState;\n};\n\nconst writeCachedClientState = (state: CachedClientState): void => {\n const filePath = getClientStateFilePath();\n writeFileAtomic(filePath, JSON.stringify(state, null, 2), { mode: 0o600 });\n cachedClientState = state;\n};\n\nconst loadClientState = (): CachedClientState => {\n const existing = readCachedClientState();\n if (existing) {\n return existing;\n }\n\n const state = {\n clientId: randomUUID(),\n createdAt: new Date().toISOString()\n };\n writeCachedClientState(state);\n return state;\n};\n\nconst parseBindingResponse = (data: BindingResponse): BindingState => {\n const expiresAtMs = Date.parse(data.expiresAt);\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"Invalid binding expiry timestamp\");\n }\n const renewAfterMs = Math.max(\n MIN_RENEW_AFTER_MS,\n typeof data.renewAfterMs === \"number\" && Number.isFinite(data.renewAfterMs)\n ? data.renewAfterMs\n : DEFAULT_RENEW_AFTER_MS\n );\n return {\n bindingId: data.bindingId,\n expiresAtMs,\n renewAfterMs\n };\n};\n\nconst serializeBindingState = (binding: BindingState): CachedBindingState => ({\n bindingId: binding.bindingId,\n expiresAt: new Date(binding.expiresAtMs).toISOString(),\n renewAfterMs: binding.renewAfterMs\n});\n\nconst updateCachedBindingState = (clientId: string, binding: BindingState | null): void => {\n const current = loadClientState();\n const base: CachedClientState = current.clientId === clientId\n ? current\n : { clientId, createdAt: new Date().toISOString() };\n if (binding) {\n writeCachedClientState({\n ...base,\n binding: serializeBindingState(binding)\n });\n return;\n }\n writeCachedClientState({\n clientId: base.clientId,\n createdAt: base.createdAt\n });\n};\n\nconst isBindingRequiredError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_BINDING_REQUIRED\") || message.startsWith(\"RELAY_BINDING_INVALID\");\n};\n\nconst isLeaseInvalidError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_LEASE_INVALID\");\n};\n\nconst isTransportTimeoutError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"Request timed out after \");\n};\n\nexport class DaemonClient {\n private binding: BindingState | null = null;\n private renewTimer: NodeJS.Timeout | null = null;\n private readonly clientId: string;\n private readonly autoRenew: boolean;\n private bindingAcquiredInProcess = false;\n private sessionLeases = new Map<string, string>();\n\n constructor(options: { clientId?: string; autoRenew?: boolean } = {}) {\n const cachedState = loadClientState();\n this.clientId = options.clientId ?? cachedState.clientId;\n this.autoRenew = options.autoRenew ?? false;\n if (cachedState.clientId === this.clientId && cachedState.binding) {\n try {\n this.setBinding(parseBindingResponse(cachedState.binding), { acquiredInProcess: false });\n } catch {\n updateCachedBindingState(this.clientId, null);\n }\n }\n }\n\n async call<T>(name: string, params: Record<string, unknown> = {}, options: CallOptions = {}): Promise<T> {\n try {\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n } catch (error) {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId && !(\"leaseId\" in params) && isLeaseInvalidError(error) && this.sessionLeases.has(sessionId)) {\n this.sessionLeases.delete(sessionId);\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n }\n if (isBindingRequiredError(error)) {\n if (this.binding) {\n this.clearBinding();\n }\n await this.ensureBinding();\n const result = await this.callWithBinding<T>(name, params, { ...options, requireBinding: true });\n this.maybeTrackLease(name, params, result);\n return result;\n }\n throw error;\n }\n }\n\n async releaseBinding(): Promise<void> {\n if (!this.binding) return;\n if (!this.bindingAcquiredInProcess) {\n this.clearBinding({ persist: false });\n return;\n }\n const bindingId = this.binding.bindingId;\n try {\n await this.callRaw(\"relay.release\", { clientId: this.clientId, bindingId });\n } finally {\n this.clearBinding();\n }\n }\n\n private async callWithBinding<T>(name: string, params: Record<string, unknown>, options: CallOptions): Promise<T> {\n const requireBinding = options.requireBinding ?? false;\n const bindingId = requireBinding ? await this.ensureBinding() : this.binding?.bindingId;\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n const leaseId = sessionId ? this.sessionLeases.get(sessionId) : undefined;\n const payload = {\n ...params,\n clientId: this.clientId,\n ...(bindingId ? { bindingId } : {}),\n ...(leaseId ? { leaseId } : {})\n };\n return await this.callRaw<T>(name, payload, deriveTransportTimeoutMs(params, options.timeoutMs));\n }\n\n private maybeTrackLease<T>(name: string, params: Record<string, unknown>, result: T): void {\n if (name === \"session.disconnect\") {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId) {\n this.sessionLeases.delete(sessionId);\n }\n if (result && typeof result === \"object\" && (result as Record<string, unknown>).bindingReleased === true) {\n this.clearBinding();\n }\n return;\n }\n if (name !== \"session.launch\" && name !== \"session.connect\") return;\n if (!result || typeof result !== \"object\") return;\n const record = result as Record<string, unknown>;\n const sessionId = record.sessionId;\n const leaseId = record.leaseId;\n if (typeof sessionId === \"string\" && typeof leaseId === \"string\") {\n this.sessionLeases.set(sessionId, leaseId);\n }\n }\n\n private async ensureBinding(): Promise<string> {\n if (this.binding && Date.now() < this.binding.expiresAtMs - MIN_RENEW_AFTER_MS) {\n return this.binding.bindingId;\n }\n const data = await this.callRaw<RelayBindResponse>(\"relay.bind\", { clientId: this.clientId });\n const state = await this.resolveBindingState(data);\n this.setBinding(state, { acquiredInProcess: true });\n return state.bindingId;\n }\n\n private async resolveBindingState(data: RelayBindResponse): Promise<BindingState> {\n if (\"queued\" in data && data.queued) {\n const waitMs = typeof data.waitMs === \"number\" && Number.isFinite(data.waitMs) ? data.waitMs : null;\n const timeoutMs = waitMs ? Math.max(1000, waitMs) : data.bindingConfig?.waitMaxMs;\n const waitResponse = await this.callRaw<RelayBindResponse>(\"relay.wait\", {\n clientId: this.clientId,\n ...(timeoutMs ? { timeoutMs } : {})\n });\n if (\"queued\" in waitResponse && waitResponse.queued) {\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n }\n return parseBindingResponse(waitResponse as BindingResponse);\n }\n return parseBindingResponse(data as BindingResponse);\n }\n\n private async renewBinding(): Promise<void> {\n if (!this.binding) return;\n const data = await this.callRaw<BindingResponse>(\"relay.renew\", {\n clientId: this.clientId,\n bindingId: this.binding.bindingId\n });\n this.setBinding(parseBindingResponse(data), { acquiredInProcess: this.bindingAcquiredInProcess });\n }\n\n private setBinding(state: BindingState, options: { acquiredInProcess?: boolean } = {}): void {\n this.binding = state;\n if (options.acquiredInProcess !== undefined) {\n this.bindingAcquiredInProcess = options.acquiredInProcess;\n }\n updateCachedBindingState(this.clientId, state);\n if (this.autoRenew) {\n this.scheduleRenew(resolveRenewDelayMs(state));\n }\n }\n\n private scheduleRenew(delayMs: number): void {\n if (!this.autoRenew) return;\n this.clearRenewTimer();\n this.renewTimer = setTimeout(() => {\n this.renewTimer = null;\n this.renewBinding().catch(() => this.clearBinding());\n }, delayMs);\n }\n\n private clearBinding(options: { persist?: boolean } = {}): void {\n this.binding = null;\n this.bindingAcquiredInProcess = false;\n if (options.persist !== false) {\n updateCachedBindingState(this.clientId, null);\n }\n this.clearRenewTimer();\n }\n\n private clearRenewTimer(): void {\n if (this.renewTimer) {\n clearTimeout(this.renewTimer);\n this.renewTimer = null;\n }\n }\n\n private async callRaw<T>(name: string, params: Record<string, unknown>, timeoutMs?: number): Promise<T> {\n const budget = createTimeoutBudget(timeoutMs);\n const connection = await resolveDaemonConnection(budget, {\n preferConfiguredRecovery: requiresConfiguredRecovery(name)\n });\n\n let timedResponse: TimedFetchResponse;\n try {\n timedResponse = await openDaemonCommand(\n connection.port,\n connection.token,\n name,\n params,\n readRemainingBudgetMs(budget)\n );\n } catch (error) {\n if (isTransportTimeoutError(error)) {\n throw error;\n }\n timedResponse = await retryWithRefreshedConnection(name, params, budget);\n }\n\n try {\n if (!timedResponse.response.ok) {\n const message = await readDaemonErrorMessage(timedResponse);\n if (message.includes(\"Unauthorized\") || timedResponse.response.status === 401) {\n timedResponse.dispose();\n timedResponse = await retryWithRefreshedConnection(name, params, budget);\n if (!timedResponse.response.ok) {\n throw new CliError(await readDaemonErrorMessage(timedResponse), EXIT_EXECUTION);\n }\n } else {\n throw new CliError(message, EXIT_EXECUTION);\n }\n }\n\n const payload = await readResponseJsonWithTimeout<DaemonResponse<T>>(\n timedResponse.response,\n timedResponse.signal,\n timedResponse.timeoutMs\n );\n if (!payload.ok) {\n throw new CliError(payload.error || \"Daemon command failed.\", EXIT_EXECUTION);\n }\n\n return payload.data as T;\n } finally {\n timedResponse.dispose();\n }\n }\n}\n\nconst asPositiveNumber = (value: unknown): number | undefined => {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : undefined;\n};\n\nconst createTransportTimeoutError = (timeoutMs: number): Error => {\n return new Error(`Request timed out after ${timeoutMs}ms`);\n};\n\nconst createTimeoutBudget = (timeoutMs?: number): TimeoutBudget | null => {\n const resolved = asPositiveNumber(timeoutMs);\n return resolved === undefined\n ? null\n : { timeoutMs: resolved, deadlineMs: Date.now() + resolved };\n};\n\nconst readRemainingBudgetMs = (budget: TimeoutBudget | null): number | undefined => {\n if (!budget) {\n return undefined;\n }\n const remainingMs = budget.deadlineMs - Date.now();\n if (remainingMs <= 0) {\n throw createTransportTimeoutError(budget.timeoutMs);\n }\n return remainingMs;\n};\n\nconst capTimeoutToBudget = (\n timeoutMs: number,\n budget: TimeoutBudget | null\n): number => {\n const remainingMs = readRemainingBudgetMs(budget);\n return remainingMs === undefined\n ? timeoutMs\n : Math.max(1, Math.min(timeoutMs, remainingMs));\n};\n\nconst resolveReadyDeadlineMs = (\n readyTimeoutMs: number,\n budget: TimeoutBudget | null\n): number => {\n const localDeadlineMs = Date.now() + readyTimeoutMs;\n return budget ? Math.min(localDeadlineMs, budget.deadlineMs) : localDeadlineMs;\n};\n\nconst hasBudgetTimedOut = (\n budget: TimeoutBudget | null,\n deadlineMs: number\n): boolean => {\n if (!budget) {\n return false;\n }\n return deadlineMs >= budget.deadlineMs && Date.now() >= budget.deadlineMs;\n};\n\nconst deriveTransportTimeoutMs = (\n params: Record<string, unknown>,\n explicitTimeoutMs?: number\n): number | undefined => {\n const explicit = asPositiveNumber(explicitTimeoutMs);\n if (explicit !== undefined) {\n return explicit;\n }\n for (const key of TRANSPORT_TIMEOUT_HINT_KEYS) {\n const value = asPositiveNumber(params[key]);\n if (value !== undefined) {\n return Math.min(value + TRANSPORT_TIMEOUT_BUFFER_MS, MAX_DERIVED_TRANSPORT_TIMEOUT_MS);\n }\n }\n return undefined;\n};\n\nconst resolveRenewDelayMs = (binding: BindingState): number => {\n const remainingMs = Math.max(0, binding.expiresAtMs - Date.now() - MIN_RENEW_AFTER_MS);\n return Math.max(0, Math.min(binding.renewAfterMs, remainingMs));\n};\n\nconst cliClient = new DaemonClient({ autoRenew: false });\n\nexport async function callDaemon(command: string, params?: Record<string, unknown>, options?: CallOptions): Promise<unknown> {\n return cliClient.call(command, params ?? {}, options);\n}\n\nexport const __test__ = {\n deriveTransportTimeoutMs,\n isTransportTimeoutError,\n resolveDaemonRestartCommand,\n resetCachedClientState: (): void => {\n cachedClientState = undefined;\n }\n};\n\ntype DaemonConnection = {\n port: number;\n token: string;\n};\n\ntype DaemonRestartCommand = {\n command: string;\n args: string[];\n};\n\ntype TimeoutBudget = {\n timeoutMs: number;\n deadlineMs: number;\n};\n\ntype ResolveDaemonConnectionOptions = {\n preferConfiguredRecovery?: boolean;\n};\n\ntype ResolveDaemonRestartCommandOptions = {\n argv1?: string;\n execPath?: string;\n execArgv?: string[];\n moduleUrl?: string;\n entryExists?: (path: string) => boolean;\n};\n\nconst TYPESCRIPT_ENTRY_RE = /\\.[cm]?ts$/i;\nconst RESTART_LOADER_ARG_FLAGS = new Set([\"--experimental-loader\", \"--import\", \"--loader\", \"--require\", \"-r\"]);\nconst RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS = new Set([\"--experimental-strip-types\", \"--experimental-transform-types\"]);\nconst RESTART_DEBUG_ARG_FLAGS = new Set([\"--inspect\", \"--inspect-brk\", \"--inspect-port\", \"--debug\", \"--debug-brk\"]);\n\nconst isInlineRestartArg = (arg: string, flags: Set<string>): boolean => {\n for (const flag of flags) {\n if (arg.startsWith(`${flag}=`)) {\n return true;\n }\n }\n return false;\n};\n\nconst isRestartLoaderArg = (arg: string): boolean => {\n return RESTART_LOADER_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_LOADER_ARG_FLAGS);\n};\n\nconst isRestartTypeScriptContextArg = (arg: string): boolean => {\n return RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS.has(arg)\n || isInlineRestartArg(arg, RESTART_TYPESCRIPT_CONTEXT_ARG_FLAGS);\n};\n\nconst isRestartDebugArg = (arg: string): boolean => {\n return RESTART_DEBUG_ARG_FLAGS.has(arg) || isInlineRestartArg(arg, RESTART_DEBUG_ARG_FLAGS);\n};\n\nconst resolveRestartSplitArgValue = (\n arg: string,\n value: string | undefined\n): string | null => {\n if (arg.includes(\"=\")) return null;\n if (typeof value !== \"string\") return null;\n return value.startsWith(\"-\") ? null : value;\n};\n\nconst resolveRestartExecArgv = (entryPath: string, execArgv: string[]): string[] => {\n const preserved: string[] = [];\n let hasLoaderContext = false;\n for (let index = 0; index < execArgv.length; index += 1) {\n const arg = execArgv[index];\n if (!arg) {\n continue;\n }\n if (isRestartDebugArg(arg)) {\n const next = resolveRestartSplitArgValue(arg, execArgv[index + 1]);\n if (RESTART_DEBUG_ARG_FLAGS.has(arg) && next) {\n index += 1;\n }\n continue;\n }\n preserved.push(arg);\n if (isRestartLoaderArg(arg) || isRestartTypeScriptContextArg(arg)) {\n hasLoaderContext = true;\n }\n const value = resolveRestartSplitArgValue(arg, execArgv[index + 1]);\n if (!value) continue;\n preserved.push(value);\n index += 1;\n }\n return TYPESCRIPT_ENTRY_RE.test(entryPath) && !hasLoaderContext ? [] : preserved;\n};\n\nconst fetchCurrentDaemonStatus = async (\n connection: DaemonConnection,\n options: DaemonStatusFetchOptions,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const attempts = typeof options.retryAttempts === \"number\" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1\n ? Math.floor(options.retryAttempts)\n : 1;\n const retryDelayMs = typeof options.retryDelayMs === \"number\" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0\n ? options.retryDelayMs\n : 0;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)\n });\n if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (attempt < attempts) {\n await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));\n }\n }\n\n return null;\n};\n\nconst fetchAnyDaemonStatus = async (\n connection: DaemonConnection,\n options: DaemonStatusFetchOptions,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const attempts = typeof options.retryAttempts === \"number\" && Number.isFinite(options.retryAttempts) && options.retryAttempts > 1\n ? Math.floor(options.retryAttempts)\n : 1;\n const retryDelayMs = typeof options.retryDelayMs === \"number\" && Number.isFinite(options.retryDelayMs) && options.retryDelayMs > 0\n ? options.retryDelayMs\n : 0;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: capTimeoutToBudget(options.timeoutMs ?? DAEMON_RESTART_STATUS_TIMEOUT_MS, budget)\n });\n if (status?.ok) {\n return status;\n }\n if (attempt < attempts) {\n await sleep(Math.min(retryDelayMs, readRemainingBudgetMs(budget) ?? retryDelayMs));\n }\n }\n\n return null;\n};\n\nconst sleep = async (delayMs: number): Promise<void> => {\n if (!(Number.isFinite(delayMs) && delayMs > 0)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n};\n\nconst requiresConfiguredRecovery = (name: string): boolean => {\n return name === \"canvas.execute\" || name === \"inspiredesign.run\";\n};\n\nconst getConfiguredDaemonConnection = (): DaemonConnection | null => {\n const config = loadGlobalConfig();\n if (!(config.daemonPort > 0 && config.daemonToken)) {\n return null;\n }\n return { port: config.daemonPort, token: config.daemonToken };\n};\n\nconst sameDaemonConnection = (left: DaemonConnection, right: DaemonConnection): boolean => {\n return left.port === right.port && left.token === right.token;\n};\n\nconst persistResolvedDaemonStatus = (\n connection: DaemonConnection,\n status: DaemonStatusPayload\n): void => {\n const config = loadGlobalConfig();\n persistDaemonStatusMetadata({\n port: connection.port,\n token: connection.token,\n startedAt: new Date().toISOString(),\n fingerprint: status.fingerprint\n }, status, config);\n};\n\nconst persistCurrentConfiguredConnection = async (\n configuredConnection: DaemonConnection,\n status: DaemonStatusPayload,\n staleMetadata: { connection: DaemonConnection } | null\n): Promise<DaemonConnection> => {\n if (staleMetadata && !sameDaemonConnection(staleMetadata.connection, configuredConnection)) {\n // Once the configured daemon has proven current, stale metadata cleanup must not block the caller.\n void stopDaemonConnection(staleMetadata.connection, null, \"persistCurrentConfiguredConnection.staleMetadata\").catch(() => undefined);\n }\n persistResolvedDaemonStatus(configuredConnection, status);\n return configuredConnection;\n};\n\ntype DaemonShutdownOutcome = \"stopped\" | DaemonStatusPayload;\ntype DaemonStopOutcome = \"stopped\" | \"fingerprint_rejected\" | \"unreachable\";\n\nconst resolveConfiguredPreferenceOptions = (\n budget: TimeoutBudget | null\n): DaemonStatusFetchOptions | null => {\n if (!budget) {\n return DAEMON_CONFIG_PREFER_OPTIONS;\n }\n const remainingMs = readRemainingBudgetMs(budget);\n if (remainingMs === undefined || remainingMs <= 1) {\n return null;\n }\n const timeoutMs = Math.min(DAEMON_CONFIG_PREFER_OPTIONS.timeoutMs ?? remainingMs, remainingMs);\n const retryDelayMs = Math.max(0, DAEMON_CONFIG_PREFER_OPTIONS.retryDelayMs ?? 0);\n const maxAttempts = Math.max(1, DAEMON_CONFIG_PREFER_OPTIONS.retryAttempts ?? 1);\n let retryAttempts = 1;\n while (retryAttempts < maxAttempts) {\n const nextAttempts = retryAttempts + 1;\n const nextWorstCaseMs = (nextAttempts * timeoutMs) + ((nextAttempts - 1) * retryDelayMs);\n if (nextWorstCaseMs > remainingMs) {\n break;\n }\n retryAttempts = nextAttempts;\n }\n return {\n timeoutMs,\n retryAttempts,\n retryDelayMs: retryAttempts > 1 ? retryDelayMs : 0\n };\n};\n\nconst stopDaemonConnection = async (\n connection: DaemonConnection,\n budget: TimeoutBudget | null = null,\n reason = \"unknown\"\n): Promise<DaemonStopOutcome> => {\n const stopTimeoutMs = capTimeoutToBudget(DAEMON_RESTART_STATUS_TIMEOUT_MS, budget);\n logDaemonStopDebug(\"client.stop.request\", { reason, port: connection.port });\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/stop`, {\n method: \"POST\",\n headers: createDaemonStopHeaders(connection.token, reason)\n }, stopTimeoutMs);\n if (response.status === 409) {\n logDaemonStopDebug(\"client.stop.fingerprintRejected\", { reason, port: connection.port });\n return \"fingerprint_rejected\";\n }\n if (!response.ok) {\n logDaemonStopDebug(\"client.stop.rejected\", { reason, port: connection.port, status: response.status });\n return \"unreachable\";\n }\n logDaemonStopDebug(\"client.stop.complete\", { reason, port: connection.port });\n return \"stopped\";\n } catch {\n logDaemonStopDebug(\"client.stop.error\", { reason, port: connection.port });\n return \"unreachable\";\n }\n};\n\nfunction resolveDaemonRestartCommand(\n options: ResolveDaemonRestartCommandOptions = {}\n): DaemonRestartCommand {\n const execPath = options.execPath ?? process.execPath;\n const execArgv = options.execArgv ?? process.execArgv;\n const moduleUrl = options.moduleUrl ?? import.meta.url;\n const argv1 = options.argv1 ?? process.argv[1];\n const entryPath = resolveCurrentDaemonEntrypointPath({\n argv1,\n moduleUrl,\n entryExists: options.entryExists ?? existsSync\n });\n if (!(typeof argv1 === \"string\" && argv1.trim().length > 0)) {\n const modulePath = resolve(fileURLToPath(moduleUrl));\n if (entryPath === modulePath) {\n throw createDisconnectedError(\"Daemon restart requires a stable CLI entrypoint. Start with `opendevbrowser serve`.\");\n }\n }\n const restartExecArgv = resolveRestartExecArgv(entryPath, execArgv);\n if (TYPESCRIPT_ENTRY_RE.test(entryPath) && restartExecArgv.length === 0) {\n throw createDisconnectedError(\"Daemon restart requires the original loader context. Start with `opendevbrowser serve`.\");\n }\n return {\n command: execPath,\n args: [...restartExecArgv, entryPath]\n };\n}\n\nconst restartDaemonConnection = async (connection: DaemonConnection): Promise<void> => {\n const restart = resolveDaemonRestartCommand();\n const child = spawn(restart.command, [\n ...restart.args,\n \"serve\",\n \"--port\",\n String(connection.port),\n \"--token\",\n connection.token,\n \"--output-format\",\n \"json\"\n ], {\n detached: true,\n stdio: \"ignore\"\n });\n child.unref();\n};\n\nconst waitForCurrentDaemonStatus = async (\n connection: DaemonConnection,\n readyTimeoutMs = DAEMON_RESTART_READY_TIMEOUT_MS,\n budget: TimeoutBudget | null = null\n): Promise<DaemonStatusPayload | null> => {\n const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);\n while (true) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n if (hasBudgetTimedOut(budget, deadline)) {\n throw createTransportTimeoutError(budget!.timeoutMs);\n }\n return null;\n }\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)\n });\n if (status?.ok && isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (Date.now() >= deadline) {\n return null;\n }\n await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));\n }\n};\n\nconst waitForDaemonShutdown = async (\n connection: DaemonConnection,\n readyTimeoutMs = DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget: TimeoutBudget | null = null\n): Promise<DaemonShutdownOutcome | null> => {\n const deadline = resolveReadyDeadlineMs(readyTimeoutMs, budget);\n while (true) {\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n if (hasBudgetTimedOut(budget, deadline)) {\n throw createTransportTimeoutError(budget!.timeoutMs);\n }\n return null;\n }\n const status = await fetchDaemonStatus(connection.port, connection.token, {\n timeoutMs: Math.min(DAEMON_RESTART_STATUS_TIMEOUT_MS, remainingMs)\n });\n if (!status?.ok) {\n return \"stopped\";\n }\n if (isCurrentDaemonFingerprint(status.fingerprint)) {\n return status;\n }\n if (Date.now() >= deadline) {\n return null;\n }\n await sleep(Math.min(DAEMON_RESTART_POLL_DELAY_MS, Math.max(0, deadline - Date.now())));\n }\n};\n\nconst resolveMetadataConnection = async (\n metadataConnection: DaemonConnection,\n configuredConnection: DaemonConnection,\n budget: TimeoutBudget | null = null\n): Promise<{ connection: DaemonConnection; status: DaemonStatusPayload } | null> => {\n const status = await fetchAnyDaemonStatus(metadataConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);\n if (!status?.ok) {\n return null;\n }\n if (isCurrentDaemonFingerprint(status.fingerprint)) {\n persistResolvedDaemonStatus(metadataConnection, status);\n return { connection: metadataConnection, status };\n }\n if (sameDaemonConnection(metadataConnection, configuredConnection)) {\n return null;\n }\n return { connection: metadataConnection, status };\n};\n\nconst resolveFreshDaemonConnection = async (\n budget: TimeoutBudget | null = null,\n options: ResolveDaemonConnectionOptions = {}\n): Promise<DaemonConnection> => {\n const configuredConnection = getConfiguredDaemonConnection();\n if (!configuredConnection) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n const configuredStatus = await fetchAnyDaemonStatus(configuredConnection, DAEMON_STATUS_RETRY_OPTIONS, budget);\n\n let currentConfiguredStatus =\n configuredStatus?.ok && isCurrentDaemonFingerprint(configuredStatus.fingerprint)\n ? configuredStatus\n : null;\n\n const metadata = readDaemonMetadata();\n const metadataConnection = metadata\n ? { port: metadata.port, token: metadata.token }\n : null;\n const staleMetadata = metadataConnection\n ? await resolveMetadataConnection(metadataConnection, configuredConnection, budget)\n : null;\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n if (options.preferConfiguredRecovery && staleMetadata) {\n currentConfiguredStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n if (!configuredStatus?.ok) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n }\n if (\n !options.preferConfiguredRecovery\n && staleMetadata?.status.ok\n && isCurrentDaemonFingerprint(staleMetadata.status.fingerprint)\n ) {\n if (configuredStatus?.ok) {\n void stopDaemonConnection(configuredConnection, budget, \"resolveFreshDaemonConnection.configuredCurrentMetadataPreferred\").catch(() => undefined);\n }\n return staleMetadata.connection;\n }\n if (!configuredStatus?.ok && staleMetadata) {\n currentConfiguredStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (currentConfiguredStatus?.ok) {\n return await persistCurrentConfiguredConnection(configuredConnection, currentConfiguredStatus, staleMetadata);\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n const staleConnections: Array<{ connection: DaemonConnection; status: DaemonStatusPayload }> = [];\n if (configuredStatus?.ok) {\n staleConnections.push({ connection: configuredConnection, status: configuredStatus });\n }\n if (staleConnections.length === 0) {\n const recoveringStatus = await waitForCurrentDaemonStatus(\n configuredConnection,\n DAEMON_RECOVERY_READY_TIMEOUT_MS,\n budget\n );\n if (recoveringStatus?.ok) {\n persistResolvedDaemonStatus(configuredConnection, recoveringStatus);\n return configuredConnection;\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n for (const staleConnection of staleConnections) {\n const stopOutcome = await stopDaemonConnection(\n staleConnection.connection,\n budget,\n \"resolveFreshDaemonConnection.staleConnections\"\n );\n if (stopOutcome === \"fingerprint_rejected\") {\n throw createDisconnectedError(\n `Daemon on 127.0.0.1:${staleConnection.connection.port} pid=${staleConnection.status.pid} is protected by a different opendevbrowser build. Start with \\`opendevbrowser serve\\`.`\n );\n }\n }\n if (configuredStatus?.ok) {\n const shutdownOutcome = await waitForDaemonShutdown(configuredConnection, DAEMON_RECOVERY_READY_TIMEOUT_MS, budget);\n if (!shutdownOutcome) {\n throw createDisconnectedError(\"Daemon restart could not reclaim the configured port after fingerprint mismatch. Start with `opendevbrowser serve`.\");\n }\n if (shutdownOutcome !== \"stopped\") {\n persistResolvedDaemonStatus(configuredConnection, shutdownOutcome);\n return configuredConnection;\n }\n }\n await restartDaemonConnection(configuredConnection);\n const refreshedStatus = await waitForCurrentDaemonStatus(configuredConnection, DAEMON_RESTART_READY_TIMEOUT_MS, budget);\n if (!refreshedStatus?.ok) {\n throw createDisconnectedError(\"Daemon restart failed after fingerprint mismatch. Start with `opendevbrowser serve`.\");\n }\n persistResolvedDaemonStatus(configuredConnection, refreshedStatus);\n return configuredConnection;\n};\n\nconst resolveDaemonConnection = async (\n budget: TimeoutBudget | null = null,\n options: ResolveDaemonConnectionOptions = {}\n): Promise<DaemonConnection> => {\n const metadata = readDaemonMetadata();\n if (metadata && isCurrentDaemonFingerprint(metadata.fingerprint)) {\n const metadataConnection = { port: metadata.port, token: metadata.token };\n const configuredConnection = getConfiguredDaemonConnection();\n if (!configuredConnection || sameDaemonConnection(metadataConnection, configuredConnection)) {\n return metadataConnection;\n }\n const configuredOptions = resolveConfiguredPreferenceOptions(budget);\n if (!configuredOptions) {\n if (options.preferConfiguredRecovery) {\n return await resolveFreshDaemonConnection(budget, options);\n }\n return metadataConnection;\n }\n const configuredStatus = await fetchCurrentDaemonStatus(configuredConnection, configuredOptions, budget);\n if (configuredStatus?.ok) {\n return await persistCurrentConfiguredConnection(\n configuredConnection,\n configuredStatus,\n { connection: metadataConnection }\n );\n }\n if (options.preferConfiguredRecovery) {\n return await resolveFreshDaemonConnection(budget, options);\n }\n return metadataConnection;\n }\n return await resolveFreshDaemonConnection(budget, options);\n};\n\nconst retryWithRefreshedConnection = async (\n name: string,\n params: Record<string, unknown>,\n budget: TimeoutBudget | null\n): Promise<TimedFetchResponse> => {\n const connection = await resolveFreshDaemonConnection(budget, {\n preferConfiguredRecovery: requiresConfiguredRecovery(name)\n });\n return await openDaemonCommand(connection.port, connection.token, name, params, readRemainingBudgetMs(budget));\n};\n\nconst openDaemonCommand = async (\n port: number,\n token: string,\n name: string,\n params: Record<string, unknown>,\n timeoutMs?: number\n): Promise<TimedFetchResponse> => {\n return await fetchWithTimeoutContext(`http://127.0.0.1:${port}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n};\n\nconst readDaemonErrorMessage = async (timedResponse: TimedFetchResponse): Promise<string> => {\n const text = await readResponseTextWithTimeout(\n timedResponse.response,\n timedResponse.signal,\n timedResponse.timeoutMs\n );\n let message = text || String(timedResponse.response.status);\n try {\n const parsed = JSON.parse(text) as Record<string, unknown> | null;\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.error === \"string\" && parsed.error.trim()) {\n message = parsed.error;\n } else if (typeof parsed.message === \"string\" && parsed.message.trim()) {\n message = parsed.message;\n }\n }\n } catch {\n // Ignore JSON parse errors; fall back to raw text/status.\n }\n return message;\n};\n"],"mappings":"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","names":["sessionId","resolve"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/daemon.ts"],"sourcesContent":["import type { ParsedArgs } from \"../args\";\nimport { createUsageError, EXIT_DISCONNECTED, EXIT_EXECUTION } from \"../errors\";\nimport { fetchDaemonStatusFromMetadata } from \"../daemon-status\";\nimport { DEFAULT_DAEMON_STATUS_FETCH_OPTIONS } from \"../daemon-status-policy\";\nimport { createDaemonStopHeaders, readDaemonMetadata } from \"../daemon\";\nimport { fetchWithTimeout } from \"../utils/http\";\nimport {\n getAutostartStatus,\n installAutostart,\n isTransientAutostartInstallError,\n STABLE_DAEMON_INSTALL_GUIDANCE,\n uninstallAutostart\n} from \"../daemon-autostart\";\n\ntype DaemonSubcommand = \"install\" | \"uninstall\" | \"status\";\n\ntype DaemonResult = {\n installed: boolean;\n running: boolean;\n autostart?: ReturnType<typeof getAutostartStatus>;\n status?: Awaited<ReturnType<typeof fetchDaemonStatusFromMetadata>>;\n};\n\ntype StopDaemonResult = {\n outcome: \"stopped\" | \"not_running\" | \"fingerprint_rejected\" | \"failed\";\n pid?: number;\n port?: number;\n status?: number;\n error?: string;\n};\n\nconst parseDaemonArgs = (rawArgs: string[]): { subcommand: DaemonSubcommand } => {\n const subcommand = rawArgs[0];\n if (subcommand === \"install\" || subcommand === \"uninstall\" || subcommand === \"status\") {\n return { subcommand };\n }\n throw createUsageError(\"Usage: opendevbrowser daemon <install|uninstall|status>\");\n};\n\nconst stopDaemonIfRunning = async (): Promise<StopDaemonResult> => {\n const metadata = readDaemonMetadata();\n if (!metadata) {\n return { outcome: \"not_running\" };\n }\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${metadata.port}/stop`, {\n method: \"POST\",\n headers: createDaemonStopHeaders(metadata.token, \"daemon.uninstall\")\n });\n if (response.status === 409) {\n return { outcome: \"fingerprint_rejected\", pid: metadata.pid, port: metadata.port };\n }\n return response.ok\n ? { outcome: \"stopped\", pid: metadata.pid, port: metadata.port }\n : { outcome: \"failed\", pid: metadata.pid, port: metadata.port, status: response.status };\n } catch (error) {\n return {\n outcome: \"failed\",\n pid: metadata.pid,\n port: metadata.port,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n};\n\nconst buildStopFailureMessage = (stop: StopDaemonResult): string => {\n const target = stop.port ? `127.0.0.1:${stop.port}` : \"recorded daemon\";\n const pid = stop.pid ? ` pid=${stop.pid}` : \"\";\n if (stop.outcome === \"fingerprint_rejected\") {\n return `Daemon autostart removed, but the running daemon at ${target}${pid} rejected the stop request as stale. Run \\`opendevbrowser status --daemon\\` to inspect it and restart from the current install if needed.`;\n }\n const reason = stop.error ?? (stop.status ? `HTTP ${stop.status}` : \"unknown error\");\n return `Daemon autostart removed, but stopping ${target}${pid} failed (${reason}).`;\n};\n\nconst shouldFailUninstallStop = (stop: StopDaemonResult): boolean => {\n if (stop.outcome === \"stopped\" || stop.outcome === \"not_running\") {\n return false;\n }\n return true;\n};\n\nconst formatReason = (reason?: ReturnType<typeof getAutostartStatus>[\"reason\"]): string => {\n return reason ? reason.replace(/_/g, \" \") : \"unknown reason\";\n};\n\nconst buildStableAutostartGuidance = (action: \"install\" | \"repair\"): string => {\n return `${STABLE_DAEMON_INSTALL_GUIDANCE.replace(/\\.$/, \"\")} to ${action} it.`;\n};\n\nconst describeAutostartLocation = (autostart: ReturnType<typeof getAutostartStatus>): string => {\n if (autostart.location) {\n return ` at ${autostart.location}`;\n }\n if (autostart.taskName) {\n return ` (${autostart.taskName})`;\n }\n return \"\";\n};\n\nconst buildStatusMessage = (autostart: ReturnType<typeof getAutostartStatus>, running: boolean): string => {\n const runningText = running ? \"running\" : \"not running\";\n\n if (!autostart.supported) {\n return `Daemon autostart is not supported on ${autostart.platform}. Daemon is ${runningText}.`;\n }\n\n const location = describeAutostartLocation(autostart);\n\n if (autostart.health === \"healthy\") {\n return `Autostart is installed and healthy${location}. Daemon is ${runningText}.`;\n }\n\n if (autostart.health === \"missing\") {\n return `Autostart is not installed${location}. ${buildStableAutostartGuidance(\"install\")} Daemon is ${runningText}.`;\n }\n\n if (autostart.health === \"needs_repair\") {\n return `Autostart is installed${location} but needs repair (${formatReason(autostart.reason)}). ${buildStableAutostartGuidance(\"repair\")} Daemon is ${runningText}.`;\n }\n\n if (autostart.health === \"malformed\") {\n return `Autostart exists${location} but is malformed (${formatReason(autostart.reason)}). ${buildStableAutostartGuidance(\"repair\")} Daemon is ${runningText}.`;\n }\n\n return `Daemon autostart is not supported on ${autostart.platform}. Daemon is ${runningText}.`;\n};\n\nexport async function runDaemonCommand(args: ParsedArgs) {\n const { subcommand } = parseDaemonArgs(args.rawArgs);\n\n if (subcommand === \"install\") {\n let result;\n try {\n result = installAutostart();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: isTransientAutostartInstallError(error)\n ? message\n : `Daemon autostart install failed: ${message}`,\n exitCode: EXIT_EXECUTION\n };\n }\n if (!result.supported) {\n return {\n success: false,\n message: `Daemon autostart is not supported on ${result.platform}.`,\n data: result,\n exitCode: EXIT_EXECUTION\n };\n }\n return {\n success: true,\n message: `Daemon autostart installed (${result.platform}).`,\n data: result\n };\n }\n\n if (subcommand === \"uninstall\") {\n const result = uninstallAutostart();\n if (!result.supported) {\n return {\n success: false,\n message: `Daemon autostart is not supported on ${result.platform}.`,\n data: result,\n exitCode: EXIT_EXECUTION\n };\n }\n const stop = await stopDaemonIfRunning();\n if (shouldFailUninstallStop(stop)) {\n return {\n success: false,\n message: buildStopFailureMessage(stop),\n data: { ...result, stop },\n exitCode: EXIT_EXECUTION\n };\n }\n return {\n success: true,\n message: `Daemon autostart removed (${result.platform}).`,\n data: result\n };\n }\n\n const autostart = getAutostartStatus();\n const daemonStatus = await fetchDaemonStatusFromMetadata(undefined, DEFAULT_DAEMON_STATUS_FETCH_OPTIONS);\n const running = Boolean(daemonStatus);\n const message = buildStatusMessage(autostart, running);\n const data: DaemonResult = {\n installed: autostart.installed,\n running,\n autostart: autostart.supported ? autostart : undefined\n };\n\n if (!running) {\n return {\n success: false,\n message,\n data,\n exitCode: EXIT_DISCONNECTED\n };\n }\n\n return {\n success: true,\n message,\n data: { ...data, status: daemonStatus }\n };\n}\n"],"mappings":"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","names":["message"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/help.ts"],"sourcesContent":["import onboardingMetadata from \"./onboarding-metadata.json\";\nimport {\n INSPIREDESIGN_HANDOFF_COMMANDS,\n INSPIREDESIGN_HANDOFF_GUIDANCE\n} from \"../inspiredesign/handoff\";\nimport type { CliCommand } from \"./args\";\nimport { CLI_COMMANDS, VALID_FLAGS } from \"./args\";\nimport {\n CLI_COMMAND_HELP_DETAILS,\n PUBLIC_CLI_COMMAND_GROUPS,\n TOOL_SURFACE_ENTRIES\n} from \"../public-surface/generated-manifest\";\n\ntype HelpFlag = (typeof VALID_FLAGS)[number];\n\ninterface CommandGroup {\n title: string;\n summary: string;\n commands: readonly CliCommand[];\n}\n\nexport type CommandHelpDetail = typeof CLI_COMMAND_HELP_DETAILS[CliCommand];\n\ninterface FlagEntry {\n flag: HelpFlag;\n alias?: string;\n description: string;\n example?: string;\n}\n\ninterface FlagGroup {\n title: string;\n summary: string;\n flags: readonly FlagEntry[];\n}\n\ninterface ReferenceEntry {\n label: string;\n description: string;\n}\n\ninterface DetailRow {\n label: string;\n value: string;\n}\n\ninterface FormattableRow {\n label: string;\n description: string;\n details?: readonly DetailRow[];\n}\n\nconst LABEL_WIDTH = 42;\nconst DETAIL_LABEL_WIDTH = 9;\nconst COMMAND_SET = new Set<string>(CLI_COMMANDS);\nconst FLAG_SET = new Set<string>(VALID_FLAGS);\nconst TOOL_COUNT = TOOL_SURFACE_ENTRIES.length;\nconst CLI_EQUIVALENT_SET = new Set(\n TOOL_SURFACE_ENTRIES.flatMap((entry) => (entry.cliEquivalent ? [entry.cliEquivalent] : []))\n);\n\nconst formatFlags = (flags: readonly HelpFlag[]): string => (flags.length > 0 ? flags.join(\", \") : \"none\");\n\nexport const getCliOnlyCommands = (): CliCommand[] => (\n CLI_COMMANDS.filter((command) => !CLI_EQUIVALENT_SET.has(command))\n);\n\nexport const getToolOnlyHelperNames = (): string[] => (\n TOOL_SURFACE_ENTRIES\n .filter((entry) => !entry.cliEquivalent)\n .map((entry) => entry.name)\n);\n\nexport const HELP_COMMAND_GROUPS: readonly CommandGroup[] = PUBLIC_CLI_COMMAND_GROUPS.map((group) => ({\n title: group.title,\n summary: group.summary,\n commands: group.commands.map((command) => command.name) as CliCommand[]\n}));\n\nexport const COMMAND_HELP_DETAILS: Record<CliCommand, CommandHelpDetail> = CLI_COMMAND_HELP_DETAILS as Record<CliCommand, CommandHelpDetail>;\n\nexport const HELP_FLAG_GROUPS: readonly FlagGroup[] = [\n {\n title: \"Install / Global Flags\",\n summary: \"Control install scope, prompting, and bundled skill setup.\",\n flags: [\n { flag: \"--global\", alias: \"-g\", description: \"Install into ~/.config/opencode/opencode.json.\", example: \"npx opendevbrowser --global --with-config\" },\n { flag: \"--local\", alias: \"-l\", description: \"Install into ./opencode.json for this project.\", example: \"npx opendevbrowser --local --skills-local\" },\n { flag: \"--update\", alias: \"-u\", description: \"Repair OpenCode package caches, plugin pins, and managed skill packs.\" },\n { flag: \"--uninstall\", description: \"Alias for the uninstall command.\" },\n { flag: \"--with-config\", description: \"Also create opendevbrowser.jsonc defaults.\", example: \"npx opendevbrowser --global --with-config\" },\n { flag: \"--full\", alias: \"-f\", description: \"Install config and pre-extract extension assets.\", example: \"npx opendevbrowser --full\" },\n { flag: \"--no-prompt\", description: \"Run non-interactively using defaults.\" },\n { flag: \"--no-interactive\", description: \"Alias of --no-prompt.\" },\n { flag: \"--quiet\", description: \"Suppress non-error text output.\" },\n { flag: \"--skills-global\", description: \"Install bundled skills into global agent directories.\" },\n { flag: \"--skills-local\", description: \"Install bundled skills into local project agent directories.\" },\n { flag: \"--no-skills\", description: \"Skip bundled skill installation.\" }\n ]\n },\n {\n title: \"Help / Output Flags\",\n summary: \"Inspect help or version and control output transport.\",\n flags: [\n { flag: \"--help\", alias: \"-h\", description: \"Show CLI help output.\", example: \"npx opendevbrowser --help\" },\n { flag: \"--version\", alias: \"-v\", description: \"Show CLI version.\", example: \"npx opendevbrowser --version\" },\n { flag: \"--output-format\", description: \"Output mode: text, json, or stream-json.\", example: \"opendevbrowser status --daemon --output-format json\" },\n { flag: \"--transport\", description: \"Transport selector for transport-aware commands. `status` uses relay/native; `annotate` uses auto/direct/relay.\", example: \"opendevbrowser status --session-id s1 --transport native\" }\n ]\n },\n {\n title: \"Daemon / Session / Launch Flags\",\n summary: \"Control daemon binding, browser connect, and launch behavior. If ext=on but handshake=off, reopen the extension popup and click Connect again to re-establish a clean daemon-extension handshake.\",\n flags: [\n { flag: \"--port\", description: \"Daemon or relay port override.\", example: \"opendevbrowser serve --port 8788\" },\n { flag: \"--token\", description: \"Relay or daemon auth token override.\", example: \"opendevbrowser serve --token local-dev-token\" },\n { flag: \"--stop\", description: \"Stop a running daemon.\", example: \"opendevbrowser serve --stop\" },\n { flag: \"--daemon\", description: \"Target daemon status mode where supported.\", example: \"opendevbrowser status --daemon --output-format json\" },\n { flag: \"--script\", description: \"Path to a run-script JSON file.\", example: \"opendevbrowser run --script ./workflow.json\" },\n { flag: \"--session-id\", description: \"Target an existing browser or daemon session.\", example: \"opendevbrowser snapshot --session-id s1\" },\n { flag: \"--close-browser\", description: \"Close the managed browser on disconnect.\" },\n { flag: \"--ws-endpoint\", description: \"Connect using an explicit CDP WebSocket endpoint.\", example: \"opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/...\" },\n { flag: \"--host\", description: \"CDP host for host/port connect mode.\", example: \"opendevbrowser connect --host 127.0.0.1 --cdp-port 9222\" },\n { flag: \"--cdp-port\", description: \"CDP port for host/port connect mode.\" },\n { flag: \"--headless\", description: \"Launch a managed browser in headless mode.\", example: \"opendevbrowser launch --no-extension --headless\" },\n { flag: \"--profile\", description: \"Use a named browser profile directory.\" },\n { flag: \"--persist-profile\", description: \"Keep the generated profile directory after exit. `run` uses a temporary profile by default unless this flag is enabled.\" },\n { flag: \"--chrome-path\", description: \"Use a specific Chrome, Chromium, or CfT binary.\" },\n { flag: \"--start-url\", description: \"Open this URL immediately after launch or connect.\" },\n { flag: \"--flag\", description: \"Pass one or more extra Chrome CLI flags.\" },\n { flag: \"--no-extension\", description: \"Force managed mode without extension relay.\" },\n { flag: \"--extension-only\", description: \"Fail unless the extension relay websocket is connected and the daemon-extension handshake is complete.\" },\n { flag: \"--extension-legacy\", description: \"Use the legacy /cdp relay mode instead of /ops.\" },\n { flag: \"--wait-for-extension\", description: \"Wait for a clean daemon-extension handshake before returning.\" },\n { flag: \"--wait-timeout-ms\", description: \"Handshake wait timeout in milliseconds.\" }\n ]\n },\n {\n title: \"Navigation / Interaction / Diagnostics Flags\",\n summary: \"Command-specific flags for page actions, reads, and diagnostics.\",\n flags: [\n { flag: \"--url\", description: \"Target URL for navigation, connect, or workflow commands; repeat for multi-reference inspiredesign runs.\", example: \"opendevbrowser goto --session-id s1 --url https://example.com\" },\n { flag: \"--wait-until\", description: \"Navigation wait strategy such as load or domcontentloaded.\" },\n { flag: \"--timeout-ms\", description: \"Operation timeout in milliseconds.\", example: \"opendevbrowser canvas --timeout-ms 120000 --command canvas.session.open ...\" },\n { flag: \"--ref\", description: \"Snapshot ref id for element-targeted commands.\", example: \"opendevbrowser click --session-id s1 --ref r12\" },\n { flag: \"--state\", description: \"Wait state selector for wait-style commands.\" },\n { flag: \"--until\", description: \"Wait condition selector for wait-style commands.\" },\n { flag: \"--mode\", description: \"Mode selector for commands that accept variants.\" },\n { flag: \"--max-chars\", description: \"Maximum text characters to return for DOM reads.\" },\n { flag: \"--cursor\", description: \"Cursor token for paginated list commands.\" },\n { flag: \"--text\", description: \"Text payload for type and related commands.\" },\n { flag: \"--clear\", description: \"Clear the existing input value before typing.\" },\n { flag: \"--submit\", description: \"Submit the form or input after typing.\" },\n { flag: \"--values\", description: \"CSV values for select commands.\" },\n { flag: \"--files\", description: \"CSV file paths for upload commands.\" },\n { flag: \"--dy\", description: \"Vertical scroll delta for scroll commands.\" },\n { flag: \"--key\", description: \"Keyboard key for the press command.\" },\n { flag: \"--attr\", description: \"DOM attribute name for dom-attr.\" },\n { flag: \"--x\", description: \"Viewport x coordinate for pointer commands.\" },\n { flag: \"--y\", description: \"Viewport y coordinate for pointer commands.\" },\n { flag: \"--from-x\", description: \"Pointer drag start x coordinate.\" },\n { flag: \"--from-y\", description: \"Pointer drag start y coordinate.\" },\n { flag: \"--to-x\", description: \"Pointer drag end x coordinate.\" },\n { flag: \"--to-y\", description: \"Pointer drag end y coordinate.\" },\n { flag: \"--steps\", description: \"Interpolation step count for pointer move or drag commands.\" },\n { flag: \"--button\", description: \"Pointer button selector for pointer down or up.\" },\n { flag: \"--click-count\", description: \"Associated click count for pointer down or up.\" },\n { flag: \"--name\", description: \"Named page identifier for page commands.\" },\n { flag: \"--target-id\", description: \"Browser target id for target commands.\", example: \"opendevbrowser target-use --session-id s1 --target-id page-2\" },\n { flag: \"--window-id\", description: \"Desktop window id for direct window capture commands.\" },\n { flag: \"--tab-id\", description: \"Browser tab id override for extension and annotation commands.\" },\n { flag: \"--include-urls\", description: \"Include page URLs in list output where supported.\" },\n { flag: \"--path\", description: \"Filesystem path for command output or artifacts.\", example: \"opendevbrowser screenshot --session-id s1 --path ./shot.png\" },\n { flag: \"--screencast-id\", description: \"Recorded screencast id returned by screencast-start for the same session.\" },\n { flag: \"--reason\", description: \"Audit reason for desktop observation commands.\" },\n { flag: \"--full-page\", description: \"Capture the full scrollable page instead of the current viewport.\" },\n { flag: \"--action\", description: \"Dialog action: status, accept, or dismiss.\" },\n { flag: \"--prompt-text\", description: \"Prompt text to submit when accepting a prompt dialog.\" },\n { flag: \"--since-seq\", description: \"Poll from a sequence id across diagnostics streams.\" },\n { flag: \"--max\", description: \"Maximum number of records or items to return.\" },\n { flag: \"--interval-ms\", description: \"Frame capture interval for screencast recording.\" },\n { flag: \"--max-frames\", description: \"Maximum screencast frame count before auto-stop.\" },\n { flag: \"--since-console-seq\", description: \"Console sequence cursor for debug-trace snapshots.\" },\n { flag: \"--since-network-seq\", description: \"Network sequence cursor for debug-trace snapshots.\" },\n { flag: \"--since-exception-seq\", description: \"Exception sequence cursor for debug-trace snapshots.\" },\n { flag: \"--request-id\", description: \"Attach or lookup a request id for correlated output.\" },\n { flag: \"--cookies\", description: \"Inline cookie payload for cookie-import.\" },\n { flag: \"--cookies-file\", description: \"File path containing cookies for cookie-import.\" },\n { flag: \"--strict\", description: \"Fail cookie import on invalid entries.\" },\n { flag: \"--screenshot-mode\", description: \"Annotation screenshot mode: visible, full, or none.\" },\n { flag: \"--debug\", description: \"Enable debug-level annotation capture extras.\" },\n { flag: \"--context\", description: \"Free-form annotation context for reviewers or agents.\" },\n { flag: \"--stored\", description: \"Return the last stored annotation payload instead of starting a new capture.\" }\n ]\n },\n {\n title: \"Macro / Provider / Power Flags\",\n summary: \"Workflow filters, provider selectors, and unsafe RPC or /canvas options.\",\n flags: [\n { flag: \"--expression\", description: \"Macro expression to resolve or execute.\", example: \"opendevbrowser macro-resolve --expression '@web.search(\\\"openai\\\")'\" },\n { flag: \"--default-provider\", description: \"Provider fallback for shorthand macro expressions.\" },\n { flag: \"--include-catalog\", description: \"Include macro catalog metadata in the response.\" },\n { flag: \"--command\", description: \"Canvas command name for the canvas CLI command.\", example: \"opendevbrowser canvas --command canvas.session.open --params '{...}'\" },\n { flag: \"--execute\", description: \"Execute a resolved macro action after planning.\" },\n { flag: \"--params\", description: \"Inline JSON params for canvas or rpc commands.\" },\n { flag: \"--params-file\", description: \"Path to a JSON params file for canvas or rpc commands.\", example: \"opendevbrowser canvas --command canvas.plan.set --params-file ./plan.json\" },\n { flag: \"--unsafe-internal\", description: \"Required safety gate for the rpc command.\" },\n { flag: \"--topic\", description: \"Research topic input.\" },\n { flag: \"--days\", description: \"Lookback window in days for research commands.\" },\n { flag: \"--from\", description: \"Start date boundary for research commands.\" },\n { flag: \"--to\", description: \"End date boundary for research commands.\" },\n { flag: \"--source-selection\", description: \"Research source-family selector: auto, web, community, social, shopping, or all. This selects families only and is not a reliability guarantee.\" },\n { flag: \"--sources\", description: \"Explicit source-family selectors such as web,community. Use shopping only when commercial intent is explicit.\" },\n { flag: \"--include-engagement\", description: \"Include engagement metrics in research output.\" },\n { flag: \"--limit-per-source\", description: \"Per-source result cap for research runs.\" },\n { flag: \"--query\", description: \"Shopping query input.\" },\n { flag: \"--providers\", description: \"Comma-separated provider ids for shopping or artifact commands.\" },\n { flag: \"--budget\", description: \"Budget filter for shopping workflows.\" },\n { flag: \"--region\", description: \"Region or country hint for provider selection. Treat it as advisory unless output metadata reports `region_authoritative=true`.\" },\n { flag: \"--sort\", description: \"Sort mode for shopping results.\" },\n { flag: \"--brief\", description: \"Inspiredesign brief describing the target design direction.\" },\n { flag: \"--capture-mode\", description: \"Inspiredesign capture mode: off or deep. Any --url forces deep.\" },\n { flag: \"--include-prototype-guidance\", description: \"Include inspiredesign prototype guidance in workflow output.\" },\n { flag: \"--product-url\", description: \"Target product URL for product-video workflows.\" },\n { flag: \"--product-name\", description: \"Product name override for product-video workflows.\" },\n { flag: \"--provider-hint\", description: \"Provider hint override for product workflows.\" },\n { flag: \"--include-screenshots\", description: \"Include screenshots in product presentation output, or prefer screenshots when fetching stored annotations.\" },\n { flag: \"--include-all-images\", description: \"Include all discovered product images.\" },\n { flag: \"--include-copy\", description: \"Include product marketing copy metadata.\" },\n { flag: \"--use-cookies\", description: \"Enable or disable provider cookie injection for workflow runs and macro-resolve execute; a bare flag means true.\", example: \"opendevbrowser macro-resolve --expression '@media.search(\\\"browser automation x\\\", \\\"x\\\", 5)' --execute --browser-mode extension --use-cookies\" },\n { flag: \"--browser-mode\", description: \"Provider browser transport mode: auto, extension, or managed. extension reuses relay-backed browser state; managed runs a deterministic managed browser.\", example: \"opendevbrowser research run --topic 'browser automation on X' --source-selection social --browser-mode extension --use-cookies --challenge-automation-mode browser_with_helper\" },\n { flag: \"--challenge-automation-mode\", description: \"Per-run challenge automation mode for workflow runs and macro-resolve execute: off, browser, or browser_with_helper. Precedence is run > session > config, and the helper remains browser-scoped only.\", example: \"opendevbrowser macro-resolve --expression '@community.search(\\\"openai\\\")' --execute --challenge-automation-mode browser_with_helper\" },\n { flag: \"--cookie-policy-override\", description: \"Per-run workflow and macro-resolve execute cookie policy override: off, auto, or required.\", example: \"opendevbrowser macro-resolve --expression '@community.search(\\\"browser automation failures\\\", 4)' --execute --browser-mode extension --use-cookies --cookie-policy required\" },\n { flag: \"--cookie-policy\", description: \"Alias of --cookie-policy-override.\" },\n { flag: \"--output-dir\", description: \"Directory where generated artifacts are written, including screencast replay output.\" },\n { flag: \"--ttl-hours\", description: \"Artifact cache time-to-live in hours.\" },\n { flag: \"--expired-only\", description: \"List only expired artifacts in artifacts commands.\" }\n ]\n }\n];\n\nexport const HELP_TOOL_ENTRIES = TOOL_SURFACE_ENTRIES;\n\nexport const HELP_CAPABILITY_ENTRIES: readonly FormattableRow[] = [\n {\n label: \"screencast / browser replay\",\n description: \"Use the public browser replay lane when you need temporal browser evidence before or after a fragile flow.\",\n details: [\n { label: \"cli:\", value: \"screencast-start, screencast-stop\" },\n { label: \"example:\", value: \"npx opendevbrowser screencast-start --session-id <id> --output-dir ./artifacts/replay\" }\n ]\n },\n {\n label: \"desktop observation\",\n description: \"Use the public read-only desktop observation plane for sibling desktop evidence on macOS; availability, window inventory, and accessibility probes use the local swift command, while screenshots use macOS screencapture outside extension relay.\",\n details: [\n {\n label: \"cli:\",\n value: \"desktop-status, desktop-windows, desktop-active-window, desktop-capture-desktop, desktop-capture-window, desktop-accessibility-snapshot\"\n },\n { label: \"example:\", value: \"npx opendevbrowser desktop-status --output-format json\" }\n ]\n },\n {\n label: \"computer use / browser-scoped computer use\",\n description: \"Control the bounded browser-scoped computer-use challenge lane with --challenge-automation-mode; the optional helper is not a desktop agent.\",\n details: [\n { label: \"flag:\", value: \"--challenge-automation-mode off|browser|browser_with_helper\" },\n { label: \"works:\", value: \"research run, shopping run, product-video run, inspiredesign run, macro-resolve --execute\" },\n { label: \"entry:\", value: onboardingMetadata.quickStartCommands.computerUseEntry },\n { label: \"proof:\", value: \"review, session-inspector, workflow fallback metadata\" }\n ]\n }\n];\n\nexport const HELP_ONBOARDING_ENTRIES: readonly FormattableRow[] = [\n {\n label: \"prompting_guide\",\n description: \"Load local best-practice guidance before low-level browser commands.\",\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.promptingGuide }]\n },\n {\n label: \"skill_load\",\n description: `Load ${onboardingMetadata.skillName} ${onboardingMetadata.skillTopic} directly when you want the canonical quick-start section.`,\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.skillLoad }]\n },\n {\n label: \"validated_lanes\",\n description: `Load ${onboardingMetadata.skillName} ${onboardingMetadata.validatedSkillTopic} when you need the current proven transcript, evidence-gated research, and shopping runbook.`,\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.validatedLanes }]\n },\n {\n label: \"skill_list\",\n description: \"Inspect bundled and discovered skill packs when you need a different local lane.\",\n details: [{ label: \"tool:\", value: onboardingMetadata.quickStartCommands.skillList }]\n },\n {\n label: \"research_evidence_gated\",\n description: \"Load opendevbrowser-research first, run explicit source-family research, and inspect artifacts before final claims.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.validatedResearch }]\n },\n {\n label: \"shopping_reliable\",\n description: \"Start deal hunting with explicit providers in managed mode and only trust regional comparisons when the result reports `region_authoritative=true`.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.validatedShopping }]\n },\n {\n label: \"inspiredesign_followthrough\",\n description: \"After inspiredesign finishes, read advanced-brief.md first, then continue in Canvas with the emitted request template and load the canvas-contract design-agent lane before patching.\",\n details: [\n { label: \"quick:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.loadBestPractices },\n { label: \"design:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.loadDesignAgent },\n { label: \"brief:\", value: INSPIREDESIGN_HANDOFF_GUIDANCE.reviewAdvancedBrief },\n { label: \"prep:\", value: INSPIREDESIGN_HANDOFF_GUIDANCE.prepareCanvasPlanRequest },\n { label: \"run:\", value: INSPIREDESIGN_HANDOFF_COMMANDS.continueInCanvas }\n ]\n },\n {\n label: \"computer_use_entry\",\n description: \"Enter browser-scoped computer use from a workflow run, not from a separate desktop command family.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.computerUseEntry }]\n },\n {\n label: \"happy_path\",\n description: \"After guidance, verify a minimal managed happy path before widening into multi-step automation.\",\n details: [{ label: \"cli:\", value: onboardingMetadata.quickStartCommands.happyPath }]\n },\n {\n label: \"surface_split\",\n description: \"Use the existing public-surface split when a workflow or helper only exists on one side of the CLI or tool surface.\",\n details: [\n { label: \"cli-only:\", value: getCliOnlyCommands().join(\", \") },\n { label: \"tool-only:\", value: getToolOnlyHelperNames().join(\", \") }\n ]\n },\n {\n label: \"docs\",\n description: \"Use the first-run checklist and canonical skill runbook for proof and deeper operating details.\",\n details: [{\n label: \"paths:\",\n value: `${onboardingMetadata.referencePaths.onboardingDoc}, ${onboardingMetadata.referencePaths.skillDoc}`\n }]\n }\n];\n\nexport const HELP_REFERENCE_ENTRIES: readonly ReferenceEntry[] = [\n { label: \"src/cli/onboarding-metadata.json\", description: \"Canonical first-contact onboarding metadata shared by help, nudges, and proof lanes.\" },\n { label: \"src/providers/workflow-handoff.ts\", description: \"Central next-step advisory builders for workflow follow-through.\" },\n { label: \"src/inspiredesign/handoff.ts\", description: \"Shared inspiredesign follow-through commands, artifact names, and Canvas continuation guidance.\" },\n { label: \"src/public-surface/source.ts\", description: \"Authoritative command, usage, flag, and tool surface metadata.\" },\n { label: \"src/public-surface/generated-manifest.ts\", description: \"Checked-in generated public-surface snapshot consumed by help and parity tests.\" },\n { label: \"src/public-surface/generated-manifest.json\", description: \"Checked-in generated public-surface snapshot consumed by inventory scripts.\" },\n { label: \"src/cli/args.ts\", description: \"CLI argument parsing backed by the public-surface source.\" },\n { label: \"src/cli/help.ts\", description: \"Human-facing CLI formatting layered on the public-surface source, including the first-contact Find It Fast lookup block.\" },\n { label: \"src/tools/index.ts\", description: \"Code-level tool registry.\" },\n { label: \"docs/CLI.md\", description: \"Detailed CLI guide and release-gate runbooks.\" },\n { label: onboardingMetadata.referencePaths.onboardingDoc, description: \"First-run checklist for help-led onboarding and happy-path proof.\" },\n { label: onboardingMetadata.referencePaths.skillDoc, description: \"Canonical bundled best-practices runbook and quick-start guidance.\" },\n { label: \"docs/WORKFLOW_SURFACE_MAP.md\", description: \"Code-derived workflow and validation inventory, including CLI-only and tool-only surface splits.\" },\n { label: \"docs/SURFACE_REFERENCE.md\", description: \"Canonical CLI, tool, and relay channel inventory.\" },\n { label: \"opendevbrowser --help\", description: \"Primary full help invocation for quick discovery.\" },\n { label: \"opendevbrowser help\", description: \"Alias that prints the same full help inventory.\" }\n];\n\nfunction formatRows(rows: readonly FormattableRow[]): string {\n return rows\n .map((row) => {\n const lines = [` ${row.label.padEnd(LABEL_WIDTH)} ${row.description}`];\n for (const detail of row.details ?? []) {\n lines.push(` ${detail.label.padEnd(DETAIL_LABEL_WIDTH)} ${detail.value}`);\n }\n return lines.join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nfunction assertCommandCoverage(): void {\n const seen = new Set<string>();\n\n for (const group of HELP_COMMAND_GROUPS) {\n for (const command of group.commands) {\n const detail = COMMAND_HELP_DETAILS[command];\n if (!COMMAND_SET.has(command)) {\n throw new Error(`Help references unknown CLI command: ${command}`);\n }\n if (seen.has(command)) {\n throw new Error(`Help command appears multiple times: ${command}`);\n }\n if (!detail || !detail.description.trim() || !detail.usage.trim()) {\n throw new Error(`Missing command help metadata: ${command}`);\n }\n if (detail.examples.length === 0) {\n throw new Error(`Missing command example metadata: ${command}`);\n }\n for (const flag of detail.flags) {\n if (!FLAG_SET.has(flag)) {\n throw new Error(`Command help metadata references unknown flag ${flag} for ${command}`);\n }\n }\n seen.add(command);\n }\n }\n\n if (seen.size !== CLI_COMMANDS.length) {\n const missing = CLI_COMMANDS.filter((command) => !seen.has(command));\n throw new Error(`Help command coverage mismatch; missing: ${missing.join(\", \")}`);\n }\n}\n\nfunction assertFlagCoverage(): void {\n const seen = new Set<string>();\n\n for (const group of HELP_FLAG_GROUPS) {\n for (const entry of group.flags) {\n if (!FLAG_SET.has(entry.flag)) {\n throw new Error(`Help references unknown CLI flag: ${entry.flag}`);\n }\n if (seen.has(entry.flag)) {\n throw new Error(`Help flag appears multiple times: ${entry.flag}`);\n }\n seen.add(entry.flag);\n }\n }\n\n if (seen.size !== VALID_FLAGS.length) {\n const missing = VALID_FLAGS.filter((flag) => !seen.has(flag));\n throw new Error(`Help flag coverage mismatch; missing: ${missing.join(\", \")}`);\n }\n}\n\nfunction assertToolCoverage(): void {\n const seen = new Set<string>();\n\n for (const entry of HELP_TOOL_ENTRIES) {\n if (!entry.name.startsWith(\"opendevbrowser_\")) {\n throw new Error(`Invalid tool name in help inventory: ${entry.name}`);\n }\n if (!entry.description.trim()) {\n throw new Error(`Help tool is missing a description: ${entry.name}`);\n }\n if (!entry.example?.trim()) {\n throw new Error(`Help tool is missing an example: ${entry.name}`);\n }\n if (seen.has(entry.name)) {\n throw new Error(`Help tool appears multiple times: ${entry.name}`);\n }\n if (entry.cliEquivalent && !COMMAND_SET.has(entry.cliEquivalent)) {\n throw new Error(`Tool metadata references unknown CLI command: ${entry.cliEquivalent}`);\n }\n seen.add(entry.name);\n }\n\n if (HELP_TOOL_ENTRIES.length !== TOOL_COUNT) {\n throw new Error(`Help tool inventory must list ${TOOL_COUNT} tools; got ${HELP_TOOL_ENTRIES.length}`);\n }\n}\n\nfunction formatCommandGroups(): string {\n return HELP_COMMAND_GROUPS\n .map((group) => {\n const rows: FormattableRow[] = group.commands.map((command) => {\n const detail = COMMAND_HELP_DETAILS[command];\n return {\n label: command,\n description: detail.description,\n details: [\n { label: \"usage:\", value: detail.usage },\n { label: \"flags:\", value: formatFlags(detail.flags) },\n ...detail.examples.map((example) => ({ label: \"example:\", value: example })),\n ...detail.notes.map((note) => ({ label: \"note:\", value: note }))\n ]\n };\n });\n return `${group.title}: ${group.summary}\\n${formatRows(rows)}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatFlagGroups(): string {\n return HELP_FLAG_GROUPS\n .map((group) => {\n const rows: FormattableRow[] = group.flags.map((entry) => ({\n label: entry.alias ? `${entry.flag} (${entry.alias})` : entry.flag,\n description: entry.description,\n details: entry.example ? [{ label: \"example:\", value: entry.example }] : []\n }));\n return `${group.title}: ${group.summary}\\n${formatRows(rows)}`;\n })\n .join(\"\\n\\n\");\n}\n\nfunction formatToolEntries(): string {\n return formatRows(HELP_TOOL_ENTRIES.map((entry) => ({\n label: entry.name,\n description: entry.description,\n details: [\n ...(entry.cliEquivalent\n ? [{ label: \"cli:\", value: entry.cliEquivalent }]\n : [{ label: \"scope:\", value: \"tool-only\" }]),\n ...(entry.example ? [{ label: \"example:\", value: entry.example }] : []),\n ...((entry.notes ?? []).map((note) => ({ label: \"note:\", value: note })))\n ]\n })));\n}\n\nfunction formatOnboardingEntries(): string {\n return formatRows(HELP_ONBOARDING_ENTRIES);\n}\n\nfunction formatCapabilityEntries(): string {\n return formatRows(HELP_CAPABILITY_ENTRIES);\n}\n\nfunction formatReferenceEntries(): string {\n return formatRows(HELP_REFERENCE_ENTRIES.map((entry) => ({\n label: entry.label,\n description: entry.description\n })));\n}\n\nexport function getHelpText(): string {\n assertCommandCoverage();\n assertFlagCoverage();\n assertToolCoverage();\n\n return [\n \"OpenDevBrowser CLI\",\n \"\",\n \"Usage:\",\n \" npx opendevbrowser <command> [options]\",\n \"\",\n \"Find It Fast:\",\n \" Use these exact lookup terms when you need replay, desktop evidence, or browser-scoped computer use.\",\n formatCapabilityEntries(),\n \"\",\n `${onboardingMetadata.sectionTitle}:`,\n ` ${onboardingMetadata.sectionSummary}`,\n formatOnboardingEntries(),\n \"\",\n `Command Inventory (all ${CLI_COMMANDS.length} commands):`,\n formatCommandGroups(),\n \"\",\n \"Flag Inventory (all supported flags):\",\n formatFlagGroups(),\n \"\",\n `Tool Inventory (all ${TOOL_COUNT} opendevbrowser_* tools):`,\n formatToolEntries(),\n \"\",\n \"Reference Pointers:\",\n formatReferenceEntries()\n ].join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/inspiredesign.ts"],"sourcesContent":["import type { ParsedArgs } from \"../args\";\nimport { callDaemon } from \"../client\";\nimport { createUsageError } from \"../errors\";\nimport { DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS } from \"../transport-timeouts\";\nimport {\n parseBooleanFlag,\n parseNumberFlag,\n parseOptionalStringFlag,\n parseRepeatedStringFlag\n} from \"../utils/parse\";\nimport { buildWorkflowCompletionMessage } from \"../utils/workflow-message\";\nimport { isChallengeAutomationMode, type ChallengeAutomationMode } from \"../../challenges/types\";\nimport { resolveInspiredesignCaptureMode } from \"../../inspiredesign/capture-mode\";\nimport type { WorkflowBrowserMode } from \"../../providers/types\";\nimport { resolveWorkflowOutputDirFlag } from \"./workflow-output\";\n\ntype InspiredesignCommandArgs = {\n brief?: string;\n urls?: string[];\n captureMode?: \"off\" | \"deep\";\n includePrototypeGuidance?: boolean;\n mode?: \"compact\" | \"json\" | \"md\" | \"context\" | \"path\";\n timeoutMs?: number;\n outputDir?: string;\n ttlHours?: number;\n browserMode?: WorkflowBrowserMode;\n useCookies?: boolean;\n challengeAutomationMode?: ChallengeAutomationMode;\n cookiePolicyOverride?: \"off\" | \"auto\" | \"required\";\n};\n\nconst MODE_VALUES = new Set([\"compact\", \"json\", \"md\", \"context\", \"path\"]);\nconst CAPTURE_MODE_VALUES = new Set([\"off\", \"deep\"]);\nconst COOKIE_POLICY_VALUES = new Set([\"off\", \"auto\", \"required\"]);\nconst BROWSER_MODE_VALUES = new Set([\"auto\", \"extension\", \"managed\"]);\n\nconst requireValue = (rawArgs: string[], index: number, flag: string): string => {\n const value = rawArgs[index + 1];\n if (!value) {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return value;\n};\n\nconst parseInspiredesignRunArgs = (rawArgs: string[]): InspiredesignCommandArgs => {\n const parsed: InspiredesignCommandArgs = {\n brief: parseOptionalStringFlag(rawArgs, \"--brief\"),\n urls: parseRepeatedStringFlag(rawArgs, \"--url\")\n };\n\n for (let index = 0; index < rawArgs.length; index += 1) {\n const arg = rawArgs[index];\n\n if (arg === \"--brief\" || arg === \"--url\") {\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--brief=\") || arg?.startsWith(\"--url=\")) {\n continue;\n }\n\n if (arg === \"--capture-mode\") {\n const value = requireValue(rawArgs, index, \"--capture-mode\").toLowerCase();\n if (!CAPTURE_MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --capture-mode: ${value}`);\n }\n parsed.captureMode = value as InspiredesignCommandArgs[\"captureMode\"];\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--capture-mode=\")) {\n const value = (arg.split(\"=\", 2)[1] ?? \"\").toLowerCase();\n if (!CAPTURE_MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --capture-mode: ${value}`);\n }\n parsed.captureMode = value as InspiredesignCommandArgs[\"captureMode\"];\n continue;\n }\n\n if (arg === \"--include-prototype-guidance\") {\n parsed.includePrototypeGuidance = true;\n continue;\n }\n if (arg?.startsWith(\"--include-prototype-guidance=\")) {\n parsed.includePrototypeGuidance = parseBooleanFlag(arg.split(\"=\", 2)[1] ?? \"\", \"--include-prototype-guidance\");\n continue;\n }\n\n if (arg === \"--mode\") {\n const value = requireValue(rawArgs, index, \"--mode\").toLowerCase();\n if (!MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --mode: ${value}`);\n }\n parsed.mode = value as InspiredesignCommandArgs[\"mode\"];\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--mode=\")) {\n const value = (arg.split(\"=\", 2)[1] ?? \"\").toLowerCase();\n if (!MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --mode: ${value}`);\n }\n parsed.mode = value as InspiredesignCommandArgs[\"mode\"];\n continue;\n }\n\n if (arg === \"--timeout-ms\") {\n parsed.timeoutMs = parseNumberFlag(requireValue(rawArgs, index, \"--timeout-ms\"), \"--timeout-ms\", { min: 1 });\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--timeout-ms=\")) {\n parsed.timeoutMs = parseNumberFlag(arg.split(\"=\", 2)[1] ?? \"\", \"--timeout-ms\", { min: 1 });\n continue;\n }\n\n if (arg === \"--output-dir\") {\n parsed.outputDir = resolveWorkflowOutputDirFlag(requireValue(rawArgs, index, \"--output-dir\"));\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--output-dir=\")) {\n parsed.outputDir = resolveWorkflowOutputDirFlag(arg.split(\"=\", 2)[1]);\n continue;\n }\n\n if (arg === \"--ttl-hours\") {\n parsed.ttlHours = parseNumberFlag(requireValue(rawArgs, index, \"--ttl-hours\"), \"--ttl-hours\", { min: 1, max: 168 });\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--ttl-hours=\")) {\n parsed.ttlHours = parseNumberFlag(arg.split(\"=\", 2)[1] ?? \"\", \"--ttl-hours\", { min: 1, max: 168 });\n continue;\n }\n\n if (arg === \"--browser-mode\") {\n const value = requireValue(rawArgs, index, \"--browser-mode\").toLowerCase();\n if (!BROWSER_MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --browser-mode: ${value}`);\n }\n parsed.browserMode = value as WorkflowBrowserMode;\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--browser-mode=\")) {\n const value = (arg.split(\"=\", 2)[1] ?? \"\").toLowerCase();\n if (!BROWSER_MODE_VALUES.has(value)) {\n throw createUsageError(`Invalid --browser-mode: ${value}`);\n }\n parsed.browserMode = value as WorkflowBrowserMode;\n continue;\n }\n\n if (arg === \"--use-cookies\") {\n parsed.useCookies = true;\n continue;\n }\n if (arg?.startsWith(\"--use-cookies=\")) {\n parsed.useCookies = parseBooleanFlag(arg.split(\"=\", 2)[1] ?? \"\", \"--use-cookies\");\n continue;\n }\n\n if (arg === \"--challenge-automation-mode\") {\n const value = requireValue(rawArgs, index, \"--challenge-automation-mode\");\n if (!isChallengeAutomationMode(value)) {\n throw createUsageError(`Invalid --challenge-automation-mode: ${value}`);\n }\n parsed.challengeAutomationMode = value;\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--challenge-automation-mode=\")) {\n const value = arg.split(\"=\", 2)[1] ?? \"\";\n if (!isChallengeAutomationMode(value)) {\n throw createUsageError(`Invalid --challenge-automation-mode: ${value}`);\n }\n parsed.challengeAutomationMode = value;\n continue;\n }\n\n if (arg === \"--cookie-policy-override\" || arg === \"--cookie-policy\") {\n const value = requireValue(rawArgs, index, arg).toLowerCase();\n if (!COOKIE_POLICY_VALUES.has(value)) {\n throw createUsageError(`Invalid ${arg}: ${value}`);\n }\n parsed.cookiePolicyOverride = value as InspiredesignCommandArgs[\"cookiePolicyOverride\"];\n index += 1;\n continue;\n }\n if (arg?.startsWith(\"--cookie-policy-override=\") || arg?.startsWith(\"--cookie-policy=\")) {\n const value = (arg.split(\"=\", 2)[1] ?? \"\").toLowerCase();\n if (!COOKIE_POLICY_VALUES.has(value)) {\n throw createUsageError(`Invalid --cookie-policy-override: ${value}`);\n }\n parsed.cookiePolicyOverride = value as InspiredesignCommandArgs[\"cookiePolicyOverride\"];\n }\n }\n\n return parsed;\n};\n\nexport async function runInspiredesignCommand(args: ParsedArgs) {\n const [subcommand, ...rest] = args.rawArgs;\n if (subcommand !== \"run\") {\n throw createUsageError(\"Usage: opendevbrowser inspiredesign run --brief <value> [--url <url>] [options]\");\n }\n\n const parsed = parseInspiredesignRunArgs(rest);\n if (!parsed.brief?.trim()) {\n throw createUsageError(\"Missing --brief\");\n }\n const captureMode = resolveInspiredesignCaptureMode(parsed.captureMode, parsed.urls);\n\n const data = await callDaemon(\"inspiredesign.run\", {\n brief: parsed.brief,\n urls: parsed.urls,\n captureMode,\n includePrototypeGuidance: parsed.includePrototypeGuidance,\n mode: parsed.mode ?? \"compact\",\n timeoutMs: parsed.timeoutMs ?? DEFAULT_WORKFLOW_TRANSPORT_TIMEOUT_MS,\n outputDir: resolveWorkflowOutputDirFlag(parsed.outputDir),\n ttlHours: parsed.ttlHours,\n browserMode: parsed.browserMode,\n useCookies: parsed.useCookies,\n challengeAutomationMode: parsed.challengeAutomationMode,\n cookiePolicyOverride: parsed.cookiePolicyOverride\n });\n\n return {\n success: true,\n message: buildWorkflowCompletionMessage(\"Inspiredesign workflow\", data),\n data\n };\n}\n\nexport const __test__ = {\n parseInspiredesignRunArgs\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/serve.ts"],"sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport type { ParsedArgs } from \"../args\";\nimport {\n createDaemonStopHeaders,\n isCurrentDaemonFingerprint,\n readDaemonMetadata,\n startDaemon\n} from \"../daemon\";\nimport { loadGlobalConfig } from \"../../config\";\nimport { createUsageError, EXIT_DISCONNECTED, EXIT_EXECUTION } from \"../errors\";\nimport { parseNumberFlag } from \"../utils/parse\";\nimport { fetchWithTimeout } from \"../utils/http\";\nimport { discoverExtensionId, getNativeStatusSnapshot, installNativeHost } from \"./native\";\nimport type { DaemonStatusPayload } from \"../daemon-status\";\nimport { fetchDaemonStatus } from \"../daemon-status\";\n\ntype ServeArgs = {\n port?: number;\n token?: string;\n stop: boolean;\n};\n\ntype DaemonHandle = {\n stop: () => Promise<void>;\n};\n\ntype ExistingDaemon = {\n token: string;\n status: DaemonStatusPayload;\n};\n\ntype ServeProcessSnapshot = {\n pid: number;\n uid: number | null;\n command: string;\n};\n\nlet daemonHandle: DaemonHandle | null = null;\nconst PS_MAX_BUFFER = 8 * 1024 * 1024;\nconst DAEMON_SHUTDOWN_POLL_ATTEMPTS = 10;\nconst DAEMON_SHUTDOWN_POLL_DELAY_MS = 100;\nconst DAEMON_SHUTDOWN_STATUS_TIMEOUT_MS = 250;\nconst DAEMON_STOP_TIMEOUT_MS = 1000;\nconst PROCESS_TERMINATE_GRACE_MS = 250;\nconst MIN_PORT = 1;\nconst MAX_PORT = 65535;\nconst SERVE_COMMAND_PATTERN = /(?:^|\\s)serve(?=\\s|$)/;\nconst SERVE_PORT_SPLIT_PATTERN = /(?:^|\\s)--port\\s+(\\d+)(?=\\s|$)/;\nconst SERVE_PORT_EQUALS_PATTERN = /(?:^|\\s)--port=(\\d+)(?=\\s|$)/;\nconst SERVE_STOP_PATTERN = /(?:^|\\s)--stop(?:\\s|$)/;\nconst CURRENT_UID = typeof process.getuid === \"function\" ? process.getuid() : null;\nconst CURRENT_EXECUTABLE = process.execPath;\nconst CURRENT_CLI_ENTRYPOINT = process.argv[1] ?? \"\";\n\nfunction resolveTokenCandidates(\n requestedToken: string | undefined,\n metadataToken: string | undefined,\n configToken: string | undefined\n): string[] {\n return Array.from(new Set([requestedToken, metadataToken, configToken].filter((token): token is string => (\n typeof token === \"string\" && token.trim().length > 0\n ))));\n}\n\nasync function resolveExistingDaemon(\n port: number,\n tokens: string[]\n): Promise<ExistingDaemon | null> {\n for (const token of tokens) {\n const status = await fetchDaemonStatus(port, token);\n if (status?.ok) {\n return { token, status };\n }\n }\n return null;\n}\n\nfunction isPositivePid(value: unknown): value is number {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0;\n}\n\nfunction parseServeArgs(rawArgs: string[]): ServeArgs {\n const parsed: ServeArgs = { stop: false };\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--stop\") {\n parsed.stop = true;\n continue;\n }\n if (arg === \"--daemon\") {\n throw createUsageError(\"`serve --daemon` is not supported. Use `serve` for foreground mode, `daemon install` for autostart, or `status --daemon` to inspect the daemon.\");\n }\n if (arg === \"--port\") {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(\"Missing value for --port\");\n }\n parsed.port = parseNumberFlag(value, \"--port\", { min: MIN_PORT, max: MAX_PORT });\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--port=\")) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(\"Missing value for --port\");\n }\n parsed.port = parseNumberFlag(value, \"--port\", { min: MIN_PORT, max: MAX_PORT });\n continue;\n }\n if (arg === \"--token\") {\n const value = rawArgs[i + 1];\n if (!value) {\n throw createUsageError(\"Missing value for --token\");\n }\n parsed.token = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--token=\")) {\n const value = arg.split(\"=\", 2)[1];\n if (!value) {\n throw createUsageError(\"Missing value for --token\");\n }\n parsed.token = value;\n continue;\n }\n }\n return parsed;\n}\n\nfunction parseServeProcessSnapshot(line: string): ServeProcessSnapshot | null {\n const trimmed = line.trim();\n if (trimmed.length === 0) {\n return null;\n }\n const match = trimmed.match(/^(\\d+)(?:\\s+(\\d+))?\\s+(.*)$/);\n if (!match) {\n return null;\n }\n const pid = Number.parseInt(match[1] ?? \"\", 10);\n if (!Number.isInteger(pid) || pid <= 0) {\n return null;\n }\n const rawUid = match[2];\n const parsedUid = typeof rawUid === \"string\" && rawUid.length > 0\n ? Number.parseInt(rawUid, 10)\n : null;\n const command = (match[3] ?? \"\").trim();\n if (command.length === 0) {\n return null;\n }\n return {\n pid,\n uid: typeof parsedUid === \"number\" && Number.isInteger(parsedUid) && parsedUid >= 0 ? parsedUid : null,\n command\n };\n}\n\nfunction parseServeCommandPort(command: string): number | null {\n const rawPort = command.match(SERVE_PORT_EQUALS_PATTERN)?.[1]\n ?? command.match(SERVE_PORT_SPLIT_PATTERN)?.[1];\n if (!rawPort) {\n return null;\n }\n const port = Number.parseInt(rawPort, 10);\n return Number.isInteger(port) && port >= MIN_PORT && port <= MAX_PORT ? port : null;\n}\n\nfunction listServeProcessSnapshots(): ServeProcessSnapshot[] {\n const result = spawnSync(\"ps\", [\"-axww\", \"-o\", \"pid=,uid=,command=\"], {\n encoding: \"utf-8\",\n maxBuffer: PS_MAX_BUFFER\n });\n if ((result.status ?? 1) !== 0) {\n return [];\n }\n return String(result.stdout ?? \"\")\n .split(\"\\n\")\n .map((line) => parseServeProcessSnapshot(line))\n .filter((snapshot): snapshot is ServeProcessSnapshot => snapshot !== null);\n}\n\nfunction readServeProcessEntrypoint(command: string): string | null {\n const tokens = command.trim().split(/\\s+/u);\n const executable = tokens[0] ?? \"\";\n if (executable.length === 0) {\n return null;\n }\n return executable === CURRENT_EXECUTABLE ? (tokens[1] ?? null) : executable;\n}\n\nfunction isCurrentEntrypointServeProcess(snapshot: ServeProcessSnapshot): boolean {\n if (CURRENT_UID === null || snapshot.uid === null || snapshot.uid !== CURRENT_UID) {\n return false;\n }\n const entrypoint = readServeProcessEntrypoint(snapshot.command);\n if (!CURRENT_CLI_ENTRYPOINT || entrypoint !== CURRENT_CLI_ENTRYPOINT) {\n return false;\n }\n if (!SERVE_COMMAND_PATTERN.test(snapshot.command)) {\n return false;\n }\n return !SERVE_STOP_PATTERN.test(snapshot.command);\n}\n\nfunction isRequestedPortServeProcess(snapshot: ServeProcessSnapshot, requestedPort: number): boolean {\n return isCurrentEntrypointServeProcess(snapshot)\n && parseServeCommandPort(snapshot.command) === requestedPort;\n}\n\nasync function terminateProcess(pid: number): Promise<boolean> {\n if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid || pid === process.ppid) {\n return false;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n return false;\n }\n await new Promise((resolve) => setTimeout(resolve, PROCESS_TERMINATE_GRACE_MS));\n try {\n process.kill(pid, 0);\n } catch {\n return true;\n }\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // process may have exited after SIGTERM\n }\n return true;\n}\n\nasync function cleanupCompetingServeProcesses(requestedPort: number, keepPid?: number): Promise<number[]> {\n const candidates = listServeProcessSnapshots().filter((snapshot) => {\n if (!isRequestedPortServeProcess(snapshot, requestedPort)) {\n return false;\n }\n if (snapshot.pid === process.pid || snapshot.pid === process.ppid) {\n return false;\n }\n if (Number.isInteger(keepPid) && snapshot.pid === keepPid) {\n return false;\n }\n return true;\n });\n if (candidates.length === 0) {\n return [];\n }\n\n const clearedPids: number[] = [];\n for (const snapshot of candidates) {\n if (await terminateProcess(snapshot.pid)) {\n clearedPids.push(snapshot.pid);\n }\n }\n\n return clearedPids;\n}\n\nasync function terminateServeProcessByPid(pid?: number): Promise<boolean> {\n if (!isPositivePid(pid)) {\n return false;\n }\n const snapshot = listServeProcessSnapshots().find((item) => item.pid === pid);\n return snapshot ? isCurrentEntrypointServeProcess(snapshot) && await terminateProcess(pid) : false;\n}\n\nfunction isServeProcessRunningByPid(pid?: number): boolean {\n if (!isPositivePid(pid)) {\n return false;\n }\n return listServeProcessSnapshots().some((item) => {\n return item.pid === pid && isCurrentEntrypointServeProcess(item);\n });\n}\n\nfunction buildStaleStopMessage(metadata: NonNullable<ReturnType<typeof readDaemonMetadata>>): string {\n const pid = isPositivePid(metadata.pid) ? ` pid=${metadata.pid}` : \"\";\n return `Daemon rejected stale stop request for 127.0.0.1:${metadata.port}${pid}. Run \\`opendevbrowser status --daemon\\` to inspect the active daemon, then restart from the current install if needed.`;\n}\n\nfunction buildProtectedMismatchMessage(port: number, status: DaemonStatusPayload): string {\n return `Daemon on 127.0.0.1:${port} pid=${status.pid} is protected by a different opendevbrowser build. Run \\`opendevbrowser status --daemon\\` to inspect it, then restart from the current install.`;\n}\n\nasync function waitForDaemonShutdown(port: number, token: string): Promise<boolean> {\n for (let attempt = 0; attempt < DAEMON_SHUTDOWN_POLL_ATTEMPTS; attempt += 1) {\n const status = await fetchDaemonStatus(port, token, { timeoutMs: DAEMON_SHUTDOWN_STATUS_TIMEOUT_MS });\n if (!status?.ok) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, DAEMON_SHUTDOWN_POLL_DELAY_MS));\n }\n return false;\n}\n\nasync function waitForServeProcessExit(pid?: number): Promise<boolean> {\n if (!isPositivePid(pid)) {\n return true;\n }\n for (let attempt = 0; attempt < DAEMON_SHUTDOWN_POLL_ATTEMPTS; attempt += 1) {\n if (!isServeProcessRunningByPid(pid)) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, DAEMON_SHUTDOWN_POLL_DELAY_MS));\n }\n return false;\n}\n\nasync function confirmStoppedDaemon(port: number, token: string, pid?: number): Promise<boolean> {\n const statusStopped = await waitForDaemonShutdown(port, token);\n const processStopped = await waitForServeProcessExit(pid);\n return statusStopped && processStopped;\n}\n\nasync function stopMismatchedDaemon(port: number, daemon: ExistingDaemon): Promise<string | null> {\n let response: Response;\n try {\n response = await fetchWithTimeout(`http://127.0.0.1:${port}/stop`, {\n method: \"POST\",\n headers: createDaemonStopHeaders(daemon.token, \"serve.upgrade\")\n }, DAEMON_STOP_TIMEOUT_MS);\n } catch (error) {\n const status = await fetchDaemonStatus(port, daemon.token, {\n timeoutMs: DAEMON_SHUTDOWN_STATUS_TIMEOUT_MS\n });\n if (!status?.ok) {\n return null;\n }\n const message = error instanceof Error ? error.message : String(error);\n return `Failed to stop mismatched daemon on 127.0.0.1:${port}: ${message}.`;\n }\n if (response.status === 409) {\n return buildProtectedMismatchMessage(port, daemon.status);\n }\n if (!response.ok) {\n return `Failed to stop mismatched daemon on 127.0.0.1:${port}: stop returned ${response.status}.`;\n }\n if (await waitForDaemonShutdown(port, daemon.token)) {\n return null;\n }\n if (await terminateServeProcessByPid(daemon.status.pid)) {\n return null;\n }\n return `Timed out waiting for mismatched daemon on 127.0.0.1:${port} to stop.`;\n}\n\nasync function prepareExistingDaemon(port: number, daemon: ExistingDaemon): Promise<string | null> {\n if (isCurrentDaemonFingerprint(daemon.status.fingerprint)) {\n return null;\n }\n return await stopMismatchedDaemon(port, daemon);\n}\n\nfunction buildAlreadyRunningResult(\n port: number,\n status: DaemonStatusPayload,\n fallbackRelayPort: number,\n clearedCount: number\n) {\n const relayPort = status.relay.port ?? fallbackRelayPort;\n const staleNote = clearedCount > 0 ? `\\nCleared ${clearedCount} stale daemon process${clearedCount === 1 ? \"\" : \"es\"}.` : \"\";\n return {\n success: true,\n message: `Daemon already running on 127.0.0.1:${port} (pid=${status.pid}, relay ${relayPort}).${staleNote}`,\n data: {\n port,\n pid: status.pid,\n relayPort,\n alreadyRunning: true,\n staleDaemonsCleared: clearedCount,\n relay: status.relay\n },\n exitCode: null\n };\n}\n\nexport async function runServe(args: ParsedArgs) {\n const serveArgs = parseServeArgs(args.rawArgs);\n\n if (serveArgs.stop) {\n const metadata = readDaemonMetadata();\n if (!metadata) {\n if (daemonHandle) {\n await daemonHandle.stop();\n daemonHandle = null;\n return { success: true, message: \"Daemon stopped.\" };\n }\n return { success: false, message: \"Daemon not running.\", exitCode: EXIT_DISCONNECTED };\n }\n\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${metadata.port}/stop`, {\n method: \"POST\",\n headers: createDaemonStopHeaders(metadata.token, \"serve.stop\")\n });\n if (response.status === 409) {\n return { success: false, message: buildStaleStopMessage(metadata), exitCode: EXIT_EXECUTION };\n }\n if (!response.ok) {\n throw new Error(`Stop failed (${response.status})`);\n }\n if (await confirmStoppedDaemon(metadata.port, metadata.token, metadata.pid)) {\n return { success: true, message: \"Daemon stopped.\" };\n }\n if (await terminateServeProcessByPid(metadata.pid)) {\n return { success: true, message: \"Daemon stopped.\" };\n }\n return {\n success: false,\n message: `Timed out waiting for daemon on 127.0.0.1:${metadata.port} to stop.`,\n exitCode: EXIT_EXECUTION\n };\n } catch (error) {\n if (await terminateServeProcessByPid(metadata.pid)) {\n return { success: true, message: \"Daemon stopped.\" };\n }\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed to stop daemon: ${message}`, exitCode: EXIT_EXECUTION };\n }\n }\n\n const config = loadGlobalConfig();\n const requestedPort = serveArgs.port ?? config.daemonPort;\n const metadata = readDaemonMetadata();\n const metadataToken = metadata?.port === requestedPort ? metadata.token : undefined;\n const tokenCandidates = resolveTokenCandidates(serveArgs.token, metadataToken, config.daemonToken);\n const existingDaemon = await resolveExistingDaemon(requestedPort, tokenCandidates);\n const staleDaemonPids = new Set<number>();\n const staleCleared = () => staleDaemonPids.size;\n\n if (existingDaemon) {\n const mismatchMessage = await prepareExistingDaemon(requestedPort, existingDaemon);\n if (mismatchMessage) {\n return { success: false, message: mismatchMessage, exitCode: EXIT_EXECUTION };\n }\n if (isCurrentDaemonFingerprint(existingDaemon.status.fingerprint)) {\n for (const pid of await cleanupCompetingServeProcesses(requestedPort, existingDaemon.status.pid)) {\n staleDaemonPids.add(pid);\n }\n return buildAlreadyRunningResult(requestedPort, existingDaemon.status, config.relayPort, staleCleared());\n }\n }\n\n for (const pid of await cleanupCompetingServeProcesses(requestedPort)) {\n staleDaemonPids.add(pid);\n }\n\n let nativeStatus = getNativeStatusSnapshot();\n let nativeMessage: string | null = null;\n if (!nativeStatus.installed || nativeStatus.mismatch) {\n const discovered = discoverExtensionId();\n const extensionId = nativeStatus.expectedExtensionId ?? config.nativeExtensionId ?? discovered.extensionId ?? null;\n const usedDiscovery = nativeStatus.expectedExtensionSource !== \"config\" && Boolean(extensionId);\n const previousExtensionId = nativeStatus.extensionId;\n if (extensionId) {\n const installResult = installNativeHost(extensionId);\n if (installResult.success) {\n const suffix = usedDiscovery && discovered.matchedBy ? ` (auto-detected by ${discovered.matchedBy})` : \"\";\n nativeMessage = nativeStatus.mismatch && previousExtensionId\n ? `Native host reinstalled for extension ${extensionId} (replacing stale ${previousExtensionId}).${suffix}`\n : `${installResult.message ?? \"Native host installed.\"}${suffix}`;\n nativeStatus = getNativeStatusSnapshot();\n } else {\n nativeMessage = nativeStatus.mismatch\n ? `Native host reinstall skipped: ${installResult.message ?? \"unknown error\"}`\n : `Native host install skipped: ${installResult.message ?? \"unknown error\"}`;\n }\n } else if (nativeStatus.mismatch && previousExtensionId) {\n nativeMessage = `Native host targets stale extension ${previousExtensionId}, but no current extension id could be resolved for reinstall.`;\n } else {\n nativeMessage = \"Native host not installed. Set nativeExtensionId in opendevbrowser.jsonc to auto-install.\";\n }\n }\n\n let handle: Awaited<ReturnType<typeof startDaemon>> | null = null;\n let startError: unknown = null;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n handle = await startDaemon({\n port: serveArgs.port,\n token: serveArgs.token,\n config\n });\n startError = null;\n break;\n } catch (error) {\n startError = error;\n const message = error instanceof Error ? error.message : String(error);\n if (!message.includes(\"EADDRINUSE\") && !message.includes(\"in use\")) {\n break;\n }\n const runningDaemon = await resolveExistingDaemon(requestedPort, tokenCandidates);\n if (runningDaemon) {\n const mismatchMessage = await prepareExistingDaemon(requestedPort, runningDaemon);\n if (mismatchMessage) {\n return { success: false, message: mismatchMessage, exitCode: EXIT_EXECUTION };\n }\n if (isCurrentDaemonFingerprint(runningDaemon.status.fingerprint)) {\n return buildAlreadyRunningResult(requestedPort, runningDaemon.status, config.relayPort, staleCleared());\n }\n }\n if (attempt === 0) {\n let clearedNewPid = false;\n for (const pid of await cleanupCompetingServeProcesses(requestedPort)) {\n const previousSize = staleDaemonPids.size;\n staleDaemonPids.add(pid);\n if (staleDaemonPids.size > previousSize) {\n clearedNewPid = true;\n }\n }\n if (clearedNewPid) {\n continue;\n }\n }\n break;\n }\n }\n\n if (!handle) {\n const message = startError instanceof Error ? startError.message : String(startError);\n if (message.includes(\"EADDRINUSE\") || message.includes(\"in use\")) {\n return {\n success: false,\n message: `Daemon port ${requestedPort} is already in use by another process. If this is an existing daemon, run \\`opendevbrowser status --daemon\\` or \\`opendevbrowser serve --stop\\`.`,\n exitCode: EXIT_EXECUTION\n };\n }\n return {\n success: false,\n message: `Failed to start daemon: ${message}`,\n exitCode: EXIT_EXECUTION\n };\n }\n\n daemonHandle = handle;\n const { state } = handle;\n\n const baseMessage = `Daemon running on 127.0.0.1:${state.port} (relay ${state.relayPort})`;\n const clearedCount = staleCleared();\n const staleNote = clearedCount > 0 ? `\\nCleared ${clearedCount} stale daemon process${clearedCount === 1 ? \"\" : \"es\"}.` : \"\";\n const message = nativeMessage\n ? `${baseMessage}\\n${nativeMessage}${staleNote}`\n : `${baseMessage}${staleNote}`;\n\n return {\n success: true,\n message,\n data: { port: state.port, pid: state.pid, relayPort: state.relayPort, native: nativeStatus, staleDaemonsCleared: clearedCount },\n exitCode: null\n };\n}\n"],"mappings":"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","names":["metadata","message"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/session/status.ts","../src/cli/commands/status.ts"],"sourcesContent":["import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseStatusArgs(rawArgs: string[]): { sessionId?: string } {\n const parsed: { sessionId?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runSessionStatus(args: ParsedArgs) {\n const { sessionId } = parseStatusArgs(args.rawArgs);\n if (!sessionId) {\n throw createUsageError(\"Missing --session-id\");\n }\n const result = await callDaemon(\"session.status\", { sessionId });\n return { success: true, message: `Session status: ${sessionId}`, data: result };\n}\n","import type { ParsedArgs } from \"../args\";\nimport { createDisconnectedError, createUsageError } from \"../errors\";\nimport { fetchDaemonStatusFromMetadata } from \"../daemon-status\";\nimport { DEFAULT_DAEMON_STATUS_FETCH_OPTIONS } from \"../daemon-status-policy\";\nimport { runSessionStatus } from \"./session/status\";\nimport { assessNativeStatus, getNativeStatusSnapshot } from \"./native\";\n\ntype StatusArgs = {\n sessionId?: string;\n daemon: boolean;\n};\n\nconst parseStatusArgs = (rawArgs: string[]): StatusArgs => {\n const parsed: StatusArgs = { daemon: false };\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--daemon\") {\n parsed.daemon = true;\n continue;\n }\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n};\n\nexport async function runStatus(args: ParsedArgs) {\n const { sessionId, daemon } = parseStatusArgs(args.rawArgs);\n if (sessionId && daemon) {\n throw createUsageError(\"Use --session-id or --daemon, not both.\");\n }\n\n if (sessionId) {\n return runSessionStatus(args);\n }\n\n if (!daemon && args.transport === \"native\") {\n const nativeStatus = getNativeStatusSnapshot();\n const assessment = assessNativeStatus(nativeStatus);\n return {\n success: assessment.success,\n message: assessment.message,\n data: nativeStatus,\n exitCode: assessment.exitCode ?? undefined\n };\n }\n\n const daemonStatus = await fetchDaemonStatusFromMetadata(undefined, DEFAULT_DAEMON_STATUS_FETCH_OPTIONS);\n if (!daemonStatus) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n\n const nativeStatus = getNativeStatusSnapshot();\n const nativeAssessment = assessNativeStatus(nativeStatus);\n const fingerprintLine = daemonStatus.fingerprintCurrent === false\n ? \"Daemon fingerprint: mismatch with current build\"\n : \"Daemon fingerprint: current\";\n\n const baseLines = [\n `Daemon OK (pid=${daemonStatus.pid})`,\n fingerprintLine,\n `Relay: port=${daemonStatus.relay.port ?? \"n/a\"} ext=${daemonStatus.relay.extensionConnected ? \"on\" : \"off\"} ` +\n `handshake=${daemonStatus.relay.extensionHandshakeComplete ? \"on\" : \"off\"} ` +\n `cdp=${daemonStatus.relay.cdpConnected ? \"on\" : \"off\"} ` +\n `annotate=${daemonStatus.relay.annotationConnected ? \"on\" : \"off\"} ` +\n `ops=${daemonStatus.relay.opsConnected ? \"on\" : \"off\"} ` +\n `canvas=${daemonStatus.relay.canvasConnected ? \"on\" : \"off\"} ` +\n `pairing=${daemonStatus.relay.pairingRequired ? \"on\" : \"off\"} ` +\n `health=${daemonStatus.relay.health?.reason ?? \"n/a\"}`,\n `Native: ${nativeAssessment.summary}`,\n daemonStatus.relay.lastHandshakeError\n ? `Relay last handshake error: ${daemonStatus.relay.lastHandshakeError.code} (${daemonStatus.relay.lastHandshakeError.message})`\n : \"Relay last handshake error: none\",\n \"Legend: ext=extension websocket, handshake=extension handshake, cdp=active /cdp client, annotate=annotation channel, ops=ops clients, canvas=canvas clients, pairing=token required, health=relay status\"\n ];\n if (!nativeAssessment.success) {\n baseLines.splice(4, 0, `Native detail: ${nativeAssessment.message}`);\n }\n const baseMessage = baseLines.join(\"\\n\");\n\n const message = daemon || args.outputFormat !== \"text\"\n ? baseMessage\n : [\n \"Warning: `status` defaults to daemon status. Use --daemon explicitly or --session-id for session status.\",\n baseMessage\n ].join(\"\\n\");\n\n return {\n success: true,\n message,\n data: { ...daemonStatus, native: nativeStatus }\n };\n}\n"],"mappings":"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","names":["parseStatusArgs","nativeStatus"]}