opendevbrowser 0.0.32 → 0.0.34

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 (274) hide show
  1. package/README.md +1 -1
  2. package/dist/{accessibility-snapshot-XOP66CSK.js → accessibility-snapshot-VCBXK47S.js} +9 -9
  3. package/dist/{active-window-E3WFOQGX.js → active-window-7EUN36LZ.js} +9 -9
  4. package/dist/{annotate-MAE7ZJOZ.js → annotate-VLBK7YB6.js} +8 -8
  5. package/dist/{attr-M3PFDJ7Q.js → attr-JNANQKM6.js} +8 -8
  6. package/dist/browser/browser-manager.d.ts.map +1 -1
  7. package/dist/browser/canvas-manager.d.ts.map +1 -1
  8. package/dist/browser/manager-types.d.ts +3 -0
  9. package/dist/browser/manager-types.d.ts.map +1 -1
  10. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  11. package/dist/browser/screencast-recorder.d.ts +1 -0
  12. package/dist/browser/screencast-recorder.d.ts.map +1 -1
  13. package/dist/canvas/guidance.d.ts +7 -0
  14. package/dist/canvas/guidance.d.ts.map +1 -1
  15. package/dist/canvas/repair-examples.d.ts +45 -0
  16. package/dist/canvas/repair-examples.d.ts.map +1 -0
  17. package/dist/{canvas-3AJVL5I5.js → canvas-V5LO4JVL.js} +23 -8
  18. package/dist/canvas-V5LO4JVL.js.map +1 -0
  19. package/dist/{capture-desktop-VJGEETMJ.js → capture-desktop-FKVDWTVG.js} +9 -9
  20. package/dist/{capture-window-W5UFSFQL.js → capture-window-QVPM2DN2.js} +9 -9
  21. package/dist/{check-4IR3UJVW.js → check-V3CWZ56S.js} +8 -8
  22. package/dist/{checked-PKNY7724.js → checked-Q27Q6YZN.js} +8 -8
  23. package/dist/{chunk-WHQZBUNY.js → chunk-3WLCWHIV.js} +2 -2
  24. package/dist/{chunk-WHQZBUNY.js.map → chunk-3WLCWHIV.js.map} +1 -1
  25. package/dist/{chunk-RO3SMXF3.js → chunk-5FDXH4CS.js} +2870 -191
  26. package/dist/chunk-5FDXH4CS.js.map +1 -0
  27. package/dist/{chunk-J3KYGJRQ.js → chunk-G6NQ7WYD.js} +2 -2
  28. package/dist/{chunk-AKIAGFOE.js → chunk-GC2FWISX.js} +33 -14
  29. package/dist/chunk-GC2FWISX.js.map +1 -0
  30. package/dist/{chunk-2X4JFMKJ.js → chunk-IBIHDGTZ.js} +4 -4
  31. package/dist/chunk-IBIHDGTZ.js.map +1 -0
  32. package/dist/{chunk-XDLJE3RJ.js → chunk-NX2XYJP5.js} +2 -2
  33. package/dist/{chunk-AWQ37HSC.js → chunk-OJAUKABV.js} +2 -2
  34. package/dist/{chunk-ZOVMMQO6.js → chunk-QXJDJDSZ.js} +35 -14
  35. package/dist/chunk-QXJDJDSZ.js.map +1 -0
  36. package/dist/{chunk-SKFB5ICF.js → chunk-TI5I6UWY.js} +8 -3
  37. package/dist/chunk-TI5I6UWY.js.map +1 -0
  38. package/dist/{chunk-W6YPVNDX.js → chunk-VTGG5ZU2.js} +2 -2
  39. package/dist/{chunk-P5K3ZIPI.js → chunk-VX47SJZM.js} +2 -2
  40. package/dist/{chunk-BUXFIY2P.js → chunk-VY47VKXU.js} +3 -3
  41. package/dist/{chunk-NURQB55J.js → chunk-WY72GYAH.js} +2 -2
  42. package/dist/{chunk-HBK56JST.js → chunk-XRDCSHKZ.js} +202 -126
  43. package/dist/chunk-XRDCSHKZ.js.map +1 -0
  44. package/dist/{chunk-PIFHXKV4.js → chunk-Z3HIX2SE.js} +3 -3
  45. package/dist/{chunk-37VSRUW4.js → chunk-ZGCTC5YM.js} +39 -7
  46. package/dist/chunk-ZGCTC5YM.js.map +1 -0
  47. package/dist/cli/commands/canvas.d.ts +12 -0
  48. package/dist/cli/commands/canvas.d.ts.map +1 -1
  49. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  50. package/dist/cli/daemon-commands.d.ts.map +1 -1
  51. package/dist/cli/daemon-mismatch.d.ts +6 -0
  52. package/dist/cli/daemon-mismatch.d.ts.map +1 -1
  53. package/dist/cli/help.d.ts.map +1 -1
  54. package/dist/cli/index.js +77 -77
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/utils/parse.d.ts +1 -0
  57. package/dist/cli/utils/parse.d.ts.map +1 -1
  58. package/dist/cli/utils/workflow-message.d.ts +1 -1
  59. package/dist/cli/utils/workflow-message.d.ts.map +1 -1
  60. package/dist/{click-HLNXU4I5.js → click-EQDRSLR3.js} +8 -8
  61. package/dist/{clone-component-QIKN5PIM.js → clone-component-SISUXTJS.js} +7 -7
  62. package/dist/{clone-page-5C7DTGZT.js → clone-page-MLDPCBOY.js} +7 -7
  63. package/dist/{close-WTXB3EDD.js → close-2LQMJVOA.js} +7 -7
  64. package/dist/{close-PCRZHX7F.js → close-7J7EV237.js} +7 -7
  65. package/dist/{connect-6C2IG55I.js → connect-JFRSIW5M.js} +8 -8
  66. package/dist/{console-poll-VJXCZR3F.js → console-poll-NSVVUNEC.js} +8 -8
  67. package/dist/{cookie-import-5OEDFB6U.js → cookie-import-B7IQTGTN.js} +7 -7
  68. package/dist/{cookie-list-44UNJJ6D.js → cookie-list-YHG7JCZZ.js} +7 -7
  69. package/dist/{daemon-CIKGBWEB.js → daemon-ENU4FOV4.js} +6 -6
  70. package/dist/daemon-fingerprint.json +1 -1
  71. package/dist/{debug-trace-snapshot-RGXAPGWB.js → debug-trace-snapshot-KLGU2AWY.js} +8 -8
  72. package/dist/{dialog-S64MJUM2.js → dialog-MUVQIERS.js} +8 -8
  73. package/dist/{disconnect-MTIELIM7.js → disconnect-KELQJ45J.js} +7 -7
  74. package/dist/{enabled-KF2L7LW4.js → enabled-SF6UU5HG.js} +8 -8
  75. package/dist/{goto-ULWINUAZ.js → goto-AZQWXYPG.js} +8 -8
  76. package/dist/guidance/context.d.ts +44 -0
  77. package/dist/guidance/context.d.ts.map +1 -0
  78. package/dist/guidance/index.d.ts +7 -0
  79. package/dist/guidance/index.d.ts.map +1 -0
  80. package/dist/guidance/readiness.d.ts +7 -0
  81. package/dist/guidance/readiness.d.ts.map +1 -0
  82. package/dist/guidance/recipes/generic.d.ts +3 -0
  83. package/dist/guidance/recipes/generic.d.ts.map +1 -0
  84. package/dist/guidance/recipes/pinterest.d.ts +5 -0
  85. package/dist/guidance/recipes/pinterest.d.ts.map +1 -0
  86. package/dist/guidance/recipes/site-recipe-types.d.ts +2 -0
  87. package/dist/guidance/recipes/site-recipe-types.d.ts.map +1 -0
  88. package/dist/guidance/recipes/site-recipe-validation.d.ts +27 -0
  89. package/dist/guidance/recipes/site-recipe-validation.d.ts.map +1 -0
  90. package/dist/guidance/recipes/site-registry.d.ts +5 -0
  91. package/dist/guidance/recipes/site-registry.d.ts.map +1 -0
  92. package/dist/guidance/renderers.d.ts +22 -0
  93. package/dist/guidance/renderers.d.ts.map +1 -0
  94. package/dist/guidance/router.d.ts +8 -0
  95. package/dist/guidance/router.d.ts.map +1 -0
  96. package/dist/guidance/types.d.ts +140 -0
  97. package/dist/guidance/types.d.ts.map +1 -0
  98. package/dist/{help-IG5S5RJD.js → help-B44IBHXL.js} +6 -5
  99. package/dist/help-B44IBHXL.js.map +1 -0
  100. package/dist/{hover-NOCOTR6N.js → hover-MQRAKKVU.js} +8 -8
  101. package/dist/{html-LXSYP6BT.js → html-PLRTU2WS.js} +8 -8
  102. package/dist/index.js +51 -16
  103. package/dist/index.js.map +1 -1
  104. package/dist/{inspector-62EPCLYB.js → inspector-IY4GBIT6.js} +10 -10
  105. package/dist/{inspector-audit-T2IF67RJ.js → inspector-audit-7MQCRJHD.js} +12 -12
  106. package/dist/{inspector-plan-KQS6LRMW.js → inspector-plan-ZAUDHBET.js} +10 -10
  107. package/dist/inspiredesign/contract.d.ts +3 -0
  108. package/dist/inspiredesign/contract.d.ts.map +1 -1
  109. package/dist/inspiredesign/handoff.d.ts +2 -2
  110. package/dist/inspiredesign/meta-prompt.d.ts +1 -1
  111. package/dist/inspiredesign/meta-prompt.d.ts.map +1 -1
  112. package/dist/inspiredesign/reference-pattern-board.d.ts +22 -1
  113. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  114. package/dist/{inspiredesign-DB6CHYN3.js → inspiredesign-VHPEO3UK.js} +83 -30
  115. package/dist/inspiredesign-VHPEO3UK.js.map +1 -0
  116. package/dist/{launch-B5ES6FVS.js → launch-OCTWPTV5.js} +8 -8
  117. package/dist/{list-TIZVR6RO.js → list-HUSYADUS.js} +7 -7
  118. package/dist/{list-XM4BP5GM.js → list-JWKAMAUA.js} +7 -7
  119. package/dist/{macro-resolve-TTQZVFIW.js → macro-resolve-WOXMPZDQ.js} +9 -9
  120. package/dist/{network-poll-NNSY4W63.js → network-poll-WHB62OEF.js} +8 -8
  121. package/dist/{new-E6VNAC2A.js → new-IKZBYBNK.js} +7 -7
  122. package/dist/{open-F55XKMKB.js → open-UA2VI6ZP.js} +7 -7
  123. package/dist/opendevbrowser.js +51 -16
  124. package/dist/opendevbrowser.js.map +1 -1
  125. package/dist/{perf-RE7JE6CP.js → perf-DICS3VKH.js} +8 -8
  126. package/dist/{pointer-down-BCBPC5FJ.js → pointer-down-2XPRZFJC.js} +9 -9
  127. package/dist/{pointer-drag-QK7KGF7W.js → pointer-drag-7NY4BOLH.js} +9 -9
  128. package/dist/{pointer-move-VFAZQAXA.js → pointer-move-FWEXMH37.js} +9 -9
  129. package/dist/{pointer-up-FA5WE6LS.js → pointer-up-VU2OHK5D.js} +9 -9
  130. package/dist/{press-TNRHNDSW.js → press-W7IZ3FCX.js} +8 -8
  131. package/dist/{product-video-UEANMZ2U.js → product-video-XCZ6CHR5.js} +10 -10
  132. package/dist/providers/browser-native-discovery.d.ts +23 -0
  133. package/dist/providers/browser-native-discovery.d.ts.map +1 -0
  134. package/dist/providers/browser-output-artifacts.d.ts +13 -0
  135. package/dist/providers/browser-output-artifacts.d.ts.map +1 -0
  136. package/dist/providers/renderer.d.ts +2 -0
  137. package/dist/providers/renderer.d.ts.map +1 -1
  138. package/dist/providers/workflow-handoff.d.ts +3 -0
  139. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  140. package/dist/providers/workflows.d.ts.map +1 -1
  141. package/dist/{providers-AMCNWZUL.js → providers-XCNSU3T6.js} +4 -4
  142. package/dist/public-surface/generated-manifest.d.ts +5 -5
  143. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  144. package/dist/public-surface/source.d.ts +2 -2
  145. package/dist/public-surface/source.d.ts.map +1 -1
  146. package/dist/{research-YFY7WJSZ.js → research-AYCKHOWK.js} +10 -10
  147. package/dist/{review-NHOPLAT7.js → review-PP2UNSMJ.js} +9 -9
  148. package/dist/{review-desktop-OFWPDYGD.js → review-desktop-3JOJFUEJ.js} +9 -9
  149. package/dist/{rpc-TVVQPUOL.js → rpc-7EPTJQQ6.js} +8 -8
  150. package/dist/{run-OCBEZRDW.js → run-P6UJS3D4.js} +6 -6
  151. package/dist/{screencast-start-GTSDA33J.js → screencast-start-ZZYNH2HT.js} +8 -8
  152. package/dist/{screencast-stop-FYBUIXAA.js → screencast-stop-Y6ADFOFA.js} +8 -8
  153. package/dist/{screenshot-OEYRT3SP.js → screenshot-CJB7PMAF.js} +8 -8
  154. package/dist/{scroll-35OFEFC5.js → scroll-BP5MA4ZT.js} +8 -8
  155. package/dist/{scroll-into-view-UQ5RAWIX.js → scroll-into-view-O3RDWLM2.js} +8 -8
  156. package/dist/{select-K56QELVZ.js → select-QLCNRI36.js} +8 -8
  157. package/dist/{serve-5UJ3VMWC.js → serve-OO2MQWGL.js} +7 -7
  158. package/dist/{shopping-FJG7XB4Q.js → shopping-UYHCYPAH.js} +10 -10
  159. package/dist/{snapshot-W7RKVZEI.js → snapshot-SXYZ3CMC.js} +8 -8
  160. package/dist/{status-KHYCLGUD.js → status-AL2AHVA5.js} +7 -7
  161. package/dist/{status-R4EV4TWO.js → status-QQW7REK4.js} +9 -9
  162. package/dist/{status-capabilities-XD3RGLKF.js → status-capabilities-AVHJYQQQ.js} +9 -9
  163. package/dist/{text-TANLFZ4O.js → text-B6Z47EOA.js} +8 -8
  164. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  165. package/dist/tools/product_video_run.d.ts.map +1 -1
  166. package/dist/{type-Y2Y7LX7Y.js → type-LR3F3SQY.js} +8 -8
  167. package/dist/{uncheck-6REVUUB2.js → uncheck-5PJEHR7J.js} +8 -8
  168. package/dist/{upload-GGZC5UQP.js → upload-HQ3QN2OW.js} +8 -8
  169. package/dist/{use-B4Q7CFG2.js → use-KFZLMRUH.js} +7 -7
  170. package/dist/{value-DHOHO55D.js → value-TKUFUK5I.js} +8 -8
  171. package/dist/{visible-S5BTWYNH.js → visible-P5Z2N2QR.js} +8 -8
  172. package/dist/{wait-WV6NZUKL.js → wait-BYSHJPSC.js} +8 -8
  173. package/dist/{windows-GKE36DJQ.js → windows-6GTD25EU.js} +9 -9
  174. package/extension/manifest.json +1 -1
  175. package/package.json +1 -1
  176. package/skills/opendevbrowser-best-practices/SKILL.md +8 -2
  177. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +4 -4
  178. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +7 -0
  179. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +6 -0
  180. package/skills/opendevbrowser-design-agent/SKILL.md +8 -6
  181. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +4 -3
  182. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +28 -4
  183. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +1 -0
  184. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +5 -2
  185. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +8 -2
  186. package/skills/opendevbrowser-motion-design/SKILL.md +1 -1
  187. package/skills/opendevbrowser-motion-design/scripts/validate-skill-assets.sh +1 -0
  188. package/dist/canvas-3AJVL5I5.js.map +0 -1
  189. package/dist/chunk-2X4JFMKJ.js.map +0 -1
  190. package/dist/chunk-37VSRUW4.js.map +0 -1
  191. package/dist/chunk-AKIAGFOE.js.map +0 -1
  192. package/dist/chunk-HBK56JST.js.map +0 -1
  193. package/dist/chunk-RO3SMXF3.js.map +0 -1
  194. package/dist/chunk-SKFB5ICF.js.map +0 -1
  195. package/dist/chunk-ZOVMMQO6.js.map +0 -1
  196. package/dist/help-IG5S5RJD.js.map +0 -1
  197. package/dist/inspiredesign-DB6CHYN3.js.map +0 -1
  198. /package/dist/{accessibility-snapshot-XOP66CSK.js.map → accessibility-snapshot-VCBXK47S.js.map} +0 -0
  199. /package/dist/{active-window-E3WFOQGX.js.map → active-window-7EUN36LZ.js.map} +0 -0
  200. /package/dist/{annotate-MAE7ZJOZ.js.map → annotate-VLBK7YB6.js.map} +0 -0
  201. /package/dist/{attr-M3PFDJ7Q.js.map → attr-JNANQKM6.js.map} +0 -0
  202. /package/dist/{capture-desktop-VJGEETMJ.js.map → capture-desktop-FKVDWTVG.js.map} +0 -0
  203. /package/dist/{capture-window-W5UFSFQL.js.map → capture-window-QVPM2DN2.js.map} +0 -0
  204. /package/dist/{check-4IR3UJVW.js.map → check-V3CWZ56S.js.map} +0 -0
  205. /package/dist/{checked-PKNY7724.js.map → checked-Q27Q6YZN.js.map} +0 -0
  206. /package/dist/{chunk-J3KYGJRQ.js.map → chunk-G6NQ7WYD.js.map} +0 -0
  207. /package/dist/{chunk-XDLJE3RJ.js.map → chunk-NX2XYJP5.js.map} +0 -0
  208. /package/dist/{chunk-AWQ37HSC.js.map → chunk-OJAUKABV.js.map} +0 -0
  209. /package/dist/{chunk-W6YPVNDX.js.map → chunk-VTGG5ZU2.js.map} +0 -0
  210. /package/dist/{chunk-P5K3ZIPI.js.map → chunk-VX47SJZM.js.map} +0 -0
  211. /package/dist/{chunk-BUXFIY2P.js.map → chunk-VY47VKXU.js.map} +0 -0
  212. /package/dist/{chunk-NURQB55J.js.map → chunk-WY72GYAH.js.map} +0 -0
  213. /package/dist/{chunk-PIFHXKV4.js.map → chunk-Z3HIX2SE.js.map} +0 -0
  214. /package/dist/{click-HLNXU4I5.js.map → click-EQDRSLR3.js.map} +0 -0
  215. /package/dist/{clone-component-QIKN5PIM.js.map → clone-component-SISUXTJS.js.map} +0 -0
  216. /package/dist/{clone-page-5C7DTGZT.js.map → clone-page-MLDPCBOY.js.map} +0 -0
  217. /package/dist/{close-WTXB3EDD.js.map → close-2LQMJVOA.js.map} +0 -0
  218. /package/dist/{close-PCRZHX7F.js.map → close-7J7EV237.js.map} +0 -0
  219. /package/dist/{connect-6C2IG55I.js.map → connect-JFRSIW5M.js.map} +0 -0
  220. /package/dist/{console-poll-VJXCZR3F.js.map → console-poll-NSVVUNEC.js.map} +0 -0
  221. /package/dist/{cookie-import-5OEDFB6U.js.map → cookie-import-B7IQTGTN.js.map} +0 -0
  222. /package/dist/{cookie-list-44UNJJ6D.js.map → cookie-list-YHG7JCZZ.js.map} +0 -0
  223. /package/dist/{daemon-CIKGBWEB.js.map → daemon-ENU4FOV4.js.map} +0 -0
  224. /package/dist/{debug-trace-snapshot-RGXAPGWB.js.map → debug-trace-snapshot-KLGU2AWY.js.map} +0 -0
  225. /package/dist/{dialog-S64MJUM2.js.map → dialog-MUVQIERS.js.map} +0 -0
  226. /package/dist/{disconnect-MTIELIM7.js.map → disconnect-KELQJ45J.js.map} +0 -0
  227. /package/dist/{enabled-KF2L7LW4.js.map → enabled-SF6UU5HG.js.map} +0 -0
  228. /package/dist/{goto-ULWINUAZ.js.map → goto-AZQWXYPG.js.map} +0 -0
  229. /package/dist/{hover-NOCOTR6N.js.map → hover-MQRAKKVU.js.map} +0 -0
  230. /package/dist/{html-LXSYP6BT.js.map → html-PLRTU2WS.js.map} +0 -0
  231. /package/dist/{inspector-62EPCLYB.js.map → inspector-IY4GBIT6.js.map} +0 -0
  232. /package/dist/{inspector-audit-T2IF67RJ.js.map → inspector-audit-7MQCRJHD.js.map} +0 -0
  233. /package/dist/{inspector-plan-KQS6LRMW.js.map → inspector-plan-ZAUDHBET.js.map} +0 -0
  234. /package/dist/{launch-B5ES6FVS.js.map → launch-OCTWPTV5.js.map} +0 -0
  235. /package/dist/{list-TIZVR6RO.js.map → list-HUSYADUS.js.map} +0 -0
  236. /package/dist/{list-XM4BP5GM.js.map → list-JWKAMAUA.js.map} +0 -0
  237. /package/dist/{macro-resolve-TTQZVFIW.js.map → macro-resolve-WOXMPZDQ.js.map} +0 -0
  238. /package/dist/{network-poll-NNSY4W63.js.map → network-poll-WHB62OEF.js.map} +0 -0
  239. /package/dist/{new-E6VNAC2A.js.map → new-IKZBYBNK.js.map} +0 -0
  240. /package/dist/{open-F55XKMKB.js.map → open-UA2VI6ZP.js.map} +0 -0
  241. /package/dist/{perf-RE7JE6CP.js.map → perf-DICS3VKH.js.map} +0 -0
  242. /package/dist/{pointer-down-BCBPC5FJ.js.map → pointer-down-2XPRZFJC.js.map} +0 -0
  243. /package/dist/{pointer-drag-QK7KGF7W.js.map → pointer-drag-7NY4BOLH.js.map} +0 -0
  244. /package/dist/{pointer-move-VFAZQAXA.js.map → pointer-move-FWEXMH37.js.map} +0 -0
  245. /package/dist/{pointer-up-FA5WE6LS.js.map → pointer-up-VU2OHK5D.js.map} +0 -0
  246. /package/dist/{press-TNRHNDSW.js.map → press-W7IZ3FCX.js.map} +0 -0
  247. /package/dist/{product-video-UEANMZ2U.js.map → product-video-XCZ6CHR5.js.map} +0 -0
  248. /package/dist/{providers-AMCNWZUL.js.map → providers-XCNSU3T6.js.map} +0 -0
  249. /package/dist/{research-YFY7WJSZ.js.map → research-AYCKHOWK.js.map} +0 -0
  250. /package/dist/{review-NHOPLAT7.js.map → review-PP2UNSMJ.js.map} +0 -0
  251. /package/dist/{review-desktop-OFWPDYGD.js.map → review-desktop-3JOJFUEJ.js.map} +0 -0
  252. /package/dist/{rpc-TVVQPUOL.js.map → rpc-7EPTJQQ6.js.map} +0 -0
  253. /package/dist/{run-OCBEZRDW.js.map → run-P6UJS3D4.js.map} +0 -0
  254. /package/dist/{screencast-start-GTSDA33J.js.map → screencast-start-ZZYNH2HT.js.map} +0 -0
  255. /package/dist/{screencast-stop-FYBUIXAA.js.map → screencast-stop-Y6ADFOFA.js.map} +0 -0
  256. /package/dist/{screenshot-OEYRT3SP.js.map → screenshot-CJB7PMAF.js.map} +0 -0
  257. /package/dist/{scroll-35OFEFC5.js.map → scroll-BP5MA4ZT.js.map} +0 -0
  258. /package/dist/{scroll-into-view-UQ5RAWIX.js.map → scroll-into-view-O3RDWLM2.js.map} +0 -0
  259. /package/dist/{select-K56QELVZ.js.map → select-QLCNRI36.js.map} +0 -0
  260. /package/dist/{serve-5UJ3VMWC.js.map → serve-OO2MQWGL.js.map} +0 -0
  261. /package/dist/{shopping-FJG7XB4Q.js.map → shopping-UYHCYPAH.js.map} +0 -0
  262. /package/dist/{snapshot-W7RKVZEI.js.map → snapshot-SXYZ3CMC.js.map} +0 -0
  263. /package/dist/{status-KHYCLGUD.js.map → status-AL2AHVA5.js.map} +0 -0
  264. /package/dist/{status-R4EV4TWO.js.map → status-QQW7REK4.js.map} +0 -0
  265. /package/dist/{status-capabilities-XD3RGLKF.js.map → status-capabilities-AVHJYQQQ.js.map} +0 -0
  266. /package/dist/{text-TANLFZ4O.js.map → text-B6Z47EOA.js.map} +0 -0
  267. /package/dist/{type-Y2Y7LX7Y.js.map → type-LR3F3SQY.js.map} +0 -0
  268. /package/dist/{uncheck-6REVUUB2.js.map → uncheck-5PJEHR7J.js.map} +0 -0
  269. /package/dist/{upload-GGZC5UQP.js.map → upload-HQ3QN2OW.js.map} +0 -0
  270. /package/dist/{use-B4Q7CFG2.js.map → use-KFZLMRUH.js.map} +0 -0
  271. /package/dist/{value-DHOHO55D.js.map → value-TKUFUK5I.js.map} +0 -0
  272. /package/dist/{visible-S5BTWYNH.js.map → visible-P5Z2N2QR.js.map} +0 -0
  273. /package/dist/{wait-WV6NZUKL.js.map → wait-BYSHJPSC.js.map} +0 -0
  274. /package/dist/{windows-GKE36DJQ.js.map → windows-6GTD25EU.js.map} +0 -0
@@ -46,20 +46,23 @@ import {
46
46
  CANVAS_VALIDATION_TARGET_BLOCK_ON_CODES,
47
47
  CANVAS_VISUAL_DIRECTION_PROFILES,
48
48
  ChallengeOrchestrator,
49
+ buildCanvasCommandValidationEnvelope,
50
+ buildCanvasRepairEnvelope,
49
51
  canonicalizeUrl,
50
52
  createDefaultRuntime,
51
53
  extractStructuredContent,
52
54
  inspectChallengePlanFromRuntime,
53
55
  resolveChallengeAutomationPolicy,
54
56
  resolveProviderRuntimePolicy,
57
+ resolveWorkflowArtifactRoot,
55
58
  toSnippet
56
- } from "./chunk-RO3SMXF3.js";
59
+ } from "./chunk-5FDXH4CS.js";
57
60
  import {
58
61
  buildBlockerArtifacts,
59
62
  classifyBlockerSignal,
60
63
  createLogger,
61
64
  createRequestId
62
- } from "./chunk-WHQZBUNY.js";
65
+ } from "./chunk-3WLCWHIV.js";
63
66
  import {
64
67
  ProviderRuntimeError
65
68
  } from "./chunk-FUSXMW3G.js";
@@ -3660,9 +3663,9 @@ function createCoreRuntimeAssemblies(args2) {
3660
3663
  import { parse, resolve as resolve6 } from "path";
3661
3664
 
3662
3665
  // src/browser/browser-manager.ts
3663
- import { randomUUID as randomUUID10 } from "crypto";
3666
+ import { randomUUID as randomUUID11 } from "crypto";
3664
3667
  import { access as access2, mkdir as mkdir5, rm as rm3, writeFile as writeFile3 } from "fs/promises";
3665
- import { join as join9 } from "path";
3668
+ import { join as join10 } from "path";
3666
3669
  import { freemem, totalmem } from "os";
3667
3670
  import { Mutex } from "async-mutex";
3668
3671
 
@@ -4950,6 +4953,28 @@ function sanitizeWsEndpoint(wsEndpoint) {
4950
4953
  }
4951
4954
  }
4952
4955
 
4956
+ // src/providers/browser-output-artifacts.ts
4957
+ import { randomUUID as randomUUID7 } from "crypto";
4958
+ import { mkdirSync as mkdirSync2 } from "fs";
4959
+ import { join as join7 } from "path";
4960
+ var BROWSER_SCREENSHOT_ARTIFACT_NAMESPACE = "screenshot";
4961
+ var BROWSER_SCREENCAST_ARTIFACT_NAMESPACE = "screencast";
4962
+ var SAFE_BROWSER_ARTIFACT_NAMESPACE_PATTERN = /^[a-z0-9_-]+$/;
4963
+ function createBrowserOutputArtifactDirectory(input) {
4964
+ const namespace = input.namespace.trim();
4965
+ if (namespace.length === 0) {
4966
+ throw new Error("Browser output artifact namespace cannot be empty.");
4967
+ }
4968
+ if (!SAFE_BROWSER_ARTIFACT_NAMESPACE_PATTERN.test(namespace)) {
4969
+ throw new Error("Browser output artifact namespace can only contain lowercase letters, numbers, underscores, and hyphens.");
4970
+ }
4971
+ const root = resolveWorkflowArtifactRoot(void 0, { workspaceRoot: input.workspaceRoot });
4972
+ const runId = randomUUID7();
4973
+ const artifactPath = join7(root, namespace, runId);
4974
+ mkdirSync2(artifactPath, { recursive: true, mode: 448 });
4975
+ return { artifactPath, namespace, runId };
4976
+ }
4977
+
4953
4978
  // src/browser/manager-types.ts
4954
4979
  var SCREENCAST_RETENTION_MS = 10 * 6e4;
4955
4980
 
@@ -5573,7 +5598,7 @@ var SessionStore = class {
5573
5598
  };
5574
5599
 
5575
5600
  // src/browser/target-manager.ts
5576
- import { randomUUID as randomUUID7 } from "crypto";
5601
+ import { randomUUID as randomUUID8 } from "crypto";
5577
5602
  var TARGET_INFO_TIMEOUT_MS = 2e3;
5578
5603
  var TargetManager = class {
5579
5604
  targets = /* @__PURE__ */ new Map();
@@ -5581,7 +5606,7 @@ var TargetManager = class {
5581
5606
  nameToTarget = /* @__PURE__ */ new Map();
5582
5607
  targetToName = /* @__PURE__ */ new Map();
5583
5608
  registerPage(page, name) {
5584
- const targetId = randomUUID7();
5609
+ const targetId = randomUUID8();
5585
5610
  this.targets.set(targetId, page);
5586
5611
  if (!this.activeTargetId) {
5587
5612
  this.activeTargetId = targetId;
@@ -5899,7 +5924,7 @@ import { execFileSync } from "child_process";
5899
5924
  import { createDecipheriv, createHash as createHash3, pbkdf2Sync } from "crypto";
5900
5925
  import { cp, mkdtemp as mkdtemp2, mkdir as mkdir3, rm as rm2, stat as stat3 } from "fs/promises";
5901
5926
  import { tmpdir } from "os";
5902
- import { dirname, join as join7 } from "path";
5927
+ import { dirname, join as join8 } from "path";
5903
5928
  var ROOT_COPY_ENTRIES = ["Local State"];
5904
5929
  var PROFILE_COPY_ENTRIES = [
5905
5930
  "Preferences",
@@ -5957,7 +5982,7 @@ async function stageSystemChromeProfile(source, stagingRoot) {
5957
5982
  let copiedCookieStore = false;
5958
5983
  for (const entry of ROOT_COPY_ENTRIES) {
5959
5984
  try {
5960
- await copyEntry(join7(source.userDataDir, entry), join7(stagingRoot, entry));
5985
+ await copyEntry(join8(source.userDataDir, entry), join8(stagingRoot, entry));
5961
5986
  } catch (error) {
5962
5987
  warnings.push(`Chrome bootstrap skipped ${entry}: ${getErrorMessage(error)}`);
5963
5988
  }
@@ -5965,8 +5990,8 @@ async function stageSystemChromeProfile(source, stagingRoot) {
5965
5990
  for (const entry of PROFILE_COPY_ENTRIES) {
5966
5991
  try {
5967
5992
  const copied = await copyEntry(
5968
- join7(source.profilePath, entry),
5969
- join7(stagingRoot, source.profileDirectory, entry)
5993
+ join8(source.profilePath, entry),
5994
+ join8(stagingRoot, source.profileDirectory, entry)
5970
5995
  );
5971
5996
  if (copied && COOKIE_STORE_ENTRY_SET.has(entry)) {
5972
5997
  copiedCookieStore = true;
@@ -6072,8 +6097,8 @@ async function loadSystemChromeCookiesFromSqlite(source, platform = process.plat
6072
6097
  return { cookies: [], warnings: [], attempted: false };
6073
6098
  }
6074
6099
  const cookieDbCandidates = [
6075
- join7(source.profilePath, "Cookies"),
6076
- join7(source.profilePath, "Network", "Cookies")
6100
+ join8(source.profilePath, "Cookies"),
6101
+ join8(source.profilePath, "Network", "Cookies")
6077
6102
  ];
6078
6103
  const cookieDbPath = await firstExistingPath(cookieDbCandidates);
6079
6104
  if (!cookieDbPath) {
@@ -6143,7 +6168,7 @@ async function loadSystemChromeCookies(executablePath) {
6143
6168
  warnings: direct.warnings
6144
6169
  };
6145
6170
  }
6146
- const stagingRoot = await mkdtemp2(join7(tmpdir(), "opendevbrowser-chrome-cookie-bootstrap-"));
6171
+ const stagingRoot = await mkdtemp2(join8(tmpdir(), "opendevbrowser-chrome-cookie-bootstrap-"));
6147
6172
  try {
6148
6173
  const staged = await stageSystemChromeProfile(source, stagingRoot);
6149
6174
  if (!staged.copiedCookieStore) {
@@ -6201,7 +6226,7 @@ function getErrorMessage(error) {
6201
6226
  }
6202
6227
 
6203
6228
  // src/browser/global-challenge-coordinator.ts
6204
- import { randomUUID as randomUUID8 } from "crypto";
6229
+ import { randomUUID as randomUUID9 } from "crypto";
6205
6230
  var PRESERVE_WINDOW_MS = 15 * 60 * 1e3;
6206
6231
  var VERIFY_WINDOW_MS = 5 * 60 * 1e3;
6207
6232
  var toIso = (value) => value.toISOString();
@@ -6223,7 +6248,7 @@ var GlobalChallengeCoordinator = class {
6223
6248
  claimOrRefresh(args2) {
6224
6249
  const now = args2.now ?? /* @__PURE__ */ new Date();
6225
6250
  const existing = this.bySessionId.get(args2.sessionId);
6226
- const challengeId = existing?.summary.challengeId ?? randomUUID8();
6251
+ const challengeId = existing?.summary.challengeId ?? randomUUID9();
6227
6252
  const previousTimeline = existing?.timeline ?? [];
6228
6253
  const nextEntry = {
6229
6254
  at: toIso(now),
@@ -6315,8 +6340,8 @@ var GlobalChallengeCoordinator = class {
6315
6340
 
6316
6341
  // src/browser/screencast-recorder.ts
6317
6342
  import { copyFile, mkdir as mkdir4, readdir, writeFile as writeFile2 } from "fs/promises";
6318
- import { randomUUID as randomUUID9 } from "crypto";
6319
- import { isAbsolute as isAbsolute2, join as join8, resolve } from "path";
6343
+ import { randomUUID as randomUUID10 } from "crypto";
6344
+ import { isAbsolute as isAbsolute2, join as join9, resolve } from "path";
6320
6345
  var DEFAULT_SCREENCAST_INTERVAL_MS = 1e3;
6321
6346
  var MIN_SCREENCAST_INTERVAL_MS = 250;
6322
6347
  var DEFAULT_SCREENCAST_MAX_FRAMES = 300;
@@ -6363,12 +6388,16 @@ async function ensureEmptyDirectory(path4) {
6363
6388
  }
6364
6389
  await mkdir4(path4, { recursive: true });
6365
6390
  }
6366
- function resolveOutputDir(worktree, sessionId, screencastId, outputDir) {
6391
+ function resolveOutputDir(worktree, outputDir) {
6367
6392
  if (typeof outputDir === "string" && outputDir.trim().length > 0) {
6368
6393
  const trimmed = outputDir.trim();
6369
- return isAbsolute2(trimmed) ? trimmed : resolve(worktree, trimmed);
6394
+ return { outputDir: isAbsolute2(trimmed) ? trimmed : resolve(worktree, trimmed) };
6370
6395
  }
6371
- return join8(worktree, ".opendevbrowser", "replays", "screencasts", sessionId, screencastId);
6396
+ const artifact = createBrowserOutputArtifactDirectory({
6397
+ workspaceRoot: worktree,
6398
+ namespace: BROWSER_SCREENCAST_ARTIFACT_NAMESPACE
6399
+ });
6400
+ return { outputDir: artifact.artifactPath, artifactPath: artifact.artifactPath };
6372
6401
  }
6373
6402
  function renderReplayHtml(manifest) {
6374
6403
  const encodedManifest = JSON.stringify(manifest).replaceAll("<", "\\u003c");
@@ -6468,6 +6497,7 @@ var BrowserScreencastRecorder = class {
6468
6497
  sessionId;
6469
6498
  targetId;
6470
6499
  outputDir;
6500
+ artifactPath;
6471
6501
  startedAt;
6472
6502
  intervalMs;
6473
6503
  maxFrames;
@@ -6488,18 +6518,20 @@ var BrowserScreencastRecorder = class {
6488
6518
  finalPage;
6489
6519
  frames = [];
6490
6520
  constructor(args2) {
6491
- this.screencastId = args2.screencastId ?? randomUUID9();
6521
+ this.screencastId = args2.screencastId ?? randomUUID10();
6492
6522
  this.sessionId = args2.sessionId;
6493
6523
  this.targetId = args2.targetId;
6494
- this.outputDir = resolveOutputDir(args2.worktree, args2.sessionId, this.screencastId, args2.options?.outputDir);
6524
+ const output = resolveOutputDir(args2.worktree, args2.options?.outputDir);
6525
+ this.outputDir = output.outputDir;
6526
+ this.artifactPath = output.artifactPath;
6495
6527
  this.intervalMs = resolveIntervalMs(args2.options?.intervalMs);
6496
6528
  this.maxFrames = resolveMaxFrames(args2.options?.maxFrames);
6497
6529
  this.startedAt = (/* @__PURE__ */ new Date()).toISOString();
6498
6530
  this.startedAtMs = Date.parse(this.startedAt);
6499
- this.framesDir = join8(this.outputDir, FRAMES_DIRECTORY);
6500
- this.manifestPath = join8(this.outputDir, MANIFEST_FILENAME);
6501
- this.replayHtmlPath = join8(this.outputDir, REPLAY_FILENAME);
6502
- this.previewPath = join8(this.outputDir, PREVIEW_FILENAME);
6531
+ this.framesDir = join9(this.outputDir, FRAMES_DIRECTORY);
6532
+ this.manifestPath = join9(this.outputDir, MANIFEST_FILENAME);
6533
+ this.replayHtmlPath = join9(this.outputDir, REPLAY_FILENAME);
6534
+ this.previewPath = join9(this.outputDir, PREVIEW_FILENAME);
6503
6535
  this.captureFrameImpl = args2.captureFrame;
6504
6536
  this.completionPromise = new Promise((resolvePromise) => {
6505
6537
  this.resolveCompletion = resolvePromise;
@@ -6537,6 +6569,7 @@ var BrowserScreencastRecorder = class {
6537
6569
  sessionId: this.sessionId,
6538
6570
  targetId: this.targetId,
6539
6571
  outputDir: this.outputDir,
6572
+ ...this.artifactPath ? { artifact_path: this.artifactPath } : {},
6540
6573
  startedAt: this.startedAt,
6541
6574
  intervalMs: this.intervalMs,
6542
6575
  maxFrames: this.maxFrames,
@@ -6581,7 +6614,7 @@ var BrowserScreencastRecorder = class {
6581
6614
  async captureFrame() {
6582
6615
  const index = this.frames.length + 1;
6583
6616
  const frameFilename = `${String(index).padStart(6, "0")}.png`;
6584
- const framePath = join8(this.framesDir, frameFilename);
6617
+ const framePath = join9(this.framesDir, frameFilename);
6585
6618
  const task = Promise.resolve().then(async () => {
6586
6619
  const capturedAt = (/* @__PURE__ */ new Date()).toISOString();
6587
6620
  const result = await this.captureFrameImpl(framePath);
@@ -6597,7 +6630,7 @@ var BrowserScreencastRecorder = class {
6597
6630
  index,
6598
6631
  capturedAt,
6599
6632
  elapsedMs: Math.max(Date.parse(capturedAt) - this.startedAtMs, 0),
6600
- relativePath: normalizeRelativePath(join8(FRAMES_DIRECTORY, frameFilename))
6633
+ relativePath: normalizeRelativePath(join9(FRAMES_DIRECTORY, frameFilename))
6601
6634
  });
6602
6635
  if (this.frames.length === 1) {
6603
6636
  await copyFile(framePath, this.previewPath);
@@ -6662,6 +6695,7 @@ var BrowserScreencastRecorder = class {
6662
6695
  sessionId: this.sessionId,
6663
6696
  targetId: this.targetId,
6664
6697
  outputDir: this.outputDir,
6698
+ ...this.artifactPath ? { artifact_path: this.artifactPath } : {},
6665
6699
  startedAt: this.startedAt,
6666
6700
  endedAt,
6667
6701
  endedReason: reason,
@@ -7058,7 +7092,7 @@ var BrowserManager = class {
7058
7092
  warnings.push("System Chrome not found. Downloaded Chrome for Testing.");
7059
7093
  executablePath = download.executablePath;
7060
7094
  }
7061
- const profileDir = persistProfile ? cachePaths.profileDir : join9(cachePaths.projectRoot, "temp-profiles", randomUUID10());
7095
+ const profileDir = persistProfile ? cachePaths.profileDir : join10(cachePaths.projectRoot, "temp-profiles", randomUUID11());
7062
7096
  await mkdir5(profileDir, { recursive: true });
7063
7097
  let context = null;
7064
7098
  try {
@@ -7073,7 +7107,7 @@ var BrowserManager = class {
7073
7107
  if (!browser) {
7074
7108
  throw new Error("Browser instance unavailable");
7075
7109
  }
7076
- const sessionId = randomUUID10();
7110
+ const sessionId = randomUUID11();
7077
7111
  const targets = new TargetManager();
7078
7112
  const pages = context.pages();
7079
7113
  if (pages.length === 0) {
@@ -8180,9 +8214,18 @@ var BrowserManager = class {
8180
8214
  throw new Error("Screenshot ref and fullPage options are mutually exclusive.");
8181
8215
  }
8182
8216
  return this.runTargetScoped(sessionId, options.targetId, async ({ managed, page, targetId: resolvedTargetId }) => {
8217
+ let artifact;
8218
+ let outputPath = options.path;
8219
+ if (typeof outputPath !== "string") {
8220
+ artifact = createBrowserOutputArtifactDirectory({
8221
+ workspaceRoot: this.worktree,
8222
+ namespace: BROWSER_SCREENSHOT_ARTIFACT_NAMESPACE
8223
+ });
8224
+ outputPath = join10(artifact.artifactPath, "capture.png");
8225
+ }
8183
8226
  const screenshotOptions = {
8184
8227
  type: "png",
8185
- path: options.path
8228
+ path: outputPath
8186
8229
  };
8187
8230
  if (options.ref) {
8188
8231
  await this.callFunctionOnResolvedRef(managed, options.ref, DOM_SCROLL_INTO_VIEW_DECLARATION, [], resolvedTargetId);
@@ -8192,30 +8235,26 @@ var BrowserManager = class {
8192
8235
  screenshotOptions.fullPage = true;
8193
8236
  }
8194
8237
  try {
8195
- if (options.path) {
8196
- await this.withLegacyExtensionOperationTimeout(
8197
- managed,
8198
- page.screenshot(screenshotOptions),
8199
- `page.screenshot: Timeout ${LEGACY_EXTENSION_OPERATION_TIMEOUT_MS}ms exceeded.`
8200
- );
8201
- return { path: options.path };
8202
- }
8203
- const buffer = await this.withLegacyExtensionOperationTimeout(
8238
+ await this.withLegacyExtensionOperationTimeout(
8204
8239
  managed,
8205
8240
  page.screenshot(screenshotOptions),
8206
8241
  `page.screenshot: Timeout ${LEGACY_EXTENSION_OPERATION_TIMEOUT_MS}ms exceeded.`
8207
8242
  );
8208
- return { base64: buffer.toString("base64") };
8243
+ return {
8244
+ path: outputPath,
8245
+ ...artifact ? { artifact_path: artifact.artifactPath } : {}
8246
+ };
8209
8247
  } catch (error) {
8210
8248
  const fallback = await this.captureScreenshotViaCdp(managed, page, error, options);
8211
8249
  if (!fallback) {
8212
8250
  throw error;
8213
8251
  }
8214
- if (options.path) {
8215
- await writeFile3(options.path, Buffer.from(fallback.base64, "base64"));
8216
- return fallback.warnings ? { path: options.path, warnings: fallback.warnings } : { path: options.path };
8217
- }
8218
- return fallback;
8252
+ await writeFile3(outputPath, Buffer.from(fallback.base64, "base64"));
8253
+ return {
8254
+ path: outputPath,
8255
+ ...artifact ? { artifact_path: artifact.artifactPath } : {},
8256
+ ...fallback.warnings ? { warnings: fallback.warnings } : {}
8257
+ };
8219
8258
  }
8220
8259
  });
8221
8260
  }
@@ -10510,7 +10549,7 @@ var BrowserManager = class {
10510
10549
  }
10511
10550
  context = await browser.newContext();
10512
10551
  }
10513
- const sessionId = randomUUID10();
10552
+ const sessionId = randomUUID11();
10514
10553
  const targets = new TargetManager();
10515
10554
  const pages = context.pages();
10516
10555
  if (pages.length === 0) {
@@ -10703,7 +10742,8 @@ function truncateText(value, maxChars) {
10703
10742
 
10704
10743
  // src/browser/ops-browser-manager.ts
10705
10744
  import { writeFile as writeFile4 } from "fs/promises";
10706
- import { randomUUID as randomUUID11 } from "crypto";
10745
+ import { randomUUID as randomUUID12 } from "crypto";
10746
+ import { join as join11 } from "path";
10707
10747
  var OpsBrowserManager = class {
10708
10748
  base;
10709
10749
  config;
@@ -10837,7 +10877,7 @@ var OpsBrowserManager = class {
10837
10877
  config: this.config
10838
10878
  });
10839
10879
  const client = await this.ensureOpsClient(connectEndpoint);
10840
- const leaseId = randomUUID11();
10880
+ const leaseId = randomUUID12();
10841
10881
  const result = await client.request(
10842
10882
  "session.connect",
10843
10883
  {
@@ -11309,11 +11349,21 @@ var OpsBrowserManager = class {
11309
11349
  throw new Error("Screenshot failed");
11310
11350
  }
11311
11351
  const warnings = Array.isArray(result.warnings) ? result.warnings : typeof result.warning === "string" ? [result.warning] : void 0;
11312
- if (options.path) {
11313
- await writeFile4(options.path, Buffer.from(result.base64, "base64"));
11314
- return warnings ? { path: options.path, warnings } : { path: options.path };
11352
+ let artifact;
11353
+ let outputPath = options.path;
11354
+ if (typeof outputPath !== "string") {
11355
+ artifact = createBrowserOutputArtifactDirectory({
11356
+ workspaceRoot: this.worktree,
11357
+ namespace: BROWSER_SCREENSHOT_ARTIFACT_NAMESPACE
11358
+ });
11359
+ outputPath = join11(artifact.artifactPath, "capture.png");
11315
11360
  }
11316
- return warnings ? { base64: result.base64, warnings } : { base64: result.base64 };
11361
+ await writeFile4(outputPath, Buffer.from(result.base64, "base64"));
11362
+ return {
11363
+ path: outputPath,
11364
+ ...artifact ? { artifact_path: artifact.artifactPath } : {},
11365
+ ...warnings ? { warnings } : {}
11366
+ };
11317
11367
  }
11318
11368
  async startScreencast(sessionId, options = {}) {
11319
11369
  if (!this.opsSessions.has(sessionId)) {
@@ -12208,7 +12258,7 @@ var normalizeRecoverableOpsUrl = (url) => {
12208
12258
  };
12209
12259
 
12210
12260
  // src/browser/annotation-manager.ts
12211
- import { randomUUID as randomUUID13 } from "crypto";
12261
+ import { randomUUID as randomUUID14 } from "crypto";
12212
12262
  import { WebSocket as WebSocket2 } from "ws";
12213
12263
 
12214
12264
  // src/annotate/timeout-messages.ts
@@ -12219,9 +12269,9 @@ var getAnnotationTimeoutMessage = (readySeen) => {
12219
12269
  };
12220
12270
 
12221
12271
  // src/annotate/direct-annotator.ts
12222
- import { randomUUID as randomUUID12 } from "crypto";
12272
+ import { randomUUID as randomUUID13 } from "crypto";
12223
12273
  import { existsSync as existsSync2 } from "fs";
12224
- import { join as join10 } from "path";
12274
+ import { join as join12 } from "path";
12225
12275
  var DEFAULT_TIMEOUT_MS = 12e4;
12226
12276
  var DIRECT_ANNOTATE_REQUIRED_FILES = [
12227
12277
  "dist/annotate-content.js",
@@ -12236,15 +12286,15 @@ function resolveDirectAnnotateAssets(resolvePath = () => getExtensionRuntimePath
12236
12286
  if (!extensionPath) {
12237
12287
  return { error: "Extension assets unavailable." };
12238
12288
  }
12239
- const scriptPath = join10(extensionPath, "dist", "annotate-content.js");
12240
- const stylePath = join10(extensionPath, "dist", "annotate-content.css");
12289
+ const scriptPath = join12(extensionPath, "dist", "annotate-content.js");
12290
+ const stylePath = join12(extensionPath, "dist", "annotate-content.css");
12241
12291
  if (!existsSync2(scriptPath) || !existsSync2(stylePath)) {
12242
12292
  return { error: "Direct annotate assets missing. Run `npm run extension:build` and retry." };
12243
12293
  }
12244
12294
  return { assets: { scriptPath, stylePath } };
12245
12295
  }
12246
12296
  async function runDirectAnnotate(manager, assets, request) {
12247
- const requestId = randomUUID12();
12297
+ const requestId = randomUUID13();
12248
12298
  const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;
12249
12299
  return manager.withPage(request.sessionId, request.targetId ?? null, async (page) => {
12250
12300
  await ensureBindings(page);
@@ -12544,7 +12594,7 @@ var AnnotationManager = class {
12544
12594
  return this.requestRelay(options, false);
12545
12595
  }
12546
12596
  async requestStored(options) {
12547
- const requestId = randomUUID13();
12597
+ const requestId = randomUUID14();
12548
12598
  const sharedPayload = this.agentInbox?.latestPayload();
12549
12599
  if (sharedPayload) {
12550
12600
  return {
@@ -12589,7 +12639,7 @@ var AnnotationManager = class {
12589
12639
  return this.relay?.getAnnotationUrl?.() ?? (this.config.relayPort > 0 ? `ws://127.0.0.1:${this.config.relayPort}/annotation` : null);
12590
12640
  }
12591
12641
  async requestDirect(options) {
12592
- const requestId = randomUUID13();
12642
+ const requestId = randomUUID14();
12593
12643
  if (!options.sessionId) {
12594
12644
  return {
12595
12645
  version: 1,
@@ -12637,7 +12687,7 @@ var AnnotationManager = class {
12637
12687
  }
12638
12688
  }
12639
12689
  async requestRelay(options, requireExtension, commandName = "start") {
12640
- const requestId = randomUUID13();
12690
+ const requestId = randomUUID14();
12641
12691
  const timeoutMs = options.timeoutMs ?? 12e4;
12642
12692
  let resolvedTabId = options.tabId;
12643
12693
  if (requireExtension && options.sessionId && this.manager) {
@@ -12864,12 +12914,12 @@ var parseJson2 = (data) => {
12864
12914
  };
12865
12915
 
12866
12916
  // src/browser/canvas-manager.ts
12867
- import { randomUUID as randomUUID18 } from "crypto";
12917
+ import { randomUUID as randomUUID19 } from "crypto";
12868
12918
  import { mkdir as mkdir9 } from "fs/promises";
12869
12919
  import { dirname as dirname5 } from "path";
12870
12920
 
12871
12921
  // src/browser/canvas-client.ts
12872
- import { randomUUID as randomUUID14 } from "crypto";
12922
+ import { randomUUID as randomUUID15 } from "crypto";
12873
12923
  import { WebSocket as WebSocket3 } from "ws";
12874
12924
  var CanvasClient = class {
12875
12925
  url;
@@ -13045,7 +13095,7 @@ var CanvasClient = class {
13045
13095
  if (!this.socket || this.socket.readyState !== WebSocket3.OPEN) {
13046
13096
  await this.connect();
13047
13097
  }
13048
- const requestId = randomUUID14();
13098
+ const requestId = randomUUID15();
13049
13099
  const request = {
13050
13100
  type: "canvas_request",
13051
13101
  requestId,
@@ -13191,7 +13241,7 @@ var CanvasClient = class {
13191
13241
  if (!this.socket || this.socket.readyState !== WebSocket3.OPEN) {
13192
13242
  return;
13193
13243
  }
13194
- const id2 = randomUUID14();
13244
+ const id2 = randomUUID15();
13195
13245
  const ping = { type: "canvas_ping", id: id2 };
13196
13246
  await new Promise((resolve7, reject) => {
13197
13247
  const timeoutId = setTimeout(() => {
@@ -13258,7 +13308,7 @@ var isCanvasEvent = (value) => {
13258
13308
  var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
13259
13309
 
13260
13310
  // src/canvas/document-store.ts
13261
- import { randomUUID as randomUUID15 } from "crypto";
13311
+ import { randomUUID as randomUUID16 } from "crypto";
13262
13312
 
13263
13313
  // node_modules/lib0/map.js
13264
13314
  var create = () => /* @__PURE__ */ new Map();
@@ -21565,7 +21615,7 @@ function createDefaultNode(pageId, nodeId, name) {
21565
21615
  metadata: {}
21566
21616
  };
21567
21617
  }
21568
- function createDefaultCanvasDocument(documentId = `dc_${randomUUID15()}`) {
21618
+ function createDefaultCanvasDocument(documentId = `dc_${randomUUID16()}`) {
21569
21619
  const createdAt = nowIso();
21570
21620
  const rootNodeId = `node_root_${documentId.slice(-8)}`;
21571
21621
  const pageId = "page_home";
@@ -21613,7 +21663,7 @@ function normalizeCanvasDocument(input) {
21613
21663
  const updatedAt = typeof base.updatedAt === "string" ? base.updatedAt : createdAt;
21614
21664
  return {
21615
21665
  schemaVersion: typeof base.schemaVersion === "string" ? base.schemaVersion : CANVAS_SCHEMA_VERSION,
21616
- documentId: typeof base.documentId === "string" ? base.documentId : `dc_${randomUUID15()}`,
21666
+ documentId: typeof base.documentId === "string" ? base.documentId : `dc_${randomUUID16()}`,
21617
21667
  title: typeof base.title === "string" && base.title.trim() ? base.title : "Untitled Design Canvas",
21618
21668
  createdAt,
21619
21669
  updatedAt,
@@ -21646,7 +21696,7 @@ function normalizeCanvasDocument(input) {
21646
21696
  componentInventory: normalizeArray(base.componentInventory, normalizeCanvasComponentInventoryItem),
21647
21697
  tokens: normalizeCanvasTokenStore(base.tokens),
21648
21698
  assets: Array.isArray(base.assets) ? base.assets.map((asset) => ({
21649
- id: typeof asset.id === "string" ? asset.id : `asset_${randomUUID15()}`,
21699
+ id: typeof asset.id === "string" ? asset.id : `asset_${randomUUID16()}`,
21650
21700
  sourceType: typeof asset.sourceType === "string" ? asset.sourceType : void 0,
21651
21701
  kind: typeof asset.kind === "string" ? asset.kind : void 0,
21652
21702
  repoPath: typeof asset.repoPath === "string" ? asset.repoPath : null,
@@ -21878,7 +21928,7 @@ function buildInventoryItemFromNode(document2, nodeId, options = {}) {
21878
21928
  const origin = options.origin && CANVAS_INVENTORY_ORIGINS.has(options.origin) ? options.origin : baseOrigin;
21879
21929
  const template = buildInventoryTemplate(document2, nodeId);
21880
21930
  return normalizeCanvasComponentInventoryItem({
21881
- id: options.itemId ?? `inventory_${randomUUID15().slice(0, 8)}`,
21931
+ id: options.itemId ?? `inventory_${randomUUID16().slice(0, 8)}`,
21882
21932
  name: options.name ?? node.name,
21883
21933
  componentName: binding?.componentName ?? node.name,
21884
21934
  description: options.description ?? null,
@@ -22871,7 +22921,7 @@ var CanvasDocumentStore = class {
22871
22921
  }
22872
22922
  this.replaceDocument(nextDocument, this.revision + 1, "canvas.store.apply-patches");
22873
22923
  return {
22874
- transactionId: `txn_${randomUUID15()}`,
22924
+ transactionId: `txn_${randomUUID16()}`,
22875
22925
  appliedRevision: this.revision,
22876
22926
  warnings: evaluateCanvasWarnings(this.document),
22877
22927
  evidenceRefs: []
@@ -22886,7 +22936,7 @@ var CanvasDocumentStore = class {
22886
22936
  }
22887
22937
  this.replaceDocument(normalizeCanvasDocument(document2), this.revision + 1, "canvas.store.replace-document");
22888
22938
  return {
22889
- transactionId: `txn_${randomUUID15()}`,
22939
+ transactionId: `txn_${randomUUID16()}`,
22890
22940
  appliedRevision: this.revision,
22891
22941
  warnings: evaluateCanvasWarnings(this.document),
22892
22942
  evidenceRefs: []
@@ -23381,7 +23431,7 @@ function duplicateNodeSubtree(document2, nodeId, parentId, index, idMapInput) {
23381
23431
  throw new Error(`Unknown node: ${sourceNodeId}`);
23382
23432
  }
23383
23433
  const mappedId = isRecord4(idMapInput) ? idMapInput[sourceNode.id] : null;
23384
- const duplicateId = typeof mappedId === "string" && mappedId.trim().length > 0 ? mappedId : `${sourceNode.id}_copy_${randomUUID15().slice(0, 8)}`;
23434
+ const duplicateId = typeof mappedId === "string" && mappedId.trim().length > 0 ? mappedId : `${sourceNode.id}_copy_${randomUUID16().slice(0, 8)}`;
23385
23435
  idMap.set(sourceNode.id, duplicateId);
23386
23436
  const nextMetadata = clone(sourceNode.metadata);
23387
23437
  if (isRecord4(nextMetadata.codeSync)) {
@@ -24933,7 +24983,7 @@ function listBuiltInCanvasKitIds() {
24933
24983
 
24934
24984
  // src/canvas/repo-store.ts
24935
24985
  import { access as access3, mkdir as mkdir6, readFile as readFile2 } from "fs/promises";
24936
- import { join as join11, dirname as dirname2, isAbsolute as isAbsolute3, resolve as resolve2 } from "path";
24986
+ import { join as join13, dirname as dirname2, isAbsolute as isAbsolute3, resolve as resolve2 } from "path";
24937
24987
 
24938
24988
  // src/canvas/code-sync/manifest.ts
24939
24989
  var isRecord6 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
@@ -25117,20 +25167,20 @@ function resolveCanvasRepoPath(worktree, documentId, repoPath) {
25117
25167
  if (repoPath && repoPath.trim()) {
25118
25168
  return isAbsolute3(repoPath) ? repoPath : resolve2(worktree, repoPath);
25119
25169
  }
25120
- return join11(worktree, ".opendevbrowser", "canvas", `${documentId}.canvas.json`);
25170
+ return join13(worktree, ".opendevbrowser", "canvas", `${documentId}.canvas.json`);
25121
25171
  }
25122
25172
  function resolveCanvasCodeSyncManifestPath(worktree, documentId, bindingId, repoPath) {
25123
25173
  if (repoPath && repoPath.trim()) {
25124
25174
  return isAbsolute3(repoPath) ? repoPath : resolve2(worktree, repoPath);
25125
25175
  }
25126
- return join11(worktree, ".opendevbrowser", "canvas", "code-sync", documentId, `${bindingId}.json`);
25176
+ return join13(worktree, ".opendevbrowser", "canvas", "code-sync", documentId, `${bindingId}.json`);
25127
25177
  }
25128
25178
  function resolveCanvasFigmaAssetDir(worktree, fileKey) {
25129
- return join11(worktree, ".opendevbrowser", "canvas", "assets", "figma", fileKey);
25179
+ return join13(worktree, ".opendevbrowser", "canvas", "assets", "figma", fileKey);
25130
25180
  }
25131
25181
  function resolveCanvasFigmaAssetPath(worktree, fileKey, assetId, extension) {
25132
25182
  const normalizedExtension = extension.startsWith(".") ? extension : `.${extension}`;
25133
- return join11(resolveCanvasFigmaAssetDir(worktree, fileKey), `${assetId}${normalizedExtension}`);
25183
+ return join13(resolveCanvasFigmaAssetDir(worktree, fileKey), `${assetId}${normalizedExtension}`);
25134
25184
  }
25135
25185
  async function saveCanvasDocument(worktree, document2, repoPath) {
25136
25186
  const resolvedPath = resolveCanvasRepoPath(worktree, document2.documentId, repoPath);
@@ -25538,7 +25588,7 @@ import { resolve as resolve5, isAbsolute as isAbsolute5 } from "path";
25538
25588
  // src/canvas/adapter-plugins/loader.ts
25539
25589
  import { createHash as createHash4 } from "crypto";
25540
25590
  import { access as access4, readFile as readFile3 } from "fs/promises";
25541
- import { dirname as dirname3, isAbsolute as isAbsolute4, join as join12, resolve as resolve4 } from "path";
25591
+ import { dirname as dirname3, isAbsolute as isAbsolute4, join as join14, resolve as resolve4 } from "path";
25542
25592
  import { pathToFileURL } from "url";
25543
25593
 
25544
25594
  // src/canvas/adapter-plugins/manifest.ts
@@ -25634,7 +25684,7 @@ async function readJson(filePath) {
25634
25684
  return JSON.parse(await readFile3(filePath, "utf8"));
25635
25685
  }
25636
25686
  async function loadPackageJson(worktree) {
25637
- const packagePath = join12(worktree, "package.json");
25687
+ const packagePath = join14(worktree, "package.json");
25638
25688
  try {
25639
25689
  return await readJson(packagePath);
25640
25690
  } catch (error) {
@@ -25682,14 +25732,14 @@ function applyDeclarationOverrides(manifest, declaration) {
25682
25732
  async function resolveDeclarationRef(worktree, ref) {
25683
25733
  const direct = isAbsolute4(ref) ? ref : resolve4(worktree, ref);
25684
25734
  if (await exists(direct)) {
25685
- const manifestPath2 = direct.endsWith(".json") ? direct : join12(direct, "canvas-adapter.plugin.json");
25735
+ const manifestPath2 = direct.endsWith(".json") ? direct : join14(direct, "canvas-adapter.plugin.json");
25686
25736
  return {
25687
25737
  packageRoot: direct.endsWith(".json") ? dirname3(direct) : direct,
25688
25738
  manifestPath: manifestPath2
25689
25739
  };
25690
25740
  }
25691
- const nodeModulesPath = join12(worktree, "node_modules", ref);
25692
- const manifestPath = join12(nodeModulesPath, "canvas-adapter.plugin.json");
25741
+ const nodeModulesPath = join14(worktree, "node_modules", ref);
25742
+ const manifestPath = join14(nodeModulesPath, "canvas-adapter.plugin.json");
25693
25743
  return {
25694
25744
  packageRoot: nodeModulesPath,
25695
25745
  manifestPath
@@ -25700,7 +25750,7 @@ async function readDeclarationSource(worktree) {
25700
25750
  const openDevBrowserConfig = isRecord7(packageJson.opendevbrowser) ? packageJson.opendevbrowser : null;
25701
25751
  const canvasConfig = openDevBrowserConfig && isRecord7(openDevBrowserConfig.canvas) ? openDevBrowserConfig.canvas : null;
25702
25752
  const packageDeclarations = Array.isArray(canvasConfig?.adapterPlugins) ? canvasConfig.adapterPlugins : [];
25703
- const repoFile = join12(worktree, ".opendevbrowser", "canvas", "adapters.json");
25753
+ const repoFile = join14(worktree, ".opendevbrowser", "canvas", "adapters.json");
25704
25754
  const repoDeclarations = await exists(repoFile) ? (await readJson(repoFile)).adapterPlugins ?? [] : [];
25705
25755
  return { packageDeclarations, repoDeclarations };
25706
25756
  }
@@ -25746,7 +25796,7 @@ function applyCapabilityOverridesToRegisteredAdapters(params2) {
25746
25796
  async function fingerprintPluginFiles(manifestPath, packageRoot, manifest) {
25747
25797
  const entryPath = resolve4(packageRoot, manifest.entry);
25748
25798
  const fixturePath = resolve4(packageRoot, manifest.fixtureDir);
25749
- const packageJsonPath = join12(packageRoot, "package.json");
25799
+ const packageJsonPath = join14(packageRoot, "package.json");
25750
25800
  const [manifestContent, entryContent, packageJsonContent] = await Promise.all([
25751
25801
  readFile3(manifestPath, "utf8"),
25752
25802
  readFile3(entryPath, "utf8"),
@@ -27100,7 +27150,7 @@ function collectGraphOrder(graph, nodeKey) {
27100
27150
  }
27101
27151
 
27102
27152
  // src/canvas/code-sync/import.ts
27103
- import { randomUUID as randomUUID16 } from "crypto";
27153
+ import { randomUUID as randomUUID17 } from "crypto";
27104
27154
 
27105
27155
  // src/canvas/code-sync/graph.ts
27106
27156
  function locatorKey(locator) {
@@ -27230,7 +27280,7 @@ function buildNodeName(graphNode) {
27230
27280
  return graphNode.tagName ?? "Element";
27231
27281
  }
27232
27282
  function buildNodeId(graphNode, manifestLookup) {
27233
- return manifestLookup.get(locatorKey(graphNode.locator)) ?? `node_sync_${randomUUID16().slice(0, 8)}`;
27283
+ return manifestLookup.get(locatorKey(graphNode.locator)) ?? `node_sync_${randomUUID17().slice(0, 8)}`;
27234
27284
  }
27235
27285
  function preorder(graph, nodeKey) {
27236
27286
  const node = graph.nodes[nodeKey];
@@ -28198,11 +28248,11 @@ function maxIso(values) {
28198
28248
  }
28199
28249
 
28200
28250
  // src/browser/canvas-session-sync-manager.ts
28201
- import { randomUUID as randomUUID17 } from "crypto";
28251
+ import { randomUUID as randomUUID18 } from "crypto";
28202
28252
  var CanvasSessionSyncManager = class {
28203
28253
  sessions = /* @__PURE__ */ new Map();
28204
28254
  initializeSession(canvasSessionId, leaseId, clientId) {
28205
- const initialClientId = normalizeClientId(clientId) ?? `canvas_owner_${randomUUID17().slice(0, 8)}`;
28255
+ const initialClientId = normalizeClientId(clientId) ?? `canvas_owner_${randomUUID18().slice(0, 8)}`;
28206
28256
  const attachedAt = (/* @__PURE__ */ new Date()).toISOString();
28207
28257
  const attachedClients = /* @__PURE__ */ new Map();
28208
28258
  attachedClients.set(initialClientId, {
@@ -28230,7 +28280,7 @@ var CanvasSessionSyncManager = class {
28230
28280
  if (!state) {
28231
28281
  throw new Error(`Unknown canvas session for attach: ${canvasSessionId}`);
28232
28282
  }
28233
- const resolvedClientId = normalizeClientId(clientId) ?? `canvas_client_${randomUUID17().slice(0, 8)}`;
28283
+ const resolvedClientId = normalizeClientId(clientId) ?? `canvas_client_${randomUUID18().slice(0, 8)}`;
28234
28284
  const previous = state.attachedClients.get(resolvedClientId);
28235
28285
  const attachedAt = previous?.attachedAt ?? (/* @__PURE__ */ new Date()).toISOString();
28236
28286
  let role = "observer";
@@ -29432,14 +29482,22 @@ function optionalString4(value) {
29432
29482
  }
29433
29483
 
29434
29484
  // src/canvas/guidance.ts
29435
- var PREPLAN_CANVAS_GUIDANCE = {
29485
+ var withRepairEnvelope = (guidance, envelope) => ({
29486
+ ...guidance,
29487
+ nextStepGuidance: envelope.nextStepGuidance,
29488
+ paramsExamples: envelope.paramsExamples,
29489
+ fieldExamples: envelope.fieldExamples,
29490
+ validationChecks: envelope.validationChecks,
29491
+ doNotProceedIf: envelope.doNotProceedIf
29492
+ });
29493
+ var PREPLAN_CANVAS_GUIDANCE = withRepairEnvelope({
29436
29494
  recommendedNextCommands: ["canvas.plan.set"],
29437
29495
  reason: "Handshake is complete. Submit a complete generationPlan before mutation."
29438
- };
29439
- var INVALID_PLAN_CANVAS_GUIDANCE = {
29496
+ }, buildCanvasRepairEnvelope({ reasonCode: "plan_required" }));
29497
+ var INVALID_PLAN_CANVAS_GUIDANCE = withRepairEnvelope({
29440
29498
  recommendedNextCommands: ["canvas.plan.set"],
29441
29499
  reason: "generationPlan is invalid. Submit a supported plan before mutation."
29442
- };
29500
+ }, buildCanvasRepairEnvelope({ reasonCode: "generation_plan_invalid" }));
29443
29501
  var PLAN_ACCEPTED_CANVAS_GUIDANCE = {
29444
29502
  recommendedNextCommands: ["canvas.document.patch", "canvas.preview.render", "canvas.feedback.poll", "canvas.document.save"],
29445
29503
  reason: "generationPlan is accepted. Patch the document, render the preview, inspect feedback, and save when the iteration is stable."
@@ -29482,7 +29540,12 @@ var CANVAS_REQUIRED_COMMANDS_BY_BLOCKER = {
29482
29540
  };
29483
29541
  var cloneCanvasGuidance = (guidance) => ({
29484
29542
  recommendedNextCommands: [...guidance.recommendedNextCommands],
29485
- reason: guidance.reason
29543
+ reason: guidance.reason,
29544
+ ...guidance.nextStepGuidance ? { nextStepGuidance: structuredClone(guidance.nextStepGuidance) } : {},
29545
+ ...guidance.paramsExamples ? { paramsExamples: structuredClone(guidance.paramsExamples) } : {},
29546
+ ...guidance.fieldExamples ? { fieldExamples: structuredClone(guidance.fieldExamples) } : {},
29547
+ ...guidance.validationChecks ? { validationChecks: structuredClone(guidance.validationChecks) } : {},
29548
+ ...guidance.doNotProceedIf ? { doNotProceedIf: [...guidance.doNotProceedIf] } : {}
29486
29549
  });
29487
29550
  var buildCanvasCommandGuidance = (input) => {
29488
29551
  if (input.planStatus === "invalid") {
@@ -29571,6 +29634,13 @@ var CanvasManager = class {
29571
29634
  });
29572
29635
  }
29573
29636
  async execute(command, params2 = {}) {
29637
+ const validationEnvelope = buildCanvasCommandValidationEnvelope(command, params2);
29638
+ if (validationEnvelope) {
29639
+ throw attachDetails(new Error(validationEnvelope.message), {
29640
+ code: validationEnvelope.code,
29641
+ details: validationEnvelope
29642
+ });
29643
+ }
29574
29644
  switch (command) {
29575
29645
  case "canvas.session.open":
29576
29646
  return await this.openSession(params2);
@@ -29653,8 +29723,8 @@ var CanvasManager = class {
29653
29723
  const repoRoot = optionalString5(params2.repoRoot) ?? this.worktree;
29654
29724
  const mode = requireCanvasSessionMode(params2.mode);
29655
29725
  const document2 = repoPath ? normalizeCanvasDocument(await loadCanvasDocument(repoRoot, repoPath)) : createDefaultCanvasDocument(requestedDocumentId ?? void 0);
29656
- const sessionId = `canvas_${randomUUID18()}`;
29657
- const leaseId = `lease_${randomUUID18()}`;
29726
+ const sessionId = `canvas_${randomUUID19()}`;
29727
+ const leaseId = `lease_${randomUUID19()}`;
29658
29728
  const planState = resolveGenerationPlanState(document2.designGovernance.generationPlan);
29659
29729
  const session = {
29660
29730
  canvasSessionId: sessionId,
@@ -29696,7 +29766,7 @@ var CanvasManager = class {
29696
29766
  attachSession(params2) {
29697
29767
  const session = this.requireSession(params2);
29698
29768
  const attachMode = requireAttachMode(params2.attachMode);
29699
- const nextLeaseId = attachMode === "lease_reclaim" ? `lease_${randomUUID18()}` : session.leaseId;
29769
+ const nextLeaseId = attachMode === "lease_reclaim" ? `lease_${randomUUID19()}` : session.leaseId;
29700
29770
  const attached = this.sessionSyncManager.attach(
29701
29771
  session.canvasSessionId,
29702
29772
  nextLeaseId,
@@ -29769,10 +29839,9 @@ var CanvasManager = class {
29769
29839
  setPlan(params2) {
29770
29840
  const session = this.requireSession(params2);
29771
29841
  this.assertLease(session, params2);
29772
- const plan = requireRecord(params2.generationPlan, "generationPlan");
29773
29842
  session.planStatus = "submitted";
29774
29843
  session.preflightState = "plan_submitted";
29775
- const validation = validateGenerationPlan(plan);
29844
+ const validation = validateGenerationPlan(params2.generationPlan);
29776
29845
  if (!validation.ok) {
29777
29846
  session.planStatus = "invalid";
29778
29847
  session.preflightState = "plan_invalid";
@@ -30054,7 +30123,7 @@ var CanvasManager = class {
30054
30123
  const session = this.requireSession(params2);
30055
30124
  this.assertLease(session, params2);
30056
30125
  const nodeId = requireString2(params2.nodeId, "nodeId");
30057
- const bindingId = optionalString5(params2.bindingId) ?? `binding_sync_${randomUUID18().slice(0, 8)}`;
30126
+ const bindingId = optionalString5(params2.bindingId) ?? `binding_sync_${randomUUID19().slice(0, 8)}`;
30058
30127
  const binding = createCodeSyncBinding(params2, nodeId, bindingId);
30059
30128
  const baseRevision = session.store.getRevision();
30060
30129
  await this.applyDocumentPatches(session, baseRevision, [{
@@ -30838,7 +30907,7 @@ var CanvasManager = class {
30838
30907
  prototypeId
30839
30908
  });
30840
30909
  } else if (status.mode === "extension" && this.supportsOpsOverlayTransport(session) && typeof this.browserManager.mountCanvasOverlay === "function") {
30841
- const mountId2 = `mount_${randomUUID18()}`;
30910
+ const mountId2 = `mount_${randomUUID19()}`;
30842
30911
  result = await this.browserManager.mountCanvasOverlay(session.browserSessionId, targetId, {
30843
30912
  mountId: mountId2,
30844
30913
  title: session.store.getDocument().title,
@@ -30848,7 +30917,7 @@ var CanvasManager = class {
30848
30917
  } else {
30849
30918
  result = await this.mountDirectOverlay(session.browserSessionId, targetId, session.store.getDocument(), prototypeId);
30850
30919
  }
30851
- const mountId = typeof result.mountId === "string" ? result.mountId : `mount_${randomUUID18()}`;
30920
+ const mountId = typeof result.mountId === "string" ? result.mountId : `mount_${randomUUID19()}`;
30852
30921
  session.overlayMounts.set(mountId, { mountId, targetId, mountedAt: (/* @__PURE__ */ new Date()).toISOString() });
30853
30922
  const previewState = session.activeTargets.get(targetId)?.previewState ?? "background";
30854
30923
  if (!usesCanvasRelayOverlay) {
@@ -31188,7 +31257,7 @@ var CanvasManager = class {
31188
31257
  subscribeFeedback(params2) {
31189
31258
  const session = this.requireSession(params2);
31190
31259
  const polled = this.pollFeedback(params2);
31191
- const subscriptionId = `canvas_sub_${randomUUID18()}`;
31260
+ const subscriptionId = `canvas_sub_${randomUUID19()}`;
31192
31261
  const heartbeatMs = FEEDBACK_HEARTBEAT_MS;
31193
31262
  const subscription = {
31194
31263
  id: subscriptionId,
@@ -31680,7 +31749,14 @@ var CanvasManager = class {
31680
31749
  latestRevision: session.store.getRevision(),
31681
31750
  message: "generationPlan must be accepted before mutation."
31682
31751
  };
31683
- return attachDetails(new Error(blocker.message), { code: blocker.code, blocker, details: { auditId: "CANVAS-01" } });
31752
+ return attachDetails(new Error(blocker.message), {
31753
+ code: blocker.code,
31754
+ blocker,
31755
+ details: {
31756
+ auditId: "CANVAS-01",
31757
+ ...buildCanvasRepairEnvelope({ reasonCode: "plan_required" })
31758
+ }
31759
+ });
31684
31760
  }
31685
31761
  invalidGenerationPlan(session, missingFields, issues, command = "canvas.plan.set") {
31686
31762
  const blocker = {
@@ -31696,7 +31772,13 @@ var CanvasManager = class {
31696
31772
  details: {
31697
31773
  auditId: "CANVAS-03",
31698
31774
  missingFields,
31699
- issues
31775
+ issues,
31776
+ ...buildCanvasRepairEnvelope({
31777
+ reasonCode: "generation_plan_invalid",
31778
+ missingFields,
31779
+ issues,
31780
+ message: blocker.message
31781
+ })
31700
31782
  }
31701
31783
  });
31702
31784
  }
@@ -32473,7 +32555,7 @@ function readInsertPlacement(params2) {
32473
32555
  }
32474
32556
  function materializeInventoryItem(item, pageId, parentId, placement) {
32475
32557
  const template = readInventoryTemplate(item);
32476
- const idMap = new Map(template.nodes.map((node) => [node.id, `node_inventory_${randomUUID18().slice(0, 8)}`]));
32558
+ const idMap = new Map(template.nodes.map((node) => [node.id, `node_inventory_${randomUUID19().slice(0, 8)}`]));
32477
32559
  const root = template.nodes.find((node) => node.id === template.rootNodeId) ?? template.nodes[0];
32478
32560
  const offsetX = (placement.x ?? root.rect.x) - root.rect.x;
32479
32561
  const offsetY = (placement.y ?? root.rect.y) - root.rect.y;
@@ -32649,11 +32731,11 @@ function buildStarterInventoryUpsertPatches(kitIds, frameworkId, adapterId) {
32649
32731
  }));
32650
32732
  }
32651
32733
  function buildStarterShell(definition, pageId, parentId, placement) {
32652
- const rootNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32653
- const eyebrowNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32654
- const headlineNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32655
- const bodyNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32656
- const actionNodeId = definition.shell.actionLabel ? `node_starter_${randomUUID18().slice(0, 8)}` : null;
32734
+ const rootNodeId = `node_starter_${randomUUID19().slice(0, 8)}`;
32735
+ const eyebrowNodeId = `node_starter_${randomUUID19().slice(0, 8)}`;
32736
+ const headlineNodeId = `node_starter_${randomUUID19().slice(0, 8)}`;
32737
+ const bodyNodeId = `node_starter_${randomUUID19().slice(0, 8)}`;
32738
+ const actionNodeId = definition.shell.actionLabel ? `node_starter_${randomUUID19().slice(0, 8)}` : null;
32657
32739
  const rect = {
32658
32740
  ...definition.shell.rect,
32659
32741
  x: placement.x ?? definition.shell.rect.x,
@@ -33111,12 +33193,6 @@ function normalizeOptionalString(value) {
33111
33193
  function normalizeStringArray(value) {
33112
33194
  return Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry.trim().length > 0) : [];
33113
33195
  }
33114
- function requireRecord(value, name) {
33115
- if (!isRecord12(value)) {
33116
- throw new Error(`Missing ${name}`);
33117
- }
33118
- return value;
33119
- }
33120
33196
  function requirePatches(value) {
33121
33197
  if (!Array.isArray(value)) {
33122
33198
  throw new Error("Missing patches");
@@ -33310,7 +33386,7 @@ function ensureDuplicatePatchIds(document2, patch) {
33310
33386
  }
33311
33387
  const subtreeNodeIds = collectSubtreeNodeIds(document2, patch.nodeId);
33312
33388
  const idMap = Object.fromEntries(
33313
- subtreeNodeIds.map((nodeId) => [nodeId, `${nodeId}_copy_${randomUUID18().slice(0, 8)}`])
33389
+ subtreeNodeIds.map((nodeId) => [nodeId, `${nodeId}_copy_${randomUUID19().slice(0, 8)}`])
33314
33390
  );
33315
33391
  return {
33316
33392
  ...patch,
@@ -33329,7 +33405,7 @@ function buildCanvasHistoryEntry(beforeDocument, patches, options) {
33329
33405
  scratchStore.applyPatches(scratchStore.getRevision(), [patch]);
33330
33406
  }
33331
33407
  return {
33332
- id: `history_${randomUUID18().slice(0, 8)}`,
33408
+ id: `history_${randomUUID19().slice(0, 8)}`,
33333
33409
  source: options.source,
33334
33410
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
33335
33411
  forwardPatches: structuredClone(patches),
@@ -33560,7 +33636,7 @@ function attachDetails(error, details) {
33560
33636
 
33561
33637
  // src/relay/relay-server.ts
33562
33638
  import { createServer } from "http";
33563
- import { timingSafeEqual, randomUUID as randomUUID19 } from "crypto";
33639
+ import { timingSafeEqual, randomUUID as randomUUID20 } from "crypto";
33564
33640
  import { WebSocket as WebSocket4, WebSocketServer } from "ws";
33565
33641
  var DEFAULT_DISCOVERY_PORT = 8787;
33566
33642
  var CONFIG_PATH = "/config";
@@ -33568,7 +33644,7 @@ var PAIR_PATH = "/pair";
33568
33644
  var STATUS_PATH = "/status";
33569
33645
  var CDP_TOKEN_QUERY_KEY = "token";
33570
33646
  var RelayServer = class _RelayServer {
33571
- instanceId = randomUUID19();
33647
+ instanceId = randomUUID20();
33572
33648
  epoch = Date.now();
33573
33649
  running = false;
33574
33650
  baseUrl = null;
@@ -33701,7 +33777,7 @@ var RelayServer = class _RelayServer {
33701
33777
  });
33702
33778
  });
33703
33779
  this.opsWss.on("connection", (socket, _request) => {
33704
- const clientId = randomUUID19();
33780
+ const clientId = randomUUID20();
33705
33781
  this.opsClients.set(clientId, socket);
33706
33782
  socket.on("message", (data) => {
33707
33783
  this.handleOpsClientMessage(clientId, data);
@@ -33725,7 +33801,7 @@ var RelayServer = class _RelayServer {
33725
33801
  void _request;
33726
33802
  });
33727
33803
  this.canvasWss.on("connection", (socket, _request) => {
33728
- const clientId = randomUUID19();
33804
+ const clientId = randomUUID20();
33729
33805
  this.canvasClients.set(clientId, socket);
33730
33806
  socket.on("message", (data) => {
33731
33807
  this.handleCanvasClientMessage(clientId, data);
@@ -35407,4 +35483,4 @@ export {
35407
35483
  createOpenDevBrowserCore
35408
35484
  };
35409
35485
  /* v8 ignore next -- @preserve */
35410
- //# sourceMappingURL=chunk-HBK56JST.js.map
35486
+ //# sourceMappingURL=chunk-XRDCSHKZ.js.map