opendevbrowser 0.0.33 → 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 (216) hide show
  1. package/README.md +1 -1
  2. package/dist/{accessibility-snapshot-JSPFVWZ6.js → accessibility-snapshot-VCBXK47S.js} +7 -7
  3. package/dist/{active-window-2OB2MSCR.js → active-window-7EUN36LZ.js} +7 -7
  4. package/dist/{annotate-VDZBZBKZ.js → annotate-VLBK7YB6.js} +6 -6
  5. package/dist/{attr-7XIO4MCH.js → attr-JNANQKM6.js} +6 -6
  6. package/dist/browser/browser-manager.d.ts.map +1 -1
  7. package/dist/browser/manager-types.d.ts +3 -0
  8. package/dist/browser/manager-types.d.ts.map +1 -1
  9. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  10. package/dist/browser/screencast-recorder.d.ts +1 -0
  11. package/dist/browser/screencast-recorder.d.ts.map +1 -1
  12. package/dist/{canvas-N4PAA274.js → canvas-V5LO4JVL.js} +6 -6
  13. package/dist/{capture-desktop-T5YO3EBI.js → capture-desktop-FKVDWTVG.js} +7 -7
  14. package/dist/{capture-window-UKEUBWKH.js → capture-window-QVPM2DN2.js} +7 -7
  15. package/dist/{check-PQB6KKMN.js → check-V3CWZ56S.js} +6 -6
  16. package/dist/{checked-RNZIMCU6.js → checked-Q27Q6YZN.js} +6 -6
  17. package/dist/{chunk-FBKPDILE.js → chunk-5FDXH4CS.js} +315 -37
  18. package/dist/chunk-5FDXH4CS.js.map +1 -0
  19. package/dist/{chunk-J3KYGJRQ.js → chunk-G6NQ7WYD.js} +2 -2
  20. package/dist/{chunk-27W46IKI.js → chunk-GC2FWISX.js} +22 -11
  21. package/dist/chunk-GC2FWISX.js.map +1 -0
  22. package/dist/{chunk-MJF67OTH.js → chunk-NX2XYJP5.js} +2 -2
  23. package/dist/{chunk-FDBUB7BM.js → chunk-OJAUKABV.js} +2 -2
  24. package/dist/{chunk-HMRANSDX.js → chunk-QXJDJDSZ.js} +34 -13
  25. package/dist/chunk-QXJDJDSZ.js.map +1 -0
  26. package/dist/{chunk-SKFB5ICF.js → chunk-TI5I6UWY.js} +8 -3
  27. package/dist/chunk-TI5I6UWY.js.map +1 -0
  28. package/dist/{chunk-W6YPVNDX.js → chunk-VTGG5ZU2.js} +2 -2
  29. package/dist/{chunk-YRRRUGSQ.js → chunk-VX47SJZM.js} +2 -2
  30. package/dist/{chunk-JROW6ZNN.js → chunk-VY47VKXU.js} +3 -3
  31. package/dist/{chunk-NURQB55J.js → chunk-WY72GYAH.js} +2 -2
  32. package/dist/{chunk-EOX6U6Q4.js → chunk-XRDCSHKZ.js} +158 -110
  33. package/dist/chunk-XRDCSHKZ.js.map +1 -0
  34. package/dist/{chunk-52ZIOWVU.js → chunk-Z3HIX2SE.js} +3 -3
  35. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  36. package/dist/cli/daemon-commands.d.ts.map +1 -1
  37. package/dist/cli/index.js +75 -75
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/cli/utils/parse.d.ts +1 -0
  40. package/dist/cli/utils/parse.d.ts.map +1 -1
  41. package/dist/{click-U7ZFKSB4.js → click-EQDRSLR3.js} +6 -6
  42. package/dist/{clone-component-SWYAORTU.js → clone-component-SISUXTJS.js} +5 -5
  43. package/dist/{clone-page-WJ6UJOJG.js → clone-page-MLDPCBOY.js} +5 -5
  44. package/dist/{close-VKIGIKVT.js → close-2LQMJVOA.js} +5 -5
  45. package/dist/{close-NAVIHZ2T.js → close-7J7EV237.js} +5 -5
  46. package/dist/{connect-XVG2MOZL.js → connect-JFRSIW5M.js} +6 -6
  47. package/dist/{console-poll-XI5BZPL7.js → console-poll-NSVVUNEC.js} +6 -6
  48. package/dist/{cookie-import-QELKE7TK.js → cookie-import-B7IQTGTN.js} +5 -5
  49. package/dist/{cookie-list-QDA6KWIY.js → cookie-list-YHG7JCZZ.js} +5 -5
  50. package/dist/{daemon-CA4UIIZQ.js → daemon-ENU4FOV4.js} +4 -4
  51. package/dist/daemon-fingerprint.json +1 -1
  52. package/dist/{debug-trace-snapshot-AT4GAO57.js → debug-trace-snapshot-KLGU2AWY.js} +6 -6
  53. package/dist/{dialog-O3V2IBFH.js → dialog-MUVQIERS.js} +6 -6
  54. package/dist/{disconnect-NAX5TPTG.js → disconnect-KELQJ45J.js} +5 -5
  55. package/dist/{enabled-VT4FJXDX.js → enabled-SF6UU5HG.js} +6 -6
  56. package/dist/{goto-GBJG5NC4.js → goto-AZQWXYPG.js} +6 -6
  57. package/dist/guidance/context.d.ts.map +1 -1
  58. package/dist/guidance/recipes/generic.d.ts.map +1 -1
  59. package/dist/guidance/recipes/pinterest.d.ts.map +1 -1
  60. package/dist/guidance/recipes/site-recipe-validation.d.ts +27 -0
  61. package/dist/guidance/recipes/site-recipe-validation.d.ts.map +1 -0
  62. package/dist/guidance/types.d.ts +1 -0
  63. package/dist/guidance/types.d.ts.map +1 -1
  64. package/dist/{help-SUI4H77K.js → help-B44IBHXL.js} +3 -3
  65. package/dist/{hover-476ZNQZE.js → hover-MQRAKKVU.js} +6 -6
  66. package/dist/{html-5C4TXOV3.js → html-PLRTU2WS.js} +6 -6
  67. package/dist/index.js +49 -14
  68. package/dist/index.js.map +1 -1
  69. package/dist/{inspector-73ARPCIV.js → inspector-IY4GBIT6.js} +7 -7
  70. package/dist/{inspector-audit-QT6QY7KS.js → inspector-audit-7MQCRJHD.js} +9 -9
  71. package/dist/{inspector-plan-JRNSGN2Z.js → inspector-plan-ZAUDHBET.js} +7 -7
  72. package/dist/inspiredesign/contract.d.ts +1 -0
  73. package/dist/inspiredesign/contract.d.ts.map +1 -1
  74. package/dist/inspiredesign/reference-pattern-board.d.ts +5 -0
  75. package/dist/inspiredesign/reference-pattern-board.d.ts.map +1 -1
  76. package/dist/{inspiredesign-IPVZDLSQ.js → inspiredesign-VHPEO3UK.js} +80 -27
  77. package/dist/inspiredesign-VHPEO3UK.js.map +1 -0
  78. package/dist/{launch-B35YDRQC.js → launch-OCTWPTV5.js} +6 -6
  79. package/dist/{list-YETWKTKY.js → list-HUSYADUS.js} +5 -5
  80. package/dist/{list-JV55JVGB.js → list-JWKAMAUA.js} +5 -5
  81. package/dist/{macro-resolve-DQK4B3W3.js → macro-resolve-WOXMPZDQ.js} +6 -6
  82. package/dist/{network-poll-4GWHCJXI.js → network-poll-WHB62OEF.js} +6 -6
  83. package/dist/{new-XDCQPIEG.js → new-IKZBYBNK.js} +5 -5
  84. package/dist/{open-GIM3ZCSV.js → open-UA2VI6ZP.js} +5 -5
  85. package/dist/opendevbrowser.js +49 -14
  86. package/dist/opendevbrowser.js.map +1 -1
  87. package/dist/{perf-26VBXDPI.js → perf-DICS3VKH.js} +6 -6
  88. package/dist/{pointer-down-O3VSNAXW.js → pointer-down-2XPRZFJC.js} +7 -7
  89. package/dist/{pointer-drag-WQ5QGE6J.js → pointer-drag-7NY4BOLH.js} +7 -7
  90. package/dist/{pointer-move-4N4D7JY2.js → pointer-move-FWEXMH37.js} +7 -7
  91. package/dist/{pointer-up-CQC4NPDX.js → pointer-up-VU2OHK5D.js} +7 -7
  92. package/dist/{press-XGJD45CU.js → press-W7IZ3FCX.js} +6 -6
  93. package/dist/{product-video-HD4ZOUI7.js → product-video-XCZ6CHR5.js} +7 -7
  94. package/dist/providers/browser-output-artifacts.d.ts +13 -0
  95. package/dist/providers/browser-output-artifacts.d.ts.map +1 -0
  96. package/dist/providers/renderer.d.ts.map +1 -1
  97. package/dist/providers/workflows.d.ts.map +1 -1
  98. package/dist/{providers-KKNPJSQK.js → providers-XCNSU3T6.js} +2 -2
  99. package/dist/public-surface/generated-manifest.d.ts +3 -3
  100. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  101. package/dist/public-surface/source.d.ts.map +1 -1
  102. package/dist/{research-VUWWEQ4R.js → research-AYCKHOWK.js} +7 -7
  103. package/dist/{review-LZ3TA7U7.js → review-PP2UNSMJ.js} +7 -7
  104. package/dist/{review-desktop-LAO7U7T3.js → review-desktop-3JOJFUEJ.js} +7 -7
  105. package/dist/{rpc-HKNIVFGC.js → rpc-7EPTJQQ6.js} +6 -6
  106. package/dist/{run-SHCF53FO.js → run-P6UJS3D4.js} +4 -4
  107. package/dist/{screencast-start-JHMQZVWJ.js → screencast-start-ZZYNH2HT.js} +6 -6
  108. package/dist/{screencast-stop-RWQTWWQS.js → screencast-stop-Y6ADFOFA.js} +6 -6
  109. package/dist/{screenshot-QHFYO6PB.js → screenshot-CJB7PMAF.js} +6 -6
  110. package/dist/{scroll-L3FTMAV4.js → scroll-BP5MA4ZT.js} +6 -6
  111. package/dist/{scroll-into-view-JVDHX4WU.js → scroll-into-view-O3RDWLM2.js} +6 -6
  112. package/dist/{select-X4BO7GTB.js → select-QLCNRI36.js} +6 -6
  113. package/dist/{serve-JIMIBCNO.js → serve-OO2MQWGL.js} +5 -5
  114. package/dist/{shopping-EGSDP2GL.js → shopping-UYHCYPAH.js} +7 -7
  115. package/dist/{snapshot-QGJ7RDNV.js → snapshot-SXYZ3CMC.js} +6 -6
  116. package/dist/{status-CKGPNYIH.js → status-AL2AHVA5.js} +5 -5
  117. package/dist/{status-LEBY2X7N.js → status-QQW7REK4.js} +7 -7
  118. package/dist/{status-capabilities-6QTWNGKM.js → status-capabilities-AVHJYQQQ.js} +7 -7
  119. package/dist/{text-VUZU7D3L.js → text-B6Z47EOA.js} +6 -6
  120. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  121. package/dist/tools/product_video_run.d.ts.map +1 -1
  122. package/dist/{type-N5SURP74.js → type-LR3F3SQY.js} +6 -6
  123. package/dist/{uncheck-JFMK3SSY.js → uncheck-5PJEHR7J.js} +6 -6
  124. package/dist/{upload-KFUYLL7M.js → upload-HQ3QN2OW.js} +6 -6
  125. package/dist/{use-CNMPP2ED.js → use-KFZLMRUH.js} +5 -5
  126. package/dist/{value-J335MPZE.js → value-TKUFUK5I.js} +6 -6
  127. package/dist/{visible-YQZWWPBZ.js → visible-P5Z2N2QR.js} +6 -6
  128. package/dist/{wait-IC7YJJPJ.js → wait-BYSHJPSC.js} +6 -6
  129. package/dist/{windows-AGVQ3KX3.js → windows-6GTD25EU.js} +7 -7
  130. package/extension/manifest.json +1 -1
  131. package/package.json +1 -1
  132. package/dist/chunk-27W46IKI.js.map +0 -1
  133. package/dist/chunk-EOX6U6Q4.js.map +0 -1
  134. package/dist/chunk-FBKPDILE.js.map +0 -1
  135. package/dist/chunk-HMRANSDX.js.map +0 -1
  136. package/dist/chunk-SKFB5ICF.js.map +0 -1
  137. package/dist/inspiredesign-IPVZDLSQ.js.map +0 -1
  138. /package/dist/{accessibility-snapshot-JSPFVWZ6.js.map → accessibility-snapshot-VCBXK47S.js.map} +0 -0
  139. /package/dist/{active-window-2OB2MSCR.js.map → active-window-7EUN36LZ.js.map} +0 -0
  140. /package/dist/{annotate-VDZBZBKZ.js.map → annotate-VLBK7YB6.js.map} +0 -0
  141. /package/dist/{attr-7XIO4MCH.js.map → attr-JNANQKM6.js.map} +0 -0
  142. /package/dist/{canvas-N4PAA274.js.map → canvas-V5LO4JVL.js.map} +0 -0
  143. /package/dist/{capture-desktop-T5YO3EBI.js.map → capture-desktop-FKVDWTVG.js.map} +0 -0
  144. /package/dist/{capture-window-UKEUBWKH.js.map → capture-window-QVPM2DN2.js.map} +0 -0
  145. /package/dist/{check-PQB6KKMN.js.map → check-V3CWZ56S.js.map} +0 -0
  146. /package/dist/{checked-RNZIMCU6.js.map → checked-Q27Q6YZN.js.map} +0 -0
  147. /package/dist/{chunk-J3KYGJRQ.js.map → chunk-G6NQ7WYD.js.map} +0 -0
  148. /package/dist/{chunk-MJF67OTH.js.map → chunk-NX2XYJP5.js.map} +0 -0
  149. /package/dist/{chunk-FDBUB7BM.js.map → chunk-OJAUKABV.js.map} +0 -0
  150. /package/dist/{chunk-W6YPVNDX.js.map → chunk-VTGG5ZU2.js.map} +0 -0
  151. /package/dist/{chunk-YRRRUGSQ.js.map → chunk-VX47SJZM.js.map} +0 -0
  152. /package/dist/{chunk-JROW6ZNN.js.map → chunk-VY47VKXU.js.map} +0 -0
  153. /package/dist/{chunk-NURQB55J.js.map → chunk-WY72GYAH.js.map} +0 -0
  154. /package/dist/{chunk-52ZIOWVU.js.map → chunk-Z3HIX2SE.js.map} +0 -0
  155. /package/dist/{click-U7ZFKSB4.js.map → click-EQDRSLR3.js.map} +0 -0
  156. /package/dist/{clone-component-SWYAORTU.js.map → clone-component-SISUXTJS.js.map} +0 -0
  157. /package/dist/{clone-page-WJ6UJOJG.js.map → clone-page-MLDPCBOY.js.map} +0 -0
  158. /package/dist/{close-VKIGIKVT.js.map → close-2LQMJVOA.js.map} +0 -0
  159. /package/dist/{close-NAVIHZ2T.js.map → close-7J7EV237.js.map} +0 -0
  160. /package/dist/{connect-XVG2MOZL.js.map → connect-JFRSIW5M.js.map} +0 -0
  161. /package/dist/{console-poll-XI5BZPL7.js.map → console-poll-NSVVUNEC.js.map} +0 -0
  162. /package/dist/{cookie-import-QELKE7TK.js.map → cookie-import-B7IQTGTN.js.map} +0 -0
  163. /package/dist/{cookie-list-QDA6KWIY.js.map → cookie-list-YHG7JCZZ.js.map} +0 -0
  164. /package/dist/{daemon-CA4UIIZQ.js.map → daemon-ENU4FOV4.js.map} +0 -0
  165. /package/dist/{debug-trace-snapshot-AT4GAO57.js.map → debug-trace-snapshot-KLGU2AWY.js.map} +0 -0
  166. /package/dist/{dialog-O3V2IBFH.js.map → dialog-MUVQIERS.js.map} +0 -0
  167. /package/dist/{disconnect-NAX5TPTG.js.map → disconnect-KELQJ45J.js.map} +0 -0
  168. /package/dist/{enabled-VT4FJXDX.js.map → enabled-SF6UU5HG.js.map} +0 -0
  169. /package/dist/{goto-GBJG5NC4.js.map → goto-AZQWXYPG.js.map} +0 -0
  170. /package/dist/{help-SUI4H77K.js.map → help-B44IBHXL.js.map} +0 -0
  171. /package/dist/{hover-476ZNQZE.js.map → hover-MQRAKKVU.js.map} +0 -0
  172. /package/dist/{html-5C4TXOV3.js.map → html-PLRTU2WS.js.map} +0 -0
  173. /package/dist/{inspector-73ARPCIV.js.map → inspector-IY4GBIT6.js.map} +0 -0
  174. /package/dist/{inspector-audit-QT6QY7KS.js.map → inspector-audit-7MQCRJHD.js.map} +0 -0
  175. /package/dist/{inspector-plan-JRNSGN2Z.js.map → inspector-plan-ZAUDHBET.js.map} +0 -0
  176. /package/dist/{launch-B35YDRQC.js.map → launch-OCTWPTV5.js.map} +0 -0
  177. /package/dist/{list-YETWKTKY.js.map → list-HUSYADUS.js.map} +0 -0
  178. /package/dist/{list-JV55JVGB.js.map → list-JWKAMAUA.js.map} +0 -0
  179. /package/dist/{macro-resolve-DQK4B3W3.js.map → macro-resolve-WOXMPZDQ.js.map} +0 -0
  180. /package/dist/{network-poll-4GWHCJXI.js.map → network-poll-WHB62OEF.js.map} +0 -0
  181. /package/dist/{new-XDCQPIEG.js.map → new-IKZBYBNK.js.map} +0 -0
  182. /package/dist/{open-GIM3ZCSV.js.map → open-UA2VI6ZP.js.map} +0 -0
  183. /package/dist/{perf-26VBXDPI.js.map → perf-DICS3VKH.js.map} +0 -0
  184. /package/dist/{pointer-down-O3VSNAXW.js.map → pointer-down-2XPRZFJC.js.map} +0 -0
  185. /package/dist/{pointer-drag-WQ5QGE6J.js.map → pointer-drag-7NY4BOLH.js.map} +0 -0
  186. /package/dist/{pointer-move-4N4D7JY2.js.map → pointer-move-FWEXMH37.js.map} +0 -0
  187. /package/dist/{pointer-up-CQC4NPDX.js.map → pointer-up-VU2OHK5D.js.map} +0 -0
  188. /package/dist/{press-XGJD45CU.js.map → press-W7IZ3FCX.js.map} +0 -0
  189. /package/dist/{product-video-HD4ZOUI7.js.map → product-video-XCZ6CHR5.js.map} +0 -0
  190. /package/dist/{providers-KKNPJSQK.js.map → providers-XCNSU3T6.js.map} +0 -0
  191. /package/dist/{research-VUWWEQ4R.js.map → research-AYCKHOWK.js.map} +0 -0
  192. /package/dist/{review-LZ3TA7U7.js.map → review-PP2UNSMJ.js.map} +0 -0
  193. /package/dist/{review-desktop-LAO7U7T3.js.map → review-desktop-3JOJFUEJ.js.map} +0 -0
  194. /package/dist/{rpc-HKNIVFGC.js.map → rpc-7EPTJQQ6.js.map} +0 -0
  195. /package/dist/{run-SHCF53FO.js.map → run-P6UJS3D4.js.map} +0 -0
  196. /package/dist/{screencast-start-JHMQZVWJ.js.map → screencast-start-ZZYNH2HT.js.map} +0 -0
  197. /package/dist/{screencast-stop-RWQTWWQS.js.map → screencast-stop-Y6ADFOFA.js.map} +0 -0
  198. /package/dist/{screenshot-QHFYO6PB.js.map → screenshot-CJB7PMAF.js.map} +0 -0
  199. /package/dist/{scroll-L3FTMAV4.js.map → scroll-BP5MA4ZT.js.map} +0 -0
  200. /package/dist/{scroll-into-view-JVDHX4WU.js.map → scroll-into-view-O3RDWLM2.js.map} +0 -0
  201. /package/dist/{select-X4BO7GTB.js.map → select-QLCNRI36.js.map} +0 -0
  202. /package/dist/{serve-JIMIBCNO.js.map → serve-OO2MQWGL.js.map} +0 -0
  203. /package/dist/{shopping-EGSDP2GL.js.map → shopping-UYHCYPAH.js.map} +0 -0
  204. /package/dist/{snapshot-QGJ7RDNV.js.map → snapshot-SXYZ3CMC.js.map} +0 -0
  205. /package/dist/{status-CKGPNYIH.js.map → status-AL2AHVA5.js.map} +0 -0
  206. /package/dist/{status-LEBY2X7N.js.map → status-QQW7REK4.js.map} +0 -0
  207. /package/dist/{status-capabilities-6QTWNGKM.js.map → status-capabilities-AVHJYQQQ.js.map} +0 -0
  208. /package/dist/{text-VUZU7D3L.js.map → text-B6Z47EOA.js.map} +0 -0
  209. /package/dist/{type-N5SURP74.js.map → type-LR3F3SQY.js.map} +0 -0
  210. /package/dist/{uncheck-JFMK3SSY.js.map → uncheck-5PJEHR7J.js.map} +0 -0
  211. /package/dist/{upload-KFUYLL7M.js.map → upload-HQ3QN2OW.js.map} +0 -0
  212. /package/dist/{use-CNMPP2ED.js.map → use-KFZLMRUH.js.map} +0 -0
  213. /package/dist/{value-J335MPZE.js.map → value-TKUFUK5I.js.map} +0 -0
  214. /package/dist/{visible-YQZWWPBZ.js.map → visible-P5Z2N2QR.js.map} +0 -0
  215. /package/dist/{wait-IC7YJJPJ.js.map → wait-BYSHJPSC.js.map} +0 -0
  216. /package/dist/{windows-AGVQ3KX3.js.map → windows-6GTD25EU.js.map} +0 -0
@@ -54,8 +54,9 @@ import {
54
54
  inspectChallengePlanFromRuntime,
55
55
  resolveChallengeAutomationPolicy,
56
56
  resolveProviderRuntimePolicy,
57
+ resolveWorkflowArtifactRoot,
57
58
  toSnippet
58
- } from "./chunk-FBKPDILE.js";
59
+ } from "./chunk-5FDXH4CS.js";
59
60
  import {
60
61
  buildBlockerArtifacts,
61
62
  classifyBlockerSignal,
@@ -3662,9 +3663,9 @@ function createCoreRuntimeAssemblies(args2) {
3662
3663
  import { parse, resolve as resolve6 } from "path";
3663
3664
 
3664
3665
  // src/browser/browser-manager.ts
3665
- import { randomUUID as randomUUID10 } from "crypto";
3666
+ import { randomUUID as randomUUID11 } from "crypto";
3666
3667
  import { access as access2, mkdir as mkdir5, rm as rm3, writeFile as writeFile3 } from "fs/promises";
3667
- import { join as join9 } from "path";
3668
+ import { join as join10 } from "path";
3668
3669
  import { freemem, totalmem } from "os";
3669
3670
  import { Mutex } from "async-mutex";
3670
3671
 
@@ -4952,6 +4953,28 @@ function sanitizeWsEndpoint(wsEndpoint) {
4952
4953
  }
4953
4954
  }
4954
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
+
4955
4978
  // src/browser/manager-types.ts
4956
4979
  var SCREENCAST_RETENTION_MS = 10 * 6e4;
4957
4980
 
@@ -5575,7 +5598,7 @@ var SessionStore = class {
5575
5598
  };
5576
5599
 
5577
5600
  // src/browser/target-manager.ts
5578
- import { randomUUID as randomUUID7 } from "crypto";
5601
+ import { randomUUID as randomUUID8 } from "crypto";
5579
5602
  var TARGET_INFO_TIMEOUT_MS = 2e3;
5580
5603
  var TargetManager = class {
5581
5604
  targets = /* @__PURE__ */ new Map();
@@ -5583,7 +5606,7 @@ var TargetManager = class {
5583
5606
  nameToTarget = /* @__PURE__ */ new Map();
5584
5607
  targetToName = /* @__PURE__ */ new Map();
5585
5608
  registerPage(page, name) {
5586
- const targetId = randomUUID7();
5609
+ const targetId = randomUUID8();
5587
5610
  this.targets.set(targetId, page);
5588
5611
  if (!this.activeTargetId) {
5589
5612
  this.activeTargetId = targetId;
@@ -5901,7 +5924,7 @@ import { execFileSync } from "child_process";
5901
5924
  import { createDecipheriv, createHash as createHash3, pbkdf2Sync } from "crypto";
5902
5925
  import { cp, mkdtemp as mkdtemp2, mkdir as mkdir3, rm as rm2, stat as stat3 } from "fs/promises";
5903
5926
  import { tmpdir } from "os";
5904
- import { dirname, join as join7 } from "path";
5927
+ import { dirname, join as join8 } from "path";
5905
5928
  var ROOT_COPY_ENTRIES = ["Local State"];
5906
5929
  var PROFILE_COPY_ENTRIES = [
5907
5930
  "Preferences",
@@ -5959,7 +5982,7 @@ async function stageSystemChromeProfile(source, stagingRoot) {
5959
5982
  let copiedCookieStore = false;
5960
5983
  for (const entry of ROOT_COPY_ENTRIES) {
5961
5984
  try {
5962
- await copyEntry(join7(source.userDataDir, entry), join7(stagingRoot, entry));
5985
+ await copyEntry(join8(source.userDataDir, entry), join8(stagingRoot, entry));
5963
5986
  } catch (error) {
5964
5987
  warnings.push(`Chrome bootstrap skipped ${entry}: ${getErrorMessage(error)}`);
5965
5988
  }
@@ -5967,8 +5990,8 @@ async function stageSystemChromeProfile(source, stagingRoot) {
5967
5990
  for (const entry of PROFILE_COPY_ENTRIES) {
5968
5991
  try {
5969
5992
  const copied = await copyEntry(
5970
- join7(source.profilePath, entry),
5971
- join7(stagingRoot, source.profileDirectory, entry)
5993
+ join8(source.profilePath, entry),
5994
+ join8(stagingRoot, source.profileDirectory, entry)
5972
5995
  );
5973
5996
  if (copied && COOKIE_STORE_ENTRY_SET.has(entry)) {
5974
5997
  copiedCookieStore = true;
@@ -6074,8 +6097,8 @@ async function loadSystemChromeCookiesFromSqlite(source, platform = process.plat
6074
6097
  return { cookies: [], warnings: [], attempted: false };
6075
6098
  }
6076
6099
  const cookieDbCandidates = [
6077
- join7(source.profilePath, "Cookies"),
6078
- join7(source.profilePath, "Network", "Cookies")
6100
+ join8(source.profilePath, "Cookies"),
6101
+ join8(source.profilePath, "Network", "Cookies")
6079
6102
  ];
6080
6103
  const cookieDbPath = await firstExistingPath(cookieDbCandidates);
6081
6104
  if (!cookieDbPath) {
@@ -6145,7 +6168,7 @@ async function loadSystemChromeCookies(executablePath) {
6145
6168
  warnings: direct.warnings
6146
6169
  };
6147
6170
  }
6148
- const stagingRoot = await mkdtemp2(join7(tmpdir(), "opendevbrowser-chrome-cookie-bootstrap-"));
6171
+ const stagingRoot = await mkdtemp2(join8(tmpdir(), "opendevbrowser-chrome-cookie-bootstrap-"));
6149
6172
  try {
6150
6173
  const staged = await stageSystemChromeProfile(source, stagingRoot);
6151
6174
  if (!staged.copiedCookieStore) {
@@ -6203,7 +6226,7 @@ function getErrorMessage(error) {
6203
6226
  }
6204
6227
 
6205
6228
  // src/browser/global-challenge-coordinator.ts
6206
- import { randomUUID as randomUUID8 } from "crypto";
6229
+ import { randomUUID as randomUUID9 } from "crypto";
6207
6230
  var PRESERVE_WINDOW_MS = 15 * 60 * 1e3;
6208
6231
  var VERIFY_WINDOW_MS = 5 * 60 * 1e3;
6209
6232
  var toIso = (value) => value.toISOString();
@@ -6225,7 +6248,7 @@ var GlobalChallengeCoordinator = class {
6225
6248
  claimOrRefresh(args2) {
6226
6249
  const now = args2.now ?? /* @__PURE__ */ new Date();
6227
6250
  const existing = this.bySessionId.get(args2.sessionId);
6228
- const challengeId = existing?.summary.challengeId ?? randomUUID8();
6251
+ const challengeId = existing?.summary.challengeId ?? randomUUID9();
6229
6252
  const previousTimeline = existing?.timeline ?? [];
6230
6253
  const nextEntry = {
6231
6254
  at: toIso(now),
@@ -6317,8 +6340,8 @@ var GlobalChallengeCoordinator = class {
6317
6340
 
6318
6341
  // src/browser/screencast-recorder.ts
6319
6342
  import { copyFile, mkdir as mkdir4, readdir, writeFile as writeFile2 } from "fs/promises";
6320
- import { randomUUID as randomUUID9 } from "crypto";
6321
- 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";
6322
6345
  var DEFAULT_SCREENCAST_INTERVAL_MS = 1e3;
6323
6346
  var MIN_SCREENCAST_INTERVAL_MS = 250;
6324
6347
  var DEFAULT_SCREENCAST_MAX_FRAMES = 300;
@@ -6365,12 +6388,16 @@ async function ensureEmptyDirectory(path4) {
6365
6388
  }
6366
6389
  await mkdir4(path4, { recursive: true });
6367
6390
  }
6368
- function resolveOutputDir(worktree, sessionId, screencastId, outputDir) {
6391
+ function resolveOutputDir(worktree, outputDir) {
6369
6392
  if (typeof outputDir === "string" && outputDir.trim().length > 0) {
6370
6393
  const trimmed = outputDir.trim();
6371
- return isAbsolute2(trimmed) ? trimmed : resolve(worktree, trimmed);
6394
+ return { outputDir: isAbsolute2(trimmed) ? trimmed : resolve(worktree, trimmed) };
6372
6395
  }
6373
- 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 };
6374
6401
  }
6375
6402
  function renderReplayHtml(manifest) {
6376
6403
  const encodedManifest = JSON.stringify(manifest).replaceAll("<", "\\u003c");
@@ -6470,6 +6497,7 @@ var BrowserScreencastRecorder = class {
6470
6497
  sessionId;
6471
6498
  targetId;
6472
6499
  outputDir;
6500
+ artifactPath;
6473
6501
  startedAt;
6474
6502
  intervalMs;
6475
6503
  maxFrames;
@@ -6490,18 +6518,20 @@ var BrowserScreencastRecorder = class {
6490
6518
  finalPage;
6491
6519
  frames = [];
6492
6520
  constructor(args2) {
6493
- this.screencastId = args2.screencastId ?? randomUUID9();
6521
+ this.screencastId = args2.screencastId ?? randomUUID10();
6494
6522
  this.sessionId = args2.sessionId;
6495
6523
  this.targetId = args2.targetId;
6496
- 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;
6497
6527
  this.intervalMs = resolveIntervalMs(args2.options?.intervalMs);
6498
6528
  this.maxFrames = resolveMaxFrames(args2.options?.maxFrames);
6499
6529
  this.startedAt = (/* @__PURE__ */ new Date()).toISOString();
6500
6530
  this.startedAtMs = Date.parse(this.startedAt);
6501
- this.framesDir = join8(this.outputDir, FRAMES_DIRECTORY);
6502
- this.manifestPath = join8(this.outputDir, MANIFEST_FILENAME);
6503
- this.replayHtmlPath = join8(this.outputDir, REPLAY_FILENAME);
6504
- 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);
6505
6535
  this.captureFrameImpl = args2.captureFrame;
6506
6536
  this.completionPromise = new Promise((resolvePromise) => {
6507
6537
  this.resolveCompletion = resolvePromise;
@@ -6539,6 +6569,7 @@ var BrowserScreencastRecorder = class {
6539
6569
  sessionId: this.sessionId,
6540
6570
  targetId: this.targetId,
6541
6571
  outputDir: this.outputDir,
6572
+ ...this.artifactPath ? { artifact_path: this.artifactPath } : {},
6542
6573
  startedAt: this.startedAt,
6543
6574
  intervalMs: this.intervalMs,
6544
6575
  maxFrames: this.maxFrames,
@@ -6583,7 +6614,7 @@ var BrowserScreencastRecorder = class {
6583
6614
  async captureFrame() {
6584
6615
  const index = this.frames.length + 1;
6585
6616
  const frameFilename = `${String(index).padStart(6, "0")}.png`;
6586
- const framePath = join8(this.framesDir, frameFilename);
6617
+ const framePath = join9(this.framesDir, frameFilename);
6587
6618
  const task = Promise.resolve().then(async () => {
6588
6619
  const capturedAt = (/* @__PURE__ */ new Date()).toISOString();
6589
6620
  const result = await this.captureFrameImpl(framePath);
@@ -6599,7 +6630,7 @@ var BrowserScreencastRecorder = class {
6599
6630
  index,
6600
6631
  capturedAt,
6601
6632
  elapsedMs: Math.max(Date.parse(capturedAt) - this.startedAtMs, 0),
6602
- relativePath: normalizeRelativePath(join8(FRAMES_DIRECTORY, frameFilename))
6633
+ relativePath: normalizeRelativePath(join9(FRAMES_DIRECTORY, frameFilename))
6603
6634
  });
6604
6635
  if (this.frames.length === 1) {
6605
6636
  await copyFile(framePath, this.previewPath);
@@ -6664,6 +6695,7 @@ var BrowserScreencastRecorder = class {
6664
6695
  sessionId: this.sessionId,
6665
6696
  targetId: this.targetId,
6666
6697
  outputDir: this.outputDir,
6698
+ ...this.artifactPath ? { artifact_path: this.artifactPath } : {},
6667
6699
  startedAt: this.startedAt,
6668
6700
  endedAt,
6669
6701
  endedReason: reason,
@@ -7060,7 +7092,7 @@ var BrowserManager = class {
7060
7092
  warnings.push("System Chrome not found. Downloaded Chrome for Testing.");
7061
7093
  executablePath = download.executablePath;
7062
7094
  }
7063
- const profileDir = persistProfile ? cachePaths.profileDir : join9(cachePaths.projectRoot, "temp-profiles", randomUUID10());
7095
+ const profileDir = persistProfile ? cachePaths.profileDir : join10(cachePaths.projectRoot, "temp-profiles", randomUUID11());
7064
7096
  await mkdir5(profileDir, { recursive: true });
7065
7097
  let context = null;
7066
7098
  try {
@@ -7075,7 +7107,7 @@ var BrowserManager = class {
7075
7107
  if (!browser) {
7076
7108
  throw new Error("Browser instance unavailable");
7077
7109
  }
7078
- const sessionId = randomUUID10();
7110
+ const sessionId = randomUUID11();
7079
7111
  const targets = new TargetManager();
7080
7112
  const pages = context.pages();
7081
7113
  if (pages.length === 0) {
@@ -8182,9 +8214,18 @@ var BrowserManager = class {
8182
8214
  throw new Error("Screenshot ref and fullPage options are mutually exclusive.");
8183
8215
  }
8184
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
+ }
8185
8226
  const screenshotOptions = {
8186
8227
  type: "png",
8187
- path: options.path
8228
+ path: outputPath
8188
8229
  };
8189
8230
  if (options.ref) {
8190
8231
  await this.callFunctionOnResolvedRef(managed, options.ref, DOM_SCROLL_INTO_VIEW_DECLARATION, [], resolvedTargetId);
@@ -8194,30 +8235,26 @@ var BrowserManager = class {
8194
8235
  screenshotOptions.fullPage = true;
8195
8236
  }
8196
8237
  try {
8197
- if (options.path) {
8198
- await this.withLegacyExtensionOperationTimeout(
8199
- managed,
8200
- page.screenshot(screenshotOptions),
8201
- `page.screenshot: Timeout ${LEGACY_EXTENSION_OPERATION_TIMEOUT_MS}ms exceeded.`
8202
- );
8203
- return { path: options.path };
8204
- }
8205
- const buffer = await this.withLegacyExtensionOperationTimeout(
8238
+ await this.withLegacyExtensionOperationTimeout(
8206
8239
  managed,
8207
8240
  page.screenshot(screenshotOptions),
8208
8241
  `page.screenshot: Timeout ${LEGACY_EXTENSION_OPERATION_TIMEOUT_MS}ms exceeded.`
8209
8242
  );
8210
- return { base64: buffer.toString("base64") };
8243
+ return {
8244
+ path: outputPath,
8245
+ ...artifact ? { artifact_path: artifact.artifactPath } : {}
8246
+ };
8211
8247
  } catch (error) {
8212
8248
  const fallback = await this.captureScreenshotViaCdp(managed, page, error, options);
8213
8249
  if (!fallback) {
8214
8250
  throw error;
8215
8251
  }
8216
- if (options.path) {
8217
- await writeFile3(options.path, Buffer.from(fallback.base64, "base64"));
8218
- return fallback.warnings ? { path: options.path, warnings: fallback.warnings } : { path: options.path };
8219
- }
8220
- 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
+ };
8221
8258
  }
8222
8259
  });
8223
8260
  }
@@ -10512,7 +10549,7 @@ var BrowserManager = class {
10512
10549
  }
10513
10550
  context = await browser.newContext();
10514
10551
  }
10515
- const sessionId = randomUUID10();
10552
+ const sessionId = randomUUID11();
10516
10553
  const targets = new TargetManager();
10517
10554
  const pages = context.pages();
10518
10555
  if (pages.length === 0) {
@@ -10705,7 +10742,8 @@ function truncateText(value, maxChars) {
10705
10742
 
10706
10743
  // src/browser/ops-browser-manager.ts
10707
10744
  import { writeFile as writeFile4 } from "fs/promises";
10708
- import { randomUUID as randomUUID11 } from "crypto";
10745
+ import { randomUUID as randomUUID12 } from "crypto";
10746
+ import { join as join11 } from "path";
10709
10747
  var OpsBrowserManager = class {
10710
10748
  base;
10711
10749
  config;
@@ -10839,7 +10877,7 @@ var OpsBrowserManager = class {
10839
10877
  config: this.config
10840
10878
  });
10841
10879
  const client = await this.ensureOpsClient(connectEndpoint);
10842
- const leaseId = randomUUID11();
10880
+ const leaseId = randomUUID12();
10843
10881
  const result = await client.request(
10844
10882
  "session.connect",
10845
10883
  {
@@ -11311,11 +11349,21 @@ var OpsBrowserManager = class {
11311
11349
  throw new Error("Screenshot failed");
11312
11350
  }
11313
11351
  const warnings = Array.isArray(result.warnings) ? result.warnings : typeof result.warning === "string" ? [result.warning] : void 0;
11314
- if (options.path) {
11315
- await writeFile4(options.path, Buffer.from(result.base64, "base64"));
11316
- 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");
11317
11360
  }
11318
- 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
+ };
11319
11367
  }
11320
11368
  async startScreencast(sessionId, options = {}) {
11321
11369
  if (!this.opsSessions.has(sessionId)) {
@@ -12210,7 +12258,7 @@ var normalizeRecoverableOpsUrl = (url) => {
12210
12258
  };
12211
12259
 
12212
12260
  // src/browser/annotation-manager.ts
12213
- import { randomUUID as randomUUID13 } from "crypto";
12261
+ import { randomUUID as randomUUID14 } from "crypto";
12214
12262
  import { WebSocket as WebSocket2 } from "ws";
12215
12263
 
12216
12264
  // src/annotate/timeout-messages.ts
@@ -12221,9 +12269,9 @@ var getAnnotationTimeoutMessage = (readySeen) => {
12221
12269
  };
12222
12270
 
12223
12271
  // src/annotate/direct-annotator.ts
12224
- import { randomUUID as randomUUID12 } from "crypto";
12272
+ import { randomUUID as randomUUID13 } from "crypto";
12225
12273
  import { existsSync as existsSync2 } from "fs";
12226
- import { join as join10 } from "path";
12274
+ import { join as join12 } from "path";
12227
12275
  var DEFAULT_TIMEOUT_MS = 12e4;
12228
12276
  var DIRECT_ANNOTATE_REQUIRED_FILES = [
12229
12277
  "dist/annotate-content.js",
@@ -12238,15 +12286,15 @@ function resolveDirectAnnotateAssets(resolvePath = () => getExtensionRuntimePath
12238
12286
  if (!extensionPath) {
12239
12287
  return { error: "Extension assets unavailable." };
12240
12288
  }
12241
- const scriptPath = join10(extensionPath, "dist", "annotate-content.js");
12242
- 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");
12243
12291
  if (!existsSync2(scriptPath) || !existsSync2(stylePath)) {
12244
12292
  return { error: "Direct annotate assets missing. Run `npm run extension:build` and retry." };
12245
12293
  }
12246
12294
  return { assets: { scriptPath, stylePath } };
12247
12295
  }
12248
12296
  async function runDirectAnnotate(manager, assets, request) {
12249
- const requestId = randomUUID12();
12297
+ const requestId = randomUUID13();
12250
12298
  const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;
12251
12299
  return manager.withPage(request.sessionId, request.targetId ?? null, async (page) => {
12252
12300
  await ensureBindings(page);
@@ -12546,7 +12594,7 @@ var AnnotationManager = class {
12546
12594
  return this.requestRelay(options, false);
12547
12595
  }
12548
12596
  async requestStored(options) {
12549
- const requestId = randomUUID13();
12597
+ const requestId = randomUUID14();
12550
12598
  const sharedPayload = this.agentInbox?.latestPayload();
12551
12599
  if (sharedPayload) {
12552
12600
  return {
@@ -12591,7 +12639,7 @@ var AnnotationManager = class {
12591
12639
  return this.relay?.getAnnotationUrl?.() ?? (this.config.relayPort > 0 ? `ws://127.0.0.1:${this.config.relayPort}/annotation` : null);
12592
12640
  }
12593
12641
  async requestDirect(options) {
12594
- const requestId = randomUUID13();
12642
+ const requestId = randomUUID14();
12595
12643
  if (!options.sessionId) {
12596
12644
  return {
12597
12645
  version: 1,
@@ -12639,7 +12687,7 @@ var AnnotationManager = class {
12639
12687
  }
12640
12688
  }
12641
12689
  async requestRelay(options, requireExtension, commandName = "start") {
12642
- const requestId = randomUUID13();
12690
+ const requestId = randomUUID14();
12643
12691
  const timeoutMs = options.timeoutMs ?? 12e4;
12644
12692
  let resolvedTabId = options.tabId;
12645
12693
  if (requireExtension && options.sessionId && this.manager) {
@@ -12866,12 +12914,12 @@ var parseJson2 = (data) => {
12866
12914
  };
12867
12915
 
12868
12916
  // src/browser/canvas-manager.ts
12869
- import { randomUUID as randomUUID18 } from "crypto";
12917
+ import { randomUUID as randomUUID19 } from "crypto";
12870
12918
  import { mkdir as mkdir9 } from "fs/promises";
12871
12919
  import { dirname as dirname5 } from "path";
12872
12920
 
12873
12921
  // src/browser/canvas-client.ts
12874
- import { randomUUID as randomUUID14 } from "crypto";
12922
+ import { randomUUID as randomUUID15 } from "crypto";
12875
12923
  import { WebSocket as WebSocket3 } from "ws";
12876
12924
  var CanvasClient = class {
12877
12925
  url;
@@ -13047,7 +13095,7 @@ var CanvasClient = class {
13047
13095
  if (!this.socket || this.socket.readyState !== WebSocket3.OPEN) {
13048
13096
  await this.connect();
13049
13097
  }
13050
- const requestId = randomUUID14();
13098
+ const requestId = randomUUID15();
13051
13099
  const request = {
13052
13100
  type: "canvas_request",
13053
13101
  requestId,
@@ -13193,7 +13241,7 @@ var CanvasClient = class {
13193
13241
  if (!this.socket || this.socket.readyState !== WebSocket3.OPEN) {
13194
13242
  return;
13195
13243
  }
13196
- const id2 = randomUUID14();
13244
+ const id2 = randomUUID15();
13197
13245
  const ping = { type: "canvas_ping", id: id2 };
13198
13246
  await new Promise((resolve7, reject) => {
13199
13247
  const timeoutId = setTimeout(() => {
@@ -13260,7 +13308,7 @@ var isCanvasEvent = (value) => {
13260
13308
  var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
13261
13309
 
13262
13310
  // src/canvas/document-store.ts
13263
- import { randomUUID as randomUUID15 } from "crypto";
13311
+ import { randomUUID as randomUUID16 } from "crypto";
13264
13312
 
13265
13313
  // node_modules/lib0/map.js
13266
13314
  var create = () => /* @__PURE__ */ new Map();
@@ -21567,7 +21615,7 @@ function createDefaultNode(pageId, nodeId, name) {
21567
21615
  metadata: {}
21568
21616
  };
21569
21617
  }
21570
- function createDefaultCanvasDocument(documentId = `dc_${randomUUID15()}`) {
21618
+ function createDefaultCanvasDocument(documentId = `dc_${randomUUID16()}`) {
21571
21619
  const createdAt = nowIso();
21572
21620
  const rootNodeId = `node_root_${documentId.slice(-8)}`;
21573
21621
  const pageId = "page_home";
@@ -21615,7 +21663,7 @@ function normalizeCanvasDocument(input) {
21615
21663
  const updatedAt = typeof base.updatedAt === "string" ? base.updatedAt : createdAt;
21616
21664
  return {
21617
21665
  schemaVersion: typeof base.schemaVersion === "string" ? base.schemaVersion : CANVAS_SCHEMA_VERSION,
21618
- documentId: typeof base.documentId === "string" ? base.documentId : `dc_${randomUUID15()}`,
21666
+ documentId: typeof base.documentId === "string" ? base.documentId : `dc_${randomUUID16()}`,
21619
21667
  title: typeof base.title === "string" && base.title.trim() ? base.title : "Untitled Design Canvas",
21620
21668
  createdAt,
21621
21669
  updatedAt,
@@ -21648,7 +21696,7 @@ function normalizeCanvasDocument(input) {
21648
21696
  componentInventory: normalizeArray(base.componentInventory, normalizeCanvasComponentInventoryItem),
21649
21697
  tokens: normalizeCanvasTokenStore(base.tokens),
21650
21698
  assets: Array.isArray(base.assets) ? base.assets.map((asset) => ({
21651
- id: typeof asset.id === "string" ? asset.id : `asset_${randomUUID15()}`,
21699
+ id: typeof asset.id === "string" ? asset.id : `asset_${randomUUID16()}`,
21652
21700
  sourceType: typeof asset.sourceType === "string" ? asset.sourceType : void 0,
21653
21701
  kind: typeof asset.kind === "string" ? asset.kind : void 0,
21654
21702
  repoPath: typeof asset.repoPath === "string" ? asset.repoPath : null,
@@ -21880,7 +21928,7 @@ function buildInventoryItemFromNode(document2, nodeId, options = {}) {
21880
21928
  const origin = options.origin && CANVAS_INVENTORY_ORIGINS.has(options.origin) ? options.origin : baseOrigin;
21881
21929
  const template = buildInventoryTemplate(document2, nodeId);
21882
21930
  return normalizeCanvasComponentInventoryItem({
21883
- id: options.itemId ?? `inventory_${randomUUID15().slice(0, 8)}`,
21931
+ id: options.itemId ?? `inventory_${randomUUID16().slice(0, 8)}`,
21884
21932
  name: options.name ?? node.name,
21885
21933
  componentName: binding?.componentName ?? node.name,
21886
21934
  description: options.description ?? null,
@@ -22873,7 +22921,7 @@ var CanvasDocumentStore = class {
22873
22921
  }
22874
22922
  this.replaceDocument(nextDocument, this.revision + 1, "canvas.store.apply-patches");
22875
22923
  return {
22876
- transactionId: `txn_${randomUUID15()}`,
22924
+ transactionId: `txn_${randomUUID16()}`,
22877
22925
  appliedRevision: this.revision,
22878
22926
  warnings: evaluateCanvasWarnings(this.document),
22879
22927
  evidenceRefs: []
@@ -22888,7 +22936,7 @@ var CanvasDocumentStore = class {
22888
22936
  }
22889
22937
  this.replaceDocument(normalizeCanvasDocument(document2), this.revision + 1, "canvas.store.replace-document");
22890
22938
  return {
22891
- transactionId: `txn_${randomUUID15()}`,
22939
+ transactionId: `txn_${randomUUID16()}`,
22892
22940
  appliedRevision: this.revision,
22893
22941
  warnings: evaluateCanvasWarnings(this.document),
22894
22942
  evidenceRefs: []
@@ -23383,7 +23431,7 @@ function duplicateNodeSubtree(document2, nodeId, parentId, index, idMapInput) {
23383
23431
  throw new Error(`Unknown node: ${sourceNodeId}`);
23384
23432
  }
23385
23433
  const mappedId = isRecord4(idMapInput) ? idMapInput[sourceNode.id] : null;
23386
- 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)}`;
23387
23435
  idMap.set(sourceNode.id, duplicateId);
23388
23436
  const nextMetadata = clone(sourceNode.metadata);
23389
23437
  if (isRecord4(nextMetadata.codeSync)) {
@@ -24935,7 +24983,7 @@ function listBuiltInCanvasKitIds() {
24935
24983
 
24936
24984
  // src/canvas/repo-store.ts
24937
24985
  import { access as access3, mkdir as mkdir6, readFile as readFile2 } from "fs/promises";
24938
- 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";
24939
24987
 
24940
24988
  // src/canvas/code-sync/manifest.ts
24941
24989
  var isRecord6 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
@@ -25119,20 +25167,20 @@ function resolveCanvasRepoPath(worktree, documentId, repoPath) {
25119
25167
  if (repoPath && repoPath.trim()) {
25120
25168
  return isAbsolute3(repoPath) ? repoPath : resolve2(worktree, repoPath);
25121
25169
  }
25122
- return join11(worktree, ".opendevbrowser", "canvas", `${documentId}.canvas.json`);
25170
+ return join13(worktree, ".opendevbrowser", "canvas", `${documentId}.canvas.json`);
25123
25171
  }
25124
25172
  function resolveCanvasCodeSyncManifestPath(worktree, documentId, bindingId, repoPath) {
25125
25173
  if (repoPath && repoPath.trim()) {
25126
25174
  return isAbsolute3(repoPath) ? repoPath : resolve2(worktree, repoPath);
25127
25175
  }
25128
- return join11(worktree, ".opendevbrowser", "canvas", "code-sync", documentId, `${bindingId}.json`);
25176
+ return join13(worktree, ".opendevbrowser", "canvas", "code-sync", documentId, `${bindingId}.json`);
25129
25177
  }
25130
25178
  function resolveCanvasFigmaAssetDir(worktree, fileKey) {
25131
- return join11(worktree, ".opendevbrowser", "canvas", "assets", "figma", fileKey);
25179
+ return join13(worktree, ".opendevbrowser", "canvas", "assets", "figma", fileKey);
25132
25180
  }
25133
25181
  function resolveCanvasFigmaAssetPath(worktree, fileKey, assetId, extension) {
25134
25182
  const normalizedExtension = extension.startsWith(".") ? extension : `.${extension}`;
25135
- return join11(resolveCanvasFigmaAssetDir(worktree, fileKey), `${assetId}${normalizedExtension}`);
25183
+ return join13(resolveCanvasFigmaAssetDir(worktree, fileKey), `${assetId}${normalizedExtension}`);
25136
25184
  }
25137
25185
  async function saveCanvasDocument(worktree, document2, repoPath) {
25138
25186
  const resolvedPath = resolveCanvasRepoPath(worktree, document2.documentId, repoPath);
@@ -25540,7 +25588,7 @@ import { resolve as resolve5, isAbsolute as isAbsolute5 } from "path";
25540
25588
  // src/canvas/adapter-plugins/loader.ts
25541
25589
  import { createHash as createHash4 } from "crypto";
25542
25590
  import { access as access4, readFile as readFile3 } from "fs/promises";
25543
- 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";
25544
25592
  import { pathToFileURL } from "url";
25545
25593
 
25546
25594
  // src/canvas/adapter-plugins/manifest.ts
@@ -25636,7 +25684,7 @@ async function readJson(filePath) {
25636
25684
  return JSON.parse(await readFile3(filePath, "utf8"));
25637
25685
  }
25638
25686
  async function loadPackageJson(worktree) {
25639
- const packagePath = join12(worktree, "package.json");
25687
+ const packagePath = join14(worktree, "package.json");
25640
25688
  try {
25641
25689
  return await readJson(packagePath);
25642
25690
  } catch (error) {
@@ -25684,14 +25732,14 @@ function applyDeclarationOverrides(manifest, declaration) {
25684
25732
  async function resolveDeclarationRef(worktree, ref) {
25685
25733
  const direct = isAbsolute4(ref) ? ref : resolve4(worktree, ref);
25686
25734
  if (await exists(direct)) {
25687
- 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");
25688
25736
  return {
25689
25737
  packageRoot: direct.endsWith(".json") ? dirname3(direct) : direct,
25690
25738
  manifestPath: manifestPath2
25691
25739
  };
25692
25740
  }
25693
- const nodeModulesPath = join12(worktree, "node_modules", ref);
25694
- 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");
25695
25743
  return {
25696
25744
  packageRoot: nodeModulesPath,
25697
25745
  manifestPath
@@ -25702,7 +25750,7 @@ async function readDeclarationSource(worktree) {
25702
25750
  const openDevBrowserConfig = isRecord7(packageJson.opendevbrowser) ? packageJson.opendevbrowser : null;
25703
25751
  const canvasConfig = openDevBrowserConfig && isRecord7(openDevBrowserConfig.canvas) ? openDevBrowserConfig.canvas : null;
25704
25752
  const packageDeclarations = Array.isArray(canvasConfig?.adapterPlugins) ? canvasConfig.adapterPlugins : [];
25705
- const repoFile = join12(worktree, ".opendevbrowser", "canvas", "adapters.json");
25753
+ const repoFile = join14(worktree, ".opendevbrowser", "canvas", "adapters.json");
25706
25754
  const repoDeclarations = await exists(repoFile) ? (await readJson(repoFile)).adapterPlugins ?? [] : [];
25707
25755
  return { packageDeclarations, repoDeclarations };
25708
25756
  }
@@ -25748,7 +25796,7 @@ function applyCapabilityOverridesToRegisteredAdapters(params2) {
25748
25796
  async function fingerprintPluginFiles(manifestPath, packageRoot, manifest) {
25749
25797
  const entryPath = resolve4(packageRoot, manifest.entry);
25750
25798
  const fixturePath = resolve4(packageRoot, manifest.fixtureDir);
25751
- const packageJsonPath = join12(packageRoot, "package.json");
25799
+ const packageJsonPath = join14(packageRoot, "package.json");
25752
25800
  const [manifestContent, entryContent, packageJsonContent] = await Promise.all([
25753
25801
  readFile3(manifestPath, "utf8"),
25754
25802
  readFile3(entryPath, "utf8"),
@@ -27102,7 +27150,7 @@ function collectGraphOrder(graph, nodeKey) {
27102
27150
  }
27103
27151
 
27104
27152
  // src/canvas/code-sync/import.ts
27105
- import { randomUUID as randomUUID16 } from "crypto";
27153
+ import { randomUUID as randomUUID17 } from "crypto";
27106
27154
 
27107
27155
  // src/canvas/code-sync/graph.ts
27108
27156
  function locatorKey(locator) {
@@ -27232,7 +27280,7 @@ function buildNodeName(graphNode) {
27232
27280
  return graphNode.tagName ?? "Element";
27233
27281
  }
27234
27282
  function buildNodeId(graphNode, manifestLookup) {
27235
- 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)}`;
27236
27284
  }
27237
27285
  function preorder(graph, nodeKey) {
27238
27286
  const node = graph.nodes[nodeKey];
@@ -28200,11 +28248,11 @@ function maxIso(values) {
28200
28248
  }
28201
28249
 
28202
28250
  // src/browser/canvas-session-sync-manager.ts
28203
- import { randomUUID as randomUUID17 } from "crypto";
28251
+ import { randomUUID as randomUUID18 } from "crypto";
28204
28252
  var CanvasSessionSyncManager = class {
28205
28253
  sessions = /* @__PURE__ */ new Map();
28206
28254
  initializeSession(canvasSessionId, leaseId, clientId) {
28207
- const initialClientId = normalizeClientId(clientId) ?? `canvas_owner_${randomUUID17().slice(0, 8)}`;
28255
+ const initialClientId = normalizeClientId(clientId) ?? `canvas_owner_${randomUUID18().slice(0, 8)}`;
28208
28256
  const attachedAt = (/* @__PURE__ */ new Date()).toISOString();
28209
28257
  const attachedClients = /* @__PURE__ */ new Map();
28210
28258
  attachedClients.set(initialClientId, {
@@ -28232,7 +28280,7 @@ var CanvasSessionSyncManager = class {
28232
28280
  if (!state) {
28233
28281
  throw new Error(`Unknown canvas session for attach: ${canvasSessionId}`);
28234
28282
  }
28235
- const resolvedClientId = normalizeClientId(clientId) ?? `canvas_client_${randomUUID17().slice(0, 8)}`;
28283
+ const resolvedClientId = normalizeClientId(clientId) ?? `canvas_client_${randomUUID18().slice(0, 8)}`;
28236
28284
  const previous = state.attachedClients.get(resolvedClientId);
28237
28285
  const attachedAt = previous?.attachedAt ?? (/* @__PURE__ */ new Date()).toISOString();
28238
28286
  let role = "observer";
@@ -29675,8 +29723,8 @@ var CanvasManager = class {
29675
29723
  const repoRoot = optionalString5(params2.repoRoot) ?? this.worktree;
29676
29724
  const mode = requireCanvasSessionMode(params2.mode);
29677
29725
  const document2 = repoPath ? normalizeCanvasDocument(await loadCanvasDocument(repoRoot, repoPath)) : createDefaultCanvasDocument(requestedDocumentId ?? void 0);
29678
- const sessionId = `canvas_${randomUUID18()}`;
29679
- const leaseId = `lease_${randomUUID18()}`;
29726
+ const sessionId = `canvas_${randomUUID19()}`;
29727
+ const leaseId = `lease_${randomUUID19()}`;
29680
29728
  const planState = resolveGenerationPlanState(document2.designGovernance.generationPlan);
29681
29729
  const session = {
29682
29730
  canvasSessionId: sessionId,
@@ -29718,7 +29766,7 @@ var CanvasManager = class {
29718
29766
  attachSession(params2) {
29719
29767
  const session = this.requireSession(params2);
29720
29768
  const attachMode = requireAttachMode(params2.attachMode);
29721
- const nextLeaseId = attachMode === "lease_reclaim" ? `lease_${randomUUID18()}` : session.leaseId;
29769
+ const nextLeaseId = attachMode === "lease_reclaim" ? `lease_${randomUUID19()}` : session.leaseId;
29722
29770
  const attached = this.sessionSyncManager.attach(
29723
29771
  session.canvasSessionId,
29724
29772
  nextLeaseId,
@@ -30075,7 +30123,7 @@ var CanvasManager = class {
30075
30123
  const session = this.requireSession(params2);
30076
30124
  this.assertLease(session, params2);
30077
30125
  const nodeId = requireString2(params2.nodeId, "nodeId");
30078
- const bindingId = optionalString5(params2.bindingId) ?? `binding_sync_${randomUUID18().slice(0, 8)}`;
30126
+ const bindingId = optionalString5(params2.bindingId) ?? `binding_sync_${randomUUID19().slice(0, 8)}`;
30079
30127
  const binding = createCodeSyncBinding(params2, nodeId, bindingId);
30080
30128
  const baseRevision = session.store.getRevision();
30081
30129
  await this.applyDocumentPatches(session, baseRevision, [{
@@ -30859,7 +30907,7 @@ var CanvasManager = class {
30859
30907
  prototypeId
30860
30908
  });
30861
30909
  } else if (status.mode === "extension" && this.supportsOpsOverlayTransport(session) && typeof this.browserManager.mountCanvasOverlay === "function") {
30862
- const mountId2 = `mount_${randomUUID18()}`;
30910
+ const mountId2 = `mount_${randomUUID19()}`;
30863
30911
  result = await this.browserManager.mountCanvasOverlay(session.browserSessionId, targetId, {
30864
30912
  mountId: mountId2,
30865
30913
  title: session.store.getDocument().title,
@@ -30869,7 +30917,7 @@ var CanvasManager = class {
30869
30917
  } else {
30870
30918
  result = await this.mountDirectOverlay(session.browserSessionId, targetId, session.store.getDocument(), prototypeId);
30871
30919
  }
30872
- const mountId = typeof result.mountId === "string" ? result.mountId : `mount_${randomUUID18()}`;
30920
+ const mountId = typeof result.mountId === "string" ? result.mountId : `mount_${randomUUID19()}`;
30873
30921
  session.overlayMounts.set(mountId, { mountId, targetId, mountedAt: (/* @__PURE__ */ new Date()).toISOString() });
30874
30922
  const previewState = session.activeTargets.get(targetId)?.previewState ?? "background";
30875
30923
  if (!usesCanvasRelayOverlay) {
@@ -31209,7 +31257,7 @@ var CanvasManager = class {
31209
31257
  subscribeFeedback(params2) {
31210
31258
  const session = this.requireSession(params2);
31211
31259
  const polled = this.pollFeedback(params2);
31212
- const subscriptionId = `canvas_sub_${randomUUID18()}`;
31260
+ const subscriptionId = `canvas_sub_${randomUUID19()}`;
31213
31261
  const heartbeatMs = FEEDBACK_HEARTBEAT_MS;
31214
31262
  const subscription = {
31215
31263
  id: subscriptionId,
@@ -32507,7 +32555,7 @@ function readInsertPlacement(params2) {
32507
32555
  }
32508
32556
  function materializeInventoryItem(item, pageId, parentId, placement) {
32509
32557
  const template = readInventoryTemplate(item);
32510
- 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)}`]));
32511
32559
  const root = template.nodes.find((node) => node.id === template.rootNodeId) ?? template.nodes[0];
32512
32560
  const offsetX = (placement.x ?? root.rect.x) - root.rect.x;
32513
32561
  const offsetY = (placement.y ?? root.rect.y) - root.rect.y;
@@ -32683,11 +32731,11 @@ function buildStarterInventoryUpsertPatches(kitIds, frameworkId, adapterId) {
32683
32731
  }));
32684
32732
  }
32685
32733
  function buildStarterShell(definition, pageId, parentId, placement) {
32686
- const rootNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32687
- const eyebrowNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32688
- const headlineNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32689
- const bodyNodeId = `node_starter_${randomUUID18().slice(0, 8)}`;
32690
- 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;
32691
32739
  const rect = {
32692
32740
  ...definition.shell.rect,
32693
32741
  x: placement.x ?? definition.shell.rect.x,
@@ -33338,7 +33386,7 @@ function ensureDuplicatePatchIds(document2, patch) {
33338
33386
  }
33339
33387
  const subtreeNodeIds = collectSubtreeNodeIds(document2, patch.nodeId);
33340
33388
  const idMap = Object.fromEntries(
33341
- subtreeNodeIds.map((nodeId) => [nodeId, `${nodeId}_copy_${randomUUID18().slice(0, 8)}`])
33389
+ subtreeNodeIds.map((nodeId) => [nodeId, `${nodeId}_copy_${randomUUID19().slice(0, 8)}`])
33342
33390
  );
33343
33391
  return {
33344
33392
  ...patch,
@@ -33357,7 +33405,7 @@ function buildCanvasHistoryEntry(beforeDocument, patches, options) {
33357
33405
  scratchStore.applyPatches(scratchStore.getRevision(), [patch]);
33358
33406
  }
33359
33407
  return {
33360
- id: `history_${randomUUID18().slice(0, 8)}`,
33408
+ id: `history_${randomUUID19().slice(0, 8)}`,
33361
33409
  source: options.source,
33362
33410
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
33363
33411
  forwardPatches: structuredClone(patches),
@@ -33588,7 +33636,7 @@ function attachDetails(error, details) {
33588
33636
 
33589
33637
  // src/relay/relay-server.ts
33590
33638
  import { createServer } from "http";
33591
- import { timingSafeEqual, randomUUID as randomUUID19 } from "crypto";
33639
+ import { timingSafeEqual, randomUUID as randomUUID20 } from "crypto";
33592
33640
  import { WebSocket as WebSocket4, WebSocketServer } from "ws";
33593
33641
  var DEFAULT_DISCOVERY_PORT = 8787;
33594
33642
  var CONFIG_PATH = "/config";
@@ -33596,7 +33644,7 @@ var PAIR_PATH = "/pair";
33596
33644
  var STATUS_PATH = "/status";
33597
33645
  var CDP_TOKEN_QUERY_KEY = "token";
33598
33646
  var RelayServer = class _RelayServer {
33599
- instanceId = randomUUID19();
33647
+ instanceId = randomUUID20();
33600
33648
  epoch = Date.now();
33601
33649
  running = false;
33602
33650
  baseUrl = null;
@@ -33729,7 +33777,7 @@ var RelayServer = class _RelayServer {
33729
33777
  });
33730
33778
  });
33731
33779
  this.opsWss.on("connection", (socket, _request) => {
33732
- const clientId = randomUUID19();
33780
+ const clientId = randomUUID20();
33733
33781
  this.opsClients.set(clientId, socket);
33734
33782
  socket.on("message", (data) => {
33735
33783
  this.handleOpsClientMessage(clientId, data);
@@ -33753,7 +33801,7 @@ var RelayServer = class _RelayServer {
33753
33801
  void _request;
33754
33802
  });
33755
33803
  this.canvasWss.on("connection", (socket, _request) => {
33756
- const clientId = randomUUID19();
33804
+ const clientId = randomUUID20();
33757
33805
  this.canvasClients.set(clientId, socket);
33758
33806
  socket.on("message", (data) => {
33759
33807
  this.handleCanvasClientMessage(clientId, data);
@@ -35435,4 +35483,4 @@ export {
35435
35483
  createOpenDevBrowserCore
35436
35484
  };
35437
35485
  /* v8 ignore next -- @preserve */
35438
- //# sourceMappingURL=chunk-EOX6U6Q4.js.map
35486
+ //# sourceMappingURL=chunk-XRDCSHKZ.js.map