@cueframe/kernel 0.0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/_members/account-model/testing/conversationStoreContract.d.ts +1 -1
- package/dist/_members/authoring/providers/resourceApi.d.ts +1 -1
- package/dist/_members/authoring/transpileComponent.d.ts +1 -1
- package/dist/_members/cloud-import/CloudImportService.d.ts +35 -0
- package/dist/_members/cloud-import/ImportProvider.d.ts +73 -0
- package/dist/_members/cloud-import/MediaItemPreprocessor.d.ts +27 -0
- package/dist/_members/cloud-import/cloudConfig.d.ts +23 -0
- package/dist/_members/cloud-import/index.d.ts +9 -0
- package/dist/_members/cloud-import/multipartUpload.d.ts +12 -0
- package/dist/_members/composition/ops/compositionOps.d.ts +2 -1
- package/dist/_members/composition/ops/types.d.ts +1 -1
- package/dist/_members/composition/projection/behind-readiness.d.ts +127 -0
- package/dist/_members/composition/projection/index.d.ts +2 -0
- package/dist/_members/composition/projection/reframe-readiness.d.ts +156 -0
- package/dist/_members/composition/timeline/placement.d.ts +1 -1
- package/dist/_members/composition/validators/composition.d.ts +43 -26
- package/dist/_members/composition/validators/render.d.ts +32 -0
- package/dist/_members/composition-ops/index.d.ts +1 -1
- package/dist/_members/composition-ops/opRecorder.d.ts +1 -1
- package/dist/_members/convex-api/api.d.ts +5 -0
- package/dist/_members/convex-api/dataModel.d.ts +6 -0
- package/dist/_members/core/render/compositionRender.d.ts +17 -1
- package/dist/_members/core/render/exportSettings.d.ts +1 -1
- package/dist/_members/core/render/types.d.ts +31 -0
- package/dist/_members/mcp/curation.d.ts +1 -1
- package/dist/_members/plane/conformance.d.ts +1 -1
- package/dist/_members/render-harness/localRender.d.ts +1 -1
- package/dist/animate.js +828 -79187
- package/dist/authoring/build-tools.js +8 -11
- package/dist/authoring/context.js +5 -5
- package/dist/authoring/models.js +1 -2
- package/dist/authoring/prompts.js +1 -1
- package/dist/authoring/tools.js +7 -7
- package/dist/authoring/transpileComponent.js +3 -2220
- package/dist/authoring.js +30 -30
- package/dist/brand-derivation.js +1 -1
- package/dist/chunk-6IU2UQI5.js +107 -0
- package/dist/{chunk-5I7VDCAC.js → chunk-7FO3ZJ43.js} +4 -1
- package/dist/{chunk-N67PDTKQ.js → chunk-ABL557OT.js} +1 -1
- package/dist/{chunk-MC5DLSEV.js → chunk-AP6ZIVAV.js} +15 -15
- package/dist/{chunk-QLAQHR3L.js → chunk-AQBREB5O.js} +1 -1
- package/dist/{chunk-DSNG6WLU.js → chunk-AYVJXDLB.js} +1 -4
- package/dist/{chunk-6CMVBTTP.js → chunk-DK2ODBNT.js} +19 -9
- package/dist/chunk-DSMLHYJ4.js +82 -0
- package/dist/{chunk-BRKJKB33.js → chunk-FYZVH3MC.js} +1 -1
- package/dist/{chunk-MVEE6HEC.js → chunk-GA23TRNR.js} +5 -7
- package/dist/chunk-HCCBDJLW.js +68 -0
- package/dist/{chunk-JRQVPFLF.js → chunk-HY3RIEZW.js} +1 -1
- package/dist/{chunk-OIRUO5P7.js → chunk-JJ6XD7NG.js} +152 -2
- package/dist/{_members/primitives/chunk-IDAL6G3Y.js → chunk-JQMPHKLU.js} +19 -27
- package/dist/{chunk-G3PBH53P.js → chunk-MBCXCJOE.js} +1 -1
- package/dist/{chunk-UEI3NLNK.js → chunk-MHOQTPOB.js} +1 -4
- package/dist/{chunk-37NJ27UU.js → chunk-OCFDUCF4.js} +3 -0
- package/dist/{chunk-WZTTZHNR.js → chunk-OLFOPQCA.js} +12 -9
- package/dist/{chunk-P43IE4WB.js → chunk-P727GZVO.js} +2 -4
- package/dist/{chunk-52AHXNKM.js → chunk-PDYO3DOJ.js} +5 -5
- package/dist/{chunk-S3P5BFFL.js → chunk-PMY24FUD.js} +2 -4
- package/dist/{chunk-ATAF24QG.js → chunk-PODIYN2K.js} +10 -3
- package/dist/chunk-RF7U3SCL.js +606 -0
- package/dist/{chunk-JD77Y2WM.js → chunk-SW336CJP.js} +1 -4
- package/dist/{chunk-TULRCY6U.js → chunk-TOJEXFXL.js} +1 -1
- package/dist/{chunk-ELLSET2N.js → chunk-UHGSZZDI.js} +3 -6
- package/dist/{chunk-M3I5LMAB.js → chunk-UY4SWJVE.js} +1 -1
- package/dist/{chunk-6QJ3V3VS.js → chunk-YX2GSJK7.js} +1 -1
- package/dist/chunk-ZT7MHRQU.js +104 -0
- package/dist/{chunk-NV4I6GJV.js → chunk-ZWMV6DD2.js} +27 -4
- package/dist/cloud-import/multipart.d.ts +1 -0
- package/dist/cloud-import/multipart.js +8 -0
- package/dist/cloud-import.d.ts +1 -0
- package/dist/cloud-import.js +234 -0
- package/dist/compose/renderer.js +19 -22
- package/dist/compose.js +19 -22
- package/dist/composition/graphics-plan.js +3 -3
- package/dist/composition/ops.js +4 -4
- package/dist/composition/primitive-catalog.js +1 -1
- package/dist/composition/projection.js +21 -5
- package/dist/composition/validators.js +6 -4
- package/dist/composition-ops.js +15 -13
- package/dist/composition.js +26 -8
- package/dist/{context-CEAKQ5T7.js → context-YWUZDG5X.js} +5 -5
- package/dist/convex-api/dataModel.d.ts +1 -0
- package/dist/convex-api/dataModel.js +0 -0
- package/dist/convex-api.d.ts +1 -0
- package/dist/convex-api.js +8 -0
- package/dist/core/render.js +3 -3
- package/dist/core/select.js +2 -2
- package/dist/core.js +3 -3
- package/dist/errors.js +1 -1
- package/dist/mcp/adapter.js +2 -5
- package/dist/mcp/server.js +1 -2
- package/dist/mcp.js +2 -95
- package/dist/media-model/media-kind.js +9 -98
- package/dist/media-model/testing.js +1071 -718
- package/dist/nle-export/server.js +328 -130
- package/dist/nle-export/xml.js +5 -22799
- package/dist/nle-export.js +20 -22
- package/dist/primitives/backgrounds.js +2 -3
- package/dist/primitives/captions.js +4 -243
- package/dist/primitives/effects.js +2 -3
- package/dist/primitives/hero-text.js +2 -3
- package/dist/primitives/layouts.js +2 -3
- package/dist/primitives/lib/index.js +8 -10
- package/dist/primitives/lib/preview.js +1 -2
- package/dist/primitives/lib/schema.js +1 -2
- package/dist/primitives/lib/text/fitText.js +1 -2
- package/dist/primitives/lib.js +8 -10
- package/dist/primitives/scenes.js +1 -2
- package/dist/primitives/text.js +2 -3
- package/dist/primitives/ui-blocks.js +4 -5
- package/dist/primitives.js +19 -21
- package/package.json +125 -16
- package/dist/TextureLoader-UQOFUSAP.js +0 -422
- package/dist/VideoTexture-AQWSPIJG.js +0 -62
- package/dist/_members/account-model/index.js +0 -4
- package/dist/_members/account-model/testing/conversationStoreContract.js +0 -168
- package/dist/_members/account-model/testing/index.js +0 -7
- package/dist/_members/account-model/testing/restorePointStoreContract.js +0 -69
- package/dist/_members/account-model/types/index.js +0 -1
- package/dist/_members/account-model/validators/contextFile.js +0 -18
- package/dist/_members/account-model/validators/conversation.js +0 -95
- package/dist/_members/account-model/validators/dashboardInsight.js +0 -16
- package/dist/_members/account-model/validators/index.js +0 -7
- package/dist/_members/account-model/validators/sessionToken.js +0 -49
- package/dist/_members/account-model/validators/uploadToken.js +0 -16
- package/dist/_members/account-model/validators/userSettings.js +0 -12
- package/dist/_members/account-model/validators/workingComposition.js +0 -20
- package/dist/_members/brand-derivation/constants.js +0 -20
- package/dist/_members/brand-derivation/contrastSafe.js +0 -114
- package/dist/_members/brand-derivation/index.js +0 -1
- package/dist/_members/composition/audio/audioMix.js +0 -61
- package/dist/_members/composition/audio/index.js +0 -5
- package/dist/_members/composition/audio/mixStaging.js +0 -195
- package/dist/_members/composition/audio/musicPack.generated.js +0 -136
- package/dist/_members/composition/audio/musicPack.js +0 -36
- package/dist/_members/composition/audio/pack.generated.js +0 -603
- package/dist/_members/composition/audio/pack.js +0 -48
- package/dist/_members/composition/audio/palette.js +0 -134
- package/dist/_members/composition/autozoom/index.js +0 -83
- package/dist/_members/composition/brand-kit.js +0 -45
- package/dist/_members/composition/brief/contract.js +0 -209
- package/dist/_members/composition/color-grade.js +0 -80
- package/dist/_members/composition/depth.js +0 -8
- package/dist/_members/composition/fixtures/index.js +0 -143
- package/dist/_members/composition/fixtures/vaayaErrored.d.ts +0 -25
- package/dist/_members/composition/fixtures/vaayaErrored.js +0 -203
- package/dist/_members/composition/fonts.js +0 -162
- package/dist/_members/composition/graphics-plan/compile.js +0 -221
- package/dist/_members/composition/graphics-plan/index.js +0 -10
- package/dist/_members/composition/graphics-plan/instantiateMotif.js +0 -44
- package/dist/_members/composition/graphics-plan/motion.js +0 -66
- package/dist/_members/composition/graphics-plan/schemas.js +0 -261
- package/dist/_members/composition/graphics-plan/solve.js +0 -145
- package/dist/_members/composition/index.js +0 -5
- package/dist/_members/composition/invariants/clipPlacement.js +0 -69
- package/dist/_members/composition/invariants/composition.js +0 -28
- package/dist/_members/composition/invariants/errors.js +0 -10
- package/dist/_members/composition/invariants/etag.js +0 -38
- package/dist/_members/composition/invariants/ids.js +0 -33
- package/dist/_members/composition/invariants/index.js +0 -9
- package/dist/_members/composition/invariants/keyframes.js +0 -45
- package/dist/_members/composition/invariants/markers.js +0 -29
- package/dist/_members/composition/invariants/time.js +0 -20
- package/dist/_members/composition/invariants/tracks.js +0 -304
- package/dist/_members/composition/ops/compositionOps.js +0 -1056
- package/dist/_members/composition/ops/headlessStore.js +0 -94
- package/dist/_members/composition/ops/index.js +0 -4
- package/dist/_members/composition/ops/selectors.js +0 -118
- package/dist/_members/composition/ops/timeline-word.js +0 -1
- package/dist/_members/composition/ops/transcript.js +0 -77
- package/dist/_members/composition/ops/types.js +0 -16
- package/dist/_members/composition/primitive-catalog/catalogQuery.js +0 -150
- package/dist/_members/composition/primitive-catalog/disabled.js +0 -32
- package/dist/_members/composition/primitive-catalog/generated/meta.js +0 -15161
- package/dist/_members/composition/primitive-catalog/index.js +0 -46
- package/dist/_members/composition/primitive-catalog/paramValidation.js +0 -231
- package/dist/_members/composition/primitive-catalog/projection.js +0 -164
- package/dist/_members/composition/primitive-catalog/types.js +0 -14
- package/dist/_members/composition/projection/behind-placement.js +0 -62
- package/dist/_members/composition/projection/brandKit.js +0 -482
- package/dist/_members/composition/projection/cardTokens.js +0 -209
- package/dist/_members/composition/projection/composition-floor.js +0 -582
- package/dist/_members/composition/projection/cropProjection.js +0 -257
- package/dist/_members/composition/projection/index.js +0 -7
- package/dist/_members/composition/projection/occlusion-budget.js +0 -104
- package/dist/_members/composition/projection/safe-zones.js +0 -99
- package/dist/_members/composition/reframe/aspectLoss.js +0 -115
- package/dist/_members/composition/reframe/coverage.js +0 -62
- package/dist/_members/composition/reframe/derive.js +0 -73
- package/dist/_members/composition/reframe/index.js +0 -109
- package/dist/_members/composition/reframe/kenBurns.js +0 -64
- package/dist/_members/composition/reframe/shotScale.js +0 -176
- package/dist/_members/composition/reframe/trajectory.js +0 -124
- package/dist/_members/composition/timeline/compound.js +0 -134
- package/dist/_members/composition/timeline/index.js +0 -9
- package/dist/_members/composition/timeline/intent.js +0 -228
- package/dist/_members/composition/timeline/keyframes.js +0 -121
- package/dist/_members/composition/timeline/link.js +0 -59
- package/dist/_members/composition/timeline/occupancy.js +0 -36
- package/dist/_members/composition/timeline/placement.js +0 -74
- package/dist/_members/composition/timeline/plan.js +0 -31
- package/dist/_members/composition/timeline/resolve.js +0 -170
- package/dist/_members/composition/timeline/trims.js +0 -278
- package/dist/_members/composition/types/index.js +0 -1
- package/dist/_members/composition/validators/brandKit.js +0 -295
- package/dist/_members/composition/validators/composePlan.js +0 -113
- package/dist/_members/composition/validators/composition.js +0 -703
- package/dist/_members/composition/validators/font.js +0 -34
- package/dist/_members/composition/validators/graphicKinds.js +0 -30
- package/dist/_members/composition/validators/index.js +0 -9
- package/dist/_members/composition/validators/project.js +0 -29
- package/dist/_members/composition/validators/registry.js +0 -41
- package/dist/_members/composition/validators/render.js +0 -139
- package/dist/_members/composition/validators/session.js +0 -37
- package/dist/_members/composition/validators/webhook.js +0 -72
- package/dist/_members/composition-ops/alphaLayers.js +0 -141
- package/dist/_members/composition-ops/index.js +0 -637
- package/dist/_members/composition-ops/materializeGrid.js +0 -99
- package/dist/_members/composition-ops/opRecorder.js +0 -196
- package/dist/_members/composition-ops/recordingStore.js +0 -14
- package/dist/_members/composition-ops/replaceRegion.js +0 -102
- package/dist/_members/composition-ops/testFixtures.js +0 -19
- package/dist/_members/core/index.js +0 -5
- package/dist/_members/core/render/bookends.js +0 -53
- package/dist/_members/core/render/captions.js +0 -127
- package/dist/_members/core/render/compositionRender.js +0 -1249
- package/dist/_members/core/render/deriveTrajectory.js +0 -889
- package/dist/_members/core/render/emphasis.js +0 -16
- package/dist/_members/core/render/eval/cropBox.js +0 -139
- package/dist/_members/core/render/eval/inclusion.js +0 -96
- package/dist/_members/core/render/eval/index.js +0 -146
- package/dist/_members/core/render/eval/metrics.js +0 -94
- package/dist/_members/core/render/exportSettings.js +0 -65
- package/dist/_members/core/render/index.js +0 -20
- package/dist/_members/core/render/mapFaceToPerson.js +0 -73
- package/dist/_members/core/render/types.js +0 -8
- package/dist/_members/core/render/vcam/cameraPath.js +0 -248
- package/dist/_members/core/render/vcam/constants.js +0 -115
- package/dist/_members/core/render/vcam/errorCodes.js +0 -39
- package/dist/_members/core/render/vcam/framing.js +0 -136
- package/dist/_members/core/render/vcam/requiredRegion.js +0 -137
- package/dist/_members/core/render/vcam/shots.js +0 -53
- package/dist/_members/core/render/vcam/subjectSet.js +0 -388
- package/dist/_members/core/select/errorCodes.js +0 -38
- package/dist/_members/core/select/index.js +0 -26
- package/dist/_members/core/select/model.js +0 -18
- package/dist/_members/core/select/select.js +0 -244
- package/dist/_members/core/select/stabilize.js +0 -242
- package/dist/_members/core/types.js +0 -7
- package/dist/_members/errors/index.js +0 -1
- package/dist/_members/errors/registry.js +0 -560
- package/dist/_members/foundation/codes/index.js +0 -31
- package/dist/_members/foundation/index.js +0 -2
- package/dist/_members/foundation/primitives/index.js +0 -5
- package/dist/_members/mcp/adapter.js +0 -771
- package/dist/_members/mcp/burnedNames.js +0 -73
- package/dist/_members/mcp/core.js +0 -390
- package/dist/_members/mcp/curation.js +0 -792
- package/dist/_members/mcp/executor.js +0 -142
- package/dist/_members/mcp/format.js +0 -9
- package/dist/_members/mcp/generated/catalogPreviews.js +0 -95
- package/dist/_members/mcp/generated/harness.js +0 -81
- package/dist/_members/mcp/generated/operations.js +0 -131
- package/dist/_members/mcp/index.js +0 -50
- package/dist/_members/mcp/internalLoopTools.js +0 -109
- package/dist/_members/mcp/prompts.js +0 -45
- package/dist/_members/mcp/resources.js +0 -166
- package/dist/_members/mcp/server.js +0 -340
- package/dist/_members/mcp/wait.js +0 -378
- package/dist/_members/mcp/x402Meta.js +0 -66
- package/dist/_members/media-model/api.js +0 -175
- package/dist/_members/media-model/index.js +0 -1
- package/dist/_members/media-model/media-kind.js +0 -116
- package/dist/_members/media-model/testing/index.js +0 -1
- package/dist/_members/media-model/testing/mediaStoreContract.js +0 -82
- package/dist/_members/media-model/transcriptSearch.js +0 -70
- package/dist/_members/media-model/transcriptSearchCases.json +0 -79
- package/dist/_members/nle-export/compact-timeline.js +0 -73
- package/dist/_members/nle-export/compact-timeline.js.map +0 -1
- package/dist/_members/nle-export/composition-to-input.js +0 -147
- package/dist/_members/nle-export/composition-to-input.js.map +0 -1
- package/dist/_members/nle-export/fcpxml.js +0 -159
- package/dist/_members/nle-export/fcpxml.js.map +0 -1
- package/dist/_members/nle-export/index.js +0 -12
- package/dist/_members/nle-export/index.js.map +0 -1
- package/dist/_members/nle-export/premiere.js +0 -161
- package/dist/_members/nle-export/premiere.js.map +0 -1
- package/dist/_members/nle-export/server/index.js +0 -2
- package/dist/_members/nle-export/server/index.js.map +0 -1
- package/dist/_members/nle-export/server/pack-zip.js +0 -38
- package/dist/_members/nle-export/server/pack-zip.js.map +0 -1
- package/dist/_members/nle-export/srt.js +0 -50
- package/dist/_members/nle-export/srt.js.map +0 -1
- package/dist/_members/nle-export/types.js +0 -9
- package/dist/_members/nle-export/types.js.map +0 -1
- package/dist/_members/nle-export/xml/index.js +0 -11
- package/dist/_members/nle-export/xml/index.js.map +0 -1
- package/dist/_members/nle-export/xml-utils.js +0 -48
- package/dist/_members/nle-export/xml-utils.js.map +0 -1
- package/dist/_members/perception/activeSpeaker.js +0 -103
- package/dist/_members/perception/audioQuality.js +0 -76
- package/dist/_members/perception/energyBeat.js +0 -99
- package/dist/_members/perception/identityMatch.js +0 -91
- package/dist/_members/perception/index.js +0 -48
- package/dist/_members/perception/visualQuality.js +0 -95
- package/dist/_members/plane/conformance.js +0 -90
- package/dist/_members/plane/contract.js +0 -49
- package/dist/_members/plane/index.js +0 -16
- package/dist/_members/primitives/backgrounds/index.js +0 -32
- package/dist/_members/primitives/backgrounds/index.js.map +0 -1
- package/dist/_members/primitives/captions/index.js +0 -398
- package/dist/_members/primitives/captions/index.js.map +0 -1
- package/dist/_members/primitives/chunk-2LVE4UIT.js +0 -139
- package/dist/_members/primitives/chunk-2LVE4UIT.js.map +0 -1
- package/dist/_members/primitives/chunk-3IQUH6KK.js +0 -20
- package/dist/_members/primitives/chunk-3IQUH6KK.js.map +0 -1
- package/dist/_members/primitives/chunk-3OMURV6Q.js +0 -112
- package/dist/_members/primitives/chunk-3OMURV6Q.js.map +0 -1
- package/dist/_members/primitives/chunk-4IS6TMEG.js +0 -21
- package/dist/_members/primitives/chunk-4IS6TMEG.js.map +0 -1
- package/dist/_members/primitives/chunk-5MWGAEGQ.js +0 -1644
- package/dist/_members/primitives/chunk-5MWGAEGQ.js.map +0 -1
- package/dist/_members/primitives/chunk-7RRPFPQK.js +0 -15
- package/dist/_members/primitives/chunk-7RRPFPQK.js.map +0 -1
- package/dist/_members/primitives/chunk-DH5TRZK2.js +0 -125
- package/dist/_members/primitives/chunk-DH5TRZK2.js.map +0 -1
- package/dist/_members/primitives/chunk-E3KNUSFG.js +0 -2337
- package/dist/_members/primitives/chunk-E3KNUSFG.js.map +0 -1
- package/dist/_members/primitives/chunk-G2B3G4HK.js +0 -47
- package/dist/_members/primitives/chunk-G2B3G4HK.js.map +0 -1
- package/dist/_members/primitives/chunk-HFPFGZXT.js +0 -1494
- package/dist/_members/primitives/chunk-HFPFGZXT.js.map +0 -1
- package/dist/_members/primitives/chunk-HIWVFZVH.js +0 -19
- package/dist/_members/primitives/chunk-HIWVFZVH.js.map +0 -1
- package/dist/_members/primitives/chunk-IDAL6G3Y.js.map +0 -1
- package/dist/_members/primitives/chunk-KNC6JP5F.js +0 -34
- package/dist/_members/primitives/chunk-KNC6JP5F.js.map +0 -1
- package/dist/_members/primitives/chunk-KYRDVZST.js +0 -459
- package/dist/_members/primitives/chunk-KYRDVZST.js.map +0 -1
- package/dist/_members/primitives/chunk-LWLHS2NS.js +0 -3410
- package/dist/_members/primitives/chunk-LWLHS2NS.js.map +0 -1
- package/dist/_members/primitives/chunk-QAQ3P7DR.js +0 -8855
- package/dist/_members/primitives/chunk-QAQ3P7DR.js.map +0 -1
- package/dist/_members/primitives/chunk-ROV2ODWC.js +0 -81
- package/dist/_members/primitives/chunk-ROV2ODWC.js.map +0 -1
- package/dist/_members/primitives/chunk-TCRC2FH3.js +0 -183
- package/dist/_members/primitives/chunk-TCRC2FH3.js.map +0 -1
- package/dist/_members/primitives/chunk-US4YEDAA.js +0 -96
- package/dist/_members/primitives/chunk-US4YEDAA.js.map +0 -1
- package/dist/_members/primitives/chunk-UVKRO5ER.js +0 -13
- package/dist/_members/primitives/chunk-UVKRO5ER.js.map +0 -1
- package/dist/_members/primitives/chunk-W4EIIF2I.js +0 -10
- package/dist/_members/primitives/chunk-W4EIIF2I.js.map +0 -1
- package/dist/_members/primitives/chunk-WPGKIPCO.js +0 -3563
- package/dist/_members/primitives/chunk-WPGKIPCO.js.map +0 -1
- package/dist/_members/primitives/chunk-WZFLEGMD.js +0 -1435
- package/dist/_members/primitives/chunk-WZFLEGMD.js.map +0 -1
- package/dist/_members/primitives/chunk-XHU3WBEI.js +0 -33
- package/dist/_members/primitives/chunk-XHU3WBEI.js.map +0 -1
- package/dist/_members/primitives/chunk-YN7WTZZ7.js +0 -46
- package/dist/_members/primitives/chunk-YN7WTZZ7.js.map +0 -1
- package/dist/_members/primitives/effects/index.js +0 -30
- package/dist/_members/primitives/effects/index.js.map +0 -1
- package/dist/_members/primitives/hero-text/index.js +0 -14
- package/dist/_members/primitives/hero-text/index.js.map +0 -1
- package/dist/_members/primitives/index.js +0 -64
- package/dist/_members/primitives/index.js.map +0 -1
- package/dist/_members/primitives/layouts/index.js +0 -24
- package/dist/_members/primitives/layouts/index.js.map +0 -1
- package/dist/_members/primitives/lib/easings.js +0 -26
- package/dist/_members/primitives/lib/easings.js.map +0 -1
- package/dist/_members/primitives/lib/index.js +0 -74
- package/dist/_members/primitives/lib/index.js.map +0 -1
- package/dist/_members/primitives/lib/palette.js +0 -72
- package/dist/_members/primitives/lib/palette.js.map +0 -1
- package/dist/_members/primitives/lib/preview.js +0 -8
- package/dist/_members/primitives/lib/preview.js.map +0 -1
- package/dist/_members/primitives/lib/schema.js +0 -12
- package/dist/_members/primitives/lib/schema.js.map +0 -1
- package/dist/_members/primitives/lib/seeded-random.js +0 -14
- package/dist/_members/primitives/lib/seeded-random.js.map +0 -1
- package/dist/_members/primitives/lib/text/contrast.js +0 -12
- package/dist/_members/primitives/lib/text/contrast.js.map +0 -1
- package/dist/_members/primitives/lib/text/fill.js +0 -8
- package/dist/_members/primitives/lib/text/fill.js.map +0 -1
- package/dist/_members/primitives/lib/text/fitText.js +0 -10
- package/dist/_members/primitives/lib/text/fitText.js.map +0 -1
- package/dist/_members/primitives/lib/text/marker.js +0 -8
- package/dist/_members/primitives/lib/text/marker.js.map +0 -1
- package/dist/_members/primitives/lib/text/motion.js +0 -16
- package/dist/_members/primitives/lib/text/motion.js.map +0 -1
- package/dist/_members/primitives/lib/text/recolor.js +0 -8
- package/dist/_members/primitives/lib/text/recolor.js.map +0 -1
- package/dist/_members/primitives/lib/text/spec.js +0 -1
- package/dist/_members/primitives/lib/text/spec.js.map +0 -1
- package/dist/_members/primitives/lib/text/stage.js +0 -8
- package/dist/_members/primitives/lib/text/stage.js.map +0 -1
- package/dist/_members/primitives/lib/text/typeface.js +0 -8
- package/dist/_members/primitives/lib/text/typeface.js.map +0 -1
- package/dist/_members/primitives/lib/tokens.js +0 -24
- package/dist/_members/primitives/lib/tokens.js.map +0 -1
- package/dist/_members/primitives/lib/types.js +0 -1
- package/dist/_members/primitives/lib/types.js.map +0 -1
- package/dist/_members/primitives/params-required.json +0 -153
- package/dist/_members/primitives/scenes/index.js +0 -25
- package/dist/_members/primitives/scenes/index.js.map +0 -1
- package/dist/_members/primitives/subject-foreground/index.js +0 -30
- package/dist/_members/primitives/subject-foreground/index.js.map +0 -1
- package/dist/_members/primitives/text/index.js +0 -57
- package/dist/_members/primitives/text/index.js.map +0 -1
- package/dist/_members/primitives/transitions/index.js +0 -67
- package/dist/_members/primitives/transitions/index.js.map +0 -1
- package/dist/_members/primitives/ui-blocks/index.js +0 -76
- package/dist/_members/primitives/ui-blocks/index.js.map +0 -1
- package/dist/_members/primitives/version-map.json +0 -105
- package/dist/_members/primitives/workspace.js +0 -60
- package/dist/_members/primitives/workspace.js.map +0 -1
- package/dist/chunk-7GISRVON.js +0 -14176
- package/dist/chunk-DIBOJJMU.js +0 -16838
- package/dist/chunk-EAUSEGB7.js +0 -420
- package/dist/chunk-FUWJOVVK.js +0 -3633
- package/dist/chunk-G75E7YA4.js +0 -11883
- package/dist/chunk-JCZQT7K3.js +0 -3266
- package/dist/chunk-KF5ETMKB.js +0 -544
- package/dist/chunk-NDKERSXY.js +0 -1296
- package/dist/chunk-V43Y7IE4.js +0 -3621
- package/dist/chunk-VIVQHIGZ.js +0 -4319
- package/dist/chunk-YA3OR2KK.js +0 -249
- package/dist/hls-HD4C5G6W.js +0 -33000
- package/dist/token-RGFIT24D.js +0 -69
- package/dist/token-util-GPLSGYVO.js +0 -5
- package/dist/vision_bundle-5Y376MAR.js +0 -4084
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { produce } from 'immer';
|
|
2
|
-
import { Composition } from '../validators';
|
|
3
|
-
import { createCompositionOps } from './compositionOps';
|
|
4
|
-
export function emptyComposition() {
|
|
5
|
-
return { v: 1, format: { aspectRatio: '16:9' }, tracks: [] };
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Initial composition seeded with the source A-roll clip on a video track.
|
|
9
|
-
*
|
|
10
|
-
* Compose-from-suggestion hydrates a *fresh* project → an empty composition (no
|
|
11
|
-
* clips). But the agent's `set_crop_intents` / `enable_captions_behind_speaker`
|
|
12
|
-
* operate on the store's video clip — with no clip they're rejected ("No video
|
|
13
|
-
* track") and the crop/captions-behind silently never land. The source clip is
|
|
14
|
-
* a GIVEN (the suggestion window), so it belongs in the initial state, not as an
|
|
15
|
-
* agent edit. Seed it here (matches the canonical serializer's `clip-0`:
|
|
16
|
-
* id `clip-0`, startTime 0, duration = window length, `media` source + trim).
|
|
17
|
-
*
|
|
18
|
-
* Built loosely then `safeParse`d (the serializer's pattern) so the raw id
|
|
19
|
-
* string brands to the wire-shape Convex Id through the schema — no hand-written
|
|
20
|
-
* type cast — and the seed is runtime-validated as a bonus.
|
|
21
|
-
*/
|
|
22
|
-
export function compositionWithSourceClip(spec) {
|
|
23
|
-
const parsed = Composition.safeParse({
|
|
24
|
-
v: 1,
|
|
25
|
-
format: spec.format,
|
|
26
|
-
tracks: [
|
|
27
|
-
{
|
|
28
|
-
id: 'track-video',
|
|
29
|
-
kind: 'video',
|
|
30
|
-
name: 'Main video',
|
|
31
|
-
contents: [
|
|
32
|
-
{
|
|
33
|
-
id: 'clip-0',
|
|
34
|
-
startTime: 0,
|
|
35
|
-
duration: Math.max(0, spec.endTime - spec.startTime),
|
|
36
|
-
source: {
|
|
37
|
-
kind: 'media',
|
|
38
|
-
mediaId: spec.mediaId,
|
|
39
|
-
trim: { start: spec.startTime, end: spec.endTime },
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
});
|
|
46
|
-
if (!parsed.success) {
|
|
47
|
-
throw new Error(`compositionWithSourceClip: produced an invalid composition — ${parsed.error.message}`);
|
|
48
|
-
}
|
|
49
|
-
return parsed.data;
|
|
50
|
-
}
|
|
51
|
-
export function emptyCompositionState() {
|
|
52
|
-
return {
|
|
53
|
-
composition: emptyComposition(),
|
|
54
|
-
selection: [],
|
|
55
|
-
selectedClipId: null,
|
|
56
|
-
selectedOverlayId: null,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Headless wrapper used server-side (Director worker, tests). Accepts either
|
|
61
|
-
* a full `CompositionOpsState` or a bare `Composition` (which is then wrapped
|
|
62
|
-
* with default selection state).
|
|
63
|
-
*/
|
|
64
|
-
export function createHeadlessStore(initial) {
|
|
65
|
-
let state;
|
|
66
|
-
if (!initial) {
|
|
67
|
-
state = emptyCompositionState();
|
|
68
|
-
}
|
|
69
|
-
else if ('composition' in initial) {
|
|
70
|
-
state = initial;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
state = {
|
|
74
|
-
composition: initial,
|
|
75
|
-
selection: [],
|
|
76
|
-
selectedClipId: null,
|
|
77
|
-
selectedOverlayId: null,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
const get = () => state;
|
|
81
|
-
const set = (fnOrPartial) => {
|
|
82
|
-
if (typeof fnOrPartial === 'function') {
|
|
83
|
-
state = produce(state, fnOrPartial);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
state = { ...state, ...fnOrPartial };
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
return {
|
|
90
|
-
...createCompositionOps(get, set),
|
|
91
|
-
getState: get,
|
|
92
|
-
batch: (fn) => fn(),
|
|
93
|
-
};
|
|
94
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export { createCompositionOps, findOrCreateTrackByKind, findClipById, findTrackContainingClipId, findMarkerById, } from './compositionOps';
|
|
2
|
-
export { createHeadlessStore, emptyComposition, compositionWithSourceClip, emptyCompositionState, } from './headlessStore';
|
|
3
|
-
export { selectAllTracks, selectTracksByKind, selectAllClips, selectMediaClipAt, selectAllOverlays, selectAllAudioClips, selectClipById, selectMarkers, selectSceneMarkers, describeFrameAt, } from './selectors';
|
|
4
|
-
export { mergeTimelineTranscripts, formatWordTimings, } from './transcript';
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Selectors for the v2 wire-shape Composition. Mirrors the desktop store's
|
|
3
|
-
* selectors so headless callers (agent, Director worker, tests) get the same
|
|
4
|
-
* flattened views without re-implementing track-walking everywhere.
|
|
5
|
-
*/
|
|
6
|
-
/** All tracks in declared order. The Timeline UI projects these 1:1 to `TimelineRow`s. */
|
|
7
|
-
export function selectAllTracks(composition) {
|
|
8
|
-
return composition.tracks;
|
|
9
|
-
}
|
|
10
|
-
/** Tracks of a given kind, declared order preserved. */
|
|
11
|
-
export function selectTracksByKind(composition, kind) {
|
|
12
|
-
return composition.tracks.filter((t) => t.kind === kind);
|
|
13
|
-
}
|
|
14
|
-
/** Flatten all video-track clips into a single array, in track + content order. */
|
|
15
|
-
export function selectAllClips(composition) {
|
|
16
|
-
return composition.tracks
|
|
17
|
-
.filter((t) => t.kind === 'video')
|
|
18
|
-
.flatMap((t) => t.contents.filter((c) => 'source' in c));
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* THE MEDIA CLIP ON SCREEN AT `seconds` — the clip whose bytes a still drawn at
|
|
22
|
-
* that instant comes from, or `null` when nothing media-backed covers it (a
|
|
23
|
-
* gap, a card-only stretch, past the end).
|
|
24
|
-
*
|
|
25
|
-
* ONE RULE, TWO READERS, and that is why it lives in the kernel rather than in
|
|
26
|
-
* either of them. The desktop's frame capture resolves the video file to
|
|
27
|
-
* extract from this clip; the verb plane routes that capture by the SAME clip's
|
|
28
|
-
* media residency BEFORE calling it, so that a still is never asked for from
|
|
29
|
-
* bytes the machine cannot open. Two spellings of "which clip is on screen"
|
|
30
|
-
* would let the router clear a frame the renderer then draws from something
|
|
31
|
-
* else.
|
|
32
|
-
*
|
|
33
|
-
* VIDEO TRACKS, in track + content order, and a non-media clip is SKIPPED
|
|
34
|
-
* rather than ending the search: a card sitting over a video does not replace
|
|
35
|
-
* the pixels underneath it.
|
|
36
|
-
*
|
|
37
|
-
* Half-open `[startTime, startTime + duration)` — a clip's last instant belongs
|
|
38
|
-
* to whatever follows it, which is the boundary the renderer draws.
|
|
39
|
-
*/
|
|
40
|
-
export function selectMediaClipAt(composition, seconds) {
|
|
41
|
-
for (const clip of selectAllClips(composition)) {
|
|
42
|
-
if (seconds < clip.startTime)
|
|
43
|
-
continue;
|
|
44
|
-
if (seconds >= clip.startTime + clip.duration)
|
|
45
|
-
continue;
|
|
46
|
-
if (clip.source.kind !== 'media')
|
|
47
|
-
continue;
|
|
48
|
-
return clip;
|
|
49
|
-
}
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
/** Flatten all overlay-track clips. */
|
|
53
|
-
export function selectAllOverlays(composition) {
|
|
54
|
-
return composition.tracks
|
|
55
|
-
.filter((t) => t.kind === 'overlay')
|
|
56
|
-
.flatMap((t) => t.contents.filter((c) => 'source' in c));
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* THE LAYER CENSUS AT `seconds` — what a still drawn here contains, stated in
|
|
60
|
-
* words rather than left for the reader to infer from pixels.
|
|
61
|
-
*
|
|
62
|
-
* WHY THIS EXISTS. A preview is an agent's only evidence about a composition,
|
|
63
|
-
* and pixels alone cannot distinguish "my edit did not land" from "there is no
|
|
64
|
-
* footage under this timestamp". On 2026-08-14 a desktop run applied ops and
|
|
65
|
-
* previewed ten times against an EMPTY library: every capture succeeded, every
|
|
66
|
-
* still came back 200 OK, and the only record that the frames had no video in
|
|
67
|
-
* them was a `console.warn` in the app's own log — invisible to the agent that
|
|
68
|
-
* needed it. It kept editing something that was never going to be a video, then
|
|
69
|
-
* gave up. The frames were not broken; the instrument simply never said what it
|
|
70
|
-
* had drawn.
|
|
71
|
-
*
|
|
72
|
-
* This is the same correction `geometry` made for SIZE (2026-08-13, after an
|
|
73
|
-
* agent measured text in a quarter-scale still and rewrote a video to avoid
|
|
74
|
-
* cards): when a preview omits a fact about itself, an agent will infer a wrong
|
|
75
|
-
* one. State it.
|
|
76
|
-
*
|
|
77
|
-
* IN THE KERNEL, because both preview lanes must answer this identically. The
|
|
78
|
-
* desktop plane draws its own stills and the cloud route renders them through
|
|
79
|
-
* Modal, but an agent moving between the two reads ONE shape — the property the
|
|
80
|
-
* plane exists to hold. A second spelling of "what is on screen" is exactly the
|
|
81
|
-
* drift that makes local and cloud disagree.
|
|
82
|
-
*
|
|
83
|
-
* `overlays` is a COUNT, not a judgement: a frame with no video and one overlay
|
|
84
|
-
* is a legitimate card — not an error, and deliberately not refused. The agent
|
|
85
|
-
* is told what is there and decides for itself.
|
|
86
|
-
*/
|
|
87
|
-
export function describeFrameAt(composition, seconds) {
|
|
88
|
-
const clip = selectMediaClipAt(composition, seconds);
|
|
89
|
-
// Half-open `[startTime, startTime + duration)`, the same boundary
|
|
90
|
-
// `selectMediaClipAt` uses — so the two halves of one census cannot disagree
|
|
91
|
-
// about which side of a cut an instant falls on.
|
|
92
|
-
const overlays = selectAllOverlays(composition).filter((c) => seconds >= c.startTime && seconds < c.startTime + c.duration).length;
|
|
93
|
-
return {
|
|
94
|
-
video: clip !== null && clip.source.kind === 'media' ? clip.source.mediaId : null,
|
|
95
|
-
overlays,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
/** Flatten all audio-track clips. */
|
|
99
|
-
export function selectAllAudioClips(composition) {
|
|
100
|
-
return composition.tracks
|
|
101
|
-
.filter((t) => t.kind === 'audio')
|
|
102
|
-
.flatMap((t) => t.contents.filter((c) => 'source' in c));
|
|
103
|
-
}
|
|
104
|
-
export function selectClipById(composition, id) {
|
|
105
|
-
for (const t of composition.tracks) {
|
|
106
|
-
for (const c of t.contents) {
|
|
107
|
-
if ('source' in c && c.id === id)
|
|
108
|
-
return c;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
export function selectMarkers(composition) {
|
|
114
|
-
return composition.markers ?? [];
|
|
115
|
-
}
|
|
116
|
-
export function selectSceneMarkers(composition) {
|
|
117
|
-
return (composition.markers ?? []).filter((m) => m.kind === 'scene');
|
|
118
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure functions for merging per-clip transcripts into timeline-ordered words.
|
|
3
|
-
* Lives in @cueframe/core because it operates on composition data (clips +
|
|
4
|
-
* transcripts) with no dependency on stores, DOM, or runtime environment.
|
|
5
|
-
*
|
|
6
|
-
* v2 wire-shape: walks `TimelineClip`s straight off composition tracks. Each
|
|
7
|
-
* clip references its source via `source: { kind: 'media', mediaId, trim?,
|
|
8
|
-
* playbackRate?, muted? }`; cuts are baked into clip startTime/duration so
|
|
9
|
-
* there is no deletion-range filtering step.
|
|
10
|
-
*
|
|
11
|
-
* Output is the v1-shape `TimelineWord` from `@cueframe/core/types` so the
|
|
12
|
-
* agent context layer (which still reads `word.poolItemId`) keeps working.
|
|
13
|
-
* The "poolItemId" field carries the wire-shape `mediaId` value — same
|
|
14
|
-
* semantic, retained name for back-compat.
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Merges transcripts from multiple clips into a single timeline-ordered word list.
|
|
18
|
-
* Each clip's transcript segments are filtered to its source range and re-mapped
|
|
19
|
-
* to timeline positions.
|
|
20
|
-
*
|
|
21
|
-
* Deduplication: segments with the same (mediaId, sourceStartTime) pair are emitted
|
|
22
|
-
* only once, preventing duplicates when clips have overlapping source ranges.
|
|
23
|
-
*/
|
|
24
|
-
export function mergeTimelineTranscripts(clips, transcripts) {
|
|
25
|
-
const words = [];
|
|
26
|
-
const seen = new Set();
|
|
27
|
-
for (const clip of clips) {
|
|
28
|
-
if (clip.source.kind !== 'media')
|
|
29
|
-
continue;
|
|
30
|
-
if (clip.source.muted)
|
|
31
|
-
continue;
|
|
32
|
-
const mediaId = clip.source.mediaId;
|
|
33
|
-
const transcript = transcripts[mediaId];
|
|
34
|
-
if (!transcript?.segments)
|
|
35
|
-
continue;
|
|
36
|
-
const trimStart = clip.source.trim?.start ?? 0;
|
|
37
|
-
const trimEnd = clip.source.trim?.end ?? clip.duration;
|
|
38
|
-
const rate = clip.source.playbackRate ?? 1;
|
|
39
|
-
// Filter segments that START within clip's source range.
|
|
40
|
-
// Inclusive start (>=) is intentional: Whisper words often have zero-gap
|
|
41
|
-
// boundaries so a micro-fade shift to trim.start would exclude the neighbor word.
|
|
42
|
-
const clippedSegments = transcript.segments.filter((seg) => seg.startTime >= trimStart && seg.startTime < trimEnd);
|
|
43
|
-
for (const segment of clippedSegments) {
|
|
44
|
-
const key = `${mediaId}:${segment.startTime}`;
|
|
45
|
-
if (seen.has(key))
|
|
46
|
-
continue;
|
|
47
|
-
seen.add(key);
|
|
48
|
-
const clampedEnd = Math.min(segment.endTime, trimEnd);
|
|
49
|
-
words.push({
|
|
50
|
-
text: segment.text,
|
|
51
|
-
timelineStart: clip.startTime + (segment.startTime - trimStart) / rate,
|
|
52
|
-
timelineEnd: clip.startTime + (clampedEnd - trimStart) / rate,
|
|
53
|
-
clipId: clip.id,
|
|
54
|
-
// The v1 TimelineWord field is named `poolItemId`; v2 calls it
|
|
55
|
-
// `mediaId`. Same semantic — retain v1 name on the wire so the
|
|
56
|
-
// agent context (which reads `word.poolItemId`) keeps working.
|
|
57
|
-
poolItemId: mediaId,
|
|
58
|
-
sourceStart: segment.startTime,
|
|
59
|
-
sourceEnd: clampedEnd,
|
|
60
|
-
speakerId: segment.speakerId,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return words.sort((a, b) => a.timelineStart - b.timelineStart);
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Format word timings for a given time range into a human-readable string.
|
|
68
|
-
* Used by the Director's TranscriptProvider.getWordTimings() capability.
|
|
69
|
-
*/
|
|
70
|
-
export function formatWordTimings(words, startTime, endTime) {
|
|
71
|
-
const rangeWords = words.filter((w) => w.timelineEnd > startTime && w.timelineStart < endTime);
|
|
72
|
-
if (rangeWords.length === 0) {
|
|
73
|
-
return `No words found in range ${startTime.toFixed(1)}s–${endTime.toFixed(1)}s`;
|
|
74
|
-
}
|
|
75
|
-
const lines = rangeWords.map((w) => `${w.text}=${w.timelineStart.toFixed(2)}-${w.timelineEnd.toFixed(2)}`);
|
|
76
|
-
return `Word timings (${startTime.toFixed(1)}s–${endTime.toFixed(1)}s, ${rangeWords.length} words):\n${lines.join(' | ')}`;
|
|
77
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composition types — v2 wire-shape.
|
|
3
|
-
*
|
|
4
|
-
* The OSS shared composition module mirrors the desktop store's v2
|
|
5
|
-
* shape (cueframe/src/store/compositionStore/types.ts) minus desktop-only
|
|
6
|
-
* envelope concerns (corrections, transcriptDoc, isLoaded).
|
|
7
|
-
*
|
|
8
|
-
* Used by:
|
|
9
|
-
* - @cueframe/authoring — handlers + capability shape
|
|
10
|
-
* - Director worker (services/temporal/director) — server-side composition
|
|
11
|
-
*
|
|
12
|
-
* Canonical state lives on `composition: Composition` (from
|
|
13
|
-
* `../validators`). All ops walk `composition.tracks`
|
|
14
|
-
* and `composition.markers`.
|
|
15
|
-
*/
|
|
16
|
-
export {};
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { SFX_PACK_ENTRIES } from '../audio/pack.generated';
|
|
2
|
-
export const CATALOG_CATEGORY_VALUES = new Set([
|
|
3
|
-
'text', 'effects', 'transitions', 'layouts', 'backgrounds', 'ui-blocks', 'scenes',
|
|
4
|
-
]);
|
|
5
|
-
export const CATALOG_KIND_VALUES = new Set(['component', 'transition', 'scene']);
|
|
6
|
-
export const CATALOG_TIER_VALUES = new Set(['recommended', 'standard', 'niche']);
|
|
7
|
-
export const CATALOG_USE_CASE_VALUES = new Set([
|
|
8
|
-
'intro', 'outro', 'full-scene', 'title-over-footage', 'transition',
|
|
9
|
-
'background', 'grade', 'emphasis', 'explainer', 'social-cut',
|
|
10
|
-
]);
|
|
11
|
-
const TIER_RANK = { recommended: 0, standard: 1, niche: 2 };
|
|
12
|
-
/** A bad filter enum value — both lanes map this to their 400 invalid_query. */
|
|
13
|
-
export class CatalogFilterError extends Error {
|
|
14
|
-
field;
|
|
15
|
-
value;
|
|
16
|
-
allowed;
|
|
17
|
-
constructor(field, value, allowed) {
|
|
18
|
-
super(`Unknown ${field} '${value}'. Allowed: ${allowed.join(', ')}.`);
|
|
19
|
-
this.field = field;
|
|
20
|
-
this.value = value;
|
|
21
|
-
this.allowed = allowed;
|
|
22
|
-
this.name = 'CatalogFilterError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/** A cursor that decodes to no catalog entry — both lanes map to invalid_cursor. */
|
|
26
|
-
export class CatalogCursorError extends Error {
|
|
27
|
-
constructor(message = 'The supplied cursor is invalid or expired.') {
|
|
28
|
-
super(message);
|
|
29
|
-
this.name = 'CatalogCursorError';
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Validate raw query values into CatalogFilters. `q` and `intent` are aliases
|
|
34
|
-
* (free-text vs recommend-by-intent framing); both fold into the same match.
|
|
35
|
-
*/
|
|
36
|
-
export function validateCatalogFilters(raw) {
|
|
37
|
-
const norm = (v) => (v === undefined || v === '' ? undefined : v);
|
|
38
|
-
const f = {
|
|
39
|
-
category: norm(raw.category),
|
|
40
|
-
kind: norm(raw.kind),
|
|
41
|
-
tier: norm(raw.tier),
|
|
42
|
-
useCase: norm(raw.useCase),
|
|
43
|
-
mood: norm(raw.mood),
|
|
44
|
-
q: norm(raw.q) ?? norm(raw.intent),
|
|
45
|
-
};
|
|
46
|
-
if (f.category && !CATALOG_CATEGORY_VALUES.has(f.category))
|
|
47
|
-
throw new CatalogFilterError('category', f.category, [...CATALOG_CATEGORY_VALUES]);
|
|
48
|
-
if (f.kind && !CATALOG_KIND_VALUES.has(f.kind))
|
|
49
|
-
throw new CatalogFilterError('kind', f.kind, [...CATALOG_KIND_VALUES]);
|
|
50
|
-
if (f.tier && !CATALOG_TIER_VALUES.has(f.tier))
|
|
51
|
-
throw new CatalogFilterError('tier', f.tier, [...CATALOG_TIER_VALUES]);
|
|
52
|
-
if (f.useCase && !CATALOG_USE_CASE_VALUES.has(f.useCase))
|
|
53
|
-
throw new CatalogFilterError('useCase', f.useCase, [...CATALOG_USE_CASE_VALUES]);
|
|
54
|
-
return f;
|
|
55
|
-
}
|
|
56
|
-
/** True if ANY facet/free-text filter is set (drives recommend-first ordering). */
|
|
57
|
-
export function hasAnyCatalogFilter(f) {
|
|
58
|
-
return Boolean(f.category || f.kind || f.tier || f.useCase || f.mood || f.q);
|
|
59
|
-
}
|
|
60
|
-
/** Apply facet + free-text filters to a catalog. */
|
|
61
|
-
export function filterCatalog(catalog, f) {
|
|
62
|
-
const q = f.q?.toLowerCase();
|
|
63
|
-
return catalog.filter((e) => {
|
|
64
|
-
if (f.category && e.category !== f.category)
|
|
65
|
-
return false;
|
|
66
|
-
if (f.kind && e.kind !== f.kind)
|
|
67
|
-
return false;
|
|
68
|
-
if (f.tier && e.tier !== f.tier)
|
|
69
|
-
return false;
|
|
70
|
-
if (f.useCase && !(e.useCase ?? []).includes(f.useCase))
|
|
71
|
-
return false;
|
|
72
|
-
if (f.mood && !(e.mood ?? []).includes(f.mood))
|
|
73
|
-
return false;
|
|
74
|
-
if (q) {
|
|
75
|
-
const hay = [
|
|
76
|
-
e.id, e.name, e.description, e.intent ?? '', e.useWhen ?? '',
|
|
77
|
-
...(e.tags ?? []), ...(e.mood ?? []),
|
|
78
|
-
].join(' ').toLowerCase();
|
|
79
|
-
if (!hay.includes(q))
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
return true;
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
const nodeBuffer = globalThis.Buffer;
|
|
86
|
-
function b64urlEncode(raw) {
|
|
87
|
-
const b64 = typeof btoa === 'function' ? btoa(raw) : nodeBuffer.from(raw, 'utf-8').toString('base64');
|
|
88
|
-
return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
89
|
-
}
|
|
90
|
-
function b64urlDecode(opaque) {
|
|
91
|
-
const b64 = opaque.replace(/-/g, '+').replace(/_/g, '/');
|
|
92
|
-
const padded = b64 + '='.repeat((4 - (b64.length % 4)) % 4);
|
|
93
|
-
return typeof atob === 'function'
|
|
94
|
-
? atob(padded)
|
|
95
|
-
: nodeBuffer.from(padded, 'base64').toString('utf-8');
|
|
96
|
-
}
|
|
97
|
-
export const encodeCatalogCursor = b64urlEncode;
|
|
98
|
-
export function decodeCatalogCursor(opaque) {
|
|
99
|
-
try {
|
|
100
|
-
return b64urlDecode(opaque);
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
throw new CatalogCursorError();
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* The whole read: filter → recommend-order (only when filtered) → page.
|
|
108
|
-
* `limit` undefined returns the WHOLE filtered catalog in one page (an agent
|
|
109
|
-
* must never silently see a partial slice); `after` is the OPAQUE cursor from
|
|
110
|
-
* a previous page. Throws CatalogCursorError on an unknown/undecodable cursor.
|
|
111
|
-
*/
|
|
112
|
-
export function queryCatalog(catalog, filters, opts = {}) {
|
|
113
|
-
let sorted = filterCatalog(catalog, filters);
|
|
114
|
-
if (hasAnyCatalogFilter(filters)) {
|
|
115
|
-
sorted = [...sorted].sort((a, b) => (TIER_RANK[a.tier ?? 'standard'] ?? 1) - (TIER_RANK[b.tier ?? 'standard'] ?? 1));
|
|
116
|
-
}
|
|
117
|
-
const limit = opts.limit ?? Number.POSITIVE_INFINITY;
|
|
118
|
-
let start = 0;
|
|
119
|
-
if (opts.after !== undefined) {
|
|
120
|
-
const afterId = decodeCatalogCursor(opts.after);
|
|
121
|
-
const idx = sorted.findIndex((e) => e.id === afterId);
|
|
122
|
-
if (idx < 0)
|
|
123
|
-
throw new CatalogCursorError('Cursor not found.');
|
|
124
|
-
start = idx + 1;
|
|
125
|
-
}
|
|
126
|
-
const page = sorted.slice(start, start + limit);
|
|
127
|
-
const hasMore = start + limit < sorted.length;
|
|
128
|
-
return {
|
|
129
|
-
data: page,
|
|
130
|
-
pagination: {
|
|
131
|
-
hasMore,
|
|
132
|
-
nextCursor: hasMore && page.length > 0 ? encodeCatalogCursor(page[page.length - 1].id) : null,
|
|
133
|
-
prevCursor: null,
|
|
134
|
-
},
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
/** The curated CC0 SFX pack projected to the agent-legible browse shape
|
|
138
|
-
* (drops content-audit internals — sha256, structured source). First-page
|
|
139
|
-
* attachment on both lanes. */
|
|
140
|
-
export function serializeSfxCatalog() {
|
|
141
|
-
return SFX_PACK_ENTRIES.map((e) => ({
|
|
142
|
-
soundId: e.soundId,
|
|
143
|
-
family: e.family,
|
|
144
|
-
envelopeClass: e.envelopeClass,
|
|
145
|
-
intensity: e.intensity,
|
|
146
|
-
durationSec: e.durationSec,
|
|
147
|
-
description: e.description,
|
|
148
|
-
attribution: e.attribution,
|
|
149
|
-
}));
|
|
150
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// @cueframe/primitive-registry — the disabled-primitive denylist.
|
|
2
|
-
//
|
|
3
|
-
// The ONE switch that takes a built-in primitive out of circulation without
|
|
4
|
-
// deleting its config or regenerating the catalog. Dependency-free + V8-safe
|
|
5
|
-
// (imported by both this package's projections AND the Convex write boundary).
|
|
6
|
-
//
|
|
7
|
-
// WHY A DENYLIST, not a per-primitive `disabled` flag: a primitive is baked into
|
|
8
|
-
// SEVERAL generated artifacts — the catalog meta (generated/meta.ts),
|
|
9
|
-
// version-map.json (the membership SSOT), params-required.json, the component
|
|
10
|
-
// source (primitiveSource.generated.ts) — and, for name-coupled primitives like
|
|
11
|
-
// heroText, hard-referenced by id in the graphics-plan compiler and the agent
|
|
12
|
-
// prompts. A flag would have to be threaded through every one of those and
|
|
13
|
-
// regenerated. One denylist, checked at the few points a primitive is OFFERED
|
|
14
|
-
// (discovery projections), ADMITTED (the membership guard at save), or
|
|
15
|
-
// AUTO-EMITTED (the compiler), is the clean lever: add an id here and it
|
|
16
|
-
// vanishes from discovery and is rejected on save, everywhere, reversibly — no
|
|
17
|
-
// regen, no config surgery.
|
|
18
|
-
//
|
|
19
|
-
// The RENDERER is intentionally UNTOUCHED: an already-saved composition that
|
|
20
|
-
// references a now-disabled primitive still renders (the execution catalog keeps
|
|
21
|
-
// the component). This blocks NEW authoring; it does not retro-break saved work.
|
|
22
|
-
export const DISABLED_PRIMITIVE_IDS = new Set([
|
|
23
|
-
// (empty) — heroText was denylisted 2026-07-08 because behind-subject
|
|
24
|
-
// matte compositing desynced lip movement. Root cause was the matte bake
|
|
25
|
-
// re-timing the co-view at average fps (VFR sources drifted seconds);
|
|
26
|
-
// fixed by the CFR timing invariant at ingest (plan: brain
|
|
27
|
-
// 2026-07-28-cfr-timing-invariant) — re-enabled 2026-07-28.
|
|
28
|
-
]);
|
|
29
|
-
/** True when a primitive id is on the disabled denylist (not offered / not admitted). */
|
|
30
|
-
export function isPrimitiveDisabled(id) {
|
|
31
|
-
return DISABLED_PRIMITIVE_IDS.has(id);
|
|
32
|
-
}
|