@tangle-network/agent-app 0.43.56 → 0.43.57

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":["../../src/sequences/schema.ts","../../src/sequences/drizzle-store.ts"],"sourcesContent":["/**\n * Drizzle schema factory for the sequence tables. The product owns the\n * workspace/user (and optionally generation/asset) tables; the factory wires\n * the sequence tables' foreign keys into them so the whole graph lives in one\n * drizzle schema with real cascade semantics. Column names, types, defaults,\n * enums, and indexes mirror creative-agent's hand-rolled tables so a product\n * with those tables can adopt the factory without rewriting rows.\n *\n * `sequence_clip.text` / `sequence_clip.language` hold caption bodies inline\n * (nullable; only caption-track clips use them) — adopting products add the\n * two columns with a plain ALTER TABLE.\n *\n * When `generationTable`/`assetTable` are omitted the `generation_id` /\n * `asset_id` columns stay plain text (no FK): products without those tables\n * still get opaque reference columns the store round-trips untouched.\n */\n\nimport { sql } from 'drizzle-orm'\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport type { AnySQLiteColumn, AnySQLiteTable } from 'drizzle-orm/sqlite-core'\n\n/** A product table referenced by FK — only the `id` column is touched. */\nexport type SequenceParentTable = AnySQLiteTable & { id: AnySQLiteColumn }\n\nexport interface CreateSequenceTablesOptions {\n workspaceTable: SequenceParentTable\n userTable: SequenceParentTable\n generationTable?: SequenceParentTable\n assetTable?: SequenceParentTable\n}\n\nconst hexId = () => text('id').primaryKey().default(sql`(lower(hex(randomblob(16))))`)\n\nconst jsonMetadata = () => text('metadata', { mode: 'json' }).$type<Record<string, unknown>>().default({})\n\nconst createdAt = () => integer('created_at', { mode: 'timestamp' }).notNull().default(sql`(unixepoch())`)\n\nconst updatedAt = () => integer('updated_at', { mode: 'timestamp' }).notNull().default(sql`(unixepoch())`)\n\nexport function createSequenceTables(opts: CreateSequenceTablesOptions) {\n const { workspaceTable, userTable, generationTable, assetTable } = opts\n\n const sequences = sqliteTable('sequence', {\n id: hexId(),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n title: text('title').notNull(),\n fps: integer('fps').notNull().default(30),\n width: integer('width').notNull().default(1080),\n height: integer('height').notNull().default(1920),\n aspectRatio: text('aspect_ratio').notNull().default('9:16'),\n durationFrames: integer('duration_frames').notNull().default(900),\n status: text('status', { enum: ['draft', 'active', 'exporting', 'archived'] }).notNull().default('draft'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n updatedAt: updatedAt(),\n }, (table) => [\n index('idx_sequence_workspace_status').on(table.workspaceId, table.status),\n index('idx_sequence_workspace_updated').on(table.workspaceId, table.updatedAt),\n ])\n\n const sequenceTracks = sqliteTable('sequence_track', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n kind: text('kind', { enum: ['video', 'audio', 'caption', 'reference', 'agent'] }).notNull(),\n name: text('name').notNull(),\n sortOrder: integer('sort_order').notNull().default(0),\n locked: integer('locked', { mode: 'boolean' }).notNull().default(false),\n muted: integer('muted', { mode: 'boolean' }).notNull().default(false),\n metadata: jsonMetadata(),\n createdAt: createdAt(),\n }, (table) => [\n index('idx_sequence_track_sequence_order').on(table.sequenceId, table.sortOrder),\n index('idx_sequence_track_workspace').on(table.workspaceId),\n ])\n\n const sequenceClips = sqliteTable('sequence_clip', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n trackId: text('track_id').notNull().references(() => sequenceTracks.id, { onDelete: 'cascade' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n assetId: assetTable\n ? text('asset_id').references(() => assetTable.id, { onDelete: 'set null' })\n : text('asset_id'),\n generationId: generationTable\n ? text('generation_id').references(() => generationTable.id, { onDelete: 'set null' })\n : text('generation_id'),\n label: text('label').notNull(),\n startFrame: integer('start_frame').notNull().default(0),\n durationFrames: integer('duration_frames').notNull(),\n sourceInFrame: integer('source_in_frame').notNull().default(0),\n sourceOutFrame: integer('source_out_frame'),\n version: integer('version').notNull().default(1),\n disabled: integer('disabled', { mode: 'boolean' }).notNull().default(false),\n text: text('text'),\n language: text('language'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n updatedAt: updatedAt(),\n }, (table) => [\n index('idx_sequence_clip_sequence_start').on(table.sequenceId, table.startFrame),\n index('idx_sequence_clip_track_start').on(table.trackId, table.startFrame),\n index('idx_sequence_clip_generation').on(table.generationId),\n index('idx_sequence_clip_workspace').on(table.workspaceId),\n ])\n\n const sequenceDecisions = sqliteTable('sequence_decision', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n clipId: text('clip_id').references(() => sequenceClips.id, { onDelete: 'set null' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n kind: text('kind', { enum: ['human_edit', 'agent_proposal', 'agent_edit', 'export', 'note'] }).notNull(),\n instruction: text('instruction').notNull(),\n reasoningSummary: text('reasoning_summary'),\n accepted: integer('accepted', { mode: 'boolean' }),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n }, (table) => [\n index('idx_sequence_decision_sequence').on(table.sequenceId, table.createdAt),\n index('idx_sequence_decision_workspace').on(table.workspaceId),\n ])\n\n const sequenceExports = sqliteTable('sequence_export', {\n id: hexId(),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n format: text('format', { enum: ['mp4', 'otio', 'xml', 'edl', 'vtt', 'srt', 'contact_sheet'] }).notNull(),\n status: text('status', { enum: ['queued', 'processing', 'completed', 'failed', 'cancelled'] }).notNull().default('queued'),\n resultUrl: text('result_url'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n }, (table) => [\n index('idx_sequence_export_sequence').on(table.sequenceId, table.createdAt),\n index('idx_sequence_export_workspace_status').on(table.workspaceId, table.status),\n ])\n\n return { sequences, sequenceTracks, sequenceClips, sequenceDecisions, sequenceExports }\n}\n\nexport type SequenceTables = ReturnType<typeof createSequenceTables>\n\nexport type SequenceRow = SequenceTables['sequences']['$inferSelect']\nexport type SequenceTrackRow = SequenceTables['sequenceTracks']['$inferSelect']\nexport type SequenceClipRow = SequenceTables['sequenceClips']['$inferSelect']\nexport type SequenceDecisionRow = SequenceTables['sequenceDecisions']['$inferSelect']\nexport type SequenceExportRow = SequenceTables['sequenceExports']['$inferSelect']\n","/**\n * Drizzle-backed `SequenceStore` over the tables from `createSequenceTables`.\n * Works against any SQLite drizzle driver (better-sqlite3, D1, libsql) — the\n * builders are awaited, never `.run()`/`.all()`, so sync and async drivers\n * behave identically.\n *\n * Defense in depth: RBAC runs before the store is constructed, but every\n * query still pins `workspaceId` AND `sequenceId` from the scope in its WHERE\n * clause, so a leaked or attacker-supplied row id from another workspace can\n * never read or write across the boundary — it surfaces as \"not found\".\n *\n * Store-level invariants (everything richer lives in the operation\n * validator): frame fields must be non-negative integers, clip durations at\n * least `MIN_SEQUENCE_CLIP_FRAMES`, and the sequence duration can never\n * shrink below the last clip end. Every mutation bumps `sequence.updatedAt`\n * so workspace recency sorts stay truthful.\n */\n\nimport { and, asc, desc, eq, sql } from 'drizzle-orm'\nimport type { BaseSQLiteDatabase, SQLiteUpdateSetSource } from 'drizzle-orm/sqlite-core'\nimport {\n MIN_SEQUENCE_CLIP_FRAMES,\n type SequenceClip,\n type SequenceClipMedia,\n type SequenceDecision,\n type SequenceExportFormat,\n type SequenceExportRecord,\n type SequenceMeta,\n type SequenceTimeline,\n type SequenceTrack,\n} from './model'\nimport type {\n NewSequenceClip,\n NewSequenceDecision,\n NewSequenceTrack,\n SequenceClipPatch,\n SequenceStore,\n SequenceStoreScope,\n} from './store'\nimport type {\n SequenceClipRow,\n SequenceDecisionRow,\n SequenceExportRow,\n SequenceRow,\n SequenceTables,\n SequenceTrackRow,\n} from './schema'\n\n/** Any SQLite drizzle database — `any` erases the driver-specific run-result\n * and schema generics so better-sqlite3, D1, and libsql handles all fit. */\nexport type SequenceDatabase = BaseSQLiteDatabase<'sync' | 'async', any, any>\n\n/** Resolves product-specific media (generation rows, asset rows) for a batch\n * of clip rows. Keyed by clip id; clips absent from the map carry no media. */\nexport type SequenceMediaResolver = (clipRows: SequenceClipRow[]) => Promise<Map<string, SequenceClipMedia>>\n\nexport interface CreateDrizzleSequenceStoreOptions {\n db: SequenceDatabase\n tables: SequenceTables\n scope: SequenceStoreScope\n resolveMedia?: SequenceMediaResolver\n}\n\nconst DEFAULT_LIST_LIMIT = 50\n\nexport function createDrizzleSequenceStore(options: CreateDrizzleSequenceStoreOptions): SequenceStore {\n const { db, tables, scope, resolveMedia } = options\n const { sequences, sequenceTracks, sequenceClips, sequenceDecisions, sequenceExports } = tables\n\n const sequenceScope = () => and(eq(sequences.id, scope.sequenceId), eq(sequences.workspaceId, scope.workspaceId))\n const trackScope = () => and(eq(sequenceTracks.sequenceId, scope.sequenceId), eq(sequenceTracks.workspaceId, scope.workspaceId))\n const clipScope = () => and(eq(sequenceClips.sequenceId, scope.sequenceId), eq(sequenceClips.workspaceId, scope.workspaceId))\n const decisionScope = () => and(eq(sequenceDecisions.sequenceId, scope.sequenceId), eq(sequenceDecisions.workspaceId, scope.workspaceId))\n const exportScope = () => and(eq(sequenceExports.sequenceId, scope.sequenceId), eq(sequenceExports.workspaceId, scope.workspaceId))\n\n async function requireSequenceRow(): Promise<SequenceRow> {\n const [row] = await db.select().from(sequences).where(sequenceScope()).limit(1)\n if (!row) throw new Error(`Sequence ${scope.sequenceId} not found in workspace ${scope.workspaceId}`)\n return row\n }\n\n async function requireTrackRow(trackId: string): Promise<SequenceTrackRow> {\n const [row] = await db.select().from(sequenceTracks).where(and(trackScope(), eq(sequenceTracks.id, trackId))).limit(1)\n if (!row) throw new Error(`Track ${trackId} not found in sequence ${scope.sequenceId}`)\n return row\n }\n\n async function requireClipRow(clipId: string): Promise<SequenceClipRow> {\n const [row] = await db.select().from(sequenceClips).where(and(clipScope(), eq(sequenceClips.id, clipId))).limit(1)\n if (!row) throw new Error(`Clip ${clipId} not found in sequence ${scope.sequenceId}`)\n return row\n }\n\n async function touchSequence(): Promise<void> {\n await db.update(sequences).set({ updatedAt: new Date() }).where(sequenceScope())\n }\n\n async function clipWithMedia(row: SequenceClipRow): Promise<SequenceClip> {\n const media = resolveMedia ? await resolveMedia([row]) : undefined\n return mapClip(row, media?.get(row.id))\n }\n\n return {\n async getTimeline(): Promise<SequenceTimeline> {\n const sequenceRow = await requireSequenceRow()\n const [trackRows, clipRows] = await Promise.all([\n db.select().from(sequenceTracks).where(trackScope())\n .orderBy(asc(sequenceTracks.sortOrder), asc(sequenceTracks.createdAt)),\n db.select().from(sequenceClips).where(clipScope())\n .orderBy(asc(sequenceClips.startFrame), asc(sequenceClips.createdAt)),\n ])\n const media = resolveMedia ? await resolveMedia(clipRows) : undefined\n return {\n sequence: mapSequence(sequenceRow),\n tracks: trackRows.map(mapTrack),\n clips: clipRows.map((row) => mapClip(row, media?.get(row.id))),\n }\n },\n\n async getClip(clipId: string): Promise<SequenceClip> {\n return clipWithMedia(await requireClipRow(clipId))\n },\n\n async createTrack(input: NewSequenceTrack): Promise<SequenceTrack> {\n await requireSequenceRow()\n let sortOrder = input.sortOrder\n if (sortOrder === undefined) {\n const [aggregate] = await db\n .select({ maxSortOrder: sql<number | null>`max(${sequenceTracks.sortOrder})` })\n .from(sequenceTracks)\n .where(trackScope())\n sortOrder = (aggregate?.maxSortOrder ?? -1) + 1\n }\n const [row] = await db.insert(sequenceTracks).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n kind: input.kind,\n name: input.name,\n sortOrder,\n }).returning()\n if (!row) throw new Error('sequence_track insert returned no row')\n await touchSequence()\n return mapTrack(row)\n },\n\n async createClip(input: NewSequenceClip): Promise<SequenceClip> {\n assertFrame(input.startFrame, 'startFrame')\n assertClipDuration(input.durationFrames)\n if (input.sourceInFrame !== undefined) assertFrame(input.sourceInFrame, 'sourceInFrame')\n if (typeof input.sourceOutFrame === 'number') assertFrame(input.sourceOutFrame, 'sourceOutFrame')\n await requireTrackRow(input.trackId)\n const [row] = await db.insert(sequenceClips).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n trackId: input.trackId,\n label: input.label,\n startFrame: input.startFrame,\n durationFrames: input.durationFrames,\n sourceInFrame: input.sourceInFrame ?? 0,\n sourceOutFrame: input.sourceOutFrame ?? null,\n text: input.text ?? null,\n language: input.language ?? null,\n generationId: input.generationId ?? null,\n assetId: input.assetId ?? null,\n metadata: input.metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_clip insert returned no row')\n await touchSequence()\n return clipWithMedia(row)\n },\n\n async updateClip(clipId: string, patch: SequenceClipPatch): Promise<SequenceClip> {\n await requireClipRow(clipId)\n if (patch.trackId !== undefined) await requireTrackRow(patch.trackId)\n if (patch.startFrame !== undefined) assertFrame(patch.startFrame, 'startFrame')\n if (patch.durationFrames !== undefined) assertClipDuration(patch.durationFrames)\n if (patch.sourceInFrame !== undefined) assertFrame(patch.sourceInFrame, 'sourceInFrame')\n if (typeof patch.sourceOutFrame === 'number') assertFrame(patch.sourceOutFrame, 'sourceOutFrame')\n\n const updates: SQLiteUpdateSetSource<SequenceTables['sequenceClips']> = {\n updatedAt: new Date(),\n version: sql`${sequenceClips.version} + 1`,\n }\n if (patch.trackId !== undefined) updates.trackId = patch.trackId\n if (patch.label !== undefined) updates.label = patch.label\n if (patch.startFrame !== undefined) updates.startFrame = patch.startFrame\n if (patch.durationFrames !== undefined) updates.durationFrames = patch.durationFrames\n if (patch.sourceInFrame !== undefined) updates.sourceInFrame = patch.sourceInFrame\n if (patch.sourceOutFrame !== undefined) updates.sourceOutFrame = patch.sourceOutFrame\n if (patch.disabled !== undefined) updates.disabled = patch.disabled\n if (patch.text !== undefined) updates.text = patch.text\n if (patch.language !== undefined) updates.language = patch.language\n if (patch.metadata !== undefined) updates.metadata = patch.metadata\n\n const [row] = await db.update(sequenceClips).set(updates)\n .where(and(clipScope(), eq(sequenceClips.id, clipId)))\n .returning()\n if (!row) throw new Error(`Clip ${clipId} not found in sequence ${scope.sequenceId}`)\n await touchSequence()\n return clipWithMedia(row)\n },\n\n async deleteClip(clipId: string): Promise<void> {\n await requireClipRow(clipId)\n await db.delete(sequenceClips).where(and(clipScope(), eq(sequenceClips.id, clipId)))\n await touchSequence()\n },\n\n async updateSequenceDuration(durationFrames: number): Promise<SequenceMeta> {\n if (!Number.isInteger(durationFrames) || durationFrames < MIN_SEQUENCE_CLIP_FRAMES) {\n throw new Error('durationFrames must be a positive integer')\n }\n await requireSequenceRow()\n // Disabled clips still occupy the timeline (they can be re-enabled), so\n // they count toward the shrink floor.\n const [aggregate] = await db\n .select({ maxEndFrame: sql<number | null>`max(${sequenceClips.startFrame} + ${sequenceClips.durationFrames})` })\n .from(sequenceClips)\n .where(clipScope())\n const maxEndFrame = aggregate?.maxEndFrame ?? 0\n if (durationFrames < maxEndFrame) {\n throw new Error(`Cannot set sequence duration to ${durationFrames} frames: the last clip ends at frame ${maxEndFrame}. Trim or delete clips first.`)\n }\n const [row] = await db.update(sequences)\n .set({ durationFrames, updatedAt: new Date() })\n .where(sequenceScope())\n .returning()\n if (!row) throw new Error(`Sequence ${scope.sequenceId} not found in workspace ${scope.workspaceId}`)\n return mapSequence(row)\n },\n\n async recordDecision(input: NewSequenceDecision): Promise<SequenceDecision> {\n await requireSequenceRow()\n if (typeof input.clipId === 'string') await requireClipRow(input.clipId)\n const [row] = await db.insert(sequenceDecisions).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n clipId: input.clipId ?? null,\n kind: input.kind,\n instruction: input.instruction,\n reasoningSummary: input.reasoningSummary ?? null,\n accepted: input.accepted ?? null,\n metadata: input.metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_decision insert returned no row')\n await touchSequence()\n return mapDecision(row)\n },\n\n async createExport(format: SequenceExportFormat, metadata?: Record<string, unknown>): Promise<SequenceExportRecord> {\n await requireSequenceRow()\n const [row] = await db.insert(sequenceExports).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n format,\n metadata: metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_export insert returned no row')\n await touchSequence()\n return mapExport(row)\n },\n\n async listDecisions(limit = DEFAULT_LIST_LIMIT): Promise<SequenceDecision[]> {\n assertListLimit(limit)\n // created_at has one-second resolution (unixepoch); rowid breaks ties in\n // insertion order so the log reads newest-first deterministically.\n const rows = await db.select().from(sequenceDecisions)\n .where(decisionScope())\n .orderBy(desc(sequenceDecisions.createdAt), desc(sql`rowid`))\n .limit(limit)\n return rows.map(mapDecision)\n },\n\n async listExports(limit = DEFAULT_LIST_LIMIT): Promise<SequenceExportRecord[]> {\n assertListLimit(limit)\n const rows = await db.select().from(sequenceExports)\n .where(exportScope())\n .orderBy(desc(sequenceExports.createdAt), desc(sql`rowid`))\n .limit(limit)\n return rows.map(mapExport)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Row → model mapping. Metadata columns are nullable with a `{}` default;\n// SQL NULL and `{}` both mean \"no metadata\", so `?? {}` is a lossless\n// representation conversion, not an error-hiding fallback. Nullable text\n// columns map to the model's optional (`undefined`) fields the same way.\n// ---------------------------------------------------------------------------\n\nfunction mapSequence(row: SequenceRow): SequenceMeta {\n return {\n id: row.id,\n title: row.title,\n fps: row.fps,\n width: row.width,\n height: row.height,\n aspectRatio: row.aspectRatio,\n durationFrames: row.durationFrames,\n status: row.status,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapTrack(row: SequenceTrackRow): SequenceTrack {\n return {\n id: row.id,\n kind: row.kind,\n name: row.name,\n sortOrder: row.sortOrder,\n locked: row.locked,\n muted: row.muted,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapClip(row: SequenceClipRow, media: SequenceClipMedia | undefined): SequenceClip {\n return {\n id: row.id,\n trackId: row.trackId,\n label: row.label,\n startFrame: row.startFrame,\n durationFrames: row.durationFrames,\n sourceInFrame: row.sourceInFrame,\n sourceOutFrame: row.sourceOutFrame,\n disabled: row.disabled,\n text: row.text ?? undefined,\n language: row.language ?? undefined,\n generationId: row.generationId ?? undefined,\n assetId: row.assetId ?? undefined,\n media,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapDecision(row: SequenceDecisionRow): SequenceDecision {\n return {\n id: row.id,\n clipId: row.clipId,\n kind: row.kind,\n instruction: row.instruction,\n reasoningSummary: row.reasoningSummary,\n accepted: row.accepted,\n metadata: row.metadata ?? {},\n createdAt: row.createdAt,\n }\n}\n\nfunction mapExport(row: SequenceExportRow): SequenceExportRecord {\n return {\n id: row.id,\n format: row.format,\n status: row.status,\n resultUrl: row.resultUrl,\n metadata: row.metadata ?? {},\n createdAt: row.createdAt,\n }\n}\n\nfunction assertFrame(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) throw new Error(`${label} must be a non-negative integer`)\n}\n\nfunction assertClipDuration(durationFrames: number): void {\n if (!Number.isInteger(durationFrames) || durationFrames < MIN_SEQUENCE_CLIP_FRAMES) {\n throw new Error('durationFrames must be a positive integer')\n }\n}\n\nfunction assertListLimit(limit: number): void {\n if (!Number.isInteger(limit) || limit < 1) throw new Error('limit must be a positive integer')\n}\n"],"mappings":"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","names":["sql","sql"]}
1
+ {"version":3,"sources":["../../src/sequences/schema.ts","../../src/sequences/drizzle-store.ts"],"sourcesContent":["/**\n * Drizzle schema factory for the sequence tables. The product owns the\n * workspace/user (and optionally generation/asset) tables; the factory wires\n * the sequence tables' foreign keys into them so the whole graph lives in one\n * drizzle schema with real cascade semantics. Column names, types, defaults,\n * enums, and indexes mirror creative-agent's hand-rolled tables so a product\n * with those tables can adopt the factory without rewriting rows.\n *\n * `sequence_clip.text` / `sequence_clip.language` hold caption bodies inline\n * (nullable; only caption-track clips use them) — adopting products add the\n * two columns with a plain ALTER TABLE.\n *\n * When `generationTable`/`assetTable` are omitted the `generation_id` /\n * `asset_id` columns stay plain text (no FK): products without those tables\n * still get opaque reference columns the store round-trips untouched.\n */\n\nimport { sql } from 'drizzle-orm'\nimport { index, integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport type { AnySQLiteColumn, AnySQLiteTable } from 'drizzle-orm/sqlite-core'\n\n/** A product table referenced by FK — only the `id` column is touched. */\nexport type SequenceParentTable = AnySQLiteTable & { id: AnySQLiteColumn }\n\n/** Define options for creating sequence-related database tables including workspace and user tables */\nexport interface CreateSequenceTablesOptions {\n workspaceTable: SequenceParentTable\n userTable: SequenceParentTable\n generationTable?: SequenceParentTable\n assetTable?: SequenceParentTable\n}\n\nconst hexId = () => text('id').primaryKey().default(sql`(lower(hex(randomblob(16))))`)\n\nconst jsonMetadata = () => text('metadata', { mode: 'json' }).$type<Record<string, unknown>>().default({})\n\nconst createdAt = () => integer('created_at', { mode: 'timestamp' }).notNull().default(sql`(unixepoch())`)\n\nconst updatedAt = () => integer('updated_at', { mode: 'timestamp' }).notNull().default(sql`(unixepoch())`)\n\n/** Build SQLite sequence tables with defined columns and relationships based on provided options */\nexport function createSequenceTables(opts: CreateSequenceTablesOptions) {\n const { workspaceTable, userTable, generationTable, assetTable } = opts\n\n const sequences = sqliteTable('sequence', {\n id: hexId(),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n title: text('title').notNull(),\n fps: integer('fps').notNull().default(30),\n width: integer('width').notNull().default(1080),\n height: integer('height').notNull().default(1920),\n aspectRatio: text('aspect_ratio').notNull().default('9:16'),\n durationFrames: integer('duration_frames').notNull().default(900),\n status: text('status', { enum: ['draft', 'active', 'exporting', 'archived'] }).notNull().default('draft'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n updatedAt: updatedAt(),\n }, (table) => [\n index('idx_sequence_workspace_status').on(table.workspaceId, table.status),\n index('idx_sequence_workspace_updated').on(table.workspaceId, table.updatedAt),\n ])\n\n const sequenceTracks = sqliteTable('sequence_track', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n kind: text('kind', { enum: ['video', 'audio', 'caption', 'reference', 'agent'] }).notNull(),\n name: text('name').notNull(),\n sortOrder: integer('sort_order').notNull().default(0),\n locked: integer('locked', { mode: 'boolean' }).notNull().default(false),\n muted: integer('muted', { mode: 'boolean' }).notNull().default(false),\n metadata: jsonMetadata(),\n createdAt: createdAt(),\n }, (table) => [\n index('idx_sequence_track_sequence_order').on(table.sequenceId, table.sortOrder),\n index('idx_sequence_track_workspace').on(table.workspaceId),\n ])\n\n const sequenceClips = sqliteTable('sequence_clip', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n trackId: text('track_id').notNull().references(() => sequenceTracks.id, { onDelete: 'cascade' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n assetId: assetTable\n ? text('asset_id').references(() => assetTable.id, { onDelete: 'set null' })\n : text('asset_id'),\n generationId: generationTable\n ? text('generation_id').references(() => generationTable.id, { onDelete: 'set null' })\n : text('generation_id'),\n label: text('label').notNull(),\n startFrame: integer('start_frame').notNull().default(0),\n durationFrames: integer('duration_frames').notNull(),\n sourceInFrame: integer('source_in_frame').notNull().default(0),\n sourceOutFrame: integer('source_out_frame'),\n version: integer('version').notNull().default(1),\n disabled: integer('disabled', { mode: 'boolean' }).notNull().default(false),\n text: text('text'),\n language: text('language'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n updatedAt: updatedAt(),\n }, (table) => [\n index('idx_sequence_clip_sequence_start').on(table.sequenceId, table.startFrame),\n index('idx_sequence_clip_track_start').on(table.trackId, table.startFrame),\n index('idx_sequence_clip_generation').on(table.generationId),\n index('idx_sequence_clip_workspace').on(table.workspaceId),\n ])\n\n const sequenceDecisions = sqliteTable('sequence_decision', {\n id: hexId(),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n clipId: text('clip_id').references(() => sequenceClips.id, { onDelete: 'set null' }),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n kind: text('kind', { enum: ['human_edit', 'agent_proposal', 'agent_edit', 'export', 'note'] }).notNull(),\n instruction: text('instruction').notNull(),\n reasoningSummary: text('reasoning_summary'),\n accepted: integer('accepted', { mode: 'boolean' }),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n }, (table) => [\n index('idx_sequence_decision_sequence').on(table.sequenceId, table.createdAt),\n index('idx_sequence_decision_workspace').on(table.workspaceId),\n ])\n\n const sequenceExports = sqliteTable('sequence_export', {\n id: hexId(),\n workspaceId: text('workspace_id').notNull().references(() => workspaceTable.id, { onDelete: 'cascade' }),\n sequenceId: text('sequence_id').notNull().references(() => sequences.id, { onDelete: 'cascade' }),\n format: text('format', { enum: ['mp4', 'otio', 'xml', 'edl', 'vtt', 'srt', 'contact_sheet'] }).notNull(),\n status: text('status', { enum: ['queued', 'processing', 'completed', 'failed', 'cancelled'] }).notNull().default('queued'),\n resultUrl: text('result_url'),\n metadata: jsonMetadata(),\n createdBy: text('created_by').notNull().references(() => userTable.id),\n createdAt: createdAt(),\n completedAt: integer('completed_at', { mode: 'timestamp' }),\n }, (table) => [\n index('idx_sequence_export_sequence').on(table.sequenceId, table.createdAt),\n index('idx_sequence_export_workspace_status').on(table.workspaceId, table.status),\n ])\n\n return { sequences, sequenceTracks, sequenceClips, sequenceDecisions, sequenceExports }\n}\n\n/** Resolve sequence tables by invoking the createSequenceTables factory function */\nexport type SequenceTables = ReturnType<typeof createSequenceTables>\n\n/** Resolve a sequence row by inferring the selected fields from the sequences table */\nexport type SequenceRow = SequenceTables['sequences']['$inferSelect']\n/** Resolve the selected sequence track row from the sequenceTracks table */\nexport type SequenceTrackRow = SequenceTables['sequenceTracks']['$inferSelect']\n/** Resolve the selected fields of sequence clips from the sequence tables data structure */\nexport type SequenceClipRow = SequenceTables['sequenceClips']['$inferSelect']\n/** Resolve a sequence decision row from the sequenceDecisions table data */\nexport type SequenceDecisionRow = SequenceTables['sequenceDecisions']['$inferSelect']\n/** Resolve a row type representing exported sequence data from sequenceExports table */\nexport type SequenceExportRow = SequenceTables['sequenceExports']['$inferSelect']\n","/**\n * Drizzle-backed `SequenceStore` over the tables from `createSequenceTables`.\n * Works against any SQLite drizzle driver (better-sqlite3, D1, libsql) — the\n * builders are awaited, never `.run()`/`.all()`, so sync and async drivers\n * behave identically.\n *\n * Defense in depth: RBAC runs before the store is constructed, but every\n * query still pins `workspaceId` AND `sequenceId` from the scope in its WHERE\n * clause, so a leaked or attacker-supplied row id from another workspace can\n * never read or write across the boundary — it surfaces as \"not found\".\n *\n * Store-level invariants (everything richer lives in the operation\n * validator): frame fields must be non-negative integers, clip durations at\n * least `MIN_SEQUENCE_CLIP_FRAMES`, and the sequence duration can never\n * shrink below the last clip end. Every mutation bumps `sequence.updatedAt`\n * so workspace recency sorts stay truthful.\n */\n\nimport { and, asc, desc, eq, sql } from 'drizzle-orm'\nimport type { BaseSQLiteDatabase, SQLiteUpdateSetSource } from 'drizzle-orm/sqlite-core'\nimport {\n MIN_SEQUENCE_CLIP_FRAMES,\n type SequenceClip,\n type SequenceClipMedia,\n type SequenceDecision,\n type SequenceExportFormat,\n type SequenceExportRecord,\n type SequenceMeta,\n type SequenceTimeline,\n type SequenceTrack,\n} from './model'\nimport type {\n NewSequenceClip,\n NewSequenceDecision,\n NewSequenceTrack,\n SequenceClipPatch,\n SequenceStore,\n SequenceStoreScope,\n} from './store'\nimport type {\n SequenceClipRow,\n SequenceDecisionRow,\n SequenceExportRow,\n SequenceRow,\n SequenceTables,\n SequenceTrackRow,\n} from './schema'\n\n/** Any SQLite drizzle database — `any` erases the driver-specific run-result\n * and schema generics so better-sqlite3, D1, and libsql handles all fit. */\nexport type SequenceDatabase = BaseSQLiteDatabase<'sync' | 'async', any, any>\n\n/** Resolves product-specific media (generation rows, asset rows) for a batch\n * of clip rows. Keyed by clip id; clips absent from the map carry no media. */\nexport type SequenceMediaResolver = (clipRows: SequenceClipRow[]) => Promise<Map<string, SequenceClipMedia>>\n\n/** Define options for creating a Drizzle sequence store including database, tables, scope, and media resolver */\nexport interface CreateDrizzleSequenceStoreOptions {\n db: SequenceDatabase\n tables: SequenceTables\n scope: SequenceStoreScope\n resolveMedia?: SequenceMediaResolver\n}\n\nconst DEFAULT_LIST_LIMIT = 50\n\n/** Create a sequence store scoped to a specific sequence and workspace with database access and media resolution */\nexport function createDrizzleSequenceStore(options: CreateDrizzleSequenceStoreOptions): SequenceStore {\n const { db, tables, scope, resolveMedia } = options\n const { sequences, sequenceTracks, sequenceClips, sequenceDecisions, sequenceExports } = tables\n\n const sequenceScope = () => and(eq(sequences.id, scope.sequenceId), eq(sequences.workspaceId, scope.workspaceId))\n const trackScope = () => and(eq(sequenceTracks.sequenceId, scope.sequenceId), eq(sequenceTracks.workspaceId, scope.workspaceId))\n const clipScope = () => and(eq(sequenceClips.sequenceId, scope.sequenceId), eq(sequenceClips.workspaceId, scope.workspaceId))\n const decisionScope = () => and(eq(sequenceDecisions.sequenceId, scope.sequenceId), eq(sequenceDecisions.workspaceId, scope.workspaceId))\n const exportScope = () => and(eq(sequenceExports.sequenceId, scope.sequenceId), eq(sequenceExports.workspaceId, scope.workspaceId))\n\n async function requireSequenceRow(): Promise<SequenceRow> {\n const [row] = await db.select().from(sequences).where(sequenceScope()).limit(1)\n if (!row) throw new Error(`Sequence ${scope.sequenceId} not found in workspace ${scope.workspaceId}`)\n return row\n }\n\n async function requireTrackRow(trackId: string): Promise<SequenceTrackRow> {\n const [row] = await db.select().from(sequenceTracks).where(and(trackScope(), eq(sequenceTracks.id, trackId))).limit(1)\n if (!row) throw new Error(`Track ${trackId} not found in sequence ${scope.sequenceId}`)\n return row\n }\n\n async function requireClipRow(clipId: string): Promise<SequenceClipRow> {\n const [row] = await db.select().from(sequenceClips).where(and(clipScope(), eq(sequenceClips.id, clipId))).limit(1)\n if (!row) throw new Error(`Clip ${clipId} not found in sequence ${scope.sequenceId}`)\n return row\n }\n\n async function touchSequence(): Promise<void> {\n await db.update(sequences).set({ updatedAt: new Date() }).where(sequenceScope())\n }\n\n async function clipWithMedia(row: SequenceClipRow): Promise<SequenceClip> {\n const media = resolveMedia ? await resolveMedia([row]) : undefined\n return mapClip(row, media?.get(row.id))\n }\n\n return {\n async getTimeline(): Promise<SequenceTimeline> {\n const sequenceRow = await requireSequenceRow()\n const [trackRows, clipRows] = await Promise.all([\n db.select().from(sequenceTracks).where(trackScope())\n .orderBy(asc(sequenceTracks.sortOrder), asc(sequenceTracks.createdAt)),\n db.select().from(sequenceClips).where(clipScope())\n .orderBy(asc(sequenceClips.startFrame), asc(sequenceClips.createdAt)),\n ])\n const media = resolveMedia ? await resolveMedia(clipRows) : undefined\n return {\n sequence: mapSequence(sequenceRow),\n tracks: trackRows.map(mapTrack),\n clips: clipRows.map((row) => mapClip(row, media?.get(row.id))),\n }\n },\n\n async getClip(clipId: string): Promise<SequenceClip> {\n return clipWithMedia(await requireClipRow(clipId))\n },\n\n async createTrack(input: NewSequenceTrack): Promise<SequenceTrack> {\n await requireSequenceRow()\n let sortOrder = input.sortOrder\n if (sortOrder === undefined) {\n const [aggregate] = await db\n .select({ maxSortOrder: sql<number | null>`max(${sequenceTracks.sortOrder})` })\n .from(sequenceTracks)\n .where(trackScope())\n sortOrder = (aggregate?.maxSortOrder ?? -1) + 1\n }\n const [row] = await db.insert(sequenceTracks).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n kind: input.kind,\n name: input.name,\n sortOrder,\n }).returning()\n if (!row) throw new Error('sequence_track insert returned no row')\n await touchSequence()\n return mapTrack(row)\n },\n\n async createClip(input: NewSequenceClip): Promise<SequenceClip> {\n assertFrame(input.startFrame, 'startFrame')\n assertClipDuration(input.durationFrames)\n if (input.sourceInFrame !== undefined) assertFrame(input.sourceInFrame, 'sourceInFrame')\n if (typeof input.sourceOutFrame === 'number') assertFrame(input.sourceOutFrame, 'sourceOutFrame')\n await requireTrackRow(input.trackId)\n const [row] = await db.insert(sequenceClips).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n trackId: input.trackId,\n label: input.label,\n startFrame: input.startFrame,\n durationFrames: input.durationFrames,\n sourceInFrame: input.sourceInFrame ?? 0,\n sourceOutFrame: input.sourceOutFrame ?? null,\n text: input.text ?? null,\n language: input.language ?? null,\n generationId: input.generationId ?? null,\n assetId: input.assetId ?? null,\n metadata: input.metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_clip insert returned no row')\n await touchSequence()\n return clipWithMedia(row)\n },\n\n async updateClip(clipId: string, patch: SequenceClipPatch): Promise<SequenceClip> {\n await requireClipRow(clipId)\n if (patch.trackId !== undefined) await requireTrackRow(patch.trackId)\n if (patch.startFrame !== undefined) assertFrame(patch.startFrame, 'startFrame')\n if (patch.durationFrames !== undefined) assertClipDuration(patch.durationFrames)\n if (patch.sourceInFrame !== undefined) assertFrame(patch.sourceInFrame, 'sourceInFrame')\n if (typeof patch.sourceOutFrame === 'number') assertFrame(patch.sourceOutFrame, 'sourceOutFrame')\n\n const updates: SQLiteUpdateSetSource<SequenceTables['sequenceClips']> = {\n updatedAt: new Date(),\n version: sql`${sequenceClips.version} + 1`,\n }\n if (patch.trackId !== undefined) updates.trackId = patch.trackId\n if (patch.label !== undefined) updates.label = patch.label\n if (patch.startFrame !== undefined) updates.startFrame = patch.startFrame\n if (patch.durationFrames !== undefined) updates.durationFrames = patch.durationFrames\n if (patch.sourceInFrame !== undefined) updates.sourceInFrame = patch.sourceInFrame\n if (patch.sourceOutFrame !== undefined) updates.sourceOutFrame = patch.sourceOutFrame\n if (patch.disabled !== undefined) updates.disabled = patch.disabled\n if (patch.text !== undefined) updates.text = patch.text\n if (patch.language !== undefined) updates.language = patch.language\n if (patch.metadata !== undefined) updates.metadata = patch.metadata\n\n const [row] = await db.update(sequenceClips).set(updates)\n .where(and(clipScope(), eq(sequenceClips.id, clipId)))\n .returning()\n if (!row) throw new Error(`Clip ${clipId} not found in sequence ${scope.sequenceId}`)\n await touchSequence()\n return clipWithMedia(row)\n },\n\n async deleteClip(clipId: string): Promise<void> {\n await requireClipRow(clipId)\n await db.delete(sequenceClips).where(and(clipScope(), eq(sequenceClips.id, clipId)))\n await touchSequence()\n },\n\n async updateSequenceDuration(durationFrames: number): Promise<SequenceMeta> {\n if (!Number.isInteger(durationFrames) || durationFrames < MIN_SEQUENCE_CLIP_FRAMES) {\n throw new Error('durationFrames must be a positive integer')\n }\n await requireSequenceRow()\n // Disabled clips still occupy the timeline (they can be re-enabled), so\n // they count toward the shrink floor.\n const [aggregate] = await db\n .select({ maxEndFrame: sql<number | null>`max(${sequenceClips.startFrame} + ${sequenceClips.durationFrames})` })\n .from(sequenceClips)\n .where(clipScope())\n const maxEndFrame = aggregate?.maxEndFrame ?? 0\n if (durationFrames < maxEndFrame) {\n throw new Error(`Cannot set sequence duration to ${durationFrames} frames: the last clip ends at frame ${maxEndFrame}. Trim or delete clips first.`)\n }\n const [row] = await db.update(sequences)\n .set({ durationFrames, updatedAt: new Date() })\n .where(sequenceScope())\n .returning()\n if (!row) throw new Error(`Sequence ${scope.sequenceId} not found in workspace ${scope.workspaceId}`)\n return mapSequence(row)\n },\n\n async recordDecision(input: NewSequenceDecision): Promise<SequenceDecision> {\n await requireSequenceRow()\n if (typeof input.clipId === 'string') await requireClipRow(input.clipId)\n const [row] = await db.insert(sequenceDecisions).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n clipId: input.clipId ?? null,\n kind: input.kind,\n instruction: input.instruction,\n reasoningSummary: input.reasoningSummary ?? null,\n accepted: input.accepted ?? null,\n metadata: input.metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_decision insert returned no row')\n await touchSequence()\n return mapDecision(row)\n },\n\n async createExport(format: SequenceExportFormat, metadata?: Record<string, unknown>): Promise<SequenceExportRecord> {\n await requireSequenceRow()\n const [row] = await db.insert(sequenceExports).values({\n sequenceId: scope.sequenceId,\n workspaceId: scope.workspaceId,\n format,\n metadata: metadata ?? {},\n createdBy: scope.userId,\n }).returning()\n if (!row) throw new Error('sequence_export insert returned no row')\n await touchSequence()\n return mapExport(row)\n },\n\n async listDecisions(limit = DEFAULT_LIST_LIMIT): Promise<SequenceDecision[]> {\n assertListLimit(limit)\n // created_at has one-second resolution (unixepoch); rowid breaks ties in\n // insertion order so the log reads newest-first deterministically.\n const rows = await db.select().from(sequenceDecisions)\n .where(decisionScope())\n .orderBy(desc(sequenceDecisions.createdAt), desc(sql`rowid`))\n .limit(limit)\n return rows.map(mapDecision)\n },\n\n async listExports(limit = DEFAULT_LIST_LIMIT): Promise<SequenceExportRecord[]> {\n assertListLimit(limit)\n const rows = await db.select().from(sequenceExports)\n .where(exportScope())\n .orderBy(desc(sequenceExports.createdAt), desc(sql`rowid`))\n .limit(limit)\n return rows.map(mapExport)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Row → model mapping. Metadata columns are nullable with a `{}` default;\n// SQL NULL and `{}` both mean \"no metadata\", so `?? {}` is a lossless\n// representation conversion, not an error-hiding fallback. Nullable text\n// columns map to the model's optional (`undefined`) fields the same way.\n// ---------------------------------------------------------------------------\n\nfunction mapSequence(row: SequenceRow): SequenceMeta {\n return {\n id: row.id,\n title: row.title,\n fps: row.fps,\n width: row.width,\n height: row.height,\n aspectRatio: row.aspectRatio,\n durationFrames: row.durationFrames,\n status: row.status,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapTrack(row: SequenceTrackRow): SequenceTrack {\n return {\n id: row.id,\n kind: row.kind,\n name: row.name,\n sortOrder: row.sortOrder,\n locked: row.locked,\n muted: row.muted,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapClip(row: SequenceClipRow, media: SequenceClipMedia | undefined): SequenceClip {\n return {\n id: row.id,\n trackId: row.trackId,\n label: row.label,\n startFrame: row.startFrame,\n durationFrames: row.durationFrames,\n sourceInFrame: row.sourceInFrame,\n sourceOutFrame: row.sourceOutFrame,\n disabled: row.disabled,\n text: row.text ?? undefined,\n language: row.language ?? undefined,\n generationId: row.generationId ?? undefined,\n assetId: row.assetId ?? undefined,\n media,\n metadata: row.metadata ?? {},\n }\n}\n\nfunction mapDecision(row: SequenceDecisionRow): SequenceDecision {\n return {\n id: row.id,\n clipId: row.clipId,\n kind: row.kind,\n instruction: row.instruction,\n reasoningSummary: row.reasoningSummary,\n accepted: row.accepted,\n metadata: row.metadata ?? {},\n createdAt: row.createdAt,\n }\n}\n\nfunction mapExport(row: SequenceExportRow): SequenceExportRecord {\n return {\n id: row.id,\n format: row.format,\n status: row.status,\n resultUrl: row.resultUrl,\n metadata: row.metadata ?? {},\n createdAt: row.createdAt,\n }\n}\n\nfunction assertFrame(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) throw new Error(`${label} must be a non-negative integer`)\n}\n\nfunction assertClipDuration(durationFrames: number): void {\n if (!Number.isInteger(durationFrames) || durationFrames < MIN_SEQUENCE_CLIP_FRAMES) {\n throw new Error('durationFrames must be a positive integer')\n }\n}\n\nfunction assertListLimit(limit: number): void {\n if (!Number.isInteger(limit) || limit < 1) throw new Error('limit must be a positive integer')\n}\n"],"mappings":"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","names":["sql","sql"]}
@@ -1,10 +1,10 @@
1
- import { j as SequenceMediaKind, o as SequenceTimeline, r as TimelineInterval, m as SequenceStore } from '../store-gckrNq-g.js';
2
- export { M as MIN_SEQUENCE_CLIP_FRAMES, N as NewSequenceClip, a as NewSequenceDecision, b as NewSequenceTrack, S as SequenceClip, c as SequenceClipMedia, d as SequenceClipPatch, e as SequenceDecision, f as SequenceExportFormat, g as SequenceExportRecord, h as SequenceExportStatus, i as SequenceFrameSnapshot, k as SequenceMeta, l as SequenceStatus, n as SequenceStoreScope, p as SequenceTrack, q as SequenceTrackKind, T as TimelineClipBounds, s as assertClipFitsSequence, t as chooseCaptionPlacement, u as clampClipDuration, v as clampClipStart, w as formatSeconds, x as formatTimecode, y as framesToSeconds, z as secondsToFrames, A as snapshotFrame, B as trackIntervals } from '../store-gckrNq-g.js';
3
- export { A as AddCaptionOperation, C as CaptionTargetResolution, a as CreateTrackOperation, D as DeleteClipOperation, E as ExtendSequenceOperation, M as MoveClipOperation, P as PlaceClipOperation, Q as QueueExportOperation, S as SEQUENCE_OPERATION_TYPES, b as SequenceApplyResult, c as SequenceOperation, d as SequenceOperationContext, e as SequenceOperationType, f as SequencePlan, g as SetClipDisabledOperation, h as SetClipTextOperation, i as SplitClipOperation, T as TrimClipOperation, j as applySequenceOperation, k as applySequenceOperations, l as assertSequenceMediaUrl, m as captionTrackNameForLanguage, n as lastClipEndFrame, p as parseSequenceOperations, r as resolveCaptionPlacement, o as resolveCaptionTarget, q as resolvePlaceClipTrack, v as validateAddCaption, s as validateCreateTrack, t as validateDeleteClip, u as validateExtendSequence, w as validateMoveClip, x as validatePlaceClip, y as validateQueueExport, z as validateSequenceOperation, B as validateSequenceOperations, F as validateSetClipDisabled, G as validateSetClipText, H as validateSplitClip, I as validateTrimClip } from '../apply-Gk4raT2j.js';
4
- import { S as ScopedMcpServerEntryOptions, A as AppToolMcpServer } from '../mcp-BHfIoGLW.js';
5
- export { M as SEQUENCES_MCP_PROTOCOL_VERSIONS } from '../mcp-rpc-DLw_r9PQ.js';
6
- import '../types-BEOvc_ue.js';
7
- import '../auth-DuptSkWh.js';
1
+ import { j as SequenceMediaKind, f as SequenceTimeline, k as TimelineInterval, b as SequenceStore } from '../store-B7LLlk9p.js';
2
+ export { M as MIN_SEQUENCE_CLIP_FRAMES, N as NewSequenceClip, l as NewSequenceDecision, m as NewSequenceTrack, g as SequenceClip, a as SequenceClipMedia, n as SequenceClipPatch, o as SequenceDecision, d as SequenceExportFormat, h as SequenceExportRecord, p as SequenceExportStatus, q as SequenceFrameSnapshot, i as SequenceMeta, r as SequenceStatus, S as SequenceStoreScope, e as SequenceTrack, c as SequenceTrackKind, T as TimelineClipBounds, s as assertClipFitsSequence, t as chooseCaptionPlacement, u as clampClipDuration, v as clampClipStart, w as formatSeconds, x as formatTimecode, y as framesToSeconds, z as secondsToFrames, A as snapshotFrame, B as trackIntervals } from '../store-B7LLlk9p.js';
3
+ export { A as AddCaptionOperation, C as CaptionTargetResolution, a as CreateTrackOperation, D as DeleteClipOperation, E as ExtendSequenceOperation, M as MoveClipOperation, P as PlaceClipOperation, Q as QueueExportOperation, S as SEQUENCE_OPERATION_TYPES, b as SequenceApplyResult, c as SequenceOperation, d as SequenceOperationContext, e as SequenceOperationType, f as SequencePlan, g as SetClipDisabledOperation, h as SetClipTextOperation, i as SplitClipOperation, T as TrimClipOperation, j as applySequenceOperation, k as applySequenceOperations, l as assertSequenceMediaUrl, m as captionTrackNameForLanguage, n as lastClipEndFrame, p as parseSequenceOperations, r as resolveCaptionPlacement, o as resolveCaptionTarget, q as resolvePlaceClipTrack, v as validateAddCaption, s as validateCreateTrack, t as validateDeleteClip, u as validateExtendSequence, w as validateMoveClip, x as validatePlaceClip, y as validateQueueExport, z as validateSequenceOperation, B as validateSequenceOperations, F as validateSetClipDisabled, G as validateSetClipText, H as validateSplitClip, I as validateTrimClip } from '../apply-6wlMOLf8.js';
4
+ import { S as ScopedMcpServerEntryOptions, A as AppToolMcpServer } from '../mcp-BjPqQ-3C.js';
5
+ export { M as SEQUENCES_MCP_PROTOCOL_VERSIONS } from '../mcp-rpc-BfUOsalw.js';
6
+ import '../types-CBRyqijY.js';
7
+ import '../auth-_FU8w01b.js';
8
8
 
9
9
  /**
10
10
  * Pure interchange-format builders over `SequenceTimeline` — SRT, WebVTT,
@@ -22,6 +22,7 @@ import '../auth-DuptSkWh.js';
22
22
  * renders, and a cue or event for an invisible clip is a lie.
23
23
  */
24
24
 
25
+ /** Define options to export captions filtered by an optional BCP-47 language tag */
25
26
  interface CaptionExportOptions {
26
27
  /** BCP-47 tag; matched case-insensitively against `clip.language`. Clips
27
28
  * with no language never match a language-scoped export. */
@@ -38,30 +39,36 @@ declare function buildVtt(timeline: SequenceTimeline, opts?: CaptionExportOption
38
39
  * in/out from `startFrame`. Timecodes are non-drop `HH:MM:SS:FF` at the
39
40
  * sequence fps. Throws when the timeline has no video/audio clips. */
40
41
  declare function buildEdl(timeline: SequenceTimeline): string;
42
+ /** Represent a rational time value with a specific rate and numeric value for OTIO schema */
41
43
  interface OtioRationalTime {
42
44
  OTIO_SCHEMA: 'RationalTime.1';
43
45
  rate: number;
44
46
  value: number;
45
47
  }
48
+ /** Define a time range with a start time and duration using OtioRationalTime values */
46
49
  interface OtioTimeRange {
47
50
  OTIO_SCHEMA: 'TimeRange.1';
48
51
  start_time: OtioRationalTime;
49
52
  duration: OtioRationalTime;
50
53
  }
54
+ /** Define the structure for an external media reference with schema, URL, and optional time range */
51
55
  interface OtioExternalReference {
52
56
  OTIO_SCHEMA: 'ExternalReference.1';
53
57
  target_url: string;
54
58
  /** Natural extent of the source media when known; null when unknown. */
55
59
  available_range: OtioTimeRange | null;
56
60
  }
61
+ /** Represent missing references in OTIO with a fixed schema identifier */
57
62
  interface OtioMissingReference {
58
63
  OTIO_SCHEMA: 'MissingReference.1';
59
64
  }
65
+ /** Define the structure for a gap element with schema, name, and source time range properties */
60
66
  interface OtioGap {
61
67
  OTIO_SCHEMA: 'Gap.1';
62
68
  name: string;
63
69
  source_range: OtioTimeRange;
64
70
  }
71
+ /** Define a clip object with metadata, source range, and media reference according to OTIO schema */
65
72
  interface OtioClip {
66
73
  OTIO_SCHEMA: 'Clip.2';
67
74
  name: string;
@@ -69,6 +76,7 @@ interface OtioClip {
69
76
  media_reference: OtioExternalReference | OtioMissingReference;
70
77
  metadata: Record<string, unknown>;
71
78
  }
79
+ /** Define a track containing video or audio clips with metadata and child elements */
72
80
  interface OtioTrack {
73
81
  OTIO_SCHEMA: 'Track.1';
74
82
  name: string;
@@ -76,11 +84,13 @@ interface OtioTrack {
76
84
  metadata: Record<string, unknown>;
77
85
  children: Array<OtioClip | OtioGap>;
78
86
  }
87
+ /** Represent a stack container holding a named collection of OtioTrack children */
79
88
  interface OtioStack {
80
89
  OTIO_SCHEMA: 'Stack.1';
81
90
  name: string;
82
91
  children: OtioTrack[];
83
92
  }
93
+ /** Define the structure of a timeline with metadata, tracks, and global start time in OTIO format */
84
94
  interface OtioTimeline {
85
95
  OTIO_SCHEMA: 'Timeline.1';
86
96
  name: string;
@@ -100,6 +110,7 @@ interface OtioTimeline {
100
110
  * carry decision markers, never media, and are excluded.
101
111
  */
102
112
  declare function buildOtio(timeline: SequenceTimeline): OtioTimeline;
113
+ /** Describe a single entry in a contact sheet with timing and media source details */
103
114
  interface ContactSheetEntry {
104
115
  clipId: string;
105
116
  trackId: string;
@@ -115,6 +126,7 @@ interface ContactSheetEntry {
115
126
  url: string;
116
127
  mediaKind: SequenceMediaKind;
117
128
  }
129
+ /** Define the structure for a contact sheet manifest including metadata and entries */
118
130
  interface ContactSheetManifest {
119
131
  sequenceId: string;
120
132
  title: string;
@@ -159,6 +171,7 @@ interface CaptionChunk {
159
171
  startFrame: number;
160
172
  durationFrames: number;
161
173
  }
174
+ /** Define options to configure caption chunk size, duration, and frame rate constraints */
162
175
  interface BuildCaptionChunksOptions {
163
176
  /** Upper bound on words per caption; segments split on word boundaries. */
164
177
  maxWordsPerChunk?: number;
@@ -189,6 +202,7 @@ declare function buildCaptionChunks(segments: TranscriptSegment[], opts: BuildCa
189
202
  * subtags lowercase. Throws on empty or structurally invalid tags.
190
203
  */
191
204
  declare function normalizeLanguageTag(tag: string): string;
205
+ /** Define options to specify target languages and an optional source language for fan-out operations */
192
206
  interface LanguageFanoutOptions {
193
207
  languages: string[];
194
208
  /** Excluded from the plan (exact normalized match only — 'en' does not
@@ -250,19 +264,25 @@ interface SequenceMcpToolEnv {
250
264
  store: SequenceStore;
251
265
  playheadFrame: number;
252
266
  }
267
+ /** Define a tool with metadata and a run method for processing input within a specific environment */
253
268
  interface SequenceMcpToolDefinition {
254
269
  name: string;
255
270
  description: string;
256
271
  inputSchema: Record<string, unknown>;
257
272
  run(args: Record<string, unknown>, env: SequenceMcpToolEnv): Promise<unknown>;
258
273
  }
274
+ /** Define supported export formats for sequence outputs including video, subtitle, and metadata types */
259
275
  declare const SEQUENCE_EXPORT_FORMATS: readonly ["mp4", "otio", "xml", "edl", "vtt", "srt", "contact_sheet"];
276
+ /** Define immutable sequence track kinds for video, audio, caption, reference, and agent */
260
277
  declare const SEQUENCE_TRACK_KINDS: readonly ["video", "audio", "caption", "reference", "agent"];
278
+ /** Define the allowed media kinds for sequences including video, image, and audio */
261
279
  declare const SEQUENCE_MEDIA_KINDS: readonly ["video", "image", "audio"];
262
280
  /** Largest accepted `add_captions` batch — bounds one decision row / one
263
281
  * validation pass to a size the store can absorb in a single request. */
264
282
  declare const MAX_CAPTION_BATCH = 500;
283
+ /** Resolve an array of immutable sequence MCP tool definitions for timeline and frame operations */
265
284
  declare const SEQUENCE_MCP_TOOLS: readonly SequenceMcpToolDefinition[];
285
+ /** Resolve the SequenceMcpToolDefinition matching the given name or return undefined */
266
286
  declare function findSequenceMcpTool(name: string): SequenceMcpToolDefinition | undefined;
267
287
 
268
288
  /**
@@ -284,10 +304,12 @@ declare function findSequenceMcpTool(name: string): SequenceMcpToolDefinition |
284
304
  * is a thin adapter wiring the sequences tool list + playhead env.
285
305
  */
286
306
 
307
+ /** Describe server information including name and version for Sequences MCP integration */
287
308
  interface SequencesMcpServerInfo {
288
309
  name: string;
289
310
  version: string;
290
311
  }
312
+ /** Define options for creating sequences MCP handler including store, playhead frame, and server info */
291
313
  interface CreateSequencesMcpHandlerOptions {
292
314
  /** Already scoped + authorized for one (workspace, sequence, actor). */
293
315
  store: SequenceStore;
@@ -296,6 +318,7 @@ interface CreateSequencesMcpHandlerOptions {
296
318
  playheadFrame?: number;
297
319
  serverInfo?: SequencesMcpServerInfo;
298
320
  }
321
+ /** Create a handler to process MCP sequence requests with optional playhead frame and server info */
299
322
  declare function createSequencesMcpHandler(opts: CreateSequencesMcpHandlerOptions): (request: Request) => Promise<Response>;
300
323
 
301
324
  /**
@@ -307,7 +330,9 @@ declare function createSequencesMcpHandler(opts: CreateSequencesMcpHandlerOption
307
330
  * domain-specific values are this channel's default description and name.
308
331
  */
309
332
 
333
+ /** Describe live timeline editor features for current video sequence including clip and caption management */
310
334
  declare const DEFAULT_SEQUENCES_MCP_DESCRIPTION = "Live timeline editor for the current video sequence: read timeline state, place/move/trim/split clips, add captions, manage tracks, and queue exports. All times are seconds.";
335
+ /** Extend ScopedMcpServerEntryOptions to configure MCP server entry options for sequence building */
311
336
  type BuildSequencesMcpServerEntryOptions = ScopedMcpServerEntryOptions;
312
337
  /** Build the `AgentProfileMcpServer`-shaped entry for the sequences channel. */
313
338
  declare function buildSequencesMcpServerEntry(opts: BuildSequencesMcpServerEntryOptions): AppToolMcpServer;