@cueframe/kernel 0.1.0 → 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 (355) hide show
  1. package/LICENSE +661 -0
  2. package/dist/_members/composition/ops/compositionOps.d.ts +1 -0
  3. package/dist/_members/composition/projection/behind-readiness.d.ts +127 -0
  4. package/dist/_members/composition/projection/index.d.ts +2 -0
  5. package/dist/_members/composition/projection/reframe-readiness.d.ts +156 -0
  6. package/dist/_members/composition/validators/composition.d.ts +42 -25
  7. package/dist/_members/composition/validators/render.d.ts +32 -0
  8. package/dist/_members/core/render/compositionRender.d.ts +17 -1
  9. package/dist/_members/core/render/types.d.ts +31 -0
  10. package/dist/authoring/build-tools.js +6 -6
  11. package/dist/authoring/context.js +4 -4
  12. package/dist/authoring/tools.js +5 -5
  13. package/dist/authoring.js +11 -9
  14. package/dist/{chunk-ZB3C3HM7.js → chunk-7FO3ZJ43.js} +3 -0
  15. package/dist/{chunk-ODL7GQJG.js → chunk-AP6ZIVAV.js} +2 -2
  16. package/dist/{chunk-IBYQG46O.js → chunk-AQBREB5O.js} +1 -1
  17. package/dist/{chunk-YIOY2XEO.js → chunk-DK2ODBNT.js} +15 -5
  18. package/dist/{chunk-JRQVPFLF.js → chunk-HY3RIEZW.js} +1 -1
  19. package/dist/{chunk-GEA7E2FL.js → chunk-JJ6XD7NG.js} +151 -1
  20. package/dist/{chunk-COYMZ76S.js → chunk-MBCXCJOE.js} +1 -1
  21. package/dist/{chunk-37NJ27UU.js → chunk-OCFDUCF4.js} +3 -0
  22. package/dist/{chunk-VOO5FQSS.js → chunk-PDYO3DOJ.js} +5 -5
  23. package/dist/{chunk-MXFAADCQ.js → chunk-PODIYN2K.js} +9 -2
  24. package/dist/{chunk-NFEGPWGS.js → chunk-TOJEXFXL.js} +1 -1
  25. package/dist/{chunk-LM4WDUQJ.js → chunk-UHGSZZDI.js} +1 -1
  26. package/dist/{chunk-XWKZB5U5.js → chunk-ZWMV6DD2.js} +24 -1
  27. package/dist/compose/renderer.js +3 -3
  28. package/dist/compose.js +6 -6
  29. package/dist/composition/graphics-plan.js +1 -1
  30. package/dist/composition/ops.js +3 -3
  31. package/dist/composition/primitive-catalog.js +1 -1
  32. package/dist/composition/projection.js +19 -3
  33. package/dist/composition/validators.js +6 -4
  34. package/dist/composition-ops.js +8 -6
  35. package/dist/composition.js +24 -6
  36. package/dist/{context-OKX3HHFS.js → context-YWUZDG5X.js} +4 -4
  37. package/dist/core/render.js +3 -3
  38. package/dist/core/select.js +2 -2
  39. package/dist/core.js +3 -3
  40. package/dist/errors.js +1 -1
  41. package/dist/mcp/adapter.js +1 -0
  42. package/dist/media-model/testing.js +1071 -718
  43. package/dist/nle-export/server.js +328 -130
  44. package/dist/nle-export.js +7 -6
  45. package/package.json +13 -14
  46. package/dist/_members/account-model/index.js +0 -4
  47. package/dist/_members/account-model/testing/conversationStoreContract.js +0 -168
  48. package/dist/_members/account-model/testing/index.js +0 -7
  49. package/dist/_members/account-model/testing/restorePointStoreContract.js +0 -69
  50. package/dist/_members/account-model/types/index.js +0 -1
  51. package/dist/_members/account-model/validators/contextFile.js +0 -18
  52. package/dist/_members/account-model/validators/conversation.js +0 -95
  53. package/dist/_members/account-model/validators/dashboardInsight.js +0 -16
  54. package/dist/_members/account-model/validators/index.js +0 -7
  55. package/dist/_members/account-model/validators/sessionToken.js +0 -49
  56. package/dist/_members/account-model/validators/uploadToken.js +0 -16
  57. package/dist/_members/account-model/validators/userSettings.js +0 -12
  58. package/dist/_members/account-model/validators/workingComposition.js +0 -20
  59. package/dist/_members/brand-derivation/constants.js +0 -20
  60. package/dist/_members/brand-derivation/contrastSafe.js +0 -114
  61. package/dist/_members/brand-derivation/index.js +0 -1
  62. package/dist/_members/cloud-import/chunk-XKO6ZSWI.js +0 -162
  63. package/dist/_members/cloud-import/chunk-XKO6ZSWI.js.map +0 -1
  64. package/dist/_members/cloud-import/index.js +0 -241
  65. package/dist/_members/cloud-import/index.js.map +0 -1
  66. package/dist/_members/cloud-import/multipartUpload.js +0 -7
  67. package/dist/_members/cloud-import/multipartUpload.js.map +0 -1
  68. package/dist/_members/composition/audio/audioMix.js +0 -61
  69. package/dist/_members/composition/audio/index.js +0 -5
  70. package/dist/_members/composition/audio/mixStaging.js +0 -195
  71. package/dist/_members/composition/audio/musicPack.generated.js +0 -136
  72. package/dist/_members/composition/audio/musicPack.js +0 -36
  73. package/dist/_members/composition/audio/pack.generated.js +0 -603
  74. package/dist/_members/composition/audio/pack.js +0 -48
  75. package/dist/_members/composition/audio/palette.js +0 -134
  76. package/dist/_members/composition/autozoom/index.js +0 -83
  77. package/dist/_members/composition/brand-kit.js +0 -45
  78. package/dist/_members/composition/brief/contract.js +0 -209
  79. package/dist/_members/composition/color-grade.js +0 -80
  80. package/dist/_members/composition/depth.js +0 -8
  81. package/dist/_members/composition/fixtures/index.js +0 -143
  82. package/dist/_members/composition/fixtures/vaayaErrored.d.ts +0 -25
  83. package/dist/_members/composition/fixtures/vaayaErrored.js +0 -203
  84. package/dist/_members/composition/fonts.js +0 -162
  85. package/dist/_members/composition/graphics-plan/compile.js +0 -221
  86. package/dist/_members/composition/graphics-plan/index.js +0 -10
  87. package/dist/_members/composition/graphics-plan/instantiateMotif.js +0 -44
  88. package/dist/_members/composition/graphics-plan/motion.js +0 -66
  89. package/dist/_members/composition/graphics-plan/schemas.js +0 -261
  90. package/dist/_members/composition/graphics-plan/solve.js +0 -145
  91. package/dist/_members/composition/index.js +0 -5
  92. package/dist/_members/composition/invariants/clipPlacement.js +0 -69
  93. package/dist/_members/composition/invariants/composition.js +0 -28
  94. package/dist/_members/composition/invariants/errors.js +0 -10
  95. package/dist/_members/composition/invariants/etag.js +0 -38
  96. package/dist/_members/composition/invariants/ids.js +0 -33
  97. package/dist/_members/composition/invariants/index.js +0 -9
  98. package/dist/_members/composition/invariants/keyframes.js +0 -45
  99. package/dist/_members/composition/invariants/markers.js +0 -29
  100. package/dist/_members/composition/invariants/time.js +0 -20
  101. package/dist/_members/composition/invariants/tracks.js +0 -304
  102. package/dist/_members/composition/ops/compositionOps.js +0 -1056
  103. package/dist/_members/composition/ops/headlessStore.js +0 -94
  104. package/dist/_members/composition/ops/index.js +0 -4
  105. package/dist/_members/composition/ops/selectors.js +0 -118
  106. package/dist/_members/composition/ops/timeline-word.js +0 -1
  107. package/dist/_members/composition/ops/transcript.js +0 -77
  108. package/dist/_members/composition/ops/types.js +0 -16
  109. package/dist/_members/composition/primitive-catalog/catalogQuery.js +0 -150
  110. package/dist/_members/composition/primitive-catalog/disabled.js +0 -32
  111. package/dist/_members/composition/primitive-catalog/generated/meta.js +0 -15161
  112. package/dist/_members/composition/primitive-catalog/index.js +0 -46
  113. package/dist/_members/composition/primitive-catalog/paramValidation.js +0 -231
  114. package/dist/_members/composition/primitive-catalog/projection.js +0 -164
  115. package/dist/_members/composition/primitive-catalog/types.js +0 -14
  116. package/dist/_members/composition/projection/behind-placement.js +0 -62
  117. package/dist/_members/composition/projection/brandKit.js +0 -482
  118. package/dist/_members/composition/projection/cardTokens.js +0 -209
  119. package/dist/_members/composition/projection/composition-floor.js +0 -582
  120. package/dist/_members/composition/projection/cropProjection.js +0 -257
  121. package/dist/_members/composition/projection/index.js +0 -7
  122. package/dist/_members/composition/projection/occlusion-budget.js +0 -104
  123. package/dist/_members/composition/projection/safe-zones.js +0 -99
  124. package/dist/_members/composition/reframe/aspectLoss.js +0 -115
  125. package/dist/_members/composition/reframe/coverage.js +0 -62
  126. package/dist/_members/composition/reframe/derive.js +0 -73
  127. package/dist/_members/composition/reframe/index.js +0 -109
  128. package/dist/_members/composition/reframe/kenBurns.js +0 -64
  129. package/dist/_members/composition/reframe/shotScale.js +0 -176
  130. package/dist/_members/composition/reframe/trajectory.js +0 -124
  131. package/dist/_members/composition/timeline/compound.js +0 -134
  132. package/dist/_members/composition/timeline/index.js +0 -9
  133. package/dist/_members/composition/timeline/intent.js +0 -228
  134. package/dist/_members/composition/timeline/keyframes.js +0 -121
  135. package/dist/_members/composition/timeline/link.js +0 -59
  136. package/dist/_members/composition/timeline/occupancy.js +0 -36
  137. package/dist/_members/composition/timeline/placement.js +0 -74
  138. package/dist/_members/composition/timeline/plan.js +0 -31
  139. package/dist/_members/composition/timeline/resolve.js +0 -170
  140. package/dist/_members/composition/timeline/trims.js +0 -278
  141. package/dist/_members/composition/types/index.js +0 -1
  142. package/dist/_members/composition/validators/brandKit.js +0 -295
  143. package/dist/_members/composition/validators/composePlan.js +0 -113
  144. package/dist/_members/composition/validators/composition.js +0 -703
  145. package/dist/_members/composition/validators/font.js +0 -34
  146. package/dist/_members/composition/validators/graphicKinds.js +0 -30
  147. package/dist/_members/composition/validators/index.js +0 -9
  148. package/dist/_members/composition/validators/project.js +0 -29
  149. package/dist/_members/composition/validators/registry.js +0 -41
  150. package/dist/_members/composition/validators/render.js +0 -139
  151. package/dist/_members/composition/validators/session.js +0 -37
  152. package/dist/_members/composition/validators/webhook.js +0 -72
  153. package/dist/_members/composition-ops/alphaLayers.js +0 -141
  154. package/dist/_members/composition-ops/index.js +0 -637
  155. package/dist/_members/composition-ops/materializeGrid.js +0 -99
  156. package/dist/_members/composition-ops/opRecorder.js +0 -196
  157. package/dist/_members/composition-ops/recordingStore.js +0 -14
  158. package/dist/_members/composition-ops/replaceRegion.js +0 -102
  159. package/dist/_members/composition-ops/testFixtures.js +0 -19
  160. package/dist/_members/core/index.js +0 -5
  161. package/dist/_members/core/render/bookends.js +0 -53
  162. package/dist/_members/core/render/captions.js +0 -127
  163. package/dist/_members/core/render/compositionRender.js +0 -1249
  164. package/dist/_members/core/render/deriveTrajectory.js +0 -889
  165. package/dist/_members/core/render/emphasis.js +0 -16
  166. package/dist/_members/core/render/eval/cropBox.js +0 -139
  167. package/dist/_members/core/render/eval/inclusion.js +0 -96
  168. package/dist/_members/core/render/eval/index.js +0 -146
  169. package/dist/_members/core/render/eval/metrics.js +0 -94
  170. package/dist/_members/core/render/exportSettings.js +0 -65
  171. package/dist/_members/core/render/index.js +0 -20
  172. package/dist/_members/core/render/mapFaceToPerson.js +0 -73
  173. package/dist/_members/core/render/types.js +0 -8
  174. package/dist/_members/core/render/vcam/cameraPath.js +0 -248
  175. package/dist/_members/core/render/vcam/constants.js +0 -115
  176. package/dist/_members/core/render/vcam/errorCodes.js +0 -39
  177. package/dist/_members/core/render/vcam/framing.js +0 -136
  178. package/dist/_members/core/render/vcam/requiredRegion.js +0 -137
  179. package/dist/_members/core/render/vcam/shots.js +0 -53
  180. package/dist/_members/core/render/vcam/subjectSet.js +0 -388
  181. package/dist/_members/core/select/errorCodes.js +0 -38
  182. package/dist/_members/core/select/index.js +0 -26
  183. package/dist/_members/core/select/model.js +0 -18
  184. package/dist/_members/core/select/select.js +0 -244
  185. package/dist/_members/core/select/stabilize.js +0 -242
  186. package/dist/_members/core/types.js +0 -7
  187. package/dist/_members/errors/index.js +0 -1
  188. package/dist/_members/errors/registry.js +0 -560
  189. package/dist/_members/foundation/codes/index.js +0 -31
  190. package/dist/_members/foundation/index.js +0 -2
  191. package/dist/_members/foundation/primitives/index.js +0 -5
  192. package/dist/_members/mcp/adapter.js +0 -771
  193. package/dist/_members/mcp/burnedNames.js +0 -73
  194. package/dist/_members/mcp/core.js +0 -390
  195. package/dist/_members/mcp/curation.js +0 -792
  196. package/dist/_members/mcp/executor.js +0 -142
  197. package/dist/_members/mcp/format.js +0 -9
  198. package/dist/_members/mcp/generated/catalogPreviews.js +0 -95
  199. package/dist/_members/mcp/generated/harness.js +0 -81
  200. package/dist/_members/mcp/generated/operations.js +0 -131
  201. package/dist/_members/mcp/index.js +0 -50
  202. package/dist/_members/mcp/internalLoopTools.js +0 -109
  203. package/dist/_members/mcp/prompts.js +0 -45
  204. package/dist/_members/mcp/resources.js +0 -166
  205. package/dist/_members/mcp/server.js +0 -340
  206. package/dist/_members/mcp/wait.js +0 -378
  207. package/dist/_members/mcp/x402Meta.js +0 -66
  208. package/dist/_members/media-model/api.js +0 -175
  209. package/dist/_members/media-model/index.js +0 -1
  210. package/dist/_members/media-model/media-kind.js +0 -116
  211. package/dist/_members/media-model/testing/index.js +0 -1
  212. package/dist/_members/media-model/testing/mediaStoreContract.js +0 -82
  213. package/dist/_members/media-model/transcriptSearch.js +0 -70
  214. package/dist/_members/media-model/transcriptSearchCases.json +0 -79
  215. package/dist/_members/nle-export/compact-timeline.js +0 -73
  216. package/dist/_members/nle-export/compact-timeline.js.map +0 -1
  217. package/dist/_members/nle-export/composition-to-input.js +0 -147
  218. package/dist/_members/nle-export/composition-to-input.js.map +0 -1
  219. package/dist/_members/nle-export/fcpxml.js +0 -159
  220. package/dist/_members/nle-export/fcpxml.js.map +0 -1
  221. package/dist/_members/nle-export/index.js +0 -12
  222. package/dist/_members/nle-export/index.js.map +0 -1
  223. package/dist/_members/nle-export/premiere.js +0 -161
  224. package/dist/_members/nle-export/premiere.js.map +0 -1
  225. package/dist/_members/nle-export/server/index.js +0 -2
  226. package/dist/_members/nle-export/server/index.js.map +0 -1
  227. package/dist/_members/nle-export/server/pack-zip.js +0 -38
  228. package/dist/_members/nle-export/server/pack-zip.js.map +0 -1
  229. package/dist/_members/nle-export/srt.js +0 -50
  230. package/dist/_members/nle-export/srt.js.map +0 -1
  231. package/dist/_members/nle-export/types.js +0 -9
  232. package/dist/_members/nle-export/types.js.map +0 -1
  233. package/dist/_members/nle-export/xml/index.js +0 -11
  234. package/dist/_members/nle-export/xml/index.js.map +0 -1
  235. package/dist/_members/nle-export/xml-utils.js +0 -48
  236. package/dist/_members/nle-export/xml-utils.js.map +0 -1
  237. package/dist/_members/perception/activeSpeaker.js +0 -103
  238. package/dist/_members/perception/audioQuality.js +0 -76
  239. package/dist/_members/perception/energyBeat.js +0 -99
  240. package/dist/_members/perception/identityMatch.js +0 -91
  241. package/dist/_members/perception/index.js +0 -48
  242. package/dist/_members/perception/visualQuality.js +0 -95
  243. package/dist/_members/plane/conformance.js +0 -90
  244. package/dist/_members/plane/contract.js +0 -49
  245. package/dist/_members/plane/index.js +0 -16
  246. package/dist/_members/primitives/backgrounds/index.js +0 -32
  247. package/dist/_members/primitives/backgrounds/index.js.map +0 -1
  248. package/dist/_members/primitives/captions/index.js +0 -398
  249. package/dist/_members/primitives/captions/index.js.map +0 -1
  250. package/dist/_members/primitives/chunk-2LVE4UIT.js +0 -139
  251. package/dist/_members/primitives/chunk-2LVE4UIT.js.map +0 -1
  252. package/dist/_members/primitives/chunk-3IQUH6KK.js +0 -20
  253. package/dist/_members/primitives/chunk-3IQUH6KK.js.map +0 -1
  254. package/dist/_members/primitives/chunk-3OMURV6Q.js +0 -112
  255. package/dist/_members/primitives/chunk-3OMURV6Q.js.map +0 -1
  256. package/dist/_members/primitives/chunk-4IS6TMEG.js +0 -21
  257. package/dist/_members/primitives/chunk-4IS6TMEG.js.map +0 -1
  258. package/dist/_members/primitives/chunk-5MWGAEGQ.js +0 -1644
  259. package/dist/_members/primitives/chunk-5MWGAEGQ.js.map +0 -1
  260. package/dist/_members/primitives/chunk-7RRPFPQK.js +0 -15
  261. package/dist/_members/primitives/chunk-7RRPFPQK.js.map +0 -1
  262. package/dist/_members/primitives/chunk-DH5TRZK2.js +0 -125
  263. package/dist/_members/primitives/chunk-DH5TRZK2.js.map +0 -1
  264. package/dist/_members/primitives/chunk-E3KNUSFG.js +0 -2337
  265. package/dist/_members/primitives/chunk-E3KNUSFG.js.map +0 -1
  266. package/dist/_members/primitives/chunk-G2B3G4HK.js +0 -47
  267. package/dist/_members/primitives/chunk-G2B3G4HK.js.map +0 -1
  268. package/dist/_members/primitives/chunk-HFPFGZXT.js +0 -1494
  269. package/dist/_members/primitives/chunk-HFPFGZXT.js.map +0 -1
  270. package/dist/_members/primitives/chunk-HIWVFZVH.js +0 -19
  271. package/dist/_members/primitives/chunk-HIWVFZVH.js.map +0 -1
  272. package/dist/_members/primitives/chunk-IDAL6G3Y.js +0 -134
  273. package/dist/_members/primitives/chunk-IDAL6G3Y.js.map +0 -1
  274. package/dist/_members/primitives/chunk-KNC6JP5F.js +0 -34
  275. package/dist/_members/primitives/chunk-KNC6JP5F.js.map +0 -1
  276. package/dist/_members/primitives/chunk-KYRDVZST.js +0 -459
  277. package/dist/_members/primitives/chunk-KYRDVZST.js.map +0 -1
  278. package/dist/_members/primitives/chunk-LWLHS2NS.js +0 -3410
  279. package/dist/_members/primitives/chunk-LWLHS2NS.js.map +0 -1
  280. package/dist/_members/primitives/chunk-QAQ3P7DR.js +0 -8855
  281. package/dist/_members/primitives/chunk-QAQ3P7DR.js.map +0 -1
  282. package/dist/_members/primitives/chunk-ROV2ODWC.js +0 -81
  283. package/dist/_members/primitives/chunk-ROV2ODWC.js.map +0 -1
  284. package/dist/_members/primitives/chunk-TCRC2FH3.js +0 -183
  285. package/dist/_members/primitives/chunk-TCRC2FH3.js.map +0 -1
  286. package/dist/_members/primitives/chunk-US4YEDAA.js +0 -96
  287. package/dist/_members/primitives/chunk-US4YEDAA.js.map +0 -1
  288. package/dist/_members/primitives/chunk-UVKRO5ER.js +0 -13
  289. package/dist/_members/primitives/chunk-UVKRO5ER.js.map +0 -1
  290. package/dist/_members/primitives/chunk-W4EIIF2I.js +0 -10
  291. package/dist/_members/primitives/chunk-W4EIIF2I.js.map +0 -1
  292. package/dist/_members/primitives/chunk-WPGKIPCO.js +0 -3563
  293. package/dist/_members/primitives/chunk-WPGKIPCO.js.map +0 -1
  294. package/dist/_members/primitives/chunk-WZFLEGMD.js +0 -1435
  295. package/dist/_members/primitives/chunk-WZFLEGMD.js.map +0 -1
  296. package/dist/_members/primitives/chunk-XHU3WBEI.js +0 -33
  297. package/dist/_members/primitives/chunk-XHU3WBEI.js.map +0 -1
  298. package/dist/_members/primitives/chunk-YN7WTZZ7.js +0 -46
  299. package/dist/_members/primitives/chunk-YN7WTZZ7.js.map +0 -1
  300. package/dist/_members/primitives/effects/index.js +0 -30
  301. package/dist/_members/primitives/effects/index.js.map +0 -1
  302. package/dist/_members/primitives/hero-text/index.js +0 -14
  303. package/dist/_members/primitives/hero-text/index.js.map +0 -1
  304. package/dist/_members/primitives/index.js +0 -64
  305. package/dist/_members/primitives/index.js.map +0 -1
  306. package/dist/_members/primitives/layouts/index.js +0 -24
  307. package/dist/_members/primitives/layouts/index.js.map +0 -1
  308. package/dist/_members/primitives/lib/easings.js +0 -26
  309. package/dist/_members/primitives/lib/easings.js.map +0 -1
  310. package/dist/_members/primitives/lib/index.js +0 -74
  311. package/dist/_members/primitives/lib/index.js.map +0 -1
  312. package/dist/_members/primitives/lib/palette.js +0 -72
  313. package/dist/_members/primitives/lib/palette.js.map +0 -1
  314. package/dist/_members/primitives/lib/preview.js +0 -8
  315. package/dist/_members/primitives/lib/preview.js.map +0 -1
  316. package/dist/_members/primitives/lib/schema.js +0 -12
  317. package/dist/_members/primitives/lib/schema.js.map +0 -1
  318. package/dist/_members/primitives/lib/seeded-random.js +0 -14
  319. package/dist/_members/primitives/lib/seeded-random.js.map +0 -1
  320. package/dist/_members/primitives/lib/text/contrast.js +0 -12
  321. package/dist/_members/primitives/lib/text/contrast.js.map +0 -1
  322. package/dist/_members/primitives/lib/text/fill.js +0 -8
  323. package/dist/_members/primitives/lib/text/fill.js.map +0 -1
  324. package/dist/_members/primitives/lib/text/fitText.js +0 -10
  325. package/dist/_members/primitives/lib/text/fitText.js.map +0 -1
  326. package/dist/_members/primitives/lib/text/marker.js +0 -8
  327. package/dist/_members/primitives/lib/text/marker.js.map +0 -1
  328. package/dist/_members/primitives/lib/text/motion.js +0 -16
  329. package/dist/_members/primitives/lib/text/motion.js.map +0 -1
  330. package/dist/_members/primitives/lib/text/recolor.js +0 -8
  331. package/dist/_members/primitives/lib/text/recolor.js.map +0 -1
  332. package/dist/_members/primitives/lib/text/spec.js +0 -1
  333. package/dist/_members/primitives/lib/text/spec.js.map +0 -1
  334. package/dist/_members/primitives/lib/text/stage.js +0 -8
  335. package/dist/_members/primitives/lib/text/stage.js.map +0 -1
  336. package/dist/_members/primitives/lib/text/typeface.js +0 -8
  337. package/dist/_members/primitives/lib/text/typeface.js.map +0 -1
  338. package/dist/_members/primitives/lib/tokens.js +0 -24
  339. package/dist/_members/primitives/lib/tokens.js.map +0 -1
  340. package/dist/_members/primitives/lib/types.js +0 -1
  341. package/dist/_members/primitives/lib/types.js.map +0 -1
  342. package/dist/_members/primitives/params-required.json +0 -153
  343. package/dist/_members/primitives/scenes/index.js +0 -25
  344. package/dist/_members/primitives/scenes/index.js.map +0 -1
  345. package/dist/_members/primitives/subject-foreground/index.js +0 -30
  346. package/dist/_members/primitives/subject-foreground/index.js.map +0 -1
  347. package/dist/_members/primitives/text/index.js +0 -57
  348. package/dist/_members/primitives/text/index.js.map +0 -1
  349. package/dist/_members/primitives/transitions/index.js +0 -67
  350. package/dist/_members/primitives/transitions/index.js.map +0 -1
  351. package/dist/_members/primitives/ui-blocks/index.js +0 -76
  352. package/dist/_members/primitives/ui-blocks/index.js.map +0 -1
  353. package/dist/_members/primitives/version-map.json +0 -105
  354. package/dist/_members/primitives/workspace.js +0 -60
  355. package/dist/_members/primitives/workspace.js.map +0 -1
@@ -1,46 +0,0 @@
1
- // @cueframe/primitive-registry — React-free primitive catalog metadata + the
2
- // authoring-facing accessors. The renderer (@cueframe/compose, execution) keeps
3
- // its full registry (components + paramsSchema + createPresentation) and
4
- // RE-EXPORTS these accessors from here so there is exactly one source of truth
5
- // for the text/subtext/category contract — no parallel copy to drift.
6
- import { PRIMITIVE_META } from './generated/meta';
7
- export { PRIMITIVE_META };
8
- const byId = new Map(PRIMITIVE_META.map((m) => [m.id, m]));
9
- /** List primitives filtered by category. Used by `list_effect_styles` + discovery. */
10
- export function listPrimitivesByCategory(category) {
11
- return PRIMITIVE_META.filter((m) => m.category === category);
12
- }
13
- /**
14
- * The primitive's declared text-param name.
15
- * - string → the field accepting a single text payload (e.g. 'text').
16
- * - null → the primitive explicitly declines text (e.g. karaoke).
17
- * - undefined → unknown id, or no declared text contract.
18
- */
19
- export function getPrimitiveTextParam(id) {
20
- return byId.get(id)?.textParam;
21
- }
22
- /** Secondary text-param name. Same string/null/undefined semantics. */
23
- export function getPrimitiveSubtextParam(id) {
24
- return byId.get(id)?.subtextParam;
25
- }
26
- /** Lookup a primitive's catalog metadata by id. */
27
- export function getPrimitiveCatalogMeta(id) {
28
- return byId.get(id);
29
- }
30
- /** All registered primitive ids. */
31
- export function listPrimitiveIds() {
32
- return [...byId.keys()];
33
- }
34
- export { projectToComponentCatalog, projectToRegistryOverlays, derivePlacement, } from './projection';
35
- /** JSON Schema for a primitive's props, or undefined if unknown. */
36
- export function getPrimitivePropSchema(id) {
37
- return byId.get(id)?.propSchema;
38
- }
39
- // Pure, V8-safe param validation against the baked propSchema (closed-key +
40
- // typed). Imported by the Convex isolate's write/validate boundary guards.
41
- export { validatePrimitiveParams, validateParamsAgainstSchema, } from './paramValidation';
42
- // The disabled-primitive denylist — the single switch that takes a built-in
43
- // primitive out of circulation (discovery + write-boundary membership). See
44
- // ./disabled for why a denylist rather than a per-primitive flag.
45
- export { DISABLED_PRIMITIVE_IDS, isPrimitiveDisabled } from './disabled';
46
- export { queryCatalog, filterCatalog, hasAnyCatalogFilter, validateCatalogFilters, encodeCatalogCursor, decodeCatalogCursor, serializeSfxCatalog, CatalogFilterError, CatalogCursorError, CATALOG_CATEGORY_VALUES, CATALOG_KIND_VALUES, CATALOG_TIER_VALUES, CATALOG_USE_CASE_VALUES, } from "./catalogQuery";
@@ -1,231 +0,0 @@
1
- // @cueframe/primitive-registry — pure, React/Remotion-FREE param validation
2
- // against the catalog's baked JSON-Schema `propSchema` (the same SSOT the
3
- // renderer's Zod paramsSchema generates — see build-primitive-meta.mjs).
4
- //
5
- // WHY THIS MODULE IS DEPENDENCY-FREE AND V8-SAFE: it is imported by the Convex
6
- // V8 isolate (via `@cueframe/primitive-registry`, already proven safe — see
7
- // services/convex/api/registry/builtinRegistry.ts). It MUST NOT pull in ajv or
8
- // any validator that calls `eval` / `new Function` (forbidden in the isolate)
9
- // and MUST NOT import React/Remotion. The closed-key + primitive-type checks
10
- // below are hand-rolled against `propSchema.properties` with zero deps.
11
- //
12
- // WHAT IT CLOSES: overlay/effect clip `params` are wire-typed as
13
- // `z.record(z.string(), z.unknown())`, and every primitive's Zod paramsSchema
14
- // is `.passthrough()` (so `propSchema.additionalProperties === true` on all 87).
15
- // A TYPO'd key (`headlin` for `headline`) or an UNSUPPORTED key is therefore
16
- // silently dropped, and a WRONG-TYPED value (`text: 123`) is not caught until
17
- // render (render_unknown / no-op). This validates at the write/validate boundary
18
- // so those fail LOUD with the valid key set — not silently vanish.
19
- //
20
- // SCOPE BY DESIGN: TOP-LEVEL closed-key + TOP-LEVEL per-property primitive-type
21
- // check only. We deliberately do NOT recurse (deep/nested shape, refinements,
22
- // mins/maxes, enums) — that is the renderer's full-Zod job at inflate time. The
23
- // `additionalProperties: true` passthrough flag is the BUG we are closing, NOT a
24
- // license to allow unknown keys; the only escape hatch is the explicit
25
- // per-primitive `freeformParams` opt-out (no first-party config sets it today).
26
- import { PRIMITIVE_META } from './generated/meta';
27
- const byId = new Map(PRIMITIVE_META.map((m) => [m.id, m]));
28
- /** JSON-Schema primitive `type` names we can check structurally, no deps. */
29
- const PRIMITIVE_TYPES = new Set([
30
- 'string',
31
- 'number',
32
- 'integer',
33
- 'boolean',
34
- 'object',
35
- 'array',
36
- 'null',
37
- ]);
38
- /** Runtime JSON type label for a value — used in mismatch messages. */
39
- function jsonType(value) {
40
- if (value === null)
41
- return 'null';
42
- if (Array.isArray(value))
43
- return 'array';
44
- return typeof value; // 'string' | 'number' | 'boolean' | 'object' | ...
45
- }
46
- /** Does a runtime value satisfy a single JSON-Schema primitive `type` name? */
47
- function matchesType(value, type) {
48
- switch (type) {
49
- case 'string':
50
- return typeof value === 'string';
51
- case 'boolean':
52
- return typeof value === 'boolean';
53
- case 'number':
54
- return typeof value === 'number' && Number.isFinite(value);
55
- case 'integer':
56
- return typeof value === 'number' && Number.isInteger(value);
57
- case 'object':
58
- return value !== null && typeof value === 'object' && !Array.isArray(value);
59
- case 'array':
60
- return Array.isArray(value);
61
- case 'null':
62
- return value === null;
63
- default:
64
- // An unrecognised type keyword can't be checked structurally — don't
65
- // claim a mismatch (closed-key already caught typo'd KEYS).
66
- return true;
67
- }
68
- }
69
- /**
70
- * Collect value-constraint violations for a single CORRECTLY-TYPED value against
71
- * its declared property schema. Only the flat, top-level JSON-Schema keywords the
72
- * catalog bakes for scalars — maxLength/minLength (strings), minimum/maximum
73
- * (numbers), and enum (any primitive). Deep/nested-item and `.refine()` custom
74
- * logic stay the renderer's full-Zod job (now surfaced TYPED from inflate).
75
- */
76
- function collectConstraintViolations(key, value, prop, out) {
77
- if (typeof value === 'string') {
78
- if (typeof prop.maxLength === 'number' && value.length > prop.maxLength) {
79
- out.push({ key, constraint: 'maxLength', limit: prop.maxLength, actual: value.length });
80
- }
81
- if (typeof prop.minLength === 'number' && value.length < prop.minLength) {
82
- out.push({ key, constraint: 'minLength', limit: prop.minLength, actual: value.length });
83
- }
84
- }
85
- if (typeof value === 'number' && Number.isFinite(value)) {
86
- if (typeof prop.maximum === 'number' && value > prop.maximum) {
87
- out.push({ key, constraint: 'maximum', limit: prop.maximum, actual: value });
88
- }
89
- if (typeof prop.minimum === 'number' && value < prop.minimum) {
90
- out.push({ key, constraint: 'minimum', limit: prop.minimum, actual: value });
91
- }
92
- if (typeof prop.exclusiveMaximum === 'number' && value >= prop.exclusiveMaximum) {
93
- out.push({ key, constraint: 'exclusiveMaximum', limit: prop.exclusiveMaximum, actual: value });
94
- }
95
- if (typeof prop.exclusiveMinimum === 'number' && value <= prop.exclusiveMinimum) {
96
- out.push({ key, constraint: 'exclusiveMinimum', limit: prop.exclusiveMinimum, actual: value });
97
- }
98
- }
99
- if (Array.isArray(value)) {
100
- if (typeof prop.maxItems === 'number' && value.length > prop.maxItems) {
101
- out.push({ key, constraint: 'maxItems', limit: prop.maxItems, actual: value.length });
102
- }
103
- if (typeof prop.minItems === 'number' && value.length < prop.minItems) {
104
- out.push({ key, constraint: 'minItems', limit: prop.minItems, actual: value.length });
105
- }
106
- }
107
- if (Array.isArray(prop.enum) && prop.enum.length > 0) {
108
- if ((typeof value === 'string' ||
109
- typeof value === 'number' ||
110
- typeof value === 'boolean') &&
111
- !prop.enum.includes(value)) {
112
- out.push({
113
- key,
114
- constraint: 'enum',
115
- limit: prop.enum,
116
- actual: value,
117
- });
118
- }
119
- }
120
- }
121
- /**
122
- * Validate a params object against an EXPLICIT JSON-Schema `propSchema`. The
123
- * low-level core: pure, no registry lookup, so the "missing propSchema → fail
124
- * loud" branch is directly unit-testable (pass `undefined`).
125
- *
126
- * - CLOSED-KEY: every provided key must be a declared property; otherwise it
127
- * lands in `unknownKeys` (with `allowedKeys` = the valid set). Suppressed when
128
- * `opts.freeform` (the per-primitive opt-out) is set — typed checks still run.
129
- * - TYPED: each provided KNOWN key is checked against its declared primitive
130
- * `type` (string, or an array-of-strings union). Properties with no concrete
131
- * primitive `type` (anyOf/enum-only/$ref) skip the typed check — closed-key
132
- * still applies, deep shape is the renderer's full-Zod job.
133
- */
134
- export function validateParamsAgainstSchema(params, propSchema, opts) {
135
- const schema = propSchema;
136
- const properties = schema && typeof schema === 'object' ? schema.properties : undefined;
137
- // Fail loud: a primitive we were asked to validate has no usable object
138
- // propSchema. Never silently pass (that is the silent-drop class this exists
139
- // to kill). With the catalog's 87↔87 version-map alignment this should be
140
- // unreachable for a known primitive, so it only fires on real registry drift.
141
- if (!schema ||
142
- schema.type !== 'object' ||
143
- !properties ||
144
- typeof properties !== 'object') {
145
- return {
146
- missingPropSchema: true,
147
- unknownKeys: [],
148
- allowedKeys: [],
149
- typeMismatches: [],
150
- constraintViolations: [],
151
- };
152
- }
153
- const allowedKeys = Object.keys(properties).sort();
154
- const allowed = new Set(allowedKeys);
155
- const paramsObj = params && typeof params === 'object' && !Array.isArray(params)
156
- ? params
157
- : {};
158
- const unknownKeys = [];
159
- const typeMismatches = [];
160
- const constraintViolations = [];
161
- for (const [key, value] of Object.entries(paramsObj)) {
162
- if (!allowed.has(key)) {
163
- if (!opts?.freeform)
164
- unknownKeys.push(key);
165
- continue;
166
- }
167
- const prop = properties[key];
168
- const declared = prop?.type;
169
- let typeOk = true;
170
- if (typeof declared === 'string' && PRIMITIVE_TYPES.has(declared)) {
171
- if (!matchesType(value, declared)) {
172
- typeMismatches.push({ key, expected: declared, actual: jsonType(value) });
173
- typeOk = false;
174
- }
175
- }
176
- else if (Array.isArray(declared) &&
177
- declared.length > 0 &&
178
- declared.every((t) => typeof t === 'string')) {
179
- const types = declared;
180
- if (!types.some((t) => matchesType(value, t))) {
181
- typeMismatches.push({
182
- key,
183
- expected: types.join('|'),
184
- actual: jsonType(value),
185
- });
186
- typeOk = false;
187
- }
188
- }
189
- // No concrete primitive type (anyOf/enum-only/$ref) → typed check skipped,
190
- // but value constraints (enum membership, flat min/max/length) still apply.
191
- // Only value-check a value that is not already a type mismatch.
192
- if (typeOk && prop) {
193
- collectConstraintViolations(key, value, prop, constraintViolations);
194
- }
195
- }
196
- return {
197
- missingPropSchema: false,
198
- unknownKeys: unknownKeys.sort(),
199
- allowedKeys,
200
- typeMismatches,
201
- constraintViolations,
202
- };
203
- }
204
- /**
205
- * Resolve a registry primitive's baked `propSchema` and validate `params`
206
- * against it (closed-key + typed). The SSOT-resolving wrapper over
207
- * `validateParamsAgainstSchema`.
208
- *
209
- * - `known:false` when `primitiveId` is absent from the catalog — the
210
- * membership guard owns reporting unknown ids; the param-shape caller skips.
211
- * - `missingPropSchema:true` when a KNOWN primitive carries no usable
212
- * propSchema (registry drift) — the caller fails loud.
213
- * - Honours the per-primitive `freeformParams` opt-out (no config sets it today).
214
- */
215
- export function validatePrimitiveParams(primitiveId, params) {
216
- const meta = byId.get(primitiveId);
217
- if (!meta) {
218
- return {
219
- known: false,
220
- missingPropSchema: false,
221
- unknownKeys: [],
222
- allowedKeys: [],
223
- typeMismatches: [],
224
- constraintViolations: [],
225
- };
226
- }
227
- const result = validateParamsAgainstSchema(params, meta.propSchema, {
228
- freeform: meta.freeformParams === true,
229
- });
230
- return { known: true, ...result };
231
- }
@@ -1,164 +0,0 @@
1
- // @cueframe/primitive-registry — React-free projections from the generated
2
- // PRIMITIVE_META (the single source of truth) into the two catalog shapes the
3
- // API serves:
4
- // - projectToComponentCatalog → the unified 7-category shape served by the
5
- // new /v1/components endpoint.
6
- // - projectToRegistryOverlays → the legacy namespaced (cueframe:*) shape
7
- // served by the deprecated /v1/registry/overlays endpoint.
8
- // Convex (V8 isolate) imports these, so this module stays React/Remotion-free:
9
- // it imports only the metadata types and the generated meta.
10
- import { isPrimitiveDisabled } from './disabled';
11
- /**
12
- * Project a primitive's declared `tokens` into the public brand-binding hints.
13
- * Only tokens with a `brandKitPath` are brand-bindable; the rest are
14
- * render-internal CSS-var bindings with no agent-facing value. Returns
15
- * `undefined` (not `[]`) when none, so the field is omitted from the wire shape.
16
- */
17
- function deriveBrandBindings(tokens) {
18
- if (!tokens || tokens.length === 0)
19
- return undefined;
20
- const bindings = tokens
21
- .filter((t) => typeof t.brandKitPath === 'string' && t.brandKitPath.length > 0)
22
- .map((t) => ({ param: t.propPath, brandToken: `$brand:${t.brandKitPath}` }));
23
- return bindings.length > 0 ? bindings : undefined;
24
- }
25
- const EFFECT_PLACEMENT_CATEGORIES = new Set([
26
- 'effects',
27
- 'transitions',
28
- ]);
29
- const OVERLAY_PLACEMENT_CATEGORIES = new Set([
30
- 'text',
31
- 'ui-blocks',
32
- 'backgrounds',
33
- 'layouts',
34
- 'scenes',
35
- ]);
36
- /**
37
- * Derive the timeline-placement hint for a catalog entry from its provenance +
38
- * category. Fail-loud: an unmapped category means a new `PrimitiveCategory`
39
- * landed without a placement rule — a silent default would mis-author the clip.
40
- */
41
- export function derivePlacement(args) {
42
- // An org-installed custom component is the ONLY ComponentClipSource case.
43
- if (args.source === 'installed') {
44
- return { clipSourceKind: 'component', refField: 'componentId' };
45
- }
46
- if (EFFECT_PLACEMENT_CATEGORIES.has(args.category)) {
47
- return { clipSourceKind: 'effect', refField: 'primitiveId' };
48
- }
49
- if (OVERLAY_PLACEMENT_CATEGORIES.has(args.category)) {
50
- return { clipSourceKind: 'overlay', refField: 'primitiveId' };
51
- }
52
- throw new Error(`derivePlacement: no placement rule for category '${args.category}' (source '${args.source}'). ` +
53
- `Add it to EFFECT_PLACEMENT_CATEGORIES or OVERLAY_PLACEMENT_CATEGORIES.`);
54
- }
55
- // Default for installed rows in a later task that legitimately lack a propSchema.
56
- // Default-source rows always carry a real propSchema (Task 2 fails loud otherwise),
57
- // so the projection below uses m.propSchema directly.
58
- const EMPTY_SCHEMA = { type: 'object', properties: {} };
59
- function aspectRatio(w, h) {
60
- if (!w || !h)
61
- return undefined;
62
- const r = w / h;
63
- if (Math.abs(r - 16 / 9) < 0.02)
64
- return '16:9';
65
- if (Math.abs(r - 9 / 16) < 0.02)
66
- return '9:16';
67
- if (Math.abs(r - 1) < 0.02)
68
- return '1:1';
69
- if (Math.abs(r - 4 / 5) < 0.02)
70
- return '4:5';
71
- return undefined;
72
- }
73
- function resolution(h) {
74
- if (!h)
75
- return undefined;
76
- if (h >= 2160)
77
- return '4k';
78
- if (h >= 1080)
79
- return 'fhd';
80
- if (h >= 720)
81
- return 'hd';
82
- return undefined;
83
- }
84
- function sceneFps(fps) {
85
- if (fps === undefined)
86
- return undefined;
87
- if (fps === 24 || fps === 30 || fps === 60)
88
- return fps;
89
- throw new Error(`sceneFormat: unsupported scene fps ${fps} (expected 24|30|60)`);
90
- }
91
- function sceneFormat(m) {
92
- if (m.kind !== 'scene')
93
- return undefined;
94
- const ar = aspectRatio(m.width, m.height);
95
- if (!ar)
96
- return undefined;
97
- return {
98
- aspectRatio: ar,
99
- fps: sceneFps(m.fps),
100
- resolution: resolution(m.height),
101
- };
102
- }
103
- export function projectToComponentCatalog(metas) {
104
- // Disabled primitives are never OFFERED — a driving agent can't discover what
105
- // it isn't allowed to author (the write boundary rejects them too).
106
- return metas.filter((m) => !isPrimitiveDisabled(m.id)).map((m) => ({
107
- id: m.id,
108
- name: m.name,
109
- description: m.description ?? '',
110
- source: 'default',
111
- category: m.category,
112
- kind: m.kind,
113
- version: m.version,
114
- propSchema: m.propSchema ?? EMPTY_SCHEMA,
115
- propDefaults: m.propDefaults,
116
- textParam: m.textParam,
117
- subtextParam: m.subtextParam,
118
- format: sceneFormat(m),
119
- durationInFrames: m.durationInFrames,
120
- intent: m.intent,
121
- useWhen: m.useWhen,
122
- pairsWith: m.pairsWith,
123
- avoidWith: m.avoidWith,
124
- tags: m.tags,
125
- mood: m.mood,
126
- tier: m.tier,
127
- useCase: m.useCase,
128
- examples: m.examples,
129
- fixedCopy: m.fixedCopy,
130
- brandBindings: deriveBrandBindings(m.tokens),
131
- // Built-in primitives are always source:'default'; placement derives from
132
- // category (overlay for text/ui/scene, effect for effects/transitions).
133
- placement: derivePlacement({ source: 'default', category: m.category }),
134
- }));
135
- }
136
- const OVERLAY_CATEGORY = {
137
- text: 'cueframe:overlay.text',
138
- effects: 'cueframe:effect',
139
- transitions: 'cueframe:transition',
140
- scenes: 'cueframe:scene',
141
- };
142
- export function projectToRegistryOverlays(metas) {
143
- const out = [];
144
- for (const m of metas) {
145
- if (isPrimitiveDisabled(m.id))
146
- continue; // disabled primitives are never offered
147
- const category = OVERLAY_CATEGORY[m.category];
148
- if (!category)
149
- continue; // layouts/backgrounds/ui-blocks are not part of the legacy shape
150
- out.push({
151
- id: m.id,
152
- category,
153
- name: m.name,
154
- kind: m.kind === 'transition' ? 'transition' : 'component',
155
- description: m.description,
156
- textParam: m.textParam,
157
- subtextParam: m.subtextParam,
158
- format: sceneFormat(m),
159
- durationInFrames: m.durationInFrames,
160
- sampleProps: m.propDefaults ?? {},
161
- });
162
- }
163
- return out;
164
- }
@@ -1,14 +0,0 @@
1
- // @cueframe/primitive-registry — the React-free catalog-metadata contract.
2
- //
3
- // This is the AUTHORING-facing view of "what primitives exist and their param
4
- // contract" — distinct from:
5
- // - @cueframe/primitives PrimitiveMeta (the RUNTIME catalog entry: React
6
- // component + zod paramsSchema + createPresentation), which is execution-side.
7
- // - @cueframe/composition PrimitiveRegistryEntry (the MARKETPLACE/distribution
8
- // registry: origin class, modes, OTIO mapping), which is a different layer.
9
- //
10
- // The metadata here is generated from each primitive's config.ts (see
11
- // scripts/build-primitive-meta.mjs) so authoring can read the catalog without
12
- // importing the renderer (which would be an authoring -> execution boundary
13
- // violation). Mirror of the JSON-serializable subset of PrimitiveMeta.
14
- export {};
@@ -1,62 +0,0 @@
1
- /**
2
- * Launch-grade behind-text placement (spec §6). Derives a SCENE-space anchor from
3
- * the matte geometry sidecar: lateral center of the clip-union silhouette; vertical
4
- * in the shoulder band (head-top + a fraction) so the bite is rounded and partial,
5
- * never the flat torso wall; minTextWidth guarantees the line reads past the
6
- * silhouette on both sides. Pure; all values source-normalized [0,1].
7
- *
8
- * The sidecar is the person-matte bake's `.geometry.json` artifact (one record
9
- * per frame: subject bbox + 16-bucket column/row coverage marginals, computed
10
- * from the smoothed alpha — see person_matting.py `_frame_geometry`). The
11
- * orchestration activity downloads + camelCases it into `MatteGeometryLike`;
12
- * this module never does I/O.
13
- */
14
- /** Minimum fraction of bake-window frames with a detected subject before the
15
- * behind treatment is even considered (relocated `captionsBehindEligible`
16
- * principle — composition-floor's MIN_ACTIVE_SPEAKER_PRESENCE sibling). Below
17
- * this the clip reads as b-roll / no-speaker → no anchor, degrade to front. */
18
- export const MIN_PRESENCE_FOR_BEHIND = 0.6;
19
- /** Shoulder-band shape. `headLambda` drops the anchor a frame-height fraction
20
- * below the union head-top so the silhouette bites the line from below-the-chin
21
- * (rounded head + shoulders), not the flat torso wall. `widthPad` widens the
22
- * minimum text width past the union silhouette so the line reads on BOTH sides
23
- * of the body. Calibration constants — Phase-7 fixtures tune them. */
24
- export const BEHIND_BAND = { headLambda: 0.18, widthPad: 1.25 };
25
- /** Anchors never sink below this — past mid-frame the "behind" read collapses
26
- * into a lower-third (the silhouette no longer frames the line from above). */
27
- const MAX_ANCHOR_Y = 0.55;
28
- /** Hard ceiling on any text width estimate (frame fraction). */
29
- const MAX_TEXT_WIDTH = 0.95;
30
- /**
31
- * Derive the behind-text anchor from a clip's matte geometry. Returns null when
32
- * the clip has no stable subject to be behind (presence below the floor, or no
33
- * frame ever produced a bbox) — the caller degrades the overlay to front.
34
- *
35
- * Placement: lateral center of the UNION bbox across all present frames (stable
36
- * against per-frame jitter); vertical at union head-top + the shoulder-band
37
- * lambda, capped at MAX_ANCHOR_Y; minTextWidth = union silhouette width padded
38
- * by `widthPad` so the line extends past the body on both sides.
39
- */
40
- export function deriveBehindAnchor(g) {
41
- if (g.presenceFraction < MIN_PRESENCE_FOR_BEHIND)
42
- return null;
43
- let x0 = Infinity;
44
- let y0 = Infinity;
45
- let x1 = -Infinity;
46
- let hasBbox = false;
47
- for (const frame of g.frames) {
48
- if (!frame.bbox)
49
- continue;
50
- hasBbox = true;
51
- x0 = Math.min(x0, frame.bbox[0]);
52
- y0 = Math.min(y0, frame.bbox[1]);
53
- x1 = Math.max(x1, frame.bbox[2]);
54
- }
55
- if (!hasBbox)
56
- return null;
57
- return {
58
- x: (x0 + x1) / 2,
59
- y: Math.min(MAX_ANCHOR_Y, y0 + BEHIND_BAND.headLambda),
60
- minTextWidth: Math.min(MAX_TEXT_WIDTH, (x1 - x0) * BEHIND_BAND.widthPad),
61
- };
62
- }