@tangle-network/agent-app 0.43.56 → 0.43.58

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 (352) hide show
  1. package/dist/DesignCanvas-UNL34LS2.js +12 -0
  2. package/dist/DesignCanvasEditor-FJIVYOA2.js +13 -0
  3. package/dist/IntakeInterview-3ZIQMZS6.js +8 -0
  4. package/dist/InvitationsPanel-CJ7DR4F7.js +8 -0
  5. package/dist/MembersPanel-BB4OD2KB.js +8 -0
  6. package/dist/{TimelineEditor-I35SJJAJ.js → TimelineEditor-2ECKSU6P.js} +3 -3
  7. package/dist/{VaultPane-DrQ_tH6c.d.ts → VaultPane-BDP6SB_K.d.ts} +1 -0
  8. package/dist/{access-BZ81Btt5.d.ts → access-490O6aOU.d.ts} +16 -1
  9. package/dist/app-auth/index.d.ts +6 -1
  10. package/dist/app-auth/index.js +3 -3
  11. package/dist/app-auth/index.js.map +1 -1
  12. package/dist/{apply-Gk4raT2j.d.ts → apply-6wlMOLf8.d.ts} +30 -1
  13. package/dist/assets/index.d.ts +41 -0
  14. package/dist/assets/index.js +1 -1
  15. package/dist/assistant/index.d.ts +26 -6
  16. package/dist/assistant/index.js +9 -9
  17. package/dist/assistant/index.js.map +1 -1
  18. package/dist/{attachment-validation-D0csjCvz.d.ts → attachment-validation-tPRp-PP1.d.ts} +7 -1
  19. package/dist/{auth-DuptSkWh.d.ts → auth-_FU8w01b.d.ts} +4 -1
  20. package/dist/billing/index.d.ts +8 -0
  21. package/dist/billing/index.js +1 -1
  22. package/dist/brand/index.d.ts +2 -0
  23. package/dist/brand/index.js.map +1 -1
  24. package/dist/brand-extraction/index.d.ts +3 -0
  25. package/dist/brand-extraction/index.js.map +1 -1
  26. package/dist/catalog/index.d.ts +2 -0
  27. package/dist/catalog/index.js +1 -1
  28. package/dist/chat-routes/index.d.ts +41 -10
  29. package/dist/chat-routes/index.js +15 -15
  30. package/dist/chat-routes/index.js.map +1 -1
  31. package/dist/chat-store/index.d.ts +18 -4
  32. package/dist/chat-store/index.js +4 -4
  33. package/dist/chat-store/index.js.map +1 -1
  34. package/dist/{chunk-H5FM75MR.js → chunk-22GLESKE.js} +3 -3
  35. package/dist/chunk-22GLESKE.js.map +1 -0
  36. package/dist/{chunk-WEBBJBDH.js → chunk-2DRYTJHI.js} +1 -1
  37. package/dist/chunk-2DRYTJHI.js.map +1 -0
  38. package/dist/{chunk-7EVZUIHW.js → chunk-3EJ6SFJI.js} +1 -1
  39. package/dist/chunk-3EJ6SFJI.js.map +1 -0
  40. package/dist/{chunk-HRJJH3RX.js → chunk-3OFQFW5K.js} +4 -4
  41. package/dist/chunk-3OFQFW5K.js.map +1 -0
  42. package/dist/{chunk-7SUPA2YT.js → chunk-4KKXZQPT.js} +2 -2
  43. package/dist/chunk-4KKXZQPT.js.map +1 -0
  44. package/dist/{chunk-5PTGEJZL.js → chunk-5SD6HT2V.js} +1 -1
  45. package/dist/chunk-5SD6HT2V.js.map +1 -0
  46. package/dist/{chunk-7C64WKAH.js → chunk-5SXS3YAB.js} +2 -2
  47. package/dist/{chunk-L2TG5DBW.js → chunk-5TESA4SN.js} +1 -1
  48. package/dist/chunk-5TESA4SN.js.map +1 -0
  49. package/dist/{chunk-63CE7FEZ.js → chunk-6XIAPIW6.js} +1 -1
  50. package/dist/chunk-6XIAPIW6.js.map +1 -0
  51. package/dist/{chunk-MFRCM32T.js → chunk-7CTIUCQ4.js} +1 -1
  52. package/dist/chunk-7CTIUCQ4.js.map +1 -0
  53. package/dist/{chunk-6KVH5SP5.js → chunk-7YW6EBDX.js} +2 -2
  54. package/dist/chunk-7YW6EBDX.js.map +1 -0
  55. package/dist/{chunk-ZXNXAQAH.js → chunk-AP2UXKUK.js} +1 -1
  56. package/dist/chunk-AP2UXKUK.js.map +1 -0
  57. package/dist/{chunk-K63OWUDJ.js → chunk-BPSV5AA2.js} +2 -2
  58. package/dist/chunk-BPSV5AA2.js.map +1 -0
  59. package/dist/{chunk-MFI4ZM7W.js → chunk-BT4QFCTB.js} +1 -1
  60. package/dist/chunk-BT4QFCTB.js.map +1 -0
  61. package/dist/{chunk-ZYBWGSAZ.js → chunk-BVKQKGRK.js} +1 -1
  62. package/dist/chunk-BVKQKGRK.js.map +1 -0
  63. package/dist/{chunk-RVUISYUE.js → chunk-C3NSB66C.js} +7 -7
  64. package/dist/chunk-C3NSB66C.js.map +1 -0
  65. package/dist/{chunk-BQV42AFK.js → chunk-CCVWR33L.js} +1 -1
  66. package/dist/chunk-CCVWR33L.js.map +1 -0
  67. package/dist/{chunk-MCJSS6SM.js → chunk-CQZSAR77.js} +1 -1
  68. package/dist/chunk-CQZSAR77.js.map +1 -0
  69. package/dist/{chunk-3SVAA3MA.js → chunk-DJ4VJIH5.js} +1 -1
  70. package/dist/chunk-DJ4VJIH5.js.map +1 -0
  71. package/dist/{chunk-XKBIYSSM.js → chunk-DTSPS2HV.js} +3 -3
  72. package/dist/chunk-DTSPS2HV.js.map +1 -0
  73. package/dist/{chunk-4QN75UHX.js → chunk-E7N67FYI.js} +8 -8
  74. package/dist/chunk-E7N67FYI.js.map +1 -0
  75. package/dist/{chunk-2QI7XV2T.js → chunk-FBVLEGEG.js} +1 -1
  76. package/dist/{chunk-2QI7XV2T.js.map → chunk-FBVLEGEG.js.map} +1 -1
  77. package/dist/{chunk-5RMIUJDI.js → chunk-FKCB5FTD.js} +1 -1
  78. package/dist/chunk-FKCB5FTD.js.map +1 -0
  79. package/dist/{chunk-EEPJGZJW.js → chunk-GPBRL2XR.js} +1 -1
  80. package/dist/chunk-GPBRL2XR.js.map +1 -0
  81. package/dist/{chunk-G3HCU7TA.js → chunk-GXE6KHTS.js} +1 -1
  82. package/dist/chunk-GXE6KHTS.js.map +1 -0
  83. package/dist/{chunk-65P3HJY3.js → chunk-HCOROIRT.js} +1 -1
  84. package/dist/chunk-HCOROIRT.js.map +1 -0
  85. package/dist/{chunk-54GSK2KK.js → chunk-HYTIHYNV.js} +2 -2
  86. package/dist/chunk-HYTIHYNV.js.map +1 -0
  87. package/dist/{chunk-5MG74GVQ.js → chunk-IG46XCZM.js} +3 -3
  88. package/dist/chunk-IG46XCZM.js.map +1 -0
  89. package/dist/{chunk-ND3XEGBE.js → chunk-JDEGS53O.js} +1 -1
  90. package/dist/chunk-JDEGS53O.js.map +1 -0
  91. package/dist/{chunk-7W5XSTUF.js → chunk-JML7WKWU.js} +1 -1
  92. package/dist/chunk-JML7WKWU.js.map +1 -0
  93. package/dist/{chunk-Q4TKVF3L.js → chunk-JTLYXUEV.js} +1 -1
  94. package/dist/chunk-JTLYXUEV.js.map +1 -0
  95. package/dist/{chunk-CCRVDLV3.js → chunk-JWBZ74TW.js} +2 -2
  96. package/dist/chunk-JWBZ74TW.js.map +1 -0
  97. package/dist/{chunk-ZU5GNSOJ.js → chunk-K3LIPKFV.js} +3 -3
  98. package/dist/chunk-K3LIPKFV.js.map +1 -0
  99. package/dist/{chunk-GQRL6VNU.js → chunk-LGBO24FL.js} +1 -1
  100. package/dist/chunk-LGBO24FL.js.map +1 -0
  101. package/dist/{chunk-SWUVTGMR.js → chunk-MEUNTJL5.js} +3 -3
  102. package/dist/{chunk-SWUVTGMR.js.map → chunk-MEUNTJL5.js.map} +1 -1
  103. package/dist/{chunk-YNALYIQ3.js → chunk-NLSSFLLS.js} +1 -1
  104. package/dist/chunk-NLSSFLLS.js.map +1 -0
  105. package/dist/{chunk-HFC4BTWJ.js → chunk-PTUMBMVH.js} +1 -1
  106. package/dist/chunk-PTUMBMVH.js.map +1 -0
  107. package/dist/{chunk-R4NOKZMD.js → chunk-ROLFDOMJ.js} +3 -3
  108. package/dist/{chunk-NYATNLRK.js → chunk-RT5RKAFX.js} +1 -1
  109. package/dist/chunk-RT5RKAFX.js.map +1 -0
  110. package/dist/{chunk-GNL3MG5J.js → chunk-S564OFTL.js} +2 -2
  111. package/dist/{chunk-GUSCYE3S.js → chunk-TQOFR6XY.js} +1 -1
  112. package/dist/chunk-TQOFR6XY.js.map +1 -0
  113. package/dist/{chunk-47C6PJCW.js → chunk-TZO3SOUL.js} +1 -1
  114. package/dist/chunk-TZO3SOUL.js.map +1 -0
  115. package/dist/{chunk-YGUNTIT5.js → chunk-UKTYKG57.js} +1 -1
  116. package/dist/chunk-UKTYKG57.js.map +1 -0
  117. package/dist/{chunk-23LUHHHN.js → chunk-VCOD5AOR.js} +1 -1
  118. package/dist/chunk-VCOD5AOR.js.map +1 -0
  119. package/dist/{chunk-5I72FRZY.js → chunk-VOJB7MVG.js} +2 -2
  120. package/dist/{chunk-XWJXZ6WE.js → chunk-VTWKH4YU.js} +2 -2
  121. package/dist/chunk-VTWKH4YU.js.map +1 -0
  122. package/dist/{chunk-4K7BZYO7.js → chunk-VWAEWOWK.js} +3 -3
  123. package/dist/chunk-VWAEWOWK.js.map +1 -0
  124. package/dist/{chunk-M2EBUDZ7.js → chunk-VWOPOLVO.js} +2 -2
  125. package/dist/chunk-VWOPOLVO.js.map +1 -0
  126. package/dist/{chunk-BN2USWIR.js → chunk-VYECQAGM.js} +2 -2
  127. package/dist/chunk-VYECQAGM.js.map +1 -0
  128. package/dist/{chunk-SIXYZ2FB.js → chunk-YJMCRXQQ.js} +1 -1
  129. package/dist/chunk-YJMCRXQQ.js.map +1 -0
  130. package/dist/{chunk-PJC4NXPA.js → chunk-YKBDH2UY.js} +3 -3
  131. package/dist/chunk-YKBDH2UY.js.map +1 -0
  132. package/dist/{chunk-XAWFPMAR.js → chunk-YKOM4ZLQ.js} +1 -1
  133. package/dist/chunk-YKOM4ZLQ.js.map +1 -0
  134. package/dist/{chunk-TKVJE63N.js → chunk-YRMLYFVR.js} +3 -3
  135. package/dist/chunk-YRMLYFVR.js.map +1 -0
  136. package/dist/{chunk-USYXHDKE.js → chunk-YZ6KQULN.js} +2 -2
  137. package/dist/{command-stack-B_-WNfZU.d.ts → command-stack-TNPWJCzW.d.ts} +14 -2
  138. package/dist/{completion-Kaqp_tWk.d.ts → completion-CvcNUz07.d.ts} +1 -1
  139. package/dist/config/index.d.ts +1 -1
  140. package/dist/{contract-KfqJh_au.d.ts → contract-TjB68uqA.d.ts} +17 -0
  141. package/dist/design-canvas/drizzle.d.ts +10 -2
  142. package/dist/design-canvas/drizzle.js.map +1 -1
  143. package/dist/design-canvas/index.d.ts +29 -11
  144. package/dist/design-canvas/index.js +1070 -17
  145. package/dist/design-canvas/index.js.map +1 -1
  146. package/dist/design-canvas-react/engine.d.ts +42 -6
  147. package/dist/design-canvas-react/engine.js +4 -4
  148. package/dist/design-canvas-react/index.d.ts +12 -7
  149. package/dist/design-canvas-react/index.js +11 -11
  150. package/dist/design-canvas-react/index.js.map +1 -1
  151. package/dist/design-canvas-react/lazy.d.ts +4 -4
  152. package/dist/design-canvas-react/lazy.js +1 -1
  153. package/dist/durable-chat/index.d.ts +46 -1
  154. package/dist/durable-chat/index.js +3 -3
  155. package/dist/eval/index.d.ts +1 -1
  156. package/dist/{export-presets-DAsU5Wal.d.ts → export-presets-mgVulRaV.d.ts} +10 -1
  157. package/dist/{flow-types-Cb_AblZs.d.ts → flow-types-CqomVAUN.d.ts} +1 -0
  158. package/dist/harness/index.d.ts +5 -0
  159. package/dist/harness/index.js +1 -1
  160. package/dist/index.d.ts +10 -18
  161. package/dist/index.js +30 -231
  162. package/dist/intakes/api.d.ts +3 -2
  163. package/dist/intakes/api.js +3 -3
  164. package/dist/intakes/api.js.map +1 -1
  165. package/dist/intakes/drizzle.d.ts +10 -2
  166. package/dist/intakes/drizzle.js +3 -3
  167. package/dist/intakes/drizzle.js.map +1 -1
  168. package/dist/intakes/index.d.ts +2 -2
  169. package/dist/intakes/index.js +2 -2
  170. package/dist/intakes-react/index.d.ts +2 -1
  171. package/dist/intakes-react/index.js +2 -2
  172. package/dist/intakes-react/lazy.d.ts +2 -1
  173. package/dist/intakes-react/lazy.js +1 -1
  174. package/dist/intakes-react/lazy.js.map +1 -1
  175. package/dist/integrations/index.d.ts +4 -0
  176. package/dist/integrations/index.js +1 -1
  177. package/dist/interactions/index.d.ts +13 -2
  178. package/dist/interactions/index.js +2 -2
  179. package/dist/{invitations-CZ5G2tIn.d.ts → invitations-DoYMvXea.d.ts} +11 -1
  180. package/dist/{invitations-schema-DaMO4hZE.d.ts → invitations-schema-_fI7HkJP.d.ts} +5 -1
  181. package/dist/knowledge/index.d.ts +2 -0
  182. package/dist/knowledge/index.js +1 -1
  183. package/dist/knowledge-loop/index.d.ts +4 -1
  184. package/dist/knowledge-loop/index.js +1 -1
  185. package/dist/{lazy-C7LiVeFt.d.ts → lazy-DrkVyDpe.d.ts} +2 -2
  186. package/dist/{mcp-BHfIoGLW.d.ts → mcp-BjPqQ-3C.d.ts} +4 -2
  187. package/dist/{mcp-rpc-DLw_r9PQ.d.ts → mcp-rpc-BfUOsalw.d.ts} +3 -0
  188. package/dist/missions/index.d.ts +25 -0
  189. package/dist/missions/index.js +1 -1
  190. package/dist/{model-Bzi5i63l.d.ts → model-C8U0HZxL.d.ts} +1 -0
  191. package/dist/{model-dF2h4xT9.d.ts → model-DmdkIteM.d.ts} +19 -0
  192. package/dist/{model-BBwyOuWG.d.ts → model-DnfO_PdJ.d.ts} +25 -1
  193. package/dist/model-resolution/index.d.ts +10 -0
  194. package/dist/model-resolution/index.js.map +1 -1
  195. package/dist/{operations-DLIvvD00.d.ts → operations-ByJ6yXOW.d.ts} +20 -2
  196. package/dist/{parts-1sRYSPjF.d.ts → parts-n9XUon0a.d.ts} +29 -1
  197. package/dist/plans/index.d.ts +6 -0
  198. package/dist/plans/index.js +1 -1
  199. package/dist/platform/index.d.ts +24 -2
  200. package/dist/platform/index.js +3 -3
  201. package/dist/platform/index.js.map +1 -1
  202. package/dist/preflight/index.d.ts +3 -0
  203. package/dist/preflight/index.js +1 -1
  204. package/dist/preset-cloudflare/index.d.ts +4 -1
  205. package/dist/preset-cloudflare/index.js +2 -2
  206. package/dist/redact/index.d.ts +5 -0
  207. package/dist/redact/index.js +1 -1
  208. package/dist/{roles-BC1n4t37.d.ts → roles-B4nU3jDi.d.ts} +12 -0
  209. package/dist/run/index.d.ts +3 -0
  210. package/dist/run/index.js +1 -1
  211. package/dist/run/index.js.map +1 -1
  212. package/dist/runtime/index.d.ts +11 -4
  213. package/dist/runtime/index.js +4 -4
  214. package/dist/sandbox/index.d.ts +96 -3
  215. package/dist/sandbox/index.js +6 -6
  216. package/dist/{sandbox-terminal-BIIC__CP.d.ts → sandbox-terminal-ChNEdHF8.d.ts} +5 -0
  217. package/dist/sequences/drizzle.d.ts +11 -1
  218. package/dist/sequences/drizzle.js +1 -1
  219. package/dist/sequences/drizzle.js.map +1 -1
  220. package/dist/sequences/index.d.ts +32 -7
  221. package/dist/sequences/index.js +1562 -47
  222. package/dist/sequences/index.js.map +1 -1
  223. package/dist/sequences-react/index.d.ts +32 -2
  224. package/dist/sequences-react/index.js +3 -3
  225. package/dist/sequences-react/index.js.map +1 -1
  226. package/dist/{sso-CNOsARMJ.d.ts → sso-Cm00S61u.d.ts} +13 -0
  227. package/dist/{stale-turn-lock-C8Na1cFZ.d.ts → stale-turn-lock-DucQzvXu.d.ts} +2 -0
  228. package/dist/store/index.d.ts +5 -0
  229. package/dist/store/index.js.map +1 -1
  230. package/dist/{store-gckrNq-g.d.ts → store-B7LLlk9p.d.ts} +22 -1
  231. package/dist/{store-CFyxgTlD.d.ts → store-CqfDtnPQ.d.ts} +8 -2
  232. package/dist/stream/index.d.ts +10 -4
  233. package/dist/stream/index.js +4 -4
  234. package/dist/{stream-normalizer-DWvtmY6F.d.ts → stream-normalizer-C3M--r6y.d.ts} +17 -1
  235. package/dist/studio/index.d.ts +37 -0
  236. package/dist/studio/index.js +1 -1
  237. package/dist/studio-react/index.d.ts +3 -0
  238. package/dist/studio-react/index.js +1 -1
  239. package/dist/studio-react/index.js.map +1 -1
  240. package/dist/tangle/index.d.ts +3 -0
  241. package/dist/tangle/index.js +1 -1
  242. package/dist/teams/drizzle.d.ts +8 -4
  243. package/dist/teams/drizzle.js +1 -1
  244. package/dist/teams/drizzle.js.map +1 -1
  245. package/dist/teams/index.d.ts +4 -2
  246. package/dist/teams/index.js +3 -3
  247. package/dist/teams/invitations-api.d.ts +10 -4
  248. package/dist/teams/invitations-api.js +4 -4
  249. package/dist/teams/invitations-api.js.map +1 -1
  250. package/dist/teams/members-api.d.ts +4 -2
  251. package/dist/teams/members-api.js +3 -3
  252. package/dist/teams/resend.d.ts +5 -4
  253. package/dist/teams/resend.js +1 -1
  254. package/dist/teams/resend.js.map +1 -1
  255. package/dist/teams-react/index.d.ts +7 -2
  256. package/dist/teams-react/index.js +3 -3
  257. package/dist/teams-react/lazy.d.ts +5 -2
  258. package/dist/teams-react/lazy.js +2 -2
  259. package/dist/teams-react/lazy.js.map +1 -1
  260. package/dist/theme/index.d.ts +2 -0
  261. package/dist/theme/index.js +1 -1
  262. package/dist/theme/tailwind-preset.d.ts +1 -0
  263. package/dist/theme/tailwind-preset.js.map +1 -1
  264. package/dist/theme-contract/cli.js +1 -1
  265. package/dist/theme-contract/index.d.ts +3 -0
  266. package/dist/theme-contract/index.js +1 -1
  267. package/dist/tools/index.d.ts +13 -6
  268. package/dist/tools/index.js +3 -3
  269. package/dist/trace/index.d.ts +6 -1
  270. package/dist/trace/index.js +2 -2
  271. package/dist/{turn-buffer-C9mEgoop.d.ts → turn-buffer-DGnAPKwa.d.ts} +6 -0
  272. package/dist/turn-stream/index.d.ts +28 -2
  273. package/dist/turn-stream/index.js +1 -1
  274. package/dist/turn-stream/index.js.map +1 -1
  275. package/dist/{types-BEOvc_ue.d.ts → types-CBRyqijY.d.ts} +10 -0
  276. package/dist/vault/index.d.ts +1 -1
  277. package/dist/vault/lazy.d.ts +3 -2
  278. package/dist/vault/lazy.js.map +1 -1
  279. package/dist/web/index.d.ts +4 -0
  280. package/dist/web/index.js +1 -1
  281. package/dist/web-react/index.d.ts +51 -8
  282. package/dist/web-react/index.js +9 -9
  283. package/dist/web-react/terminal.d.ts +2 -2
  284. package/dist/web-react/terminal.js +1 -1
  285. package/package.json +3 -2
  286. package/dist/DesignCanvas-5DJAFDNC.js +0 -12
  287. package/dist/DesignCanvasEditor-XUJZARSN.js +0 -13
  288. package/dist/IntakeInterview-WHVKMNQW.js +0 -8
  289. package/dist/InvitationsPanel-XUUWZBPV.js +0 -8
  290. package/dist/MembersPanel-FOVHWUQ3.js +0 -8
  291. package/dist/chunk-23LUHHHN.js.map +0 -1
  292. package/dist/chunk-3SVAA3MA.js.map +0 -1
  293. package/dist/chunk-47C6PJCW.js.map +0 -1
  294. package/dist/chunk-4K7BZYO7.js.map +0 -1
  295. package/dist/chunk-4QN75UHX.js.map +0 -1
  296. package/dist/chunk-54GSK2KK.js.map +0 -1
  297. package/dist/chunk-5MG74GVQ.js.map +0 -1
  298. package/dist/chunk-5PTGEJZL.js.map +0 -1
  299. package/dist/chunk-5RMIUJDI.js.map +0 -1
  300. package/dist/chunk-63CE7FEZ.js.map +0 -1
  301. package/dist/chunk-65P3HJY3.js.map +0 -1
  302. package/dist/chunk-6KVH5SP5.js.map +0 -1
  303. package/dist/chunk-7EVZUIHW.js.map +0 -1
  304. package/dist/chunk-7SUPA2YT.js.map +0 -1
  305. package/dist/chunk-7W5XSTUF.js.map +0 -1
  306. package/dist/chunk-BN2USWIR.js.map +0 -1
  307. package/dist/chunk-BQV42AFK.js.map +0 -1
  308. package/dist/chunk-CCRVDLV3.js.map +0 -1
  309. package/dist/chunk-EEPJGZJW.js.map +0 -1
  310. package/dist/chunk-G3HCU7TA.js.map +0 -1
  311. package/dist/chunk-GQRL6VNU.js.map +0 -1
  312. package/dist/chunk-GUSCYE3S.js.map +0 -1
  313. package/dist/chunk-H5FM75MR.js.map +0 -1
  314. package/dist/chunk-HFC4BTWJ.js.map +0 -1
  315. package/dist/chunk-HRJJH3RX.js.map +0 -1
  316. package/dist/chunk-K63OWUDJ.js.map +0 -1
  317. package/dist/chunk-L2TG5DBW.js.map +0 -1
  318. package/dist/chunk-M2EBUDZ7.js.map +0 -1
  319. package/dist/chunk-MCJSS6SM.js.map +0 -1
  320. package/dist/chunk-MFI4ZM7W.js.map +0 -1
  321. package/dist/chunk-MFRCM32T.js.map +0 -1
  322. package/dist/chunk-ND3XEGBE.js.map +0 -1
  323. package/dist/chunk-NEOV2NQ3.js +0 -1617
  324. package/dist/chunk-NEOV2NQ3.js.map +0 -1
  325. package/dist/chunk-NYATNLRK.js.map +0 -1
  326. package/dist/chunk-PJC4NXPA.js.map +0 -1
  327. package/dist/chunk-Q4TKVF3L.js.map +0 -1
  328. package/dist/chunk-RVUISYUE.js.map +0 -1
  329. package/dist/chunk-SIXYZ2FB.js.map +0 -1
  330. package/dist/chunk-TKVJE63N.js.map +0 -1
  331. package/dist/chunk-WEBBJBDH.js.map +0 -1
  332. package/dist/chunk-WFMUDX5J.js +0 -1092
  333. package/dist/chunk-WFMUDX5J.js.map +0 -1
  334. package/dist/chunk-XAWFPMAR.js.map +0 -1
  335. package/dist/chunk-XKBIYSSM.js.map +0 -1
  336. package/dist/chunk-XWJXZ6WE.js.map +0 -1
  337. package/dist/chunk-YGUNTIT5.js.map +0 -1
  338. package/dist/chunk-YNALYIQ3.js.map +0 -1
  339. package/dist/chunk-ZU5GNSOJ.js.map +0 -1
  340. package/dist/chunk-ZXNXAQAH.js.map +0 -1
  341. package/dist/chunk-ZYBWGSAZ.js.map +0 -1
  342. /package/dist/{DesignCanvas-5DJAFDNC.js.map → DesignCanvas-UNL34LS2.js.map} +0 -0
  343. /package/dist/{DesignCanvasEditor-XUJZARSN.js.map → DesignCanvasEditor-FJIVYOA2.js.map} +0 -0
  344. /package/dist/{IntakeInterview-WHVKMNQW.js.map → IntakeInterview-3ZIQMZS6.js.map} +0 -0
  345. /package/dist/{InvitationsPanel-XUUWZBPV.js.map → InvitationsPanel-CJ7DR4F7.js.map} +0 -0
  346. /package/dist/{MembersPanel-FOVHWUQ3.js.map → MembersPanel-BB4OD2KB.js.map} +0 -0
  347. /package/dist/{TimelineEditor-I35SJJAJ.js.map → TimelineEditor-2ECKSU6P.js.map} +0 -0
  348. /package/dist/{chunk-7C64WKAH.js.map → chunk-5SXS3YAB.js.map} +0 -0
  349. /package/dist/{chunk-R4NOKZMD.js.map → chunk-ROLFDOMJ.js.map} +0 -0
  350. /package/dist/{chunk-GNL3MG5J.js.map → chunk-S564OFTL.js.map} +0 -0
  351. /package/dist/{chunk-5I72FRZY.js.map → chunk-VOJB7MVG.js.map} +0 -0
  352. /package/dist/{chunk-USYXHDKE.js.map → chunk-YZ6KQULN.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../src/design-canvas/operations.ts","../../src/design-canvas/templates.ts","../../src/design-canvas/mcp-tools.ts","../../src/design-canvas/mcp-handler.ts","../../src/design-canvas/mcp-entry.ts"],"sourcesContent":["/**\n * The design-canvas operation union — the ONE mutation vocabulary shared by\n * the editor's command stack (human edits, undo/redo), the MCP tool\n * dispatcher (agent edits), and programmatic automation (template\n * instantiation, data sync). Every state change the editor can express is an\n * operation here; anything not expressible here does not happen to a\n * document. That closure is the automation contract: replaying a decision\n * log reproduces the document.\n *\n * Attribute patches are validated per element kind in ./validate before\n * ./apply mutates the document; both run server-side on every path.\n */\n\nimport type { NewPageOptions, PageBleed, PageGuides, SceneElement } from './model'\n\n/** Per-kind attribute patch. `kind` is immutable after creation; ids are\n * immutable always. Validation rejects attrs foreign to the target's kind. */\nexport type SceneAttrsPatch = Partial<Omit<SceneElement, 'id' | 'kind' | 'children'>> & {\n text?: string\n width?: number\n height?: number\n points?: number[]\n fill?: string\n stroke?: string\n strokeWidth?: number\n cornerRadius?: number\n dash?: number[]\n fontFamily?: string\n fontSize?: number\n fontStyle?: 'normal' | 'bold' | 'italic' | 'bold italic'\n align?: 'left' | 'center' | 'right'\n lineHeight?: number\n letterSpacing?: number\n src?: string\n posterSrc?: string\n fit?: 'fill' | 'cover' | 'contain'\n}\n\n/** Define an operation to add a scene element to a page with optional index and parent group */\nexport interface AddElementOperation {\n type: 'add_element'\n pageId: string\n /** Complete element including caller-minted id (reconciled like sequences\n * clips when the server re-mints). */\n element: SceneElement\n /** Insertion z-index; omitted → top. */\n index?: number\n /** Parent group; omitted → page root. */\n parentGroupId?: string\n}\n\n/** Define an operation to update attributes of a specific element on a page */\nexport interface SetAttrsOperation {\n type: 'set_attrs'\n pageId: string\n elementId: string\n attrs: SceneAttrsPatch\n}\n\n/** Resolve an operation to reorder an element within its current owner by specifying the target index */\nexport interface ReorderElementOperation {\n type: 'reorder_element'\n pageId: string\n elementId: string\n /** Target index within the element's CURRENT owner (page root or group). */\n toIndex: number\n}\n\n/** Resolve deletion of a specific element from a page by its identifiers */\nexport interface DeleteElementOperation {\n type: 'delete_element'\n pageId: string\n elementId: string\n}\n\n/** Group elements by grouping two or more sibling elements in their current z-order under a new group ID */\nexport interface GroupElementsOperation {\n type: 'group_elements'\n pageId: string\n /** ≥ 2 sibling elements (same owner); grouped in their current z-order. */\n elementIds: string[]\n /** Caller-minted id for the new group. */\n groupId: string\n name?: string\n}\n\n/** Resolve an operation to ungroup elements within a specified page and group context */\nexport interface UngroupElementOperation {\n type: 'ungroup_element'\n pageId: string\n groupId: string\n}\n\n/** Define an operation to add a new page with an optional position and caller-minted page ID */\nexport interface AddPageOperation {\n type: 'add_page'\n /** Caller-minted page id. */\n pageId: string\n options?: NewPageOptions\n /** Position in the page list; omitted → end. */\n index?: number\n}\n\n/** Define an operation to duplicate a page with a new caller-specified page ID */\nexport interface DuplicatePageOperation {\n type: 'duplicate_page'\n sourcePageId: string\n /** Caller-minted id for the copy; element ids are re-minted server-side. */\n pageId: string\n}\n\n/** Represent a delete page operation with a specified page identifier */\nexport interface DeletePageOperation {\n type: 'delete_page'\n pageId: string\n}\n\n/** Represent an operation to reorder a page by moving it to a specified index */\nexport interface ReorderPageOperation {\n type: 'reorder_page'\n pageId: string\n toIndex: number\n}\n\n/** Define an operation to set or update properties of a page including size, background, and bleed */\nexport interface SetPagePropsOperation {\n type: 'set_page_props'\n pageId: string\n name?: string\n width?: number\n height?: number\n background?: string\n /** null clears bleed; omitted leaves unchanged. */\n bleed?: PageBleed | null\n}\n\n/** Resolve an operation to set guides on a specific page by its identifier */\nexport interface SetPageGuidesOperation {\n type: 'set_page_guides'\n pageId: string\n guides: PageGuides\n}\n\n/** Define an operation to bind or unbind a unique slot to an element on a specific page */\nexport interface BindSlotOperation {\n type: 'bind_slot'\n pageId: string\n elementId: string\n /** null unbinds. Slot names are unique document-wide. */\n slot: string | null\n}\n\n/** Fill slots with data — text slots take strings, image/video slots take\n * src URLs. Unknown slot names throw; partial application is allowed. */\nexport interface ApplyDataOperation {\n type: 'apply_data'\n bindings: Record<string, string>\n}\n\n/** Define an operation to set the document title to a specified string */\nexport interface SetDocumentTitleOperation {\n type: 'set_document_title'\n title: string\n}\n\n/** Represent operations that modify scenes by adding, updating, reordering, grouping, or deleting elements and pages */\nexport type SceneOperation =\n | AddElementOperation\n | SetAttrsOperation\n | ReorderElementOperation\n | DeleteElementOperation\n | GroupElementsOperation\n | UngroupElementOperation\n | AddPageOperation\n | DuplicatePageOperation\n | DeletePageOperation\n | ReorderPageOperation\n | SetPagePropsOperation\n | SetPageGuidesOperation\n | BindSlotOperation\n | ApplyDataOperation\n | SetDocumentTitleOperation\n\n/** Define a plan summarizing a scene with its description and associated operations */\nexport interface ScenePlan {\n summary: string\n operations: SceneOperation[]\n}\n\n/** Extract the type property from a SceneOperation to represent its operation type */\nexport type SceneOperationType = SceneOperation['type']\n\n/** Define all valid operation types for scene manipulation in the application */\nexport const SCENE_OPERATION_TYPES: readonly SceneOperationType[] = [\n 'add_element',\n 'set_attrs',\n 'reorder_element',\n 'delete_element',\n 'group_elements',\n 'ungroup_element',\n 'add_page',\n 'duplicate_page',\n 'delete_page',\n 'reorder_page',\n 'set_page_props',\n 'set_page_guides',\n 'bind_slot',\n 'apply_data',\n 'set_document_title',\n] as const\n","/**\n * Template helpers for design-canvas documents. A template is any document\n * whose elements carry `slot` names — those slots define the fillable surface\n * that data sources and agents target. The helpers here are pure (no store,\n * no Konva) so they run server-side, in MCP tools, or in tests without a DOM.\n *\n * Binding semantics (shared with `apply_data` operation):\n * - text elements: binding value replaces `element.text`\n * - image/video elements: binding value replaces `element.src`\n * - rect/ellipse elements with a slot: binding value replaces `element.fill`\n * (color-slot convention — background swatch templates)\n * - line/group slots are reserved; binding them throws a loud error\n * Unknown binding keys (no matching slot) throw — callers must preflight with\n * `validateBindings` or accept that the throw is the signal to fix their data.\n */\n\nimport {\n SCENE_SCHEMA_VERSION,\n type SceneDocument,\n type SceneElement,\n type ScenePage,\n type SceneElementKind,\n collectSlots,\n} from './model'\n\n// ---------------------------------------------------------------------------\n// Slot surface\n// ---------------------------------------------------------------------------\n\n/** Define allowed string literals representing different slot fill kinds */\nexport type SlotFillKind = 'text' | 'src' | 'color'\n\n/** Define a slot template specifying its name, page, element, and fill characteristics */\nexport interface TemplateSlot {\n name: string\n pageId: string\n elementId: string\n elementKind: SceneElementKind\n fillKind: SlotFillKind\n}\n\n/**\n * Wraps `collectSlots` with kind-aware fill typing so callers know WHAT to\n * put in each slot without inspecting the element tree themselves.\n * Throws when duplicate slot names exist (propagated from collectSlots).\n */\nexport function listTemplateSlots(document: SceneDocument): TemplateSlot[] {\n const raw = collectSlots(document)\n const slots: TemplateSlot[] = []\n for (const [name, { pageId, elementId, kind }] of raw) {\n slots.push({ name, pageId, elementId, elementKind: kind, fillKind: fillKindForElementKind(kind) })\n }\n return slots\n}\n\nfunction fillKindForElementKind(kind: SceneElementKind): SlotFillKind {\n switch (kind) {\n case 'text': return 'text'\n case 'image':\n case 'video': return 'src'\n case 'rect':\n case 'ellipse': return 'color'\n case 'line':\n case 'group':\n throw new Error(\n `slot on \"${kind}\" element has no defined fill kind — bind_slot should not target line or group elements`,\n )\n }\n}\n\n// ---------------------------------------------------------------------------\n// Binding validation\n// ---------------------------------------------------------------------------\n\n/**\n * Preflight check: every key in `bindings` must name a slot in the document.\n * Returns a list of problems; an empty array means the bindings are clean.\n * Does NOT throw — designed to run before `instantiateTemplate` so callers\n * can surface a structured error instead of catching.\n */\nexport function validateBindings(\n document: SceneDocument,\n bindings: Record<string, string>,\n): string[] {\n const slots = collectSlots(document)\n const problems: string[] = []\n for (const key of Object.keys(bindings)) {\n if (!slots.has(key)) {\n problems.push(`binding key \"${key}\" does not match any slot in the document`)\n }\n }\n return problems\n}\n\n// ---------------------------------------------------------------------------\n// Template instantiation\n// ---------------------------------------------------------------------------\n\n/** Define options for instantiating a document with title, optional bindings, and custom id minting */\nexport interface InstantiateOptions {\n /** Human-readable title for the new document. */\n title: string\n /** Slot bindings to apply after id re-minting. Partial application allowed. */\n bindings?: Record<string, string>\n /**\n * Caller-supplied id factory — every page/element id in the source document\n * is replaced with a fresh value from this callback. The callback receives\n * the source id so implementations can build stable deterministic ids (e.g.\n * `crypto.randomUUID()` or `nanoid()` from the host).\n */\n mintId(sourceId: string): string\n}\n\n/**\n * Produces a new `SceneDocument` from a template:\n * 1. Re-mints every page and element id via `options.mintId` (slot *names* are\n * preserved so apply_data still targets them by name).\n * 2. Applies `options.bindings` with the same semantics as `apply_data`.\n * 3. Stamps `metadata.templateSourceId` with the source document's title so\n * the lineage is traceable without storing separate template provenance rows.\n *\n * Throws when bindings reference unknown slots (validated via `validateBindings`\n * before mutation so no partial state is possible).\n */\nexport function instantiateTemplate(\n document: SceneDocument,\n options: InstantiateOptions,\n): SceneDocument {\n const bindings = options.bindings ?? {}\n\n // Preflight — throw before touching the document tree\n const problems = validateBindings(document, bindings)\n if (problems.length > 0) {\n throw new Error(`template bindings are invalid:\\n${problems.map((p) => ` - ${p}`).join('\\n')}`)\n }\n\n // Build id mapping: sourceId → mintedId. Walk all page + element ids now so\n // group children can reference their parent's minted id during deep copy.\n const idMap = new Map<string, string>()\n const allocate = (sourceId: string): string => {\n if (idMap.has(sourceId)) return idMap.get(sourceId)!\n const minted = options.mintId(sourceId)\n idMap.set(sourceId, minted)\n return minted\n }\n\n for (const page of document.pages) {\n allocate(page.id)\n collectElementIds(page.elements, allocate)\n }\n\n // Deep-copy pages with re-minted ids\n const newPages: ScenePage[] = document.pages.map((page) => ({\n ...page,\n id: idMap.get(page.id)!,\n elements: copyElements(page.elements, idMap),\n }))\n\n const newDocument: SceneDocument = {\n schemaVersion: SCENE_SCHEMA_VERSION,\n title: options.title,\n pages: newPages,\n settings: { ...document.settings },\n metadata: {\n ...document.metadata,\n templateSourceId: document.title,\n },\n }\n\n // Apply bindings against the copied document (ids are now minted, slots preserved)\n return Object.keys(bindings).length > 0 ? applyBindings(newDocument, bindings) : newDocument\n}\n\n// ---------------------------------------------------------------------------\n// Binding application (shared with apply_data operation semantics)\n// ---------------------------------------------------------------------------\n\n/**\n * Applies slot bindings to a document in place (mutates a deep copy produced\n * by the caller). Unknown slot names throw — the preflight in `instantiateTemplate`\n * guarantees this is unreachable there; exported so the `apply_data` operation\n * handler can reuse it without duplicating the switch.\n */\nexport function applyBindingsToDocument(\n document: SceneDocument,\n bindings: Record<string, string>,\n): SceneDocument {\n const problems = validateBindings(document, bindings)\n if (problems.length > 0) {\n throw new Error(`apply_data bindings are invalid:\\n${problems.map((p) => ` - ${p}`).join('\\n')}`)\n }\n return applyBindings(document, bindings)\n}\n\n// Internal — called only after validateBindings passes\nfunction applyBindings(document: SceneDocument, bindings: Record<string, string>): SceneDocument {\n const slots = collectSlots(document)\n // Build a lookup: elementId → { slot, value } so the walk is O(elements)\n const targetMap = new Map<string, { slotName: string; value: string }>()\n for (const [slotName, { elementId }] of slots) {\n const value = bindings[slotName]\n if (value !== undefined) {\n targetMap.set(elementId, { slotName, value })\n }\n }\n\n const newPages: ScenePage[] = document.pages.map((page) => ({\n ...page,\n elements: applyBindingsToElements(page.elements, targetMap),\n }))\n\n return { ...document, pages: newPages }\n}\n\nfunction applyBindingsToElements(\n elements: SceneElement[],\n targetMap: Map<string, { slotName: string; value: string }>,\n): SceneElement[] {\n return elements.map((element) => {\n const target = targetMap.get(element.id)\n let updated = element\n\n if (target !== undefined) {\n updated = applyBindingToElement(element, target.value, target.slotName)\n }\n\n if (updated.kind === 'group') {\n return { ...updated, children: applyBindingsToElements(updated.children, targetMap) }\n }\n return updated\n })\n}\n\nfunction applyBindingToElement(element: SceneElement, value: string, slotName: string): SceneElement {\n switch (element.kind) {\n case 'text': return { ...element, text: value }\n case 'image': return { ...element, src: value }\n case 'video': return { ...element, src: value }\n case 'rect': return { ...element, fill: value }\n case 'ellipse': return { ...element, fill: value }\n case 'line':\n case 'group':\n throw new Error(\n `slot \"${slotName}\" on \"${element.kind}\" element cannot accept a binding — remove the slot or use a supported element kind`,\n )\n }\n}\n\n// ---------------------------------------------------------------------------\n// Deep copy helpers\n// ---------------------------------------------------------------------------\n\nfunction collectElementIds(elements: SceneElement[], allocate: (id: string) => string): void {\n for (const element of elements) {\n allocate(element.id)\n if (element.kind === 'group') collectElementIds(element.children, allocate)\n }\n}\n\nfunction copyElements(elements: SceneElement[], idMap: Map<string, string>): SceneElement[] {\n return elements.map((element) => copyElement(element, idMap))\n}\n\nfunction copyElement(element: SceneElement, idMap: Map<string, string>): SceneElement {\n const newId = idMap.get(element.id)\n if (newId === undefined) throw new Error(`element ${element.id} was not pre-allocated in the id map — this is a bug in instantiateTemplate`)\n const base = { ...element, id: newId }\n if (base.kind === 'group') {\n return { ...base, children: copyElements(base.children, idMap) }\n }\n return base\n}\n","/**\n * Design-canvas MCP tool registry — what the in-sandbox agent sees over the\n * live agent→canvas channel. Each entry carries an LLM-facing description, a\n * JSON Schema for the arguments, and the typed dispatch that validates the\n * resulting operations, applies them through the store, and records ONE\n * decision row per mutating call.\n *\n * Every mutation: validate → apply via storeApplyScenePlan → recordDecision.\n * Throws anywhere become isError results the model reads to correct its call.\n *\n * Convenience sugar tools (add_text, move_element, etc.) expand to the\n * underlying operation primitives before reaching the kernel — no separate\n * code path to drift.\n */\n\nimport { elementAabb, requirePage, SCENE_ELEMENT_KINDS } from './model'\nimport type {\n RectElement,\n EllipseElement,\n LineElement,\n TextElement,\n ImageElement,\n VideoElement,\n SceneDocument,\n SceneElement,\n ScenePage,\n} from './model'\nimport type { SceneOperation, ScenePlan } from './operations'\nimport type { SceneStore } from './store'\nimport { storeApplyScenePlan } from './apply'\nimport type { McpToolDefinition } from '../tools/mcp-rpc'\n\n// ---------------------------------------------------------------------------\n// Tool env\n// ---------------------------------------------------------------------------\n\n/** Define the environment for MCP tool with a scene store and ID minting function */\nexport interface DesignCanvasMcpToolEnv {\n store: SceneStore\n mintId: () => string\n}\n\n// ---------------------------------------------------------------------------\n// Argument readers — fail loud with name + expected type\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction requireString(args: Record<string, unknown>, name: string): string {\n const value = args[name]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${name} is required and must be a non-empty string`)\n }\n return value\n}\n\nfunction optionalString(args: Record<string, unknown>, name: string): string | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n if (typeof value !== 'string') throw new Error(`${name} must be a string when provided`)\n return value\n}\n\nfunction requireNumber(args: Record<string, unknown>, name: string): number {\n const value = args[name]\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`${name} is required and must be a finite number`)\n }\n return value\n}\n\nfunction optionalNumber(args: Record<string, unknown>, name: string): number | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`${name} must be a finite number when provided`)\n }\n return value\n}\n\nfunction optionalBoolean(args: Record<string, unknown>, name: string): boolean | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n if (typeof value !== 'boolean') throw new Error(`${name} must be a boolean when provided`)\n return value\n}\n\nfunction optionalNonNegativeInteger(args: Record<string, unknown>, name: string): number | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be a non-negative integer when provided`)\n }\n return value\n}\n\nfunction requireStringArray(args: Record<string, unknown>, name: string): string[] {\n const value = args[name]\n if (!Array.isArray(value) || value.length === 0 || value.some((v) => typeof v !== 'string')) {\n throw new Error(`${name} is required and must be a non-empty array of strings`)\n }\n return value as string[]\n}\n\nfunction optionalRecord(args: Record<string, unknown>, name: string): Record<string, string> | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n if (!isRecord(value) || Object.values(value).some((v) => typeof v !== 'string')) {\n throw new Error(`${name} must be an object mapping string keys to string values when provided`)\n }\n return value as Record<string, string>\n}\n\nfunction requireEnum<T extends string>(args: Record<string, unknown>, name: string, values: readonly T[]): T {\n const value = args[name]\n if (typeof value !== 'string' || !(values as readonly string[]).includes(value)) {\n throw new Error(`${name} must be one of: ${values.join(', ')}`)\n }\n return value as T\n}\n\nfunction optionalEnum<T extends string>(args: Record<string, unknown>, name: string, values: readonly T[]): T | undefined {\n const value = args[name]\n if (value === undefined || value === null) return undefined\n return requireEnum(args, name, values)\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/** Pick the first page id when the caller omits page_id. */\nfunction resolvePageId(document: SceneDocument, args: Record<string, unknown>): string {\n const pageId = optionalString(args, 'page_id')\n if (pageId) {\n requirePage(document, pageId)\n return pageId\n }\n const first = document.pages[0]\n if (!first) throw new Error('document has no pages')\n return first.id\n}\n\nfunction elementAabbRecord(el: SceneElement) {\n const aabb = elementAabb(el)\n return { x: aabb.x, y: aabb.y, width: aabb.width, height: aabb.height }\n}\n\nfunction pageSnapshot(page: ScenePage) {\n return {\n id: page.id,\n name: page.name,\n width: page.width,\n height: page.height,\n background: page.background,\n bleed: page.bleed,\n element_count: page.elements.length,\n elements: page.elements.map((el) => ({\n id: el.id,\n kind: el.kind,\n name: el.name,\n aabb: elementAabbRecord(el),\n rotation: el.rotation,\n opacity: el.opacity,\n locked: el.locked,\n visible: el.visible,\n ...(el.slot ? { slot: el.slot } : {}),\n })),\n }\n}\n\nasync function applyPlan(\n store: SceneStore,\n mintId: () => string,\n summary: string,\n operations: SceneOperation[],\n): Promise<{ rev: number; operation_count: number }> {\n const plan: ScenePlan = { summary, operations }\n const { record } = await storeApplyScenePlan(store, plan, { actorKind: 'agent_edit', mintId })\n return { rev: record.rev, operation_count: operations.length }\n}\n\n/** Collect slot→elementId mapping for a SINGLE page (no cross-page slot walk,\n * so duplicate slot names across different pages don't cause an error). */\nfunction collectPageSlotAttrs(page: ScenePage): Map<string, { elementId: string; kind: SceneElement['kind'] }> {\n const slots = new Map<string, { elementId: string; kind: SceneElement['kind'] }>()\n const stack = [...page.elements]\n while (stack.length > 0) {\n const el = stack.pop()!\n if (el.slot) {\n if (slots.has(el.slot)) {\n throw new Error(`duplicate slot name \"${el.slot}\" on page ${page.id}`)\n }\n slots.set(el.slot, { elementId: el.id, kind: el.kind })\n }\n if (el.kind === 'group') stack.push(...el.children)\n }\n return slots\n}\n\n\n// ---------------------------------------------------------------------------\n// JSON Schema helpers\n// ---------------------------------------------------------------------------\n\nfunction objectSchema(properties: Record<string, unknown>, required: string[]): Record<string, unknown> {\n return { type: 'object', properties, required, additionalProperties: false }\n}\n\nconst pageIdProp = { type: 'string', description: 'Page id to target. Omit to target the first page.' }\nconst elementIdProp = { type: 'string', description: 'Element id to target.' }\nconst xProp = { type: 'number', description: 'X position in page coordinates (px).' }\nconst yProp = { type: 'number', description: 'Y position in page coordinates (px).' }\nconst widthProp = { type: 'number', description: 'Width in px (must be > 0).' }\nconst heightProp = { type: 'number', description: 'Height in px (must be > 0).' }\nconst colorProp = (label: string) => ({ type: 'string', description: `${label} — hex (#rrggbb), rgb(), rgba(), or \"transparent\".` })\n\n// ---------------------------------------------------------------------------\n// Tool implementations\n// ---------------------------------------------------------------------------\n\n/** Provide a collection of MCP tool definitions for manipulating and querying the design canvas environment */\nconst CANVAS_MCP_TOOLS: McpToolDefinition<DesignCanvasMcpToolEnv>[] = [\n\n // ─── read ────────────────────────────────────────────────────────────────\n\n {\n name: 'get_scene_state',\n description:\n 'Read the full scene document: title, settings, all pages with dimensions and background, and every element with its axis-aligned bounding box (so you can reason about layout and overlap without rendering). Call this before editing to get real page and element ids.',\n inputSchema: objectSchema({}, []),\n async run(_args, env) {\n const { document, rev } = await env.store.getDocument()\n return {\n rev,\n title: document.title,\n schema_version: document.schemaVersion,\n settings: document.settings,\n pages: document.pages.map(pageSnapshot),\n }\n },\n },\n\n {\n name: 'describe_page',\n description:\n 'Read one page in detail: name, dimensions, background, bleed, guides, and every element with geometry, attributes, and slot bindings. Use this when you need attribute values (fill, font, src) the compact get_scene_state summary omits.',\n inputSchema: objectSchema(\n { page_id: pageIdProp },\n ['page_id'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const { document, rev } = await env.store.getDocument()\n const page = requirePage(document, pageId)\n return {\n rev,\n id: page.id,\n name: page.name,\n width: page.width,\n height: page.height,\n background: page.background,\n bleed: page.bleed,\n guides: page.guides,\n elements: page.elements.map((el) => ({ ...el, aabb: elementAabbRecord(el) })),\n }\n },\n },\n\n {\n name: 'list_decisions',\n description: 'List recent agent decisions recorded against this document. Useful to audit what the agent has already done this session.',\n inputSchema: objectSchema(\n { limit: { type: 'number', description: 'Max decisions to return (default 20, max 100).' } },\n [],\n ),\n async run(args, env) {\n const limitRaw = optionalNumber(args, 'limit') ?? 20\n const limit = Math.min(100, Math.max(1, Math.round(limitRaw)))\n const decisions = await env.store.listDecisions(limit)\n return { decisions }\n },\n },\n\n // ─── add convenience wrappers ─────────────────────────────────────────────\n\n {\n name: 'add_text',\n description:\n 'Place a text element on a page. The element id is minted server-side and returned. x/y are the top-left in page coordinates (px). width sets the wrap column; height derives from content at render time.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n text: { type: 'string', description: 'Initial text content.' },\n x: xProp,\n y: yProp,\n width: widthProp,\n font_size: { type: 'number', description: 'Font size in px (must be > 0). Default 24.' },\n font_family: { type: 'string', description: 'CSS font family. Default \"Inter\".' },\n font_style: { type: 'string', enum: ['normal', 'bold', 'italic', 'bold italic'], description: 'Default \"normal\".' },\n fill: colorProp('Text color. Default \"#000000\".'),\n align: { type: 'string', enum: ['left', 'center', 'right'], description: 'Default \"left\".' },\n line_height: { type: 'number', description: 'Line height multiplier. Default 1.2.' },\n letter_spacing: { type: 'number', description: 'Letter spacing in px. Default 0.' },\n name: { type: 'string', description: 'Layer name. Defaults to the first 32 chars of text.' },\n slot: { type: 'string', description: 'Template slot name — allows apply_data to replace this text programmatically.' },\n },\n ['text', 'x', 'y', 'width'],\n ),\n async run(args, env) {\n const { document } = await env.store.getDocument()\n const pageId = resolvePageId(document, args)\n const id = env.mintId()\n const text = requireString(args, 'text')\n const element: TextElement = {\n id,\n kind: 'text',\n name: optionalString(args, 'name') ?? text.slice(0, 32),\n x: requireNumber(args, 'x'),\n y: requireNumber(args, 'y'),\n width: requireNumber(args, 'width'),\n text,\n fontFamily: optionalString(args, 'font_family') ?? 'Inter',\n fontSize: optionalNumber(args, 'font_size') ?? 24,\n fontStyle: optionalEnum(args, 'font_style', ['normal', 'bold', 'italic', 'bold italic'] as const) ?? 'normal',\n fill: optionalString(args, 'fill') ?? '#000000',\n align: optionalEnum(args, 'align', ['left', 'center', 'right'] as const) ?? 'left',\n lineHeight: optionalNumber(args, 'line_height') ?? 1.2,\n letterSpacing: optionalNumber(args, 'letter_spacing') ?? 0,\n rotation: 0,\n opacity: 1,\n locked: false,\n visible: true,\n ...(() => { const s = optionalString(args, 'slot'); return s ? { slot: s } : {} })(),\n }\n const result = await applyPlan(env.store, env.mintId, `add text \"${text.slice(0, 40)}\"`, [\n { type: 'add_element', pageId, element },\n ])\n return { element_id: id, ...result }\n },\n },\n\n {\n name: 'add_image',\n description:\n 'Place an image element on a page. src must be an http(s) URL or a rooted /api/ path — never a data: blob. The element id is minted server-side and returned.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n src: { type: 'string', description: 'Image URL (https://...) or /api/ path.' },\n x: xProp,\n y: yProp,\n width: widthProp,\n height: heightProp,\n fit: { type: 'string', enum: ['fill', 'cover', 'contain'], description: 'How the source maps into the frame. Default \"cover\".' },\n name: { type: 'string', description: 'Layer name. Default \"Image\".' },\n slot: { type: 'string', description: 'Template slot name — allows apply_data to swap this image\\'s src.' },\n },\n ['src', 'x', 'y', 'width', 'height'],\n ),\n async run(args, env) {\n const { document } = await env.store.getDocument()\n const pageId = resolvePageId(document, args)\n const id = env.mintId()\n const element: ImageElement = {\n id,\n kind: 'image',\n name: optionalString(args, 'name') ?? 'Image',\n x: requireNumber(args, 'x'),\n y: requireNumber(args, 'y'),\n width: requireNumber(args, 'width'),\n height: requireNumber(args, 'height'),\n src: requireString(args, 'src'),\n fit: optionalEnum(args, 'fit', ['fill', 'cover', 'contain'] as const) ?? 'cover',\n rotation: 0,\n opacity: 1,\n locked: false,\n visible: true,\n ...(() => { const s = optionalString(args, 'slot'); return s ? { slot: s } : {} })(),\n }\n const result = await applyPlan(env.store, env.mintId, 'add image element', [\n { type: 'add_element', pageId, element },\n ])\n return { element_id: id, ...result }\n },\n },\n\n {\n name: 'add_shape',\n description:\n 'Place a geometric shape on a page. kind must be \"rect\", \"ellipse\", or \"line\". For line: provide points as a flat [x0,y0,x1,y1,...] array (relative to x,y); for rect/ellipse: provide width and height.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n kind: { type: 'string', enum: ['rect', 'ellipse', 'line'], description: 'Shape type.' },\n x: xProp,\n y: yProp,\n width: { type: 'number', description: 'Width in px (required for rect and ellipse).' },\n height: { type: 'number', description: 'Height in px (required for rect and ellipse).' },\n fill: colorProp('Fill color (rect/ellipse). Default \"#cccccc\".'),\n stroke: colorProp('Stroke/line color.'),\n stroke_width: { type: 'number', description: 'Stroke width in px.' },\n corner_radius: { type: 'number', description: 'Corner radius in px (rect only).' },\n points: {\n type: 'array',\n items: { type: 'number' },\n description: 'Flat [x0,y0,x1,y1,...] array for lines, relative to (x,y). Required for kind=\"line\".',\n },\n name: { type: 'string', description: 'Layer name.' },\n },\n ['kind', 'x', 'y'],\n ),\n async run(args, env) {\n const { document } = await env.store.getDocument()\n const pageId = resolvePageId(document, args)\n const id = env.mintId()\n const kind = requireEnum(args, 'kind', ['rect', 'ellipse', 'line'] as const)\n const x = requireNumber(args, 'x')\n const y = requireNumber(args, 'y')\n let element: SceneElement\n if (kind === 'rect') {\n const rect: RectElement = {\n id, kind, x, y,\n name: optionalString(args, 'name') ?? 'Rectangle',\n width: requireNumber(args, 'width'),\n height: requireNumber(args, 'height'),\n fill: optionalString(args, 'fill') ?? '#cccccc',\n rotation: 0, opacity: 1, locked: false, visible: true,\n ...(optionalString(args, 'stroke') ? { stroke: optionalString(args, 'stroke') } : {}),\n ...(optionalNumber(args, 'stroke_width') !== undefined ? { strokeWidth: optionalNumber(args, 'stroke_width') } : {}),\n ...(optionalNumber(args, 'corner_radius') !== undefined ? { cornerRadius: optionalNumber(args, 'corner_radius') } : {}),\n }\n element = rect\n } else if (kind === 'ellipse') {\n const ellipse: EllipseElement = {\n id, kind, x, y,\n name: optionalString(args, 'name') ?? 'Ellipse',\n width: requireNumber(args, 'width'),\n height: requireNumber(args, 'height'),\n fill: optionalString(args, 'fill') ?? '#cccccc',\n rotation: 0, opacity: 1, locked: false, visible: true,\n ...(optionalString(args, 'stroke') ? { stroke: optionalString(args, 'stroke') } : {}),\n ...(optionalNumber(args, 'stroke_width') !== undefined ? { strokeWidth: optionalNumber(args, 'stroke_width') } : {}),\n }\n element = ellipse\n } else {\n const rawPoints = args['points']\n if (!Array.isArray(rawPoints) || rawPoints.length < 4 || rawPoints.length % 2 !== 0) {\n throw new Error('points is required for kind=\"line\" and must be a flat [x0,y0,...] array with ≥ 2 points')\n }\n const points = rawPoints as number[]\n const line: LineElement = {\n id, kind, x, y, points,\n name: optionalString(args, 'name') ?? 'Line',\n stroke: optionalString(args, 'stroke') ?? '#000000',\n strokeWidth: optionalNumber(args, 'stroke_width') ?? 2,\n rotation: 0, opacity: 1, locked: false, visible: true,\n }\n element = line\n }\n const result = await applyPlan(env.store, env.mintId, `add ${kind} shape`, [\n { type: 'add_element', pageId, element },\n ])\n return { element_id: id, ...result }\n },\n },\n\n {\n name: 'add_video',\n description:\n 'Place a video element on a page. Video renders and exports as its poster frame — motion belongs to the sequences surface. src must be an http(s) URL or /api/ path.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n src: { type: 'string', description: 'Video URL (https://...) or /api/ path.' },\n x: xProp,\n y: yProp,\n width: widthProp,\n height: heightProp,\n poster_src: { type: 'string', description: 'Poster frame URL shown before render. Optional.' },\n name: { type: 'string', description: 'Layer name. Default \"Video\".' },\n },\n ['src', 'x', 'y', 'width', 'height'],\n ),\n async run(args, env) {\n const { document } = await env.store.getDocument()\n const pageId = resolvePageId(document, args)\n const id = env.mintId()\n const element: VideoElement = {\n id,\n kind: 'video',\n name: optionalString(args, 'name') ?? 'Video',\n x: requireNumber(args, 'x'),\n y: requireNumber(args, 'y'),\n width: requireNumber(args, 'width'),\n height: requireNumber(args, 'height'),\n src: requireString(args, 'src'),\n rotation: 0,\n opacity: 1,\n locked: false,\n visible: true,\n ...(() => { const s = optionalString(args, 'poster_src'); return s ? { posterSrc: s } : {} })(),\n }\n const result = await applyPlan(env.store, env.mintId, 'add video element', [\n { type: 'add_element', pageId, element },\n ])\n return { element_id: id, ...result }\n },\n },\n\n // ─── mutations ────────────────────────────────────────────────────────────\n\n {\n name: 'set_attrs',\n description:\n 'Set one or more attributes on an existing element. Only provide the attrs you want to change — omitted attributes are unchanged. Attempting to change kind or id is an error. For convenience transforms (x/y/width/height/rotation) prefer move_element, resize_element, or rotate_element.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n element_id: elementIdProp,\n attrs: {\n type: 'object',\n description: 'Attribute patch — any subset of the element\\'s mutable fields.',\n additionalProperties: true,\n },\n },\n ['page_id', 'element_id', 'attrs'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n if (!isRecord(args['attrs'])) throw new Error('attrs must be an object')\n const attrs = args['attrs'] as Record<string, unknown>\n const result = await applyPlan(env.store, env.mintId, `set attrs on ${elementId}`, [\n { type: 'set_attrs', pageId, elementId, attrs: attrs as import('./operations').SceneAttrsPatch },\n ])\n return result\n },\n },\n\n {\n name: 'move_element',\n description: 'Move an element to a new (x, y) position in page coordinates. Sugar for set_attrs({x, y}).',\n inputSchema: objectSchema(\n { page_id: pageIdProp, element_id: elementIdProp, x: xProp, y: yProp },\n ['page_id', 'element_id', 'x', 'y'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const x = requireNumber(args, 'x')\n const y = requireNumber(args, 'y')\n const result = await applyPlan(env.store, env.mintId, `move element ${elementId} to (${x}, ${y})`, [\n { type: 'set_attrs', pageId, elementId, attrs: { x, y } },\n ])\n return result\n },\n },\n\n {\n name: 'resize_element',\n description: 'Resize an element by setting its width and height. Sugar for set_attrs({width, height}). Not valid on lines (use set_attrs with points instead).',\n inputSchema: objectSchema(\n { page_id: pageIdProp, element_id: elementIdProp, width: widthProp, height: heightProp },\n ['page_id', 'element_id', 'width', 'height'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const width = requireNumber(args, 'width')\n const height = requireNumber(args, 'height')\n const result = await applyPlan(env.store, env.mintId, `resize element ${elementId} to ${width}×${height}`, [\n { type: 'set_attrs', pageId, elementId, attrs: { width, height } },\n ])\n return result\n },\n },\n\n {\n name: 'rotate_element',\n description: 'Set an element\\'s rotation in degrees (clockwise, about the element\\'s top-left origin). Sugar for set_attrs({rotation}).',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n element_id: elementIdProp,\n degrees: { type: 'number', description: 'Rotation in degrees (clockwise, 0–360 or negative).' },\n },\n ['page_id', 'element_id', 'degrees'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const rotation = requireNumber(args, 'degrees')\n const result = await applyPlan(env.store, env.mintId, `rotate element ${elementId} to ${rotation}°`, [\n { type: 'set_attrs', pageId, elementId, attrs: { rotation } },\n ])\n return result\n },\n },\n\n {\n name: 'reorder_element',\n description:\n 'Change an element\\'s z-order within its owner (page root or parent group). toIndex is 0-based within the owner\\'s element list: 0 = bottom, length-1 = top.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n element_id: elementIdProp,\n to_index: { type: 'number', description: '0-based target z-index within the element\\'s owner.' },\n },\n ['page_id', 'element_id', 'to_index'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const toIndex = optionalNonNegativeInteger(args, 'to_index') ?? 0\n const result = await applyPlan(env.store, env.mintId, `reorder element ${elementId} to index ${toIndex}`, [\n { type: 'reorder_element', pageId, elementId, toIndex },\n ])\n return result\n },\n },\n\n {\n name: 'delete_element',\n description: 'Permanently delete an element (and all its children if it is a group) from a page.',\n inputSchema: objectSchema(\n { page_id: pageIdProp, element_id: elementIdProp },\n ['page_id', 'element_id'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const result = await applyPlan(env.store, env.mintId, `delete element ${elementId}`, [\n { type: 'delete_element', pageId, elementId },\n ])\n return result\n },\n },\n\n {\n name: 'group_elements',\n description:\n 'Group 2+ sibling elements into a new group. Elements must share the same owner (page root or the same parent group). The group\\'s origin is set to the minimum bounding box of the members; children are rebased to group-local coordinates.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n element_ids: { type: 'array', items: { type: 'string' }, minItems: 2, description: '≥2 sibling element ids to group.' },\n name: { type: 'string', description: 'Layer name for the new group. Default \"Group\".' },\n },\n ['page_id', 'element_ids'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementIds = requireStringArray(args, 'element_ids')\n const groupId = env.mintId()\n const result = await applyPlan(env.store, env.mintId, `group ${elementIds.length} elements`, [\n { type: 'group_elements', pageId, elementIds, groupId, name: optionalString(args, 'name') },\n ])\n return { group_id: groupId, ...result }\n },\n },\n\n {\n name: 'ungroup_element',\n description: 'Dissolve a group, promoting its children to the group\\'s parent owner at page coordinates. The group element is removed.',\n inputSchema: objectSchema(\n { page_id: pageIdProp, group_id: { type: 'string', description: 'Id of the group element to ungroup.' } },\n ['page_id', 'group_id'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const groupId = requireString(args, 'group_id')\n const result = await applyPlan(env.store, env.mintId, `ungroup ${groupId}`, [\n { type: 'ungroup_element', pageId, groupId },\n ])\n return result\n },\n },\n\n // ─── page management ──────────────────────────────────────────────────────\n\n {\n name: 'add_page',\n description: 'Add a new blank page to the document. Returns the new page\\'s id.',\n inputSchema: objectSchema(\n {\n name: { type: 'string', description: 'Page name.' },\n width: { type: 'number', description: 'Width in px. Default 1080.' },\n height: { type: 'number', description: 'Height in px. Default 1080.' },\n background: colorProp('Page background. Default \"#ffffff\".'),\n index: { type: 'number', description: 'Position in the page list (0-based). Omit to append.' },\n },\n [],\n ),\n async run(args, env) {\n const pageId = env.mintId()\n const result = await applyPlan(env.store, env.mintId, 'add page', [\n {\n type: 'add_page',\n pageId,\n options: {\n name: optionalString(args, 'name'),\n width: optionalNumber(args, 'width'),\n height: optionalNumber(args, 'height'),\n background: optionalString(args, 'background'),\n },\n index: optionalNonNegativeInteger(args, 'index'),\n },\n ])\n return { page_id: pageId, ...result }\n },\n },\n\n {\n name: 'duplicate_page',\n description:\n 'Duplicate an existing page including all its elements. Element ids are re-minted server-side to avoid conflicts. Returns the new page\\'s id.',\n inputSchema: objectSchema(\n {\n source_page_id: { type: 'string', description: 'Page id to copy.' },\n },\n ['source_page_id'],\n ),\n async run(args, env) {\n const sourcePageId = requireString(args, 'source_page_id')\n const pageId = env.mintId()\n const result = await applyPlan(env.store, env.mintId, `duplicate page ${sourcePageId}`, [\n { type: 'duplicate_page', sourcePageId, pageId },\n ])\n return { page_id: pageId, ...result }\n },\n },\n\n {\n name: 'delete_page',\n description: 'Delete a page. Fails if the document has only one page.',\n inputSchema: objectSchema(\n { page_id: { type: 'string', description: 'Page id to delete.' } },\n ['page_id'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const result = await applyPlan(env.store, env.mintId, `delete page ${pageId}`, [\n { type: 'delete_page', pageId },\n ])\n return result\n },\n },\n\n {\n name: 'set_page_props',\n description: 'Update a page\\'s name, dimensions, background color, or bleed. Pass null for bleed to clear it. Omit fields you don\\'t want to change.',\n inputSchema: objectSchema(\n {\n page_id: { type: 'string', description: 'Page id to update.' },\n name: { type: 'string', description: 'New page name.' },\n width: { type: 'number', description: 'New width in px.' },\n height: { type: 'number', description: 'New height in px.' },\n background: colorProp('New background color.'),\n bleed: {\n type: 'object',\n description: 'Bleed extents in px drawn OUTSIDE the page trim edge. Pass null to clear bleed.',\n properties: {\n top: { type: 'number' },\n right: { type: 'number' },\n bottom: { type: 'number' },\n left: { type: 'number' },\n },\n required: ['top', 'right', 'bottom', 'left'],\n nullable: true,\n },\n },\n ['page_id'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n let bleed: { top: number; right: number; bottom: number; left: number } | null | undefined\n if ('bleed' in args) {\n if (args['bleed'] === null) {\n bleed = null\n } else if (isRecord(args['bleed'])) {\n const b = args['bleed']\n bleed = {\n top: requireNumber(b, 'top'),\n right: requireNumber(b, 'right'),\n bottom: requireNumber(b, 'bottom'),\n left: requireNumber(b, 'left'),\n }\n } else {\n throw new Error('bleed must be an object with top/right/bottom/left or null to clear')\n }\n }\n const result = await applyPlan(env.store, env.mintId, `set props on page ${pageId}`, [\n {\n type: 'set_page_props',\n pageId,\n name: optionalString(args, 'name'),\n width: optionalNumber(args, 'width'),\n height: optionalNumber(args, 'height'),\n background: optionalString(args, 'background'),\n ...(bleed !== undefined ? { bleed } : {}),\n },\n ])\n return result\n },\n },\n\n {\n name: 'set_page_guides',\n description: 'Set ruler guides on a page. Replaces ALL existing guides for that axis — pass the full updated arrays.',\n inputSchema: objectSchema(\n {\n page_id: { type: 'string', description: 'Page id to update.' },\n vertical: { type: 'array', items: { type: 'number' }, description: 'Vertical guide positions in page-coordinate px.' },\n horizontal: { type: 'array', items: { type: 'number' }, description: 'Horizontal guide positions in page-coordinate px.' },\n },\n ['page_id', 'vertical', 'horizontal'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n if (!Array.isArray(args['vertical'])) throw new Error('vertical must be an array of numbers')\n if (!Array.isArray(args['horizontal'])) throw new Error('horizontal must be an array of numbers')\n const vertical = args['vertical'] as number[]\n const horizontal = args['horizontal'] as number[]\n const result = await applyPlan(env.store, env.mintId, `set guides on page ${pageId}`, [\n { type: 'set_page_guides', pageId, guides: { vertical, horizontal } },\n ])\n return result\n },\n },\n\n // ─── template / data binding ──────────────────────────────────────────────\n\n {\n name: 'bind_slot',\n description:\n 'Bind or unbind a template slot name to an element. Slot names are unique document-wide. Text elements accept string data; image/video elements accept src URLs. Pass null for slot to unbind.',\n inputSchema: objectSchema(\n {\n page_id: pageIdProp,\n element_id: elementIdProp,\n slot: { type: ['string', 'null'], description: 'Slot name to bind, or null to unbind.' },\n },\n ['page_id', 'element_id', 'slot'],\n ),\n async run(args, env) {\n const pageId = requireString(args, 'page_id')\n const elementId = requireString(args, 'element_id')\n const slot = args['slot'] === null ? null : requireString(args, 'slot')\n const result = await applyPlan(env.store, env.mintId, `bind slot \"${slot}\" to ${elementId}`, [\n { type: 'bind_slot', pageId, elementId, slot },\n ])\n return result\n },\n },\n\n {\n name: 'apply_data',\n description:\n 'Fill template slots with data. bindings is a {slot_name: value} map. Text slots accept any string; image/video slots accept http(s) URLs or /api/ paths; unknown slot names throw. Partial application is allowed.',\n inputSchema: objectSchema(\n {\n bindings: {\n type: 'object',\n description: 'Map of slot name → value. Text slots: string. Image/video slots: URL.',\n additionalProperties: { type: 'string' },\n },\n },\n ['bindings'],\n ),\n async run(args, env) {\n if (!isRecord(args['bindings'])) throw new Error('bindings must be an object')\n const bindings = args['bindings'] as Record<string, string>\n const result = await applyPlan(env.store, env.mintId, `apply data to ${Object.keys(bindings).length} slots`, [\n { type: 'apply_data', bindings },\n ])\n return result\n },\n },\n\n {\n name: 'instantiate_template',\n description:\n 'Clone this document\\'s page(s) with freshly minted element ids and fill the declared slots with the provided data bindings in one atomic call. Use this to produce personalized copies of a template document without modifying the original. Returns the new page ids in order. Note: this mutates the SAME document by appending copies of the requested pages with re-minted ids and applying data — it does NOT create a separate document. After calling, the document contains both the original pages and the new copies.',\n inputSchema: objectSchema(\n {\n source_page_ids: {\n type: 'array',\n items: { type: 'string' },\n description: 'Page ids to clone. Omit to clone all pages.',\n },\n bindings: {\n type: 'object',\n description: 'Slot name → value map applied after cloning.',\n additionalProperties: { type: 'string' },\n },\n },\n [],\n ),\n async run(args, env) {\n const { document } = await env.store.getDocument()\n const rawSourceIds = Array.isArray(args['source_page_ids'])\n ? (args['source_page_ids'] as string[])\n : document.pages.map((p) => p.id)\n const bindings = optionalRecord(args, 'bindings') ?? {}\n if (rawSourceIds.length === 0) throw new Error('source_page_ids must not be empty')\n\n // Phase 1: for each source page, collect any slots to temporarily unbind\n // from the source before duplicating. apply_data's collectSlots() walks ALL\n // pages, so it throws on duplicate slot names when source and copy share the\n // same slot attribute. The strategy: unbind source slots → duplicate →\n // apply_data (only copy pages carry slots now) → re-bind source slots. All\n // four phases are one atomic applyPlan call.\n const unbindOps: SceneOperation[] = []\n const rebindOps: SceneOperation[] = []\n const dupOps: SceneOperation[] = []\n const newPageIds: string[] = []\n\n for (const sourcePageId of rawSourceIds) {\n const sourcePage = requirePage(document, sourcePageId)\n // Collect slots on the source page (single-page walk, no collision check).\n const sourceSlots = collectPageSlotAttrs(sourcePage)\n for (const [slotName, { elementId }] of sourceSlots) {\n unbindOps.push({ type: 'bind_slot', pageId: sourcePageId, elementId, slot: null })\n rebindOps.push({ type: 'bind_slot', pageId: sourcePageId, elementId, slot: slotName })\n }\n const pageId = env.mintId()\n newPageIds.push(pageId)\n dupOps.push({ type: 'duplicate_page', sourcePageId, pageId })\n }\n\n const applyDataOps: SceneOperation[] = Object.keys(bindings).length > 0\n ? [{ type: 'apply_data', bindings }]\n : []\n\n // Op ordering is critical: duplicate FIRST (copies inherit source slots),\n // then unbind source slots (sources now have no slots, copies still do),\n // then apply_data (only copy pages carry slots — no duplicate names),\n // then re-bind source slots (restore original state of source pages).\n const allOps: SceneOperation[] = [\n ...dupOps,\n ...unbindOps,\n ...applyDataOps,\n ...rebindOps,\n ]\n\n const result = await applyPlan(\n env.store,\n env.mintId,\n `instantiate template (${rawSourceIds.length} pages)`,\n allOps,\n )\n return { new_page_ids: newPageIds, ...result }\n },\n },\n\n // ─── exports ──────────────────────────────────────────────────────────────\n\n {\n name: 'create_export',\n description:\n 'Queue a document export. For \"png\" and \"jpeg\", a render job is queued and status starts as \"queued\" — the host renders the Konva canvas and uploads the result. For \"json\", the export completes immediately with the full document JSON in metadata. Returns the export record id and initial status.',\n inputSchema: objectSchema(\n {\n format: { type: 'string', enum: ['png', 'jpeg', 'json'], description: 'Export format.' },\n page_id: { type: 'string', description: 'Page to export. Omit to export all pages (first page for images).' },\n pixel_ratio: { type: 'number', description: 'Device pixel ratio for raster exports. Default 1.' },\n },\n ['format'],\n ),\n async run(args, env) {\n const format = requireEnum(args, 'format', ['png', 'jpeg', 'json'] as const)\n const pageId = optionalString(args, 'page_id')\n const pixelRatio = optionalNumber(args, 'pixel_ratio') ?? 1\n\n let metadata: Record<string, unknown> = {\n pageId: pageId ?? null,\n pixelRatio,\n }\n\n if (format === 'json') {\n const { document, rev } = await env.store.getDocument()\n metadata = { ...metadata, document, rev }\n }\n\n const exportRecord = await env.store.createExport(format, metadata)\n await env.store.recordDecision({\n kind: 'export',\n instruction: `create ${format} export${pageId ? ` for page ${pageId}` : ''}`,\n metadata: { tool: 'create_export', export_id: exportRecord.id, format },\n })\n return {\n export_id: exportRecord.id,\n format: exportRecord.format,\n status: exportRecord.status,\n metadata: exportRecord.metadata,\n created_at: exportRecord.createdAt,\n }\n },\n },\n]\n\nexport { CANVAS_MCP_TOOLS }\n\n/** Find the canvas MCP tool definition matching the given name or return undefined */\nexport function findCanvasMcpTool(\n name: string,\n): McpToolDefinition<DesignCanvasMcpToolEnv> | undefined {\n return CANVAS_MCP_TOOLS.find((tool) => tool.name === name)\n}\n\n/** Extract names of all tools from the CANVAS_MCP_TOOLS array */\nexport const CANVAS_MCP_TOOL_NAMES = CANVAS_MCP_TOOLS.map((t) => t.name)\n/** Provide a readonly array of string identifiers representing canvas element kinds */\nexport const CANVAS_ELEMENT_KINDS: readonly string[] = SCENE_ELEMENT_KINDS\n","/**\n * Streamable-HTTP MCP server for one design-canvas document — the live\n * agent→canvas channel. JSON-RPC 2.0 over POST, stateless per request\n * (Workers-compatible: no session table, no SSE).\n *\n * Trust boundary: the product authenticates the request (capability token,\n * workspace RBAC) BEFORE constructing the scoped {@link SceneStore} and\n * calling this handler — the handler trusts its store completely. Tool\n * execution failures (argument shape, validation, stale rev) become `isError`\n * tool results carrying the thrown message verbatim so the model can read WHY\n * and retry.\n *\n * The JSON-RPC envelope (initialize/ping/tools/list/tools/call, -32601) lives\n * in {@link createMcpToolHandler}; this module wires the canvas tool list +\n * the caller-supplied id-minting function.\n */\n\nimport type { SceneStore } from './store'\nimport { CANVAS_MCP_TOOLS } from './mcp-tools'\nimport type { DesignCanvasMcpToolEnv } from './mcp-tools'\nimport { createMcpToolHandler } from '../tools/mcp-rpc'\n\n/** Describe design canvas MCP server information including name and version */\nexport interface DesignCanvasMcpServerInfo {\n name: string\n version: string\n}\n\n/** Define options for creating a design canvas MCP handler including store, ID minting, and optional server info */\nexport interface CreateDesignCanvasMcpHandlerOptions {\n /** Already scoped + authorized for one (workspace, document, actor). */\n store: SceneStore\n /** Id-minting function threaded into every mutating tool. Must return\n * a string unique within the document scope — use crypto.randomUUID()\n * in production; a deterministic counter in tests. */\n mintId: () => string\n serverInfo?: DesignCanvasMcpServerInfo\n}\n\n/** Create a request handler for the design canvas MCP tool with specified options */\nexport function createDesignCanvasMcpHandler(\n opts: CreateDesignCanvasMcpHandlerOptions,\n): (request: Request) => Promise<Response> {\n const serverInfo = opts.serverInfo ?? { name: 'design-canvas', version: '1.0.0' }\n\n return createMcpToolHandler<DesignCanvasMcpToolEnv>({\n serverInfo,\n tools: CANVAS_MCP_TOOLS,\n buildEnv: (_request) => ({ store: opts.store, mintId: opts.mintId }),\n })\n}\n","/**\n * Profile entry for the design-canvas MCP server — what a product spreads\n * into its sandbox `AgentProfile.mcp` map so the in-sandbox agent gets the\n * live canvas channel. A thin wrapper over the shared `buildScopedMcpServerEntry`\n * mechanism (../tools/mcp): transport 'http', capability token in the\n * Authorization header (server-set, never a tool argument). The only\n * domain-specific values are this channel's default description and name.\n */\n\nimport { buildScopedMcpServerEntry } from '../tools/mcp'\nimport type { AppToolMcpServer, ScopedMcpServerEntryOptions } from '../tools/mcp'\n\n/** Describe the live visual asset editor capabilities for the current design document using CSS pixel coordinates */\nexport const DEFAULT_DESIGN_CANVAS_MCP_DESCRIPTION =\n 'Live visual asset editor for the current design document: read scene state, add/move/resize/delete elements, manage pages, bind template slots, apply data, and queue exports. All coordinates are CSS pixels.'\n\n/** Build scoped MCP server entry options for the design canvas environment */\nexport type BuildDesignCanvasMcpServerEntryOptions = ScopedMcpServerEntryOptions\n\n/** Build the `AgentProfileMcpServer`-shaped entry for the design-canvas channel. */\nexport function buildDesignCanvasMcpServerEntry(\n opts: BuildDesignCanvasMcpServerEntryOptions,\n): AppToolMcpServer {\n return buildScopedMcpServerEntry({\n ...opts,\n label: 'buildDesignCanvasMcpServerEntry',\n defaultDescription: DEFAULT_DESIGN_CANVAS_MCP_DESCRIPTION,\n })\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,12 @@
1
- import { d as SceneCommand, i as SnapTarget, g as SnapEngine, Z as ZoomPanMath } from '../command-stack-B_-WNfZU.js';
2
- export { A as ApplySceneResult, a as DesignCanvasMode, D as DesignCanvasProps, b as EditorSceneState, E as ExportTriggerOptions, S as SCENE_COMMAND_HISTORY_LIMIT, e as SceneCommandStack, f as SceneCommandStackWithReapply, h as SnapResult, j as SnapTargetKind, k as SnapTargets, c as createSceneCommandStack } from '../command-stack-B_-WNfZU.js';
3
- import { d as SceneElement, N as NewPageOptions, c as SceneDocument, a as PageGuides, P as PageBleed, B as Bounds, g as ScenePage } from '../model-BBwyOuWG.js';
4
- import { f as SceneAttrsPatch, g as SceneOperation } from '../operations-DLIvvD00.js';
5
- import { d as ExportCropRect, f as ExportPreset } from '../export-presets-DAsU5Wal.js';
6
- export { h as bleedAwareExportBounds, s as scaleForPreset } from '../export-presets-DAsU5Wal.js';
1
+ import { d as SceneCommand, i as SnapTarget, g as SnapEngine, Z as ZoomPanMath } from '../command-stack-TNPWJCzW.js';
2
+ export { A as ApplySceneResult, a as DesignCanvasMode, D as DesignCanvasProps, b as EditorSceneState, E as ExportTriggerOptions, S as SCENE_COMMAND_HISTORY_LIMIT, e as SceneCommandStack, f as SceneCommandStackWithReapply, h as SnapResult, j as SnapTargetKind, k as SnapTargets, c as createSceneCommandStack } from '../command-stack-TNPWJCzW.js';
3
+ import { a as SceneElement, N as NewPageOptions, c as SceneDocument, b as PageGuides, P as PageBleed, B as Bounds, S as ScenePage } from '../model-DnfO_PdJ.js';
4
+ import { h as SceneAttrsPatch, S as SceneOperation } from '../operations-ByJ6yXOW.js';
5
+ import { d as ExportCropRect, f as ExportPreset } from '../export-presets-mgVulRaV.js';
6
+ export { h as bleedAwareExportBounds, s as scaleForPreset } from '../export-presets-mgVulRaV.js';
7
7
  import '../theme/index.js';
8
8
 
9
+ /** Define input parameters for adding a scene element with optional index and parent group ID */
9
10
  interface AddElementInput {
10
11
  pageId: string;
11
12
  element: SceneElement;
@@ -14,7 +15,9 @@ interface AddElementInput {
14
15
  /** Parent group id; omitted → page root. */
15
16
  parentGroupId?: string;
16
17
  }
18
+ /** Create a command to add an element to a scene with optional positioning and grouping */
17
19
  declare function addElementCommand(input: AddElementInput): SceneCommand;
20
+ /** Define input parameters for setting element attributes within a specific page context */
18
21
  interface SetAttrsInput {
19
22
  pageId: string;
20
23
  elementId: string;
@@ -23,26 +26,34 @@ interface SetAttrsInput {
23
26
  /** Attribute values BEFORE the gesture began — inverse is built from these. */
24
27
  priorAttrs: SceneAttrsPatch;
25
28
  }
29
+ /** Create a command to set attributes on a scene element with undo capability */
26
30
  declare function setAttrsCommand(input: SetAttrsInput): SceneCommand;
31
+ /** Define an entry linking page and element IDs with current and prior scene attribute patches */
27
32
  interface MultiSetAttrsEntry {
28
33
  pageId: string;
29
34
  elementId: string;
30
35
  attrs: SceneAttrsPatch;
31
36
  priorAttrs: SceneAttrsPatch;
32
37
  }
38
+ /** Build a scene command to set multiple attributes on elements across pages */
33
39
  declare function multiSetAttrsCommand(entries: MultiSetAttrsEntry[]): SceneCommand;
40
+ /** Define input parameters to reorder an element within a page */
34
41
  interface ReorderElementInput {
35
42
  pageId: string;
36
43
  elementId: string;
37
44
  toIndex: number;
38
45
  }
46
+ /** Resolve a command to reorder an element within a scene by moving it to a specified index */
39
47
  declare function reorderElementCommand(input: ReorderElementInput): SceneCommand;
48
+ /** Define input parameters required to delete an element from a specific page in a document */
40
49
  interface DeleteElementInput {
41
50
  document: SceneDocument;
42
51
  pageId: string;
43
52
  elementId: string;
44
53
  }
54
+ /** Resolve a command to delete an element from a specified page in the document */
45
55
  declare function deleteElementCommand(input: DeleteElementInput): SceneCommand;
56
+ /** Define input parameters for grouping elements within a scene document on a specific page */
46
57
  interface GroupElementsInput {
47
58
  document: SceneDocument;
48
59
  pageId: string;
@@ -50,36 +61,48 @@ interface GroupElementsInput {
50
61
  groupId: string;
51
62
  name?: string;
52
63
  }
64
+ /** Create a command to group multiple elements into a single group within a scene */
53
65
  declare function groupElementsCommand(input: GroupElementsInput): SceneCommand;
66
+ /** Define input parameters required to ungroup elements within a specific page and group */
54
67
  interface UngroupElementInput {
55
68
  document: SceneDocument;
56
69
  pageId: string;
57
70
  groupId: string;
58
71
  }
72
+ /** Resolve a command to ungroup a group element into its child elements within a scene */
59
73
  declare function ungroupElementCommand(input: UngroupElementInput): SceneCommand;
74
+ /** Define input parameters for adding a new page with optional settings and position index */
60
75
  interface AddPageInput {
61
76
  pageId: string;
62
77
  options?: NewPageOptions;
63
78
  index?: number;
64
79
  }
80
+ /** Create a command to add a page with optional settings and index in the scene */
65
81
  declare function addPageCommand(input: AddPageInput): SceneCommand;
82
+ /** Define input parameters required to duplicate a page within a scene document */
66
83
  interface DuplicatePageInput {
67
84
  document: SceneDocument;
68
85
  sourcePageId: string;
69
86
  /** Caller-minted id for the copy. */
70
87
  pageId: string;
71
88
  }
89
+ /** Create a command to duplicate a page and prepare its deletion operation in the scene */
72
90
  declare function duplicatePageCommand(input: DuplicatePageInput): SceneCommand;
91
+ /** Define input parameters required to delete a page from a scene document */
73
92
  interface DeletePageInput {
74
93
  document: SceneDocument;
75
94
  pageId: string;
76
95
  }
96
+ /** Delete a page from a document ensuring it is not the last remaining page */
77
97
  declare function deletePageCommand(input: DeletePageInput): SceneCommand;
98
+ /** Define input parameters to reorder a page by specifying its ID and target index */
78
99
  interface ReorderPageInput {
79
100
  pageId: string;
80
101
  toIndex: number;
81
102
  }
103
+ /** Create a command to reorder a page to a specified index within a scene */
82
104
  declare function reorderPageCommand(input: ReorderPageInput): SceneCommand;
105
+ /** Define input parameters for setting properties on a specific page within a scene document */
83
106
  interface SetPagePropsInput {
84
107
  document: SceneDocument;
85
108
  pageId: string;
@@ -91,24 +114,31 @@ interface SetPagePropsInput {
91
114
  bleed?: PageBleed | null;
92
115
  };
93
116
  }
117
+ /** Build a command to update page properties based on the provided input */
94
118
  declare function setPagePropsCommand(input: SetPagePropsInput): SceneCommand;
119
+ /** Define input parameters for setting guides on a specific page within a document */
95
120
  interface SetPageGuidesInput {
96
121
  document: SceneDocument;
97
122
  pageId: string;
98
123
  guides: PageGuides;
99
124
  }
125
+ /** Create a command to update page guides with undo support */
100
126
  declare function setPageGuidesCommand(input: SetPageGuidesInput): SceneCommand;
127
+ /** Define input parameters for binding a slot within a scene document element */
101
128
  interface BindSlotInput {
102
129
  document: SceneDocument;
103
130
  pageId: string;
104
131
  elementId: string;
105
132
  slot: string | null;
106
133
  }
134
+ /** Bind a slot to an element within a page and generate the corresponding scene command */
107
135
  declare function bindSlotCommand(input: BindSlotInput): SceneCommand;
136
+ /** Define input parameters for setting the title of a scene document */
108
137
  interface SetDocumentTitleInput {
109
138
  document: SceneDocument;
110
139
  title: string;
111
140
  }
141
+ /** Resolve a command to rename a document title with undo and redo operations */
112
142
  declare function setDocumentTitleCommand(input: SetDocumentTitleInput): SceneCommand;
113
143
 
114
144
  /**
@@ -125,6 +155,7 @@ declare function setDocumentTitleCommand(input: SetDocumentTitleInput): SceneCom
125
155
  * the same priority the first in iteration order wins.
126
156
  */
127
157
 
158
+ /** Build a SnapEngine instance to manage snapping targets and behavior within an editor scene */
128
159
  declare function createSnapEngine(): SnapEngine;
129
160
  /** Generate grid line targets within a neighborhood around the moving bounds.
130
161
  * Call this and append to `SnapTargets.vertical`/`horizontal` before
@@ -162,6 +193,7 @@ declare function collectGridTargets(bounds: Bounds, gridSize: number, page: Scen
162
193
  * operate on the group as a unit. Locked and invisible elements never hit.
163
194
  */
164
195
  declare function hitTestPoint(page: ScenePage, x: number, y: number): string | null;
196
+ /** Define options to configure marquee selection behavior including containment requirements */
165
197
  interface MarqueeSelectOptions {
166
198
  /** When true, the element's AABB must be fully inside the marquee; default is
167
199
  * intersection (any overlap selects). */
@@ -170,6 +202,7 @@ interface MarqueeSelectOptions {
170
202
  /** Returns the ids of selectable elements on `page` whose AABB intersects (or
171
203
  * is contained by) `rect`. Locked and invisible elements are excluded. */
172
204
  declare function marqueeSelect(page: ScenePage, rect: Bounds, opts?: MarqueeSelectOptions): string[];
205
+ /** Represent horizontal and vertical displacement values for nudging elements */
173
206
  interface NudgeDelta {
174
207
  dx: number;
175
208
  dy: number;
@@ -192,10 +225,12 @@ declare const DUPLICATE_OFFSET: NudgeDelta;
192
225
  * This module is pure math — no DOM, no Konva, no React.
193
226
  */
194
227
 
228
+ /** Define configuration options for minimum and maximum zoom levels in a zoom-pan interface */
195
229
  interface ZoomPanConfig {
196
230
  minZoom: number;
197
231
  maxZoom: number;
198
232
  }
233
+ /** Create zoom and pan math utilities enforcing valid zoom range constraints */
199
234
  declare function createZoomPanMath(config: ZoomPanConfig): ZoomPanMath;
200
235
 
201
236
  /**
@@ -211,6 +246,7 @@ declare function createZoomPanMath(config: ZoomPanConfig): ZoomPanMath;
211
246
  * selection indicators, rulers, bleed guides). The transformer node is
212
247
  * identified by its canonical name 'Transformer'. */
213
248
  declare function isExportHiddenNodeName(name: string): boolean;
249
+ /** Define parameters required to resolve export settings including crop, pixel ratio, type, and quality */
214
250
  interface ResolvedExportParams {
215
251
  cropRect: ExportCropRect;
216
252
  pixelRatio: number;
@@ -18,7 +18,7 @@ import {
18
18
  mintElementId,
19
19
  nudgeDelta,
20
20
  resolveExportParams
21
- } from "../chunk-BN2USWIR.js";
21
+ } from "../chunk-VYECQAGM.js";
22
22
  import {
23
23
  SCENE_COMMAND_HISTORY_LIMIT,
24
24
  addElementCommand,
@@ -37,12 +37,12 @@ import {
37
37
  setPageGuidesCommand,
38
38
  setPagePropsCommand,
39
39
  ungroupElementCommand
40
- } from "../chunk-XWJXZ6WE.js";
40
+ } from "../chunk-VTWKH4YU.js";
41
41
  import {
42
42
  bleedAwareExportBounds,
43
43
  scaleForPreset
44
- } from "../chunk-M2EBUDZ7.js";
45
- import "../chunk-HFC4BTWJ.js";
44
+ } from "../chunk-VWOPOLVO.js";
45
+ import "../chunk-PTUMBMVH.js";
46
46
  export {
47
47
  DEFAULT_INSERT_TEMPLATES,
48
48
  DUPLICATE_OFFSET,
@@ -1,14 +1,14 @@
1
- import { D as DesignCanvasProps, c as createSceneCommandStack, E as ExportTriggerOptions, a as DesignCanvasMode } from '../command-stack-B_-WNfZU.js';
2
- export { A as ApplySceneResult, b as EditorSceneState, S as SCENE_COMMAND_HISTORY_LIMIT, d as SceneCommand, e as SceneCommandStack, f as SceneCommandStackWithReapply, g as SnapEngine, h as SnapResult, i as SnapTarget, j as SnapTargetKind, k as SnapTargets, Z as ZoomPanMath } from '../command-stack-B_-WNfZU.js';
1
+ import { D as DesignCanvasProps, c as createSceneCommandStack, E as ExportTriggerOptions, a as DesignCanvasMode } from '../command-stack-TNPWJCzW.js';
2
+ export { A as ApplySceneResult, b as EditorSceneState, S as SCENE_COMMAND_HISTORY_LIMIT, d as SceneCommand, e as SceneCommandStack, f as SceneCommandStackWithReapply, g as SnapEngine, h as SnapResult, i as SnapTarget, j as SnapTargetKind, k as SnapTargets, Z as ZoomPanMath } from '../command-stack-TNPWJCzW.js';
3
3
  import { InsertPageGeometry, InsertTemplate, MultiSetAttrsEntry } from './engine.js';
4
4
  export { AddElementInput, AddPageInput, BindSlotInput, DEFAULT_INSERT_TEMPLATES, DUPLICATE_OFFSET, DeleteElementInput, DeletePageInput, DuplicatePageInput, ExportViewSnapshot, GroupElementsInput, MAX_INSERT_DIMENSION, MarqueeSelectOptions, NudgeDelta, ReorderElementInput, ReorderPageInput, ResolvedExportParams, SetAttrsInput, SetDocumentTitleInput, SetPageGuidesInput, SetPagePropsInput, UngroupElementInput, ZoomPanConfig, addElementCommand, addPageCommand, bindSlotCommand, buildInsertImageOp, centeredPosition, collectGridTargets, createSnapEngine, createZoomPanMath, deleteElementCommand, deletePageCommand, documentCropToStageCoords, duplicatePageCommand, fittedSize, groupElementsCommand, hitTestPoint, identifyTaintedSrc, isCrossOriginSrc, isExportHiddenNodeName, marqueeSelect, mintElementId, multiSetAttrsCommand, nudgeDelta, reorderElementCommand, reorderPageCommand, resolveExportParams, setAttrsCommand, setDocumentTitleCommand, setPageGuidesCommand, setPagePropsCommand, ungroupElementCommand } from './engine.js';
5
- import { c as SceneDocument, g as ScenePage, d as SceneElement, P as PageBleed, a as PageGuides } from '../model-BBwyOuWG.js';
6
- import { f as ExportPreset } from '../export-presets-DAsU5Wal.js';
7
- export { d as ExportCropRect, h as bleedAwareExportBounds, s as scaleForPreset } from '../export-presets-DAsU5Wal.js';
8
- export { D as DesignCanvas, a as DesignCanvasChromeLazy, b as DesignCanvasEditor, c as DesignCanvasFullProps, d as DesignCanvasLazy } from '../lazy-C7LiVeFt.js';
5
+ import { c as SceneDocument, S as ScenePage, a as SceneElement, P as PageBleed, b as PageGuides } from '../model-DnfO_PdJ.js';
6
+ import { f as ExportPreset } from '../export-presets-mgVulRaV.js';
7
+ export { d as ExportCropRect, h as bleedAwareExportBounds, s as scaleForPreset } from '../export-presets-mgVulRaV.js';
8
+ export { D as DesignCanvas, a as DesignCanvasChromeLazy, b as DesignCanvasEditor, c as DesignCanvasFullProps, d as DesignCanvasLazy } from '../lazy-DrkVyDpe.js';
9
9
  import * as react from 'react';
10
10
  import { ButtonHTMLAttributes } from 'react';
11
- import { g as SceneOperation, f as SceneAttrsPatch } from '../operations-DLIvvD00.js';
11
+ import { S as SceneOperation, h as SceneAttrsPatch } from '../operations-ByJ6yXOW.js';
12
12
  import { CanvasRenderPalette } from '../theme/index.js';
13
13
  import Konva from 'konva';
14
14
 
@@ -51,6 +51,7 @@ interface KonvaStageLike {
51
51
  height: number;
52
52
  }): string;
53
53
  }
54
+ /** Define options to export a page as a data URL with format, pixel ratio, bleed, and preset settings */
54
55
  interface ExportPageDataUrlOptions {
55
56
  format: 'png' | 'jpeg';
56
57
  pixelRatio?: number;
@@ -423,6 +424,7 @@ declare function Rulers({ pageWidth, pageHeight, zoom, scrollLeft, scrollTop, sh
423
424
  * depth, and selection math can be unit-tested independently of React.
424
425
  */
425
426
 
427
+ /** Describe a layer row with its element, depth, grouping, ownership, and parent group details */
426
428
  interface LayerRow {
427
429
  element: SceneElement;
428
430
  depth: number;
@@ -472,6 +474,7 @@ interface TransformerNode {
472
474
  scaleY: number;
473
475
  rotation: number;
474
476
  }
477
+ /** Define baked node attributes including position, size, and rotation with collapsed scale */
475
478
  interface BakedNodeAttrs {
476
479
  x: number;
477
480
  y: number;
@@ -527,6 +530,7 @@ declare function bakeTextTransform(node: TransformerNode & {
527
530
  * screen pixels apart. The step table covers typical design zoom ranges; beyond
528
531
  * the table the step grows by doubling the last candidate.
529
532
  */
533
+ /** Define spacing and visibility rules for major and minor ticks in a coordinate system */
530
534
  interface TickStep {
531
535
  /** Document-coordinate step between major ticks. */
532
536
  major: number;
@@ -547,6 +551,7 @@ declare function selectTickStep(input: {
547
551
  minMajorSpacingPx?: number;
548
552
  minMinorSpacingPx?: number;
549
553
  }): TickStep;
554
+ /** Define a ruler tick with a position and optional label for measurement markings */
550
555
  interface RulerTick {
551
556
  /** Position in document coordinates. */
552
557
  position: number;
@@ -12,7 +12,7 @@ import {
12
12
  downloadDataUrl,
13
13
  exportDocumentJson,
14
14
  exportPageDataUrl
15
- } from "../chunk-4QN75UHX.js";
15
+ } from "../chunk-E7N67FYI.js";
16
16
  import {
17
17
  BTN,
18
18
  BTN_ACTIVE,
@@ -41,7 +41,7 @@ import {
41
41
  buildRulerTicks,
42
42
  formatRulerLabel,
43
43
  selectTickStep
44
- } from "../chunk-H5FM75MR.js";
44
+ } from "../chunk-22GLESKE.js";
45
45
  import "../chunk-ZN5J47UX.js";
46
46
  import {
47
47
  DEFAULT_INSERT_TEMPLATES,
@@ -62,7 +62,7 @@ import {
62
62
  mintElementId,
63
63
  nudgeDelta,
64
64
  resolveExportParams
65
- } from "../chunk-BN2USWIR.js";
65
+ } from "../chunk-VYECQAGM.js";
66
66
  import {
67
67
  SCENE_COMMAND_HISTORY_LIMIT,
68
68
  addElementCommand,
@@ -81,18 +81,18 @@ import {
81
81
  setPageGuidesCommand,
82
82
  setPagePropsCommand,
83
83
  ungroupElementCommand
84
- } from "../chunk-XWJXZ6WE.js";
85
- import {
86
- DesignCanvasChromeLazy,
87
- DesignCanvasLazy
88
- } from "../chunk-R4NOKZMD.js";
89
- import "../chunk-47C6PJCW.js";
84
+ } from "../chunk-VTWKH4YU.js";
90
85
  import {
91
86
  assertSceneMediaSrc,
92
87
  bleedAwareExportBounds,
93
88
  scaleForPreset
94
- } from "../chunk-M2EBUDZ7.js";
95
- import "../chunk-HFC4BTWJ.js";
89
+ } from "../chunk-VWOPOLVO.js";
90
+ import {
91
+ DesignCanvasChromeLazy,
92
+ DesignCanvasLazy
93
+ } from "../chunk-ROLFDOMJ.js";
94
+ import "../chunk-TZO3SOUL.js";
95
+ import "../chunk-PTUMBMVH.js";
96
96
 
97
97
  // src/design-canvas-react/components/CanvasInsertPanel.tsx
98
98
  import { useEffect, useRef, useState } from "react";