@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.
- package/dist/DesignCanvas-UNL34LS2.js +12 -0
- package/dist/DesignCanvasEditor-FJIVYOA2.js +13 -0
- package/dist/IntakeInterview-3ZIQMZS6.js +8 -0
- package/dist/InvitationsPanel-CJ7DR4F7.js +8 -0
- package/dist/MembersPanel-BB4OD2KB.js +8 -0
- package/dist/{TimelineEditor-I35SJJAJ.js → TimelineEditor-2ECKSU6P.js} +3 -3
- package/dist/{VaultPane-DrQ_tH6c.d.ts → VaultPane-BDP6SB_K.d.ts} +1 -0
- package/dist/{access-BZ81Btt5.d.ts → access-490O6aOU.d.ts} +16 -1
- package/dist/app-auth/index.d.ts +6 -1
- package/dist/app-auth/index.js +3 -3
- package/dist/app-auth/index.js.map +1 -1
- package/dist/{apply-Gk4raT2j.d.ts → apply-6wlMOLf8.d.ts} +30 -1
- package/dist/assets/index.d.ts +41 -0
- package/dist/assets/index.js +1 -1
- package/dist/assistant/index.d.ts +26 -6
- package/dist/assistant/index.js +9 -9
- package/dist/assistant/index.js.map +1 -1
- package/dist/{attachment-validation-D0csjCvz.d.ts → attachment-validation-tPRp-PP1.d.ts} +7 -1
- package/dist/{auth-DuptSkWh.d.ts → auth-_FU8w01b.d.ts} +4 -1
- package/dist/billing/index.d.ts +8 -0
- package/dist/billing/index.js +1 -1
- package/dist/brand/index.d.ts +2 -0
- package/dist/brand/index.js.map +1 -1
- package/dist/brand-extraction/index.d.ts +3 -0
- package/dist/brand-extraction/index.js.map +1 -1
- package/dist/catalog/index.d.ts +2 -0
- package/dist/catalog/index.js +1 -1
- package/dist/chat-routes/index.d.ts +41 -10
- package/dist/chat-routes/index.js +15 -15
- package/dist/chat-routes/index.js.map +1 -1
- package/dist/chat-store/index.d.ts +18 -4
- package/dist/chat-store/index.js +4 -4
- package/dist/chat-store/index.js.map +1 -1
- package/dist/{chunk-H5FM75MR.js → chunk-22GLESKE.js} +3 -3
- package/dist/chunk-22GLESKE.js.map +1 -0
- package/dist/{chunk-WEBBJBDH.js → chunk-2DRYTJHI.js} +1 -1
- package/dist/chunk-2DRYTJHI.js.map +1 -0
- package/dist/{chunk-7EVZUIHW.js → chunk-3EJ6SFJI.js} +1 -1
- package/dist/chunk-3EJ6SFJI.js.map +1 -0
- package/dist/{chunk-HRJJH3RX.js → chunk-3OFQFW5K.js} +4 -4
- package/dist/chunk-3OFQFW5K.js.map +1 -0
- package/dist/{chunk-7SUPA2YT.js → chunk-4KKXZQPT.js} +2 -2
- package/dist/chunk-4KKXZQPT.js.map +1 -0
- package/dist/{chunk-5PTGEJZL.js → chunk-5SD6HT2V.js} +1 -1
- package/dist/chunk-5SD6HT2V.js.map +1 -0
- package/dist/{chunk-7C64WKAH.js → chunk-5SXS3YAB.js} +2 -2
- package/dist/{chunk-L2TG5DBW.js → chunk-5TESA4SN.js} +1 -1
- package/dist/chunk-5TESA4SN.js.map +1 -0
- package/dist/{chunk-63CE7FEZ.js → chunk-6XIAPIW6.js} +1 -1
- package/dist/chunk-6XIAPIW6.js.map +1 -0
- package/dist/{chunk-MFRCM32T.js → chunk-7CTIUCQ4.js} +1 -1
- package/dist/chunk-7CTIUCQ4.js.map +1 -0
- package/dist/{chunk-6KVH5SP5.js → chunk-7YW6EBDX.js} +2 -2
- package/dist/chunk-7YW6EBDX.js.map +1 -0
- package/dist/{chunk-ZXNXAQAH.js → chunk-AP2UXKUK.js} +1 -1
- package/dist/chunk-AP2UXKUK.js.map +1 -0
- package/dist/{chunk-K63OWUDJ.js → chunk-BPSV5AA2.js} +2 -2
- package/dist/chunk-BPSV5AA2.js.map +1 -0
- package/dist/{chunk-MFI4ZM7W.js → chunk-BT4QFCTB.js} +1 -1
- package/dist/chunk-BT4QFCTB.js.map +1 -0
- package/dist/{chunk-ZYBWGSAZ.js → chunk-BVKQKGRK.js} +1 -1
- package/dist/chunk-BVKQKGRK.js.map +1 -0
- package/dist/{chunk-RVUISYUE.js → chunk-C3NSB66C.js} +7 -7
- package/dist/chunk-C3NSB66C.js.map +1 -0
- package/dist/{chunk-BQV42AFK.js → chunk-CCVWR33L.js} +1 -1
- package/dist/chunk-CCVWR33L.js.map +1 -0
- package/dist/{chunk-MCJSS6SM.js → chunk-CQZSAR77.js} +1 -1
- package/dist/chunk-CQZSAR77.js.map +1 -0
- package/dist/{chunk-3SVAA3MA.js → chunk-DJ4VJIH5.js} +1 -1
- package/dist/chunk-DJ4VJIH5.js.map +1 -0
- package/dist/{chunk-XKBIYSSM.js → chunk-DTSPS2HV.js} +3 -3
- package/dist/chunk-DTSPS2HV.js.map +1 -0
- package/dist/{chunk-4QN75UHX.js → chunk-E7N67FYI.js} +8 -8
- package/dist/chunk-E7N67FYI.js.map +1 -0
- package/dist/{chunk-2QI7XV2T.js → chunk-FBVLEGEG.js} +1 -1
- package/dist/{chunk-2QI7XV2T.js.map → chunk-FBVLEGEG.js.map} +1 -1
- package/dist/{chunk-5RMIUJDI.js → chunk-FKCB5FTD.js} +1 -1
- package/dist/chunk-FKCB5FTD.js.map +1 -0
- package/dist/{chunk-EEPJGZJW.js → chunk-GPBRL2XR.js} +1 -1
- package/dist/chunk-GPBRL2XR.js.map +1 -0
- package/dist/{chunk-G3HCU7TA.js → chunk-GXE6KHTS.js} +1 -1
- package/dist/chunk-GXE6KHTS.js.map +1 -0
- package/dist/{chunk-65P3HJY3.js → chunk-HCOROIRT.js} +1 -1
- package/dist/chunk-HCOROIRT.js.map +1 -0
- package/dist/{chunk-54GSK2KK.js → chunk-HYTIHYNV.js} +2 -2
- package/dist/chunk-HYTIHYNV.js.map +1 -0
- package/dist/{chunk-5MG74GVQ.js → chunk-IG46XCZM.js} +3 -3
- package/dist/chunk-IG46XCZM.js.map +1 -0
- package/dist/{chunk-ND3XEGBE.js → chunk-JDEGS53O.js} +1 -1
- package/dist/chunk-JDEGS53O.js.map +1 -0
- package/dist/{chunk-7W5XSTUF.js → chunk-JML7WKWU.js} +1 -1
- package/dist/chunk-JML7WKWU.js.map +1 -0
- package/dist/{chunk-Q4TKVF3L.js → chunk-JTLYXUEV.js} +1 -1
- package/dist/chunk-JTLYXUEV.js.map +1 -0
- package/dist/{chunk-CCRVDLV3.js → chunk-JWBZ74TW.js} +2 -2
- package/dist/chunk-JWBZ74TW.js.map +1 -0
- package/dist/{chunk-ZU5GNSOJ.js → chunk-K3LIPKFV.js} +3 -3
- package/dist/chunk-K3LIPKFV.js.map +1 -0
- package/dist/{chunk-GQRL6VNU.js → chunk-LGBO24FL.js} +1 -1
- package/dist/chunk-LGBO24FL.js.map +1 -0
- package/dist/{chunk-SWUVTGMR.js → chunk-MEUNTJL5.js} +3 -3
- package/dist/{chunk-SWUVTGMR.js.map → chunk-MEUNTJL5.js.map} +1 -1
- package/dist/{chunk-YNALYIQ3.js → chunk-NLSSFLLS.js} +1 -1
- package/dist/chunk-NLSSFLLS.js.map +1 -0
- package/dist/{chunk-HFC4BTWJ.js → chunk-PTUMBMVH.js} +1 -1
- package/dist/chunk-PTUMBMVH.js.map +1 -0
- package/dist/{chunk-R4NOKZMD.js → chunk-ROLFDOMJ.js} +3 -3
- package/dist/{chunk-NYATNLRK.js → chunk-RT5RKAFX.js} +1 -1
- package/dist/chunk-RT5RKAFX.js.map +1 -0
- package/dist/{chunk-GNL3MG5J.js → chunk-S564OFTL.js} +2 -2
- package/dist/{chunk-GUSCYE3S.js → chunk-TQOFR6XY.js} +1 -1
- package/dist/chunk-TQOFR6XY.js.map +1 -0
- package/dist/{chunk-47C6PJCW.js → chunk-TZO3SOUL.js} +1 -1
- package/dist/chunk-TZO3SOUL.js.map +1 -0
- package/dist/{chunk-YGUNTIT5.js → chunk-UKTYKG57.js} +1 -1
- package/dist/chunk-UKTYKG57.js.map +1 -0
- package/dist/{chunk-23LUHHHN.js → chunk-VCOD5AOR.js} +1 -1
- package/dist/chunk-VCOD5AOR.js.map +1 -0
- package/dist/{chunk-5I72FRZY.js → chunk-VOJB7MVG.js} +2 -2
- package/dist/{chunk-XWJXZ6WE.js → chunk-VTWKH4YU.js} +2 -2
- package/dist/chunk-VTWKH4YU.js.map +1 -0
- package/dist/{chunk-4K7BZYO7.js → chunk-VWAEWOWK.js} +3 -3
- package/dist/chunk-VWAEWOWK.js.map +1 -0
- package/dist/{chunk-M2EBUDZ7.js → chunk-VWOPOLVO.js} +2 -2
- package/dist/chunk-VWOPOLVO.js.map +1 -0
- package/dist/{chunk-BN2USWIR.js → chunk-VYECQAGM.js} +2 -2
- package/dist/chunk-VYECQAGM.js.map +1 -0
- package/dist/{chunk-SIXYZ2FB.js → chunk-YJMCRXQQ.js} +1 -1
- package/dist/chunk-YJMCRXQQ.js.map +1 -0
- package/dist/{chunk-PJC4NXPA.js → chunk-YKBDH2UY.js} +3 -3
- package/dist/chunk-YKBDH2UY.js.map +1 -0
- package/dist/{chunk-XAWFPMAR.js → chunk-YKOM4ZLQ.js} +1 -1
- package/dist/chunk-YKOM4ZLQ.js.map +1 -0
- package/dist/{chunk-TKVJE63N.js → chunk-YRMLYFVR.js} +3 -3
- package/dist/chunk-YRMLYFVR.js.map +1 -0
- package/dist/{chunk-USYXHDKE.js → chunk-YZ6KQULN.js} +2 -2
- package/dist/{command-stack-B_-WNfZU.d.ts → command-stack-TNPWJCzW.d.ts} +14 -2
- package/dist/{completion-Kaqp_tWk.d.ts → completion-CvcNUz07.d.ts} +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/{contract-KfqJh_au.d.ts → contract-TjB68uqA.d.ts} +17 -0
- package/dist/design-canvas/drizzle.d.ts +10 -2
- package/dist/design-canvas/drizzle.js.map +1 -1
- package/dist/design-canvas/index.d.ts +29 -11
- package/dist/design-canvas/index.js +1070 -17
- package/dist/design-canvas/index.js.map +1 -1
- package/dist/design-canvas-react/engine.d.ts +42 -6
- package/dist/design-canvas-react/engine.js +4 -4
- package/dist/design-canvas-react/index.d.ts +12 -7
- package/dist/design-canvas-react/index.js +11 -11
- package/dist/design-canvas-react/index.js.map +1 -1
- package/dist/design-canvas-react/lazy.d.ts +4 -4
- package/dist/design-canvas-react/lazy.js +1 -1
- package/dist/durable-chat/index.d.ts +46 -1
- package/dist/durable-chat/index.js +3 -3
- package/dist/eval/index.d.ts +1 -1
- package/dist/{export-presets-DAsU5Wal.d.ts → export-presets-mgVulRaV.d.ts} +10 -1
- package/dist/{flow-types-Cb_AblZs.d.ts → flow-types-CqomVAUN.d.ts} +1 -0
- package/dist/harness/index.d.ts +5 -0
- package/dist/harness/index.js +1 -1
- package/dist/index.d.ts +10 -18
- package/dist/index.js +30 -231
- package/dist/intakes/api.d.ts +3 -2
- package/dist/intakes/api.js +3 -3
- package/dist/intakes/api.js.map +1 -1
- package/dist/intakes/drizzle.d.ts +10 -2
- package/dist/intakes/drizzle.js +3 -3
- package/dist/intakes/drizzle.js.map +1 -1
- package/dist/intakes/index.d.ts +2 -2
- package/dist/intakes/index.js +2 -2
- package/dist/intakes-react/index.d.ts +2 -1
- package/dist/intakes-react/index.js +2 -2
- package/dist/intakes-react/lazy.d.ts +2 -1
- package/dist/intakes-react/lazy.js +1 -1
- package/dist/intakes-react/lazy.js.map +1 -1
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.js +1 -1
- package/dist/interactions/index.d.ts +13 -2
- package/dist/interactions/index.js +2 -2
- package/dist/{invitations-CZ5G2tIn.d.ts → invitations-DoYMvXea.d.ts} +11 -1
- package/dist/{invitations-schema-DaMO4hZE.d.ts → invitations-schema-_fI7HkJP.d.ts} +5 -1
- package/dist/knowledge/index.d.ts +2 -0
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge-loop/index.d.ts +4 -1
- package/dist/knowledge-loop/index.js +1 -1
- package/dist/{lazy-C7LiVeFt.d.ts → lazy-DrkVyDpe.d.ts} +2 -2
- package/dist/{mcp-BHfIoGLW.d.ts → mcp-BjPqQ-3C.d.ts} +4 -2
- package/dist/{mcp-rpc-DLw_r9PQ.d.ts → mcp-rpc-BfUOsalw.d.ts} +3 -0
- package/dist/missions/index.d.ts +25 -0
- package/dist/missions/index.js +1 -1
- package/dist/{model-Bzi5i63l.d.ts → model-C8U0HZxL.d.ts} +1 -0
- package/dist/{model-dF2h4xT9.d.ts → model-DmdkIteM.d.ts} +19 -0
- package/dist/{model-BBwyOuWG.d.ts → model-DnfO_PdJ.d.ts} +25 -1
- package/dist/model-resolution/index.d.ts +10 -0
- package/dist/model-resolution/index.js.map +1 -1
- package/dist/{operations-DLIvvD00.d.ts → operations-ByJ6yXOW.d.ts} +20 -2
- package/dist/{parts-1sRYSPjF.d.ts → parts-n9XUon0a.d.ts} +29 -1
- package/dist/plans/index.d.ts +6 -0
- package/dist/plans/index.js +1 -1
- package/dist/platform/index.d.ts +24 -2
- package/dist/platform/index.js +3 -3
- package/dist/platform/index.js.map +1 -1
- package/dist/preflight/index.d.ts +3 -0
- package/dist/preflight/index.js +1 -1
- package/dist/preset-cloudflare/index.d.ts +4 -1
- package/dist/preset-cloudflare/index.js +2 -2
- package/dist/redact/index.d.ts +5 -0
- package/dist/redact/index.js +1 -1
- package/dist/{roles-BC1n4t37.d.ts → roles-B4nU3jDi.d.ts} +12 -0
- package/dist/run/index.d.ts +3 -0
- package/dist/run/index.js +1 -1
- package/dist/run/index.js.map +1 -1
- package/dist/runtime/index.d.ts +11 -4
- package/dist/runtime/index.js +4 -4
- package/dist/sandbox/index.d.ts +96 -3
- package/dist/sandbox/index.js +6 -6
- package/dist/{sandbox-terminal-BIIC__CP.d.ts → sandbox-terminal-ChNEdHF8.d.ts} +5 -0
- package/dist/sequences/drizzle.d.ts +11 -1
- package/dist/sequences/drizzle.js +1 -1
- package/dist/sequences/drizzle.js.map +1 -1
- package/dist/sequences/index.d.ts +32 -7
- package/dist/sequences/index.js +1562 -47
- package/dist/sequences/index.js.map +1 -1
- package/dist/sequences-react/index.d.ts +32 -2
- package/dist/sequences-react/index.js +3 -3
- package/dist/sequences-react/index.js.map +1 -1
- package/dist/{sso-CNOsARMJ.d.ts → sso-Cm00S61u.d.ts} +13 -0
- package/dist/{stale-turn-lock-C8Na1cFZ.d.ts → stale-turn-lock-DucQzvXu.d.ts} +2 -0
- package/dist/store/index.d.ts +5 -0
- package/dist/store/index.js.map +1 -1
- package/dist/{store-gckrNq-g.d.ts → store-B7LLlk9p.d.ts} +22 -1
- package/dist/{store-CFyxgTlD.d.ts → store-CqfDtnPQ.d.ts} +8 -2
- package/dist/stream/index.d.ts +10 -4
- package/dist/stream/index.js +4 -4
- package/dist/{stream-normalizer-DWvtmY6F.d.ts → stream-normalizer-C3M--r6y.d.ts} +17 -1
- package/dist/studio/index.d.ts +37 -0
- package/dist/studio/index.js +1 -1
- package/dist/studio-react/index.d.ts +3 -0
- package/dist/studio-react/index.js +1 -1
- package/dist/studio-react/index.js.map +1 -1
- package/dist/tangle/index.d.ts +3 -0
- package/dist/tangle/index.js +1 -1
- package/dist/teams/drizzle.d.ts +8 -4
- package/dist/teams/drizzle.js +1 -1
- package/dist/teams/drizzle.js.map +1 -1
- package/dist/teams/index.d.ts +4 -2
- package/dist/teams/index.js +3 -3
- package/dist/teams/invitations-api.d.ts +10 -4
- package/dist/teams/invitations-api.js +4 -4
- package/dist/teams/invitations-api.js.map +1 -1
- package/dist/teams/members-api.d.ts +4 -2
- package/dist/teams/members-api.js +3 -3
- package/dist/teams/resend.d.ts +5 -4
- package/dist/teams/resend.js +1 -1
- package/dist/teams/resend.js.map +1 -1
- package/dist/teams-react/index.d.ts +7 -2
- package/dist/teams-react/index.js +3 -3
- package/dist/teams-react/lazy.d.ts +5 -2
- package/dist/teams-react/lazy.js +2 -2
- package/dist/teams-react/lazy.js.map +1 -1
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +1 -1
- package/dist/theme/tailwind-preset.d.ts +1 -0
- package/dist/theme/tailwind-preset.js.map +1 -1
- package/dist/theme-contract/cli.js +1 -1
- package/dist/theme-contract/index.d.ts +3 -0
- package/dist/theme-contract/index.js +1 -1
- package/dist/tools/index.d.ts +13 -6
- package/dist/tools/index.js +3 -3
- package/dist/trace/index.d.ts +6 -1
- package/dist/trace/index.js +2 -2
- package/dist/{turn-buffer-C9mEgoop.d.ts → turn-buffer-DGnAPKwa.d.ts} +6 -0
- package/dist/turn-stream/index.d.ts +28 -2
- package/dist/turn-stream/index.js +1 -1
- package/dist/turn-stream/index.js.map +1 -1
- package/dist/{types-BEOvc_ue.d.ts → types-CBRyqijY.d.ts} +10 -0
- package/dist/vault/index.d.ts +1 -1
- package/dist/vault/lazy.d.ts +3 -2
- package/dist/vault/lazy.js.map +1 -1
- package/dist/web/index.d.ts +4 -0
- package/dist/web/index.js +1 -1
- package/dist/web-react/index.d.ts +51 -8
- package/dist/web-react/index.js +9 -9
- package/dist/web-react/terminal.d.ts +2 -2
- package/dist/web-react/terminal.js +1 -1
- package/package.json +3 -2
- package/dist/DesignCanvas-5DJAFDNC.js +0 -12
- package/dist/DesignCanvasEditor-XUJZARSN.js +0 -13
- package/dist/IntakeInterview-WHVKMNQW.js +0 -8
- package/dist/InvitationsPanel-XUUWZBPV.js +0 -8
- package/dist/MembersPanel-FOVHWUQ3.js +0 -8
- package/dist/chunk-23LUHHHN.js.map +0 -1
- package/dist/chunk-3SVAA3MA.js.map +0 -1
- package/dist/chunk-47C6PJCW.js.map +0 -1
- package/dist/chunk-4K7BZYO7.js.map +0 -1
- package/dist/chunk-4QN75UHX.js.map +0 -1
- package/dist/chunk-54GSK2KK.js.map +0 -1
- package/dist/chunk-5MG74GVQ.js.map +0 -1
- package/dist/chunk-5PTGEJZL.js.map +0 -1
- package/dist/chunk-5RMIUJDI.js.map +0 -1
- package/dist/chunk-63CE7FEZ.js.map +0 -1
- package/dist/chunk-65P3HJY3.js.map +0 -1
- package/dist/chunk-6KVH5SP5.js.map +0 -1
- package/dist/chunk-7EVZUIHW.js.map +0 -1
- package/dist/chunk-7SUPA2YT.js.map +0 -1
- package/dist/chunk-7W5XSTUF.js.map +0 -1
- package/dist/chunk-BN2USWIR.js.map +0 -1
- package/dist/chunk-BQV42AFK.js.map +0 -1
- package/dist/chunk-CCRVDLV3.js.map +0 -1
- package/dist/chunk-EEPJGZJW.js.map +0 -1
- package/dist/chunk-G3HCU7TA.js.map +0 -1
- package/dist/chunk-GQRL6VNU.js.map +0 -1
- package/dist/chunk-GUSCYE3S.js.map +0 -1
- package/dist/chunk-H5FM75MR.js.map +0 -1
- package/dist/chunk-HFC4BTWJ.js.map +0 -1
- package/dist/chunk-HRJJH3RX.js.map +0 -1
- package/dist/chunk-K63OWUDJ.js.map +0 -1
- package/dist/chunk-L2TG5DBW.js.map +0 -1
- package/dist/chunk-M2EBUDZ7.js.map +0 -1
- package/dist/chunk-MCJSS6SM.js.map +0 -1
- package/dist/chunk-MFI4ZM7W.js.map +0 -1
- package/dist/chunk-MFRCM32T.js.map +0 -1
- package/dist/chunk-ND3XEGBE.js.map +0 -1
- package/dist/chunk-NEOV2NQ3.js +0 -1617
- package/dist/chunk-NEOV2NQ3.js.map +0 -1
- package/dist/chunk-NYATNLRK.js.map +0 -1
- package/dist/chunk-PJC4NXPA.js.map +0 -1
- package/dist/chunk-Q4TKVF3L.js.map +0 -1
- package/dist/chunk-RVUISYUE.js.map +0 -1
- package/dist/chunk-SIXYZ2FB.js.map +0 -1
- package/dist/chunk-TKVJE63N.js.map +0 -1
- package/dist/chunk-WEBBJBDH.js.map +0 -1
- package/dist/chunk-WFMUDX5J.js +0 -1092
- package/dist/chunk-WFMUDX5J.js.map +0 -1
- package/dist/chunk-XAWFPMAR.js.map +0 -1
- package/dist/chunk-XKBIYSSM.js.map +0 -1
- package/dist/chunk-XWJXZ6WE.js.map +0 -1
- package/dist/chunk-YGUNTIT5.js.map +0 -1
- package/dist/chunk-YNALYIQ3.js.map +0 -1
- package/dist/chunk-ZU5GNSOJ.js.map +0 -1
- package/dist/chunk-ZXNXAQAH.js.map +0 -1
- package/dist/chunk-ZYBWGSAZ.js.map +0 -1
- /package/dist/{DesignCanvas-5DJAFDNC.js.map → DesignCanvas-UNL34LS2.js.map} +0 -0
- /package/dist/{DesignCanvasEditor-XUJZARSN.js.map → DesignCanvasEditor-FJIVYOA2.js.map} +0 -0
- /package/dist/{IntakeInterview-WHVKMNQW.js.map → IntakeInterview-3ZIQMZS6.js.map} +0 -0
- /package/dist/{InvitationsPanel-XUUWZBPV.js.map → InvitationsPanel-CJ7DR4F7.js.map} +0 -0
- /package/dist/{MembersPanel-FOVHWUQ3.js.map → MembersPanel-BB4OD2KB.js.map} +0 -0
- /package/dist/{TimelineEditor-I35SJJAJ.js.map → TimelineEditor-2ECKSU6P.js.map} +0 -0
- /package/dist/{chunk-7C64WKAH.js.map → chunk-5SXS3YAB.js.map} +0 -0
- /package/dist/{chunk-R4NOKZMD.js.map → chunk-ROLFDOMJ.js.map} +0 -0
- /package/dist/{chunk-GNL3MG5J.js.map → chunk-S564OFTL.js.map} +0 -0
- /package/dist/{chunk-5I72FRZY.js.map → chunk-VOJB7MVG.js.map} +0 -0
- /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,
|
|
2
|
-
export { M as MIN_SEQUENCE_CLIP_FRAMES, N as NewSequenceClip,
|
|
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-
|
|
4
|
-
import { S as ScopedMcpServerEntryOptions, A as AppToolMcpServer } from '../mcp-
|
|
5
|
-
export { M as SEQUENCES_MCP_PROTOCOL_VERSIONS } from '../mcp-rpc-
|
|
6
|
-
import '../types-
|
|
7
|
-
import '../auth-
|
|
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;
|