@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,244 +0,0 @@
1
- /**
2
- * select/select.ts — THE durable Selector core (~40 lines of selection logic).
3
- *
4
- * `select(candidates, policy, opts) → Advisory`: a candidate-agnostic
5
- * `score → stabilize-selection → advise` contract (selector-abstraction spec
6
- * §1.4). It is the generalization of vcam's `dominance()` ranking (§2): a
7
- * weighted-sum combinator + an eligibility-gate predicate + topK membership + a
8
- * first-class `__hold__`/abstain + the override ladder + reasons surfacing.
9
- *
10
- * THE ROT-GUARD (spec §8, the most important invariant): this module reads ONLY
11
- * `CoreCandidate.id`, `CandidateSignals[*].value/confidence`, and `policy` — it
12
- * NEVER references `Candidate.kind`, `Candidate.timebase`, or any geometry. It is
13
- * typed against `CoreCandidate` (id + signals), NOT the full `Candidate`, so the
14
- * adapter MUST do the projection and the core STRUCTURALLY cannot branch on kind.
15
- * A structural test (`__tests__/rotGuard.test.ts`) asserts this module imports no
16
- * geometry/kind types and references none of those fields.
17
- *
18
- * The selection STABILIZER (continuity over time) is NOT here — it is a per-kind
19
- * seam (`stabilize.ts`): `select()` produces the per-moment scored advisory; the
20
- * stabilizer (selection-hysteresis | geometric-deadzone | …) is dispatched per
21
- * kind by the adapter. This split is L1 of the spec, stated honestly.
22
- *
23
- * Pure, deterministic. No I/O, no Date.now, no Map-order reads in the math.
24
- */
25
- import { CueframeError, encodeError } from '@cueframe/errors';
26
- import { HOLD } from './model';
27
- /** Throw a registered fail-loud error (no silent fallback —
28
- * `feedback_never_add_fallbacks`). */
29
- function fail(code, message, fix) {
30
- throw new Error(encodeError(new CueframeError(code, message, fix)));
31
- }
32
- /** Does a candidate's signal envelope satisfy a single clause at this moment?
33
- * Geometry-free: reads `signal value ≥ gte` and (adapter-projected) role match.
34
- * `role`/`topicMatches` are matched against a projected `roleTag` the adapter
35
- * folds into a synthetic signal — the core itself never reads `Candidate.role`. */
36
- function clauseHolds(sig, clause) {
37
- if (clause.signal !== undefined) {
38
- const s = sig[clause.signal];
39
- if (s === undefined)
40
- return false;
41
- if (clause.gte !== undefined && s.value < clause.gte)
42
- return false;
43
- }
44
- return true;
45
- }
46
- /** AND-of-clauses (eligibility) / a rule's `when` (all = AND, any = OR). */
47
- function whenHolds(sig, when) {
48
- const all = when.all ?? [];
49
- const any = when.any ?? [];
50
- if (all.length > 0 && !all.every((c) => clauseHolds(sig, c)))
51
- return false;
52
- if (any.length > 0 && !any.some((c) => clauseHolds(sig, c)))
53
- return false;
54
- return true;
55
- }
56
- /** The per-moment weighted score `Σ_k weights[k]·signal[k].value·confidence`,
57
- * with each weighted term recorded for legibility. The weight-key iteration
58
- * order is the CALLER'S (adapter-supplied) order — for the reframe instance the
59
- * subjects adapter supplies `{size,centrality,persistence,speaking}` in exactly
60
- * vcam's `dominance()` order, so the float sum is byte-identical (the byte-
61
- * equivalence acceptance bar). */
62
- function scoreCandidate(id, sig, weightKeys, weights, ruleBoost) {
63
- const contributions = {};
64
- let score = 0;
65
- for (const k of weightKeys) {
66
- const w = weights[k];
67
- const s = sig[k];
68
- // A weight over an ALL-ABSENT signal is fail-loud upstream (preflight); here
69
- // an absent signal at a single moment contributes 0 (the candidate simply
70
- // isn't measured on that axis this tick), NOT a silent default for the whole
71
- // run.
72
- const v = s ? s.value * (s.confidence ?? 1) : 0;
73
- const term = w * v;
74
- contributions[k] = term;
75
- score += term;
76
- }
77
- score += ruleBoost;
78
- return { candidateId: id, score, contributions };
79
- }
80
- /**
81
- * The core selection over an already-aligned grid. Produces a per-TICK scored
82
- * advisory (one `SelectorSegment` per tick, tiling the timeline). The per-kind
83
- * stabilizer (`stabilize.ts`) then coalesces ticks under hysteresis/deadzone and
84
- * surfaces holds — this function is the SCORE half only.
85
- *
86
- * Override ladder (spec §1.4 step 1, ONE ordered evaluation):
87
- * tier 0 overrides[] (hard span pin) > tier 1 lock* > tier 2 force rule >
88
- * tier 3 weighted score + eligibility + floor/__hold__.
89
- * A SAME-TIER conflict (two overlapping overrides, or two firing force rules at
90
- * one tick) FAILS LOUD (`selector_override_conflict` — the Gap.strict() lesson).
91
- */
92
- export function select(candidates, policy, opts) {
93
- const { dtSec, ticks } = opts;
94
- const ids = candidates.map((c) => c.id);
95
- const idSet = new Set(ids);
96
- // Preflight: a weighted signal that is ABSENT for EVERY candidate at EVERY tick
97
- // is fail-loud (a weight that can never contribute — the agent mis-wired the
98
- // policy). This is the spec's `selector_signal_absent` (§1.2/§8).
99
- const weightKeys = Object.keys(policy.weights).filter((k) => (policy.weights[k] ?? 0) > 0);
100
- for (const k of weightKeys) {
101
- let measured = false;
102
- for (const c of candidates) {
103
- for (const env of c.signals)
104
- if (env[k] !== undefined) {
105
- measured = true;
106
- break;
107
- }
108
- if (measured)
109
- break;
110
- }
111
- if (!measured) {
112
- fail('selector_signal_absent', `weight on signal '${k}' but no candidate measures it at any moment`, { signal: k });
113
- }
114
- }
115
- // Validate override/lock ids exist (unknown id REJECTED, never remapped).
116
- for (const o of policy.overrides ?? []) {
117
- if (!idSet.has(o.candidateId))
118
- fail('selector_override_conflict', `override candidateId '${o.candidateId}' not in roster`, { candidateId: o.candidateId });
119
- }
120
- const rules = policy.rules ?? [];
121
- const eligibility = policy.eligibility ?? [];
122
- const floor = policy.floor ?? {};
123
- const segments = new Array(ticks);
124
- for (let t = 0; t < ticks; t++) {
125
- const startSec = t * dtSec;
126
- const endSec = (t + 1) * dtSec;
127
- const tSec = startSec; // a span is "covered" by an override iff its start is inside
128
- // ── Tier 0: hard span overrides (fail loud on same-tier overlap). ──────────
129
- const hits = (policy.overrides ?? []).filter((o) => tSec >= o.startSec && tSec < o.endSec);
130
- if (hits.length > 1) {
131
- fail('selector_override_conflict', `two overlapping overrides at ${tSec}s: ${hits.map((h) => h.candidateId).join(', ')}`, { atSec: tSec });
132
- }
133
- if (hits.length === 1) {
134
- segments[t] = pinned(startSec, endSec, hits[0].candidateId, 'override', 'override span');
135
- continue;
136
- }
137
- // ── Tier 1: lock (camera/candidate pin). ───────────────────────────────────
138
- if (policy.lockSourceId && idSet.has(policy.lockSourceId)) {
139
- segments[t] = pinned(startSec, endSec, policy.lockSourceId, 'lock', `locked to '${policy.lockSourceId}'`);
140
- continue;
141
- }
142
- // ── Tier 3 prep: eligibility filter + rule boosts (geometry-free). ─────────
143
- const sigAt = (c) => c.signals[t] ?? {};
144
- const eligible = candidates.filter((c) => eligibility.length === 0 || eligibility.every((cl) => clauseHolds(sigAt(c), cl)));
145
- const ruleBoostFor = (c) => {
146
- let boost = 0;
147
- const forces = [];
148
- for (const r of rules) {
149
- const fires = whenHolds(sigAt(c), r.when) && rulePrefers(r, c.id);
150
- if (!fires)
151
- continue;
152
- if (r.then.force)
153
- forces.push(r);
154
- boost += r.then.boost ?? 0.3;
155
- }
156
- return { boost, forces };
157
- };
158
- // ── Tier 2: force rules (fail loud on two distinct forced candidates). ─────
159
- const forcedIds = new Set();
160
- for (const c of eligible) {
161
- const { forces } = ruleBoostFor(c);
162
- if (forces.length > 0)
163
- forcedIds.add(c.id);
164
- }
165
- if (forcedIds.size > 1) {
166
- fail('selector_override_conflict', `two force rules elect different candidates at ${tSec}s: ${[...forcedIds].join(', ')}`, { atSec: tSec });
167
- }
168
- if (forcedIds.size === 1) {
169
- const fid = [...forcedIds][0];
170
- const scored = scoreAll(eligible, sigAt, weightKeys, policy.weights, ruleBoostFor);
171
- segments[t] = { startSec, endSec, chosen: fid, alsoChosen: [], perCandidateScores: scored, reasons: [`force rule → '${fid}'`], pacingNote: 'rule' };
172
- continue;
173
- }
174
- // ── Tier 3: weighted score + floor/__hold__ + topK membership. ─────────────
175
- const scored = scoreAll(eligible, sigAt, weightKeys, policy.weights, ruleBoostFor);
176
- // Floor: if no eligible candidate has ANY contributing signal at/above its
177
- // floor, elect __hold__ (abstain — forcing a pick on nothing is autopilot
178
- // bias, G8). A candidate clears the floor iff every floored signal it has is
179
- // ≥ its floor AND at least one floored signal is present (an empty floor →
180
- // never holds, the reframe default).
181
- const floorKeys = Object.keys(floor);
182
- const anyAboveFloor = floorKeys.length === 0 ||
183
- eligible.some((c) => {
184
- const sig = sigAt(c);
185
- return floorKeys.some((k) => sig[k] !== undefined && sig[k].value >= (floor[k] ?? 0));
186
- });
187
- if (eligible.length === 0 || !anyAboveFloor) {
188
- segments[t] = { startSec, endSec, chosen: HOLD, alsoChosen: [], perCandidateScores: scored, reasons: floorKeys.length && eligible.length ? ['no candidate above floor'] : ['no eligible candidate'], pacingNote: 'hold' };
189
- continue;
190
- }
191
- // topK membership: the top-K by score (stable id tiebreak — deterministic).
192
- const k = Math.max(1, policy.topK);
193
- const top = scored.slice(0, k);
194
- segments[t] = {
195
- startSec,
196
- endSec,
197
- chosen: top[0].candidateId,
198
- alsoChosen: top.slice(1).map((s) => s.candidateId),
199
- perCandidateScores: scored,
200
- reasons: [`argmax score ${top[0].score.toFixed(4)}`],
201
- pacingNote: 'argmax',
202
- };
203
- }
204
- return segments;
205
- }
206
- function pinned(startSec, endSec, id, note, reason) {
207
- return { startSec, endSec, chosen: id, alsoChosen: [], perCandidateScores: [], reasons: [reason], pacingNote: note };
208
- }
209
- function rulePrefers(r, id) {
210
- // A rule with no preference target applies to all candidates; a targeted rule
211
- // applies only to its candidate (role-targeting is folded by the adapter).
212
- if (r.then.preferCandidateId !== undefined)
213
- return r.then.preferCandidateId === id;
214
- return true;
215
- }
216
- function scoreAll(cands, sigAt, weightKeys, weights, ruleBoostFor) {
217
- const scored = cands.map((c) => scoreCandidate(c.id, sigAt(c), weightKeys, weights, ruleBoostFor(c).boost));
218
- return sortScores(scored);
219
- }
220
- /** Sort desc by score, then stable id tiebreak — the EXACT vcam `dominance`
221
- * ranking tiebreak (byte-equivalence-preserving for the reframe pool ranking). */
222
- function sortScores(scored) {
223
- scored.sort((a, b) => {
224
- if (b.score !== a.score)
225
- return b.score - a.score;
226
- return a.candidateId < b.candidateId ? -1 : a.candidateId > b.candidateId ? 1 : 0;
227
- });
228
- return scored;
229
- }
230
- /**
231
- * The shared scoring COMBINATOR as a pure ONE-SHOT ranking primitive — the
232
- * durable `Σ weights·signal` win (spec §2). Both the per-tick `select()` (switch)
233
- * and the reframe's segment-wide pool ranking call this, so there is ONE scoring
234
- * implementation. `weightKeys` is the CALLER's iteration order: the reframe
235
- * subjects adapter passes `{size,centrality,persistence,speaking}` in vcam's
236
- * `DOMINANCE_WEIGHTS` order, so the float sum is byte-identical to `dominance()`.
237
- *
238
- * Reads ONLY `id` + `signals.value/confidence` + `weights` — the rot-guard holds.
239
- */
240
- export function scoreAndRank(candidates, weights) {
241
- const weightKeys = Object.keys(weights);
242
- const scored = candidates.map((c) => scoreCandidate(c.id, c.signals, weightKeys, weights, 0));
243
- return sortScores(scored);
244
- }
@@ -1,242 +0,0 @@
1
- /**
2
- * select/stabilize.ts — the continuity/selection STABILIZER seam (spec §1.4 step
3
- * 4 + L1). The scoring (`select.ts`) generalizes cleanly; the stabilizer does
4
- * NOT — it is THREE kinds behind ONE `stabilize(kind, …)` seam, dispatched per
5
- * kind by the adapter. This is the honest "build a small fixed set of per-kind
6
- * stabilizers," not "one function" (L1; the prior draft's "selection-hysteresis
7
- * generalizes verbatim" claim is retracted).
8
- *
9
- * Phase 1 implements the two kinds reframe needs:
10
- * - `selection-hysteresis` — the per-id set-MEMBERSHIP state machine (the
11
- * `topK>1` reframe stabilizer), lifted VERBATIM from `vcam/subjectSet.ts`
12
- * (`inset`/`presRun`/`absRun` + the short-clip `usedFallback` bypass). Pure;
13
- * byte-equivalence-preserving.
14
- * - `geometric-deadzone` — `vcam/cameraPath.ts`, lifted VERBATIM and SEALED
15
- * (deadzone inclusion invariant + Hamming + glide cap). Re-exported, NEVER
16
- * altered — perturbing its math risks the shipped `inclusionRate ≈ 1.0` (L1).
17
- *
18
- * Phase 2 (switch) adds `incumbent-challenger` (topK=1 + switchMargin — NEW code,
19
- * vcam has no incumbent concept) and `presence-gate` (overlay binary show/hide).
20
- * Their seams are declared here so the dispatch shape is fixed; they fail loud
21
- * until built (no silent stub — `feedback_never_add_fallbacks`).
22
- */
23
- /**
24
- * The per-id set-MEMBERSHIP hysteresis state machine — the `topK>1` selection
25
- * stabilizer (spec §1.4 step 4; §2 maps it as CORE for reframe's membership).
26
- * Lifted VERBATIM from `vcam/subjectSet.ts:306-343`: each member enters after
27
- * `enterFrames` consecutive present frames and leaves after `leaveFrames` absent
28
- * frames — independent per-id booleans. A member is FRAMED this frame iff it is
29
- * IN the set AND present this frame.
30
- *
31
- * `usedFallback` is the short-segment bypass: a segment that ends before any
32
- * member clears the ENTER debounce uses the static framed set (so a brief clip
33
- * with a clear dominant subject is still framed, never center-held — the spec's
34
- * `minSegmentForHysteresis` bypass).
35
- *
36
- * Pure. Byte-identical to the inline vcam logic — `framedIds` order drives the
37
- * per-frame `here` order, so the adapter must pass ids in dominance order.
38
- */
39
- export function stabilizeSelectionHysteresis(framedIds, presence, n, params) {
40
- const { enterFrames, leaveFrames } = params;
41
- const everIn = new Set();
42
- const inset = new Map(framedIds.map((id) => [id, false]));
43
- const presRun = new Map(framedIds.map((id) => [id, 0]));
44
- const absRun = new Map(framedIds.map((id) => [id, 0]));
45
- const inThisFrame = new Array(n);
46
- for (let i = 0; i < n; i++) {
47
- const here = [];
48
- for (const id of framedIds) {
49
- if (presence(id, i)) {
50
- presRun.set(id, presRun.get(id) + 1);
51
- absRun.set(id, 0);
52
- }
53
- else {
54
- absRun.set(id, absRun.get(id) + 1);
55
- presRun.set(id, 0);
56
- }
57
- if (!inset.get(id) && presRun.get(id) >= enterFrames)
58
- inset.set(id, true);
59
- if (inset.get(id) && absRun.get(id) >= leaveFrames)
60
- inset.set(id, false);
61
- if (inset.get(id) && presence(id, i)) {
62
- here.push(id);
63
- everIn.add(id);
64
- }
65
- }
66
- inThisFrame[i] = here;
67
- }
68
- return { everIn, inThisFrame, usedFallback: everIn.size === 0 };
69
- }
70
- // ── geometric-deadzone (Phase 1) ─────────────────────────────────────────────
71
- // `cameraPath` is the geometric-deadzone continuity stabilizer, lifted VERBATIM
72
- // and SEALED. It is NOT re-implemented here — it is re-exported from its sealed
73
- // home so the dispatch surface names it without touching its math.
74
- export { cameraPath } from '../render/vcam/cameraPath';
75
- /**
76
- * The incumbent/challenger selection stabilizer — the `topK=1` (switch cut)
77
- * anti-ping-pong machine (spec §1.4 step 4, NEW code; L1). Inputs are the per-tick
78
- * RAW winner id (the score argmax for that tick) and the per-tick scores by id, so
79
- * the stabilizer is candidate-AGNOSTIC (it reads ids + scalars + policy knobs).
80
- *
81
- * Rule (spec §3.2 + §1.3 knobs):
82
- * - A challenger replaces the incumbent ONLY IF it leads the incumbent by
83
- * `switchMargin` for `enterFrames` CONTINUOUS ticks AND the incumbent has held
84
- * ≥ `minHoldFrames`.
85
- * - `cooldownFrames` forbids re-entering the just-left incumbent for that long.
86
- * - `maxHoldFrames` (optional) forces the incumbent to yield to the best
87
- * challenger after that many held ticks even without a margin lead.
88
- * - A `__hold__` raw winner (no candidate above floor) holds the incumbent (the
89
- * source lowering: "stay on the incumbent, emit no cut").
90
- *
91
- * `scoreById(id, t)` returns the candidate's score at tick t (0 if not scored).
92
- * Pure. Deterministic — no Date, no Map-order math.
93
- */
94
- export function stabilizeIncumbentChallenger(rawWinnerPerTick, scoreById, n, params) {
95
- const { minHoldFrames, enterFrames, switchMargin, cooldownFrames, maxHoldFrames } = params;
96
- const chosenPerTick = new Array(n);
97
- const suppressed = [];
98
- if (n === 0)
99
- return { chosenPerTick, suppressed };
100
- // Seed the incumbent with the first tick's raw winner (a __hold__ first tick
101
- // means there is no incumbent yet — the first concrete winner seeds it).
102
- let incumbent = null;
103
- let heldFrames = 0;
104
- // Per-challenger continuous-lead run length (reset when the lead breaks).
105
- const leadRun = new Map();
106
- // Cooldown: the id just dethroned → ticks remaining before it may re-enter.
107
- let cooldownId = null;
108
- let cooldownLeft = 0;
109
- for (let t = 0; t < n; t++) {
110
- const raw = rawWinnerPerTick[t];
111
- if (incumbent === null) {
112
- // No incumbent yet: adopt the first concrete (non-hold) raw winner.
113
- if (raw !== HOLD_ID) {
114
- incumbent = raw;
115
- heldFrames = 1;
116
- }
117
- chosenPerTick[t] = incumbent ?? raw; // raw is HOLD here if still unseeded
118
- if (cooldownLeft > 0)
119
- cooldownLeft--;
120
- continue;
121
- }
122
- const incScore = scoreById(incumbent, t);
123
- // Find the best challenger (the highest-scoring id that is NOT the incumbent
124
- // and is not in cooldown). The raw winner is the global argmax; if it equals
125
- // the incumbent there is no challenger this tick.
126
- let challenger = null;
127
- let challengerScore = -Infinity;
128
- if (raw !== HOLD_ID && raw !== incumbent) {
129
- challenger = raw;
130
- challengerScore = scoreById(raw, t);
131
- }
132
- // Update each challenger's continuous-lead run.
133
- if (challenger !== null && challengerScore >= incScore + switchMargin) {
134
- leadRun.set(challenger, (leadRun.get(challenger) ?? 0) + 1);
135
- }
136
- // Any id that is NOT a margin-leading challenger this tick loses its run.
137
- for (const id of [...leadRun.keys()]) {
138
- if (id !== challenger || challengerScore < incScore + switchMargin)
139
- leadRun.set(id, 0);
140
- }
141
- const leadFrames = challenger !== null ? (leadRun.get(challenger) ?? 0) : 0;
142
- const inCooldown = challenger !== null && challenger === cooldownId && cooldownLeft > 0;
143
- // Forced variety: maxHold reached → yield to the best challenger (margin
144
- // waived). Without a challenger this tick, keep holding (nothing to yield to).
145
- const maxHoldHit = maxHoldFrames !== undefined && heldFrames >= maxHoldFrames && challenger !== null && !inCooldown;
146
- const eligibleToSwitch = challenger !== null &&
147
- !inCooldown &&
148
- (maxHoldHit || (heldFrames >= minHoldFrames && leadFrames >= enterFrames));
149
- if (eligibleToSwitch) {
150
- // Dethrone: the old incumbent enters cooldown.
151
- cooldownId = incumbent;
152
- cooldownLeft = cooldownFrames;
153
- incumbent = challenger;
154
- heldFrames = 1;
155
- leadRun.clear();
156
- }
157
- else {
158
- // Hold. If there WAS a margin-leading challenger we blocked, surface it.
159
- if (challenger !== null && challengerScore > incScore) {
160
- const blockedBy = inCooldown
161
- ? 'cooldown'
162
- : challengerScore < incScore + switchMargin
163
- ? 'switch-margin'
164
- : heldFrames < minHoldFrames
165
- ? 'min-hold'
166
- : 'enter-debounce';
167
- const releaseAtTick = blockedBy === 'min-hold'
168
- ? t + (minHoldFrames - heldFrames)
169
- : blockedBy === 'cooldown'
170
- ? t + cooldownLeft
171
- : null;
172
- suppressed.push({ atTick: t, wouldHaveBeenId: challenger, byScore: challengerScore - incScore, blockedBy, releaseAtTick });
173
- }
174
- heldFrames++;
175
- }
176
- chosenPerTick[t] = incumbent;
177
- if (cooldownLeft > 0)
178
- cooldownLeft--;
179
- }
180
- return { chosenPerTick, suppressed };
181
- }
182
- /** The abstain sentinel, mirrored here so the stabilizer can recognize a held
183
- * tick without importing the model (keeps the stabilizer model-free at runtime;
184
- * the value is the same literal as `model.HOLD`). */
185
- const HOLD_ID = '__hold__';
186
- /**
187
- * The presence-gate stabilizer — overlay binary show/hide (spec §6.2 + L1, NEW
188
- * code). Overlay is ADDITIVE (the primary is always underneath; there is no
189
- * incumbent to dethrone), so this is NOT incumbent/challenger: it is a per-
190
- * candidate binary "is this overlay on?" with min-on (no blink-out) and min-gap
191
- * (no re-trigger flicker) hysteresis.
192
- *
193
- * `wantOnPerTick[t]` is the candidate id the adapter wants overlaid at tick t (the
194
- * floor-cleared winner), or `__hold__` for "no overlay this tick" (primary alone).
195
- * Output: coalesced ON windows per candidate, after the min-on / min-gap debounce.
196
- *
197
- * Reads ONLY ids + policy knobs (the rot-guard holds). Pure + deterministic.
198
- */
199
- export function stabilizePresenceGate(wantOnPerTick, n, params) {
200
- const { minOnFrames, minGapFrames } = params;
201
- const windows = [];
202
- if (n === 0)
203
- return windows;
204
- let activeId = null;
205
- let activeStart = 0;
206
- // Last OFF tick per candidate (for the min-gap check) — the tick AFTER its last
207
- // ON window ended.
208
- const lastOffTick = new Map();
209
- const closeActive = (endTick) => {
210
- if (activeId !== null) {
211
- windows.push({ candidateId: activeId, startTick: activeStart, endTick });
212
- lastOffTick.set(activeId, endTick);
213
- activeId = null;
214
- }
215
- };
216
- for (let t = 0; t < n; t++) {
217
- const want = wantOnPerTick[t];
218
- if (activeId !== null) {
219
- const heldFrames = t - activeStart;
220
- if (want === activeId) {
221
- continue; // stay on
222
- }
223
- // Want to turn this one off (either a different candidate or __hold__). Honor
224
- // min-on: don't close before minOnFrames have elapsed.
225
- if (heldFrames < minOnFrames)
226
- continue; // extend the ON window through min-on
227
- closeActive(t);
228
- // fall through to (possibly) start a new candidate this same tick
229
- }
230
- if (want !== HOLD_ID) {
231
- // Want this candidate ON. Honor min-gap from its OWN previous OFF.
232
- const off = lastOffTick.get(want);
233
- if (off !== undefined && t - off < minGapFrames) {
234
- continue; // too soon to re-trigger this candidate; stay off
235
- }
236
- activeId = want;
237
- activeStart = t;
238
- }
239
- }
240
- closeActive(n);
241
- return windows;
242
- }
@@ -1,7 +0,0 @@
1
- // ============ Project Types ============
2
- export {};
3
- // ============ Brand Kit Types ============
4
- // Moved to @cueframe/composition/brand-kit (Phase-3 Slice 1 — decouple authoring
5
- // from the renderer; brand is a composition-level fact). Reconcile with the
6
- // render-side BrandKit (@cueframe/composition/validators) + ResolvedBrandKit
7
- // (@cueframe/composition/projection) in Phase 4.
@@ -1 +0,0 @@
1
- export * from "./registry";