@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,134 +0,0 @@
1
- /**
2
- * The org sound palette (audio-substrate Phase 2) — ONE browse surface over the
3
- * union of every sound an org can reach: the curated CC0 packs (SFX + music
4
- * beds), the org's own audio-kind uploads/imports, and its generated audio. The
5
- * uniform entry shape lets a driving agent pick a sound by role + envelope class
6
- * without caring where it came from — provenance rides every entry.
7
- *
8
- * PURE: raw org audio rows in → palette entries out. The pack halves come from
9
- * the closed catalogs (SFX_PACK_ENTRIES / MUSIC_PACK_ENTRIES); the org/generated
10
- * halves are projected from the caller's org audio rows. Consumed by BOTH the
11
- * `list_catalog` audio section (the agent browse) and the director's compose
12
- * org-first SFX draw (which reads only the sfx-role org subset). One assembler,
13
- * so the two surfaces can never disagree on what the org owns.
14
- */
15
- import { SFX_PACK_ENTRIES } from "./pack";
16
- import { MUSIC_PACK_ENTRIES } from "./musicPack";
17
- /** The pack SFX half of the palette (source:"pack", role:"sfx"). */
18
- function packSfxEntries() {
19
- return SFX_PACK_ENTRIES.map((e) => ({
20
- ref: e.soundId,
21
- role: "sfx",
22
- envelopeClass: e.envelopeClass,
23
- description: e.description,
24
- durationSec: e.durationSec,
25
- evidence: { envelopeClass: e.envelopeClass },
26
- source: "pack",
27
- license: e.source.license,
28
- provenance: e.attribution,
29
- }));
30
- }
31
- /** The pack MUSIC half of the palette (source:"pack", role:"music", carries bpm). */
32
- function packMusicEntries() {
33
- return MUSIC_PACK_ENTRIES.map((e) => ({
34
- ref: e.bedId,
35
- role: "music",
36
- // A bed is an unbounded loop — envelope class "ambient" in the browse grouping.
37
- envelopeClass: "ambient",
38
- description: e.description,
39
- durationSec: e.durationSec,
40
- evidence: { envelopeClass: "ambient" },
41
- source: "pack",
42
- license: e.source.license,
43
- provenance: e.attribution,
44
- bpm: e.bpm,
45
- mood: e.mood,
46
- }));
47
- }
48
- /** True when a row is a curated-pack org row (minted by the pack import/compose
49
- * lanes over shared bytes). Those are ALREADY represented by the pack half of
50
- * the palette, so they're excluded from the org half — a placement artifact,
51
- * not a distinct library item. */
52
- function isPackRow(row) {
53
- return row.mediaSource === "cueframe-pack";
54
- }
55
- /** Project one org audio row → a palette entry. Requires envelope evidence (the
56
- * browse grouping key) — a row without it is not yet palette-ready. Returns null
57
- * to skip such rows AND minted pack rows. */
58
- function orgRowToEntry(row) {
59
- if (isPackRow(row))
60
- return null;
61
- const envelope = row.envelope;
62
- const role = row.audioRole;
63
- // The browse groups by envelope class; a music/ambience bed with a beatGrid but
64
- // no envelope still classes as "ambient" (an unbounded bed).
65
- const envelopeClass = envelope?.envelopeClass ??
66
- (role === "music" || role === "ambience" ? "ambient" : undefined);
67
- if (!role || !envelopeClass)
68
- return null;
69
- const generated = Boolean(row.generator);
70
- const source = generated ? "generated" : "org";
71
- const license = generated
72
- ? "generated"
73
- : row.license ?? "org-owned";
74
- const provenance = generated
75
- ? `${row.generator}${row.generationPrompt ? `: ${row.generationPrompt}` : ""}`
76
- : row.license
77
- ? `org-owned (${row.license})`
78
- : "org-owned";
79
- const bpm = row.beatGrid?.bpm;
80
- return {
81
- ref: row.mediaId,
82
- role,
83
- envelopeClass,
84
- description: row.name ?? row.mediaId,
85
- durationSec: row.durationSec ?? 0,
86
- evidence: envelope ?? { envelopeClass },
87
- source,
88
- license,
89
- provenance,
90
- ...(bpm !== undefined ? { bpm } : {}),
91
- };
92
- }
93
- /**
94
- * Assemble the full org sound palette: pack (SFX ∪ music beds) ∪ org-owned ∪
95
- * generated. Deterministic given the input rows (pack halves are catalog-ordered;
96
- * org rows keep their input order). Every entry carries source + license +
97
- * provenance; music entries carry bpm.
98
- */
99
- export function assembleAudioPalette(orgAudioRows) {
100
- const org = [];
101
- for (const row of orgAudioRows) {
102
- const e = orgRowToEntry(row);
103
- if (e)
104
- org.push(e);
105
- }
106
- return [...packSfxEntries(), ...packMusicEntries(), ...org];
107
- }
108
- /**
109
- * The org-owned SFX subset for the compose org-first draw: every org/generated
110
- * (NOT pack) sound of role "sfx" that carries an envelope class, in a STABLE
111
- * order (by mediaId) so the draw is deterministic. The director substitutes one
112
- * of these for a pack pick when the org has a sound of the requested class — the
113
- * grounding move (an org that uploads its product's real UI sounds hears ITS
114
- * product), mirroring how a brand kit overrides the default font.
115
- */
116
- export function orgSfxPalette(orgAudioRows) {
117
- const out = [];
118
- for (const row of orgAudioRows) {
119
- if (isPackRow(row))
120
- continue;
121
- if (row.audioRole !== "sfx")
122
- continue;
123
- const envelopeClass = row.envelope?.envelopeClass;
124
- if (!envelopeClass)
125
- continue;
126
- out.push({
127
- mediaId: row.mediaId,
128
- envelopeClass,
129
- durationSec: row.durationSec ?? 0,
130
- ...(row.filePath ? { filePath: row.filePath } : {}),
131
- });
132
- }
133
- return out.sort((a, b) => a.mediaId.localeCompare(b.mediaId));
134
- }
@@ -1,83 +0,0 @@
1
- /** CueFrame-owned look presets. The caller picks a name; never the numbers. */
2
- export const STYLE = {
3
- subtle: { zoom: 0.80, prePad: 0.5, postPad: 1.2, minZoom: 1.2, mergeGap: 1.0 },
4
- standard: { zoom: 0.67, prePad: 0.4, postPad: 1.0, minZoom: 1.0, mergeGap: 0.8 },
5
- punchy: { zoom: 0.55, prePad: 0.3, postPad: 0.8, minZoom: 0.8, mergeGap: 0.6 },
6
- };
7
- const median = (xs) => {
8
- const s = [...xs].sort((a, b) => a - b);
9
- const m = Math.floor(s.length / 2);
10
- return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
11
- };
12
- const neutral = (startSec, endSec) => ({
13
- startSec, endSec, intent: "auto-zoom:neutral",
14
- focus: { mode: "frame-center" }, zoom: 1.0,
15
- });
16
- /** Core: a list of focused (t,x,y) anchors + clip duration → gapless tiling. */
17
- function tile(anchors, durationSec, t) {
18
- if (durationSec <= 0 || anchors.length === 0)
19
- return [];
20
- const sorted = [...anchors].sort((a, b) => a.t - b.t);
21
- // group temporally-adjacent anchors
22
- const groups = [];
23
- let cur = [sorted[0]];
24
- for (let i = 1; i < sorted.length; i++) {
25
- if (sorted[i].t - sorted[i - 1].t <= t.mergeGap)
26
- cur.push(sorted[i]);
27
- else {
28
- groups.push(cur);
29
- cur = [sorted[i]];
30
- }
31
- }
32
- groups.push(cur);
33
- // pad → clamp → drop too-short → median focal point
34
- const windows = groups.map((g) => ({
35
- start: Math.max(0, g[0].t - t.prePad),
36
- end: Math.min(durationSec, g[g.length - 1].t + t.postPad),
37
- x: median(g.map((e) => e.x)),
38
- y: median(g.map((e) => e.y)),
39
- })).filter((w) => w.end - w.start >= t.minZoom);
40
- if (windows.length === 0)
41
- return [];
42
- // merge overlapping padded windows (keep earlier focal point)
43
- const merged = [windows[0]];
44
- for (let i = 1; i < windows.length; i++) {
45
- const prev = merged[merged.length - 1];
46
- if (windows[i].start <= prev.end)
47
- prev.end = Math.max(prev.end, windows[i].end);
48
- else
49
- merged.push(windows[i]);
50
- }
51
- // emit gapless tiling: neutral fills gaps, point punch-ins cover windows
52
- const out = [];
53
- let cursor = 0;
54
- for (const w of merged) {
55
- if (w.start > cursor)
56
- out.push(neutral(cursor, w.start));
57
- out.push({
58
- startSec: w.start, endSec: w.end, intent: "auto-zoom:punch-in",
59
- focus: { mode: "point", x: w.x, y: w.y }, zoom: t.zoom,
60
- });
61
- cursor = w.end;
62
- }
63
- if (cursor < durationSec)
64
- out.push(neutral(cursor, durationSec));
65
- return out;
66
- }
67
- /**
68
- * Timed focus points (e.g. cursor/click positions — every point a
69
- * high-confidence anchor) → reframe segments. No detection.
70
- */
71
- export function autoZoom(points, durationSec, style = "standard") {
72
- return tile(points, durationSec, STYLE[style]);
73
- }
74
- /**
75
- * Pixel-derived activity track → reframe segments. Keeps only focused,
76
- * low-global-change samples (rejects pan/scroll) before tiling.
77
- */
78
- export function autoZoomFromActivity(activity, durationSec, style = "standard", thresholds = {}) {
79
- const minC = thresholds.minConcentration ?? 0.6;
80
- const maxCh = thresholds.maxChangePct ?? 0.12;
81
- const anchors = activity.filter((s) => s.concentration >= minC && s.changePct <= maxCh);
82
- return tile(anchors, durationSec, STYLE[style]);
83
- }
@@ -1,45 +0,0 @@
1
- // @cueframe/composition/brand-kit — the editor-side Brand Kit (composition-level fact).
2
- //
3
- // Brand is a composition-level fact per the architecture spec ("composition-level
4
- // facts: format, brand, captions"), so the editor's brand kit lives in the
5
- // composition contract — imported by Authoring to build context, never reaching
6
- // into the renderer.
7
- //
8
- // Reconciled with the wire `BrandKit` (zod, ./validators/brandKit): the
9
- // render-relevant overlay assets — `logo`, `intro`, `outro`, `watermark` — are
10
- // the SAME shapes the wire schema defines, re-used here directly so they project
11
- // onto the wire/render contract with no lossy re-map. The wire schema is the
12
- // single source of truth for those fields; the fully-materialized read shape is
13
- // `ResolvedBrandKit` (./projection). Everything else on this type is the editor's
14
- // authored INPUT (flat colors / typography the dashboard collects, plus
15
- // authoring-only metadata that never reaches render — see below).
16
- // Moved from @cueframe/core/types.ts in Phase-3 Slice 1 (decouple authoring from
17
- // the renderer): its only consumer is the authoring agent.
18
- export const DEFAULT_BRAND_KIT = {
19
- name: 'CueFrame',
20
- description: 'AI-native video editor. Spend less time editing, more time creating stories that matter.',
21
- tagline: 'Your Story Deserves Better Than a Timeline',
22
- colors: {
23
- primary: '#7C3AED',
24
- secondary: '#4F46E5',
25
- accent: '#7C3AED',
26
- background: '#121212',
27
- text: '#ffffff',
28
- },
29
- extraColors: [
30
- { hex: '#1a1a1a', label: 'Surface', usage: 'Cards, elevated backgrounds' },
31
- { hex: '#262626', label: 'Muted', usage: 'Borders, subtle backgrounds' },
32
- { hex: '#a3a3a3', label: 'Muted Text', usage: 'Secondary text, captions' },
33
- ],
34
- // Vendored families only (`VENDORED_FONT_FAMILIES`): the picker lists exactly
35
- // those, and the render sandbox has no font egress, so a default outside the
36
- // list is a value the user cannot re-select and a face that rasterizes as
37
- // the generic fallback. The previous defaults ('DM Serif Display', 'Geist')
38
- // were both.
39
- headingFont: { fontFamily: 'Instrument Serif', fontWeight: 400 },
40
- bodyFont: { fontFamily: 'Inter', fontWeight: 400 },
41
- syncCaptions: false,
42
- captionProfile: {},
43
- customFonts: [],
44
- voiceGuidelines: 'Premium and sophisticated. Focus on storytelling over technical complexity. Approachable but confident. Emphasize the creative process, not the tool. Minimal, clear language.',
45
- };
@@ -1,209 +0,0 @@
1
- /**
2
- * The BRIEF CONTRACT — what the customer pinned, and what no downstream stage may undo.
3
- *
4
- * ── AUTHORITY ────────────────────────────────────────────────────────────────────────────
5
- * The brief owns WHAT CONTENT EXISTS. The planner owns HOW IT IS FRAMED. A planner that
6
- * deletes footage is not making a framing decision — it is exercising the brief's authority,
7
- * and no downstream guard can ever repair that.
8
- *
9
- * On 2026-07-13 the planner shipped 52.9s against a brief pinning 87.1s. It deleted the
10
- * product demo and the call-to-action, reasoning "No subject detected — cut for pace". Nothing
11
- * objected, because the contract was never even THREADED to the director: the beats are
12
- * resolved by `deriveBriefComposeSource` and then thrown away, and `DirectorInput.compose`
13
- * carries the brief flattened into a "suggestion" (caption / hook / motionStyle). The planner
14
- * could not honor a contract it was never shown.
15
- *
16
- * A beat's `source` window is documented as "honored TO THE FRAME or refused". So on the brief
17
- * path, deleting pinned footage is a contract violation, full stop.
18
- *
19
- * ── WHY 'trim' IS EFFECTIVELY FORBIDDEN HERE ─────────────────────────────────────────────
20
- * Brief creation ALREADY refuses a `durationSec` that differs from the pinned window by more
21
- * than ±1.5s (`brief_duration_unhonorable`). So by construction the contracted duration IS the
22
- * pinned window — the customer has declared there is no filler. Any deletion beyond the
23
- * tolerance therefore breaks the duration contract. A customer who wants footage cut pins
24
- * tighter beats; that is the channel for it.
25
- *
26
- * `'keep'` (SHOW this span AS-IS, no reframe) is the legal move for footage with nothing to
27
- * track. It was added 2026-07-12 for exactly this, and the planner still reaches for 'trim'.
28
- * A vocabulary the model may ignore is not a constraint — hence this module.
29
- *
30
- * Pure arithmetic, zero runtime imports (structural param types only), so it is safe in BOTH
31
- * the Convex V8 isolate (brief-creation gate) and the Temporal workflow sandbox (the plan
32
- * gate). One definition of the tolerances, no drift.
33
- */
34
- // ── Tolerances — the SINGLE definition ──────────────────────────────────────────────────
35
- // Both chokepoints read these: brief CREATION (is this brief self-consistent?) and the PLAN
36
- // gate (does this plan honor it?). They were previously duplicated inside the Convex module,
37
- // where the director could not reach them.
38
- /** Gap tolerance between adjacent pinned beats — a larger gap means the [min,max] hull would
39
- * include footage the client never pinned. */
40
- export const BEAT_CONTIGUITY_TOLERANCE_S = 0.75;
41
- /** Per-beat tolerance used by BRIEF CREATION: a sourced beat's own `durationSec` must match its
42
- * own window to within this. (Not the plan gate's rule — see BEAT_MAX_LOSS_FRACTION.) */
43
- export const BEAT_DURATION_TOLERANCE_S = 0.5;
44
- /** How far the whole output may drift from the contracted duration. THE contract (documented,
45
- * customer-facing) — and, because deletions only ever shrink the output, it already caps how
46
- * much a plan can remove in ABSOLUTE terms. */
47
- export const BRIEF_DURATION_TOLERANCE_S = 1.5;
48
- /**
49
- * The most of ITSELF a single pinned beat may lose. A FRACTION, deliberately — not an absolute.
50
- *
51
- * Rule B already caps total deletion at ±1.5s, so no beat can lose much in absolute terms. What
52
- * Rule B cannot see is a SHORT beat being erased outright: a 1.5s beat deleted whole still
53
- * clears the aggregate. That is the only gap Rule A exists to close, so it must be expressed as
54
- * "did this beat survive recognisably", not as a stopwatch.
55
- *
56
- * An absolute 0.5s was tried first and was WRONG — it refused the planner's removal of a 1.44s
57
- * HARD PAUSE between two sentences (measured 2026-07-13). Cutting dead air is editing, which the
58
- * planner owns; deleting the product demo is content, which it does not. A rule that cannot tell
59
- * those apart is not enforcing authority, it is just being obstructive.
60
- */
61
- export const BEAT_MAX_LOSS_FRACTION = 0.5;
62
- /** Total length of a set of spans after merging overlaps (a cut inside a trim is deleted once,
63
- * not twice — double-counting would manufacture a violation). */
64
- function unionLength(spans) {
65
- const sorted = [...spans]
66
- .filter((s) => s.endSec > s.startSec)
67
- .sort((a, b) => a.startSec - b.startSec);
68
- let total = 0;
69
- let cur = null;
70
- for (const s of sorted) {
71
- if (!cur || s.startSec > cur.endSec) {
72
- if (cur)
73
- total += cur.endSec - cur.startSec;
74
- cur = { startSec: s.startSec, endSec: s.endSec };
75
- }
76
- else if (s.endSec > cur.endSec) {
77
- cur.endSec = s.endSec;
78
- }
79
- }
80
- if (cur)
81
- total += cur.endSec - cur.startSec;
82
- return total;
83
- }
84
- function overlap(a, b) {
85
- return Math.max(0, Math.min(a.endSec, b.endSec) - Math.max(a.startSec, b.startSec));
86
- }
87
- const s1 = (n) => n.toFixed(1);
88
- /**
89
- * Every way this plan breaks the brief's content contract, as planner-addressed messages.
90
- * Empty array ⇒ the plan honors the brief.
91
- *
92
- * Three rules, and ALL are needed:
93
- * - Rule A (per beat): a pinned beat may not be deleted. Catches surgical beat removal that
94
- * Rule B could mask by keeping filler elsewhere.
95
- * - Rule B (aggregate): the contracted duration must survive. Catches death by a thousand
96
- * cuts that individually clear the per-beat tolerance.
97
- * - Rule C (per mandated beat): a beat's graphics MANDATE must be planned — same
98
- * honor-or-refuse as A/B. Before this, a graphics-less plan against a graphics-mandating
99
- * brief sailed through and cost a full plan→assemble→eval cycle for the judge to discover
100
- * what the brief said in writing (prod 2026-07-14, rs7fanev…) — and with one candidate
101
- * attempt there is no critique retry to rescue it: this gate is the only line of defense.
102
- *
103
- * The messages ARE the fix: each names the beat, quotes the planner's own reason back at it,
104
- * and prescribes the exact shape — because `runPlanPhase` feeds these straight back as the
105
- * planner's next-turn instruction.
106
- */
107
- export function planBriefViolations(plan, contract) {
108
- if (contract.beats.length === 0)
109
- return []; // nothing pinned ⇒ nothing to protect
110
- const errors = [];
111
- // ── Rule C — every mandated graphic must be planned (runs even with zero deletions) ──
112
- for (const beat of contract.beats) {
113
- if (!beat.graphic)
114
- continue;
115
- const clipBeat = {
116
- startSec: beat.startSec - contract.windowStartSec,
117
- endSec: beat.endSec - contract.windowStartSec,
118
- };
119
- const role = beat.graphic.role;
120
- const sameRole = (plan.graphics ?? []).filter((g) => g.role === role);
121
- const match = sameRole.find((g) => overlap(clipBeat, { startSec: g.atSec, endSec: g.atSec + g.durSec }) > 0);
122
- if (!match) {
123
- const where = sameRole.length === 0
124
- ? `your plan has NO '${role}' graphics request at all`
125
- : `your plan's '${role}' request(s) (${sameRole
126
- .map((g) => `${s1(g.atSec)}–${s1(g.atSec + g.durSec)}s`)
127
- .join(", ")}) never overlap the beat`;
128
- errors.push(`brief: beat "${beat.id}" (${s1(clipBeat.startSec)}–${s1(clipBeat.endSec)}s clip-relative) ` +
129
- `MANDATES a '${role}' graphic — ${where}. The customer pinned this graphic; add a graphics ` +
130
- `entry { role: '${role}', atSec within ${s1(clipBeat.startSec)}–${s1(clipBeat.endSec)}, durSec, copy, intent }` +
131
- (beat.graphic.items?.length
132
- ? ` with copy.items carrying VERBATIM: ${beat.graphic.items.map((i) => `"${i}"`).join(", ")}`
133
- : "") +
134
- `.`);
135
- continue;
136
- }
137
- // Mandated items are the customer's words — verbatim (trim/casefold only).
138
- const wanted = beat.graphic.items ?? [];
139
- if (wanted.length > 0) {
140
- const norm = (s) => s.trim().toLowerCase();
141
- const have = new Set((match.copy?.items ?? []).map(norm));
142
- const missing = wanted.filter((w) => !have.has(norm(w)));
143
- if (missing.length > 0) {
144
- errors.push(`brief: beat "${beat.id}" — the '${role}' graphic "${match.id}" is planned but its ` +
145
- `copy.items drop the customer's mandated item(s): ${missing.map((i) => `"${i}"`).join(", ")}. ` +
146
- `These are the customer's words; carry each one verbatim in copy.items.`);
147
- }
148
- }
149
- }
150
- const deletions = [
151
- ...plan.framing
152
- .filter((f) => f.action === "trim")
153
- .map((f) => ({
154
- startSec: f.startSec,
155
- endSec: f.endSec,
156
- kind: "trim",
157
- reason: f.intent ?? "(no reason given)",
158
- })),
159
- ...(plan.cuts ?? []).map((c) => ({
160
- startSec: c.startSec,
161
- endSec: c.endSec,
162
- kind: "cut",
163
- reason: c.reason ?? "(no reason given)",
164
- })),
165
- ];
166
- if (deletions.length === 0)
167
- return errors;
168
- // ── Rule A — no pinned beat may be deleted ──
169
- for (const beat of contract.beats) {
170
- // The plan is CLIP-RELATIVE; the brief is SOURCE-absolute.
171
- const clipBeat = {
172
- startSec: beat.startSec - contract.windowStartSec,
173
- endSec: beat.endSec - contract.windowStartSec,
174
- };
175
- const hits = deletions
176
- .map((d) => ({ d, lost: overlap(clipBeat, d) }))
177
- .filter((h) => h.lost > 0);
178
- const lost = unionLength(hits.map((h) => h.d).map((d) => ({
179
- startSec: Math.max(d.startSec, clipBeat.startSec),
180
- endSec: Math.min(d.endSec, clipBeat.endSec),
181
- })));
182
- const beatLen = Math.max(1e-6, clipBeat.endSec - clipBeat.startSec);
183
- // Did the beat SURVIVE RECOGNISABLY? Cutting dead air out of a beat is editing (the
184
- // planner's job). Erasing the beat is content deletion (the brief's call, not its).
185
- if (lost / beatLen <= BEAT_MAX_LOSS_FRACTION)
186
- continue;
187
- const why = hits
188
- .map((h) => `${h.d.kind} "${h.d.reason}" (−${s1(h.lost)}s)`)
189
- .join("; ");
190
- errors.push(`brief: beat "${beat.id}" (${s1(beat.startSec)}–${s1(beat.endSec)}s source, ${s1(beatLen)}s long) — ` +
191
- `your plan DELETES ${s1(lost)}s of it (${Math.round((lost / beatLen) * 100)}%) via ${why}. ` +
192
- `The customer PINNED this beat and it would not survive. Trimming dead air inside a beat ` +
193
- `is fine; ERASING the beat is not — that is content, and the brief owns content. ` +
194
- `A span with nothing to track is NOT filler: use action:'keep' (SHOW as-is, no reframe).`);
195
- }
196
- // ── Rule B — the contracted duration survives ──
197
- const deleted = unionLength(deletions.map((d) => ({
198
- startSec: Math.max(0, d.startSec),
199
- endSec: Math.min(contract.targetDurationSec, d.endSec),
200
- })));
201
- const surviving = contract.targetDurationSec - deleted;
202
- if (Math.abs(surviving - contract.targetDurationSec) > BRIEF_DURATION_TOLERANCE_S) {
203
- errors.push(`brief: durationSec contract — your plan leaves ${s1(surviving)}s but the brief pins ` +
204
- `${s1(contract.targetDurationSec)}s (tolerance ±${BRIEF_DURATION_TOLERANCE_S}s). You deleted ` +
205
- `${s1(deleted)}s. The pinned beats ARE the video — there is no filler to cut. Re-plan with ` +
206
- `action:'keep' instead of 'trim' for any span you cannot track.`);
207
- }
208
- return errors;
209
- }
@@ -1,80 +0,0 @@
1
- /**
2
- * Color-grade derivation — the SINGLE home for `motionStyle.colorMood` →
3
- * color-grade preset. Both compose paths agree on the effect because they
4
- * import THIS function:
5
- * - the deterministic "cheap" path (`services/convex/composition/fromSuggestion.ts`)
6
- * - the Director agent path (`services/temporal/director/src/convexStore.ts`)
7
- *
8
- * Previously duplicated in both (a director-side `colorGrade.ts` "kept in
9
- * lockstep" by hand). Composition is a leaf both packages already depend on,
10
- * so the mapping lives here once. Pure string logic — isolate-safe.
11
- *
12
- * Returns `null` for "natural" / empty / unrecognised vocabulary so the effect
13
- * track is omitted entirely (a no-op renders cleanly).
14
- */
15
- /** Parse a `#rgb`/`#rrggbb` hex → hue in [0,360), or null if unparseable. */
16
- function hexHue(hex) {
17
- const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());
18
- if (!m)
19
- return null;
20
- let h = m[1];
21
- if (h.length === 3)
22
- h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
23
- const r = parseInt(h.slice(0, 2), 16) / 255;
24
- const g = parseInt(h.slice(2, 4), 16) / 255;
25
- const b = parseInt(h.slice(4, 6), 16) / 255;
26
- const max = Math.max(r, g, b);
27
- const min = Math.min(r, g, b);
28
- const d = max - min;
29
- if (d === 0)
30
- return null; // achromatic (grey/black/white) → no temperature signal
31
- let hue;
32
- if (max === r)
33
- hue = ((g - b) / d) % 6;
34
- else if (max === g)
35
- hue = (b - r) / d + 2;
36
- else
37
- hue = (r - g) / d + 4;
38
- hue *= 60;
39
- return hue < 0 ? hue + 360 : hue;
40
- }
41
- /**
42
- * Derive a `colorMood` (fed to `pickColorGradePreset`) from a brand kit's
43
- * signature colour, so a compose with NO explicit `motionStyle.colorMood` still
44
- * anchors the footage toward the brand instead of shipping ungraded (the Waverly
45
- * bug: empty colorMood → no grade → bright off-brand footage never anchored).
46
- *
47
- * Reads the brand's PRIMARY hue (falls back to accent): warm hues → "warm",
48
- * cool hues → "cool", else "cinematic" (a mild, safe default). Achromatic /
49
- * unparseable → "cinematic". Deliberately coarse — a mild anchor, not a
50
- * palette-exact regrade (that would need a brand-tint param on the primitive).
51
- */
52
- export function colorMoodFromBrand(colors) {
53
- const hue = hexHue(colors.primary ?? "") ?? hexHue(colors.accent ?? "");
54
- if (hue === null)
55
- return "cinematic";
56
- if (hue < 45 || hue >= 330)
57
- return "warm"; // reds / oranges / warm yellows
58
- if (hue >= 150 && hue < 270)
59
- return "cool"; // teals / blues / indigos
60
- return "cinematic"; // greens + magentas → neutral cinematic anchor
61
- }
62
- export function pickColorGradePreset(colorMood) {
63
- const v = colorMood.toLowerCase();
64
- if (v === "" || v.includes("natural") || v.includes("neutral") || v.includes("none")) {
65
- return null;
66
- }
67
- if (v.includes("warm") || v.includes("orange") || v.includes("golden"))
68
- return "warm";
69
- if (v.includes("cool") || v.includes("blue") || v.includes("cold"))
70
- return "cool";
71
- if (v.includes("vintage") || v.includes("retro") || v.includes("aged"))
72
- return "vintage";
73
- if (v.includes("sepia"))
74
- return "sepia";
75
- if (v.includes("bleach"))
76
- return "bleach-bypass";
77
- if (v.includes("cinematic") || v.includes("punchy") || v.includes("vibrant"))
78
- return "cinematic";
79
- return "cinematic"; // safe default — most production moods read as "cinematic"
80
- }
@@ -1,8 +0,0 @@
1
- export function isBehindSubjectDepthSource(source) {
2
- if (!source || typeof source !== 'object')
3
- return false;
4
- const kind = source.kind;
5
- if (kind !== 'overlay' && kind !== 'alpha-layer')
6
- return false;
7
- return source.zPlane === 'behind-subject';
8
- }