@jucie.io/cli 1.0.0

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 (704) hide show
  1. package/dist/jucie.js +322 -0
  2. package/dist/stage/chunks/addAction-FSI6BXB4.js +1 -0
  3. package/dist/stage/chunks/addAnimationBinding-Y4VROY4L.js +1 -0
  4. package/dist/stage/chunks/addAttribute-CNJGHQSS.js +1 -0
  5. package/dist/stage/chunks/addComponent-VWD6O7CQ.js +1 -0
  6. package/dist/stage/chunks/addComputed-FQVHDUIE.js +1 -0
  7. package/dist/stage/chunks/addEvent-54ZE2DVJ.js +1 -0
  8. package/dist/stage/chunks/addLifecycleHook-VCCSTQ3G.js +1 -0
  9. package/dist/stage/chunks/addNode-AOA2MS25.js +1 -0
  10. package/dist/stage/chunks/addOption-ISGTUY6U.js +1 -0
  11. package/dist/stage/chunks/addParamToRoute-CRDV7MVF.js +1 -0
  12. package/dist/stage/chunks/addState-N3MBR533.js +1 -0
  13. package/dist/stage/chunks/addStore-PHY52777.js +1 -0
  14. package/dist/stage/chunks/addToken-QSTDKYFU.js +1 -0
  15. package/dist/stage/chunks/addValue-NBDF57UK.js +1 -0
  16. package/dist/stage/chunks/aiRelay-FSM6HGF7.js +1 -0
  17. package/dist/stage/chunks/assets-OAQXQVKM.js +1 -0
  18. package/dist/stage/chunks/bootstrap-LFMD2YRN.js +15 -0
  19. package/dist/stage/chunks/chunk-2SXGPNIX.js +1 -0
  20. package/dist/stage/chunks/chunk-2YZN7IFG.js +1 -0
  21. package/dist/stage/chunks/chunk-32FG2JVJ.js +1 -0
  22. package/dist/stage/chunks/chunk-32WBU6VH.js +1 -0
  23. package/dist/stage/chunks/chunk-45CXRNTO.js +1 -0
  24. package/dist/stage/chunks/chunk-45LFQ7GZ.js +1 -0
  25. package/dist/stage/chunks/chunk-4FPLUVEY.js +1 -0
  26. package/dist/stage/chunks/chunk-4MTM6BM7.js +1 -0
  27. package/dist/stage/chunks/chunk-4VALYMSL.js +1 -0
  28. package/dist/stage/chunks/chunk-4XNQRZ5E.js +1 -0
  29. package/dist/stage/chunks/chunk-4Y2YKFNP.js +1 -0
  30. package/dist/stage/chunks/chunk-5GOTVZFC.js +1 -0
  31. package/dist/stage/chunks/chunk-5OOKGI32.js +3 -0
  32. package/dist/stage/chunks/chunk-5PUPZLDN.js +1 -0
  33. package/dist/stage/chunks/chunk-5SOTDESD.js +1 -0
  34. package/dist/stage/chunks/chunk-5YRZZCXL.js +1 -0
  35. package/dist/stage/chunks/chunk-6EIGTDJQ.js +1 -0
  36. package/dist/stage/chunks/chunk-6GMURG26.js +1 -0
  37. package/dist/stage/chunks/chunk-6ZZBJPN5.js +1 -0
  38. package/dist/stage/chunks/chunk-73MAM44D.js +1 -0
  39. package/dist/stage/chunks/chunk-7L4V7JRT.js +1 -0
  40. package/dist/stage/chunks/chunk-AJVQKPCQ.js +1 -0
  41. package/dist/stage/chunks/chunk-AMAA7VJU.js +1 -0
  42. package/dist/stage/chunks/chunk-ARGFDBBK.js +1 -0
  43. package/dist/stage/chunks/chunk-BEYPHEBR.js +1 -0
  44. package/dist/stage/chunks/chunk-BS35FNXF.js +1 -0
  45. package/dist/stage/chunks/chunk-BVAPODQ7.js +5 -0
  46. package/dist/stage/chunks/chunk-C3DY5XVP.js +1 -0
  47. package/dist/stage/chunks/chunk-CUIKYKRZ.js +1 -0
  48. package/dist/stage/chunks/chunk-CVDUFBBG.js +1 -0
  49. package/dist/stage/chunks/chunk-D3V5OTLH.js +1 -0
  50. package/dist/stage/chunks/chunk-D6NZE747.js +1 -0
  51. package/dist/stage/chunks/chunk-DCOWKGJI.js +1 -0
  52. package/dist/stage/chunks/chunk-DSKLC3WF.js +1 -0
  53. package/dist/stage/chunks/chunk-EO7UBT4B.js +1 -0
  54. package/dist/stage/chunks/chunk-EPBR3BES.js +1 -0
  55. package/dist/stage/chunks/chunk-FSECMWCM.js +1 -0
  56. package/dist/stage/chunks/chunk-FTRUORC5.js +1 -0
  57. package/dist/stage/chunks/chunk-GDGHGTYN.js +1 -0
  58. package/dist/stage/chunks/chunk-GG4NWMR6.js +1 -0
  59. package/dist/stage/chunks/chunk-GIVV5ZCM.js +1 -0
  60. package/dist/stage/chunks/chunk-H3VC542J.js +1 -0
  61. package/dist/stage/chunks/chunk-HBEU7BDR.js +1 -0
  62. package/dist/stage/chunks/chunk-HBEWYDHO.js +1 -0
  63. package/dist/stage/chunks/chunk-HI7ALMQD.js +1 -0
  64. package/dist/stage/chunks/chunk-JKMOVSI4.js +1 -0
  65. package/dist/stage/chunks/chunk-K6PCHHH7.js +1 -0
  66. package/dist/stage/chunks/chunk-K7MC6G4X.js +1 -0
  67. package/dist/stage/chunks/chunk-KCVDFPJI.js +1 -0
  68. package/dist/stage/chunks/chunk-L4CU73MS.js +1 -0
  69. package/dist/stage/chunks/chunk-L7VQYHXR.js +1 -0
  70. package/dist/stage/chunks/chunk-LKQDYABR.js +1 -0
  71. package/dist/stage/chunks/chunk-LOILFK74.js +55 -0
  72. package/dist/stage/chunks/chunk-LR6DSVPP.js +1 -0
  73. package/dist/stage/chunks/chunk-MLL2ANA6.js +1 -0
  74. package/dist/stage/chunks/chunk-MXIF2FGR.js +1 -0
  75. package/dist/stage/chunks/chunk-N4AFW5M3.js +1 -0
  76. package/dist/stage/chunks/chunk-ODSNVDNS.js +1 -0
  77. package/dist/stage/chunks/chunk-OPVVANFS.js +1 -0
  78. package/dist/stage/chunks/chunk-OQ52NUNN.js +1 -0
  79. package/dist/stage/chunks/chunk-OWARHUEW.js +1 -0
  80. package/dist/stage/chunks/chunk-P3WBUN2B.js +1 -0
  81. package/dist/stage/chunks/chunk-P4ODI2G4.js +1 -0
  82. package/dist/stage/chunks/chunk-PSNKOX4A.js +37 -0
  83. package/dist/stage/chunks/chunk-PU3DZ3MV.js +1 -0
  84. package/dist/stage/chunks/chunk-QCZ4EDGZ.js +1 -0
  85. package/dist/stage/chunks/chunk-QG2BGE2O.js +1 -0
  86. package/dist/stage/chunks/chunk-QTBRJH2Q.js +1 -0
  87. package/dist/stage/chunks/chunk-RWJ7EPNM.js +1 -0
  88. package/dist/stage/chunks/chunk-RZ74UWF3.js +1 -0
  89. package/dist/stage/chunks/chunk-SECM4LZZ.js +1 -0
  90. package/dist/stage/chunks/chunk-SMO45CB3.js +1 -0
  91. package/dist/stage/chunks/chunk-SRRJXNKG.js +1 -0
  92. package/dist/stage/chunks/chunk-TBDEUSP4.js +1 -0
  93. package/dist/stage/chunks/chunk-TEUB5MUS.js +1 -0
  94. package/dist/stage/chunks/chunk-TV4PHWEG.js +1 -0
  95. package/dist/stage/chunks/chunk-U2OFNNHI.js +1 -0
  96. package/dist/stage/chunks/chunk-U3IV5DRQ.js +1 -0
  97. package/dist/stage/chunks/chunk-V4F2T2VR.js +1 -0
  98. package/dist/stage/chunks/chunk-V7BNWQS6.js +1 -0
  99. package/dist/stage/chunks/chunk-X2DYJVYZ.js +1 -0
  100. package/dist/stage/chunks/chunk-X6HJCJ3C.js +1 -0
  101. package/dist/stage/chunks/chunk-XKEDVW6X.js +1 -0
  102. package/dist/stage/chunks/chunk-YMUEID4R.js +1 -0
  103. package/dist/stage/chunks/chunk-YN5VQBDN.js +1 -0
  104. package/dist/stage/chunks/chunk-ZCAGAEP2.js +1 -0
  105. package/dist/stage/chunks/chunk-ZEWKYCOX.js +1 -0
  106. package/dist/stage/chunks/clearDestination-P3FTW7VJ.js +1 -0
  107. package/dist/stage/chunks/clearName-YFCAGL36.js +1 -0
  108. package/dist/stage/chunks/clearOptionsExpression-DF4IPDKH.js +1 -0
  109. package/dist/stage/chunks/clearRender-4YRSLAVX.js +1 -0
  110. package/dist/stage/chunks/clearRepeat-7TPSR6FL.js +1 -0
  111. package/dist/stage/chunks/contentEditor-VMXQHHFX.js +1 -0
  112. package/dist/stage/chunks/createAction-XVCUAVTP.js +1 -0
  113. package/dist/stage/chunks/createAnimation-YAXYGTZ2.js +1 -0
  114. package/dist/stage/chunks/createComputed-6XPJKJMP.js +1 -0
  115. package/dist/stage/chunks/createTextContent-BL7YGYP5.js +1 -0
  116. package/dist/stage/chunks/createValue-QMG7LOR4.js +1 -0
  117. package/dist/stage/chunks/disconnectNode-OY65I4GB.js +1 -0
  118. package/dist/stage/chunks/history-KHLKDDEZ.js +1 -0
  119. package/dist/stage/chunks/id-T5EU463K.js +1 -0
  120. package/dist/stage/chunks/main-3QLLHM43.js +1 -0
  121. package/dist/stage/chunks/main-7EICBMQ2.js +1 -0
  122. package/dist/stage/chunks/main-BLNWJ3UJ.js +1 -0
  123. package/dist/stage/chunks/main-NIVRMJR3.js +1 -0
  124. package/dist/stage/chunks/moveNodeToLastChildOf-PSU5X3UJ.js +1 -0
  125. package/dist/stage/chunks/nodeGraph-7M5JI3VA.js +1 -0
  126. package/dist/stage/chunks/normalizeEventName-6HVMB5GN.js +1 -0
  127. package/dist/stage/chunks/normalizeLayoutContext-NWKVWWWS.js +1 -0
  128. package/dist/stage/chunks/preview-bootstrap-LB3AH2CS.js +1 -0
  129. package/dist/stage/chunks/react-G5SWVCZA.js +1 -0
  130. package/dist/stage/chunks/removeAction-H3EDG2CG.js +1 -0
  131. package/dist/stage/chunks/removeAnimationBinding-JRXL2AOH.js +1 -0
  132. package/dist/stage/chunks/removeAttribute-6RYM7MYC.js +1 -0
  133. package/dist/stage/chunks/removeComputed-3HL3BXKY.js +1 -0
  134. package/dist/stage/chunks/removeEvent-CP3SVSHQ.js +1 -0
  135. package/dist/stage/chunks/removeLifecycleHook-Q76BUDFU.js +1 -0
  136. package/dist/stage/chunks/removeNode-OFMYW2LY.js +1 -0
  137. package/dist/stage/chunks/removeOption-Y6QYTQ7C.js +1 -0
  138. package/dist/stage/chunks/removeParamFromRoute-MHUMB7RO.js +1 -0
  139. package/dist/stage/chunks/removeState-HEDFV7HD.js +1 -0
  140. package/dist/stage/chunks/removeStore-BQDKUY3I.js +1 -0
  141. package/dist/stage/chunks/removeToken-CKODWTLX.js +1 -0
  142. package/dist/stage/chunks/removeValue-OTRFOOIB.js +1 -0
  143. package/dist/stage/chunks/screen-capture-bootstrap-BRQD4OSY.js +1 -0
  144. package/dist/stage/chunks/setDestination-3H4RDE7F.js +1 -0
  145. package/dist/stage/chunks/setHomePage-UZUWIELK.js +1 -0
  146. package/dist/stage/chunks/setHtmlId-V2DQ2Z6D.js +1 -0
  147. package/dist/stage/chunks/setName-QKDRLH7I.js +1 -0
  148. package/dist/stage/chunks/setNodeLayout-3LRJGZNL.js +1 -0
  149. package/dist/stage/chunks/setOptionsExpression-4NFPAI24.js +1 -0
  150. package/dist/stage/chunks/setRender-XQJWRRYD.js +1 -0
  151. package/dist/stage/chunks/setRepeat-PAW7YMSY.js +1 -0
  152. package/dist/stage/chunks/setTagName-Y7O7I6SO.js +1 -0
  153. package/dist/stage/chunks/updateAction-XSXILF2R.js +1 -0
  154. package/dist/stage/chunks/updateAnimationBinding-LQTVD3O6.js +1 -0
  155. package/dist/stage/chunks/updateAttribute-USA3HPEX.js +1 -0
  156. package/dist/stage/chunks/updateBounds-3L2AJ72O.js +1 -0
  157. package/dist/stage/chunks/updateComputed-UALAJ4RF.js +1 -0
  158. package/dist/stage/chunks/updateEvent-NXMQSGDQ.js +1 -0
  159. package/dist/stage/chunks/updateHtml-AEMCHPUQ.js +1 -0
  160. package/dist/stage/chunks/updateLifecycleHook-6MCUOVJH.js +1 -0
  161. package/dist/stage/chunks/updateOption-JCNXPYXP.js +1 -0
  162. package/dist/stage/chunks/updateRoute-CI3GOLVJ.js +1 -0
  163. package/dist/stage/chunks/updateState-QJID3WQV.js +1 -0
  164. package/dist/stage/chunks/updateStyle-FR7K7R73.js +1 -0
  165. package/dist/stage/chunks/updateToken-JX6R3YU7.js +1 -0
  166. package/dist/stage/chunks/updateValue-2B5ZNGZI.js +1 -0
  167. package/dist/stage/chunks/user-2EMXBDUX.js +1 -0
  168. package/dist/stage/chunks/validateStorePayload-PJ5AD64S.js +3 -0
  169. package/dist/stage/chunks/viewport-UOMSIPMH.js +1 -0
  170. package/dist/stage/chunks/window-KCOIKBXQ.js +1 -0
  171. package/dist/stage/design.js +1 -0
  172. package/dist/stage/dev.js +1 -0
  173. package/dist/stage/preview.js +1 -0
  174. package/dist/stage/prod.js +1 -0
  175. package/dist/stage-bundles/preact/chunks/addAction-5FCPHQHB.js +9 -0
  176. package/dist/stage-bundles/preact/chunks/addAnimationBinding-5UBXLWDB.js +7 -0
  177. package/dist/stage-bundles/preact/chunks/addAttribute-PWIHRX6Y.js +12 -0
  178. package/dist/stage-bundles/preact/chunks/addComponent-77PUZWLS.js +14 -0
  179. package/dist/stage-bundles/preact/chunks/addComputed-5J47SS67.js +9 -0
  180. package/dist/stage-bundles/preact/chunks/addEvent-P2KGVMLM.js +11 -0
  181. package/dist/stage-bundles/preact/chunks/addLifecycleHook-VSOAZGTG.js +8 -0
  182. package/dist/stage-bundles/preact/chunks/addNode-GCJR257S.js +19 -0
  183. package/dist/stage-bundles/preact/chunks/addOption-3U3LAV4C.js +8 -0
  184. package/dist/stage-bundles/preact/chunks/addParamToRoute-43UDJ4YE.js +7 -0
  185. package/dist/stage-bundles/preact/chunks/addState-ZWDA2CLN.js +11 -0
  186. package/dist/stage-bundles/preact/chunks/addStore-A4CRKMPO.js +7 -0
  187. package/dist/stage-bundles/preact/chunks/addToken-7P5NGEG4.js +8 -0
  188. package/dist/stage-bundles/preact/chunks/addValue-VQW7HQX7.js +8 -0
  189. package/dist/stage-bundles/preact/chunks/aiRelay-TFBJ7BF4.js +184 -0
  190. package/dist/stage-bundles/preact/chunks/assets-3W46CFCY.js +42 -0
  191. package/dist/stage-bundles/preact/chunks/bootstrap-VNVZAVV5.js +4080 -0
  192. package/dist/stage-bundles/preact/chunks/chunk-22J4JOPG.js +9 -0
  193. package/dist/stage-bundles/preact/chunks/chunk-236DY7EE.js +92 -0
  194. package/dist/stage-bundles/preact/chunks/chunk-2H2EQ2RG.js +24 -0
  195. package/dist/stage-bundles/preact/chunks/chunk-2Y25YY3N.js +12 -0
  196. package/dist/stage-bundles/preact/chunks/chunk-3MJKS6VX.js +19 -0
  197. package/dist/stage-bundles/preact/chunks/chunk-3NLDBJQD.js +12 -0
  198. package/dist/stage-bundles/preact/chunks/chunk-43L3STHY.js +172 -0
  199. package/dist/stage-bundles/preact/chunks/chunk-4A4WKSGY.js +66 -0
  200. package/dist/stage-bundles/preact/chunks/chunk-5C4ZCCYX.js +421 -0
  201. package/dist/stage-bundles/preact/chunks/chunk-65Q2CFW7.js +18 -0
  202. package/dist/stage-bundles/preact/chunks/chunk-667SIQGW.js +12 -0
  203. package/dist/stage-bundles/preact/chunks/chunk-6B6PKOOA.js +140 -0
  204. package/dist/stage-bundles/preact/chunks/chunk-6BXKZHN6.js +19 -0
  205. package/dist/stage-bundles/preact/chunks/chunk-6E57QUN7.js +21 -0
  206. package/dist/stage-bundles/preact/chunks/chunk-6QYYO5LM.js +12 -0
  207. package/dist/stage-bundles/preact/chunks/chunk-6R3QXFFF.js +47 -0
  208. package/dist/stage-bundles/preact/chunks/chunk-6RLI7CFQ.js +12 -0
  209. package/dist/stage-bundles/preact/chunks/chunk-6TDZGYJG.js +13 -0
  210. package/dist/stage-bundles/preact/chunks/chunk-AI3MQHWR.js +51 -0
  211. package/dist/stage-bundles/preact/chunks/chunk-BWZPEI76.js +18 -0
  212. package/dist/stage-bundles/preact/chunks/chunk-CHZVDVQC.js +8 -0
  213. package/dist/stage-bundles/preact/chunks/chunk-CJOJNMRC.js +8 -0
  214. package/dist/stage-bundles/preact/chunks/chunk-CXATTVPL.js +24 -0
  215. package/dist/stage-bundles/preact/chunks/chunk-CYH47R7O.js +49 -0
  216. package/dist/stage-bundles/preact/chunks/chunk-DBHMBCBM.js +14 -0
  217. package/dist/stage-bundles/preact/chunks/chunk-DCKGUW2M.js +8 -0
  218. package/dist/stage-bundles/preact/chunks/chunk-EB5FGFFG.js +12 -0
  219. package/dist/stage-bundles/preact/chunks/chunk-F6JYAVEC.js +15 -0
  220. package/dist/stage-bundles/preact/chunks/chunk-F77HGOQB.js +8 -0
  221. package/dist/stage-bundles/preact/chunks/chunk-FSIANI7E.js +11 -0
  222. package/dist/stage-bundles/preact/chunks/chunk-FZZDMYBZ.js +12 -0
  223. package/dist/stage-bundles/preact/chunks/chunk-H75SQT4U.js +105 -0
  224. package/dist/stage-bundles/preact/chunks/chunk-HPCVUQI4.js +224 -0
  225. package/dist/stage-bundles/preact/chunks/chunk-I5OE2BAU.js +25863 -0
  226. package/dist/stage-bundles/preact/chunks/chunk-IDGFZWZY.js +13 -0
  227. package/dist/stage-bundles/preact/chunks/chunk-IIIXGKVH.js +17 -0
  228. package/dist/stage-bundles/preact/chunks/chunk-ILZWSEWK.js +19 -0
  229. package/dist/stage-bundles/preact/chunks/chunk-IO3NSIEJ.js +8 -0
  230. package/dist/stage-bundles/preact/chunks/chunk-ISOZDDO2.js +157 -0
  231. package/dist/stage-bundles/preact/chunks/chunk-JDIO27MU.js +8 -0
  232. package/dist/stage-bundles/preact/chunks/chunk-JJVRBJGQ.js +1353 -0
  233. package/dist/stage-bundles/preact/chunks/chunk-K7ZULZJF.js +116 -0
  234. package/dist/stage-bundles/preact/chunks/chunk-KF4MVCJ6.js +13 -0
  235. package/dist/stage-bundles/preact/chunks/chunk-KHURU62K.js +27 -0
  236. package/dist/stage-bundles/preact/chunks/chunk-KKLU24SB.js +33 -0
  237. package/dist/stage-bundles/preact/chunks/chunk-KOBPYD4N.js +8 -0
  238. package/dist/stage-bundles/preact/chunks/chunk-LH4ZDX3T.js +58 -0
  239. package/dist/stage-bundles/preact/chunks/chunk-M3YT4JBL.js +12 -0
  240. package/dist/stage-bundles/preact/chunks/chunk-MAPYANXA.js +8 -0
  241. package/dist/stage-bundles/preact/chunks/chunk-MBN7CVNW.js +4290 -0
  242. package/dist/stage-bundles/preact/chunks/chunk-MMCB6GGX.js +8 -0
  243. package/dist/stage-bundles/preact/chunks/chunk-NCUWZXVZ.js +8 -0
  244. package/dist/stage-bundles/preact/chunks/chunk-O3KQTA3H.js +21 -0
  245. package/dist/stage-bundles/preact/chunks/chunk-OARTKQPG.js +153 -0
  246. package/dist/stage-bundles/preact/chunks/chunk-P7UUT7BU.js +12 -0
  247. package/dist/stage-bundles/preact/chunks/chunk-PHVB7SAE.js +22 -0
  248. package/dist/stage-bundles/preact/chunks/chunk-PKSFATQY.js +10 -0
  249. package/dist/stage-bundles/preact/chunks/chunk-PU2GET2S.js +18 -0
  250. package/dist/stage-bundles/preact/chunks/chunk-QBXKRHK5.js +11 -0
  251. package/dist/stage-bundles/preact/chunks/chunk-QCQXLZJH.js +18 -0
  252. package/dist/stage-bundles/preact/chunks/chunk-QIOKODGT.js +14 -0
  253. package/dist/stage-bundles/preact/chunks/chunk-R5DUYWXP.js +8 -0
  254. package/dist/stage-bundles/preact/chunks/chunk-RCIDQRAS.js +54 -0
  255. package/dist/stage-bundles/preact/chunks/chunk-RI7XWDHX.js +10 -0
  256. package/dist/stage-bundles/preact/chunks/chunk-RZG5LCPH.js +12 -0
  257. package/dist/stage-bundles/preact/chunks/chunk-S4NZQRJJ.js +12 -0
  258. package/dist/stage-bundles/preact/chunks/chunk-S5L2YBXG.js +143 -0
  259. package/dist/stage-bundles/preact/chunks/chunk-SF5BLQ7P.js +14 -0
  260. package/dist/stage-bundles/preact/chunks/chunk-SPTKNGHA.js +14 -0
  261. package/dist/stage-bundles/preact/chunks/chunk-TKHCH4WB.js +35 -0
  262. package/dist/stage-bundles/preact/chunks/chunk-TVB3GD7L.js +8 -0
  263. package/dist/stage-bundles/preact/chunks/chunk-TVGXBOIT.js +18 -0
  264. package/dist/stage-bundles/preact/chunks/chunk-U7U7L7XZ.js +31 -0
  265. package/dist/stage-bundles/preact/chunks/chunk-UFHA3ODE.js +528 -0
  266. package/dist/stage-bundles/preact/chunks/chunk-UHGV762U.js +12 -0
  267. package/dist/stage-bundles/preact/chunks/chunk-V6MKKC23.js +18 -0
  268. package/dist/stage-bundles/preact/chunks/chunk-VK4FEQKG.js +18 -0
  269. package/dist/stage-bundles/preact/chunks/chunk-VZNGMF63.js +12 -0
  270. package/dist/stage-bundles/preact/chunks/chunk-W5CGYUVM.js +8 -0
  271. package/dist/stage-bundles/preact/chunks/chunk-W7QH4UII.js +54 -0
  272. package/dist/stage-bundles/preact/chunks/chunk-WMV5J37V.js +8 -0
  273. package/dist/stage-bundles/preact/chunks/chunk-WXDXWNWW.js +8 -0
  274. package/dist/stage-bundles/preact/chunks/chunk-XKFPCFZH.js +8 -0
  275. package/dist/stage-bundles/preact/chunks/chunk-YCZNHFZA.js +15 -0
  276. package/dist/stage-bundles/preact/chunks/chunk-YEEGISBQ.js +23 -0
  277. package/dist/stage-bundles/preact/chunks/chunk-YM3NAGCN.js +8 -0
  278. package/dist/stage-bundles/preact/chunks/chunk-YMVTSVEM.js +26 -0
  279. package/dist/stage-bundles/preact/chunks/chunk-YXNMNEJV.js +329 -0
  280. package/dist/stage-bundles/preact/chunks/clearDestination-EMCIEDAP.js +7 -0
  281. package/dist/stage-bundles/preact/chunks/clearName-O7J77F77.js +7 -0
  282. package/dist/stage-bundles/preact/chunks/clearOptionsExpression-RGDXKYVX.js +7 -0
  283. package/dist/stage-bundles/preact/chunks/clearRender-DFMNHXXQ.js +7 -0
  284. package/dist/stage-bundles/preact/chunks/clearRepeat-436RGATR.js +7 -0
  285. package/dist/stage-bundles/preact/chunks/contentEditor-NLMG4U5G.js +67 -0
  286. package/dist/stage-bundles/preact/chunks/createAction-CKUAX4TU.js +8 -0
  287. package/dist/stage-bundles/preact/chunks/createAnimation-URI5366N.js +7 -0
  288. package/dist/stage-bundles/preact/chunks/createComputed-I23CA5NX.js +8 -0
  289. package/dist/stage-bundles/preact/chunks/createTextContent-K4G7KNQ5.js +10 -0
  290. package/dist/stage-bundles/preact/chunks/createValue-D5MP2SMM.js +7 -0
  291. package/dist/stage-bundles/preact/chunks/disconnectNode-GM5F3ZMB.js +8 -0
  292. package/dist/stage-bundles/preact/chunks/history-7PFZW7N6.js +51 -0
  293. package/dist/stage-bundles/preact/chunks/id-VSNJWKHU.js +53 -0
  294. package/dist/stage-bundles/preact/chunks/main-GQD7B74Q.js +103 -0
  295. package/dist/stage-bundles/preact/chunks/main-M2BBXKSW.js +154 -0
  296. package/dist/stage-bundles/preact/chunks/main-QDV3BMBP.js +109 -0
  297. package/dist/stage-bundles/preact/chunks/main-QOB4HBIK.js +31 -0
  298. package/dist/stage-bundles/preact/chunks/moveNodeToLastChildOf-Z6JUVLGM.js +12 -0
  299. package/dist/stage-bundles/preact/chunks/nodeGraph-TTOC6H4R.js +53 -0
  300. package/dist/stage-bundles/preact/chunks/normalizeEventName-2JPOX7Y6.js +128 -0
  301. package/dist/stage-bundles/preact/chunks/normalizeLayoutContext-Y44QODFX.js +9 -0
  302. package/dist/stage-bundles/preact/chunks/preact-FCSVXHIZ.js +39 -0
  303. package/dist/stage-bundles/preact/chunks/preview-bootstrap-QHWGL6NH.js +137 -0
  304. package/dist/stage-bundles/preact/chunks/removeAction-PPAIVTW3.js +7 -0
  305. package/dist/stage-bundles/preact/chunks/removeAnimationBinding-UQ24BSXP.js +7 -0
  306. package/dist/stage-bundles/preact/chunks/removeAttribute-P2IDGOQH.js +7 -0
  307. package/dist/stage-bundles/preact/chunks/removeComputed-7C66NNZA.js +7 -0
  308. package/dist/stage-bundles/preact/chunks/removeEvent-KTSOCV4C.js +7 -0
  309. package/dist/stage-bundles/preact/chunks/removeLifecycleHook-NKXLF3QT.js +7 -0
  310. package/dist/stage-bundles/preact/chunks/removeNode-A7C34C42.js +10 -0
  311. package/dist/stage-bundles/preact/chunks/removeOption-6HW62A5Y.js +7 -0
  312. package/dist/stage-bundles/preact/chunks/removeParamFromRoute-LIKPDVU4.js +7 -0
  313. package/dist/stage-bundles/preact/chunks/removeState-PO6J3JYQ.js +7 -0
  314. package/dist/stage-bundles/preact/chunks/removeStore-5ZZ57NHV.js +7 -0
  315. package/dist/stage-bundles/preact/chunks/removeToken-BKJE3U6Q.js +7 -0
  316. package/dist/stage-bundles/preact/chunks/removeValue-5FNPXWNL.js +7 -0
  317. package/dist/stage-bundles/preact/chunks/screen-capture-bootstrap-YWUN6QRP.js +128 -0
  318. package/dist/stage-bundles/preact/chunks/setDestination-DAYIYYIV.js +7 -0
  319. package/dist/stage-bundles/preact/chunks/setHomePage-MHCP4P24.js +7 -0
  320. package/dist/stage-bundles/preact/chunks/setHtmlId-3HYPFT3T.js +7 -0
  321. package/dist/stage-bundles/preact/chunks/setName-OQOO3URG.js +7 -0
  322. package/dist/stage-bundles/preact/chunks/setNodeLayout-PWQS32M2.js +10 -0
  323. package/dist/stage-bundles/preact/chunks/setOptionsExpression-XZZOJPCM.js +8 -0
  324. package/dist/stage-bundles/preact/chunks/setRender-NHXZZGME.js +10 -0
  325. package/dist/stage-bundles/preact/chunks/setRepeat-YZTZFDTQ.js +10 -0
  326. package/dist/stage-bundles/preact/chunks/setTagName-EGPQ66XI.js +7 -0
  327. package/dist/stage-bundles/preact/chunks/updateAction-ZSNXUEQA.js +9 -0
  328. package/dist/stage-bundles/preact/chunks/updateAnimationBinding-X2UXYQKJ.js +7 -0
  329. package/dist/stage-bundles/preact/chunks/updateAttribute-ODXM7YXA.js +12 -0
  330. package/dist/stage-bundles/preact/chunks/updateBounds-PEGOZ4FT.js +7 -0
  331. package/dist/stage-bundles/preact/chunks/updateComputed-6LNN453F.js +9 -0
  332. package/dist/stage-bundles/preact/chunks/updateEvent-ZHCKBJIM.js +11 -0
  333. package/dist/stage-bundles/preact/chunks/updateHtml-6BPU5PRY.js +7 -0
  334. package/dist/stage-bundles/preact/chunks/updateLifecycleHook-JEMQQYM5.js +8 -0
  335. package/dist/stage-bundles/preact/chunks/updateOption-SH33P5WW.js +8 -0
  336. package/dist/stage-bundles/preact/chunks/updateRoute-3RRPY2T5.js +7 -0
  337. package/dist/stage-bundles/preact/chunks/updateState-WRLF4SSC.js +11 -0
  338. package/dist/stage-bundles/preact/chunks/updateStyle-WAPTDAU5.js +7 -0
  339. package/dist/stage-bundles/preact/chunks/updateToken-CFIIILXB.js +7 -0
  340. package/dist/stage-bundles/preact/chunks/updateValue-JTEEC2B6.js +8 -0
  341. package/dist/stage-bundles/preact/chunks/user-ZLGCTRZX.js +44 -0
  342. package/dist/stage-bundles/preact/chunks/validateStorePayload-7A2INWJV.js +61 -0
  343. package/dist/stage-bundles/preact/chunks/viewport-OTNUF4XI.js +21 -0
  344. package/dist/stage-bundles/preact/chunks/window-73DBL24T.js +32 -0
  345. package/dist/stage-bundles/preact/entry.js +85 -0
  346. package/dist/stage-bundles/preact/framework-compat.js +103 -0
  347. package/dist/stage-bundles/preact/framework-hooks.js +35 -0
  348. package/dist/stage-bundles/preact/framework-jsx-runtime.js +102 -0
  349. package/dist/stage-bundles/preact/framework.js +33 -0
  350. package/dist/stage-bundles/preact/sdk.js +44 -0
  351. package/dist/stage-bundles/react/chunks/addAction-UV7MSISB.js +9 -0
  352. package/dist/stage-bundles/react/chunks/addAnimationBinding-M4VWTNNB.js +7 -0
  353. package/dist/stage-bundles/react/chunks/addAttribute-V4C3VUVK.js +12 -0
  354. package/dist/stage-bundles/react/chunks/addComponent-GUOHFGDG.js +14 -0
  355. package/dist/stage-bundles/react/chunks/addComputed-N3SUFIVQ.js +9 -0
  356. package/dist/stage-bundles/react/chunks/addEvent-GQCCRSGP.js +11 -0
  357. package/dist/stage-bundles/react/chunks/addLifecycleHook-GC5MHVSH.js +8 -0
  358. package/dist/stage-bundles/react/chunks/addNode-TX462HCE.js +19 -0
  359. package/dist/stage-bundles/react/chunks/addOption-7T3ZUC3A.js +8 -0
  360. package/dist/stage-bundles/react/chunks/addParamToRoute-Q6Z5A6RQ.js +7 -0
  361. package/dist/stage-bundles/react/chunks/addState-IKDWEJIW.js +11 -0
  362. package/dist/stage-bundles/react/chunks/addStore-SR7UK24M.js +7 -0
  363. package/dist/stage-bundles/react/chunks/addToken-2G5DPV5Z.js +8 -0
  364. package/dist/stage-bundles/react/chunks/addValue-UYM36PD7.js +8 -0
  365. package/dist/stage-bundles/react/chunks/aiRelay-RULC7GEA.js +184 -0
  366. package/dist/stage-bundles/react/chunks/assets-24YGC7SD.js +42 -0
  367. package/dist/stage-bundles/react/chunks/bootstrap-6YUSZ2AL.js +4080 -0
  368. package/dist/stage-bundles/react/chunks/chunk-22J4JOPG.js +9 -0
  369. package/dist/stage-bundles/react/chunks/chunk-236DY7EE.js +92 -0
  370. package/dist/stage-bundles/react/chunks/chunk-2H2EQ2RG.js +24 -0
  371. package/dist/stage-bundles/react/chunks/chunk-2Y25YY3N.js +12 -0
  372. package/dist/stage-bundles/react/chunks/chunk-3BDWFE4Q.js +1353 -0
  373. package/dist/stage-bundles/react/chunks/chunk-3MJKS6VX.js +19 -0
  374. package/dist/stage-bundles/react/chunks/chunk-3NLDBJQD.js +12 -0
  375. package/dist/stage-bundles/react/chunks/chunk-5C4ODH2L.js +198 -0
  376. package/dist/stage-bundles/react/chunks/chunk-5EXNWE4S.js +4290 -0
  377. package/dist/stage-bundles/react/chunks/chunk-65Q2CFW7.js +18 -0
  378. package/dist/stage-bundles/react/chunks/chunk-667SIQGW.js +12 -0
  379. package/dist/stage-bundles/react/chunks/chunk-6B6PKOOA.js +140 -0
  380. package/dist/stage-bundles/react/chunks/chunk-6BXKZHN6.js +19 -0
  381. package/dist/stage-bundles/react/chunks/chunk-6E57QUN7.js +21 -0
  382. package/dist/stage-bundles/react/chunks/chunk-6QYYO5LM.js +12 -0
  383. package/dist/stage-bundles/react/chunks/chunk-6R3QXFFF.js +47 -0
  384. package/dist/stage-bundles/react/chunks/chunk-6RLI7CFQ.js +12 -0
  385. package/dist/stage-bundles/react/chunks/chunk-6TDZGYJG.js +13 -0
  386. package/dist/stage-bundles/react/chunks/chunk-7MWSPEGH.js +172 -0
  387. package/dist/stage-bundles/react/chunks/chunk-A65NYJEZ.js +157 -0
  388. package/dist/stage-bundles/react/chunks/chunk-ABVPSM2D.js +278 -0
  389. package/dist/stage-bundles/react/chunks/chunk-AI3MQHWR.js +51 -0
  390. package/dist/stage-bundles/react/chunks/chunk-BWZPEI76.js +18 -0
  391. package/dist/stage-bundles/react/chunks/chunk-CHZVDVQC.js +8 -0
  392. package/dist/stage-bundles/react/chunks/chunk-CJOJNMRC.js +8 -0
  393. package/dist/stage-bundles/react/chunks/chunk-CXATTVPL.js +24 -0
  394. package/dist/stage-bundles/react/chunks/chunk-DBHMBCBM.js +14 -0
  395. package/dist/stage-bundles/react/chunks/chunk-DCKGUW2M.js +8 -0
  396. package/dist/stage-bundles/react/chunks/chunk-EB5FGFFG.js +12 -0
  397. package/dist/stage-bundles/react/chunks/chunk-F6JYAVEC.js +15 -0
  398. package/dist/stage-bundles/react/chunks/chunk-F77HGOQB.js +8 -0
  399. package/dist/stage-bundles/react/chunks/chunk-FSIANI7E.js +11 -0
  400. package/dist/stage-bundles/react/chunks/chunk-FZZDMYBZ.js +12 -0
  401. package/dist/stage-bundles/react/chunks/chunk-H75SQT4U.js +105 -0
  402. package/dist/stage-bundles/react/chunks/chunk-IDGFZWZY.js +13 -0
  403. package/dist/stage-bundles/react/chunks/chunk-IIIXGKVH.js +17 -0
  404. package/dist/stage-bundles/react/chunks/chunk-ILZWSEWK.js +19 -0
  405. package/dist/stage-bundles/react/chunks/chunk-IO3NSIEJ.js +8 -0
  406. package/dist/stage-bundles/react/chunks/chunk-JDIO27MU.js +8 -0
  407. package/dist/stage-bundles/react/chunks/chunk-K7ZULZJF.js +116 -0
  408. package/dist/stage-bundles/react/chunks/chunk-KF4MVCJ6.js +13 -0
  409. package/dist/stage-bundles/react/chunks/chunk-KHURU62K.js +27 -0
  410. package/dist/stage-bundles/react/chunks/chunk-KKLU24SB.js +33 -0
  411. package/dist/stage-bundles/react/chunks/chunk-KOBPYD4N.js +8 -0
  412. package/dist/stage-bundles/react/chunks/chunk-LH4ZDX3T.js +58 -0
  413. package/dist/stage-bundles/react/chunks/chunk-M3YT4JBL.js +12 -0
  414. package/dist/stage-bundles/react/chunks/chunk-MAPYANXA.js +8 -0
  415. package/dist/stage-bundles/react/chunks/chunk-MMCB6GGX.js +8 -0
  416. package/dist/stage-bundles/react/chunks/chunk-NCUWZXVZ.js +8 -0
  417. package/dist/stage-bundles/react/chunks/chunk-O3KQTA3H.js +21 -0
  418. package/dist/stage-bundles/react/chunks/chunk-P7UUT7BU.js +12 -0
  419. package/dist/stage-bundles/react/chunks/chunk-PHVB7SAE.js +22 -0
  420. package/dist/stage-bundles/react/chunks/chunk-PKSFATQY.js +10 -0
  421. package/dist/stage-bundles/react/chunks/chunk-PU2GET2S.js +18 -0
  422. package/dist/stage-bundles/react/chunks/chunk-QBXKRHK5.js +11 -0
  423. package/dist/stage-bundles/react/chunks/chunk-QCQXLZJH.js +18 -0
  424. package/dist/stage-bundles/react/chunks/chunk-QIOKODGT.js +14 -0
  425. package/dist/stage-bundles/react/chunks/chunk-QTTED7GZ.js +49 -0
  426. package/dist/stage-bundles/react/chunks/chunk-QVH24VHP.js +473 -0
  427. package/dist/stage-bundles/react/chunks/chunk-R5DUYWXP.js +8 -0
  428. package/dist/stage-bundles/react/chunks/chunk-RCIDQRAS.js +54 -0
  429. package/dist/stage-bundles/react/chunks/chunk-RI7XWDHX.js +10 -0
  430. package/dist/stage-bundles/react/chunks/chunk-RZDFRJVR.js +13065 -0
  431. package/dist/stage-bundles/react/chunks/chunk-RZG5LCPH.js +12 -0
  432. package/dist/stage-bundles/react/chunks/chunk-S4NZQRJJ.js +12 -0
  433. package/dist/stage-bundles/react/chunks/chunk-S5L2YBXG.js +143 -0
  434. package/dist/stage-bundles/react/chunks/chunk-SF5BLQ7P.js +14 -0
  435. package/dist/stage-bundles/react/chunks/chunk-SPTKNGHA.js +14 -0
  436. package/dist/stage-bundles/react/chunks/chunk-TKHCH4WB.js +35 -0
  437. package/dist/stage-bundles/react/chunks/chunk-TVB3GD7L.js +8 -0
  438. package/dist/stage-bundles/react/chunks/chunk-TVGXBOIT.js +18 -0
  439. package/dist/stage-bundles/react/chunks/chunk-U7U7L7XZ.js +31 -0
  440. package/dist/stage-bundles/react/chunks/chunk-UHGV762U.js +12 -0
  441. package/dist/stage-bundles/react/chunks/chunk-V6MKKC23.js +18 -0
  442. package/dist/stage-bundles/react/chunks/chunk-VK4FEQKG.js +18 -0
  443. package/dist/stage-bundles/react/chunks/chunk-VZNGMF63.js +12 -0
  444. package/dist/stage-bundles/react/chunks/chunk-W5CGYUVM.js +8 -0
  445. package/dist/stage-bundles/react/chunks/chunk-W7QH4UII.js +54 -0
  446. package/dist/stage-bundles/react/chunks/chunk-WMV5J37V.js +8 -0
  447. package/dist/stage-bundles/react/chunks/chunk-WXDXWNWW.js +8 -0
  448. package/dist/stage-bundles/react/chunks/chunk-XKFPCFZH.js +8 -0
  449. package/dist/stage-bundles/react/chunks/chunk-XVJJ3LG4.js +528 -0
  450. package/dist/stage-bundles/react/chunks/chunk-YCZNHFZA.js +15 -0
  451. package/dist/stage-bundles/react/chunks/chunk-YEEGISBQ.js +23 -0
  452. package/dist/stage-bundles/react/chunks/chunk-YM3NAGCN.js +8 -0
  453. package/dist/stage-bundles/react/chunks/chunk-YMVTSVEM.js +26 -0
  454. package/dist/stage-bundles/react/chunks/chunk-ZHZLVPR6.js +68 -0
  455. package/dist/stage-bundles/react/chunks/chunk-ZP3VSN3A.js +12093 -0
  456. package/dist/stage-bundles/react/chunks/clearDestination-KO6YHLX2.js +7 -0
  457. package/dist/stage-bundles/react/chunks/clearName-AAUKJ3OX.js +7 -0
  458. package/dist/stage-bundles/react/chunks/clearOptionsExpression-YGCMAZEE.js +7 -0
  459. package/dist/stage-bundles/react/chunks/clearRender-TTNIVIPG.js +7 -0
  460. package/dist/stage-bundles/react/chunks/clearRepeat-AZLSTBXI.js +7 -0
  461. package/dist/stage-bundles/react/chunks/contentEditor-HE34KY6R.js +67 -0
  462. package/dist/stage-bundles/react/chunks/createAction-N6UW7YDP.js +8 -0
  463. package/dist/stage-bundles/react/chunks/createAnimation-RIBXIT62.js +7 -0
  464. package/dist/stage-bundles/react/chunks/createComputed-KKULWYID.js +8 -0
  465. package/dist/stage-bundles/react/chunks/createTextContent-R5YRKNJL.js +10 -0
  466. package/dist/stage-bundles/react/chunks/createValue-SL4Y3LPI.js +7 -0
  467. package/dist/stage-bundles/react/chunks/disconnectNode-J6YACRLT.js +8 -0
  468. package/dist/stage-bundles/react/chunks/history-KTZZH7TG.js +51 -0
  469. package/dist/stage-bundles/react/chunks/id-WBHG2QOH.js +53 -0
  470. package/dist/stage-bundles/react/chunks/main-EMRULEYO.js +103 -0
  471. package/dist/stage-bundles/react/chunks/main-IVVVSUSO.js +109 -0
  472. package/dist/stage-bundles/react/chunks/main-Y7QHSAW7.js +154 -0
  473. package/dist/stage-bundles/react/chunks/main-YSWDZAGN.js +31 -0
  474. package/dist/stage-bundles/react/chunks/moveNodeToLastChildOf-IUKGA7IO.js +12 -0
  475. package/dist/stage-bundles/react/chunks/nodeGraph-GGV7TAPQ.js +53 -0
  476. package/dist/stage-bundles/react/chunks/normalizeEventName-EWVVRI6K.js +128 -0
  477. package/dist/stage-bundles/react/chunks/normalizeLayoutContext-TO4WKUWF.js +9 -0
  478. package/dist/stage-bundles/react/chunks/preview-bootstrap-FVKBRYC5.js +137 -0
  479. package/dist/stage-bundles/react/chunks/react-GONY7QDQ.js +44 -0
  480. package/dist/stage-bundles/react/chunks/removeAction-4PGYJ6CA.js +7 -0
  481. package/dist/stage-bundles/react/chunks/removeAnimationBinding-3SYE7FD3.js +7 -0
  482. package/dist/stage-bundles/react/chunks/removeAttribute-4QEKTGTP.js +7 -0
  483. package/dist/stage-bundles/react/chunks/removeComputed-5J772TBY.js +7 -0
  484. package/dist/stage-bundles/react/chunks/removeEvent-7ODGVHMT.js +7 -0
  485. package/dist/stage-bundles/react/chunks/removeLifecycleHook-3XIZU6TW.js +7 -0
  486. package/dist/stage-bundles/react/chunks/removeNode-DY2ULYNK.js +10 -0
  487. package/dist/stage-bundles/react/chunks/removeOption-V4NBH6EE.js +7 -0
  488. package/dist/stage-bundles/react/chunks/removeParamFromRoute-IMXTBRSZ.js +7 -0
  489. package/dist/stage-bundles/react/chunks/removeState-EBT6YGSZ.js +7 -0
  490. package/dist/stage-bundles/react/chunks/removeStore-UJA67G3O.js +7 -0
  491. package/dist/stage-bundles/react/chunks/removeToken-EDVBR3OL.js +7 -0
  492. package/dist/stage-bundles/react/chunks/removeValue-UPOTPB3T.js +7 -0
  493. package/dist/stage-bundles/react/chunks/screen-capture-bootstrap-XMTHAMIX.js +128 -0
  494. package/dist/stage-bundles/react/chunks/setDestination-M6MQACBQ.js +7 -0
  495. package/dist/stage-bundles/react/chunks/setHomePage-4U4Z3RU7.js +7 -0
  496. package/dist/stage-bundles/react/chunks/setHtmlId-MN7AQG5H.js +7 -0
  497. package/dist/stage-bundles/react/chunks/setName-W4MXGWGB.js +7 -0
  498. package/dist/stage-bundles/react/chunks/setNodeLayout-K2VNUD2H.js +10 -0
  499. package/dist/stage-bundles/react/chunks/setOptionsExpression-KQLKXH4C.js +8 -0
  500. package/dist/stage-bundles/react/chunks/setRender-UJAXCTRA.js +10 -0
  501. package/dist/stage-bundles/react/chunks/setRepeat-X5GZ4F2P.js +10 -0
  502. package/dist/stage-bundles/react/chunks/setTagName-5DMTFJTJ.js +7 -0
  503. package/dist/stage-bundles/react/chunks/updateAction-6KYOHLA3.js +9 -0
  504. package/dist/stage-bundles/react/chunks/updateAnimationBinding-SENX3Z5S.js +7 -0
  505. package/dist/stage-bundles/react/chunks/updateAttribute-VWGV37R7.js +12 -0
  506. package/dist/stage-bundles/react/chunks/updateBounds-WKOI6XJ3.js +7 -0
  507. package/dist/stage-bundles/react/chunks/updateComputed-7QBBBXFC.js +9 -0
  508. package/dist/stage-bundles/react/chunks/updateEvent-4PDSQ3Q4.js +11 -0
  509. package/dist/stage-bundles/react/chunks/updateHtml-EJFF2LPA.js +7 -0
  510. package/dist/stage-bundles/react/chunks/updateLifecycleHook-36JI5KSF.js +8 -0
  511. package/dist/stage-bundles/react/chunks/updateOption-ZEZ4TP7K.js +8 -0
  512. package/dist/stage-bundles/react/chunks/updateRoute-P5OTKOOG.js +7 -0
  513. package/dist/stage-bundles/react/chunks/updateState-B2RIQRWF.js +11 -0
  514. package/dist/stage-bundles/react/chunks/updateStyle-FN7CGZTJ.js +7 -0
  515. package/dist/stage-bundles/react/chunks/updateToken-DMJBW7ZK.js +7 -0
  516. package/dist/stage-bundles/react/chunks/updateValue-6FPRH4CG.js +8 -0
  517. package/dist/stage-bundles/react/chunks/user-MDIKS6ZN.js +44 -0
  518. package/dist/stage-bundles/react/chunks/validateStorePayload-HE65PPAB.js +61 -0
  519. package/dist/stage-bundles/react/chunks/viewport-DKL3EJOU.js +21 -0
  520. package/dist/stage-bundles/react/chunks/window-RCEXDLL7.js +32 -0
  521. package/dist/stage-bundles/react/entry.js +85 -0
  522. package/dist/stage-bundles/react/framework-dom-client.js +22 -0
  523. package/dist/stage-bundles/react/framework-dom.js +21 -0
  524. package/dist/stage-bundles/react/framework-jsx-runtime.js +73 -0
  525. package/dist/stage-bundles/react/framework.js +20 -0
  526. package/dist/stage-bundles/react/sdk.js +49 -0
  527. package/dist/stage-bundles/vue/chunks/addAction-5FCPHQHB.js +9 -0
  528. package/dist/stage-bundles/vue/chunks/addAnimationBinding-5UBXLWDB.js +7 -0
  529. package/dist/stage-bundles/vue/chunks/addAttribute-PWIHRX6Y.js +12 -0
  530. package/dist/stage-bundles/vue/chunks/addComponent-77PUZWLS.js +14 -0
  531. package/dist/stage-bundles/vue/chunks/addComputed-5J47SS67.js +9 -0
  532. package/dist/stage-bundles/vue/chunks/addEvent-P2KGVMLM.js +11 -0
  533. package/dist/stage-bundles/vue/chunks/addLifecycleHook-VSOAZGTG.js +8 -0
  534. package/dist/stage-bundles/vue/chunks/addNode-DMJXP7VV.js +19 -0
  535. package/dist/stage-bundles/vue/chunks/addOption-3U3LAV4C.js +8 -0
  536. package/dist/stage-bundles/vue/chunks/addParamToRoute-43UDJ4YE.js +7 -0
  537. package/dist/stage-bundles/vue/chunks/addState-ZWDA2CLN.js +11 -0
  538. package/dist/stage-bundles/vue/chunks/addStore-A4CRKMPO.js +7 -0
  539. package/dist/stage-bundles/vue/chunks/addToken-7P5NGEG4.js +8 -0
  540. package/dist/stage-bundles/vue/chunks/addValue-VQW7HQX7.js +8 -0
  541. package/dist/stage-bundles/vue/chunks/aiRelay-TFBJ7BF4.js +184 -0
  542. package/dist/stage-bundles/vue/chunks/assets-3W46CFCY.js +42 -0
  543. package/dist/stage-bundles/vue/chunks/bootstrap-Y4GN2FZZ.js +4078 -0
  544. package/dist/stage-bundles/vue/chunks/chunk-22J4JOPG.js +9 -0
  545. package/dist/stage-bundles/vue/chunks/chunk-2H2EQ2RG.js +24 -0
  546. package/dist/stage-bundles/vue/chunks/chunk-2Y25YY3N.js +12 -0
  547. package/dist/stage-bundles/vue/chunks/chunk-3MJKS6VX.js +19 -0
  548. package/dist/stage-bundles/vue/chunks/chunk-3N472G56.js +4290 -0
  549. package/dist/stage-bundles/vue/chunks/chunk-3NLDBJQD.js +12 -0
  550. package/dist/stage-bundles/vue/chunks/chunk-442CZ2YL.js +144 -0
  551. package/dist/stage-bundles/vue/chunks/chunk-44GL4NDX.js +25863 -0
  552. package/dist/stage-bundles/vue/chunks/chunk-4A4WKSGY.js +66 -0
  553. package/dist/stage-bundles/vue/chunks/chunk-4VX5AMMQ.js +54 -0
  554. package/dist/stage-bundles/vue/chunks/chunk-65Q2CFW7.js +18 -0
  555. package/dist/stage-bundles/vue/chunks/chunk-667SIQGW.js +12 -0
  556. package/dist/stage-bundles/vue/chunks/chunk-6BXKZHN6.js +19 -0
  557. package/dist/stage-bundles/vue/chunks/chunk-6E57QUN7.js +21 -0
  558. package/dist/stage-bundles/vue/chunks/chunk-6QYYO5LM.js +12 -0
  559. package/dist/stage-bundles/vue/chunks/chunk-6R3QXFFF.js +47 -0
  560. package/dist/stage-bundles/vue/chunks/chunk-6RLI7CFQ.js +12 -0
  561. package/dist/stage-bundles/vue/chunks/chunk-6TDZGYJG.js +13 -0
  562. package/dist/stage-bundles/vue/chunks/chunk-AI3MQHWR.js +51 -0
  563. package/dist/stage-bundles/vue/chunks/chunk-BWZPEI76.js +18 -0
  564. package/dist/stage-bundles/vue/chunks/chunk-CHZVDVQC.js +8 -0
  565. package/dist/stage-bundles/vue/chunks/chunk-CJOJNMRC.js +8 -0
  566. package/dist/stage-bundles/vue/chunks/chunk-CXATTVPL.js +24 -0
  567. package/dist/stage-bundles/vue/chunks/chunk-DBHMBCBM.js +14 -0
  568. package/dist/stage-bundles/vue/chunks/chunk-DCKGUW2M.js +8 -0
  569. package/dist/stage-bundles/vue/chunks/chunk-EB5FGFFG.js +12 -0
  570. package/dist/stage-bundles/vue/chunks/chunk-F6JYAVEC.js +15 -0
  571. package/dist/stage-bundles/vue/chunks/chunk-F77HGOQB.js +8 -0
  572. package/dist/stage-bundles/vue/chunks/chunk-FSIANI7E.js +11 -0
  573. package/dist/stage-bundles/vue/chunks/chunk-FZZDMYBZ.js +12 -0
  574. package/dist/stage-bundles/vue/chunks/chunk-GI5C7GB7.js +12838 -0
  575. package/dist/stage-bundles/vue/chunks/chunk-H75SQT4U.js +105 -0
  576. package/dist/stage-bundles/vue/chunks/chunk-IDGFZWZY.js +13 -0
  577. package/dist/stage-bundles/vue/chunks/chunk-IIIXGKVH.js +17 -0
  578. package/dist/stage-bundles/vue/chunks/chunk-ILZWSEWK.js +19 -0
  579. package/dist/stage-bundles/vue/chunks/chunk-IO3NSIEJ.js +8 -0
  580. package/dist/stage-bundles/vue/chunks/chunk-IRDAUQG3.js +49 -0
  581. package/dist/stage-bundles/vue/chunks/chunk-ISOZDDO2.js +157 -0
  582. package/dist/stage-bundles/vue/chunks/chunk-IVU4565D.js +26 -0
  583. package/dist/stage-bundles/vue/chunks/chunk-JDIO27MU.js +8 -0
  584. package/dist/stage-bundles/vue/chunks/chunk-JJVRBJGQ.js +1353 -0
  585. package/dist/stage-bundles/vue/chunks/chunk-JKOWPFOY.js +172 -0
  586. package/dist/stage-bundles/vue/chunks/chunk-K7ZULZJF.js +116 -0
  587. package/dist/stage-bundles/vue/chunks/chunk-KF4MVCJ6.js +13 -0
  588. package/dist/stage-bundles/vue/chunks/chunk-KHURU62K.js +27 -0
  589. package/dist/stage-bundles/vue/chunks/chunk-KKLU24SB.js +33 -0
  590. package/dist/stage-bundles/vue/chunks/chunk-KOBPYD4N.js +8 -0
  591. package/dist/stage-bundles/vue/chunks/chunk-LH4ZDX3T.js +58 -0
  592. package/dist/stage-bundles/vue/chunks/chunk-M3YT4JBL.js +12 -0
  593. package/dist/stage-bundles/vue/chunks/chunk-MAPYANXA.js +8 -0
  594. package/dist/stage-bundles/vue/chunks/chunk-MMCB6GGX.js +8 -0
  595. package/dist/stage-bundles/vue/chunks/chunk-NCUWZXVZ.js +8 -0
  596. package/dist/stage-bundles/vue/chunks/chunk-O3KQTA3H.js +21 -0
  597. package/dist/stage-bundles/vue/chunks/chunk-P7UUT7BU.js +12 -0
  598. package/dist/stage-bundles/vue/chunks/chunk-PHVB7SAE.js +22 -0
  599. package/dist/stage-bundles/vue/chunks/chunk-PKSFATQY.js +10 -0
  600. package/dist/stage-bundles/vue/chunks/chunk-PU2GET2S.js +18 -0
  601. package/dist/stage-bundles/vue/chunks/chunk-QBXKRHK5.js +11 -0
  602. package/dist/stage-bundles/vue/chunks/chunk-QCQXLZJH.js +18 -0
  603. package/dist/stage-bundles/vue/chunks/chunk-QIOKODGT.js +14 -0
  604. package/dist/stage-bundles/vue/chunks/chunk-R5DUYWXP.js +8 -0
  605. package/dist/stage-bundles/vue/chunks/chunk-RHAVY7VB.js +92 -0
  606. package/dist/stage-bundles/vue/chunks/chunk-RI7XWDHX.js +10 -0
  607. package/dist/stage-bundles/vue/chunks/chunk-RZG5LCPH.js +12 -0
  608. package/dist/stage-bundles/vue/chunks/chunk-S4NZQRJJ.js +12 -0
  609. package/dist/stage-bundles/vue/chunks/chunk-S5L2YBXG.js +143 -0
  610. package/dist/stage-bundles/vue/chunks/chunk-SF5BLQ7P.js +14 -0
  611. package/dist/stage-bundles/vue/chunks/chunk-SKOTGWTH.js +140 -0
  612. package/dist/stage-bundles/vue/chunks/chunk-SPTKNGHA.js +14 -0
  613. package/dist/stage-bundles/vue/chunks/chunk-TKHCH4WB.js +35 -0
  614. package/dist/stage-bundles/vue/chunks/chunk-TVB3GD7L.js +8 -0
  615. package/dist/stage-bundles/vue/chunks/chunk-TVGXBOIT.js +18 -0
  616. package/dist/stage-bundles/vue/chunks/chunk-U7U7L7XZ.js +31 -0
  617. package/dist/stage-bundles/vue/chunks/chunk-UFHA3ODE.js +528 -0
  618. package/dist/stage-bundles/vue/chunks/chunk-UHGV762U.js +12 -0
  619. package/dist/stage-bundles/vue/chunks/chunk-V6MKKC23.js +18 -0
  620. package/dist/stage-bundles/vue/chunks/chunk-VK4FEQKG.js +18 -0
  621. package/dist/stage-bundles/vue/chunks/chunk-VZNGMF63.js +12 -0
  622. package/dist/stage-bundles/vue/chunks/chunk-W5CGYUVM.js +8 -0
  623. package/dist/stage-bundles/vue/chunks/chunk-W7QH4UII.js +54 -0
  624. package/dist/stage-bundles/vue/chunks/chunk-WMV5J37V.js +8 -0
  625. package/dist/stage-bundles/vue/chunks/chunk-WXDXWNWW.js +8 -0
  626. package/dist/stage-bundles/vue/chunks/chunk-XKFPCFZH.js +8 -0
  627. package/dist/stage-bundles/vue/chunks/chunk-YCZNHFZA.js +15 -0
  628. package/dist/stage-bundles/vue/chunks/chunk-YEEGISBQ.js +23 -0
  629. package/dist/stage-bundles/vue/chunks/chunk-YM3NAGCN.js +8 -0
  630. package/dist/stage-bundles/vue/chunks/clearDestination-EMCIEDAP.js +7 -0
  631. package/dist/stage-bundles/vue/chunks/clearName-O7J77F77.js +7 -0
  632. package/dist/stage-bundles/vue/chunks/clearOptionsExpression-RGDXKYVX.js +7 -0
  633. package/dist/stage-bundles/vue/chunks/clearRender-DFMNHXXQ.js +7 -0
  634. package/dist/stage-bundles/vue/chunks/clearRepeat-436RGATR.js +7 -0
  635. package/dist/stage-bundles/vue/chunks/contentEditor-XVLK5LYS.js +67 -0
  636. package/dist/stage-bundles/vue/chunks/createAction-CKUAX4TU.js +8 -0
  637. package/dist/stage-bundles/vue/chunks/createAnimation-URI5366N.js +7 -0
  638. package/dist/stage-bundles/vue/chunks/createComputed-I23CA5NX.js +8 -0
  639. package/dist/stage-bundles/vue/chunks/createTextContent-K4G7KNQ5.js +10 -0
  640. package/dist/stage-bundles/vue/chunks/createValue-D5MP2SMM.js +7 -0
  641. package/dist/stage-bundles/vue/chunks/disconnectNode-GM5F3ZMB.js +8 -0
  642. package/dist/stage-bundles/vue/chunks/history-7PFZW7N6.js +51 -0
  643. package/dist/stage-bundles/vue/chunks/id-VSNJWKHU.js +53 -0
  644. package/dist/stage-bundles/vue/chunks/main-GQD7B74Q.js +103 -0
  645. package/dist/stage-bundles/vue/chunks/main-L3KI7XBW.js +154 -0
  646. package/dist/stage-bundles/vue/chunks/main-SWZDSGE3.js +109 -0
  647. package/dist/stage-bundles/vue/chunks/main-ULK5YAYM.js +31 -0
  648. package/dist/stage-bundles/vue/chunks/moveNodeToLastChildOf-X46IGL47.js +12 -0
  649. package/dist/stage-bundles/vue/chunks/nodeGraph-TTOC6H4R.js +53 -0
  650. package/dist/stage-bundles/vue/chunks/normalizeEventName-2JPOX7Y6.js +128 -0
  651. package/dist/stage-bundles/vue/chunks/normalizeLayoutContext-SY3L4IB7.js +9 -0
  652. package/dist/stage-bundles/vue/chunks/preview-bootstrap-SIVRGDR2.js +135 -0
  653. package/dist/stage-bundles/vue/chunks/removeAction-PPAIVTW3.js +7 -0
  654. package/dist/stage-bundles/vue/chunks/removeAnimationBinding-UQ24BSXP.js +7 -0
  655. package/dist/stage-bundles/vue/chunks/removeAttribute-P2IDGOQH.js +7 -0
  656. package/dist/stage-bundles/vue/chunks/removeComputed-7C66NNZA.js +7 -0
  657. package/dist/stage-bundles/vue/chunks/removeEvent-KTSOCV4C.js +7 -0
  658. package/dist/stage-bundles/vue/chunks/removeLifecycleHook-NKXLF3QT.js +7 -0
  659. package/dist/stage-bundles/vue/chunks/removeNode-A7C34C42.js +10 -0
  660. package/dist/stage-bundles/vue/chunks/removeOption-6HW62A5Y.js +7 -0
  661. package/dist/stage-bundles/vue/chunks/removeParamFromRoute-LIKPDVU4.js +7 -0
  662. package/dist/stage-bundles/vue/chunks/removeState-PO6J3JYQ.js +7 -0
  663. package/dist/stage-bundles/vue/chunks/removeStore-5ZZ57NHV.js +7 -0
  664. package/dist/stage-bundles/vue/chunks/removeToken-BKJE3U6Q.js +7 -0
  665. package/dist/stage-bundles/vue/chunks/removeValue-5FNPXWNL.js +7 -0
  666. package/dist/stage-bundles/vue/chunks/screen-capture-bootstrap-GV75P6QF.js +126 -0
  667. package/dist/stage-bundles/vue/chunks/setDestination-DAYIYYIV.js +7 -0
  668. package/dist/stage-bundles/vue/chunks/setHomePage-MHCP4P24.js +7 -0
  669. package/dist/stage-bundles/vue/chunks/setHtmlId-3HYPFT3T.js +7 -0
  670. package/dist/stage-bundles/vue/chunks/setName-OQOO3URG.js +7 -0
  671. package/dist/stage-bundles/vue/chunks/setNodeLayout-W5QFJBKT.js +10 -0
  672. package/dist/stage-bundles/vue/chunks/setOptionsExpression-XZZOJPCM.js +8 -0
  673. package/dist/stage-bundles/vue/chunks/setRender-NHXZZGME.js +10 -0
  674. package/dist/stage-bundles/vue/chunks/setRepeat-YZTZFDTQ.js +10 -0
  675. package/dist/stage-bundles/vue/chunks/setTagName-EGPQ66XI.js +7 -0
  676. package/dist/stage-bundles/vue/chunks/updateAction-ZSNXUEQA.js +9 -0
  677. package/dist/stage-bundles/vue/chunks/updateAnimationBinding-X2UXYQKJ.js +7 -0
  678. package/dist/stage-bundles/vue/chunks/updateAttribute-ODXM7YXA.js +12 -0
  679. package/dist/stage-bundles/vue/chunks/updateBounds-PEGOZ4FT.js +7 -0
  680. package/dist/stage-bundles/vue/chunks/updateComputed-6LNN453F.js +9 -0
  681. package/dist/stage-bundles/vue/chunks/updateEvent-ZHCKBJIM.js +11 -0
  682. package/dist/stage-bundles/vue/chunks/updateHtml-6BPU5PRY.js +7 -0
  683. package/dist/stage-bundles/vue/chunks/updateLifecycleHook-JEMQQYM5.js +8 -0
  684. package/dist/stage-bundles/vue/chunks/updateOption-SH33P5WW.js +8 -0
  685. package/dist/stage-bundles/vue/chunks/updateRoute-3RRPY2T5.js +7 -0
  686. package/dist/stage-bundles/vue/chunks/updateState-WRLF4SSC.js +11 -0
  687. package/dist/stage-bundles/vue/chunks/updateStyle-WAPTDAU5.js +7 -0
  688. package/dist/stage-bundles/vue/chunks/updateToken-CFIIILXB.js +7 -0
  689. package/dist/stage-bundles/vue/chunks/updateValue-JTEEC2B6.js +8 -0
  690. package/dist/stage-bundles/vue/chunks/user-ZLGCTRZX.js +44 -0
  691. package/dist/stage-bundles/vue/chunks/validateStorePayload-7A2INWJV.js +61 -0
  692. package/dist/stage-bundles/vue/chunks/viewport-OTNUF4XI.js +21 -0
  693. package/dist/stage-bundles/vue/chunks/vue-2GZIKYJR.js +37 -0
  694. package/dist/stage-bundles/vue/chunks/window-73DBL24T.js +32 -0
  695. package/dist/stage-bundles/vue/entry.js +85 -0
  696. package/dist/stage-bundles/vue/framework-jsx-runtime.js +34 -0
  697. package/dist/stage-bundles/vue/framework.js +352 -0
  698. package/dist/stage-bundles/vue/sdk.js +42 -0
  699. package/dist/templates/.gitignore.template +29 -0
  700. package/dist/templates/index.html.template +17 -0
  701. package/dist/templates/jucie.config.js.template +15 -0
  702. package/dist/templates/package.json.template +14 -0
  703. package/dist/templates/sceneGraph/wal.log +0 -0
  704. package/package.json +92 -0
@@ -0,0 +1,4080 @@
1
+ import {
2
+ CREATED,
3
+ DELETED,
4
+ GLOBAL_TAG,
5
+ Plugin,
6
+ R,
7
+ SceneCompiler,
8
+ UPDATED,
9
+ createMarker,
10
+ decode,
11
+ decodeAddress,
12
+ dispatch,
13
+ elements,
14
+ encode,
15
+ encodePath,
16
+ f,
17
+ f2,
18
+ initializeNode,
19
+ normalizeSceneViewportKinds,
20
+ palette as palette2,
21
+ re,
22
+ s
23
+ } from "./chunk-RZDFRJVR.js";
24
+ import "./chunk-5EXNWE4S.js";
25
+ import "./chunk-YMVTSVEM.js";
26
+ import "./chunk-7MWSPEGH.js";
27
+ import "./chunk-3NLDBJQD.js";
28
+ import {
29
+ G,
30
+ T,
31
+ g,
32
+ v
33
+ } from "./chunk-3BDWFE4Q.js";
34
+ import "./chunk-QCQXLZJH.js";
35
+ import "./chunk-DBHMBCBM.js";
36
+ import "./chunk-ILZWSEWK.js";
37
+ import "./chunk-65Q2CFW7.js";
38
+ import "./chunk-QIOKODGT.js";
39
+ import "./chunk-YCZNHFZA.js";
40
+ import "./chunk-YM3NAGCN.js";
41
+ import "./chunk-YEEGISBQ.js";
42
+ import "./chunk-PU2GET2S.js";
43
+ import "./chunk-6RLI7CFQ.js";
44
+ import "./chunk-SPTKNGHA.js";
45
+ import "./chunk-6BXKZHN6.js";
46
+ import "./chunk-F6JYAVEC.js";
47
+ import "./chunk-RI7XWDHX.js";
48
+ import "./chunk-DCKGUW2M.js";
49
+ import "./chunk-KF4MVCJ6.js";
50
+ import "./chunk-W5CGYUVM.js";
51
+ import "./chunk-O3KQTA3H.js";
52
+ import "./chunk-EB5FGFFG.js";
53
+ import "./chunk-MAPYANXA.js";
54
+ import "./chunk-UHGV762U.js";
55
+ import "./chunk-IIIXGKVH.js";
56
+ import "./chunk-FSIANI7E.js";
57
+ import "./chunk-CHZVDVQC.js";
58
+ import "./chunk-U7U7L7XZ.js";
59
+ import "./chunk-CXATTVPL.js";
60
+ import "./chunk-CJOJNMRC.js";
61
+ import "./chunk-667SIQGW.js";
62
+ import "./chunk-RZG5LCPH.js";
63
+ import "./chunk-6QYYO5LM.js";
64
+ import "./chunk-IO3NSIEJ.js";
65
+ import "./chunk-MMCB6GGX.js";
66
+ import "./chunk-BWZPEI76.js";
67
+ import "./chunk-6E57QUN7.js";
68
+ import "./chunk-TKHCH4WB.js";
69
+ import "./chunk-VZNGMF63.js";
70
+ import "./chunk-P7UUT7BU.js";
71
+ import "./chunk-6TDZGYJG.js";
72
+ import "./chunk-TVGXBOIT.js";
73
+ import "./chunk-VK4FEQKG.js";
74
+ import "./chunk-SF5BLQ7P.js";
75
+ import "./chunk-F77HGOQB.js";
76
+ import "./chunk-2H2EQ2RG.js";
77
+ import "./chunk-XKFPCFZH.js";
78
+ import "./chunk-V6MKKC23.js";
79
+ import "./chunk-TVB3GD7L.js";
80
+ import "./chunk-RCIDQRAS.js";
81
+ import "./chunk-WXDXWNWW.js";
82
+ import "./chunk-JDIO27MU.js";
83
+ import "./chunk-A65NYJEZ.js";
84
+ import "./chunk-2Y25YY3N.js";
85
+ import "./chunk-S4NZQRJJ.js";
86
+ import "./chunk-M3YT4JBL.js";
87
+ import "./chunk-WMV5J37V.js";
88
+ import "./chunk-QTTED7GZ.js";
89
+ import {
90
+ palette
91
+ } from "./chunk-6R3QXFFF.js";
92
+ import {
93
+ PROTOTYPES
94
+ } from "./chunk-XVJJ3LG4.js";
95
+ import "./chunk-KHURU62K.js";
96
+ import "./chunk-H75SQT4U.js";
97
+ import "./chunk-AI3MQHWR.js";
98
+ import "./chunk-236DY7EE.js";
99
+ import "./chunk-K7ZULZJF.js";
100
+ import "./chunk-6B6PKOOA.js";
101
+ import "./chunk-W7QH4UII.js";
102
+ import "./chunk-22J4JOPG.js";
103
+ import "./chunk-LH4ZDX3T.js";
104
+ import "./chunk-IDGFZWZY.js";
105
+ import "./chunk-3MJKS6VX.js";
106
+ import "./chunk-KOBPYD4N.js";
107
+ import "./chunk-ABVPSM2D.js";
108
+ import "./chunk-ZP3VSN3A.js";
109
+ import "./chunk-5C4ODH2L.js";
110
+ import "./chunk-QVH24VHP.js";
111
+ import "./chunk-S5L2YBXG.js";
112
+ import {
113
+ __privateAdd,
114
+ __privateGet,
115
+ __privateMethod,
116
+ __privateSet,
117
+ __privateWrapper,
118
+ __publicField
119
+ } from "./chunk-ZHZLVPR6.js";
120
+
121
+ // ../engine-ai/src/AiGatewayService.js
122
+ var RATE_WINDOW_MS = 60 * 60 * 1e3;
123
+
124
+ // ../engine-ai/src/defineAiOperations.js
125
+ var defineAiOperations = g("AI_OPERATIONS", [Object]);
126
+ function extractOperationsMetadata(operationDefinition) {
127
+ const namespace = operationDefinition._name;
128
+ const operations = operationDefinition();
129
+ return {
130
+ namespace,
131
+ operations: Object.entries(operations).map(([name, op]) => ({
132
+ name,
133
+ fullName: `${namespace}:${name}`,
134
+ alias: op.alias || null,
135
+ mcpName: op.mcpName || null,
136
+ description: op.description || "",
137
+ schema: op.schema || [],
138
+ examples: op.examples || [],
139
+ returns: op.returns || "Object"
140
+ }))
141
+ };
142
+ }
143
+ function validateOperationArgs(args, schema, operationName) {
144
+ if (!Array.isArray(schema) || schema.length === 0) {
145
+ return true;
146
+ }
147
+ const typeDef = schema[0];
148
+ if (typeof typeDef !== "object" || Array.isArray(typeDef)) {
149
+ console.warn(`Schema for ${operationName} should be an object with named parameters`);
150
+ return true;
151
+ }
152
+ for (const [key, typeSpec] of Object.entries(typeDef)) {
153
+ const optional = typeof typeSpec === "string" && typeSpec.endsWith("?");
154
+ const expectedType = optional ? typeSpec.slice(0, -1) : typeSpec;
155
+ const value = args[key];
156
+ if (!(key in args) || value === void 0) {
157
+ if (optional) continue;
158
+ throw new Error(`Missing required parameter "${key}" in ${operationName}`);
159
+ }
160
+ const actualType = Array.isArray(value) ? "Array" : value === null ? "Null" : typeof value === "object" ? "Object" : value.constructor.name;
161
+ if (actualType !== expectedType && expectedType !== "Any") {
162
+ throw new Error(
163
+ `Parameter "${key}" in ${operationName} must be of type ${expectedType}, got ${actualType}`
164
+ );
165
+ }
166
+ }
167
+ return true;
168
+ }
169
+
170
+ // ../engine-ai/src/buildAnthropicTools.js
171
+ var RESPOND_TOOL = {
172
+ name: "respond",
173
+ description: "Send a conversational response to the user. Use this for greetings, questions, clarifications, status updates, or when the build task is fully complete.",
174
+ input_schema: {
175
+ type: "object",
176
+ properties: {
177
+ message: {
178
+ type: "string",
179
+ description: "Your conversational response to the user"
180
+ }
181
+ },
182
+ required: ["message"]
183
+ }
184
+ };
185
+ function buildAnthropicTools(allOperations2) {
186
+ const namespaces = normalizeNamespaces(allOperations2);
187
+ return [RESPOND_TOOL, ...namespaces.map(buildNamespaceTool)];
188
+ }
189
+ function buildNamespaceTool(ns) {
190
+ const opDescriptions = ns.operations.map((op) => {
191
+ const typeDef = Array.isArray(op.schema) ? op.schema[0] : null;
192
+ const params = typeDef && typeof typeDef === "object" ? Object.entries(typeDef).map(([k, t]) => `${k}: ${t}`).join(", ") : "";
193
+ const example = op.examples?.[0] ? `
194
+ Example: ${JSON.stringify(op.examples[0].args)}` : "";
195
+ return ` ${op.name} \u2014 ${op.description}
196
+ Args: { ${params} }${example}`;
197
+ }).join("\n\n");
198
+ return {
199
+ name: ns.namespace,
200
+ description: `${ns.namespace} operations. Pass "op" as the operation name and "args" matching that op's schema.
201
+
202
+ ${opDescriptions}`,
203
+ input_schema: {
204
+ type: "object",
205
+ properties: {
206
+ op: {
207
+ type: "string",
208
+ description: `Operation name within ${ns.namespace}`
209
+ },
210
+ args: {
211
+ type: "object",
212
+ description: "Arguments matching the operation's schema"
213
+ },
214
+ ref: {
215
+ type: "string",
216
+ description: "Optional {{name}} reference for cross-operation use"
217
+ },
218
+ message: {
219
+ type: "string",
220
+ description: "Short explanation of what you are doing (1 sentence)"
221
+ }
222
+ },
223
+ required: ["op", "args"]
224
+ }
225
+ };
226
+ }
227
+ function normalizeNamespaces(allOperations2) {
228
+ if (!Array.isArray(allOperations2) || allOperations2.length === 0) return [];
229
+ if (allOperations2[0]?.namespace && Array.isArray(allOperations2[0]?.operations)) {
230
+ return allOperations2;
231
+ }
232
+ return allOperations2.map((def) => extractOperationsMetadata(def));
233
+ }
234
+
235
+ // ../engine-ai/src/AiOperations.js
236
+ var _operations, _operationDefinitions, _aliases, _names, _AiOperations_instances, setupOperations_fn, resolveReferences_fn;
237
+ var AiOperations = class extends v {
238
+ constructor() {
239
+ super(...arguments);
240
+ __privateAdd(this, _AiOperations_instances);
241
+ __privateAdd(this, _operations, /* @__PURE__ */ new Map());
242
+ // namespace:name → operation
243
+ __privateAdd(this, _operationDefinitions, []);
244
+ // Store definitions for metadata
245
+ __privateAdd(this, _aliases, /* @__PURE__ */ new Map());
246
+ // explicit alias → namespace:name
247
+ __privateAdd(this, _names, /* @__PURE__ */ new Map());
248
+ }
249
+ // bare name → namespace:name (null when ambiguous)
250
+ getters() {
251
+ return {
252
+ operationsMetadata: () => this.getOperationsMetadata(),
253
+ anthropicTools: () => this.getAnthropicTools()
254
+ };
255
+ }
256
+ actions() {
257
+ return {
258
+ use: (...operationDefinitions) => {
259
+ for (const operationDef of operationDefinitions) {
260
+ __privateMethod(this, _AiOperations_instances, setupOperations_fn).call(this, operationDef);
261
+ }
262
+ return this;
263
+ },
264
+ has: (type) => __privateGet(this, _operations).has(type),
265
+ resolveType: (type) => this.resolveType(type),
266
+ describeUnresolved: (type) => this.describeUnresolved(type),
267
+ executeOperation: (type, args, ref) => this.executeOperation(type, args, ref),
268
+ executeBatch: (response) => this.executeBatch(response)
269
+ };
270
+ }
271
+ /**
272
+ * Resolve an operation reference to its full `namespace:name` type.
273
+ * Accepts full names, explicit aliases, or unambiguous bare names.
274
+ * Returns null when unknown or ambiguous.
275
+ */
276
+ resolveType(type) {
277
+ if (typeof type !== "string" || !type) return null;
278
+ if (type.includes(":")) {
279
+ return __privateGet(this, _operations).has(type) ? type : null;
280
+ }
281
+ return __privateGet(this, _aliases).get(type) ?? __privateGet(this, _names).get(type) ?? null;
282
+ }
283
+ /**
284
+ * Human-readable reason a type failed to resolve, or null if it resolves.
285
+ */
286
+ describeUnresolved(type) {
287
+ if (this.resolveType(type)) return null;
288
+ if (typeof type === "string" && !type.includes(":") && __privateGet(this, _names).has(type) && __privateGet(this, _names).get(type) === null) {
289
+ const candidates = [];
290
+ for (const [fullName, operation] of __privateGet(this, _operations)) {
291
+ if (operation.name === type) {
292
+ candidates.push(operation.alias ? `${fullName} (alias: ${operation.alias})` : fullName);
293
+ }
294
+ }
295
+ const hint = candidates.length ? candidates.join(" or ") : type;
296
+ return `Ambiguous operation: "${type}". Use ${hint}.`;
297
+ }
298
+ return `Unknown operation: ${type}`;
299
+ }
300
+ /**
301
+ * Get metadata for all registered operations (for AI prompt / MCP tools)
302
+ */
303
+ getOperationsMetadata() {
304
+ return __privateGet(this, _operationDefinitions).map((def) => extractOperationsMetadata(def));
305
+ }
306
+ /**
307
+ * Anthropic tool schemas derived from registered operations (one tool per namespace + respond).
308
+ */
309
+ getAnthropicTools() {
310
+ return buildAnthropicTools(__privateGet(this, _operationDefinitions));
311
+ }
312
+ /**
313
+ * Execute a single AI operation
314
+ */
315
+ async executeOperation(operationType, args, ref = null) {
316
+ const resolved = this.resolveType(operationType);
317
+ const operation = __privateGet(this, _operations).get(resolved);
318
+ if (!operation) {
319
+ throw new Error(this.describeUnresolved(operationType));
320
+ }
321
+ try {
322
+ validateOperationArgs(args, operation.schema, operationType);
323
+ } catch (error) {
324
+ console.error(`Validation failed for ${operationType}:`, error);
325
+ throw error;
326
+ }
327
+ try {
328
+ const result = await operation.handler(args);
329
+ return { result, ref };
330
+ } catch (error) {
331
+ console.error(`Handler failed for ${operationType}:`, error);
332
+ throw error;
333
+ }
334
+ }
335
+ /**
336
+ * Execute a batch of AI operations
337
+ */
338
+ async executeBatch(response) {
339
+ const { operations, description, expectation } = response;
340
+ console.log("AiOperations: Executing batch", {
341
+ count: operations.length,
342
+ description
343
+ });
344
+ const refMap = /* @__PURE__ */ new Map();
345
+ const results = [];
346
+ const createdIds = [];
347
+ try {
348
+ for (let i2 = 0; i2 < operations.length; i2++) {
349
+ const op = operations[i2];
350
+ console.log(`AiOperations: Executing [${i2 + 1}/${operations.length}] ${op.type}`);
351
+ const resolvedArgs = __privateMethod(this, _AiOperations_instances, resolveReferences_fn).call(this, op.args, refMap);
352
+ const { result } = await this.executeOperation(op.type, resolvedArgs, op.ref);
353
+ const refId = result.id ?? result.rootId;
354
+ if (op.ref && refId) {
355
+ refMap.set(op.ref, refId);
356
+ createdIds.push(refId);
357
+ }
358
+ if (result.treeMap) {
359
+ for (const [ref, id] of Object.entries(result.treeMap)) {
360
+ refMap.set(ref, id);
361
+ createdIds.push(id);
362
+ }
363
+ }
364
+ if (result.createdIds?.length) {
365
+ createdIds.push(...result.createdIds);
366
+ }
367
+ results.push({
368
+ operation: op.type,
369
+ success: true,
370
+ result
371
+ });
372
+ }
373
+ console.log("AiOperations: Execution complete", {
374
+ total: operations.length,
375
+ successful: results.length,
376
+ createdIds
377
+ });
378
+ return {
379
+ success: true,
380
+ description,
381
+ expectation,
382
+ results,
383
+ createdIds,
384
+ refMap: Object.fromEntries(refMap)
385
+ };
386
+ } catch (error) {
387
+ console.error("AiOperations: Batch execution failed", error);
388
+ return {
389
+ success: false,
390
+ description,
391
+ error: error.message,
392
+ failedAt: results.length,
393
+ results
394
+ };
395
+ }
396
+ }
397
+ };
398
+ _operations = new WeakMap();
399
+ _operationDefinitions = new WeakMap();
400
+ _aliases = new WeakMap();
401
+ _names = new WeakMap();
402
+ _AiOperations_instances = new WeakSet();
403
+ /**
404
+ * Setup operations from a definition (similar to MessageChannel's #setupSubscriptions)
405
+ */
406
+ setupOperations_fn = function(operationFactory) {
407
+ const log = this.inject("log");
408
+ if (!operationFactory || typeof operationFactory !== "function") {
409
+ throw new Error("Operation factory must be a function");
410
+ }
411
+ const namespace = operationFactory._name;
412
+ if (!namespace) {
413
+ throw new Error("Operation factory must have a _name property (use defineAiOperations)");
414
+ }
415
+ log.info(`AiOperations: Registering operations for namespace "${namespace}"`);
416
+ __privateGet(this, _operationDefinitions).push(operationFactory);
417
+ const operations = operationFactory(this.inject);
418
+ for (const [name, operation] of Object.entries(operations)) {
419
+ const { handler, schema, description, examples, returns, alias } = operation;
420
+ const fullName = `${namespace}:${name}`;
421
+ if (!handler || typeof handler !== "function") {
422
+ throw new Error(`Operation ${fullName} must have a handler function`);
423
+ }
424
+ if (!description) {
425
+ console.warn(`Operation ${fullName} missing description`);
426
+ }
427
+ __privateGet(this, _operations).set(fullName, {
428
+ namespace,
429
+ name,
430
+ handler,
431
+ schema: schema || [],
432
+ description: description || "",
433
+ examples: examples || [],
434
+ returns: returns || "Object",
435
+ alias: alias || null
436
+ });
437
+ if (alias) {
438
+ if (__privateGet(this, _aliases).has(alias) && __privateGet(this, _aliases).get(alias) !== fullName) {
439
+ console.warn(`AiOperations: alias "${alias}" already registered for ${__privateGet(this, _aliases).get(alias)}, overriding with ${fullName}`);
440
+ }
441
+ __privateGet(this, _aliases).set(alias, fullName);
442
+ }
443
+ if (__privateGet(this, _names).has(name) && __privateGet(this, _names).get(name) !== fullName) {
444
+ __privateGet(this, _names).set(name, null);
445
+ } else {
446
+ __privateGet(this, _names).set(name, fullName);
447
+ }
448
+ }
449
+ };
450
+ resolveReferences_fn = function(args, refMap) {
451
+ if (!args) return args;
452
+ return JSON.parse(JSON.stringify(args), (key, value) => {
453
+ if (key === "ref") return value;
454
+ if (typeof value === "string" && value.match(/^\{\{.*\}\}$/)) {
455
+ const resolved = refMap.get(value) ?? refMap.get(value.replace(/\.[^}]+(?=\}\}$)/, ""));
456
+ return resolved ?? value;
457
+ }
458
+ return value;
459
+ });
460
+ };
461
+ __publicField(AiOperations, "manifest", {
462
+ name: "AiOperations",
463
+ namespace: "aiOps",
464
+ version: "1.0.0",
465
+ description: "AI operation registry and executor",
466
+ author: "",
467
+ license: "MIT",
468
+ homepage: ""
469
+ });
470
+
471
+ // ../engine-lifecycle/src/PageLifecycle.js
472
+ var _subscribers, _visible, _focused, _frozen, _lastActiveTimestamp, _sleepCheckInterval, _config, _PageLifecycle_instances, on_fn, off_fn, emit_fn, setupSources_fn, _handleVisibility, _handleFocus, _handleBlur, _handleFreeze, _handleDocResume, _handlePageShow, _handlePageHide, startSleepDetection_fn, teardown_fn;
473
+ var PageLifecycle = class extends v {
474
+ constructor() {
475
+ super(...arguments);
476
+ __privateAdd(this, _PageLifecycle_instances);
477
+ __privateAdd(this, _subscribers, /* @__PURE__ */ new Map());
478
+ __privateAdd(this, _visible, true);
479
+ __privateAdd(this, _focused, true);
480
+ __privateAdd(this, _frozen, false);
481
+ __privateAdd(this, _lastActiveTimestamp, Date.now());
482
+ __privateAdd(this, _sleepCheckInterval, null);
483
+ __privateAdd(this, _config, null);
484
+ __privateAdd(this, _handleVisibility, () => {
485
+ const wasVisible = __privateGet(this, _visible);
486
+ __privateSet(this, _visible, !document.hidden);
487
+ if (__privateGet(this, _visible) && !wasVisible) {
488
+ __privateSet(this, _lastActiveTimestamp, Date.now());
489
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "visible");
490
+ } else if (!__privateGet(this, _visible) && wasVisible) {
491
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "hidden");
492
+ }
493
+ });
494
+ __privateAdd(this, _handleFocus, () => {
495
+ __privateSet(this, _focused, true);
496
+ __privateSet(this, _lastActiveTimestamp, Date.now());
497
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "focus");
498
+ });
499
+ __privateAdd(this, _handleBlur, () => {
500
+ __privateSet(this, _focused, false);
501
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "blur");
502
+ });
503
+ __privateAdd(this, _handleFreeze, () => {
504
+ __privateSet(this, _frozen, true);
505
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "suspend", { reason: "freeze" });
506
+ });
507
+ __privateAdd(this, _handleDocResume, () => {
508
+ __privateSet(this, _frozen, false);
509
+ __privateSet(this, _lastActiveTimestamp, Date.now());
510
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "resume", { reason: "freeze" });
511
+ });
512
+ __privateAdd(this, _handlePageShow, (event) => {
513
+ if (event.persisted) {
514
+ __privateSet(this, _lastActiveTimestamp, Date.now());
515
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "resume", { reason: "bfcache" });
516
+ }
517
+ });
518
+ __privateAdd(this, _handlePageHide, (event) => {
519
+ if (event.persisted) {
520
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "suspend", { reason: "bfcache" });
521
+ }
522
+ });
523
+ }
524
+ initialize() {
525
+ if (typeof document !== "undefined") {
526
+ __privateSet(this, _visible, !document.hidden);
527
+ __privateSet(this, _focused, document.hasFocus());
528
+ }
529
+ __privateSet(this, _lastActiveTimestamp, Date.now());
530
+ }
531
+ getters() {
532
+ return {
533
+ visible: () => __privateGet(this, _visible),
534
+ focused: () => __privateGet(this, _focused),
535
+ frozen: () => __privateGet(this, _frozen)
536
+ };
537
+ }
538
+ actions(_, config) {
539
+ __privateSet(this, _config, config || {});
540
+ __privateMethod(this, _PageLifecycle_instances, setupSources_fn).call(this, __privateGet(this, _config));
541
+ return {
542
+ on: (event, callback) => __privateMethod(this, _PageLifecycle_instances, on_fn).call(this, event, callback),
543
+ off: (event, callback) => __privateMethod(this, _PageLifecycle_instances, off_fn).call(this, event, callback),
544
+ isVisible: () => __privateGet(this, _visible),
545
+ isFocused: () => __privateGet(this, _focused),
546
+ isFrozen: () => __privateGet(this, _frozen),
547
+ lastActiveTimestamp: () => __privateGet(this, _lastActiveTimestamp),
548
+ destroy: () => __privateMethod(this, _PageLifecycle_instances, teardown_fn).call(this)
549
+ };
550
+ }
551
+ destroy() {
552
+ __privateMethod(this, _PageLifecycle_instances, teardown_fn).call(this);
553
+ }
554
+ };
555
+ _subscribers = new WeakMap();
556
+ _visible = new WeakMap();
557
+ _focused = new WeakMap();
558
+ _frozen = new WeakMap();
559
+ _lastActiveTimestamp = new WeakMap();
560
+ _sleepCheckInterval = new WeakMap();
561
+ _config = new WeakMap();
562
+ _PageLifecycle_instances = new WeakSet();
563
+ on_fn = function(event, callback) {
564
+ if (!__privateGet(this, _subscribers).has(event)) {
565
+ __privateGet(this, _subscribers).set(event, /* @__PURE__ */ new Set());
566
+ }
567
+ __privateGet(this, _subscribers).get(event).add(callback);
568
+ return () => __privateMethod(this, _PageLifecycle_instances, off_fn).call(this, event, callback);
569
+ };
570
+ off_fn = function(event, callback) {
571
+ const callbacks = __privateGet(this, _subscribers).get(event);
572
+ if (callbacks) {
573
+ callbacks.delete(callback);
574
+ if (callbacks.size === 0) {
575
+ __privateGet(this, _subscribers).delete(event);
576
+ }
577
+ }
578
+ };
579
+ emit_fn = function(event, data) {
580
+ const callbacks = __privateGet(this, _subscribers).get(event);
581
+ if (callbacks) {
582
+ for (const callback of callbacks) {
583
+ callback(data);
584
+ }
585
+ }
586
+ };
587
+ setupSources_fn = function(config) {
588
+ if (typeof document !== "undefined") {
589
+ if (config.visibility !== false) {
590
+ document.addEventListener("visibilitychange", __privateGet(this, _handleVisibility));
591
+ }
592
+ if (config.freeze !== false) {
593
+ document.addEventListener("freeze", __privateGet(this, _handleFreeze));
594
+ document.addEventListener("resume", __privateGet(this, _handleDocResume));
595
+ }
596
+ }
597
+ if (typeof window !== "undefined") {
598
+ if (config.focus) {
599
+ window.addEventListener("focus", __privateGet(this, _handleFocus));
600
+ window.addEventListener("blur", __privateGet(this, _handleBlur));
601
+ }
602
+ if (config.freeze !== false) {
603
+ window.addEventListener("pageshow", __privateGet(this, _handlePageShow));
604
+ window.addEventListener("pagehide", __privateGet(this, _handlePageHide));
605
+ }
606
+ }
607
+ if (config.sleepDetection?.enabled !== false) {
608
+ const threshold = config.sleepDetection?.threshold || 1e4;
609
+ __privateMethod(this, _PageLifecycle_instances, startSleepDetection_fn).call(this, threshold);
610
+ }
611
+ };
612
+ _handleVisibility = new WeakMap();
613
+ _handleFocus = new WeakMap();
614
+ _handleBlur = new WeakMap();
615
+ _handleFreeze = new WeakMap();
616
+ _handleDocResume = new WeakMap();
617
+ _handlePageShow = new WeakMap();
618
+ _handlePageHide = new WeakMap();
619
+ startSleepDetection_fn = function(threshold) {
620
+ const interval = Math.min(threshold / 2, 5e3);
621
+ __privateSet(this, _sleepCheckInterval, setInterval(() => {
622
+ const now = Date.now();
623
+ const gap = now - __privateGet(this, _lastActiveTimestamp);
624
+ if (gap > threshold) {
625
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "suspend", { reason: "sleep", gap });
626
+ __privateMethod(this, _PageLifecycle_instances, emit_fn).call(this, "resume", { reason: "sleep", gap });
627
+ }
628
+ __privateSet(this, _lastActiveTimestamp, now);
629
+ }, interval));
630
+ };
631
+ teardown_fn = function() {
632
+ if (typeof document !== "undefined") {
633
+ document.removeEventListener("visibilitychange", __privateGet(this, _handleVisibility));
634
+ document.removeEventListener("freeze", __privateGet(this, _handleFreeze));
635
+ document.removeEventListener("resume", __privateGet(this, _handleDocResume));
636
+ }
637
+ if (typeof window !== "undefined") {
638
+ window.removeEventListener("focus", __privateGet(this, _handleFocus));
639
+ window.removeEventListener("blur", __privateGet(this, _handleBlur));
640
+ window.removeEventListener("pageshow", __privateGet(this, _handlePageShow));
641
+ window.removeEventListener("pagehide", __privateGet(this, _handlePageHide));
642
+ }
643
+ if (__privateGet(this, _sleepCheckInterval)) {
644
+ clearInterval(__privateGet(this, _sleepCheckInterval));
645
+ __privateSet(this, _sleepCheckInterval, null);
646
+ }
647
+ __privateGet(this, _subscribers).clear();
648
+ };
649
+ __publicField(PageLifecycle, "manifest", {
650
+ name: "PageLifecycle",
651
+ namespace: "pageLifecycle",
652
+ version: "1.0.0",
653
+ description: "Browser lifecycle detection for tab visibility, focus, and sleep/wake"
654
+ });
655
+
656
+ // ../engine-content-editor/src/utils/getCaretCharacterOffset.js
657
+ function getCaretCharacterOffset(element) {
658
+ const sel = window.getSelection();
659
+ if (sel.rangeCount === 0) {
660
+ return { start: 0, end: 0 };
661
+ }
662
+ const range = sel.getRangeAt(0);
663
+ const preStartRange = range.cloneRange();
664
+ preStartRange.selectNodeContents(element);
665
+ preStartRange.setEnd(range.startContainer, range.startOffset);
666
+ const start = preStartRange.toString().length;
667
+ const preEndRange = range.cloneRange();
668
+ preEndRange.selectNodeContents(element);
669
+ preEndRange.setEnd(range.endContainer, range.endOffset);
670
+ const end = preEndRange.toString().length;
671
+ return {
672
+ start: Math.min(start, end),
673
+ end: Math.max(start, end)
674
+ };
675
+ }
676
+
677
+ // ../engine-content-editor/src/utils/setCaretToCharacterPosition.js
678
+ function setCaretToCharacterPosition(element, position) {
679
+ if (!element?.isConnected || position < 0) return;
680
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
681
+ let charCount = 0;
682
+ let lastNode = null;
683
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) {
684
+ lastNode = node;
685
+ if (position <= charCount + node.length) {
686
+ const range = document.createRange();
687
+ range.setStart(node, position - charCount);
688
+ range.collapse(true);
689
+ const sel = window.getSelection();
690
+ sel.removeAllRanges();
691
+ sel.addRange(range);
692
+ return;
693
+ }
694
+ charCount += node.length;
695
+ }
696
+ if (lastNode) {
697
+ const range = document.createRange();
698
+ range.setStart(lastNode, lastNode.length);
699
+ range.collapse(true);
700
+ const sel = window.getSelection();
701
+ sel.removeAllRanges();
702
+ sel.addRange(range);
703
+ }
704
+ }
705
+
706
+ // ../engine-content-editor/src/utils/spliceString.js
707
+ function spliceString(str, offset, deleteCount = 0, newStr = "") {
708
+ return str.slice(0, offset) + newStr + str.slice(offset + deleteCount);
709
+ }
710
+
711
+ // ../engine-content-editor/src/utils/getWordBoundsAtPosition.js
712
+ function getWordBoundsAtPosition(str, position) {
713
+ const isSpace = (c) => /[\s\n]/.exec(c);
714
+ let start = position - 1;
715
+ let end = position;
716
+ while (start >= 0 && !isSpace(str[start])) {
717
+ start -= 1;
718
+ }
719
+ start = Math.max(0, start + 1);
720
+ while (end < str.length && !isSpace(str[end])) {
721
+ end += 1;
722
+ }
723
+ end = Math.max(start, end);
724
+ return [start, end];
725
+ }
726
+
727
+ // ../engine-content-editor/src/utils/getTriggerMatchesAtCursor.js
728
+ function buildMatch({ pattern, word, match, regexMatch, triggerLen, start, end, cursorPos }) {
729
+ const queryEnd = cursorPos - start;
730
+ return {
731
+ pattern,
732
+ word,
733
+ match,
734
+ regexMatch,
735
+ start,
736
+ end,
737
+ query: word.slice(triggerLen, queryEnd)
738
+ };
739
+ }
740
+ function getTriggerMatchesAtCursor(text, cursorPos, patterns = []) {
741
+ if (!text || cursorPos === 0 || patterns.length === 0) return [];
742
+ const [start, end] = getWordBoundsAtPosition(text, cursorPos);
743
+ const word = text.slice(start, end);
744
+ if (!word) return [];
745
+ const matches = [];
746
+ for (const pattern of patterns) {
747
+ if (pattern.regex) {
748
+ const m = word.match(pattern.trigger);
749
+ if (m) {
750
+ matches.push(buildMatch({
751
+ pattern,
752
+ word,
753
+ match: m[0],
754
+ regexMatch: m,
755
+ triggerLen: 1,
756
+ start,
757
+ end,
758
+ cursorPos
759
+ }));
760
+ }
761
+ continue;
762
+ }
763
+ const trig = pattern.trigger;
764
+ const triggerLen = trig.length;
765
+ if (pattern.exact && word === trig) {
766
+ matches.push(buildMatch({ pattern, word, match: trig, regexMatch: null, triggerLen, start, end, cursorPos }));
767
+ } else if (pattern.startsWith && word.startsWith(trig)) {
768
+ matches.push(buildMatch({ pattern, word, match: trig, regexMatch: null, triggerLen, start, end, cursorPos }));
769
+ } else if (pattern.endsWith && word.endsWith(trig)) {
770
+ matches.push(buildMatch({ pattern, word, match: trig, regexMatch: null, triggerLen, start, end, cursorPos }));
771
+ }
772
+ }
773
+ return matches;
774
+ }
775
+
776
+ // ../engine-content-editor/src/Target.js
777
+ var PREVENT_INPUT_TYPES = /* @__PURE__ */ new Set([
778
+ "insertText",
779
+ "insertParagraph",
780
+ "insertLineBreak",
781
+ "deleteContentBackward",
782
+ "deleteContentForward"
783
+ ]);
784
+ var OBSERVER_OPTIONS = { childList: true, characterData: true, subtree: true };
785
+ var _patterns, _inheritedPatterns, _ownListeners, _host, _content, _start, _end, _nextOffset, _initial, _destroyed, _observer, _composing, _onWheelBound, _Target_instances, init_fn, updateCaret_fn, _handlePaste, _handleBeforeInput, _handleBlur2, _handleWheel, _handleKeyDown, _handleMutation, _handleCompositionStart, _handleCompositionEnd, applyEdit_fn;
786
+ var _Target = class _Target {
787
+ constructor($el, { onInput, onBlur, onWheel } = {}, host = {}) {
788
+ __privateAdd(this, _Target_instances);
789
+ __privateAdd(this, _patterns, []);
790
+ __privateAdd(this, _inheritedPatterns, []);
791
+ __privateAdd(this, _ownListeners, []);
792
+ __privateAdd(this, _host, {});
793
+ __privateAdd(this, _content, "");
794
+ __privateAdd(this, _start, 0);
795
+ __privateAdd(this, _end, 0);
796
+ __privateAdd(this, _nextOffset, 0);
797
+ __privateAdd(this, _initial, { content: "", start: 0, end: 0 });
798
+ __privateAdd(this, _destroyed, false);
799
+ __privateAdd(this, _observer, null);
800
+ __privateAdd(this, _composing, false);
801
+ __privateAdd(this, _onWheelBound, null);
802
+ __privateAdd(this, _handlePaste, (e) => {
803
+ e.stopPropagation();
804
+ e.preventDefault();
805
+ const data = e.clipboardData;
806
+ if (!data) return;
807
+ const pasted = data.getData("text/plain") || data.getData("text/html");
808
+ if (!pasted) return;
809
+ let plainText = pasted;
810
+ if (pasted !== data.getData("text/plain")) {
811
+ const tmp = document.createElement("div");
812
+ tmp.innerHTML = pasted;
813
+ plainText = tmp.textContent || "";
814
+ }
815
+ __privateMethod(this, _Target_instances, updateCaret_fn).call(this);
816
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), plainText);
817
+ });
818
+ __privateAdd(this, _handleBeforeInput, (e) => {
819
+ console.log("beforeinput", e);
820
+ e.stopPropagation();
821
+ if (PREVENT_INPUT_TYPES.has(e.inputType)) e.preventDefault();
822
+ __privateMethod(this, _Target_instances, updateCaret_fn).call(this);
823
+ switch (e.inputType) {
824
+ case "insertText":
825
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), e.data ?? "");
826
+ break;
827
+ case "insertParagraph":
828
+ case "insertLineBreak":
829
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), "\n");
830
+ break;
831
+ case "deleteContentBackward":
832
+ if (__privateGet(this, _start) !== __privateGet(this, _end)) {
833
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), "");
834
+ } else {
835
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, Math.max(0, __privateGet(this, _start) - 1), Math.min(1, __privateGet(this, _start)), "");
836
+ }
837
+ break;
838
+ case "deleteContentForward":
839
+ if (__privateGet(this, _start) !== __privateGet(this, _end)) {
840
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), "");
841
+ } else {
842
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), 1, "");
843
+ }
844
+ break;
845
+ }
846
+ });
847
+ __privateAdd(this, _handleBlur2, () => {
848
+ this.onBlur?.(__privateGet(this, _content));
849
+ });
850
+ __privateAdd(this, _handleWheel, (e) => {
851
+ e.preventDefault();
852
+ this.onWheel({ deltaX: e.deltaX, deltaY: e.deltaY, ctrlKey: e.ctrlKey, x: e.clientX, y: e.clientY });
853
+ });
854
+ // Buttons suppress beforeinput for spacebar (the browser treats space as button
855
+ // activation and never fires insertText). Intercept at keydown and insert manually.
856
+ __privateAdd(this, _handleKeyDown, (e) => {
857
+ if (e.key !== " ") return;
858
+ e.preventDefault();
859
+ __privateMethod(this, _Target_instances, updateCaret_fn).call(this);
860
+ __privateMethod(this, _Target_instances, applyEdit_fn).call(this, __privateGet(this, _start), __privateGet(this, _end) - __privateGet(this, _start), " ");
861
+ });
862
+ __privateAdd(this, _handleMutation, () => {
863
+ if (__privateGet(this, _destroyed) || __privateGet(this, _composing)) return;
864
+ setCaretToCharacterPosition(this.$el, __privateGet(this, _nextOffset));
865
+ });
866
+ __privateAdd(this, _handleCompositionStart, () => {
867
+ __privateSet(this, _composing, true);
868
+ });
869
+ __privateAdd(this, _handleCompositionEnd, () => {
870
+ __privateSet(this, _composing, false);
871
+ __privateSet(this, _content, this.$el.textContent || "");
872
+ this.onInput?.(__privateGet(this, _content));
873
+ });
874
+ this.$el = $el;
875
+ this.onInput = onInput;
876
+ this.onBlur = onBlur;
877
+ this.onWheel = onWheel;
878
+ __privateSet(this, _inheritedPatterns, host.inheritedPatterns ?? []);
879
+ __privateSet(this, _host, host);
880
+ __privateMethod(this, _Target_instances, init_fn).call(this);
881
+ }
882
+ static create($el, opts = {}, host = {}) {
883
+ if (this.instances.has($el)) {
884
+ return this.instances.get($el);
885
+ }
886
+ const target = new _Target($el, opts, host);
887
+ _Target.instances.set($el, target);
888
+ return target;
889
+ }
890
+ get content() {
891
+ return __privateGet(this, _content);
892
+ }
893
+ get cursor() {
894
+ return { start: __privateGet(this, _start), end: __privateGet(this, _end) };
895
+ }
896
+ /**
897
+ * Register a passthrough DOM listener on the underlying contenteditable
898
+ * element. Returns an unsubscribe function. Use this to expose raw browser
899
+ * events (keydown for Enter-to-submit, focus, mouseup, etc.). Listeners can
900
+ * call `e.preventDefault()` to suppress the default action and the
901
+ * corresponding `beforeinput` Target would otherwise process.
902
+ *
903
+ * @param {string} eventName
904
+ * @param {(event: Event) => void} callback
905
+ * @param {boolean | AddEventListenerOptions} [options]
906
+ * @returns {() => void} unsubscribe
907
+ */
908
+ on(eventName, callback, options = false) {
909
+ this.$el.addEventListener(eventName, callback, options);
910
+ const entry = { eventName, callback, options };
911
+ __privateGet(this, _ownListeners).push(entry);
912
+ return () => {
913
+ this.$el.removeEventListener(eventName, callback, options);
914
+ const i2 = __privateGet(this, _ownListeners).indexOf(entry);
915
+ if (i2 !== -1) __privateGet(this, _ownListeners).splice(i2, 1);
916
+ };
917
+ }
918
+ onMatch(trigger, callback, { exact = true, startsWith = false, endsWith = false } = {}) {
919
+ const isRegex = trigger instanceof RegExp;
920
+ const pattern = {
921
+ trigger: isRegex ? trigger : trigger?.trim?.(),
922
+ regex: isRegex,
923
+ exact,
924
+ startsWith,
925
+ endsWith,
926
+ callback
927
+ };
928
+ __privateGet(this, _patterns).push(pattern);
929
+ return () => {
930
+ const i2 = __privateGet(this, _patterns).indexOf(pattern);
931
+ if (i2 !== -1) __privateGet(this, _patterns).splice(i2, 1);
932
+ };
933
+ }
934
+ reset() {
935
+ __privateSet(this, _content, __privateGet(this, _initial).content);
936
+ __privateSet(this, _nextOffset, __privateGet(this, _initial).start);
937
+ this.onInput?.(__privateGet(this, _content));
938
+ }
939
+ destroy() {
940
+ if (__privateGet(this, _destroyed)) return;
941
+ __privateSet(this, _destroyed, true);
942
+ __privateGet(this, _observer)?.disconnect();
943
+ this.$el.removeEventListener("paste", __privateGet(this, _handlePaste));
944
+ this.$el.removeEventListener("beforeinput", __privateGet(this, _handleBeforeInput));
945
+ this.$el.removeEventListener("blur", __privateGet(this, _handleBlur2));
946
+ this.$el.removeEventListener("compositionstart", __privateGet(this, _handleCompositionStart));
947
+ this.$el.removeEventListener("compositionend", __privateGet(this, _handleCompositionEnd));
948
+ this.$el.removeEventListener("keydown", __privateGet(this, _handleKeyDown));
949
+ if (__privateGet(this, _onWheelBound)) {
950
+ document.removeEventListener("wheel", __privateGet(this, _onWheelBound), { passive: false, capture: true });
951
+ __privateSet(this, _onWheelBound, null);
952
+ }
953
+ for (const { eventName, callback, options } of __privateGet(this, _ownListeners)) {
954
+ this.$el.removeEventListener(eventName, callback, options);
955
+ }
956
+ __privateSet(this, _ownListeners, []);
957
+ __privateSet(this, _patterns, []);
958
+ _Target.instances.delete(this.$el);
959
+ __privateGet(this, _host).onDestroy?.(this);
960
+ }
961
+ };
962
+ _patterns = new WeakMap();
963
+ _inheritedPatterns = new WeakMap();
964
+ _ownListeners = new WeakMap();
965
+ _host = new WeakMap();
966
+ _content = new WeakMap();
967
+ _start = new WeakMap();
968
+ _end = new WeakMap();
969
+ _nextOffset = new WeakMap();
970
+ _initial = new WeakMap();
971
+ _destroyed = new WeakMap();
972
+ _observer = new WeakMap();
973
+ _composing = new WeakMap();
974
+ _onWheelBound = new WeakMap();
975
+ _Target_instances = new WeakSet();
976
+ init_fn = function() {
977
+ __privateSet(this, _content, this.$el.textContent || "");
978
+ const { start, end } = getCaretCharacterOffset(this.$el);
979
+ __privateSet(this, _start, start);
980
+ __privateSet(this, _end, end);
981
+ __privateSet(this, _nextOffset, start);
982
+ __privateSet(this, _initial, { content: __privateGet(this, _content), start, end });
983
+ this.$el.addEventListener("paste", __privateGet(this, _handlePaste));
984
+ this.$el.addEventListener("beforeinput", __privateGet(this, _handleBeforeInput));
985
+ this.$el.addEventListener("blur", __privateGet(this, _handleBlur2));
986
+ this.$el.addEventListener("compositionstart", __privateGet(this, _handleCompositionStart));
987
+ this.$el.addEventListener("compositionend", __privateGet(this, _handleCompositionEnd));
988
+ if (this.$el.tagName === "BUTTON") {
989
+ this.$el.addEventListener("keydown", __privateGet(this, _handleKeyDown));
990
+ }
991
+ __privateSet(this, _observer, new MutationObserver(__privateGet(this, _handleMutation)));
992
+ __privateGet(this, _observer).observe(this.$el, OBSERVER_OPTIONS);
993
+ if (this.onWheel) {
994
+ __privateSet(this, _onWheelBound, __privateGet(this, _handleWheel));
995
+ document.addEventListener("wheel", __privateGet(this, _onWheelBound), { passive: false, capture: true });
996
+ }
997
+ };
998
+ updateCaret_fn = function() {
999
+ const { start, end } = getCaretCharacterOffset(this.$el);
1000
+ __privateSet(this, _start, start);
1001
+ __privateSet(this, _end, end);
1002
+ };
1003
+ _handlePaste = new WeakMap();
1004
+ _handleBeforeInput = new WeakMap();
1005
+ _handleBlur2 = new WeakMap();
1006
+ _handleWheel = new WeakMap();
1007
+ _handleKeyDown = new WeakMap();
1008
+ _handleMutation = new WeakMap();
1009
+ _handleCompositionStart = new WeakMap();
1010
+ _handleCompositionEnd = new WeakMap();
1011
+ applyEdit_fn = function(offset, deleteCount, insert) {
1012
+ __privateSet(this, _content, spliceString(__privateGet(this, _content), offset, deleteCount, insert));
1013
+ __privateSet(this, _nextOffset, offset + insert.length);
1014
+ const allPatterns = __privateGet(this, _inheritedPatterns).length ? [...__privateGet(this, _patterns), ...__privateGet(this, _inheritedPatterns)] : __privateGet(this, _patterns);
1015
+ const matches = getTriggerMatchesAtCursor(__privateGet(this, _content), __privateGet(this, _nextOffset), allPatterns);
1016
+ for (const m of matches) {
1017
+ m.pattern.callback({
1018
+ word: m.word,
1019
+ trigger: m.match,
1020
+ start: m.start,
1021
+ end: m.end,
1022
+ query: m.query,
1023
+ match: m.regexMatch
1024
+ });
1025
+ }
1026
+ this.onInput?.(__privateGet(this, _content));
1027
+ };
1028
+ __publicField(_Target, "instances", /* @__PURE__ */ new WeakMap());
1029
+ var Target = _Target;
1030
+
1031
+ // ../engine-content-editor/src/ContentEditor.js
1032
+ var _patterns2, _listeners, _targets;
1033
+ var ContentEditor = class extends v {
1034
+ constructor() {
1035
+ super(...arguments);
1036
+ __privateAdd(this, _patterns2, []);
1037
+ __privateAdd(this, _listeners, []);
1038
+ __privateAdd(this, _targets, /* @__PURE__ */ new Set());
1039
+ }
1040
+ actions() {
1041
+ return {
1042
+ create: ($el, opts = {}) => {
1043
+ try {
1044
+ if (!($el instanceof HTMLElement)) {
1045
+ throw new Error("ContentEditor.create: $el must be an HTMLElement");
1046
+ }
1047
+ if (!$el.isContentEditable) {
1048
+ $el.contentEditable = "true";
1049
+ }
1050
+ const target = Target.create($el, opts, {
1051
+ inheritedPatterns: __privateGet(this, _patterns2),
1052
+ onDestroy: (t) => {
1053
+ for (const { eventName, callback, options } of __privateGet(this, _listeners)) {
1054
+ t.$el.removeEventListener(eventName, callback, options);
1055
+ }
1056
+ __privateGet(this, _targets).delete(t);
1057
+ Target.instances.delete($el);
1058
+ }
1059
+ });
1060
+ for (const { eventName, callback, options } of __privateGet(this, _listeners)) {
1061
+ $el.addEventListener(eventName, callback, options);
1062
+ }
1063
+ __privateGet(this, _targets).add(target);
1064
+ return target;
1065
+ } catch (error) {
1066
+ console.error(error);
1067
+ return null;
1068
+ }
1069
+ },
1070
+ getTarget: ($el) => Target.instances.get($el),
1071
+ onMatch: (trigger, callback, opts = {}) => {
1072
+ const isRegex = trigger instanceof RegExp;
1073
+ const pattern = {
1074
+ trigger: isRegex ? trigger : trigger?.trim?.(),
1075
+ regex: isRegex,
1076
+ exact: opts.exact ?? true,
1077
+ startsWith: opts.startsWith ?? false,
1078
+ endsWith: opts.endsWith ?? false,
1079
+ callback
1080
+ };
1081
+ __privateGet(this, _patterns2).push(pattern);
1082
+ return () => {
1083
+ const i2 = __privateGet(this, _patterns2).indexOf(pattern);
1084
+ if (i2 !== -1) __privateGet(this, _patterns2).splice(i2, 1);
1085
+ };
1086
+ },
1087
+ /**
1088
+ * Register a passthrough DOM listener applied to every Target's element
1089
+ * (existing and future). Mirrors `target.on()` but at the service level
1090
+ * so Enter-to-submit-style behaviors only have to be wired once.
1091
+ *
1092
+ * @param {string} eventName
1093
+ * @param {(event: Event) => void} callback
1094
+ * @param {boolean | AddEventListenerOptions} [options]
1095
+ * @returns {() => void} unsubscribe
1096
+ */
1097
+ on: (eventName, callback, options = false) => {
1098
+ const entry = { eventName, callback, options };
1099
+ __privateGet(this, _listeners).push(entry);
1100
+ for (const t of __privateGet(this, _targets)) {
1101
+ t.$el.addEventListener(eventName, callback, options);
1102
+ }
1103
+ return () => {
1104
+ const i2 = __privateGet(this, _listeners).indexOf(entry);
1105
+ if (i2 !== -1) __privateGet(this, _listeners).splice(i2, 1);
1106
+ for (const t of __privateGet(this, _targets)) {
1107
+ t.$el.removeEventListener(eventName, callback, options);
1108
+ }
1109
+ };
1110
+ },
1111
+ reset: ($el) => Target.instances.get($el)?.reset(),
1112
+ destroy: ($el) => Target.instances.get($el)?.destroy()
1113
+ };
1114
+ }
1115
+ };
1116
+ _patterns2 = new WeakMap();
1117
+ _listeners = new WeakMap();
1118
+ _targets = new WeakMap();
1119
+ __publicField(ContentEditor, "manifest", {
1120
+ name: "Content Editor",
1121
+ namespace: "contentEditor",
1122
+ version: "1.0.0",
1123
+ description: "Content editor extension"
1124
+ });
1125
+
1126
+ // ../../node_modules/@jucie.io/state/dist/lib/change.js
1127
+ var OPERATION_INVERSES = {
1128
+ [CREATED]: DELETED,
1129
+ [DELETED]: CREATED,
1130
+ [UPDATED]: UPDATED
1131
+ };
1132
+ var ARRAY_METHODS = /* @__PURE__ */ new Set(["push", "unshift", "splice", "removeMatch"]);
1133
+ function invertChange(change) {
1134
+ const { address, path, method, from, to, operation } = change;
1135
+ if (ARRAY_METHODS.has(method)) {
1136
+ return invertArrayChange(change);
1137
+ }
1138
+ return {
1139
+ address,
1140
+ path,
1141
+ method,
1142
+ to: from,
1143
+ from: to,
1144
+ operation: invertOperation(operation)
1145
+ };
1146
+ }
1147
+ function invertArrayChange(change) {
1148
+ const { address, path, method, from, to } = change;
1149
+ if (method === "push" || method === "unshift") {
1150
+ return { address, path, method: "removeMatch", operation: UPDATED, to };
1151
+ }
1152
+ const [start, , ...inserted] = to;
1153
+ const removed = from || [];
1154
+ return {
1155
+ address,
1156
+ path,
1157
+ method: "splice",
1158
+ operation: UPDATED,
1159
+ to: [start, inserted.length, ...removed],
1160
+ from: inserted
1161
+ };
1162
+ }
1163
+ function invertOperation(operation) {
1164
+ return OPERATION_INVERSES[operation];
1165
+ }
1166
+
1167
+ // ../../node_modules/@jucie.io/state/dist/utils/defer.js
1168
+ function defer(arg1, arg2) {
1169
+ let callback = null;
1170
+ let delay = 0;
1171
+ if (typeof arg1 === "function") {
1172
+ callback = arg1;
1173
+ if (typeof arg2 === "number") {
1174
+ delay = arg2;
1175
+ }
1176
+ } else if (typeof arg1 === "number") {
1177
+ delay = arg1;
1178
+ }
1179
+ return (...args) => new Promise((resolve, reject) => {
1180
+ setTimeout(() => {
1181
+ try {
1182
+ const result = callback ? callback(...args) : void 0;
1183
+ resolve(result);
1184
+ } catch (error) {
1185
+ reject(error);
1186
+ }
1187
+ }, delay);
1188
+ });
1189
+ }
1190
+
1191
+ // ../../node_modules/@jucie.io/state-history/dist/main.js
1192
+ var f3 = Object.defineProperty;
1193
+ var i = (n, t) => f3(n, "name", { value: t, configurable: true });
1194
+ var _a;
1195
+ var o = (_a = class {
1196
+ constructor(t = "") {
1197
+ this.isMarker = true, this.description = t;
1198
+ }
1199
+ }, i(_a, "Marker"), _a);
1200
+ var _a2, _t, _a3, _n, _e, _o, _s, _i, _r, _a_instances, d_fn, _f, u_fn, h_fn;
1201
+ var a = (_a2 = class extends Plugin {
1202
+ constructor() {
1203
+ super(...arguments);
1204
+ __privateAdd(this, _a_instances);
1205
+ __privateAdd(this, _t, []);
1206
+ __privateAdd(this, _a3, false);
1207
+ __privateAdd(this, _n, /* @__PURE__ */ new Set());
1208
+ __privateAdd(this, _e, 0);
1209
+ __privateAdd(this, _o, false);
1210
+ __privateAdd(this, _s, /* @__PURE__ */ new Map());
1211
+ __privateAdd(this, _i, true);
1212
+ __privateAdd(this, _r, false);
1213
+ __publicField(this, "onUndoRedo", null);
1214
+ __privateAdd(this, _f, defer(() => {
1215
+ __privateMethod(this, _a_instances, h_fn).call(this), __privateSet(this, _r, false);
1216
+ }));
1217
+ __publicField(this, "undo", defer((t) => {
1218
+ if (!this.onUndoRedo) throw new Error("Undo/redo handler is required for undo operation");
1219
+ if (__privateMethod(this, _a_instances, h_fn).call(this), __privateGet(this, _e) <= 0) return false;
1220
+ if (__privateSet(this, _i, false), !(__privateGet(this, _t)[__privateGet(this, _e)] instanceof o)) return console.warn("Expected to be at a marker for undo operation"), false;
1221
+ let e = /* @__PURE__ */ new Set(), s3 = __privateGet(this, _e) - 1;
1222
+ for (; s3 > 0; ) {
1223
+ let r2 = __privateGet(this, _t)[s3];
1224
+ if (r2 instanceof o) break;
1225
+ e.add(invertChange(r2)), s3--;
1226
+ }
1227
+ return __privateSet(this, _e, s3), this.onUndoRedo(Array.from(e)), t && typeof t == "function" && t(), __privateSet(this, _i, true), true;
1228
+ }));
1229
+ __publicField(this, "redo", defer((t) => {
1230
+ if (!this.onUndoRedo) throw new Error("Undo/redo handler is required for redo operation");
1231
+ if (__privateGet(this, _e) >= __privateGet(this, _t).length - 1) return false;
1232
+ if (__privateSet(this, _i, false), !(__privateGet(this, _t)[__privateGet(this, _e)] instanceof o)) return console.warn("Expected to be at a marker for redo operation"), false;
1233
+ let e = /* @__PURE__ */ new Set();
1234
+ for (__privateWrapper(this, _e)._++; __privateGet(this, _e) < __privateGet(this, _t).length; ) {
1235
+ let s3 = __privateGet(this, _t)[__privateGet(this, _e)];
1236
+ if (s3 instanceof o) break;
1237
+ e.add(s3), __privateWrapper(this, _e)._++;
1238
+ }
1239
+ return this.onUndoRedo(e), t && typeof t == "function" && t(), __privateSet(this, _i, true), true;
1240
+ }));
1241
+ }
1242
+ initialize(t) {
1243
+ this.onUndoRedo = (e) => t.apply(e);
1244
+ }
1245
+ actions(t) {
1246
+ return { undo: i((e) => this.undo(e), "undo"), redo: i((e) => this.redo(e), "redo"), canUndo: i(() => this.canUndo(), "canUndo"), canRedo: i(() => this.canRedo(), "canRedo"), group: i((e) => this.group(e), "group"), commit: i((e) => this.commit(e), "commit"), onCommit: i((e) => this.onCommit(e), "onCommit"), addMarker: i((e) => this.addMarker(e), "addMarker"), size: i(() => this.size(), "size"), start: i(() => __privateMethod(this, _a_instances, d_fn).call(this), "start") };
1247
+ }
1248
+ onStateChange(t, e, s3) {
1249
+ if (!__privateGet(this, _a3) || !__privateGet(this, _i) || e.method === "apply") return;
1250
+ let r2 = __privateGet(this, _s).get(t.address), d = r2 ? { ...e, from: r2.from } : e;
1251
+ __privateGet(this, _s).set(t.address, d), !s3 && !__privateGet(this, _o) && __privateMethod(this, _a_instances, u_fn).call(this);
1252
+ }
1253
+ addMarker(t = "") {
1254
+ __privateMethod(this, _a_instances, h_fn).call(this, t), __privateSet(this, _e, __privateGet(this, _t).length - 1);
1255
+ }
1256
+ canUndo() {
1257
+ return __privateGet(this, _e) > 0;
1258
+ }
1259
+ canRedo() {
1260
+ return __privateGet(this, _e) < __privateGet(this, _t).length - 1;
1261
+ }
1262
+ size() {
1263
+ return __privateGet(this, _t).length;
1264
+ }
1265
+ group(t) {
1266
+ return __privateSet(this, _o, true), typeof t == "function" ? (t(this), this.commit()) : () => this.commit();
1267
+ }
1268
+ commit(t = "") {
1269
+ return __privateMethod(this, _a_instances, h_fn).call(this, t), __privateSet(this, _o, false), this;
1270
+ }
1271
+ pause() {
1272
+ __privateSet(this, _i, false);
1273
+ }
1274
+ resume() {
1275
+ __privateSet(this, _i, true);
1276
+ }
1277
+ onCommit(t) {
1278
+ return __privateGet(this, _n).add(t), () => {
1279
+ __privateGet(this, _n).delete(t);
1280
+ };
1281
+ }
1282
+ reset() {
1283
+ __privateSet(this, _t, [new o("History Start")]), __privateSet(this, _n, /* @__PURE__ */ new Set()), __privateSet(this, _e, 0), __privateSet(this, _o, false), __privateSet(this, _s, /* @__PURE__ */ new Map()), __privateSet(this, _i, true), __privateSet(this, _r, false), __privateSet(this, _a3, false), this.onUndoRedo = null;
1284
+ }
1285
+ }, _t = new WeakMap(), _a3 = new WeakMap(), _n = new WeakMap(), _e = new WeakMap(), _o = new WeakMap(), _s = new WeakMap(), _i = new WeakMap(), _r = new WeakMap(), _a_instances = new WeakSet(), d_fn = function() {
1286
+ __privateSet(this, _t, [new o("History Start")]), __privateSet(this, _e, 0), __privateSet(this, _a3, true), __privateGet(this, _s).clear(), __privateSet(this, _o, false), __privateSet(this, _r, false);
1287
+ }, _f = new WeakMap(), u_fn = function() {
1288
+ __privateGet(this, _r) || (__privateSet(this, _r, true), __privateGet(this, _f).call(this));
1289
+ }, h_fn = function(t = "") {
1290
+ if (__privateGet(this, _s).size === 0) return;
1291
+ __privateGet(this, _e) < __privateGet(this, _t).length - 1 && __privateGet(this, _t).splice(__privateGet(this, _e) + 1);
1292
+ let e = Array.from(__privateGet(this, _s).values());
1293
+ for (__privateGet(this, _t).push(...e), __privateGet(this, _n).forEach((r2) => r2(e)), __privateGet(this, _t)[__privateGet(this, _t).length - 1] instanceof o || __privateGet(this, _t).push(new o(t || Date.now().toString())); __privateGet(this, _t).length > this.options.maxSize; ) __privateGet(this, _t).shift();
1294
+ __privateGet(this, _s).clear(), __privateSet(this, _e, __privateGet(this, _t).length - 1);
1295
+ }, __publicField(_a2, "name", "history"), __publicField(_a2, "options", { maxSize: 100 }), _a2);
1296
+
1297
+ // ../../node_modules/@jucie.io/state-on-change/dist/main.js
1298
+ var h = Object.defineProperty;
1299
+ var s2 = (i2, e) => h(i2, "name", { value: e, configurable: true });
1300
+ var _a4, _t2, _e2, _r2, _s2, _n2, _r_instances, o_fn, u_fn2, h_fn2, i_fn, f_fn;
1301
+ var r = (_a4 = class extends Plugin {
1302
+ constructor(e = {}) {
1303
+ super(e);
1304
+ __privateAdd(this, _r_instances);
1305
+ __privateAdd(this, _t2, /* @__PURE__ */ new Set());
1306
+ __privateAdd(this, _e2, /* @__PURE__ */ new Map());
1307
+ __privateAdd(this, _r2, false);
1308
+ __privateAdd(this, _s2, false);
1309
+ __privateAdd(this, _n2, 0);
1310
+ __privateSet(this, _n2, e.debounce ?? 0);
1311
+ }
1312
+ actions() {
1313
+ return { addListener: s2((e) => {
1314
+ if (typeof e == "function") return __privateMethod(this, _r_instances, h_fn2).call(this, e);
1315
+ }, "addListener"), subscribe: s2((e) => {
1316
+ if (typeof e == "function") return __privateMethod(this, _r_instances, h_fn2).call(this, e);
1317
+ }, "subscribe"), unsubscribe: s2((e) => {
1318
+ if (typeof e == "function") return __privateMethod(this, _r_instances, i_fn).call(this, e);
1319
+ }, "unsubscribe"), removeListener: s2((e) => __privateMethod(this, _r_instances, i_fn).call(this, e), "removeListener"), clear: s2(() => __privateMethod(this, _r_instances, f_fn).call(this), "clear") };
1320
+ }
1321
+ onStateChange(e, t) {
1322
+ !__privateGet(this, _s2) || t.method === "apply" || __privateMethod(this, _r_instances, o_fn).call(this, e, t);
1323
+ }
1324
+ }, _t2 = new WeakMap(), _e2 = new WeakMap(), _r2 = new WeakMap(), _s2 = new WeakMap(), _n2 = new WeakMap(), _r_instances = new WeakSet(), o_fn = function(e, t) {
1325
+ __privateGet(this, _e2).has(e.address) && __privateGet(this, _e2).delete(e.address), __privateGet(this, _e2).set(e.address, t), __privateMethod(this, _r_instances, u_fn2).call(this);
1326
+ }, u_fn2 = function() {
1327
+ if (!__privateGet(this, _r2)) {
1328
+ __privateSet(this, _r2, true);
1329
+ try {
1330
+ setTimeout(() => {
1331
+ let e = Array.from(__privateGet(this, _e2).values());
1332
+ __privateGet(this, _e2).clear();
1333
+ for (let t of __privateGet(this, _t2)) try {
1334
+ t(e);
1335
+ } catch (n) {
1336
+ console.error("Error in onChange listener:", n);
1337
+ }
1338
+ __privateSet(this, _r2, false);
1339
+ }, __privateGet(this, _n2));
1340
+ } catch (e) {
1341
+ console.error(e);
1342
+ }
1343
+ }
1344
+ }, h_fn2 = function(e) {
1345
+ return __privateGet(this, _t2).add(e), __privateSet(this, _s2, true), () => __privateMethod(this, _r_instances, i_fn).call(this, e);
1346
+ }, i_fn = function(e) {
1347
+ typeof e == "function" && (__privateGet(this, _t2).delete(e), __privateGet(this, _t2).size === 0 && __privateSet(this, _s2, false));
1348
+ }, f_fn = function() {
1349
+ __privateGet(this, _t2).clear(), __privateGet(this, _e2).clear(), __privateSet(this, _s2, false);
1350
+ }, __publicField(_a4, "name", "onChange"), _a4);
1351
+
1352
+ // ../../node_modules/@jucie.io/state/dist/admin/buffer.js
1353
+ function defaultReplacer(key, value) {
1354
+ if (key && key[0] === ".") return void 0;
1355
+ return value;
1356
+ }
1357
+ function applyReplacerDeep(input, replacer = defaultReplacer, parentKey = "") {
1358
+ if (input === null || typeof input !== "object") return input;
1359
+ if (Array.isArray(input)) {
1360
+ return input.map((v2) => applyReplacerDeep(v2, replacer));
1361
+ }
1362
+ const out = {};
1363
+ for (const k of Object.keys(input)) {
1364
+ const v2 = replacer(k, input[k]);
1365
+ if (typeof v2 !== "undefined") {
1366
+ out[k] = applyReplacerDeep(v2, replacer, k);
1367
+ }
1368
+ }
1369
+ return out;
1370
+ }
1371
+
1372
+ // ../../node_modules/@jucie.io/state/dist/admin/binary.js
1373
+ var MAGIC = new Uint8Array([74, 83, 67, 50]);
1374
+ var VERSION = 2;
1375
+ function base64urlEncode(buffer) {
1376
+ const chunkSize = 8192;
1377
+ let binaryString = "";
1378
+ for (let i2 = 0; i2 < buffer.length; i2 += chunkSize) {
1379
+ const chunk = buffer.slice(i2, i2 + chunkSize);
1380
+ binaryString += String.fromCharCode(...chunk);
1381
+ }
1382
+ return btoa(binaryString).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
1383
+ }
1384
+ function base64urlDecode(str) {
1385
+ const base64 = str.replace(/-/g, "+").replace(/_/g, "/");
1386
+ const padded = base64 + "=".repeat((4 - base64.length % 4) % 4);
1387
+ const binaryString = atob(padded);
1388
+ const result = new Uint8Array(binaryString.length);
1389
+ for (let i2 = 0; i2 < binaryString.length; i2++) {
1390
+ result[i2] = binaryString.charCodeAt(i2);
1391
+ }
1392
+ return result;
1393
+ }
1394
+ function calculateChecksum(buffer) {
1395
+ let checksum = 0;
1396
+ for (let i2 = 0; i2 < buffer.length; i2++) {
1397
+ checksum = (checksum << 5) - checksum + buffer[i2] >>> 0;
1398
+ }
1399
+ return checksum;
1400
+ }
1401
+ function writeUint32(value, buffer, offset = 0) {
1402
+ const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 4);
1403
+ view.setUint32(0, value, true);
1404
+ return offset + 4;
1405
+ }
1406
+ function readUint32(buffer, offset = 0) {
1407
+ const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 4);
1408
+ return view.getUint32(0, true);
1409
+ }
1410
+ function writeUint16(value, buffer, offset = 0) {
1411
+ const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 2);
1412
+ view.setUint16(0, value, true);
1413
+ return offset + 2;
1414
+ }
1415
+ function readUint16(buffer, offset = 0) {
1416
+ const view = new DataView(buffer.buffer, buffer.byteOffset + offset, 2);
1417
+ return view.getUint16(0, true);
1418
+ }
1419
+ function writeUint8(value, buffer, offset = 0) {
1420
+ buffer[offset] = value;
1421
+ return offset + 1;
1422
+ }
1423
+ function readUint8(buffer, offset = 0) {
1424
+ return buffer[offset];
1425
+ }
1426
+ function encodeObject(obj) {
1427
+ return encode(obj);
1428
+ }
1429
+ function decodeObject(buffer) {
1430
+ const obj = decode(buffer);
1431
+ return [obj, buffer.length];
1432
+ }
1433
+
1434
+ // ../../node_modules/@jucie.io/state/dist/admin/pack.js
1435
+ async function pack(data, { replacer = defaultReplacer } = {}) {
1436
+ const clean = applyReplacerDeep(data, replacer);
1437
+ const dataBuffer = encodeObject(clean);
1438
+ const payloadLength = 4 + dataBuffer.length;
1439
+ const payload = new Uint8Array(payloadLength);
1440
+ let offset = 0;
1441
+ offset = writeUint32(dataBuffer.length, payload, offset);
1442
+ payload.set(dataBuffer, offset);
1443
+ const checksum = calculateChecksum(payload);
1444
+ const headerLen = 4 + 2 + 1 + 4 + 4;
1445
+ const capsule = new Uint8Array(headerLen + payload.length);
1446
+ capsule.set(MAGIC, 0);
1447
+ writeUint16(VERSION, capsule, 4);
1448
+ writeUint8(0, capsule, 6);
1449
+ writeUint32(checksum, capsule, 7);
1450
+ writeUint32(payload.length, capsule, 11);
1451
+ capsule.set(payload, 15);
1452
+ return base64urlEncode(capsule);
1453
+ }
1454
+
1455
+ // ../../node_modules/@jucie.io/state/dist/admin/unpack.js
1456
+ async function unpack(capsuleString, cb) {
1457
+ const capsule = base64urlDecode(capsuleString);
1458
+ if (capsule.length < 15) {
1459
+ throw new Error("Invalid capsule: too short");
1460
+ }
1461
+ for (let i2 = 0; i2 < 4; i2++) {
1462
+ if (capsule[i2] !== MAGIC[i2]) throw new Error("Invalid capsule: bad magic");
1463
+ }
1464
+ const version = readUint16(capsule, 4);
1465
+ if (version !== VERSION) {
1466
+ throw new Error(`Unsupported capsule version: ${version}`);
1467
+ }
1468
+ const flags = readUint8(capsule, 6);
1469
+ const storedChecksum = readUint32(capsule, 7);
1470
+ const payloadLength = readUint32(capsule, 11);
1471
+ if (payloadLength < 0) throw new Error("Invalid capsule: negative payload length");
1472
+ if (capsule.length !== 15 + payloadLength) throw new Error("Invalid capsule: length mismatch");
1473
+ const payload = capsule.slice(15);
1474
+ const actualChecksum = calculateChecksum(payload);
1475
+ if (storedChecksum !== actualChecksum) {
1476
+ throw new Error("Integrity check failed: checksum mismatch");
1477
+ }
1478
+ let offset = 0;
1479
+ const dataLength = readUint32(payload, offset);
1480
+ offset += 4;
1481
+ if (offset + dataLength > payload.length) {
1482
+ throw new Error(`Data length ${dataLength} exceeds payload bounds at offset ${offset}`);
1483
+ }
1484
+ const [data] = decodeObject(payload.slice(offset, offset + dataLength));
1485
+ if (cb) cb(data);
1486
+ return {
1487
+ data,
1488
+ // Add 'data' key for generic usage
1489
+ meta: {
1490
+ version,
1491
+ flags,
1492
+ bytes: capsule.length,
1493
+ checksum: actualChecksum.toString(16)
1494
+ }
1495
+ };
1496
+ }
1497
+
1498
+ // ../../node_modules/@jucie.io/state/dist/lib/tree/traverse.js
1499
+ var traversalFunctions = [
1500
+ null,
1501
+ // index 0 (unused)
1502
+ null,
1503
+ // index 1 (single property access doesn't need optimization)
1504
+ (obj, path) => obj?.[path[0]]?.[path[1]],
1505
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]],
1506
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]]?.[path[3]],
1507
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]]?.[path[3]]?.[path[4]],
1508
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]]?.[path[3]]?.[path[4]]?.[path[5]],
1509
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]]?.[path[3]]?.[path[4]]?.[path[5]]?.[path[6]],
1510
+ (obj, path) => obj?.[path[0]]?.[path[1]]?.[path[2]]?.[path[3]]?.[path[4]]?.[path[5]]?.[path[6]]?.[path[7]]
1511
+ ];
1512
+ function createTraversalFunction(length) {
1513
+ const accessors = Array.from({ length }, (_, i2) => `?.[path[${i2}]]`);
1514
+ const expr = "obj" + accessors.join("");
1515
+ const fn = new Function("obj", "path", `return ${expr}`);
1516
+ traversalFunctions[length] = fn;
1517
+ return fn;
1518
+ }
1519
+ function traverse(state, path) {
1520
+ const len = path.length;
1521
+ if (len === 0) return state;
1522
+ if (len === 1) return state[path[0]];
1523
+ if (len < traversalFunctions.length && traversalFunctions[len]) {
1524
+ return traversalFunctions[len](state, path);
1525
+ }
1526
+ if (!traversalFunctions[len]) {
1527
+ return createTraversalFunction(len)(state, path);
1528
+ }
1529
+ return traversalFunctions[len](state, path);
1530
+ }
1531
+
1532
+ // ../../plugins/ledger/src/Ledger.js
1533
+ var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
1534
+ var isNode = typeof process !== "undefined" && process.versions?.node;
1535
+ var globalClock = 0;
1536
+ var _entries, _tombstones, _tombstoneIndex, _changeQueue, _isProcessing, _isImporting, _actorId, _sessionEpoch, _changeListeners, _hasChangeListeners, _Ledger_instances, createTombstone_fn, removeTombstone_fn, compareEntries_fn, isPathTombstoned_fn, removeEntriesUnderPath_fn, shouldApplyRemoteEntry_fn, rebuildTombstoneIndexes_fn, scheduleIdle_fn, scheduleNextTick_fn, scheduleRecord_fn, updateLedger_fn, continueGlobalClock_fn, checkTombstoneSize_fn, callChangeListeners_fn, cleanupTombstoneConflicts_fn;
1537
+ var _Ledger = class _Ledger extends Plugin {
1538
+ constructor() {
1539
+ super(...arguments);
1540
+ __privateAdd(this, _Ledger_instances);
1541
+ __privateAdd(this, _entries, /* @__PURE__ */ new Map());
1542
+ __privateAdd(this, _tombstones, /* @__PURE__ */ new Map());
1543
+ __privateAdd(this, _tombstoneIndex, /* @__PURE__ */ new Set());
1544
+ // Fast O(1) lookup for exact matches
1545
+ __privateAdd(this, _changeQueue, []);
1546
+ __privateAdd(this, _isProcessing, false);
1547
+ __privateAdd(this, _isImporting, false);
1548
+ // Flag to prevent change listener from creating entries during import
1549
+ __privateAdd(this, _actorId, null);
1550
+ __privateAdd(this, _sessionEpoch);
1551
+ __privateAdd(this, _changeListeners, /* @__PURE__ */ new Set());
1552
+ __privateAdd(this, _hasChangeListeners, false);
1553
+ __publicField(this, "onTombstoneConflict", null);
1554
+ }
1555
+ initialize(state, options) {
1556
+ __privateSet(this, _isProcessing, false);
1557
+ __privateSet(this, _actorId, options.actorId ?? null);
1558
+ __privateSet(this, _sessionEpoch, Date.now());
1559
+ }
1560
+ // Expose batch size for testing
1561
+ get batchSize() {
1562
+ return this.options.batchSize;
1563
+ }
1564
+ actions() {
1565
+ return {
1566
+ addChangeListener: (fn) => this.addChangeListener(fn),
1567
+ removeChangeListener: (fn) => this.removeChangeListener(fn),
1568
+ kill: (...args) => this.kill(args),
1569
+ resurrect: (...args) => this.resurrect(args),
1570
+ export: async () => await this.export(),
1571
+ import: async (data) => await this.import(data),
1572
+ snapshot: async () => await this.snapshot(),
1573
+ importSnapshot: async (snapshot) => await this.importSnapshot(snapshot),
1574
+ getStats: () => this.getStats()
1575
+ };
1576
+ }
1577
+ onStateChange(marker, change) {
1578
+ if (__privateGet(this, _isImporting)) return;
1579
+ dispatch(marker, {
1580
+ global: (marker2) => __privateGet(this, _changeQueue).push({ marker: marker2, change }),
1581
+ path: (marker2) => __privateGet(this, _changeQueue).push({ marker: marker2, change }),
1582
+ ephemeral: () => {
1583
+ }
1584
+ });
1585
+ __privateMethod(this, _Ledger_instances, scheduleRecord_fn).call(this);
1586
+ }
1587
+ addChangeListener(listener) {
1588
+ __privateGet(this, _changeListeners).add(listener);
1589
+ if (__privateGet(this, _changeListeners).size > 0) {
1590
+ __privateSet(this, _hasChangeListeners, true);
1591
+ }
1592
+ return () => this.removeChangeListener(listener);
1593
+ }
1594
+ removeChangeListener(listener) {
1595
+ __privateGet(this, _changeListeners).delete(listener);
1596
+ if (__privateGet(this, _changeListeners).size === 0) {
1597
+ __privateSet(this, _hasChangeListeners, false);
1598
+ }
1599
+ }
1600
+ getEntry(path) {
1601
+ return __privateGet(this, _entries).get(encodePath(path));
1602
+ }
1603
+ getTombstone(path) {
1604
+ return __privateGet(this, _tombstones).get(encodePath(path));
1605
+ }
1606
+ // Get all ledger entries
1607
+ async export() {
1608
+ return await pack({
1609
+ entries: Array.from(__privateGet(this, _entries).entries()),
1610
+ tombstones: Array.from(__privateGet(this, _tombstones).entries())
1611
+ });
1612
+ }
1613
+ // Set ledger from entries
1614
+ async import(data) {
1615
+ const { entries, tombstones } = await unpack(data);
1616
+ __privateSet(this, _entries, new Map(entries));
1617
+ __privateSet(this, _tombstones, new Map(tombstones));
1618
+ __privateMethod(this, _Ledger_instances, rebuildTombstoneIndexes_fn).call(this);
1619
+ __privateMethod(this, _Ledger_instances, continueGlobalClock_fn).call(this);
1620
+ return this;
1621
+ }
1622
+ // Create checkpoint with both state and ledger
1623
+ async snapshot() {
1624
+ return await pack({
1625
+ state: this.state.get(),
1626
+ ledger: {
1627
+ entries: Array.from(__privateGet(this, _entries).entries()),
1628
+ tombstones: Array.from(__privateGet(this, _tombstones).entries())
1629
+ },
1630
+ timestamp: Date.now()
1631
+ });
1632
+ }
1633
+ // Merge state and ledger from checkpoint (expects {state, ledger} format)
1634
+ async importSnapshot(snapshot) {
1635
+ const { data: snapshotData } = await unpack(snapshot);
1636
+ __privateSet(this, _isImporting, true);
1637
+ try {
1638
+ const entriesToApply = [];
1639
+ for (const [address, remoteEntry] of snapshotData?.ledger?.entries || []) {
1640
+ if (__privateMethod(this, _Ledger_instances, shouldApplyRemoteEntry_fn).call(this, address, remoteEntry)) {
1641
+ entriesToApply.push([address, remoteEntry]);
1642
+ }
1643
+ }
1644
+ for (const [address, remoteEntry] of entriesToApply) {
1645
+ __privateGet(this, _entries).set(address, remoteEntry);
1646
+ const path = decodeAddress(address);
1647
+ const value = path === GLOBAL_TAG ? snapshotData?.state : traverse(snapshotData?.state, path);
1648
+ this.state.set(path, value);
1649
+ }
1650
+ for (const [address, tombstone] of snapshotData?.ledger?.tombstones || []) {
1651
+ const localEntry = this.getEntry(address);
1652
+ const localTombstone = this.getTombstone(address);
1653
+ let shouldApplyTombstone = false;
1654
+ if (!localTombstone && !localEntry) {
1655
+ shouldApplyTombstone = true;
1656
+ } else if (localTombstone && tombstone.timestamp > localTombstone.timestamp) {
1657
+ shouldApplyTombstone = true;
1658
+ } else if (localEntry && !localTombstone) {
1659
+ shouldApplyTombstone = true;
1660
+ }
1661
+ if (shouldApplyTombstone) {
1662
+ const path = decodeAddress(address);
1663
+ this.state.remove(path);
1664
+ __privateGet(this, _tombstones).set(address, tombstone);
1665
+ __privateGet(this, _tombstoneIndex).add(address);
1666
+ }
1667
+ }
1668
+ } finally {
1669
+ __privateSet(this, _isImporting, false);
1670
+ }
1671
+ return this.state;
1672
+ }
1673
+ // Clear all entries
1674
+ reset() {
1675
+ __privateGet(this, _entries).clear();
1676
+ __privateGet(this, _tombstones).clear();
1677
+ __privateGet(this, _tombstoneIndex).clear();
1678
+ __privateSet(this, _changeQueue, []);
1679
+ __privateSet(this, _isProcessing, false);
1680
+ __privateSet(this, _actorId, null);
1681
+ __privateSet(this, _sessionEpoch, Date.now());
1682
+ __privateGet(this, _changeListeners).clear();
1683
+ __privateSet(this, _hasChangeListeners, false);
1684
+ }
1685
+ // Get memory stats
1686
+ getStats() {
1687
+ return {
1688
+ entriesCount: __privateGet(this, _entries).size,
1689
+ tombstonesCount: __privateGet(this, _tombstones).size,
1690
+ tombstoneIndexCount: __privateGet(this, _tombstoneIndex).size,
1691
+ changeQueueCount: __privateGet(this, _changeQueue).length,
1692
+ isProcessing: __privateGet(this, _isProcessing),
1693
+ actorId: __privateGet(this, _actorId),
1694
+ sessionEpoch: __privateGet(this, _sessionEpoch),
1695
+ globalClock
1696
+ };
1697
+ }
1698
+ // Kill a path and create a tombstone
1699
+ kill(args) {
1700
+ const marker = createMarker(args);
1701
+ return dispatch(marker, {
1702
+ global: () => {
1703
+ throw new Error("Cannot kill global state");
1704
+ },
1705
+ path: ({ path, address }) => {
1706
+ const removedValue = this.state.remove(path);
1707
+ __privateMethod(this, _Ledger_instances, createTombstone_fn).call(this, address, removedValue);
1708
+ return removedValue;
1709
+ },
1710
+ error: (error) => console.error(error)
1711
+ });
1712
+ }
1713
+ // Resurrect a tombstoned path
1714
+ resurrect(args) {
1715
+ try {
1716
+ const marker = createMarker(args);
1717
+ const tombstone = __privateMethod(this, _Ledger_instances, removeTombstone_fn).call(this, marker.address);
1718
+ if (!tombstone) {
1719
+ throw new Error(`No tombstone found for path: ${marker.path.join(".")}`);
1720
+ }
1721
+ const data = JSON.parse(tombstone.data);
1722
+ this.state.set(marker.path, data);
1723
+ return data;
1724
+ } catch (error) {
1725
+ console.error(error);
1726
+ return void 0;
1727
+ }
1728
+ }
1729
+ };
1730
+ _entries = new WeakMap();
1731
+ _tombstones = new WeakMap();
1732
+ _tombstoneIndex = new WeakMap();
1733
+ _changeQueue = new WeakMap();
1734
+ _isProcessing = new WeakMap();
1735
+ _isImporting = new WeakMap();
1736
+ _actorId = new WeakMap();
1737
+ _sessionEpoch = new WeakMap();
1738
+ _changeListeners = new WeakMap();
1739
+ _hasChangeListeners = new WeakMap();
1740
+ _Ledger_instances = new WeakSet();
1741
+ createTombstone_fn = function(address, data) {
1742
+ const tombstone = { data: JSON.stringify(data), timestamp: Date.now() };
1743
+ __privateGet(this, _tombstones).set(address, tombstone);
1744
+ __privateGet(this, _tombstoneIndex).add(address);
1745
+ __privateMethod(this, _Ledger_instances, removeEntriesUnderPath_fn).call(this, address);
1746
+ __privateMethod(this, _Ledger_instances, checkTombstoneSize_fn).call(this);
1747
+ };
1748
+ removeTombstone_fn = function(address) {
1749
+ const tombstone = __privateGet(this, _tombstones).get(address);
1750
+ if (!tombstone) return void 0;
1751
+ __privateGet(this, _tombstones).delete(address);
1752
+ __privateGet(this, _tombstoneIndex).delete(address);
1753
+ return tombstone;
1754
+ };
1755
+ compareEntries_fn = function(entry1, entry2) {
1756
+ if (!entry1) return -1;
1757
+ if (!entry2) return 1;
1758
+ const [clock1, globalclock1, sessionEpoch1, actorId1] = entry1;
1759
+ const [clock2, globalclock2, sessionEpoch2, actorId2] = entry2;
1760
+ if (clock1 !== clock2) return clock1 > clock2 ? 1 : -1;
1761
+ if (globalclock1 !== globalclock2) return globalclock1 > globalclock2 ? 1 : -1;
1762
+ if (sessionEpoch1 !== sessionEpoch2) return sessionEpoch1 > sessionEpoch2 ? 1 : -1;
1763
+ if (actorId1 !== actorId2) return actorId1.localeCompare(actorId2);
1764
+ return 0;
1765
+ };
1766
+ // tombstoneIndex: a Set of encoded addresses (strings)
1767
+ isPathTombstoned_fn = function(address) {
1768
+ if (__privateGet(this, _tombstoneIndex).has(address)) return true;
1769
+ let i2 = address.length;
1770
+ while (true) {
1771
+ i2 = address.lastIndexOf(".", i2 - 1);
1772
+ if (i2 === -1) break;
1773
+ if (__privateGet(this, _tombstoneIndex).has(address.slice(0, i2))) return true;
1774
+ }
1775
+ return false;
1776
+ };
1777
+ // Remove ledger entries that are under a tombstoned path
1778
+ removeEntriesUnderPath_fn = function(tombstoneAddress) {
1779
+ const entriesToRemove = [];
1780
+ for (const [address] of __privateGet(this, _entries)) {
1781
+ if (address === tombstoneAddress || address.startsWith(tombstoneAddress)) {
1782
+ entriesToRemove.push(address);
1783
+ }
1784
+ }
1785
+ for (const address of entriesToRemove) {
1786
+ __privateGet(this, _entries).delete(address);
1787
+ }
1788
+ };
1789
+ // Check if a change should be applied
1790
+ shouldApplyRemoteEntry_fn = function(address, remoteEntry) {
1791
+ if (__privateMethod(this, _Ledger_instances, isPathTombstoned_fn).call(this, address)) return false;
1792
+ const localEntry = __privateGet(this, _entries).get(address);
1793
+ return __privateMethod(this, _Ledger_instances, compareEntries_fn).call(this, remoteEntry, localEntry) > 0;
1794
+ };
1795
+ // Rebuild tombstone indexes for optimal performance
1796
+ rebuildTombstoneIndexes_fn = function() {
1797
+ __privateGet(this, _tombstoneIndex).clear();
1798
+ for (const [address] of __privateGet(this, _tombstones)) {
1799
+ __privateGet(this, _tombstoneIndex).add(address);
1800
+ }
1801
+ };
1802
+ scheduleIdle_fn = function(callback) {
1803
+ if (isBrowser && "requestIdleCallback" in window) {
1804
+ window.requestIdleCallback(callback, { timeout: 50 });
1805
+ } else if (isNode) {
1806
+ setImmediate(callback);
1807
+ } else {
1808
+ setTimeout(callback, 0);
1809
+ }
1810
+ };
1811
+ scheduleNextTick_fn = function(callback) {
1812
+ let called = false;
1813
+ Promise.resolve().then(() => {
1814
+ if (!called) {
1815
+ called = true;
1816
+ callback();
1817
+ }
1818
+ });
1819
+ setTimeout(() => {
1820
+ if (!called) {
1821
+ called = true;
1822
+ callback();
1823
+ }
1824
+ }, 0);
1825
+ };
1826
+ scheduleRecord_fn = function() {
1827
+ if (__privateGet(this, _isProcessing)) return;
1828
+ __privateSet(this, _isProcessing, true);
1829
+ __privateMethod(this, _Ledger_instances, scheduleNextTick_fn).call(this, () => {
1830
+ const changes = __privateGet(this, _changeQueue).splice(0, this.options.batchSize || _Ledger.options.batchSize);
1831
+ const changeEntries = [];
1832
+ const conflictedPaths = [];
1833
+ for (const { marker, change } of changes) {
1834
+ dispatch(marker, {
1835
+ global: () => {
1836
+ const ledgerEntry = __privateMethod(this, _Ledger_instances, updateLedger_fn).call(this, marker.address);
1837
+ changeEntries.push([GLOBAL_TAG, change, ledgerEntry]);
1838
+ },
1839
+ path: ({ path }) => {
1840
+ if (__privateMethod(this, _Ledger_instances, isPathTombstoned_fn).call(this, marker.address)) {
1841
+ conflictedPaths.push(path);
1842
+ return;
1843
+ }
1844
+ const ledgerEntry = __privateMethod(this, _Ledger_instances, updateLedger_fn).call(this, marker.address);
1845
+ changeEntries.push([marker.address, change, ledgerEntry]);
1846
+ }
1847
+ });
1848
+ }
1849
+ if (conflictedPaths.length > 0) {
1850
+ __privateMethod(this, _Ledger_instances, scheduleIdle_fn).call(this, () => __privateMethod(this, _Ledger_instances, cleanupTombstoneConflicts_fn).call(this, this.state, conflictedPaths));
1851
+ }
1852
+ __privateMethod(this, _Ledger_instances, callChangeListeners_fn).call(this, changeEntries);
1853
+ __privateSet(this, _isProcessing, false);
1854
+ if (__privateGet(this, _changeQueue).length > 0) {
1855
+ __privateMethod(this, _Ledger_instances, scheduleRecord_fn).call(this);
1856
+ }
1857
+ });
1858
+ };
1859
+ updateLedger_fn = function(address) {
1860
+ const existingEntry = __privateGet(this, _entries).get(address);
1861
+ __privateGet(this, _entries).delete(address);
1862
+ const existingClock = existingEntry ? existingEntry[0] : 0;
1863
+ const newClock = existingClock + 1;
1864
+ const entry = [
1865
+ newClock,
1866
+ globalClock++,
1867
+ __privateGet(this, _sessionEpoch),
1868
+ __privateGet(this, _actorId)
1869
+ ];
1870
+ __privateGet(this, _entries).set(address, entry);
1871
+ if (__privateGet(this, _entries).size > this.options.maxSize) {
1872
+ const entriesToRemove = __privateGet(this, _entries).size - this.options.maxSize;
1873
+ const sorted = Array.from(__privateGet(this, _entries).entries()).sort((a2, b) => __privateMethod(this, _Ledger_instances, compareEntries_fn).call(this, a2[1], b[1]));
1874
+ for (let i2 = 0; i2 < entriesToRemove; i2++) {
1875
+ __privateGet(this, _entries).delete(sorted[i2][0]);
1876
+ }
1877
+ }
1878
+ return entry;
1879
+ };
1880
+ continueGlobalClock_fn = function() {
1881
+ let maxGlobalClock = -1;
1882
+ for (const entry of __privateGet(this, _entries).values()) {
1883
+ if (entry && entry[1] > maxGlobalClock) {
1884
+ maxGlobalClock = entry[1];
1885
+ }
1886
+ }
1887
+ globalClock = globalClock > maxGlobalClock ? globalClock + 1 : maxGlobalClock + 1;
1888
+ };
1889
+ checkTombstoneSize_fn = function() {
1890
+ const maxTombstoneSize = 1e3;
1891
+ const maxTombstoneAge = 30 * 24 * 60 * 60 * 1e3;
1892
+ const now = Date.now();
1893
+ for (const [id, { timestamp }] of __privateGet(this, _tombstones)) {
1894
+ if (__privateGet(this, _tombstones).size > maxTombstoneSize || now - timestamp > maxTombstoneAge) {
1895
+ __privateGet(this, _tombstones).delete(id);
1896
+ }
1897
+ }
1898
+ };
1899
+ callChangeListeners_fn = function(changeEntries) {
1900
+ if (__privateGet(this, _hasChangeListeners)) {
1901
+ __privateGet(this, _changeListeners).forEach((listener) => listener(changeEntries));
1902
+ }
1903
+ };
1904
+ // Async cleanup of tombstone conflicts detected during ledger processing
1905
+ cleanupTombstoneConflicts_fn = function(state, conflictedPaths) {
1906
+ for (const path of conflictedPaths) {
1907
+ try {
1908
+ state.remove(path);
1909
+ } catch (error) {
1910
+ console.warn(`Tombstone cleanup failed for path ${path.join(".")}:`, error.message);
1911
+ }
1912
+ }
1913
+ };
1914
+ __publicField(_Ledger, "name", "ledger");
1915
+ __publicField(_Ledger, "options", {
1916
+ userId: null,
1917
+ maxSize: 1e4,
1918
+ batchSize: 100
1919
+ });
1920
+ // Callback to clean up state data
1921
+ __publicField(_Ledger, "empty", {
1922
+ entries: [],
1923
+ tombstones: []
1924
+ });
1925
+ var Ledger = _Ledger;
1926
+
1927
+ // src/lib/utils/getViewport.js
1928
+ function getViewport() {
1929
+ const width = window.innerWidth;
1930
+ const height = window.innerHeight;
1931
+ const body = document.body;
1932
+ const transform = body.style.transform || "";
1933
+ let scroll = { x: 0, y: 0 };
1934
+ let scale = 1;
1935
+ if (transform) {
1936
+ const translateMatch = transform.match(/translate\(([^,]+),\s*([^)]+)\)/);
1937
+ if (translateMatch) {
1938
+ scroll.x = parseFloat(translateMatch[1].replace("px", "")) || 0;
1939
+ scroll.y = parseFloat(translateMatch[2].replace("px", "")) || 0;
1940
+ }
1941
+ const scaleMatch = transform.match(/scale\(([^)]+)\)/);
1942
+ if (scaleMatch) {
1943
+ scale = parseFloat(scaleMatch[1]);
1944
+ }
1945
+ }
1946
+ return {
1947
+ scroll,
1948
+ scale,
1949
+ width,
1950
+ height
1951
+ };
1952
+ }
1953
+
1954
+ // ../ai-tools/operations/nodeOperations.js
1955
+ var nodeOperations = defineAiOperations("node", (useContext) => ({
1956
+ create: {
1957
+ description: 'Create a new node in the scene graph. type is a prototype name (e.g. div, header, p, button, frame). Optional props (e.g. name, frame) and parent (defaults to "app").',
1958
+ alias: "create",
1959
+ mcpName: "create_node",
1960
+ schema: [{
1961
+ type: "String",
1962
+ props: "Object?",
1963
+ parent: "String?"
1964
+ }],
1965
+ examples: [
1966
+ {
1967
+ args: {
1968
+ type: "button",
1969
+ parent: "app"
1970
+ },
1971
+ description: "Create a button element"
1972
+ },
1973
+ {
1974
+ args: {
1975
+ type: "nav",
1976
+ parent: "app"
1977
+ },
1978
+ description: "Create a nav element"
1979
+ },
1980
+ {
1981
+ args: {
1982
+ type: "frame",
1983
+ props: { frame: "iPhone SE", name: "Home" }
1984
+ },
1985
+ description: "Create an iPhone SE frame named Home"
1986
+ }
1987
+ ],
1988
+ returns: "{ id: String, type: String }",
1989
+ handler: async (args) => {
1990
+ const state = useContext("state");
1991
+ const { addNode } = await import("./addNode-TX462HCE.js");
1992
+ const nodes = state.ref(["nodes"]);
1993
+ const { type, props, parent = "app" } = args;
1994
+ const id = addNode(nodes, type, props, parent);
1995
+ if (id instanceof Error) {
1996
+ throw id;
1997
+ }
1998
+ if (type === "frame") {
1999
+ const appChildren = nodes.get(["app", "children"]) ?? [];
2000
+ const siblings = appChildren.filter((cid) => cid !== id);
2001
+ if (siblings.length > 0) {
2002
+ let maxRight = 0;
2003
+ for (const sid of siblings) {
2004
+ const b = nodes.get([sid, "bounds"]);
2005
+ if (b) maxRight = Math.max(maxRight, (b.x ?? 0) + (b.width ?? 0));
2006
+ }
2007
+ const { updateBounds } = await import("./updateBounds-WKOI6XJ3.js");
2008
+ updateBounds(nodes, id, { x: maxRight + 100, y: 0 });
2009
+ }
2010
+ }
2011
+ return { id, type };
2012
+ }
2013
+ },
2014
+ updateStyle: {
2015
+ description: 'Update styles for a node. Optional breakpoint targets a variant: "@720" (responsive), ":hover" (pseudo-state), "&.is-active" (custom state).',
2016
+ mcpName: "update_style",
2017
+ schema: [{
2018
+ nodeId: "String",
2019
+ styles: "Object",
2020
+ breakpoint: "String?"
2021
+ }],
2022
+ examples: [
2023
+ {
2024
+ args: {
2025
+ nodeId: "nd_123",
2026
+ styles: {
2027
+ "background-color": "#2563eb",
2028
+ padding: "16px",
2029
+ "border-radius": "8px"
2030
+ }
2031
+ },
2032
+ description: "Set background, padding, and border radius"
2033
+ },
2034
+ {
2035
+ args: {
2036
+ nodeId: "nd_123",
2037
+ styles: { "background-color": "#1d4ed8" },
2038
+ breakpoint: ":hover"
2039
+ },
2040
+ description: "Set hover background"
2041
+ }
2042
+ ],
2043
+ returns: "{ id: String, styles: Object }",
2044
+ handler: async (args) => {
2045
+ const state = useContext("state");
2046
+ const { updateStyle } = await import("./updateStyle-FN7CGZTJ.js");
2047
+ const nodes = state.ref(["nodes"]);
2048
+ const { nodeId, styles, breakpoint } = args;
2049
+ const layoutManaged = ["display", "position"].filter((p) => p in styles);
2050
+ const options = {};
2051
+ if (breakpoint) {
2052
+ if (breakpoint.startsWith(":") || breakpoint.startsWith("&")) {
2053
+ options.interactionState = [breakpoint];
2054
+ } else {
2055
+ options.breakpoint = breakpoint;
2056
+ }
2057
+ }
2058
+ const updatedStyles = updateStyle(nodes, nodeId, { ...styles }, options);
2059
+ const result = { id: nodeId, styles: updatedStyles };
2060
+ if (layoutManaged.length) {
2061
+ result.warning = `Ignored ${layoutManaged.join(", ")} \u2014 use node:setAutoLayout to change layout mode.`;
2062
+ }
2063
+ return result;
2064
+ }
2065
+ },
2066
+ updateText: {
2067
+ description: "Set text content for a node. Use {{expression}} syntax for dynamic values.",
2068
+ mcpName: "update_text",
2069
+ schema: [{
2070
+ nodeId: "String",
2071
+ value: "String"
2072
+ // Use {{expression}} syntax for dynamic content
2073
+ }],
2074
+ examples: [
2075
+ {
2076
+ args: {
2077
+ nodeId: "nd_heading",
2078
+ value: "Welcome"
2079
+ },
2080
+ description: 'Set static text to "Welcome"'
2081
+ },
2082
+ {
2083
+ args: {
2084
+ nodeId: "nd_label",
2085
+ value: "{{user.name}}"
2086
+ },
2087
+ description: "Set dynamic text with expression"
2088
+ }
2089
+ ],
2090
+ returns: "{ id: String, textContent: Object }",
2091
+ handler: async (args) => {
2092
+ const state = useContext("state");
2093
+ const { createTextContent } = await import("./createTextContent-R5YRKNJL.js");
2094
+ const nodes = state.ref(["nodes"]);
2095
+ const { nodeId, value } = args;
2096
+ const textContent = createTextContent({ value });
2097
+ nodes.set([nodeId, "textContent"], textContent);
2098
+ return { id: nodeId, textContent };
2099
+ }
2100
+ },
2101
+ move: {
2102
+ description: "Move a node to be the last child of another node",
2103
+ mcpName: "move_node",
2104
+ schema: [{
2105
+ nodeId: "String",
2106
+ parentId: "String"
2107
+ }],
2108
+ examples: [
2109
+ {
2110
+ args: {
2111
+ nodeId: "nd_link",
2112
+ parentId: "nd_nav"
2113
+ },
2114
+ description: "Move link into nav"
2115
+ }
2116
+ ],
2117
+ returns: "{ id: String, movedTo: String, success: Boolean }",
2118
+ handler: async (args) => {
2119
+ const state = useContext("state");
2120
+ const { disconnectNode } = await import("./disconnectNode-J6YACRLT.js");
2121
+ const { moveNodeToLastChildOf } = await import("./moveNodeToLastChildOf-IUKGA7IO.js");
2122
+ const nodes = state.ref(["nodes"]);
2123
+ const { nodeId, parentId } = args;
2124
+ disconnectNode(nodes, nodeId);
2125
+ const success = moveNodeToLastChildOf(nodes, nodeId, parentId);
2126
+ return { id: nodeId, movedTo: parentId, success };
2127
+ }
2128
+ },
2129
+ remove: {
2130
+ description: "Remove a node and all its descendants from the scene graph",
2131
+ alias: "removeNode",
2132
+ mcpName: "remove_node",
2133
+ schema: [{
2134
+ nodeId: "String"
2135
+ }],
2136
+ examples: [
2137
+ {
2138
+ args: {
2139
+ nodeId: "nd_old_element"
2140
+ },
2141
+ description: "Remove an element"
2142
+ }
2143
+ ],
2144
+ returns: "{ id: String, removed: Boolean, removedNodes: Object }",
2145
+ handler: async (args) => {
2146
+ const state = useContext("state");
2147
+ const { removeNode } = await import("./removeNode-DY2ULYNK.js");
2148
+ const nodes = state.ref(["nodes"]);
2149
+ const { nodeId } = args;
2150
+ const [id, removedNodes] = removeNode(nodes, nodeId);
2151
+ return { id, removed: true, removedNodes };
2152
+ }
2153
+ },
2154
+ setAutoLayout: {
2155
+ description: 'Set the layout mode of a container node ("none" | "block" | "flex" | "grid"). Sets layout on the parent and the corresponding display style, and normalizes all direct children so they flow correctly. Always use this instead of setting display via updateStyle.',
2156
+ alias: "setLayout",
2157
+ mcpName: "set_layout",
2158
+ schema: [{
2159
+ nodeId: "String",
2160
+ layout: "String"
2161
+ }],
2162
+ examples: [
2163
+ {
2164
+ args: {
2165
+ nodeId: "nd_container",
2166
+ layout: "flex"
2167
+ },
2168
+ description: "Enable flex auto-layout on a container"
2169
+ },
2170
+ {
2171
+ args: {
2172
+ nodeId: "nd_container",
2173
+ layout: "none"
2174
+ },
2175
+ description: "Disable auto-layout, reverting children to absolute positioning"
2176
+ }
2177
+ ],
2178
+ returns: "{ id: String, layout: String, childrenUpdated: Number }",
2179
+ handler: async (args) => {
2180
+ const state = useContext("state");
2181
+ const { setNodeLayout } = await import("./setNodeLayout-K2VNUD2H.js");
2182
+ const nodes = state.ref(["nodes"]);
2183
+ const { nodeId, layout } = args;
2184
+ return setNodeLayout(nodes, nodeId, layout);
2185
+ }
2186
+ },
2187
+ setName: {
2188
+ description: "Set a display name on a node. Names appear in get_scene output and make the tree readable. Pass an empty string to clear back to the default (tag name).",
2189
+ mcpName: "set_name",
2190
+ schema: [{
2191
+ nodeId: "String",
2192
+ name: "String"
2193
+ }],
2194
+ examples: [
2195
+ { args: { nodeId: "nd_123", name: "Hero Section" }, description: "Name a section" }
2196
+ ],
2197
+ returns: "{ id: String, name: String }",
2198
+ handler: async (args) => {
2199
+ const state = useContext("state");
2200
+ const nodes = state.ref(["nodes"]);
2201
+ const { nodeId, name } = args;
2202
+ if (name === "") {
2203
+ const { clearName } = await import("./clearName-AAUKJ3OX.js");
2204
+ clearName(nodes, nodeId);
2205
+ return { id: nodeId, name: "" };
2206
+ }
2207
+ const { setName } = await import("./setName-W4MXGWGB.js");
2208
+ setName(nodes, nodeId, name);
2209
+ return { id: nodeId, name };
2210
+ }
2211
+ },
2212
+ clearName: {
2213
+ description: "Clear the display name from a node, reverting to its tag name.",
2214
+ schema: [{
2215
+ nodeId: "String"
2216
+ }],
2217
+ examples: [
2218
+ { args: { nodeId: "nd_123" }, description: "Clear name back to default" }
2219
+ ],
2220
+ returns: "{ id: String }",
2221
+ handler: async (args) => {
2222
+ const state = useContext("state");
2223
+ const { clearName } = await import("./clearName-AAUKJ3OX.js");
2224
+ const nodes = state.ref(["nodes"]);
2225
+ const { nodeId } = args;
2226
+ clearName(nodes, nodeId);
2227
+ return { id: nodeId };
2228
+ }
2229
+ },
2230
+ addComponent: {
2231
+ description: "Convert an existing node into a reusable local component. The node is replaced in-place by an instance; the original tree becomes the component definition. Returns instanceId and componentId.",
2232
+ mcpName: "add_component",
2233
+ schema: [{
2234
+ nodeId: "String",
2235
+ name: "String?"
2236
+ }],
2237
+ examples: [
2238
+ { args: { nodeId: "nd_card", name: "Card" }, description: "Convert a card node into a reusable component" }
2239
+ ],
2240
+ returns: "{ instanceId: String, componentId: String, name: String }",
2241
+ handler: async (args) => {
2242
+ const state = useContext("state");
2243
+ const { addComponent } = await import("./addComponent-GUOHFGDG.js");
2244
+ const nodes = state.ref(["nodes"]);
2245
+ const { nodeId, name = "" } = args;
2246
+ const instanceId = addComponent(nodes, nodeId, name);
2247
+ const componentId = nodes.get([instanceId, "component"]);
2248
+ return { instanceId, componentId, name };
2249
+ }
2250
+ }
2251
+ }));
2252
+
2253
+ // ../ai-tools/operations/treeOperations.js
2254
+ var treeOperations = defineAiOperations("tree", (useContext) => ({
2255
+ create: {
2256
+ description: 'Create a nested tree of nodes recursively (use for complex structures like mobile pages). For frames, parent MUST be "app".',
2257
+ alias: "createTree",
2258
+ schema: [{
2259
+ tree: "Object",
2260
+ parent: "String?"
2261
+ }],
2262
+ examples: [{
2263
+ args: {
2264
+ tree: {
2265
+ type: "frame",
2266
+ name: "Home",
2267
+ frame: "iPhone SE",
2268
+ bounds: {
2269
+ x: 0,
2270
+ y: 400
2271
+ },
2272
+ styles: { display: "flex", "flex-direction": "column", overflow: "hidden" },
2273
+ children: [
2274
+ {
2275
+ type: "header",
2276
+ styles: { padding: "16px" },
2277
+ children: [
2278
+ {
2279
+ type: "h1",
2280
+ text: "App Name"
2281
+ }
2282
+ ]
2283
+ },
2284
+ {
2285
+ type: "main",
2286
+ styles: { flex: "1" }
2287
+ },
2288
+ {
2289
+ type: "footer",
2290
+ styles: { padding: "16px" },
2291
+ text: "Footer"
2292
+ }
2293
+ ]
2294
+ },
2295
+ parent: "app"
2296
+ },
2297
+ description: "Create mobile page with header, main, footer \u2014 frame is the flex container"
2298
+ }],
2299
+ returns: "{ rootId: String, createdIds: Array, treeMap: Object }",
2300
+ handler: async (args) => {
2301
+ const state = useContext("state");
2302
+ const log = useContext("log");
2303
+ const { addNode } = await import("./addNode-TX462HCE.js");
2304
+ const { updateStyle } = await import("./updateStyle-FN7CGZTJ.js");
2305
+ const { setNodeLayout } = await import("./setNodeLayout-K2VNUD2H.js");
2306
+ const { normalizeLayoutContext } = await import("./normalizeLayoutContext-TO4WKUWF.js");
2307
+ const { createTextContent } = await import("./createTextContent-R5YRKNJL.js");
2308
+ const nodes = state.ref(["nodes"]);
2309
+ const { tree, parent = "app" } = args;
2310
+ const createdIds = [];
2311
+ const treeMap = {};
2312
+ const createRecursive = (nodeSpec, parentId) => {
2313
+ const { type, children, styles, style, text, ref, bounds: boundsSpec, ...overrides } = nodeSpec;
2314
+ const id = addNode(nodes, type, overrides, parentId);
2315
+ createdIds.push(id);
2316
+ if (ref) {
2317
+ treeMap[ref] = id;
2318
+ }
2319
+ if (type === "frame" && boundsSpec) {
2320
+ const { x, y } = boundsSpec;
2321
+ const current = nodes.get([id, "bounds"]) ?? {};
2322
+ nodes.set([id, "bounds"], {
2323
+ ...current,
2324
+ ...x != null ? { x } : {},
2325
+ ...y != null ? { y } : {}
2326
+ });
2327
+ }
2328
+ const nodeName = overrides.name;
2329
+ if (nodeName) {
2330
+ nodes.set([id, "name"], nodeName);
2331
+ }
2332
+ const resolvedStyles = styles || style;
2333
+ if (resolvedStyles && Object.keys(resolvedStyles).length > 0) {
2334
+ updateStyle(nodes, id, { ...resolvedStyles });
2335
+ }
2336
+ const resolvedDisplay = resolvedStyles?.display ?? nodes.get([id, "style", "default", "display"]);
2337
+ const isFlowParent = resolvedDisplay === "flex" || resolvedDisplay === "grid";
2338
+ if (isFlowParent) {
2339
+ try {
2340
+ setNodeLayout(nodes, id, resolvedDisplay);
2341
+ } catch (e) {
2342
+ log.warn("setNodeLayout failed for parent", { id, error: e.message });
2343
+ }
2344
+ }
2345
+ if (text && !(children?.length > 0)) {
2346
+ const textContent = createTextContent({ value: text });
2347
+ nodes.set([id, "textContent"], textContent);
2348
+ }
2349
+ if (children && children.length > 0) {
2350
+ children.forEach((child) => {
2351
+ if (isFlowParent) {
2352
+ const childStyles = child.styles || child.style || {};
2353
+ if (childStyles.position !== "absolute") {
2354
+ child = {
2355
+ ...child,
2356
+ styles: {
2357
+ width: "auto",
2358
+ height: "auto",
2359
+ top: "auto",
2360
+ left: "auto",
2361
+ ...childStyles
2362
+ }
2363
+ };
2364
+ }
2365
+ }
2366
+ const childId = createRecursive(child, id);
2367
+ if (isFlowParent) {
2368
+ normalizeLayoutContext(nodes, childId, id);
2369
+ }
2370
+ });
2371
+ }
2372
+ return id;
2373
+ };
2374
+ const rootId = createRecursive(tree, parent);
2375
+ return { id: rootId, rootId, createdIds, treeMap, type: "tree" };
2376
+ }
2377
+ }
2378
+ }));
2379
+
2380
+ // ../ai-tools/operations/behaviorOperations.js
2381
+ var behaviorOperations = defineAiOperations("behavior", (useContext) => ({
2382
+ // ── Events ──────────────────────────────────────────────────────────────────
2383
+ addEvent: {
2384
+ description: 'Add or replace an event handler on a node (replaces any existing handler with the same name). Event names use React-style onX format (onClick, onSubmit, onInput, onChange, onMouseEnter, etc.); lowercase names like "click" or "submit" are auto-normalized. Use binding for zero-arg store actions (e.g. "$store.myStore.doSomething"); use code when you need arguments or complex logic \u2014 code MUST be a complete function expression: function (ctx, event) { ... }. Access stores inside the handler via ctx.$store.<storeName>.',
2385
+ mcpName: "add_event",
2386
+ schema: [{
2387
+ nodeId: "String",
2388
+ name: "String",
2389
+ binding: "String?",
2390
+ code: "String?",
2391
+ mode: "String?"
2392
+ }],
2393
+ examples: [
2394
+ { args: { nodeId: "nd_btn", name: "onClick", binding: "$store.default.increment" }, description: "Call store action on click" },
2395
+ { args: { nodeId: "nd_btn", name: "onClick", code: 'function (ctx, event) {\n ctx.$store.todo.items.push({ text: ctx.$store.todo.newTodo, done: false })\n ctx.$store.todo.newTodo = ""\n}' }, description: "Add click handler with code" },
2396
+ { args: { nodeId: "nd_form", name: "onSubmit", code: "function (ctx, event) {\n event.preventDefault()\n}" }, description: "Prevent default on form submit" }
2397
+ ],
2398
+ returns: "{ id: String, name: String }",
2399
+ handler: async (args) => {
2400
+ const state = useContext("state");
2401
+ const { addEvent } = await import("./addEvent-GQCCRSGP.js");
2402
+ const { updateEvent } = await import("./updateEvent-4PDSQ3Q4.js");
2403
+ const { normalizeEventName } = await import("./normalizeEventName-EWVVRI6K.js");
2404
+ const nodes = state.ref(["nodes"]);
2405
+ const { nodeId, name, binding, code, mode } = args;
2406
+ const normalized = normalizeEventName(name);
2407
+ const events = nodes.get([nodeId, "events"]) ?? [];
2408
+ const existing = events.find((e) => e.name === normalized);
2409
+ if (!existing) {
2410
+ addEvent(nodes, nodeId, normalized);
2411
+ }
2412
+ if (binding !== void 0) {
2413
+ const current = (nodes.get([nodeId, "events"]) ?? []).find((e) => e.name === normalized) ?? { name: normalized };
2414
+ updateEvent(nodes, nodeId, normalized, { ...current, mode: "binding", binding: binding.split("."), code: null });
2415
+ } else if (code !== void 0) {
2416
+ const current = (nodes.get([nodeId, "events"]) ?? []).find((e) => e.name === normalized) ?? { name: normalized };
2417
+ updateEvent(nodes, nodeId, normalized, { ...current, mode: mode ?? "code", code, binding: null });
2418
+ }
2419
+ return { id: nodeId, name: normalized };
2420
+ }
2421
+ },
2422
+ updateEvent: {
2423
+ description: "Update an existing event handler by name",
2424
+ schema: [{
2425
+ nodeId: "String",
2426
+ name: "String",
2427
+ event: "Object"
2428
+ }],
2429
+ examples: [
2430
+ { args: { nodeId: "nd_btn", name: "onClick", event: { mode: "code", code: 'alert("hi")' } }, description: "Update onClick handler" }
2431
+ ],
2432
+ returns: "{ id: String, name: String }",
2433
+ handler: async (args) => {
2434
+ const state = useContext("state");
2435
+ const { updateEvent } = await import("./updateEvent-4PDSQ3Q4.js");
2436
+ const { normalizeEventName } = await import("./normalizeEventName-EWVVRI6K.js");
2437
+ const nodes = state.ref(["nodes"]);
2438
+ const { nodeId, name, event } = args;
2439
+ const lookupName = normalizeEventName(name);
2440
+ const normalized = event?.name !== void 0 ? { ...event, name: normalizeEventName(event.name) } : { ...event, name: lookupName };
2441
+ updateEvent(nodes, nodeId, lookupName, normalized);
2442
+ return { id: nodeId, name: lookupName };
2443
+ }
2444
+ },
2445
+ removeEvent: {
2446
+ description: "Remove an event handler by name",
2447
+ schema: [{
2448
+ nodeId: "String",
2449
+ name: "String"
2450
+ }],
2451
+ examples: [
2452
+ { args: { nodeId: "nd_btn", name: "onClick" }, description: "Remove onClick handler" }
2453
+ ],
2454
+ returns: "{ id: String, name: String }",
2455
+ handler: async (args) => {
2456
+ const state = useContext("state");
2457
+ const { removeEvent } = await import("./removeEvent-7ODGVHMT.js");
2458
+ const { normalizeEventName } = await import("./normalizeEventName-EWVVRI6K.js");
2459
+ const nodes = state.ref(["nodes"]);
2460
+ const { nodeId, name } = args;
2461
+ const normalized = normalizeEventName(name);
2462
+ removeEvent(nodes, nodeId, normalized);
2463
+ return { id: nodeId, name: normalized };
2464
+ }
2465
+ },
2466
+ // ── Routing ─────────────────────────────────────────────────────────────────
2467
+ updateRoute: {
2468
+ description: "Set the route path on a frame node for multi-page navigation",
2469
+ schema: [{
2470
+ nodeId: "String",
2471
+ route: "Any"
2472
+ }],
2473
+ examples: [
2474
+ { args: { nodeId: "nd_frame", route: "/about" }, description: "Set route path" },
2475
+ { args: { nodeId: "nd_frame", route: { path: "/users/:id" } }, description: "Set route with params" }
2476
+ ],
2477
+ returns: "{ id: String, route: Object }",
2478
+ handler: async (args) => {
2479
+ const state = useContext("state");
2480
+ const { updateRoute } = await import("./updateRoute-P5OTKOOG.js");
2481
+ const nodes = state.ref(["nodes"]);
2482
+ const { nodeId, route } = args;
2483
+ const normalized = typeof route === "string" ? { path: route } : route;
2484
+ updateRoute(nodes, nodeId, normalized);
2485
+ return { id: nodeId, route: normalized };
2486
+ }
2487
+ },
2488
+ setHomePage: {
2489
+ description: "Mark a frame as the home page (root route)",
2490
+ schema: [{
2491
+ nodeId: "String",
2492
+ isHomePage: "Any"
2493
+ }],
2494
+ examples: [
2495
+ { args: { nodeId: "nd_frame", isHomePage: true }, description: "Set as home page" }
2496
+ ],
2497
+ returns: "{ id: String, isHomePage: Any }",
2498
+ handler: async (args) => {
2499
+ const state = useContext("state");
2500
+ const { setHomePage } = await import("./setHomePage-4U4Z3RU7.js");
2501
+ const nodes = state.ref(["nodes"]);
2502
+ const { nodeId, isHomePage } = args;
2503
+ setHomePage(nodes, nodeId, isHomePage);
2504
+ return { id: nodeId, isHomePage };
2505
+ }
2506
+ },
2507
+ setDestination: {
2508
+ description: "Set a navigation destination on a link or button node",
2509
+ schema: [{
2510
+ nodeId: "String",
2511
+ destination: "Any"
2512
+ }],
2513
+ examples: [
2514
+ { args: { nodeId: "nd_link", destination: "/about" }, description: "Navigate to /about on click" }
2515
+ ],
2516
+ returns: "{ id: String, destination: Object }",
2517
+ handler: async (args) => {
2518
+ const state = useContext("state");
2519
+ const { setDestination } = await import("./setDestination-M6MQACBQ.js");
2520
+ const nodes = state.ref(["nodes"]);
2521
+ const { nodeId, destination } = args;
2522
+ const normalized = typeof destination === "string" ? { path: destination } : destination;
2523
+ setDestination(nodes, nodeId, normalized);
2524
+ return { id: nodeId, destination: normalized };
2525
+ }
2526
+ },
2527
+ clearDestination: {
2528
+ description: "Remove the navigation destination from a node",
2529
+ schema: [{
2530
+ nodeId: "String"
2531
+ }],
2532
+ examples: [
2533
+ { args: { nodeId: "nd_link" }, description: "Clear navigation destination" }
2534
+ ],
2535
+ returns: "{ id: String }",
2536
+ handler: async (args) => {
2537
+ const state = useContext("state");
2538
+ const { clearDestination } = await import("./clearDestination-KO6YHLX2.js");
2539
+ const nodes = state.ref(["nodes"]);
2540
+ const { nodeId } = args;
2541
+ clearDestination(nodes, nodeId);
2542
+ return { id: nodeId };
2543
+ }
2544
+ },
2545
+ // ── Dynamic behavior ────────────────────────────────────────────────────────
2546
+ setRepeat: {
2547
+ description: 'Repeat a node for each item in a data binding (loop). binding is a dot-path on ctx (e.g. "$store.todo.items").',
2548
+ schema: [{
2549
+ nodeId: "String",
2550
+ binding: "String",
2551
+ as: "String?",
2552
+ index: "String?",
2553
+ key: "Any?",
2554
+ keyOn: "Any?"
2555
+ }],
2556
+ examples: [
2557
+ { args: { nodeId: "nd_card", binding: "$store.todo.items", as: "$item" }, description: "Repeat card for each item in the todo store" }
2558
+ ],
2559
+ returns: "{ id: String, binding: String }",
2560
+ handler: async (args) => {
2561
+ const state = useContext("state");
2562
+ const { setRepeat } = await import("./setRepeat-X5GZ4F2P.js");
2563
+ const nodes = state.ref(["nodes"]);
2564
+ const { nodeId, binding, as: asAlias, index: indexAlias, key, keyOn } = args;
2565
+ const bindingPath = binding.split(".");
2566
+ setRepeat(nodes, nodeId, { descriptor: { mode: "binding", binding: bindingPath }, as: asAlias, index: indexAlias, key, keyOn });
2567
+ return { id: nodeId, binding };
2568
+ }
2569
+ },
2570
+ clearRepeat: {
2571
+ description: "Remove repeat binding from a node",
2572
+ schema: [{
2573
+ nodeId: "String"
2574
+ }],
2575
+ examples: [
2576
+ { args: { nodeId: "nd_card" }, description: "Stop repeating" }
2577
+ ],
2578
+ returns: "{ id: String }",
2579
+ handler: async (args) => {
2580
+ const state = useContext("state");
2581
+ const { clearRepeat } = await import("./clearRepeat-AZLSTBXI.js");
2582
+ const nodes = state.ref(["nodes"]);
2583
+ const { nodeId } = args;
2584
+ clearRepeat(nodes, nodeId);
2585
+ return { id: nodeId };
2586
+ }
2587
+ },
2588
+ setRender: {
2589
+ description: 'Conditionally show/hide a node based on an expression. Pass an expression that uses ctx (e.g. "ctx.$store.user.isAdmin"); it is wrapped as a computed function automatically. Stores are at ctx.$store.<name>; loop vars at ctx.$item / ctx.$index.',
2590
+ schema: [{
2591
+ nodeId: "String",
2592
+ value: "String"
2593
+ }],
2594
+ examples: [
2595
+ { args: { nodeId: "nd_admin", value: "ctx.$store.user.isAdmin" }, description: "Show only for admins" }
2596
+ ],
2597
+ returns: "{ id: String, value: String }",
2598
+ handler: async (args) => {
2599
+ const state = useContext("state");
2600
+ const { setRender } = await import("./setRender-UJAXCTRA.js");
2601
+ const nodes = state.ref(["nodes"]);
2602
+ const { nodeId, value } = args;
2603
+ const computed = `function (ctx) {
2604
+ return ${value}
2605
+ }`;
2606
+ setRender(nodes, nodeId, { mode: "computed", computed });
2607
+ return { id: nodeId, value };
2608
+ }
2609
+ },
2610
+ clearRender: {
2611
+ description: "Remove conditional rendering from a node (always show)",
2612
+ schema: [{
2613
+ nodeId: "String"
2614
+ }],
2615
+ examples: [
2616
+ { args: { nodeId: "nd_admin" }, description: "Always render" }
2617
+ ],
2618
+ returns: "{ id: String }",
2619
+ handler: async (args) => {
2620
+ const state = useContext("state");
2621
+ const { clearRender } = await import("./clearRender-TTNIVIPG.js");
2622
+ const nodes = state.ref(["nodes"]);
2623
+ const { nodeId } = args;
2624
+ clearRender(nodes, nodeId);
2625
+ return { id: nodeId };
2626
+ }
2627
+ },
2628
+ // ── States ──────────────────────────────────────────────────────────────────
2629
+ addState: {
2630
+ description: 'Register a custom state class on a node (e.g. "is-active"). Style it with updateStyle breakpoint "&.is-active".',
2631
+ schema: [{
2632
+ nodeId: "String",
2633
+ stateName: "String"
2634
+ }],
2635
+ examples: [
2636
+ { args: { nodeId: "nd_tab", stateName: "is-active" }, description: "Add active state" }
2637
+ ],
2638
+ returns: "{ id: String, stateName: String }",
2639
+ handler: async (args) => {
2640
+ const state = useContext("state");
2641
+ const { addState } = await import("./addState-IKDWEJIW.js");
2642
+ const nodes = state.ref(["nodes"]);
2643
+ const { nodeId, stateName } = args;
2644
+ addState(nodes, nodeId, stateName);
2645
+ return { id: nodeId, stateName };
2646
+ }
2647
+ },
2648
+ updateState: {
2649
+ description: "Set the expression that controls when a state is active",
2650
+ schema: [{
2651
+ nodeId: "String",
2652
+ stateName: "String",
2653
+ expression: "String"
2654
+ }],
2655
+ examples: [
2656
+ { args: { nodeId: "nd_tab", stateName: "is-active", expression: '$router.currentRoute?.path === "/"' }, description: "Activate on home route" }
2657
+ ],
2658
+ returns: "{ id: String, stateName: String }",
2659
+ handler: async (args) => {
2660
+ const state = useContext("state");
2661
+ const { updateState } = await import("./updateState-B2RIQRWF.js");
2662
+ const nodes = state.ref(["nodes"]);
2663
+ const { nodeId, stateName, expression } = args;
2664
+ updateState(nodes, nodeId, stateName, { name: stateName, mode: "computed", computed: expression ?? null });
2665
+ return { id: nodeId, stateName };
2666
+ }
2667
+ },
2668
+ removeState: {
2669
+ description: "Remove a custom state from a node",
2670
+ schema: [{
2671
+ nodeId: "String",
2672
+ stateName: "String"
2673
+ }],
2674
+ examples: [
2675
+ { args: { nodeId: "nd_tab", stateName: "is-active" }, description: "Remove active state" }
2676
+ ],
2677
+ returns: "{ id: String, stateName: String }",
2678
+ handler: async (args) => {
2679
+ const state = useContext("state");
2680
+ const { removeState } = await import("./removeState-EBT6YGSZ.js");
2681
+ const nodes = state.ref(["nodes"]);
2682
+ const { nodeId, stateName } = args;
2683
+ removeState(nodes, nodeId, stateName);
2684
+ return { id: nodeId, stateName };
2685
+ }
2686
+ },
2687
+ // ── Metadata ────────────────────────────────────────────────────────────────
2688
+ updateBounds: {
2689
+ description: "Update the position and size of a node",
2690
+ schema: [{
2691
+ nodeId: "String",
2692
+ bounds: "Object"
2693
+ }],
2694
+ examples: [
2695
+ { args: { nodeId: "nd_frame", bounds: { x: 500, y: 0, width: 375, height: 667 } }, description: "Position a frame" }
2696
+ ],
2697
+ returns: "{ id: String, bounds: Object }",
2698
+ handler: async (args) => {
2699
+ const state = useContext("state");
2700
+ const { updateBounds } = await import("./updateBounds-WKOI6XJ3.js");
2701
+ const nodes = state.ref(["nodes"]);
2702
+ const { nodeId, bounds } = args;
2703
+ updateBounds(nodes, nodeId, bounds);
2704
+ return { id: nodeId, bounds };
2705
+ }
2706
+ },
2707
+ setHtmlId: {
2708
+ description: "Set the HTML id attribute on a node",
2709
+ schema: [{
2710
+ nodeId: "String",
2711
+ id: "String"
2712
+ }],
2713
+ examples: [
2714
+ { args: { nodeId: "nd_section", id: "hero-section" }, description: "Set HTML id for anchor links" }
2715
+ ],
2716
+ returns: "{ id: String, htmlId: String }",
2717
+ handler: async (args) => {
2718
+ const state = useContext("state");
2719
+ const { setHtmlId } = await import("./setHtmlId-MN7AQG5H.js");
2720
+ const nodes = state.ref(["nodes"]);
2721
+ const { nodeId, id } = args;
2722
+ setHtmlId(nodes, nodeId, id);
2723
+ return { id: nodeId, htmlId: id };
2724
+ }
2725
+ },
2726
+ addAttribute: {
2727
+ description: "Add a custom HTML attribute to a node",
2728
+ schema: [{
2729
+ nodeId: "String",
2730
+ name: "String",
2731
+ value: "Any?",
2732
+ mode: "String?"
2733
+ }],
2734
+ examples: [
2735
+ { args: { nodeId: "nd_img", name: "src", value: "/hero.png" }, description: "Set image source" },
2736
+ { args: { nodeId: "nd_img", name: "alt", value: "Hero image" }, description: "Set alt text" }
2737
+ ],
2738
+ returns: "{ id: String, name: String }",
2739
+ handler: async (args) => {
2740
+ const state = useContext("state");
2741
+ const { addAttribute } = await import("./addAttribute-V4C3VUVK.js");
2742
+ const nodes = state.ref(["nodes"]);
2743
+ const { nodeId, name, value, mode } = args;
2744
+ addAttribute(nodes, nodeId, { name, value, mode });
2745
+ return { id: nodeId, name };
2746
+ }
2747
+ },
2748
+ updateAttribute: {
2749
+ description: 'Update or upsert an attribute by name. For two-way input binding use name "model", mode "binding", and binding "$store.path". model XOR value/checked \u2014 setting model clears value and checked; setting value or checked clears model.',
2750
+ schema: [{
2751
+ nodeId: "String",
2752
+ name: "String",
2753
+ mode: "String?",
2754
+ value: "Any?",
2755
+ binding: "Any?",
2756
+ computed: "String?",
2757
+ code: "String?"
2758
+ }],
2759
+ examples: [
2760
+ { args: { nodeId: "nd_img", name: "src", value: "/new-hero.png" }, description: "Change image source" },
2761
+ { args: { nodeId: "nd_email", name: "model", mode: "binding", binding: "$store.form.email" }, description: "Two-way bind input to store" }
2762
+ ],
2763
+ returns: "{ id: String, name: String }",
2764
+ handler: async (args) => {
2765
+ const state = useContext("state");
2766
+ const { updateAttribute } = await import("./updateAttribute-VWGV37R7.js");
2767
+ const nodes = state.ref(["nodes"]);
2768
+ const { nodeId, ...attr } = args;
2769
+ if (typeof attr.binding === "string") {
2770
+ attr.binding = attr.binding.split(".");
2771
+ }
2772
+ if (attr.name === "model" && attr.mode == null) {
2773
+ attr.mode = "binding";
2774
+ }
2775
+ updateAttribute(nodes, nodeId, attr.name, attr);
2776
+ return { id: nodeId, name: attr.name };
2777
+ }
2778
+ },
2779
+ removeAttribute: {
2780
+ description: "Remove an attribute by name",
2781
+ schema: [{
2782
+ nodeId: "String",
2783
+ name: "String"
2784
+ }],
2785
+ examples: [
2786
+ { args: { nodeId: "nd_img", name: "src" }, description: "Remove src attribute" }
2787
+ ],
2788
+ returns: "{ id: String, name: String }",
2789
+ handler: async (args) => {
2790
+ const state = useContext("state");
2791
+ const { removeAttribute } = await import("./removeAttribute-4QEKTGTP.js");
2792
+ const nodes = state.ref(["nodes"]);
2793
+ const { nodeId, name } = args;
2794
+ removeAttribute(nodes, nodeId, name);
2795
+ return { id: nodeId, name };
2796
+ }
2797
+ },
2798
+ // ── Lifecycle hooks ─────────────────────────────────────────────────────────
2799
+ addLifecycleHook: {
2800
+ description: 'Add a lifecycle hook to a node (mount, unmount, update). mode is "code" with a code string, or "binding" with a store action binding.',
2801
+ schema: [{
2802
+ nodeId: "String",
2803
+ key: "String",
2804
+ code: "String?",
2805
+ binding: "String?"
2806
+ }],
2807
+ examples: [
2808
+ { args: { nodeId: "nd_page", key: "mount", code: 'console.log("mounted")' }, description: "Run code on mount" },
2809
+ { args: { nodeId: "nd_page", key: "mount", binding: "cart.load" }, description: "Call a store action on mount" }
2810
+ ],
2811
+ returns: "{ id: String, key: String }",
2812
+ handler: async (args) => {
2813
+ const state = useContext("state");
2814
+ const { addLifecycleHook } = await import("./addLifecycleHook-GC5MHVSH.js");
2815
+ const { updateLifecycleHook } = await import("./updateLifecycleHook-36JI5KSF.js");
2816
+ const nodes = state.ref(["nodes"]);
2817
+ const { nodeId, key, code, binding } = args;
2818
+ addLifecycleHook(nodes, nodeId, key);
2819
+ if (code !== void 0 || binding !== void 0) {
2820
+ updateLifecycleHook(nodes, nodeId, key, {
2821
+ key,
2822
+ mode: code !== void 0 ? "code" : "binding",
2823
+ code: code ?? "",
2824
+ binding: binding ?? null
2825
+ });
2826
+ }
2827
+ return { id: nodeId, key };
2828
+ }
2829
+ },
2830
+ updateLifecycleHook: {
2831
+ description: "Update a lifecycle hook by key. hook may include key, mode, code, binding.",
2832
+ schema: [{
2833
+ nodeId: "String",
2834
+ key: "String",
2835
+ hook: "Object"
2836
+ }],
2837
+ returns: "{ id: String, key: String }",
2838
+ handler: async (args) => {
2839
+ const state = useContext("state");
2840
+ const { updateLifecycleHook } = await import("./updateLifecycleHook-36JI5KSF.js");
2841
+ const nodes = state.ref(["nodes"]);
2842
+ const { nodeId, key, hook } = args;
2843
+ const current = (nodes.get([nodeId, "lifecycle"]) ?? []).find((h2) => h2.key === key) ?? { key };
2844
+ updateLifecycleHook(nodes, nodeId, key, { ...current, ...hook });
2845
+ return { id: nodeId, key };
2846
+ }
2847
+ },
2848
+ removeLifecycleHook: {
2849
+ description: "Remove a lifecycle hook by key.",
2850
+ schema: [{
2851
+ nodeId: "String",
2852
+ key: "String"
2853
+ }],
2854
+ returns: "{ id: String, key: String }",
2855
+ handler: async (args) => {
2856
+ const state = useContext("state");
2857
+ const { removeLifecycleHook } = await import("./removeLifecycleHook-3XIZU6TW.js");
2858
+ removeLifecycleHook(state.ref(["nodes"]), args.nodeId, args.key);
2859
+ return { id: args.nodeId, key: args.key };
2860
+ }
2861
+ },
2862
+ // ── Select options ──────────────────────────────────────────────────────────
2863
+ addOption: {
2864
+ description: "Add a static option to a select node.",
2865
+ schema: [{
2866
+ nodeId: "String",
2867
+ value: "String",
2868
+ label: "String?"
2869
+ }],
2870
+ examples: [
2871
+ { args: { nodeId: "nd_select", value: "us", label: "United States" }, description: "Add a select option" }
2872
+ ],
2873
+ returns: "{ id: String, value: String }",
2874
+ handler: async (args) => {
2875
+ const state = useContext("state");
2876
+ const { addOption } = await import("./addOption-7T3ZUC3A.js");
2877
+ const nodes = state.ref(["nodes"]);
2878
+ const { nodeId, value, label } = args;
2879
+ addOption(nodes, nodeId, { value, label: label ?? value });
2880
+ return { id: nodeId, value };
2881
+ }
2882
+ },
2883
+ updateOption: {
2884
+ description: "Update a select option by its current value. Pass the old value to look up, and optionally a new value/label.",
2885
+ schema: [{
2886
+ nodeId: "String",
2887
+ value: "String",
2888
+ newValue: "String?",
2889
+ label: "String?"
2890
+ }],
2891
+ returns: "{ id: String, value: String }",
2892
+ handler: async (args) => {
2893
+ const state = useContext("state");
2894
+ const { updateOption } = await import("./updateOption-ZEZ4TP7K.js");
2895
+ const nodes = state.ref(["nodes"]);
2896
+ const { nodeId, value, newValue, label } = args;
2897
+ const nextValue = newValue ?? value;
2898
+ updateOption(nodes, nodeId, value, { value: nextValue, label: label ?? nextValue });
2899
+ return { id: nodeId, value: nextValue };
2900
+ }
2901
+ },
2902
+ removeOption: {
2903
+ description: "Remove a select option by value.",
2904
+ schema: [{
2905
+ nodeId: "String",
2906
+ value: "String"
2907
+ }],
2908
+ returns: "{ id: String, value: String }",
2909
+ handler: async (args) => {
2910
+ const state = useContext("state");
2911
+ const { removeOption } = await import("./removeOption-V4NBH6EE.js");
2912
+ removeOption(state.ref(["nodes"]), args.nodeId, args.value);
2913
+ return { id: args.nodeId, value: args.value };
2914
+ }
2915
+ },
2916
+ setOptionsExpression: {
2917
+ description: "Bind a select node's options to a data expression instead of a static list. binding is a {{expression}} returning an array; valueKey/labelKey pick fields from each item.",
2918
+ schema: [{
2919
+ nodeId: "String",
2920
+ binding: "String",
2921
+ valueKey: "String?",
2922
+ labelKey: "String?"
2923
+ }],
2924
+ examples: [
2925
+ { args: { nodeId: "nd_select", binding: "{{countries}}", valueKey: "code", labelKey: "name" }, description: "Populate options from a store" }
2926
+ ],
2927
+ returns: "{ id: String }",
2928
+ handler: async (args) => {
2929
+ const state = useContext("state");
2930
+ const { setOptionsExpression } = await import("./setOptionsExpression-KQLKXH4C.js");
2931
+ const nodes = state.ref(["nodes"]);
2932
+ const { nodeId, binding, valueKey, labelKey } = args;
2933
+ setOptionsExpression(nodes, nodeId, { binding, valueKey, labelKey });
2934
+ return { id: nodeId };
2935
+ }
2936
+ },
2937
+ clearOptionsExpression: {
2938
+ description: "Switch a select node back to its static options list.",
2939
+ schema: [{
2940
+ nodeId: "String"
2941
+ }],
2942
+ returns: "{ id: String }",
2943
+ handler: async (args) => {
2944
+ const state = useContext("state");
2945
+ const { clearOptionsExpression } = await import("./clearOptionsExpression-YGCMAZEE.js");
2946
+ clearOptionsExpression(state.ref(["nodes"]), args.nodeId);
2947
+ return { id: args.nodeId };
2948
+ }
2949
+ },
2950
+ // ── Tag name / raw HTML ─────────────────────────────────────────────────────
2951
+ setTagName: {
2952
+ description: "Change the HTML tag of an element node (e.g. div to section).",
2953
+ mcpName: "set_tag_name",
2954
+ schema: [{
2955
+ nodeId: "String",
2956
+ tagName: "String"
2957
+ }],
2958
+ examples: [
2959
+ { args: { nodeId: "nd_box", tagName: "section" }, description: "Make a div semantic" }
2960
+ ],
2961
+ returns: "{ id: String, tagName: String }",
2962
+ handler: async (args) => {
2963
+ const state = useContext("state");
2964
+ const { setTagName } = await import("./setTagName-5DMTFJTJ.js");
2965
+ const nodes = state.ref(["nodes"]);
2966
+ const { nodeId, tagName } = args;
2967
+ setTagName(nodes, nodeId, tagName);
2968
+ return { id: nodeId, tagName };
2969
+ }
2970
+ },
2971
+ updateHtml: {
2972
+ description: "Set the inner HTML of a template node (raw HTML embed).",
2973
+ schema: [{
2974
+ nodeId: "String",
2975
+ html: "String"
2976
+ }],
2977
+ returns: "{ id: String }",
2978
+ handler: async (args) => {
2979
+ const state = useContext("state");
2980
+ const { updateHtml } = await import("./updateHtml-EJFF2LPA.js");
2981
+ updateHtml(state.ref(["nodes"]), args.nodeId, args.html);
2982
+ return { id: args.nodeId };
2983
+ }
2984
+ },
2985
+ // ── Route params ────────────────────────────────────────────────────────────
2986
+ addRouteParam: {
2987
+ description: "Add a route parameter to a frame route (e.g. an :id segment). Set key to name it; optional marks it optional.",
2988
+ schema: [{
2989
+ nodeId: "String",
2990
+ key: "String?",
2991
+ optional: "Boolean?"
2992
+ }],
2993
+ examples: [
2994
+ { args: { nodeId: "nd_frame", key: "id" }, description: "Add an :id param to the route" }
2995
+ ],
2996
+ returns: "{ id: String, index: Number }",
2997
+ handler: async (args) => {
2998
+ const state = useContext("state");
2999
+ const { addParamToRoute } = await import("./addParamToRoute-Q6Z5A6RQ.js");
3000
+ const nodes = state.ref(["nodes"]);
3001
+ const { nodeId, key, optional } = args;
3002
+ addParamToRoute(nodes, nodeId);
3003
+ const params = nodes.get([nodeId, "route", "params"]) ?? [];
3004
+ const index = params.length - 1;
3005
+ if (key !== void 0 || optional !== void 0) {
3006
+ nodes.set([nodeId, "route", "params", index], {
3007
+ key: key ?? null,
3008
+ optional: optional ?? false
3009
+ });
3010
+ }
3011
+ return { id: nodeId, index };
3012
+ }
3013
+ },
3014
+ removeRouteParam: {
3015
+ description: "Remove a route parameter from a frame route by index.",
3016
+ schema: [{
3017
+ nodeId: "String",
3018
+ index: "Number"
3019
+ }],
3020
+ returns: "{ id: String, index: Number }",
3021
+ handler: async (args) => {
3022
+ const state = useContext("state");
3023
+ const { removeParamFromRoute } = await import("./removeParamFromRoute-IMXTBRSZ.js");
3024
+ removeParamFromRoute(state.ref(["nodes"]), args.nodeId, args.index);
3025
+ return { id: args.nodeId, index: args.index };
3026
+ }
3027
+ }
3028
+ }));
3029
+
3030
+ // ../ai-tools/operations/tokenOperations.js
3031
+ var tokenOperations = defineAiOperations("token", (useContext) => ({
3032
+ create: {
3033
+ description: 'Create a design token. path is the token name (e.g. "color/primary"), type is the token kind (color, dimension, fontFamily, etc.), value is the CSS value. Reference tokens in styles via the slugged path (slashes/dots become dashes): path "color/primary" \u2192 var(--color-primary).',
3034
+ mcpName: "create_token",
3035
+ schema: [{
3036
+ path: "String",
3037
+ value: "String",
3038
+ type: "String?"
3039
+ }],
3040
+ examples: [
3041
+ { args: { path: "color/primary", value: "#3B82F6", type: "color" }, description: "Create a primary color token" },
3042
+ { args: { path: "spacing/lg", value: "24px", type: "dimension" }, description: "Create a spacing token" }
3043
+ ],
3044
+ returns: "{ id: String, path: String }",
3045
+ handler: async (args) => {
3046
+ const state = useContext("state");
3047
+ const { addToken } = await import("./addToken-2G5DPV5Z.js");
3048
+ const tokens = state.ref(["tokens"]);
3049
+ const { path, value, type } = args;
3050
+ const id = addToken(tokens, {
3051
+ $path: path,
3052
+ $value: value,
3053
+ ...type !== void 0 ? { $type: type } : {}
3054
+ });
3055
+ return { id, path };
3056
+ }
3057
+ },
3058
+ update: {
3059
+ description: "Update a design token. changes may include path, value, or type.",
3060
+ mcpName: "update_token",
3061
+ schema: [{
3062
+ tokenId: "String",
3063
+ changes: "Object"
3064
+ }],
3065
+ examples: [
3066
+ { args: { tokenId: "tk_abc", changes: { value: "#EF4444" } }, description: "Change a token value" }
3067
+ ],
3068
+ returns: "{ id: String }",
3069
+ handler: async (args) => {
3070
+ const state = useContext("state");
3071
+ const { updateToken } = await import("./updateToken-DMJBW7ZK.js");
3072
+ const tokens = state.ref(["tokens"]);
3073
+ const { tokenId, changes = {} } = args;
3074
+ const mapped = {};
3075
+ if (changes.path !== void 0) mapped.$path = changes.path;
3076
+ if (changes.value !== void 0) mapped.$value = changes.value;
3077
+ if (changes.type !== void 0) mapped.$type = changes.type;
3078
+ updateToken(tokens, tokenId, mapped);
3079
+ return { id: tokenId };
3080
+ }
3081
+ },
3082
+ delete: {
3083
+ description: "Delete a design token by id.",
3084
+ mcpName: "delete_token",
3085
+ schema: [{
3086
+ tokenId: "String"
3087
+ }],
3088
+ examples: [
3089
+ { args: { tokenId: "tk_abc" }, description: "Delete a token" }
3090
+ ],
3091
+ returns: "{ id: String }",
3092
+ handler: async (args) => {
3093
+ const state = useContext("state");
3094
+ const { removeToken } = await import("./removeToken-EDVBR3OL.js");
3095
+ const tokens = state.ref(["tokens"]);
3096
+ removeToken(tokens, args.tokenId);
3097
+ return { id: args.tokenId };
3098
+ }
3099
+ }
3100
+ }));
3101
+
3102
+ // ../ai-tools/operations/storeOperations.js
3103
+ function coerceValue(value, type) {
3104
+ if (value === void 0 || value === null) return value;
3105
+ if (typeof value !== "string") return value;
3106
+ switch (type) {
3107
+ case "number":
3108
+ return value === "" ? 0 : Number(value);
3109
+ case "boolean":
3110
+ return value === "true" || value === "1";
3111
+ case "array":
3112
+ case "object":
3113
+ if (!value || value === "") return type === "array" ? [] : {};
3114
+ try {
3115
+ return JSON.parse(value);
3116
+ } catch {
3117
+ return type === "array" ? [] : {};
3118
+ }
3119
+ default:
3120
+ return value;
3121
+ }
3122
+ }
3123
+ function resolveIndex(list, { key, name, index }) {
3124
+ const label = key ?? name;
3125
+ if (label !== void 0) {
3126
+ return list.findIndex((item) => (item.key ?? item.name) === label);
3127
+ }
3128
+ return index ?? -1;
3129
+ }
3130
+ var storeOperations = defineAiOperations("store", (useContext) => ({
3131
+ // ── Stores ──────────────────────────────────────────────────────────────
3132
+ create: {
3133
+ description: "Create a data store. Stores hold reactive values, computed properties, and actions that nodes can bind to (via repeat, model, render, or {{expressions}}). The store id is its name. Optionally pass state/computed/actions arrays to seed the store in one call. Store actions and computed use this for state (e.g. function () { this.items = []; }), not a context first argument.",
3134
+ alias: "createStore",
3135
+ mcpName: "create_store",
3136
+ schema: [{
3137
+ name: "String",
3138
+ state: "Array?",
3139
+ computed: "Array?",
3140
+ actions: "Array?"
3141
+ }],
3142
+ examples: [
3143
+ {
3144
+ args: {
3145
+ name: "todo",
3146
+ state: [
3147
+ { key: "newText", type: "string", value: "" },
3148
+ { key: "items", type: "array", value: [] }
3149
+ ],
3150
+ actions: [
3151
+ { name: "addTodo", code: 'function () { const text = this.newText.trim(); if (!text) return; this.items = [...this.items, { text, done: false }]; this.newText = ""; }' }
3152
+ ]
3153
+ },
3154
+ description: "Create a todo store with state and actions in one call"
3155
+ }
3156
+ ],
3157
+ returns: "{ id: String }",
3158
+ handler: async (args) => {
3159
+ const state = useContext("state");
3160
+ const { validateStorePayload } = await import("./validateStorePayload-HE65PPAB.js");
3161
+ const { addStore } = await import("./addStore-SR7UK24M.js");
3162
+ const { createValue } = await import("./createValue-SL4Y3LPI.js");
3163
+ const { createComputed } = await import("./createComputed-KKULWYID.js");
3164
+ const { createAction } = await import("./createAction-N6UW7YDP.js");
3165
+ validateStorePayload(args);
3166
+ const stores = state.ref(["stores"]);
3167
+ const id = addStore(stores, args.name);
3168
+ if (args.state?.length) {
3169
+ stores.set([id, "state"], args.state.map((item) => createValue({
3170
+ key: item.key,
3171
+ type: item.type,
3172
+ value: coerceValue(item.value, item.type)
3173
+ })));
3174
+ }
3175
+ if (args.computed?.length) {
3176
+ stores.set([id, "computed"], args.computed.map((item) => createComputed({
3177
+ name: item.name,
3178
+ code: item.code
3179
+ })));
3180
+ }
3181
+ if (args.actions?.length) {
3182
+ stores.set([id, "actions"], args.actions.map((item) => createAction({
3183
+ name: item.name,
3184
+ code: item.code
3185
+ })));
3186
+ }
3187
+ return { id };
3188
+ }
3189
+ },
3190
+ remove: {
3191
+ description: "Remove a data store and everything in it.",
3192
+ alias: "removeStore",
3193
+ schema: [{
3194
+ storeId: "String"
3195
+ }],
3196
+ returns: "{ id: String }",
3197
+ handler: async (args) => {
3198
+ const state = useContext("state");
3199
+ const { removeStore } = await import("./removeStore-UJA67G3O.js");
3200
+ removeStore(state.ref(["stores"]), args.storeId);
3201
+ return { id: args.storeId };
3202
+ }
3203
+ },
3204
+ // ── Values (reactive state) ─────────────────────────────────────────────
3205
+ addValue: {
3206
+ description: "Add a reactive value to a store. key is the value name, type is string/number/boolean/array/object, value is the initial value.",
3207
+ mcpName: "add_store_value",
3208
+ schema: [{
3209
+ storeId: "String",
3210
+ key: "String?",
3211
+ type: "String?",
3212
+ value: "String?"
3213
+ }],
3214
+ examples: [
3215
+ { args: { storeId: "cart", key: "items", type: "array", value: "[]" }, description: "Add an items array to the cart store" }
3216
+ ],
3217
+ returns: "{ storeId: String, key: String, index: Number }",
3218
+ handler: async (args) => {
3219
+ const state = useContext("state");
3220
+ const { addValue } = await import("./addValue-UYM36PD7.js");
3221
+ const { updateValue } = await import("./updateValue-6FPRH4CG.js");
3222
+ const stores = state.ref(["stores"]);
3223
+ const { storeId, key, type, value } = args;
3224
+ addValue(stores, storeId, type);
3225
+ const list = stores.get([storeId, "state"]) ?? [];
3226
+ const index = 0;
3227
+ const current = list[index];
3228
+ if (key !== void 0 || value !== void 0) {
3229
+ const resolvedType = type ?? current.type;
3230
+ updateValue(stores, storeId, index, {
3231
+ key: key ?? current.key,
3232
+ type: resolvedType,
3233
+ value: coerceValue(value ?? current.value, resolvedType)
3234
+ });
3235
+ }
3236
+ return { storeId, key: key ?? current.key, index };
3237
+ }
3238
+ },
3239
+ updateValue: {
3240
+ description: "Update a store value by key (or index). changes may include key, type, value.",
3241
+ schema: [{
3242
+ storeId: "String",
3243
+ key: "String?",
3244
+ index: "Number?",
3245
+ changes: "Object"
3246
+ }],
3247
+ examples: [
3248
+ { args: { storeId: "cart", key: "items", changes: { value: '[{"id":1}]' } }, description: "Set the items value" }
3249
+ ],
3250
+ returns: "{ storeId: String, index: Number }",
3251
+ handler: async (args) => {
3252
+ const state = useContext("state");
3253
+ const { updateValue } = await import("./updateValue-6FPRH4CG.js");
3254
+ const stores = state.ref(["stores"]);
3255
+ const { storeId, changes = {} } = args;
3256
+ const list = stores.get([storeId, "state"]) ?? [];
3257
+ const index = resolveIndex(list, args);
3258
+ if (index < 0) throw new Error(`store value not found: ${args.key ?? args.index} in ${storeId}`);
3259
+ const merged = { ...list[index], ...changes };
3260
+ if (changes.value !== void 0) {
3261
+ merged.value = coerceValue(merged.value, merged.type);
3262
+ }
3263
+ updateValue(stores, storeId, index, merged);
3264
+ return { storeId, index };
3265
+ }
3266
+ },
3267
+ removeValue: {
3268
+ description: "Remove a store value by key (or index).",
3269
+ schema: [{
3270
+ storeId: "String",
3271
+ key: "String?",
3272
+ index: "Number?"
3273
+ }],
3274
+ returns: "{ storeId: String, index: Number }",
3275
+ handler: async (args) => {
3276
+ const state = useContext("state");
3277
+ const { removeValue } = await import("./removeValue-UPOTPB3T.js");
3278
+ const stores = state.ref(["stores"]);
3279
+ const list = stores.get([args.storeId, "state"]) ?? [];
3280
+ const index = resolveIndex(list, args);
3281
+ if (index < 0) throw new Error(`store value not found: ${args.key ?? args.index} in ${args.storeId}`);
3282
+ removeValue(stores, args.storeId, index);
3283
+ return { storeId: args.storeId, index };
3284
+ }
3285
+ },
3286
+ // ── Computed ────────────────────────────────────────────────────────────
3287
+ addComputed: {
3288
+ description: "Add a computed property to a store. code is a function body string: function () { ... } with store state available on this (e.g. this.items).",
3289
+ schema: [{
3290
+ storeId: "String",
3291
+ name: "String?",
3292
+ code: "String?"
3293
+ }],
3294
+ examples: [
3295
+ { args: { storeId: "cart", name: "total", code: "function () { return this.items.reduce((s, i) => s + i.price, 0); }" }, description: "Add a cart total computed" }
3296
+ ],
3297
+ returns: "{ storeId: String, name: String, index: Number }",
3298
+ handler: async (args) => {
3299
+ const state = useContext("state");
3300
+ const { addComputed } = await import("./addComputed-N3SUFIVQ.js");
3301
+ const { updateComputed } = await import("./updateComputed-7QBBBXFC.js");
3302
+ const stores = state.ref(["stores"]);
3303
+ const { storeId, name, code } = args;
3304
+ addComputed(stores, storeId);
3305
+ const list = stores.get([storeId, "computed"]) ?? [];
3306
+ const index = 0;
3307
+ const current = list[index];
3308
+ if (name !== void 0 || code !== void 0) {
3309
+ updateComputed(stores, storeId, index, {
3310
+ name: name ?? current.name,
3311
+ code: code ?? current.code
3312
+ });
3313
+ }
3314
+ return { storeId, name: name ?? current.name, index };
3315
+ }
3316
+ },
3317
+ updateComputed: {
3318
+ description: "Update a store computed property by name (or index). changes may include name, code.",
3319
+ schema: [{
3320
+ storeId: "String",
3321
+ name: "String?",
3322
+ index: "Number?",
3323
+ changes: "Object"
3324
+ }],
3325
+ returns: "{ storeId: String, index: Number }",
3326
+ handler: async (args) => {
3327
+ const state = useContext("state");
3328
+ const { updateComputed } = await import("./updateComputed-7QBBBXFC.js");
3329
+ const stores = state.ref(["stores"]);
3330
+ const { storeId, changes = {} } = args;
3331
+ const list = stores.get([storeId, "computed"]) ?? [];
3332
+ const index = resolveIndex(list, args);
3333
+ if (index < 0) throw new Error(`store computed not found: ${args.name ?? args.index} in ${storeId}`);
3334
+ updateComputed(stores, storeId, index, { ...list[index], ...changes });
3335
+ return { storeId, index };
3336
+ }
3337
+ },
3338
+ removeComputed: {
3339
+ description: "Remove a store computed property by name (or index).",
3340
+ schema: [{
3341
+ storeId: "String",
3342
+ name: "String?",
3343
+ index: "Number?"
3344
+ }],
3345
+ returns: "{ storeId: String, index: Number }",
3346
+ handler: async (args) => {
3347
+ const state = useContext("state");
3348
+ const { removeComputed } = await import("./removeComputed-5J772TBY.js");
3349
+ const stores = state.ref(["stores"]);
3350
+ const list = stores.get([args.storeId, "computed"]) ?? [];
3351
+ const index = resolveIndex(list, args);
3352
+ if (index < 0) throw new Error(`store computed not found: ${args.name ?? args.index} in ${args.storeId}`);
3353
+ removeComputed(stores, args.storeId, index);
3354
+ return { storeId: args.storeId, index };
3355
+ }
3356
+ },
3357
+ // ── Actions ─────────────────────────────────────────────────────────────
3358
+ addAction: {
3359
+ description: "Add an action to a store. code is a function body string: function () { ... } that can read and mutate store values via this (e.g. this.items).",
3360
+ schema: [{
3361
+ storeId: "String",
3362
+ name: "String?",
3363
+ code: "String?"
3364
+ }],
3365
+ examples: [
3366
+ { args: { storeId: "cart", name: "clear", code: "function () { this.items = []; }" }, description: "Add a clear-cart action" }
3367
+ ],
3368
+ returns: "{ storeId: String, name: String, index: Number }",
3369
+ handler: async (args) => {
3370
+ const state = useContext("state");
3371
+ const { addAction } = await import("./addAction-UV7MSISB.js");
3372
+ const { updateAction } = await import("./updateAction-6KYOHLA3.js");
3373
+ const stores = state.ref(["stores"]);
3374
+ const { storeId, name, code } = args;
3375
+ addAction(stores, storeId);
3376
+ const list = stores.get([storeId, "actions"]) ?? [];
3377
+ const index = 0;
3378
+ const current = list[index];
3379
+ if (name !== void 0 || code !== void 0) {
3380
+ updateAction(stores, storeId, index, {
3381
+ name: name ?? current.name,
3382
+ code: code ?? current.code
3383
+ });
3384
+ }
3385
+ return { storeId, name: name ?? current.name, index };
3386
+ }
3387
+ },
3388
+ updateAction: {
3389
+ description: "Update a store action by name (or index). changes may include name, code.",
3390
+ schema: [{
3391
+ storeId: "String",
3392
+ name: "String?",
3393
+ index: "Number?",
3394
+ changes: "Object"
3395
+ }],
3396
+ returns: "{ storeId: String, index: Number }",
3397
+ handler: async (args) => {
3398
+ const state = useContext("state");
3399
+ const { updateAction } = await import("./updateAction-6KYOHLA3.js");
3400
+ const stores = state.ref(["stores"]);
3401
+ const { storeId, changes = {} } = args;
3402
+ const list = stores.get([storeId, "actions"]) ?? [];
3403
+ const index = resolveIndex(list, args);
3404
+ if (index < 0) throw new Error(`store action not found: ${args.name ?? args.index} in ${storeId}`);
3405
+ updateAction(stores, storeId, index, { ...list[index], ...changes });
3406
+ return { storeId, index };
3407
+ }
3408
+ },
3409
+ removeAction: {
3410
+ description: "Remove a store action by name (or index).",
3411
+ schema: [{
3412
+ storeId: "String",
3413
+ name: "String?",
3414
+ index: "Number?"
3415
+ }],
3416
+ returns: "{ storeId: String, index: Number }",
3417
+ handler: async (args) => {
3418
+ const state = useContext("state");
3419
+ const { removeAction } = await import("./removeAction-4PGYJ6CA.js");
3420
+ const stores = state.ref(["stores"]);
3421
+ const list = stores.get([args.storeId, "actions"]) ?? [];
3422
+ const index = resolveIndex(list, args);
3423
+ if (index < 0) throw new Error(`store action not found: ${args.name ?? args.index} in ${args.storeId}`);
3424
+ removeAction(stores, args.storeId, index);
3425
+ return { storeId: args.storeId, index };
3426
+ }
3427
+ }
3428
+ }));
3429
+
3430
+ // ../ai-tools/operations/animationOperations.js
3431
+ var animationOperations = defineAiOperations("animation", (useContext) => ({
3432
+ create: {
3433
+ description: 'Create an animation asset. keyframes is a Web Animations API keyframe array (e.g. [{ opacity: 0 }, { opacity: 1 }]). scope is "project" (reusable) or "node". Bind it to nodes with animation:bind.',
3434
+ mcpName: "create_animation",
3435
+ schema: [{
3436
+ name: "String",
3437
+ keyframes: "Array",
3438
+ duration: "Number?",
3439
+ easing: "String?",
3440
+ iterations: "Number?",
3441
+ fill: "String?",
3442
+ scope: "String?"
3443
+ }],
3444
+ examples: [
3445
+ {
3446
+ args: { name: "Fade In", keyframes: [{ opacity: 0 }, { opacity: 1 }], duration: 400, easing: "ease-out", scope: "project" },
3447
+ description: "Create a reusable fade-in animation"
3448
+ }
3449
+ ],
3450
+ returns: "{ id: String, name: String }",
3451
+ handler: async (args) => {
3452
+ const state = useContext("state");
3453
+ const { createAnimation } = await import("./createAnimation-RIBXIT62.js");
3454
+ const { createAnimationId } = await import("./id-WBHG2QOH.js");
3455
+ const animations2 = state.ref(["animations"]);
3456
+ const { name, keyframes, duration, easing, iterations, fill, scope } = args;
3457
+ const id = createAnimationId();
3458
+ animations2.set([id], createAnimation({
3459
+ name,
3460
+ keyframes,
3461
+ duration,
3462
+ easing,
3463
+ iterations,
3464
+ fill,
3465
+ scope: scope ?? "project"
3466
+ }));
3467
+ return { id, name };
3468
+ }
3469
+ },
3470
+ update: {
3471
+ description: "Update an animation asset. changes may include name, keyframes, duration, easing, iterations, fill, direction, delay.",
3472
+ schema: [{
3473
+ animationId: "String",
3474
+ changes: "Object"
3475
+ }],
3476
+ examples: [
3477
+ { args: { animationId: "anim_abc", changes: { duration: 600 } }, description: "Slow an animation down" }
3478
+ ],
3479
+ returns: "{ id: String }",
3480
+ handler: async (args) => {
3481
+ const state = useContext("state");
3482
+ const animations2 = state.ref(["animations"]);
3483
+ const { animationId, changes = {} } = args;
3484
+ const current = animations2.get([animationId]);
3485
+ if (!current) throw new Error(`animation not found: ${animationId}`);
3486
+ for (const [key, value] of Object.entries(changes)) {
3487
+ animations2.set([animationId, key], value);
3488
+ }
3489
+ return { id: animationId };
3490
+ }
3491
+ },
3492
+ delete: {
3493
+ description: "Delete an animation asset by id. Does not remove bindings that reference it.",
3494
+ schema: [{
3495
+ animationId: "String"
3496
+ }],
3497
+ returns: "{ id: String }",
3498
+ handler: async (args) => {
3499
+ const state = useContext("state");
3500
+ const animations2 = state.ref(["animations"]);
3501
+ animations2.set([args.animationId], null);
3502
+ return { id: args.animationId };
3503
+ }
3504
+ },
3505
+ bind: {
3506
+ description: 'Bind an animation to a node. play is the trigger: "mount", "click", "hover", etc. Set reverse to a trigger to play backwards on that event.',
3507
+ mcpName: "bind_animation",
3508
+ schema: [{
3509
+ nodeId: "String",
3510
+ animationId: "String",
3511
+ play: "String?",
3512
+ reverse: "String?"
3513
+ }],
3514
+ examples: [
3515
+ { args: { nodeId: "nd_hero", animationId: "anim_abc", play: "mount" }, description: "Fade the hero in on mount" }
3516
+ ],
3517
+ returns: "{ nodeId: String, animationId: String, index: Number }",
3518
+ handler: async (args) => {
3519
+ const state = useContext("state");
3520
+ const { addAnimationBinding } = await import("./addAnimationBinding-M4VWTNNB.js");
3521
+ const nodes = state.ref(["nodes"]);
3522
+ const { nodeId, animationId, play, reverse } = args;
3523
+ const binding = { id: animationId, play: play ?? "mount" };
3524
+ if (reverse !== void 0) binding.reverse = reverse;
3525
+ addAnimationBinding(nodes, nodeId, binding);
3526
+ return { nodeId, animationId };
3527
+ }
3528
+ },
3529
+ unbind: {
3530
+ description: "Remove an animation binding from a node by animation id.",
3531
+ schema: [{
3532
+ nodeId: "String",
3533
+ animationId: "String"
3534
+ }],
3535
+ returns: "{ nodeId: String, animationId: String }",
3536
+ handler: async (args) => {
3537
+ const state = useContext("state");
3538
+ const { removeAnimationBinding } = await import("./removeAnimationBinding-3SYE7FD3.js");
3539
+ removeAnimationBinding(state.ref(["nodes"]), args.nodeId, args.animationId);
3540
+ return { nodeId: args.nodeId, animationId: args.animationId };
3541
+ }
3542
+ },
3543
+ updateBinding: {
3544
+ description: "Update an animation binding on a node by animation id. binding may include play, reverse, or id.",
3545
+ schema: [{
3546
+ nodeId: "String",
3547
+ animationId: "String",
3548
+ binding: "Object"
3549
+ }],
3550
+ returns: "{ nodeId: String, animationId: String }",
3551
+ handler: async (args) => {
3552
+ const state = useContext("state");
3553
+ const { updateAnimationBinding } = await import("./updateAnimationBinding-SENX3Z5S.js");
3554
+ updateAnimationBinding(state.ref(["nodes"]), args.nodeId, args.animationId, args.binding);
3555
+ return { nodeId: args.nodeId, animationId: args.animationId };
3556
+ }
3557
+ }
3558
+ }));
3559
+
3560
+ // ../ai-tools/operations/main.js
3561
+ var allOperations = [
3562
+ nodeOperations,
3563
+ treeOperations,
3564
+ behaviorOperations,
3565
+ tokenOperations,
3566
+ storeOperations,
3567
+ animationOperations
3568
+ ];
3569
+
3570
+ // ../animation-library/src/categories/entrance.js
3571
+ var entrance = {
3572
+ jui_fadeIn: {
3573
+ name: "Fade In",
3574
+ category: "entrance",
3575
+ defaultPlay: "mount",
3576
+ duration: 600,
3577
+ easing: "ease",
3578
+ fill: "forwards",
3579
+ keyframes: [
3580
+ { offset: 0, properties: { opacity: "0" } },
3581
+ { offset: 1, properties: { opacity: "1" } }
3582
+ ]
3583
+ },
3584
+ jui_fadeInUp: {
3585
+ name: "Fade In Up",
3586
+ category: "entrance",
3587
+ defaultPlay: "mount",
3588
+ duration: 600,
3589
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3590
+ fill: "forwards",
3591
+ keyframes: [
3592
+ { offset: 0, properties: { opacity: "0", transform: "translateY(30px)" } },
3593
+ { offset: 1, properties: { opacity: "1", transform: "translateY(0)" } }
3594
+ ]
3595
+ },
3596
+ jui_fadeInDown: {
3597
+ name: "Fade In Down",
3598
+ category: "entrance",
3599
+ defaultPlay: "mount",
3600
+ duration: 600,
3601
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3602
+ fill: "forwards",
3603
+ keyframes: [
3604
+ { offset: 0, properties: { opacity: "0", transform: "translateY(-30px)" } },
3605
+ { offset: 1, properties: { opacity: "1", transform: "translateY(0)" } }
3606
+ ]
3607
+ },
3608
+ jui_slideInLeft: {
3609
+ name: "Slide In Left",
3610
+ category: "entrance",
3611
+ defaultPlay: "mount",
3612
+ duration: 500,
3613
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3614
+ fill: "forwards",
3615
+ keyframes: [
3616
+ { offset: 0, properties: { opacity: "0", transform: "translateX(-60px)" } },
3617
+ { offset: 1, properties: { opacity: "1", transform: "translateX(0)" } }
3618
+ ]
3619
+ },
3620
+ jui_slideInRight: {
3621
+ name: "Slide In Right",
3622
+ category: "entrance",
3623
+ defaultPlay: "mount",
3624
+ duration: 500,
3625
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3626
+ fill: "forwards",
3627
+ keyframes: [
3628
+ { offset: 0, properties: { opacity: "0", transform: "translateX(60px)" } },
3629
+ { offset: 1, properties: { opacity: "1", transform: "translateX(0)" } }
3630
+ ]
3631
+ },
3632
+ jui_slideInUp: {
3633
+ name: "Slide In Up",
3634
+ category: "entrance",
3635
+ defaultPlay: "mount",
3636
+ duration: 500,
3637
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3638
+ fill: "forwards",
3639
+ keyframes: [
3640
+ { offset: 0, properties: { opacity: "0", transform: "translateY(60px)" } },
3641
+ { offset: 1, properties: { opacity: "1", transform: "translateY(0)" } }
3642
+ ]
3643
+ },
3644
+ jui_slideInDown: {
3645
+ name: "Slide In Down",
3646
+ category: "entrance",
3647
+ defaultPlay: "mount",
3648
+ duration: 500,
3649
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3650
+ fill: "forwards",
3651
+ keyframes: [
3652
+ { offset: 0, properties: { opacity: "0", transform: "translateY(-60px)" } },
3653
+ { offset: 1, properties: { opacity: "1", transform: "translateY(0)" } }
3654
+ ]
3655
+ },
3656
+ jui_scaleIn: {
3657
+ name: "Scale In",
3658
+ category: "entrance",
3659
+ defaultPlay: "mount",
3660
+ duration: 500,
3661
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3662
+ fill: "forwards",
3663
+ keyframes: [
3664
+ { offset: 0, properties: { opacity: "0", transform: "scale(0.8)" } },
3665
+ { offset: 1, properties: { opacity: "1", transform: "scale(1)" } }
3666
+ ]
3667
+ },
3668
+ jui_zoomIn: {
3669
+ name: "Zoom In",
3670
+ category: "entrance",
3671
+ defaultPlay: "mount",
3672
+ duration: 500,
3673
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3674
+ fill: "forwards",
3675
+ keyframes: [
3676
+ { offset: 0, properties: { opacity: "0", transform: "scale(0.3)" } },
3677
+ { offset: 1, properties: { opacity: "1", transform: "scale(1)" } }
3678
+ ]
3679
+ }
3680
+ };
3681
+
3682
+ // ../animation-library/src/categories/exit.js
3683
+ var exit = {
3684
+ jui_fadeOut: {
3685
+ name: "Fade Out",
3686
+ category: "exit",
3687
+ defaultPlay: "mount",
3688
+ duration: 600,
3689
+ easing: "ease",
3690
+ fill: "forwards",
3691
+ keyframes: [
3692
+ { offset: 0, properties: { opacity: "1" } },
3693
+ { offset: 1, properties: { opacity: "0" } }
3694
+ ]
3695
+ },
3696
+ jui_fadeOutDown: {
3697
+ name: "Fade Out Down",
3698
+ category: "exit",
3699
+ defaultPlay: "mount",
3700
+ duration: 600,
3701
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3702
+ fill: "forwards",
3703
+ keyframes: [
3704
+ { offset: 0, properties: { opacity: "1", transform: "translateY(0)" } },
3705
+ { offset: 1, properties: { opacity: "0", transform: "translateY(30px)" } }
3706
+ ]
3707
+ },
3708
+ jui_slideOutLeft: {
3709
+ name: "Slide Out Left",
3710
+ category: "exit",
3711
+ defaultPlay: "mount",
3712
+ duration: 500,
3713
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3714
+ fill: "forwards",
3715
+ keyframes: [
3716
+ { offset: 0, properties: { opacity: "1", transform: "translateX(0)" } },
3717
+ { offset: 1, properties: { opacity: "0", transform: "translateX(-60px)" } }
3718
+ ]
3719
+ },
3720
+ jui_slideOutRight: {
3721
+ name: "Slide Out Right",
3722
+ category: "exit",
3723
+ defaultPlay: "mount",
3724
+ duration: 500,
3725
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3726
+ fill: "forwards",
3727
+ keyframes: [
3728
+ { offset: 0, properties: { opacity: "1", transform: "translateX(0)" } },
3729
+ { offset: 1, properties: { opacity: "0", transform: "translateX(60px)" } }
3730
+ ]
3731
+ },
3732
+ jui_scaleOut: {
3733
+ name: "Scale Out",
3734
+ category: "exit",
3735
+ defaultPlay: "mount",
3736
+ duration: 500,
3737
+ easing: "cubic-bezier(0.4, 0, 0.2, 1)",
3738
+ fill: "forwards",
3739
+ keyframes: [
3740
+ { offset: 0, properties: { opacity: "1", transform: "scale(1)" } },
3741
+ { offset: 1, properties: { opacity: "0", transform: "scale(0.8)" } }
3742
+ ]
3743
+ }
3744
+ };
3745
+
3746
+ // ../animation-library/src/categories/emphasis.js
3747
+ var emphasis = {
3748
+ jui_pulse: {
3749
+ name: "Pulse",
3750
+ category: "emphasis",
3751
+ defaultPlay: "pointerenter",
3752
+ defaultReset: "pointerleave",
3753
+ duration: 1e3,
3754
+ easing: "ease-in-out",
3755
+ fill: "none",
3756
+ keyframes: [
3757
+ { offset: 0, properties: { transform: "scale(1)" } },
3758
+ { offset: 0.5, properties: { transform: "scale(1.05)" } },
3759
+ { offset: 1, properties: { transform: "scale(1)" } }
3760
+ ]
3761
+ },
3762
+ jui_bounce: {
3763
+ name: "Bounce",
3764
+ category: "emphasis",
3765
+ defaultPlay: "pointerenter",
3766
+ defaultReset: "pointerleave",
3767
+ duration: 800,
3768
+ easing: "cubic-bezier(0.28, 0.84, 0.42, 1)",
3769
+ fill: "none",
3770
+ keyframes: [
3771
+ { offset: 0, properties: { transform: "translateY(0)" } },
3772
+ { offset: 0.2, properties: { transform: "translateY(0)" } },
3773
+ { offset: 0.4, properties: { transform: "translateY(-20px)" } },
3774
+ { offset: 0.5, properties: { transform: "translateY(0)" } },
3775
+ { offset: 0.6, properties: { transform: "translateY(-10px)" } },
3776
+ { offset: 0.8, properties: { transform: "translateY(0)" } },
3777
+ { offset: 1, properties: { transform: "translateY(0)" } }
3778
+ ]
3779
+ },
3780
+ jui_shake: {
3781
+ name: "Shake",
3782
+ category: "emphasis",
3783
+ defaultPlay: "pointerenter",
3784
+ defaultReset: "pointerleave",
3785
+ duration: 600,
3786
+ easing: "ease-in-out",
3787
+ fill: "none",
3788
+ keyframes: [
3789
+ { offset: 0, properties: { transform: "translateX(0)" } },
3790
+ { offset: 0.1, properties: { transform: "translateX(-8px)" } },
3791
+ { offset: 0.2, properties: { transform: "translateX(8px)" } },
3792
+ { offset: 0.3, properties: { transform: "translateX(-8px)" } },
3793
+ { offset: 0.4, properties: { transform: "translateX(8px)" } },
3794
+ { offset: 0.5, properties: { transform: "translateX(-4px)" } },
3795
+ { offset: 0.6, properties: { transform: "translateX(4px)" } },
3796
+ { offset: 0.7, properties: { transform: "translateX(-2px)" } },
3797
+ { offset: 0.8, properties: { transform: "translateX(2px)" } },
3798
+ { offset: 1, properties: { transform: "translateX(0)" } }
3799
+ ]
3800
+ }
3801
+ };
3802
+
3803
+ // ../animation-library/src/categories/attention.js
3804
+ var attention = {
3805
+ jui_flash: {
3806
+ name: "Flash",
3807
+ category: "attention",
3808
+ defaultPlay: "pointerenter",
3809
+ defaultReset: "pointerleave",
3810
+ duration: 800,
3811
+ easing: "ease-in-out",
3812
+ fill: "none",
3813
+ keyframes: [
3814
+ { offset: 0, properties: { opacity: "1" } },
3815
+ { offset: 0.25, properties: { opacity: "0" } },
3816
+ { offset: 0.5, properties: { opacity: "1" } },
3817
+ { offset: 0.75, properties: { opacity: "0" } },
3818
+ { offset: 1, properties: { opacity: "1" } }
3819
+ ]
3820
+ },
3821
+ jui_heartbeat: {
3822
+ name: "Heartbeat",
3823
+ category: "attention",
3824
+ defaultPlay: "pointerenter",
3825
+ defaultReset: "pointerleave",
3826
+ duration: 1200,
3827
+ easing: "ease-in-out",
3828
+ fill: "none",
3829
+ keyframes: [
3830
+ { offset: 0, properties: { transform: "scale(1)" } },
3831
+ { offset: 0.14, properties: { transform: "scale(1.3)" } },
3832
+ { offset: 0.28, properties: { transform: "scale(1)" } },
3833
+ { offset: 0.42, properties: { transform: "scale(1.3)" } },
3834
+ { offset: 0.7, properties: { transform: "scale(1)" } },
3835
+ { offset: 1, properties: { transform: "scale(1)" } }
3836
+ ]
3837
+ }
3838
+ };
3839
+
3840
+ // ../animation-library/src/main.js
3841
+ var animations = { ...entrance, ...exit, ...emphasis, ...attention };
3842
+
3843
+ // src/modes/design/bootstrap.js
3844
+ var createDesignBootstrap = ({ port = null, config = {}, token = null, portProvider = null, handles = null } = {}) => new Promise(async (resolve, reject) => {
3845
+ try {
3846
+ if (!port) throw new Error("[stage/design] MessagePort is required");
3847
+ const { loadProjectMain } = await import("./react-GONY7QDQ.js");
3848
+ await loadProjectMain();
3849
+ const sources = (await import("/components.js"))?.default ?? {};
3850
+ const $app = initializeNode(config.$el || "app");
3851
+ const $temp = initializeNode("temp");
3852
+ const $components = initializeNode("components");
3853
+ const viewport = getViewport();
3854
+ const state = R.create().install(f, Ledger, a, f2, r);
3855
+ const engine = G.create({ state }).install(
3856
+ SceneCompiler.configure(config),
3857
+ AiOperations,
3858
+ T,
3859
+ s.configure({
3860
+ url: typeof window !== "undefined" ? window.location.origin : `http://localhost:${config.port}`,
3861
+ options: {
3862
+ path: "/socket.io",
3863
+ transports: ["websocket", "polling"]
3864
+ }
3865
+ }),
3866
+ PageLifecycle.configure({
3867
+ visibility: true,
3868
+ focus: false,
3869
+ freeze: true,
3870
+ sleepDetection: { enabled: true, threshold: 1e4 }
3871
+ }),
3872
+ ContentEditor
3873
+ );
3874
+ engine.cache.load({ config, token, $app, $temp, $components, viewport });
3875
+ engine.sceneCompiler.loadPrototypes(PROTOTYPES);
3876
+ engine.sceneCompiler.loadSources(sources);
3877
+ engine.aiOps.use(...allOperations);
3878
+ engine.socket.create();
3879
+ let hasLoaded = false;
3880
+ engine.socket.get().on("studio:load", async (scene) => {
3881
+ normalizeSceneViewportKinds(scene);
3882
+ if (hasLoaded) {
3883
+ engine.state.load(scene);
3884
+ engine.sceneCompiler.forceNodeGraph();
3885
+ return;
3886
+ }
3887
+ hasLoaded = true;
3888
+ engine.state.load(scene);
3889
+ engine.state.history.start();
3890
+ setTimeout(() => engine.state.history.onCommit((changes) => engine.socket.get().emit("server:commit:changes", changes)), 0);
3891
+ await engine.sceneCompiler.create("app", "app");
3892
+ await engine.sceneCompiler.create("temp", "temp", { mode: "temp" });
3893
+ await engine.sceneCompiler.create("components", "components", { mode: "components" });
3894
+ });
3895
+ engine.socket.get().on("stage:changes:apply", (changes) => engine.state.apply(changes));
3896
+ engine.state.onChange.addListener((changes) => engine.socket.get().emit("server:broadcast:changes", changes));
3897
+ if (handles) {
3898
+ handles.reconnect = (newPort) => engine.channel.connect(newPort);
3899
+ }
3900
+ if (portProvider) engine.channel.portProvider(portProvider);
3901
+ const channel = await engine.channel.connect(port);
3902
+ if (channel) {
3903
+ const { nodeGraphContracts } = await import("./nodeGraph-GGV7TAPQ.js");
3904
+ const { historyContracts } = await import("./history-KTZZH7TG.js");
3905
+ const { userContracts } = await import("./user-MDIKS6ZN.js");
3906
+ const { assetsContracts } = await import("./assets-24YGC7SD.js");
3907
+ const { aiContracts } = await import("./aiRelay-RULC7GEA.js");
3908
+ const { contentEditorContracts } = await import("./contentEditor-HE34KY6R.js");
3909
+ const { viewportContracts } = await import("./viewport-DKL3EJOU.js");
3910
+ const { contracts: nodeContracts } = await import("./main-Y7QHSAW7.js");
3911
+ const { contracts: animationContracts } = await import("./main-IVVVSUSO.js");
3912
+ const { contracts: tokenContracts } = await import("./main-EMRULEYO.js");
3913
+ const { contracts: storeContracts } = await import("./main-YSWDZAGN.js");
3914
+ channel.use(
3915
+ viewportContracts,
3916
+ nodeGraphContracts,
3917
+ historyContracts,
3918
+ userContracts,
3919
+ assetsContracts,
3920
+ aiContracts,
3921
+ contentEditorContracts,
3922
+ ...nodeContracts,
3923
+ ...animationContracts,
3924
+ ...tokenContracts,
3925
+ ...storeContracts
3926
+ );
3927
+ re(() => engine.state.get(["nodes"]), (nodes) => {
3928
+ if (!nodes) return;
3929
+ const componentsIds = Object.keys(nodes).filter((id) => nodes[id]?.type === "component");
3930
+ const meta = [...engine.sceneCompiler.getMeta()];
3931
+ for (const id of componentsIds) {
3932
+ const node = nodes[id];
3933
+ meta.push({
3934
+ displayName: node.name || id,
3935
+ category: "local",
3936
+ keywords: [node.name, "component"],
3937
+ library: null,
3938
+ tagName: id
3939
+ });
3940
+ }
3941
+ engine.channel.to("editor").publish("components:set", meta);
3942
+ });
3943
+ re(() => engine.state.get(["tokens"]), (tokens) => {
3944
+ engine.channel.to("editor").publish("tokens:set", tokens ?? {});
3945
+ engine.channel.to("panel-tokens").publish("token:set", tokens ?? {});
3946
+ });
3947
+ re(() => engine.state.get(["stores"]), (stores) => {
3948
+ engine.channel.to("editor").publish("stores:set", stores ?? {});
3949
+ });
3950
+ re(() => engine.state.get(["assets"]), (assets) => {
3951
+ engine.channel.to("editor").publish("assets:set", assets);
3952
+ });
3953
+ re(() => engine.state.get(["libraryClassNames"]), (classNames) => {
3954
+ engine.channel.to("editor").publish("libraryClassNames:set", classNames ?? []);
3955
+ });
3956
+ re(() => {
3957
+ const animations2 = engine.state.get(["animations"]);
3958
+ if (!animations2) return null;
3959
+ return Object.entries(animations2).filter(([, node]) => node !== null && node !== void 0).map(([id, node]) => ({ id, ...node }));
3960
+ }, (animations2) => {
3961
+ engine.channel.to("editor").publish("animations:set", animations2 ?? []);
3962
+ });
3963
+ engine.sceneCompiler.addNodeGraphListener((graph, removed, isFullSync) => {
3964
+ if (isFullSync) {
3965
+ channel.to("renderWorker", "editor").publish("nodeGraph:set", graph);
3966
+ } else {
3967
+ channel.to("renderWorker", "editor").publish("nodeGraph:update", graph, removed);
3968
+ }
3969
+ engine.sceneCompiler.projectPuppetJsx(["app"]);
3970
+ });
3971
+ engine.channel.to("editor").publish("elements:set", elements);
3972
+ engine.channel.to("editor").publish("frames:set", palette);
3973
+ engine.channel.to("editor").publish("graphics:set", palette2);
3974
+ engine.channel.to("editor").publish("globalAnimations:set", animations);
3975
+ engine.channel.to("editor").publish("components:set", engine.sceneCompiler.getMeta());
3976
+ const initialAssets = engine.state.get(["assets"]);
3977
+ if (initialAssets) {
3978
+ engine.channel.to("editor").publish("assets:set", initialAssets);
3979
+ }
3980
+ engine.sceneCompiler.startNodeGraph();
3981
+ engine.pageLifecycle.on("hidden", () => {
3982
+ engine.sceneCompiler.pauseNodeGraph();
3983
+ });
3984
+ engine.pageLifecycle.on("visible", () => {
3985
+ engine.sceneCompiler.forceNodeGraph();
3986
+ });
3987
+ engine.pageLifecycle.on("resume", () => {
3988
+ const socket = engine.socket.get();
3989
+ if (socket.disconnected) socket.connect();
3990
+ engine.sceneCompiler.forceNodeGraph();
3991
+ });
3992
+ engine.channel.onEnable(() => {
3993
+ channel.to("renderWorker").publish("nodeGraph:remove");
3994
+ const graph = engine.sceneCompiler.getNodeGraph();
3995
+ channel.to("renderWorker", "editor").publish("nodeGraph:set", graph);
3996
+ const viewport2 = engine.sceneCompiler.getViewport();
3997
+ const selectedRids = engine.sceneCompiler.getSelectedRids();
3998
+ const focalRid = engine.sceneCompiler.getFocalRid();
3999
+ channel.to("renderWorker").publish("viewport:set", viewport2);
4000
+ channel.to("renderWorker").publish("selection:rids:set", selectedRids);
4001
+ channel.to("renderWorker").publish("selection:focalRid:set", focalRid);
4002
+ });
4003
+ channel.subscribe("selection:rids:set", (rids) => {
4004
+ engine.sceneCompiler.setSelectedRids(rids);
4005
+ });
4006
+ channel.subscribe("selection:focalRid:set", (rid) => {
4007
+ engine.sceneCompiler.setFocalRid(rid || null);
4008
+ });
4009
+ channel.subscribe("animation:preview:play", (animationId, nodeIds) => {
4010
+ for (const nodeId of nodeIds) {
4011
+ const result = engine.sceneCompiler.animate(nodeId, animationId, { fill: "none" });
4012
+ const anims = Array.isArray(result) ? result : result ? [result] : [];
4013
+ for (const anim of anims) {
4014
+ anim.addEventListener("finish", () => {
4015
+ channel.to("editor").publish("animation:preview:finished", animationId);
4016
+ }, { once: true });
4017
+ }
4018
+ }
4019
+ });
4020
+ channel.subscribe("animation:preview:stop", (animationId, nodeIds) => {
4021
+ for (const nodeId of nodeIds) {
4022
+ engine.sceneCompiler.cancelAnimation(nodeId, animationId);
4023
+ }
4024
+ });
4025
+ channel.subscribe("animation:preview:seek", (animationId, timeMs) => {
4026
+ engine.sceneCompiler.seekAnimation(animationId, timeMs);
4027
+ });
4028
+ engine.socket.get().on("stage:relay:user:connected", (id, user) => channel.to("renderWorker").publish("user:connected", id, user));
4029
+ engine.socket.get().on("stage:relay:user:disconnected", (id) => channel.to("renderWorker").publish("user:disconnected", id));
4030
+ engine.socket.get().on("stage:relay:user:update", (id, user) => channel.to("renderWorker").publish("user:update", id, user));
4031
+ engine.socket.get().on("stage:relay:users:set", (users) => channel.to("renderWorker").publish("user:setAll", users));
4032
+ engine.socket.get().on("stage:relay:asset:uploaded", (asset) => engine.channel.to("editor").publish("asset:uploaded", asset));
4033
+ engine.socket.get().on("stage:screenshot:capture", async () => {
4034
+ console.log("[screenshot:relay] capture requested");
4035
+ try {
4036
+ const nodes = engine.state.get(["nodes"]);
4037
+ const appChildren = nodes?.app?.children ?? [];
4038
+ const frameEntries = appChildren.filter((id) => nodes[id]?.type === "frame").map((id) => ({ id, name: nodes[id].name || id, bounds: nodes[id].bounds }));
4039
+ console.log(`[screenshot:relay] found ${frameEntries.length} frames:`, frameEntries.map((f4) => f4.name));
4040
+ const baseConfig = engine.cache.get(["config"]);
4041
+ const frames = [];
4042
+ for (const frame of frameEntries) {
4043
+ console.log(`[screenshot:relay] capturing frame "${frame.name}" (${frame.id})`);
4044
+ const opts = {
4045
+ config: {
4046
+ basePath: baseConfig.basePath ?? `http://localhost:${baseConfig.port}`,
4047
+ view: "screen-capture",
4048
+ env: "dev",
4049
+ nodeId: frame.id
4050
+ },
4051
+ width: frame.bounds?.width ?? 1440,
4052
+ height: frame.bounds?.height ?? 900,
4053
+ result: "base64"
4054
+ };
4055
+ const result = await channel.to("electronMain").request("screenCapture:capture", opts);
4056
+ console.log(`[screenshot:relay] captured frame "${frame.name}" \u2014 ${result?.base64?.length ?? 0} chars`);
4057
+ frames.push({
4058
+ id: frame.id,
4059
+ name: frame.name,
4060
+ imageData: `data:image/png;base64,${result.base64}`
4061
+ });
4062
+ }
4063
+ console.log(`[screenshot:relay] emitting ${frames.length} frames to server`);
4064
+ engine.socket.get().emit("server:screenshot:result", { frames });
4065
+ } catch (error) {
4066
+ console.error("[screenshot:relay] failed:", error);
4067
+ engine.socket.get().emit("server:screenshot:result", { error: error.message });
4068
+ }
4069
+ });
4070
+ resolve(config);
4071
+ } else {
4072
+ reject(new Error("Stage channel failed to connect"));
4073
+ }
4074
+ } catch (error) {
4075
+ reject(error);
4076
+ }
4077
+ });
4078
+ export {
4079
+ createDesignBootstrap
4080
+ };