@cueframe/kernel 0.0.1 → 0.1.1

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 (432) hide show
  1. package/LICENSE +661 -0
  2. package/dist/_members/account-model/testing/conversationStoreContract.d.ts +1 -1
  3. package/dist/_members/authoring/providers/resourceApi.d.ts +1 -1
  4. package/dist/_members/authoring/transpileComponent.d.ts +1 -1
  5. package/dist/_members/cloud-import/CloudImportService.d.ts +35 -0
  6. package/dist/_members/cloud-import/ImportProvider.d.ts +73 -0
  7. package/dist/_members/cloud-import/MediaItemPreprocessor.d.ts +27 -0
  8. package/dist/_members/cloud-import/cloudConfig.d.ts +23 -0
  9. package/dist/_members/cloud-import/index.d.ts +9 -0
  10. package/dist/_members/cloud-import/multipartUpload.d.ts +12 -0
  11. package/dist/_members/composition/ops/compositionOps.d.ts +2 -1
  12. package/dist/_members/composition/ops/types.d.ts +1 -1
  13. package/dist/_members/composition/projection/behind-readiness.d.ts +127 -0
  14. package/dist/_members/composition/projection/index.d.ts +2 -0
  15. package/dist/_members/composition/projection/reframe-readiness.d.ts +156 -0
  16. package/dist/_members/composition/timeline/placement.d.ts +1 -1
  17. package/dist/_members/composition/validators/composition.d.ts +43 -26
  18. package/dist/_members/composition/validators/render.d.ts +32 -0
  19. package/dist/_members/composition-ops/index.d.ts +1 -1
  20. package/dist/_members/composition-ops/opRecorder.d.ts +1 -1
  21. package/dist/_members/convex-api/api.d.ts +5 -0
  22. package/dist/_members/convex-api/dataModel.d.ts +6 -0
  23. package/dist/_members/core/render/compositionRender.d.ts +17 -1
  24. package/dist/_members/core/render/exportSettings.d.ts +1 -1
  25. package/dist/_members/core/render/types.d.ts +31 -0
  26. package/dist/_members/mcp/curation.d.ts +1 -1
  27. package/dist/_members/plane/conformance.d.ts +1 -1
  28. package/dist/_members/render-harness/localRender.d.ts +1 -1
  29. package/dist/animate.js +828 -79187
  30. package/dist/authoring/build-tools.js +8 -11
  31. package/dist/authoring/context.js +5 -5
  32. package/dist/authoring/models.js +1 -2
  33. package/dist/authoring/prompts.js +1 -1
  34. package/dist/authoring/tools.js +7 -7
  35. package/dist/authoring/transpileComponent.js +3 -2220
  36. package/dist/authoring.js +30 -30
  37. package/dist/brand-derivation.js +1 -1
  38. package/dist/chunk-6IU2UQI5.js +107 -0
  39. package/dist/{chunk-5I7VDCAC.js → chunk-7FO3ZJ43.js} +4 -1
  40. package/dist/{chunk-N67PDTKQ.js → chunk-ABL557OT.js} +1 -1
  41. package/dist/{chunk-MC5DLSEV.js → chunk-AP6ZIVAV.js} +15 -15
  42. package/dist/{chunk-QLAQHR3L.js → chunk-AQBREB5O.js} +1 -1
  43. package/dist/{chunk-DSNG6WLU.js → chunk-AYVJXDLB.js} +1 -4
  44. package/dist/{chunk-6CMVBTTP.js → chunk-DK2ODBNT.js} +19 -9
  45. package/dist/chunk-DSMLHYJ4.js +82 -0
  46. package/dist/{chunk-BRKJKB33.js → chunk-FYZVH3MC.js} +1 -1
  47. package/dist/{chunk-MVEE6HEC.js → chunk-GA23TRNR.js} +5 -7
  48. package/dist/chunk-HCCBDJLW.js +68 -0
  49. package/dist/{chunk-JRQVPFLF.js → chunk-HY3RIEZW.js} +1 -1
  50. package/dist/{chunk-OIRUO5P7.js → chunk-JJ6XD7NG.js} +152 -2
  51. package/dist/{_members/primitives/chunk-IDAL6G3Y.js → chunk-JQMPHKLU.js} +19 -27
  52. package/dist/{chunk-G3PBH53P.js → chunk-MBCXCJOE.js} +1 -1
  53. package/dist/{chunk-UEI3NLNK.js → chunk-MHOQTPOB.js} +1 -4
  54. package/dist/{chunk-37NJ27UU.js → chunk-OCFDUCF4.js} +3 -0
  55. package/dist/{chunk-WZTTZHNR.js → chunk-OLFOPQCA.js} +12 -9
  56. package/dist/{chunk-P43IE4WB.js → chunk-P727GZVO.js} +2 -4
  57. package/dist/{chunk-52AHXNKM.js → chunk-PDYO3DOJ.js} +5 -5
  58. package/dist/{chunk-S3P5BFFL.js → chunk-PMY24FUD.js} +2 -4
  59. package/dist/{chunk-ATAF24QG.js → chunk-PODIYN2K.js} +10 -3
  60. package/dist/chunk-RF7U3SCL.js +606 -0
  61. package/dist/{chunk-JD77Y2WM.js → chunk-SW336CJP.js} +1 -4
  62. package/dist/{chunk-TULRCY6U.js → chunk-TOJEXFXL.js} +1 -1
  63. package/dist/{chunk-ELLSET2N.js → chunk-UHGSZZDI.js} +3 -6
  64. package/dist/{chunk-M3I5LMAB.js → chunk-UY4SWJVE.js} +1 -1
  65. package/dist/{chunk-6QJ3V3VS.js → chunk-YX2GSJK7.js} +1 -1
  66. package/dist/chunk-ZT7MHRQU.js +104 -0
  67. package/dist/{chunk-NV4I6GJV.js → chunk-ZWMV6DD2.js} +27 -4
  68. package/dist/cloud-import/multipart.d.ts +1 -0
  69. package/dist/cloud-import/multipart.js +8 -0
  70. package/dist/cloud-import.d.ts +1 -0
  71. package/dist/cloud-import.js +234 -0
  72. package/dist/compose/renderer.js +19 -22
  73. package/dist/compose.js +19 -22
  74. package/dist/composition/graphics-plan.js +3 -3
  75. package/dist/composition/ops.js +4 -4
  76. package/dist/composition/primitive-catalog.js +1 -1
  77. package/dist/composition/projection.js +21 -5
  78. package/dist/composition/validators.js +6 -4
  79. package/dist/composition-ops.js +15 -13
  80. package/dist/composition.js +26 -8
  81. package/dist/{context-CEAKQ5T7.js → context-YWUZDG5X.js} +5 -5
  82. package/dist/convex-api/dataModel.d.ts +1 -0
  83. package/dist/convex-api/dataModel.js +0 -0
  84. package/dist/convex-api.d.ts +1 -0
  85. package/dist/convex-api.js +8 -0
  86. package/dist/core/render.js +3 -3
  87. package/dist/core/select.js +2 -2
  88. package/dist/core.js +3 -3
  89. package/dist/errors.js +1 -1
  90. package/dist/mcp/adapter.js +2 -5
  91. package/dist/mcp/server.js +1 -2
  92. package/dist/mcp.js +2 -95
  93. package/dist/media-model/media-kind.js +9 -98
  94. package/dist/media-model/testing.js +1071 -718
  95. package/dist/nle-export/server.js +328 -130
  96. package/dist/nle-export/xml.js +5 -22799
  97. package/dist/nle-export.js +20 -22
  98. package/dist/primitives/backgrounds.js +2 -3
  99. package/dist/primitives/captions.js +4 -243
  100. package/dist/primitives/effects.js +2 -3
  101. package/dist/primitives/hero-text.js +2 -3
  102. package/dist/primitives/layouts.js +2 -3
  103. package/dist/primitives/lib/index.js +8 -10
  104. package/dist/primitives/lib/preview.js +1 -2
  105. package/dist/primitives/lib/schema.js +1 -2
  106. package/dist/primitives/lib/text/fitText.js +1 -2
  107. package/dist/primitives/lib.js +8 -10
  108. package/dist/primitives/scenes.js +1 -2
  109. package/dist/primitives/text.js +2 -3
  110. package/dist/primitives/ui-blocks.js +4 -5
  111. package/dist/primitives.js +19 -21
  112. package/package.json +125 -16
  113. package/dist/TextureLoader-UQOFUSAP.js +0 -422
  114. package/dist/VideoTexture-AQWSPIJG.js +0 -62
  115. package/dist/_members/account-model/index.js +0 -4
  116. package/dist/_members/account-model/testing/conversationStoreContract.js +0 -168
  117. package/dist/_members/account-model/testing/index.js +0 -7
  118. package/dist/_members/account-model/testing/restorePointStoreContract.js +0 -69
  119. package/dist/_members/account-model/types/index.js +0 -1
  120. package/dist/_members/account-model/validators/contextFile.js +0 -18
  121. package/dist/_members/account-model/validators/conversation.js +0 -95
  122. package/dist/_members/account-model/validators/dashboardInsight.js +0 -16
  123. package/dist/_members/account-model/validators/index.js +0 -7
  124. package/dist/_members/account-model/validators/sessionToken.js +0 -49
  125. package/dist/_members/account-model/validators/uploadToken.js +0 -16
  126. package/dist/_members/account-model/validators/userSettings.js +0 -12
  127. package/dist/_members/account-model/validators/workingComposition.js +0 -20
  128. package/dist/_members/brand-derivation/constants.js +0 -20
  129. package/dist/_members/brand-derivation/contrastSafe.js +0 -114
  130. package/dist/_members/brand-derivation/index.js +0 -1
  131. package/dist/_members/composition/audio/audioMix.js +0 -61
  132. package/dist/_members/composition/audio/index.js +0 -5
  133. package/dist/_members/composition/audio/mixStaging.js +0 -195
  134. package/dist/_members/composition/audio/musicPack.generated.js +0 -136
  135. package/dist/_members/composition/audio/musicPack.js +0 -36
  136. package/dist/_members/composition/audio/pack.generated.js +0 -603
  137. package/dist/_members/composition/audio/pack.js +0 -48
  138. package/dist/_members/composition/audio/palette.js +0 -134
  139. package/dist/_members/composition/autozoom/index.js +0 -83
  140. package/dist/_members/composition/brand-kit.js +0 -45
  141. package/dist/_members/composition/brief/contract.js +0 -209
  142. package/dist/_members/composition/color-grade.js +0 -80
  143. package/dist/_members/composition/depth.js +0 -8
  144. package/dist/_members/composition/fixtures/index.js +0 -143
  145. package/dist/_members/composition/fixtures/vaayaErrored.d.ts +0 -25
  146. package/dist/_members/composition/fixtures/vaayaErrored.js +0 -203
  147. package/dist/_members/composition/fonts.js +0 -162
  148. package/dist/_members/composition/graphics-plan/compile.js +0 -221
  149. package/dist/_members/composition/graphics-plan/index.js +0 -10
  150. package/dist/_members/composition/graphics-plan/instantiateMotif.js +0 -44
  151. package/dist/_members/composition/graphics-plan/motion.js +0 -66
  152. package/dist/_members/composition/graphics-plan/schemas.js +0 -261
  153. package/dist/_members/composition/graphics-plan/solve.js +0 -145
  154. package/dist/_members/composition/index.js +0 -5
  155. package/dist/_members/composition/invariants/clipPlacement.js +0 -69
  156. package/dist/_members/composition/invariants/composition.js +0 -28
  157. package/dist/_members/composition/invariants/errors.js +0 -10
  158. package/dist/_members/composition/invariants/etag.js +0 -38
  159. package/dist/_members/composition/invariants/ids.js +0 -33
  160. package/dist/_members/composition/invariants/index.js +0 -9
  161. package/dist/_members/composition/invariants/keyframes.js +0 -45
  162. package/dist/_members/composition/invariants/markers.js +0 -29
  163. package/dist/_members/composition/invariants/time.js +0 -20
  164. package/dist/_members/composition/invariants/tracks.js +0 -304
  165. package/dist/_members/composition/ops/compositionOps.js +0 -1056
  166. package/dist/_members/composition/ops/headlessStore.js +0 -94
  167. package/dist/_members/composition/ops/index.js +0 -4
  168. package/dist/_members/composition/ops/selectors.js +0 -118
  169. package/dist/_members/composition/ops/timeline-word.js +0 -1
  170. package/dist/_members/composition/ops/transcript.js +0 -77
  171. package/dist/_members/composition/ops/types.js +0 -16
  172. package/dist/_members/composition/primitive-catalog/catalogQuery.js +0 -150
  173. package/dist/_members/composition/primitive-catalog/disabled.js +0 -32
  174. package/dist/_members/composition/primitive-catalog/generated/meta.js +0 -15161
  175. package/dist/_members/composition/primitive-catalog/index.js +0 -46
  176. package/dist/_members/composition/primitive-catalog/paramValidation.js +0 -231
  177. package/dist/_members/composition/primitive-catalog/projection.js +0 -164
  178. package/dist/_members/composition/primitive-catalog/types.js +0 -14
  179. package/dist/_members/composition/projection/behind-placement.js +0 -62
  180. package/dist/_members/composition/projection/brandKit.js +0 -482
  181. package/dist/_members/composition/projection/cardTokens.js +0 -209
  182. package/dist/_members/composition/projection/composition-floor.js +0 -582
  183. package/dist/_members/composition/projection/cropProjection.js +0 -257
  184. package/dist/_members/composition/projection/index.js +0 -7
  185. package/dist/_members/composition/projection/occlusion-budget.js +0 -104
  186. package/dist/_members/composition/projection/safe-zones.js +0 -99
  187. package/dist/_members/composition/reframe/aspectLoss.js +0 -115
  188. package/dist/_members/composition/reframe/coverage.js +0 -62
  189. package/dist/_members/composition/reframe/derive.js +0 -73
  190. package/dist/_members/composition/reframe/index.js +0 -109
  191. package/dist/_members/composition/reframe/kenBurns.js +0 -64
  192. package/dist/_members/composition/reframe/shotScale.js +0 -176
  193. package/dist/_members/composition/reframe/trajectory.js +0 -124
  194. package/dist/_members/composition/timeline/compound.js +0 -134
  195. package/dist/_members/composition/timeline/index.js +0 -9
  196. package/dist/_members/composition/timeline/intent.js +0 -228
  197. package/dist/_members/composition/timeline/keyframes.js +0 -121
  198. package/dist/_members/composition/timeline/link.js +0 -59
  199. package/dist/_members/composition/timeline/occupancy.js +0 -36
  200. package/dist/_members/composition/timeline/placement.js +0 -74
  201. package/dist/_members/composition/timeline/plan.js +0 -31
  202. package/dist/_members/composition/timeline/resolve.js +0 -170
  203. package/dist/_members/composition/timeline/trims.js +0 -278
  204. package/dist/_members/composition/types/index.js +0 -1
  205. package/dist/_members/composition/validators/brandKit.js +0 -295
  206. package/dist/_members/composition/validators/composePlan.js +0 -113
  207. package/dist/_members/composition/validators/composition.js +0 -703
  208. package/dist/_members/composition/validators/font.js +0 -34
  209. package/dist/_members/composition/validators/graphicKinds.js +0 -30
  210. package/dist/_members/composition/validators/index.js +0 -9
  211. package/dist/_members/composition/validators/project.js +0 -29
  212. package/dist/_members/composition/validators/registry.js +0 -41
  213. package/dist/_members/composition/validators/render.js +0 -139
  214. package/dist/_members/composition/validators/session.js +0 -37
  215. package/dist/_members/composition/validators/webhook.js +0 -72
  216. package/dist/_members/composition-ops/alphaLayers.js +0 -141
  217. package/dist/_members/composition-ops/index.js +0 -637
  218. package/dist/_members/composition-ops/materializeGrid.js +0 -99
  219. package/dist/_members/composition-ops/opRecorder.js +0 -196
  220. package/dist/_members/composition-ops/recordingStore.js +0 -14
  221. package/dist/_members/composition-ops/replaceRegion.js +0 -102
  222. package/dist/_members/composition-ops/testFixtures.js +0 -19
  223. package/dist/_members/core/index.js +0 -5
  224. package/dist/_members/core/render/bookends.js +0 -53
  225. package/dist/_members/core/render/captions.js +0 -127
  226. package/dist/_members/core/render/compositionRender.js +0 -1249
  227. package/dist/_members/core/render/deriveTrajectory.js +0 -889
  228. package/dist/_members/core/render/emphasis.js +0 -16
  229. package/dist/_members/core/render/eval/cropBox.js +0 -139
  230. package/dist/_members/core/render/eval/inclusion.js +0 -96
  231. package/dist/_members/core/render/eval/index.js +0 -146
  232. package/dist/_members/core/render/eval/metrics.js +0 -94
  233. package/dist/_members/core/render/exportSettings.js +0 -65
  234. package/dist/_members/core/render/index.js +0 -20
  235. package/dist/_members/core/render/mapFaceToPerson.js +0 -73
  236. package/dist/_members/core/render/types.js +0 -8
  237. package/dist/_members/core/render/vcam/cameraPath.js +0 -248
  238. package/dist/_members/core/render/vcam/constants.js +0 -115
  239. package/dist/_members/core/render/vcam/errorCodes.js +0 -39
  240. package/dist/_members/core/render/vcam/framing.js +0 -136
  241. package/dist/_members/core/render/vcam/requiredRegion.js +0 -137
  242. package/dist/_members/core/render/vcam/shots.js +0 -53
  243. package/dist/_members/core/render/vcam/subjectSet.js +0 -388
  244. package/dist/_members/core/select/errorCodes.js +0 -38
  245. package/dist/_members/core/select/index.js +0 -26
  246. package/dist/_members/core/select/model.js +0 -18
  247. package/dist/_members/core/select/select.js +0 -244
  248. package/dist/_members/core/select/stabilize.js +0 -242
  249. package/dist/_members/core/types.js +0 -7
  250. package/dist/_members/errors/index.js +0 -1
  251. package/dist/_members/errors/registry.js +0 -560
  252. package/dist/_members/foundation/codes/index.js +0 -31
  253. package/dist/_members/foundation/index.js +0 -2
  254. package/dist/_members/foundation/primitives/index.js +0 -5
  255. package/dist/_members/mcp/adapter.js +0 -771
  256. package/dist/_members/mcp/burnedNames.js +0 -73
  257. package/dist/_members/mcp/core.js +0 -390
  258. package/dist/_members/mcp/curation.js +0 -792
  259. package/dist/_members/mcp/executor.js +0 -142
  260. package/dist/_members/mcp/format.js +0 -9
  261. package/dist/_members/mcp/generated/catalogPreviews.js +0 -95
  262. package/dist/_members/mcp/generated/harness.js +0 -81
  263. package/dist/_members/mcp/generated/operations.js +0 -131
  264. package/dist/_members/mcp/index.js +0 -50
  265. package/dist/_members/mcp/internalLoopTools.js +0 -109
  266. package/dist/_members/mcp/prompts.js +0 -45
  267. package/dist/_members/mcp/resources.js +0 -166
  268. package/dist/_members/mcp/server.js +0 -340
  269. package/dist/_members/mcp/wait.js +0 -378
  270. package/dist/_members/mcp/x402Meta.js +0 -66
  271. package/dist/_members/media-model/api.js +0 -175
  272. package/dist/_members/media-model/index.js +0 -1
  273. package/dist/_members/media-model/media-kind.js +0 -116
  274. package/dist/_members/media-model/testing/index.js +0 -1
  275. package/dist/_members/media-model/testing/mediaStoreContract.js +0 -82
  276. package/dist/_members/media-model/transcriptSearch.js +0 -70
  277. package/dist/_members/media-model/transcriptSearchCases.json +0 -79
  278. package/dist/_members/nle-export/compact-timeline.js +0 -73
  279. package/dist/_members/nle-export/compact-timeline.js.map +0 -1
  280. package/dist/_members/nle-export/composition-to-input.js +0 -147
  281. package/dist/_members/nle-export/composition-to-input.js.map +0 -1
  282. package/dist/_members/nle-export/fcpxml.js +0 -159
  283. package/dist/_members/nle-export/fcpxml.js.map +0 -1
  284. package/dist/_members/nle-export/index.js +0 -12
  285. package/dist/_members/nle-export/index.js.map +0 -1
  286. package/dist/_members/nle-export/premiere.js +0 -161
  287. package/dist/_members/nle-export/premiere.js.map +0 -1
  288. package/dist/_members/nle-export/server/index.js +0 -2
  289. package/dist/_members/nle-export/server/index.js.map +0 -1
  290. package/dist/_members/nle-export/server/pack-zip.js +0 -38
  291. package/dist/_members/nle-export/server/pack-zip.js.map +0 -1
  292. package/dist/_members/nle-export/srt.js +0 -50
  293. package/dist/_members/nle-export/srt.js.map +0 -1
  294. package/dist/_members/nle-export/types.js +0 -9
  295. package/dist/_members/nle-export/types.js.map +0 -1
  296. package/dist/_members/nle-export/xml/index.js +0 -11
  297. package/dist/_members/nle-export/xml/index.js.map +0 -1
  298. package/dist/_members/nle-export/xml-utils.js +0 -48
  299. package/dist/_members/nle-export/xml-utils.js.map +0 -1
  300. package/dist/_members/perception/activeSpeaker.js +0 -103
  301. package/dist/_members/perception/audioQuality.js +0 -76
  302. package/dist/_members/perception/energyBeat.js +0 -99
  303. package/dist/_members/perception/identityMatch.js +0 -91
  304. package/dist/_members/perception/index.js +0 -48
  305. package/dist/_members/perception/visualQuality.js +0 -95
  306. package/dist/_members/plane/conformance.js +0 -90
  307. package/dist/_members/plane/contract.js +0 -49
  308. package/dist/_members/plane/index.js +0 -16
  309. package/dist/_members/primitives/backgrounds/index.js +0 -32
  310. package/dist/_members/primitives/backgrounds/index.js.map +0 -1
  311. package/dist/_members/primitives/captions/index.js +0 -398
  312. package/dist/_members/primitives/captions/index.js.map +0 -1
  313. package/dist/_members/primitives/chunk-2LVE4UIT.js +0 -139
  314. package/dist/_members/primitives/chunk-2LVE4UIT.js.map +0 -1
  315. package/dist/_members/primitives/chunk-3IQUH6KK.js +0 -20
  316. package/dist/_members/primitives/chunk-3IQUH6KK.js.map +0 -1
  317. package/dist/_members/primitives/chunk-3OMURV6Q.js +0 -112
  318. package/dist/_members/primitives/chunk-3OMURV6Q.js.map +0 -1
  319. package/dist/_members/primitives/chunk-4IS6TMEG.js +0 -21
  320. package/dist/_members/primitives/chunk-4IS6TMEG.js.map +0 -1
  321. package/dist/_members/primitives/chunk-5MWGAEGQ.js +0 -1644
  322. package/dist/_members/primitives/chunk-5MWGAEGQ.js.map +0 -1
  323. package/dist/_members/primitives/chunk-7RRPFPQK.js +0 -15
  324. package/dist/_members/primitives/chunk-7RRPFPQK.js.map +0 -1
  325. package/dist/_members/primitives/chunk-DH5TRZK2.js +0 -125
  326. package/dist/_members/primitives/chunk-DH5TRZK2.js.map +0 -1
  327. package/dist/_members/primitives/chunk-E3KNUSFG.js +0 -2337
  328. package/dist/_members/primitives/chunk-E3KNUSFG.js.map +0 -1
  329. package/dist/_members/primitives/chunk-G2B3G4HK.js +0 -47
  330. package/dist/_members/primitives/chunk-G2B3G4HK.js.map +0 -1
  331. package/dist/_members/primitives/chunk-HFPFGZXT.js +0 -1494
  332. package/dist/_members/primitives/chunk-HFPFGZXT.js.map +0 -1
  333. package/dist/_members/primitives/chunk-HIWVFZVH.js +0 -19
  334. package/dist/_members/primitives/chunk-HIWVFZVH.js.map +0 -1
  335. package/dist/_members/primitives/chunk-IDAL6G3Y.js.map +0 -1
  336. package/dist/_members/primitives/chunk-KNC6JP5F.js +0 -34
  337. package/dist/_members/primitives/chunk-KNC6JP5F.js.map +0 -1
  338. package/dist/_members/primitives/chunk-KYRDVZST.js +0 -459
  339. package/dist/_members/primitives/chunk-KYRDVZST.js.map +0 -1
  340. package/dist/_members/primitives/chunk-LWLHS2NS.js +0 -3410
  341. package/dist/_members/primitives/chunk-LWLHS2NS.js.map +0 -1
  342. package/dist/_members/primitives/chunk-QAQ3P7DR.js +0 -8855
  343. package/dist/_members/primitives/chunk-QAQ3P7DR.js.map +0 -1
  344. package/dist/_members/primitives/chunk-ROV2ODWC.js +0 -81
  345. package/dist/_members/primitives/chunk-ROV2ODWC.js.map +0 -1
  346. package/dist/_members/primitives/chunk-TCRC2FH3.js +0 -183
  347. package/dist/_members/primitives/chunk-TCRC2FH3.js.map +0 -1
  348. package/dist/_members/primitives/chunk-US4YEDAA.js +0 -96
  349. package/dist/_members/primitives/chunk-US4YEDAA.js.map +0 -1
  350. package/dist/_members/primitives/chunk-UVKRO5ER.js +0 -13
  351. package/dist/_members/primitives/chunk-UVKRO5ER.js.map +0 -1
  352. package/dist/_members/primitives/chunk-W4EIIF2I.js +0 -10
  353. package/dist/_members/primitives/chunk-W4EIIF2I.js.map +0 -1
  354. package/dist/_members/primitives/chunk-WPGKIPCO.js +0 -3563
  355. package/dist/_members/primitives/chunk-WPGKIPCO.js.map +0 -1
  356. package/dist/_members/primitives/chunk-WZFLEGMD.js +0 -1435
  357. package/dist/_members/primitives/chunk-WZFLEGMD.js.map +0 -1
  358. package/dist/_members/primitives/chunk-XHU3WBEI.js +0 -33
  359. package/dist/_members/primitives/chunk-XHU3WBEI.js.map +0 -1
  360. package/dist/_members/primitives/chunk-YN7WTZZ7.js +0 -46
  361. package/dist/_members/primitives/chunk-YN7WTZZ7.js.map +0 -1
  362. package/dist/_members/primitives/effects/index.js +0 -30
  363. package/dist/_members/primitives/effects/index.js.map +0 -1
  364. package/dist/_members/primitives/hero-text/index.js +0 -14
  365. package/dist/_members/primitives/hero-text/index.js.map +0 -1
  366. package/dist/_members/primitives/index.js +0 -64
  367. package/dist/_members/primitives/index.js.map +0 -1
  368. package/dist/_members/primitives/layouts/index.js +0 -24
  369. package/dist/_members/primitives/layouts/index.js.map +0 -1
  370. package/dist/_members/primitives/lib/easings.js +0 -26
  371. package/dist/_members/primitives/lib/easings.js.map +0 -1
  372. package/dist/_members/primitives/lib/index.js +0 -74
  373. package/dist/_members/primitives/lib/index.js.map +0 -1
  374. package/dist/_members/primitives/lib/palette.js +0 -72
  375. package/dist/_members/primitives/lib/palette.js.map +0 -1
  376. package/dist/_members/primitives/lib/preview.js +0 -8
  377. package/dist/_members/primitives/lib/preview.js.map +0 -1
  378. package/dist/_members/primitives/lib/schema.js +0 -12
  379. package/dist/_members/primitives/lib/schema.js.map +0 -1
  380. package/dist/_members/primitives/lib/seeded-random.js +0 -14
  381. package/dist/_members/primitives/lib/seeded-random.js.map +0 -1
  382. package/dist/_members/primitives/lib/text/contrast.js +0 -12
  383. package/dist/_members/primitives/lib/text/contrast.js.map +0 -1
  384. package/dist/_members/primitives/lib/text/fill.js +0 -8
  385. package/dist/_members/primitives/lib/text/fill.js.map +0 -1
  386. package/dist/_members/primitives/lib/text/fitText.js +0 -10
  387. package/dist/_members/primitives/lib/text/fitText.js.map +0 -1
  388. package/dist/_members/primitives/lib/text/marker.js +0 -8
  389. package/dist/_members/primitives/lib/text/marker.js.map +0 -1
  390. package/dist/_members/primitives/lib/text/motion.js +0 -16
  391. package/dist/_members/primitives/lib/text/motion.js.map +0 -1
  392. package/dist/_members/primitives/lib/text/recolor.js +0 -8
  393. package/dist/_members/primitives/lib/text/recolor.js.map +0 -1
  394. package/dist/_members/primitives/lib/text/spec.js +0 -1
  395. package/dist/_members/primitives/lib/text/spec.js.map +0 -1
  396. package/dist/_members/primitives/lib/text/stage.js +0 -8
  397. package/dist/_members/primitives/lib/text/stage.js.map +0 -1
  398. package/dist/_members/primitives/lib/text/typeface.js +0 -8
  399. package/dist/_members/primitives/lib/text/typeface.js.map +0 -1
  400. package/dist/_members/primitives/lib/tokens.js +0 -24
  401. package/dist/_members/primitives/lib/tokens.js.map +0 -1
  402. package/dist/_members/primitives/lib/types.js +0 -1
  403. package/dist/_members/primitives/lib/types.js.map +0 -1
  404. package/dist/_members/primitives/params-required.json +0 -153
  405. package/dist/_members/primitives/scenes/index.js +0 -25
  406. package/dist/_members/primitives/scenes/index.js.map +0 -1
  407. package/dist/_members/primitives/subject-foreground/index.js +0 -30
  408. package/dist/_members/primitives/subject-foreground/index.js.map +0 -1
  409. package/dist/_members/primitives/text/index.js +0 -57
  410. package/dist/_members/primitives/text/index.js.map +0 -1
  411. package/dist/_members/primitives/transitions/index.js +0 -67
  412. package/dist/_members/primitives/transitions/index.js.map +0 -1
  413. package/dist/_members/primitives/ui-blocks/index.js +0 -76
  414. package/dist/_members/primitives/ui-blocks/index.js.map +0 -1
  415. package/dist/_members/primitives/version-map.json +0 -105
  416. package/dist/_members/primitives/workspace.js +0 -60
  417. package/dist/_members/primitives/workspace.js.map +0 -1
  418. package/dist/chunk-7GISRVON.js +0 -14176
  419. package/dist/chunk-DIBOJJMU.js +0 -16838
  420. package/dist/chunk-EAUSEGB7.js +0 -420
  421. package/dist/chunk-FUWJOVVK.js +0 -3633
  422. package/dist/chunk-G75E7YA4.js +0 -11883
  423. package/dist/chunk-JCZQT7K3.js +0 -3266
  424. package/dist/chunk-KF5ETMKB.js +0 -544
  425. package/dist/chunk-NDKERSXY.js +0 -1296
  426. package/dist/chunk-V43Y7IE4.js +0 -3621
  427. package/dist/chunk-VIVQHIGZ.js +0 -4319
  428. package/dist/chunk-YA3OR2KK.js +0 -249
  429. package/dist/hls-HD4C5G6W.js +0 -33000
  430. package/dist/token-RGFIT24D.js +0 -69
  431. package/dist/token-util-GPLSGYVO.js +0 -5
  432. package/dist/vision_bundle-5Y376MAR.js +0 -4084
@@ -1,166 +0,0 @@
1
- /**
2
- * CueFrame MCP resources — the read side of the surface (no side effects).
3
- *
4
- * Every read endpoint is a URI-addressed MCP *resource*, executed through the
5
- * transport's `Executor` (stdio: network; hosted: in-process) against the GET
6
- * op's path from the generated manifest — the SAME single source of truth the
7
- * tools use, so paths are never hand-maintained. Four templates (media,
8
- * component, project, brand-kit) also carry a `list` callback so resources/list
9
- * enumerates concrete instances via the matching list op.
10
- *
11
- * Fail-loud: a non-2xx read throws, which the MCP server surfaces as a JSON-RPC
12
- * error (no try/catch swallow).
13
- */
14
- import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
15
- import { opById, buildPath, isOk, apiErrorFrom, fetchAsBase64, sniffImageMediaType, } from './core.js';
16
- /** GET a manifest op's path through the executor; throw on non-2xx (fail loud). Returns parsed JSON. */
17
- async function read(ex, operationId, mapArg) {
18
- const op = opById(operationId);
19
- const res = await ex.invoke({ method: 'GET', path: buildPath(op, mapArg) });
20
- if (!isOk(res.status))
21
- throw apiErrorFrom(res);
22
- try {
23
- return JSON.parse(res.text);
24
- }
25
- catch {
26
- return res.text;
27
- }
28
- }
29
- function jsonResource(uri, value) {
30
- return {
31
- contents: [{ uri: uri.toString(), mimeType: 'application/json', text: JSON.stringify(value, null, 2) }],
32
- };
33
- }
34
- /**
35
- * A JSON resource PLUS the poster frame, so a client reading a media item can
36
- * see the footage instead of reading its filename and duration.
37
- *
38
- * MCP resource contents carry either `text` or a base64 `blob`; this appends a
39
- * blob entry alongside the JSON rather than replacing it, matching the additive
40
- * contract the tool surface uses (`withMedia`). No poster, or a poster that will
41
- * not load, yields the JSON alone — never an error.
42
- */
43
- async function jsonResourceWithPoster(uri, value) {
44
- const base = jsonResource(uri, value);
45
- const url = value?.thumbnail?.url;
46
- if (!url)
47
- return base;
48
- const data = await fetchAsBase64(url);
49
- if (!data)
50
- return base;
51
- return {
52
- contents: [
53
- ...base.contents,
54
- { uri: url, mimeType: sniffImageMediaType(data), blob: data },
55
- ],
56
- };
57
- }
58
- /** Build a resources/list callback that enumerates `{ data: [{id,name?}] }` under a URI prefix. */
59
- function listFrom(ex, prefix, listOperationId) {
60
- return async () => {
61
- const res = (await read(ex, listOperationId, () => ''));
62
- return {
63
- resources: (res.data ?? []).map((item) => ({
64
- uri: `${prefix}/${item.id}`,
65
- name: item.name ?? item.id,
66
- mimeType: 'application/json',
67
- })),
68
- };
69
- };
70
- }
71
- /**
72
- * FACET-BEARING resources/list for the component catalog. Unlike `listFrom`
73
- * (which strips every entry to {uri,name}), this carries the discovery facets
74
- * (source/category/kind/tier/useCase) + the placement hint into each entry's
75
- * `description`, so an agent can CHOOSE a primitive from the list alone instead
76
- * of round-tripping cueframe://component/{id} for all 87 entries to recover them.
77
- */
78
- function listComponentsFrom(ex, prefix) {
79
- return async () => {
80
- // No `limit` → the route returns the WHOLE catalog (built-ins + installed)
81
- // in one page, so resources/list enumerates every primitive, not a slice.
82
- const res = (await read(ex, 'listCatalog', () => ''));
83
- return {
84
- resources: (res.data ?? []).map((e) => {
85
- const facets = [
86
- e.source === 'installed' ? 'installed' : 'built-in',
87
- e.category,
88
- e.kind,
89
- e.tier,
90
- (e.useCase ?? []).length ? `useCase:${(e.useCase ?? []).join('/')}` : undefined,
91
- e.placement
92
- ? `place as {kind:'${e.placement.clipSourceKind}', ${e.placement.refField}:'${e.id}'}`
93
- : undefined,
94
- ].filter(Boolean);
95
- return {
96
- uri: `${prefix}/${e.id}`,
97
- name: e.name ?? e.id,
98
- description: facets.join(' · '),
99
- mimeType: 'application/json',
100
- };
101
- }),
102
- };
103
- };
104
- }
105
- export function registerResources(server, ex) {
106
- // ── composition (per project) ────────────────────────────────────
107
- server.registerResource('composition', new ResourceTemplate('cueframe://composition/{projectId}', { list: undefined }), {
108
- title: 'Composition',
109
- description: 'The saved composition for a project (tracks, clips, captions). Read it before editing with apply_composition. URI: cueframe://composition/{projectId}.',
110
- mimeType: 'application/json',
111
- }, async (uri, { projectId }) => jsonResource(uri, await read(ex, 'getComposition', () => String(projectId))));
112
- // ── media (single + collection) ──────────────────────────────────
113
- server.registerResource('media', new ResourceTemplate('cueframe://media/{mediaId}', { list: listFrom(ex, 'cueframe://media', 'listMedia') }), {
114
- title: 'Media item',
115
- description: 'A media item in the library (id, name, duration, processing status). resources/list enumerates the library. URI: cueframe://media/{mediaId}.',
116
- mimeType: 'application/json',
117
- }, async (uri, { mediaId }) => jsonResourceWithPoster(uri, await read(ex, 'getMedia', () => String(mediaId))));
118
- server.registerResource('media-transcript', new ResourceTemplate('cueframe://media/{mediaId}/transcript', { list: undefined }), {
119
- title: 'Media transcript',
120
- description: 'The transcript (diarized words/segments) for a media item. URI: cueframe://media/{mediaId}/transcript.',
121
- mimeType: 'application/json',
122
- }, async (uri, { mediaId }) => jsonResource(uri, await read(ex, 'getMediaTranscript', () => String(mediaId))));
123
- server.registerResource('media-context', new ResourceTemplate('cueframe://media/{mediaId}/context', { list: undefined }), {
124
- title: 'Media authoring context',
125
- description: 'Detected faces (subject boxes per frame) + transcript for a media item — the same payload as get_media_context. Use it to align crop intents, captions, timing. URI: cueframe://media/{mediaId}/context.',
126
- mimeType: 'application/json',
127
- }, async (uri, { mediaId }) => jsonResource(uri, await read(ex, 'getMediaContext', () => String(mediaId))));
128
- // ── component (single + collection) ──────────────────────────────
129
- server.registerResource('component', new ResourceTemplate('cueframe://component/{componentId}', {
130
- list: listComponentsFrom(ex, 'cueframe://component'),
131
- }), {
132
- title: 'Component catalog',
133
- description: "The component catalog: the FULL built-in primitive catalog (96 primitives + 7 scenes — lower-third, cinematic-title, color-grade, the scenes …) PLUS your org-installed custom components. This is 'discover what to build with'. resources/list enumerates EVERY entry with its discovery facets (source/category/kind/tier/useCase) and a placement hint; read one for its full prop schema. NOT only your authored components. URI: cueframe://component/{componentId}.",
134
- mimeType: 'application/json',
135
- }, async (uri, { componentId }) => jsonResource(uri, await read(ex, 'getComponent', () => String(componentId))));
136
- // ── render (per project) ─────────────────────────────────────────
137
- server.registerResource('render', new ResourceTemplate('cueframe://render/{projectId}/{renderId}', { list: undefined }), {
138
- title: 'Render job',
139
- description: 'The status + output of a render job (status, progress, download URL when complete). URI: cueframe://render/{projectId}/{renderId}.',
140
- mimeType: 'application/json',
141
- }, async (uri, { projectId, renderId }) => jsonResource(uri, await read(ex, 'getRender', (p) => (p === 'renderId' ? String(renderId) : String(projectId)))));
142
- // ── brand-kit (single + collection) ──────────────────────────────
143
- server.registerResource('brand-kit', new ResourceTemplate('cueframe://brand-kit/{brandKitId}', {
144
- list: listFrom(ex, 'cueframe://brand-kit', 'listBrandKits'),
145
- }), {
146
- title: 'Brand kit',
147
- description: 'A brand kit (fonts, colors, logos) bound at render time. resources/list enumerates brand kits. URI: cueframe://brand-kit/{brandKitId}.',
148
- mimeType: 'application/json',
149
- }, async (uri, { brandKitId }) => jsonResource(uri, await read(ex, 'getBrandKit', () => String(brandKitId))));
150
- // ── project (single + collection) ────────────────────────────────
151
- server.registerResource('project', new ResourceTemplate('cueframe://project/{projectId}', { list: listFrom(ex, 'cueframe://project', 'listProjects') }), {
152
- title: 'Project',
153
- description: 'A project (the unit you compose + render into). resources/list enumerates your projects. URI: cueframe://project/{projectId}.',
154
- mimeType: 'application/json',
155
- }, async (uri, { projectId }) => jsonResource(uri, await read(ex, 'getProject', () => String(projectId))));
156
- // ── webhook contract (static reference) ──────────────────────────
157
- // A fixed doc (no {id}) — the delivery envelope, Standard-Webhooks signing, the
158
- // echo-the-token activation handshake, and every event's `data` shape. This is
159
- // 'how do I build a receiver' as data, so an agent never has to guess the
160
- // payload/signature/verification or ask a human. Proxies GET /webhooks/events.
161
- server.registerResource('webhook-events', 'cueframe://webhook-events', {
162
- title: 'Webhook delivery contract',
163
- description: "The webhook delivery/signing/verification contract: the POST envelope { event, timestamp, projectId?, data }, the Standard-Webhooks headers + how to verify the secret, the synchronous echo-the-token ownership handshake (and how to recover a pending webhook with verify_webhook), and every subscribable event with its exact `data` fields. Read it BEFORE building a webhook receiver. URI: cueframe://webhook-events.",
164
- mimeType: 'application/json',
165
- }, async (uri) => jsonResource(uri, await read(ex, 'getWebhookEvents', () => '')));
166
- }
@@ -1,340 +0,0 @@
1
- /**
2
- * CueFrame MCP — transport-agnostic core. NO transport import lives here, so
3
- * both the stdio entry (index.ts) and the hosted Hono route
4
- * (services/convex/api/routes/mcp.ts) build their server from this one module.
5
- *
6
- * Layers (all execute through the injected `Executor`, paths from the generated
7
- * manifest — single source of truth, drift-gated):
8
- * - curated front-door → registerCuratedTools (hand-picked names + guidance)
9
- * - raw expert layer → registerRawTools (generic, one tool per op)
10
- * - read resources → registerResources (resources.ts)
11
- * - skills-as-prompts → registerSkillPrompts (prompts.ts; async, by caller)
12
- */
13
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
14
- import { z } from 'zod';
15
- import { text, errText, fmtErr, safeParse, withMedia, fetchPreviews, opById, bodySchemaFor, dispatchOp, } from './core.js';
16
- import { GENERATED_OPERATIONS } from './generated/operations.js';
17
- import { CURATED_TOOLS } from './curation.js';
18
- import { registerResources } from './resources.js';
19
- import { BURNED_NAMES, burnedNameError } from './burnedNames.js';
20
- import { waitForJob } from './wait.js';
21
- // Re-exports so a transport (stdio index.ts, or the hosted Convex route) has a
22
- // single stdio-free import surface: `@cueframe/mcp/server`.
23
- export { registerSkillPrompts, __resetSkillCache } from './prompts.js';
24
- export { SERVER_INSTRUCTIONS } from './generated/harness.js';
25
- /** Emit without ever letting instrumentation surface to the agent. */
26
- function emit(sink, event) {
27
- if (!sink)
28
- return;
29
- try {
30
- sink(event);
31
- }
32
- catch {
33
- /* telemetry is never worth failing a tool call over */
34
- }
35
- }
36
- /**
37
- * Time a tool handler and report the outcome. Returns the handler's result
38
- * untouched — an `isError` result is a normal MCP return, not a throw, so both
39
- * paths are recorded.
40
- */
41
- async function timed(sink, tool, run) {
42
- let isError = false;
43
- let extra = {};
44
- // A handler enriches the SINGLE event this wrapper emits. Emitting a second
45
- // event instead does not work: the hosted route's telemetry is request-scoped
46
- // and captures once per call, so the extra one is silently dropped — verified
47
- // in PostHog, where preview_urls/preview_fetched came back null on every row
48
- // while the images themselves were arriving fine.
49
- const report = (e) => {
50
- extra = { ...extra, ...e };
51
- };
52
- try {
53
- const res = await run(report);
54
- isError = Boolean(res?.isError);
55
- return res;
56
- }
57
- catch (err) {
58
- isError = true;
59
- throw err;
60
- }
61
- finally {
62
- emit(sink, { tool, isError, ...extra });
63
- }
64
- }
65
- /**
66
- * Operations the RAW expert layer must not register, even though they are in the
67
- * manifest. This is a raw-layer property, not a manifest one: the manifest is the
68
- * transport-agnostic op SSOT the CURATED layer resolves paths through (`opById`),
69
- * so an op dropped from it becomes uncuratable.
70
- *
71
- * `searchLibrary` — the raw registrar builds its inputSchema from path params +
72
- * the request body only, and every argument of GET /v1/media/search is a QUERY
73
- * param. `q` is REQUIRED, so the raw tool could not send it and would 400 on
74
- * every call — worse than absent, because an agent reads that 400 as "the
75
- * feature is broken". The working surface is the curated `search_library`
76
- * (internalLoopTools.ts) whose `queryArgs` the adapter threads onto the URL.
77
- * DELETE this entry once the generator + this registrar thread query params
78
- * (~/brain/Issues/2026-08-07-raw-mcp-tools-drop-query-params.md — the Executor
79
- * already carries `query`).
80
- */
81
- export const RAW_EXCLUDED_OPERATION_IDS = new Set(['searchLibrary']);
82
- export function registerRawTools(server, ex, onEvent) {
83
- for (const op of GENERATED_OPERATIONS) {
84
- if (RAW_EXCLUDED_OPERATION_IDS.has(op.operationId))
85
- continue;
86
- const inputSchema = {};
87
- for (const p of op.pathParams)
88
- inputSchema[p] = z.string().describe(`Path parameter \`${p}\``);
89
- const bodySchema = bodySchemaFor(op);
90
- if (bodySchema)
91
- inputSchema.body = bodySchema.optional().describe('Request body — typed from the OpenAPI spec.');
92
- server.registerTool(op.toolName, { title: op.title, description: op.description, inputSchema, annotations: op.annotations }, async (args, extra) => timed(onEvent, op.toolName, async () => {
93
- try {
94
- return await dispatchOp(ex, op, (p) => args[p], args.body, extra, op.toolName, (res) => text(res.text || `${op.method} ${op.pathTemplate} → ${res.status}`));
95
- }
96
- catch (err) {
97
- return errText(`${op.toolName} failed: ${fmtErr(err)}`);
98
- }
99
- }));
100
- }
101
- }
102
- // ─────────────────────────────────────────────────────────────────────────
103
- // Curated front-door — hand-picked names + agent guidance, paths from the
104
- // manifest, executed through the Executor. `pathArgs` maps friendly arg names
105
- // to the op's path params; `okFormat`/`okText` shape the success result.
106
- // The curated tool set itself is the SSOT in curation.ts (drift-gated against
107
- // the generated manifest by curation.test.ts).
108
- // ─────────────────────────────────────────────────────────────────────────
109
- /** `create_render` → "Create Render". Default title for a curated tool. */
110
- export function titleCase(name) {
111
- return name
112
- .split('_')
113
- .map((w) => (w ? w[0].toUpperCase() + w.slice(1) : w))
114
- .join(' ');
115
- }
116
- export function registerCuratedTools(server, ex, opts) {
117
- for (const spec of CURATED_TOOLS) {
118
- // Maturity visibility mirror (spec 2026-07-20 §2.0): 'expert'-flagged
119
- // entries are hidden from the public listing. Execution gating lives
120
- // server-side (capabilities.ts) — this only controls what an agent SEES.
121
- if ((spec.maturity ?? 'stable') === 'expert' && !opts?.expert)
122
- continue;
123
- const op = opById(spec.operationId);
124
- const reverse = {};
125
- for (const [friendly, opParam] of Object.entries(spec.pathArgs ?? {}))
126
- reverse[opParam] = friendly;
127
- const inputSchema = {};
128
- for (const friendly of Object.keys(spec.pathArgs ?? {})) {
129
- inputSchema[friendly] = z.string().describe(`${friendly} (path).`);
130
- }
131
- const bodySchema = bodySchemaFor(op);
132
- if (bodySchema)
133
- inputSchema.body = bodySchema;
134
- // title/annotations: the curated entry overrides the op's method-derived
135
- // values PER FIELD, not wholesale. Spreading matters — most curated entries
136
- // set only one hint (`{ idempotentHint: true }` on the cancels), and a `??`
137
- // would let that partial object replace the derived base, leaving
138
- // readOnly/destructive unset. Unset is NOT neutral: the MCP schema defaults
139
- // destructiveHint and openWorldHint to TRUE. Gated by index.test.ts.
140
- const annotations = { ...op.annotations, ...spec.annotations };
141
- server.registerTool(spec.name, { title: spec.title ?? titleCase(spec.name), description: spec.description, inputSchema, annotations }, async (args, extra) => timed(opts?.onEvent, spec.name, async (report) => {
142
- const a = args;
143
- try {
144
- return await dispatchOp(ex, op, (p) => a[reverse[p]], a.body, extra, spec.name, async (res) => {
145
- if (spec.okText)
146
- return text(spec.okText(a));
147
- const json = res.text ? safeParse(res.text) : undefined;
148
- // Pass {} when the response had no body (e.g. a 204) so okFormat is
149
- // null-safe; the bodied tools always return JSON.
150
- const payload = spec.okFormat
151
- ? spec.okFormat(json ?? {}, a)
152
- : res.text || `${op.method} → ${res.status}`;
153
- // Give the agent eyes and ears (spec.preview). Media is ADDITIVE:
154
- // `payload` is the same text block it has always been, so nothing
155
- // downstream changes, and zero usable previews emits no media block at
156
- // all. A preview fetch that fails is dropped silently — a dead
157
- // thumbnail must never fail the tool call it decorates.
158
- // `attach` gates on the response BEFORE any bytes are fetched — a
159
- // withheld preview costs no egress, not just no context.
160
- if (spec.preview && json && (spec.preview.attach?.(json) ?? true)) {
161
- const kind = typeof spec.preview.kind === 'function'
162
- ? spec.preview.kind(json)
163
- : spec.preview.kind ?? 'image';
164
- const urls = spec.preview.urls(json).filter(Boolean);
165
- const data = await fetchPreviews(urls, spec.preview.cap ?? 12);
166
- report({ preview: { urls: urls.length, fetched: data.length } });
167
- if (data.length)
168
- return withMedia(payload, data.map((d) => ({ data: d, kind })));
169
- }
170
- return text(payload);
171
- });
172
- }
173
- catch (err) {
174
- return errText(`${spec.name} failed: ${fmtErr(err)}`);
175
- }
176
- }));
177
- }
178
- registerWaitJob(server, ex, opts?.waitCapMs, opts?.onEvent);
179
- registerPreviewCard(server, ex, opts?.onEvent);
180
- }
181
- /**
182
- * `preview_card` — see ONE authored card before it goes anywhere near a composition.
183
- *
184
- * There was no way to look at a card without adding it to a composition, shelling
185
- * it with a motion preset, and previewing the whole frame. Twenty cards were
186
- * authored blind in a single session; type overflowing the frame edge was the
187
- * direct result — nobody could see it until the final render.
188
- *
189
- * It needs NO new endpoint. `preview_frame` already accepts an INLINE composition
190
- * (`PreviewFrameRequest.composition`, evidence.ts:66), so this synthesizes the
191
- * smallest legal one-card composition and reuses that op — same billing, same
192
- * bake→capture seam, same content-addressed stills.
193
- */
194
- function registerPreviewCard(server, ex, onEvent) {
195
- const op = opById('previewFrame');
196
- server.registerTool('preview_card', {
197
- title: 'Preview Card',
198
- description: 'Render ONE authored card on its own and SEE it, before placing it in a composition. Pass the same `html` (+ optional `tokens`) you would put in a {kind:"card"} clip; you get the still back as an image. Use this while writing a card — it is the fast loop for catching type that overflows the frame, a headline that collides with a logo, or tokens that did not resolve. Sized to the format you name, so what you see is what that aspect ratio will show. To judge MOTION rather than layout, shell the card with a motion preset and use preview_clip.',
199
- inputSchema: {
200
- projectId: z.string().describe('projectId (path) — the card is rendered inline; nothing is persisted to the project.'),
201
- html: z.string().min(1).describe('The card markup, exactly as it would appear in a {kind:"card"} clip source.'),
202
- tokens: z
203
- .record(z.string())
204
- .optional()
205
- .describe('Token substitutions the html references (e.g. brand colours, fonts). Same shape as the clip source `tokens`.'),
206
- aspectRatio: z
207
- .enum(['16:9', '9:16', '1:1', '4:5'])
208
- .optional()
209
- .describe('Frame to size the card into. Default 9:16 — a card that fits 16:9 often overflows vertical.'),
210
- },
211
- // Renders inline and persists nothing — the read-only stance curation.ts
212
- // already takes for preview_frame. Stated in full: an omitted hint is not
213
- // neutral (destructiveHint/openWorldHint default TRUE in the schema).
214
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
215
- }, async (args, extra) => timed(onEvent, 'preview_card', async (report) => {
216
- const a = args;
217
- // The smallest legal composition (Composition.required = v/format/tracks;
218
- // clip.required = id/startTime/duration/source; card source needs kind+html).
219
- const composition = {
220
- v: 1,
221
- format: { aspectRatio: a.aspectRatio ?? '9:16', fps: 30, resolution: 'fhd' },
222
- tracks: [
223
- {
224
- id: 'card',
225
- kind: 'overlay',
226
- contents: [
227
- {
228
- id: 'card-1',
229
- startTime: 0,
230
- duration: 2,
231
- source: { kind: 'card', html: a.html, ...(a.tokens ? { tokens: a.tokens } : {}) },
232
- },
233
- ],
234
- },
235
- ],
236
- };
237
- try {
238
- return await dispatchOp(ex, op, () => a.projectId, { composition, timestamps: [1] }, extra, 'preview_card', async (res) => {
239
- const json = res.text ? safeParse(res.text) : undefined;
240
- const urls = (Array.isArray(json?.stills) ? json.stills : []).map((st) => st?.url);
241
- const data = await fetchPreviews(urls, 2);
242
- report({ preview: { urls: urls.filter(Boolean).length, fetched: data.length } });
243
- const payload = res.text || `previewed card (${a.aspectRatio ?? '9:16'})`;
244
- return data.length
245
- ? withMedia(payload, data.map((d) => ({ data: d, kind: 'image' })))
246
- : text(payload);
247
- });
248
- }
249
- catch (err) {
250
- return errText(`preview_card failed: ${fmtErr(err)}`);
251
- }
252
- }));
253
- }
254
- function registerWaitJob(server, ex, waitCapMs, onEvent) {
255
- server.registerTool('wait_job', {
256
- title: 'Wait for Job',
257
- // Polls status; changes nothing. Idempotent by construction — the whole
258
- // continuation contract is "call again with the same arguments".
259
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
260
- description: 'Wait for a long-running job and return the resolved result — a BOUNDED long-poll. Polls the job status (render / compose / consult / clip-suggestions / verify) and blocks up to the transport window (30s on the hosted transport); if the job is still running at the window it returns a `Still running` continuation — call wait_job again with the same arguments to keep waiting (the job keeps executing server-side; nothing is lost between calls). Call this right after compose / create_render / consult / suggest_briefs / score_composition / preview_component. For event-driven fan-out, create_webhook delivers the terminal instead.',
261
- inputSchema: {
262
- kind: z
263
- .enum(['render', 'suggestions', 'compose', 'verify', 'preview', 'brand_kit_extract', 'consult'])
264
- .describe('What to wait on: a render job, a compose job, a consult advisory, AI clip-suggestion analysis, or a generic async job (verify / preview / brand-kit extract — the kind is named in the enqueue receipt).'),
265
- id: z
266
- .string()
267
- .describe('kind="render": renderId. kind="compose": composeJobId. kind="consult": the consultJobId from the consult receipt (surfaces the advisory envelope — assessment, proposals, principles). kind="suggestions": mediaItemId. kind="verify"/"preview"/"brand_kit_extract": the jobId from the enqueue receipt.'),
268
- projectId: z
269
- .string()
270
- .optional()
271
- .describe('Required when kind="render", "compose", or "consult".'),
272
- timeoutMs: z
273
- .number()
274
- .int()
275
- .min(1000)
276
- .max(30 * 60 * 1000)
277
- .optional()
278
- .describe('Maximum wait in ms (default 30 min for render/compose, 5 min for suggestions).'),
279
- },
280
- }, async (args) => timed(onEvent, 'wait_job', async (report) => {
281
- const kind = args.kind;
282
- if ((kind === 'render' || kind === 'compose' || kind === 'consult') && !args.projectId) {
283
- return errText(`wait_job(kind="${kind}") requires a projectId.`);
284
- }
285
- const defaultCap = kind === 'suggestions' ? 5 * 60 * 1000 : 30 * 60 * 1000;
286
- // waitCapMs caps the hosted transport well under Convex's httpAction time
287
- // limit (a 30-min synchronous poll would be killed mid-wait); the agent's
288
- // own timeoutMs still applies below it. Unset (stdio) → no extra cap.
289
- const requested = args.timeoutMs ?? defaultCap;
290
- const deadline = Date.now() + (waitCapMs ? Math.min(requested, waitCapMs) : requested);
291
- const res = await waitForJob(ex, kind, args.id, args.projectId, deadline);
292
- if (!res.ok)
293
- return errText(res.text);
294
- // An async tool's pixels arrive HERE, not at the enqueue call:
295
- // preview_component's 202 carries only a jobId, so the still it produces
296
- // has to surface on the wait. Same url adapter.ts:578 inlines as an image.
297
- if (res.mediaUrls?.length) {
298
- const data = await fetchPreviews(res.mediaUrls, 4);
299
- report({ preview: { urls: res.mediaUrls.length, fetched: data.length } });
300
- if (data.length)
301
- return withMedia(res.text, data.map((d) => ({ data: d, kind: 'image' })));
302
- }
303
- return text(res.text);
304
- }));
305
- }
306
- export function buildServer(opts) {
307
- const server = new McpServer({ name: 'cueframe', version: '0.1.0' }, opts.instructions ? { instructions: opts.instructions } : undefined);
308
- registerCuratedTools(server, opts.executor, {
309
- waitCapMs: opts.waitCapMs,
310
- expert: opts.expert,
311
- onEvent: opts.onEvent,
312
- });
313
- registerBurnedTombstones(server, opts.onEvent);
314
- registerResources(server, opts.executor);
315
- if (opts.expert)
316
- registerRawTools(server, opts.executor, opts.onEvent);
317
- // NOTE: protocol-level traffic (initialize / tools-list / prompts / resources)
318
- // is NOT observed here. It is captured once at the transport via the public
319
- // `onmessage` hook, which sees every inbound JSON-RPC method without reaching
320
- // into SDK internals. This function only instruments what the transport
321
- // cannot see: per-tool duration and outcome.
322
- return server;
323
- }
324
- /**
325
- * A12 burned names: each dead verb registers as a TOMBSTONE — calling it
326
- * hard-errors with the replacement instead of a bare method-not-found, so an
327
- * agent with a stale memory of the surface gets re-taught in one round-trip.
328
- */
329
- export function registerBurnedTombstones(server, onEvent) {
330
- for (const b of BURNED_NAMES) {
331
- server.registerTool(b.name, {
332
- title: `${titleCase(b.name)} (retired)`,
333
- description: `RETIRED (2026-07 verb cutover) — use ${b.replacement}. ${b.reason}`,
334
- // A tombstone only ever throws. Announcing it as read-only and
335
- // closed-world keeps a stale agent from being made to confirm a
336
- // "destructive" call that does nothing (schema defaults both to true).
337
- annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
338
- }, async () => timed(onEvent, b.name, async () => errText(burnedNameError(b))));
339
- }
340
- }