@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,560 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @cueframe/errors — the cross-cutting error contract SSOT.
|
|
3
|
-
*
|
|
4
|
-
* Zero `@cueframe/*` dependencies (enforced by the `errors-is-a-pure-leaf`
|
|
5
|
-
* dependency-cruiser rule) so it can be imported by every framework leaf
|
|
6
|
-
* (incl. perception + composition) and every service without a cycle.
|
|
7
|
-
*
|
|
8
|
-
* One vocabulary (`ERROR_CODES`), one carrier (`CueframeError`), one wire
|
|
9
|
-
* shape (`Envelope`), one Lambda-boundary codec (`encodeError`/`decodeError`),
|
|
10
|
-
* and one sanitization chokepoint (`toWireEnvelope`) that EVERY emit channel
|
|
11
|
-
* routes through before anything reaches an agent.
|
|
12
|
-
*/
|
|
13
|
-
export const ERROR_CODES = {
|
|
14
|
-
// auth / identity
|
|
15
|
-
unauthorized: { stage: "auth", category: "authoring", retryable: false, httpStatus: 401 },
|
|
16
|
-
forbidden: { stage: "auth", category: "authoring", retryable: false, httpStatus: 403 },
|
|
17
|
-
not_found: { stage: "auth", category: "authoring", retryable: false, httpStatus: 404 },
|
|
18
|
-
// billing / payment / x402
|
|
19
|
-
billing_required: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
20
|
-
billing_unavailable: { stage: "billing", category: "transient", retryable: true, httpStatus: 503 },
|
|
21
|
-
rate_limited: { stage: "billing", category: "transient", retryable: true, httpStatus: 429 },
|
|
22
|
-
// Per-handle concurrency guard: an x402 (anonymous payer) org is capped at
|
|
23
|
-
// X402_MAX_CONCURRENT_SESSIONS open warm compose boxes at once — one payer must
|
|
24
|
-
// not spin up unbounded expensive sandboxes. Transient/retryable (close a
|
|
25
|
-
// session, or wait for an idle one to auto-close, then retry) → 429.
|
|
26
|
-
too_many_active_sessions: { stage: "billing", category: "transient", retryable: true, httpStatus: 429 },
|
|
27
|
-
payment_required: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
28
|
-
payment_not_accepted: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
29
|
-
payment_verification_failed: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
30
|
-
payment_invalid: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
31
|
-
payment_replay: { stage: "billing", category: "authoring", retryable: false, httpStatus: 409 },
|
|
32
|
-
generation_budget_exceeded: { stage: "billing", category: "authoring", retryable: false, httpStatus: 402 },
|
|
33
|
-
// Capability maturity gate (spec 2026-07-20-client-lane-v1-launch §2.0): the
|
|
34
|
-
// capability exists but is not available on this surface (held/experimental —
|
|
35
|
-
// the server-side CAPABILITIES map in services/convex/api/capabilities.ts).
|
|
36
|
-
// Author-fixable (the error's details.pointer names the supported lane), so
|
|
37
|
-
// 403 non-retryable — mirrors `forbidden`, distinct code so an agent can
|
|
38
|
-
// route on it instead of misreading a permissions problem.
|
|
39
|
-
capability_unavailable: { stage: "auth", category: "authoring", retryable: false, httpStatus: 403 },
|
|
40
|
-
// import / media
|
|
41
|
-
import_unsupported_media: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
42
|
-
import_decode_failed: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
43
|
-
import_source_unreachable: { stage: "import", category: "transient", retryable: true, httpStatus: 422 },
|
|
44
|
-
import_processing_failed: { stage: "import", category: "internal", retryable: false, httpStatus: 422 },
|
|
45
|
-
media_not_ready: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
46
|
-
// A render mint's reframe needs the SOURCE's real width/height and the
|
|
47
|
-
// pipeline has not recorded them — probe unfinished OR probe failed, and the
|
|
48
|
-
// caller cannot tell which, so this is deliberately NOT `media_not_ready`
|
|
49
|
-
// (whose documented remedy is "wait for processing", a wait that never ends
|
|
50
|
-
// for a failed probe). The shipped agent skill documents this code with its
|
|
51
|
-
// own remedy (drop or defer the reframe intent); it was briefly aliased to
|
|
52
|
-
// media_not_ready, which made that documented vocabulary unreachable wire
|
|
53
|
-
// fiction — registered instead (2026-08-22 review).
|
|
54
|
-
source_dims_unknown: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
55
|
-
media_no_audio: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
56
|
-
// captions.fromTranscript (spec 2026-07-20 §2.2.6): the referenced media has
|
|
57
|
-
// no cached transcript (or no words in the requested window) — captions
|
|
58
|
-
// cannot be attached from it. Author-fixable (pick a speech-bearing media /
|
|
59
|
-
// widen the window / wait for processing to finish), so 422. Distinct from
|
|
60
|
-
// `transcript_unavailable` (503 — the transcript EXISTS but R2 retrieval
|
|
61
|
-
// failed transiently).
|
|
62
|
-
media_no_transcript: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
63
|
-
// POST /v1/media/{id}/transcript/analyze: the transcript is TOO BIG to analyse
|
|
64
|
-
// in one LLM pass. Deliberately NOT folded into `media_no_transcript` — that
|
|
65
|
-
// code sends an agent off to reprocess media that is perfectly fine, when the
|
|
66
|
-
// fix is entirely in the request (pass a narrower `window`). Author-fixable and
|
|
67
|
-
// deterministic, so 422 non-retryable: retrying the identical call cannot help.
|
|
68
|
-
// `details` carries chars/maxChars/startSec/endSec so the window can be chosen
|
|
69
|
-
// rather than guessed.
|
|
70
|
-
transcript_too_long: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
71
|
-
media_in_use: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
72
|
-
// A pool row whose BYTES ARE GONE — no local file, no cloud copy. Distinct
|
|
73
|
-
// from `media_not_ready` (bytes present, processing unfinished) and from
|
|
74
|
-
// `not_found` (no such row at all): the item is listed, the user can see it,
|
|
75
|
-
// and the remedy is re-import or removing the clips that use it. Not
|
|
76
|
-
// retryable — nothing changes by asking again.
|
|
77
|
-
media_missing: { stage: "import", category: "authoring", retryable: false, httpStatus: 422 },
|
|
78
|
-
invalid_import_url: { stage: "import", category: "authoring", retryable: false, httpStatus: 400 },
|
|
79
|
-
// validate / compose authoring
|
|
80
|
-
invalid_composition: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
81
|
-
validation_error: { stage: "validate", category: "authoring", retryable: false, httpStatus: 400 },
|
|
82
|
-
trim_out_of_bounds: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
83
|
-
timestamp_out_of_bounds: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
84
|
-
trim_inverted: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
85
|
-
reframe_coverage_gap: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
86
|
-
// Renamed from `image_media_on_video_track` 2026-08-17. The guard now derives
|
|
87
|
-
// the family from `mediaItems.mimeType` (schema-required, byte-detected)
|
|
88
|
-
// instead of the unmaintained `mediaItems.kind`, so it covers audio as well as
|
|
89
|
-
// stills — and it no longer fails open on media whose `kind` was never set.
|
|
90
|
-
// No alias for the old code: clean rename over a compat shim (CLAUDE.md).
|
|
91
|
-
media_family_track_mismatch: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
92
|
-
// Format-SSOT mint guard (resolveRenderTarget, P2.4): a render requests an
|
|
93
|
-
// aspect ratio that differs from the composition's authored format. Aspect is
|
|
94
|
-
// a property of the composition, not the render — changing it must go through a
|
|
95
|
-
// derive (a new composition), never a one-off render override. Author-fixable
|
|
96
|
-
// (derive a new composition at the target aspect, then render that), so 422.
|
|
97
|
-
aspect_change_requires_derive: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
98
|
-
delete_range_inverted: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
99
|
-
param_unwired: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
100
|
-
stale_etag: { stage: "validate", category: "authoring", retryable: false, httpStatus: 409 },
|
|
101
|
-
idempotency_conflict: { stage: "validate", category: "transient", retryable: true, httpStatus: 409 },
|
|
102
|
-
idempotency_key_mismatch: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
103
|
-
invalid_cursor: { stage: "validate", category: "authoring", retryable: false, httpStatus: 400 },
|
|
104
|
-
invalid_query: { stage: "validate", category: "authoring", retryable: false, httpStatus: 400 },
|
|
105
|
-
precondition_required: { stage: "validate", category: "authoring", retryable: false, httpStatus: 428 },
|
|
106
|
-
conflict: { stage: "validate", category: "authoring", retryable: false, httpStatus: 409 },
|
|
107
|
-
candidate_mismatch: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
108
|
-
// import_resource { kind:"sfx-pack" } referenced a soundId the closed CC0 SFX
|
|
109
|
-
// pack doesn't carry (a typo, or a stale catalog). Fail loud rather than mint a
|
|
110
|
-
// row over non-existent bytes — the client author re-picks from list_catalog's
|
|
111
|
-
// sfx[]. Author-fixable, deterministic → authoring / non-retryable / 422.
|
|
112
|
-
unknown_pack_sound: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
113
|
-
// A brand kit's audio ref (sonicLogo.ref — a palette reference) no longer
|
|
114
|
-
// resolves to a placeable sound: not a known pack soundId/bedId and not an
|
|
115
|
-
// org-owned media row (deleted, or drifted after the kit was authored). Fail
|
|
116
|
-
// loud at compose rather than silently dropping the brand signature — the
|
|
117
|
-
// author re-points the ref (list_catalog audio[]) or clears the sonic logo.
|
|
118
|
-
brand_audio_unresolvable: { stage: "compose", category: "authoring", retryable: false, httpStatus: 422 },
|
|
119
|
-
suggestions_already_complete: { stage: "validate", category: "authoring", retryable: false, httpStatus: 409 },
|
|
120
|
-
suggestions_already_running: { stage: "validate", category: "authoring", retryable: false, httpStatus: 409 },
|
|
121
|
-
// Clip-suggestion analysis is transcript-anchored — it scans spoken moments.
|
|
122
|
-
// A media item that processed cleanly but carries no speech (music beds,
|
|
123
|
-
// silent b-roll, screen-caps with no voiceover) has an empty transcript and
|
|
124
|
-
// can never yield clips. Distinct from `media_no_audio` (no audio STREAM at
|
|
125
|
-
// all): this fires when the source HAS audio but no detected speech, so the
|
|
126
|
-
// workflow would die in `fetchTranscriptData` after 3 wasted retries. Reject
|
|
127
|
-
// up front with a typed 422 so the agent learns to skip non-speech media.
|
|
128
|
-
suggestions_require_speech: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
129
|
-
clip_not_found: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
130
|
-
// derive_composition (P5): the source composition a derive references doesn't
|
|
131
|
-
// exist OR isn't this project's / org's (deriveSibling collapses all three to one
|
|
132
|
-
// code so it can't leak cross-org composition existence). A referenced resource
|
|
133
|
-
// that isn't there is a 404 — mirrors the generic `not_found` (auth/404). The
|
|
134
|
-
// derive route catches it and re-throws as `not_found`; registering it here keeps
|
|
135
|
-
// a direct throw from falling through to internal_error → 500 (the
|
|
136
|
-
// clip_source_track_mismatch landmine).
|
|
137
|
-
source_composition_not_found: { stage: "validate", category: "authoring", retryable: false, httpStatus: 404 },
|
|
138
|
-
// Composition wire-boundary projection guards (saveComposition). These fire on
|
|
139
|
-
// a track/source-kind mismatch or a primitive pick the catalog can't satisfy —
|
|
140
|
-
// all author-fixable, so they map to 422. Registered here so they surface as
|
|
141
|
-
// typed envelopes (and so composition.apply + composition.apply?dry_run can
|
|
142
|
-
// report them) instead of falling through to internal_error → 500.
|
|
143
|
-
clip_source_track_mismatch: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
144
|
-
// A FRONT overlay carrying a scene-space `anchor` (spec 2026-07-20 §2.1.1):
|
|
145
|
-
// anchor's only render semantics is world-lock through the crop-transformed
|
|
146
|
-
// source plane, which exists only on the behind plane (BehindOverlayHost's
|
|
147
|
-
// mount). On a front overlay it was a silent no-op — the agent authored an
|
|
148
|
-
// anchor and the render ignored it. Author-fixable (set zPlane
|
|
149
|
-
// 'behind-subject', or place with position/region), so 422.
|
|
150
|
-
anchor_requires_behind: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
151
|
-
unknown_primitive: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
152
|
-
// A KNOWN primitive retired via the disabled denylist (e.g. heroText) — rejected
|
|
153
|
-
// at the write boundary, distinct from unknown_primitive so the fix is "pick a
|
|
154
|
-
// different primitive", not "fix the typo / update the submodule".
|
|
155
|
-
disabled_primitive: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
156
|
-
invalid_primitive_params: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
157
|
-
// Two behind-subject heroText overlays with overlapping time windows —
|
|
158
|
-
// stacked hero phrases render over each other; one hero at a time.
|
|
159
|
-
overlapping_hero_overlays: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
160
|
-
custom_missing_sourcecode: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
161
|
-
// Component-authoring write path (internalInstall / internalUpsertComponent):
|
|
162
|
-
// the stored propSchema must be a parseable plain JSON object. A non-JSON or
|
|
163
|
-
// non-object schema is author-fixable, so 422 — registered here so it surfaces
|
|
164
|
-
// as a typed envelope instead of falling through to internal_error → 500.
|
|
165
|
-
invalid_prop_schema: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
166
|
-
// Component preview compile gate (component.preview → per-tenant box transpile):
|
|
167
|
-
// a tenant's tsxSource that fails to transpile/bundle is author-fixable, so 422
|
|
168
|
-
// (never a red-box / 500). The director box throws ComponentDoesNotCompile; the
|
|
169
|
-
// route maps it here so the authoring agent gets a typed envelope + the
|
|
170
|
-
// sanitized compiler message to self-correct.
|
|
171
|
-
component_does_not_compile: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
172
|
-
component_runtime_error: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
173
|
-
// Component materialize (Phase B): a composition's alpha-layer clip references a
|
|
174
|
-
// component whose authored tsxSource is absent OR null for the org (legacy rows
|
|
175
|
-
// can carry a null source). Author-fixable (POST/PUT /v1/components first), so
|
|
176
|
-
// 422 — registered here so the debug-session render/verify routes surface a
|
|
177
|
-
// typed envelope instead of an opaque bake-side exit-3 / internal_error → 500.
|
|
178
|
-
component_source_unavailable: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
179
|
-
// applyMotionPreset op (public card-shelling): the requested preset is not in
|
|
180
|
-
// the MOTION_PRESETS vocabulary. Author-fixable (pick a listed preset), so 422
|
|
181
|
-
// — registered so the op route surfaces a typed envelope + the valid list
|
|
182
|
-
// instead of falling through to internal_error → 500.
|
|
183
|
-
motion_preset_unknown: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
184
|
-
// applyMotionPreset op: the target clip is missing OR is not a STATIC card (a
|
|
185
|
-
// preset can only shell an un-animated card). Author-fixable (target a card
|
|
186
|
-
// clip id), so 422 — one code, the message distinguishes missing vs wrong-kind.
|
|
187
|
-
motion_preset_target_invalid: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
188
|
-
// materializeGrid op (temporal-grid → markers): the referenced clip is missing
|
|
189
|
-
// or is not a MEDIA clip (a grid is a property of source media). Author-fixable
|
|
190
|
-
// (target a media clip id), so 422 — the message distinguishes missing vs kind.
|
|
191
|
-
grid_target_invalid: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
192
|
-
// materializeGrid op: the requested grid (beat/word) evidence is absent on the
|
|
193
|
-
// clip's source media — a beat grid needs a MUSIC-role analyzed bed, a word
|
|
194
|
-
// grid needs a transcript. Author-fixable (declare audioRole:"music" at ingest
|
|
195
|
-
// / transcribe), so 422 — the message names which evidence is missing and how
|
|
196
|
-
// to get it, never a silent empty materialization.
|
|
197
|
-
grid_unavailable: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
198
|
-
// materializeGrid op with grid:"shot": shot-boundary evidence is computed by
|
|
199
|
-
// the perception lane but not yet exposed per-media on get_media_context (it
|
|
200
|
-
// lives only inside the R2 subject-track artifact); exposure rides a later
|
|
201
|
-
// perception arc. Fail loud (422) rather than materialize nothing.
|
|
202
|
-
shot_grid_unavailable: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
203
|
-
// materializeGrid op: the grid produces MORE markers than the cap (default 500,
|
|
204
|
-
// ceiling 2000). Author-fixable (raise maxMarkers ≤2000 or narrow the clip's
|
|
205
|
-
// visible window), so 422 — fail loud with the count, never a silent truncation.
|
|
206
|
-
grid_cap_exceeded: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
207
|
-
// render
|
|
208
|
-
// Generation moderation gate (P5 4a): a fal generation whose output carries a
|
|
209
|
-
// truthy NSFW/moderation flag (e.g. flux/dev `has_nsfw_concepts`) is blocked at
|
|
210
|
-
// falClient.result() BEFORE download/R2-put/finalize. Author-fixable (re-prompt),
|
|
211
|
-
// so 422 + retryable:false — the same moderated prompt re-runs to the same flag,
|
|
212
|
-
// and the workflow's catch → markGenerationFailed clears the genHash so a
|
|
213
|
-
// moderated result is never cached as a dedup target ("never cache a black frame
|
|
214
|
-
// as success").
|
|
215
|
-
generation_moderation_blocked: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
216
|
-
// Session box version-gate timeout: the in-box daemon/subscription is dead —
|
|
217
|
-
// INFRA, not author-fixable (a NEW session may work, hence transient/503).
|
|
218
|
-
// The MCP adapter classifies this InfraToolError → agent loop halts.
|
|
219
|
-
session_version_timeout: { stage: "render", category: "transient", retryable: true, httpStatus: 503 },
|
|
220
|
-
resource_import_in_flight: { stage: "validate", category: "transient", retryable: true, httpStatus: 503 },
|
|
221
|
-
trajectory_coverage_gap: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
222
|
-
trajectory_unresolved: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
223
|
-
subject_not_tracked: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
224
|
-
// D10 (P5 4b): a SUBJECT-mode reframe (face / active-speaker / all-faces) on
|
|
225
|
-
// AI-GENERATED media (`mediaItems.mediaSource === "generated"`) whose subject
|
|
226
|
-
// resolves in < MIN_SUBJECT_RESOLUTION of the segment. Distinct from
|
|
227
|
-
// `subject_not_tracked` so the driving agent learns the corrective action is a
|
|
228
|
-
// GEOMETRIC reframe (frame-center / point) on faceless b-roll — not a re-detect.
|
|
229
|
-
// Author-fixable → 422, retryable:false (mirrors subject_not_tracked).
|
|
230
|
-
subject_detection_failed_on_generated: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
231
|
-
// virtual-camera (vcam) reframe — registered in Phase 1 so an unregistered
|
|
232
|
-
// code can never fall back to internal_error → 500 when the throwing phase
|
|
233
|
-
// lands (the clip_source_track_mismatch landmine). See the vcam spec's
|
|
234
|
-
// "Fail-loud invariants & determinism" / "Registry wiring is Phase 1" section.
|
|
235
|
-
// `trajectory_internal_gap` is a derive-side tiling assertion (sub-shots must
|
|
236
|
-
// tile the segment) → internal, not author-facing. `subject_uncontainable` and
|
|
237
|
-
// `clip_trajectory_merge_conflict` are authoring 422s the agent can act on.
|
|
238
|
-
trajectory_internal_gap: { stage: "render", category: "internal", retryable: false, httpStatus: 422 },
|
|
239
|
-
subject_uncontainable: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
240
|
-
clip_trajectory_merge_conflict: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
241
|
-
// Selector core / adapters (selector-abstraction spec §8 fail-loud invariants).
|
|
242
|
-
// Registered in Phase 1 so an unregistered code can never fall back to
|
|
243
|
-
// internal_error → 500 when the throwing phase lands (the
|
|
244
|
-
// clip_source_track_mismatch landmine). The CORE throws `selector_signal_absent`
|
|
245
|
-
// (a weight over an all-null signal) and `selector_override_conflict` (a same-
|
|
246
|
-
// tier override/force collision — the Gap.strict() fail-loud lesson). The
|
|
247
|
-
// ADAPTER/LOWERING throw the timebase/sync/out-of-media codes (Phase 2 switch),
|
|
248
|
-
// registered now. All are authoring 422s the agent can act on except the
|
|
249
|
-
// override conflict which is also authoring (two pins collide → the agent fixes
|
|
250
|
-
// the policy).
|
|
251
|
-
selector_signal_absent: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
252
|
-
selector_override_conflict: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
253
|
-
selector_timebase_undefined: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
254
|
-
selector_group_unsynced: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
255
|
-
selector_segment_out_of_media: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
256
|
-
// Phase 3 (active-speaker): the STRUCTURAL double-count guard (§11-L5). When the
|
|
257
|
-
// agent weights `activeSpeaker`, the within-source `speaking` sub-term MUST be
|
|
258
|
-
// zeroed in the SAME weight vector (the double-count is fixed by the WEIGHT, not
|
|
259
|
-
// by a provider reading siblings). Weighting BOTH > 0 double-counts the speaker —
|
|
260
|
-
// fail loud with the fix (set weights.speaking = 0) rather than silently inflate.
|
|
261
|
-
selector_speaking_double_count: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
262
|
-
// Phase 6 (cross-source identity): a `lockPersonId` match over an embedding whose
|
|
263
|
-
// `DETECTOR_VERSION` differs from the reference is meaningless (the 3-stamp lesson)
|
|
264
|
-
// — fail loud (re-detect at the current version) rather than guess across versions.
|
|
265
|
-
selector_identity_detector_version_mismatch: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
266
|
-
variant_not_baked: { stage: "render", category: "internal", retryable: false, httpStatus: 422 },
|
|
267
|
-
behind_matte_unresolved: { stage: "render", category: "internal", retryable: false, httpStatus: 422 },
|
|
268
|
-
// C1 delivered-artifact floor: the rendered/mastered OUTPUT mp4 failed a
|
|
269
|
-
// pre-delivery integrity check — a truncated container (duration mismatch) or a
|
|
270
|
-
// blank film (every sampled frame near-uniform). Three real incidents shipped
|
|
271
|
-
// GREEN before this gate (two cache-poisoned blank films + a v22-clamp
|
|
272
|
-
// truncation), so the check runs on the final bytes and REFUSES to hand back the
|
|
273
|
-
// URL. An internal pipeline defect, not author-fixable → category internal. The
|
|
274
|
-
// failure reproduces deterministically (same snapshot → same truncation/blank),
|
|
275
|
-
// so retry would loop → retryable:false. 422 mirrors the sibling render-integrity
|
|
276
|
-
// codes (variant_not_baked / behind_matte_unresolved).
|
|
277
|
-
render_output_invalid: { stage: "render", category: "internal", retryable: false, httpStatus: 422 },
|
|
278
|
-
// Phase 4 AV-sync floor (audio-substrate P0): the delivered mix drifted off the
|
|
279
|
-
// authored sfx hits — a MAJORITY of placed sfx-role transients landed >100ms from
|
|
280
|
-
// any detected onset in the mastered output. Detected after loudnorm on Modal's
|
|
281
|
-
// /master route (librosa onset_detect vs the composition's sfx clip startTimes) and
|
|
282
|
-
// decided in the director (advisory-first: a minority draws a non-fatal advisory;
|
|
283
|
-
// only systemic drift fails). Author-adjacent — the offending clipIds are named so
|
|
284
|
-
// the placement can be re-timed → category authoring. Deterministic (same mastered
|
|
285
|
-
// bytes reproduce the onset set) → retryable:false. Fails OPEN on absent evidence
|
|
286
|
-
// (no onsets at all), so this code only fires on real, measured drift.
|
|
287
|
-
audio_sync_invalid: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
288
|
-
// SFX pack-first Task 4 envelope floor: a GENERATED sound effect
|
|
289
|
-
// (text-to-sfx) failed a delivery integrity check — provably silent output, a
|
|
290
|
-
// clipping peak, or a duration mismatch vs the pinned durationSec. Probed on
|
|
291
|
-
// Modal's /probe-audio route (the director box has no ffmpeg) BEFORE the media
|
|
292
|
-
// row flips ready; the typed 422 is decoded into a non-retryable failure so a
|
|
293
|
-
// bad output never caches as success and never re-bills fal. Author-adjacent
|
|
294
|
-
// (a different/looser prompt may generate a usable effect) → category
|
|
295
|
-
// authoring, mirroring generation_moderation_blocked. Deterministic (same
|
|
296
|
-
// bytes reproduce it) → retryable:false. 422 mirrors the sibling generation +
|
|
297
|
-
// render-integrity codes.
|
|
298
|
-
generation_output_invalid: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
299
|
-
// C2 bake-opacity sanity floor: an element-class component's alpha bake
|
|
300
|
-
// (text/effects/ui-blocks — elements OVER a base layer) came out ~fully opaque
|
|
301
|
-
// on EVERY sampled frame, which occludes the whole frame and is provably
|
|
302
|
-
// wrong. This is the caption-spine-holds-the-world-layer poisoning signature
|
|
303
|
-
// (2026-07-21: a concurrent bake cross-baked the opaque world layer under the
|
|
304
|
-
// transparent caption key, and every downstream render composited a blank film
|
|
305
|
-
// delivered green). The bake activity samples the alpha BEFORE R2 upload and
|
|
306
|
-
// REFUSES the artifact, naming the clip. Every frame-filling category is
|
|
307
|
-
// exempt — backgrounds/layouts (opaque by definition), scenes (a full-screen
|
|
308
|
-
// scene legitimately fills the frame opaquely), transitions (dip-to-black is
|
|
309
|
-
// opaque by design). Deterministic reproduction (same bytes → same opacity) →
|
|
310
|
-
// retryable:false. Internal pipeline defect → internal.
|
|
311
|
-
bake_output_opaque: { stage: "render", category: "internal", retryable: false, httpStatus: 422 },
|
|
312
|
-
source_media_not_found: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
313
|
-
// A brand-kit create supplied an exemplar/contact-sheet R2 key outside the
|
|
314
|
-
// org's `brand-inspiration/{orgId}/` prefix. Those keys get presigned
|
|
315
|
-
// downstream (vision tool + judge), so an unvalidated key is a cross-org R2
|
|
316
|
-
// read primitive — refuse it, naming the field (spec D2 security).
|
|
317
|
-
exemplar_key_not_org_owned: { stage: "validate", category: "authoring", retryable: false, httpStatus: 422 },
|
|
318
|
-
// The render's resolved brand kit does not resolve for this org at render-create
|
|
319
|
-
// (no kit row, deleted, or cross-org). The brand SSOT is the PROJECT (P1.1):
|
|
320
|
-
// render resolves from project.brandKitId (or a per-render override), never the
|
|
321
|
-
// composition. Fail loud instead of silently rendering UNBRANDED (the agent
|
|
322
|
-
// referenced a brand and would get nothing, with zero signal) — author-fixable
|
|
323
|
-
// (bind a valid kit via project.brandKitId / PATCH /projects/:id, or clear it),
|
|
324
|
-
// so 422 + retryable:false. Reserved here as the SSOT code; the render-create
|
|
325
|
-
// fail-loud that throws it is (re-)wired against the project-resolved brand
|
|
326
|
-
// post-merge. A render with NO brand kit is NOT this error — unbranded is a
|
|
327
|
-
// valid, if unthemed, render (a non-fatal `warnings[]` advisory instead).
|
|
328
|
-
brand_kit_unresolved: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
329
|
-
unknown_format: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
330
|
-
render_not_cancellable: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
331
|
-
compose_not_cancellable: { stage: "system", category: "authoring", retryable: false, httpStatus: 422 },
|
|
332
|
-
job_not_cancellable: { stage: "system", category: "authoring", retryable: false, httpStatus: 422 },
|
|
333
|
-
export_not_cancellable: { stage: "export", category: "authoring", retryable: false, httpStatus: 422 },
|
|
334
|
-
render_not_complete: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
335
|
-
lambda_infra_failed: { stage: "render", category: "transient", retryable: true, httpStatus: 503 },
|
|
336
|
-
// A render reached `rendering` (or was dispatched with a temporalRunId) and
|
|
337
|
-
// then lost its terminal write — the Temporal workflow died / the isolate that
|
|
338
|
-
// would have flipped the row never ran — so the heartbeat (`updatedAt`) goes
|
|
339
|
-
// stale and wait_job / the advised render.complete webhook dead-end forever
|
|
340
|
-
// with no terminal. The stall watchdog (rendersAction.sweepStalledRenderJobs)
|
|
341
|
-
// reaps such a row into status=error with THIS code so the surface terminalizes
|
|
342
|
-
// and a render.failed webhook fires. A stalled render is SAFE TO RETRY (the
|
|
343
|
-
// input is fine; the pipeline dropped it) → transient + retryable:true (500),
|
|
344
|
-
// so retry_render is the correct recovery. NOTE: a deeper Temporal-authority
|
|
345
|
-
// reconcile (ask Temporal what the workflow is actually doing, à la the
|
|
346
|
-
// exports-watchdog) is tracked separately in the render-engine plan
|
|
347
|
-
// (2026-06-29-render-engine-dogfood-fixes.md); this is the surface-completing
|
|
348
|
-
// heartbeat-timeout terminal only.
|
|
349
|
-
render_stalled: { stage: "render", category: "transient", retryable: true, httpStatus: 500 },
|
|
350
|
-
// A primitive id reached the RENDER boundary that the live render registry
|
|
351
|
-
// (@cueframe/compose `resolvePrimitive`) cannot resolve — a typo'd / drifted
|
|
352
|
-
// / pre-guard-snapshot primitiveId. Previously the renderer silently dropped
|
|
353
|
-
// it (return null / fall through to DynamicOverlay) and shipped a broken MP4
|
|
354
|
-
// with zero agent signal. Fail loud instead so it surfaces as the render job's
|
|
355
|
-
// errorCode (RenderResponse.errorCode + category/retryable). Author-fixable
|
|
356
|
-
// (fix the primitiveId) → 422, retryable:false. DEFENSE-IN-DEPTH: the write
|
|
357
|
-
// boundary (validatePrimitiveMembership at save/apply) already rejects unknown
|
|
358
|
-
// ids; this catches anything that slipped through (e.g. a snapshot authored
|
|
359
|
-
// before the guard, or version-map drift ahead of the render registry).
|
|
360
|
-
render_unknown_primitive: { stage: "render", category: "authoring", retryable: false, httpStatus: 422 },
|
|
361
|
-
// export
|
|
362
|
-
session_in_use: { stage: "export", category: "authoring", retryable: false, httpStatus: 422 },
|
|
363
|
-
transcript_unavailable: { stage: "export", category: "transient", retryable: true, httpStatus: 503 },
|
|
364
|
-
// system
|
|
365
|
-
service_unavailable: { stage: "system", category: "transient", retryable: true, httpStatus: 503 },
|
|
366
|
-
internal_error: { stage: "system", category: "internal", retryable: false, httpStatus: 500 },
|
|
367
|
-
};
|
|
368
|
-
export class CueframeError extends Error {
|
|
369
|
-
code;
|
|
370
|
-
fix;
|
|
371
|
-
locator;
|
|
372
|
-
constructor(code, message, fix, locator) {
|
|
373
|
-
super(message);
|
|
374
|
-
this.code = code;
|
|
375
|
-
this.fix = fix;
|
|
376
|
-
this.locator = locator;
|
|
377
|
-
this.name = "CueframeError";
|
|
378
|
-
}
|
|
379
|
-
toEnvelope() {
|
|
380
|
-
const s = ERROR_CODES[this.code];
|
|
381
|
-
return {
|
|
382
|
-
code: this.code,
|
|
383
|
-
stage: s.stage,
|
|
384
|
-
category: s.category,
|
|
385
|
-
retryable: s.retryable,
|
|
386
|
-
httpStatus: s.httpStatus,
|
|
387
|
-
message: this.message,
|
|
388
|
-
fix: this.fix,
|
|
389
|
-
locator: this.locator,
|
|
390
|
-
};
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
// ── Lambda-boundary codec ─────────────────────────────────────────────────
|
|
394
|
-
// Remotion/Temporal forward only standard Error props (name/message/stack), so
|
|
395
|
-
// a CueframeError's `code`/`fix` are dropped across a process boundary. We
|
|
396
|
-
// serialize the envelope into the MESSAGE behind a sentinel prefix; the director
|
|
397
|
-
// (and the Convex route) detect the prefix and reconstruct the typed error.
|
|
398
|
-
//
|
|
399
|
-
// The payload is BASE64, not raw JSON: the message gets re-serialized multiple
|
|
400
|
-
// times across the boundary (Remotion JSON-encodes the Error, the activity wraps
|
|
401
|
-
// it again as `Lambda render failed: {…}`), which would escape the quotes in raw
|
|
402
|
-
// JSON and break a naive parse. Base64 contains no quotes/backslashes/newlines,
|
|
403
|
-
// so it survives arbitrary nesting and is extracted by a simple charset match.
|
|
404
|
-
const CFERR_PREFIX = "CFERR::";
|
|
405
|
-
function b64encode(s) {
|
|
406
|
-
// Unicode-safe and works in both the Remotion (browser-like) bundle and Node.
|
|
407
|
-
return btoa(unescape(encodeURIComponent(s)));
|
|
408
|
-
}
|
|
409
|
-
function b64decode(s) {
|
|
410
|
-
return decodeURIComponent(escape(atob(s)));
|
|
411
|
-
}
|
|
412
|
-
export function encodeError(e) {
|
|
413
|
-
const json = JSON.stringify({ code: e.code, message: e.message, fix: e.fix, locator: e.locator });
|
|
414
|
-
return CFERR_PREFIX + b64encode(json);
|
|
415
|
-
}
|
|
416
|
-
export function decodeError(msg) {
|
|
417
|
-
const m = msg.match(/CFERR::([A-Za-z0-9+/=]+)/);
|
|
418
|
-
if (!m)
|
|
419
|
-
return null;
|
|
420
|
-
try {
|
|
421
|
-
const o = JSON.parse(b64decode(m[1]));
|
|
422
|
-
if (!o || typeof o.code !== "string" || !(o.code in ERROR_CODES))
|
|
423
|
-
return null;
|
|
424
|
-
return new CueframeError(o.code, String(o.message ?? ""), o.fix, o.locator);
|
|
425
|
-
}
|
|
426
|
-
catch {
|
|
427
|
-
return null;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
// ── Sanitization chokepoint ───────────────────────────────────────────────
|
|
431
|
-
// EVERY emit channel (HTTP body, renderJobs/mediaItems row writes, SSE,
|
|
432
|
-
// webhook) MUST serialize through toWireEnvelope before emitting. Default-deny:
|
|
433
|
-
// internal/transient errors get a generic message and NO fix; authoring errors
|
|
434
|
-
// get an allow-listed, scrubbed fix. The full raw error goes to logs only.
|
|
435
|
-
// Global so scrubStr can REDACT each occurrence (substring), not nuke the whole
|
|
436
|
-
// string. Each pattern consumes the full sensitive token so the replacement
|
|
437
|
-
// removes it cleanly while leaving surrounding human-readable text intact.
|
|
438
|
-
const SENSITIVE = [
|
|
439
|
-
/https?:\/\/\S+/gi, // URLs (presigned R2/S3, Lambda sites, etc.)
|
|
440
|
-
/\b[\w.-]*\.r2\.cloudflarestorage\.[\w./-]*/gi, // R2 hosts/keys (scheme-less)
|
|
441
|
-
/\bremotionlambda[\w.-]*/gi, // Lambda render host
|
|
442
|
-
/\bs3[.-][\w.-]*/gi, // s3 host (scheme-less)
|
|
443
|
-
/\b[\w.-]*\.internal\b/gi, // internal domains
|
|
444
|
-
/\/(?:Users|home|var|tmp|root)\/\S*/gi, // absolute fs paths
|
|
445
|
-
/\b\d{1,3}(?:\.\d{1,3}){3}\b/g, // IPv4 literals
|
|
446
|
-
];
|
|
447
|
-
const FIX_ALLOW = [
|
|
448
|
-
"issues",
|
|
449
|
-
"uncovered",
|
|
450
|
-
"gapFrames",
|
|
451
|
-
"clipId",
|
|
452
|
-
"trackId",
|
|
453
|
-
"brandKitId",
|
|
454
|
-
"srcFrame",
|
|
455
|
-
"firstSegmentStart",
|
|
456
|
-
"mediaId",
|
|
457
|
-
"aspect",
|
|
458
|
-
"intentHash",
|
|
459
|
-
"remedies",
|
|
460
|
-
"retryAfter",
|
|
461
|
-
"compositionPath",
|
|
462
|
-
"nearest",
|
|
463
|
-
// invalid_primitive_params closed-key/typed param-shape detail. Flat unions
|
|
464
|
-
// surfacing the common single-overlay case; per-issue detail rides in `issues`.
|
|
465
|
-
"unknownKeys",
|
|
466
|
-
"allowedKeys",
|
|
467
|
-
"typeMismatches",
|
|
468
|
-
"constraintViolations",
|
|
469
|
-
];
|
|
470
|
-
const LOCATOR_ALLOW = ["projectId", "renderId", "requestId", "clipId", "trackId", "compositionPath"];
|
|
471
|
-
const GENERIC = {
|
|
472
|
-
transient: "A temporary error occurred; retry.",
|
|
473
|
-
internal: "An unexpected error occurred.",
|
|
474
|
-
};
|
|
475
|
-
function scrubStr(v) {
|
|
476
|
-
if (typeof v !== "string")
|
|
477
|
-
return v;
|
|
478
|
-
let s = v;
|
|
479
|
-
for (const r of SENSITIVE)
|
|
480
|
-
s = s.replace(r, "(redacted)");
|
|
481
|
-
return s;
|
|
482
|
-
}
|
|
483
|
-
/** Scrub SENSITIVE tokens from a raw message that will be PERSISTED or shipped
|
|
484
|
-
* over a webhook without passing through toWireEnvelope — e.g. failRenderJob's
|
|
485
|
-
* non-CFERR fallback, where the deep root cause can carry fs paths, presigned
|
|
486
|
-
* URLs, or Lambda hosts verbatim. */
|
|
487
|
-
export function scrubSensitive(s) {
|
|
488
|
-
return scrubStr(s);
|
|
489
|
-
}
|
|
490
|
-
// Recurse into objects AND arrays so a sensitive string nested inside a fix
|
|
491
|
-
// value (e.g. an issue object holding a private IP) can't slip past — every
|
|
492
|
-
// leaf string is scrubbed regardless of depth.
|
|
493
|
-
function scrubVal(v) {
|
|
494
|
-
if (typeof v === "string")
|
|
495
|
-
return scrubStr(v);
|
|
496
|
-
if (Array.isArray(v))
|
|
497
|
-
return v.map(scrubVal);
|
|
498
|
-
if (v !== null && typeof v === "object") {
|
|
499
|
-
const out = {};
|
|
500
|
-
for (const [k, val] of Object.entries(v))
|
|
501
|
-
out[k] = scrubVal(val);
|
|
502
|
-
return out;
|
|
503
|
-
}
|
|
504
|
-
return v;
|
|
505
|
-
}
|
|
506
|
-
/** Keep only allow-listed keys, scrubbing each value. For UNTRUSTED payloads. */
|
|
507
|
-
function pickScrub(obj, allow) {
|
|
508
|
-
if (!obj)
|
|
509
|
-
return undefined;
|
|
510
|
-
const out = {};
|
|
511
|
-
for (const k of allow)
|
|
512
|
-
if (k in obj)
|
|
513
|
-
out[k] = scrubVal(obj[k]);
|
|
514
|
-
return Object.keys(out).length ? out : undefined;
|
|
515
|
-
}
|
|
516
|
-
/** Keep ALL keys, scrubbing each value. For TRUSTED (author-built) payloads. */
|
|
517
|
-
function scrubAll(obj) {
|
|
518
|
-
if (!obj)
|
|
519
|
-
return undefined;
|
|
520
|
-
const out = {};
|
|
521
|
-
for (const [k, v] of Object.entries(obj))
|
|
522
|
-
out[k] = scrubVal(v);
|
|
523
|
-
return Object.keys(out).length ? out : undefined;
|
|
524
|
-
}
|
|
525
|
-
/**
|
|
526
|
-
* The single sanitization chokepoint. EVERY emit channel routes through it.
|
|
527
|
-
*
|
|
528
|
-
* `opts.trusted` marks an author-curated envelope (a route-built `ApiError`) whose
|
|
529
|
-
* `message` and `fix` we wrote ourselves — vs an UNtrusted envelope translated from a
|
|
530
|
-
* raw/deep error (Lambda/processing/unmapped `ConvexError`) whose text/fields may carry a
|
|
531
|
-
* stack or infra detail. Never set `trusted` for a translated error.
|
|
532
|
-
*
|
|
533
|
-
* - TRUSTED: keep the message (scrubbed defensively) and all `fix` keys (values scrubbed),
|
|
534
|
-
* so curated fields like `currentEtag`/`projectIds`/`name`/`reason`/`retryAfter` survive
|
|
535
|
-
* on errors of ANY category — except `internal`, where `fix` is always dropped.
|
|
536
|
-
* - UNTRUSTED: `internal`/`transient` get a generic message; `authoring` keeps a scrubbed
|
|
537
|
-
* message. `fix` is dropped for `internal` and otherwise reduced to the allow-list +
|
|
538
|
-
* scrubbed (so `retryAfter` survives but a raw `filePath`/URL cannot).
|
|
539
|
-
* - `locator`: always reduced to the safe key set.
|
|
540
|
-
*/
|
|
541
|
-
export function toWireEnvelope(e, opts) {
|
|
542
|
-
const trusted = opts?.trusted ?? false;
|
|
543
|
-
let message;
|
|
544
|
-
let fix;
|
|
545
|
-
if (e.category === "internal") {
|
|
546
|
-
// Always opaque — never surface an author- or stack-derived internal message/fix.
|
|
547
|
-
message = GENERIC.internal;
|
|
548
|
-
fix = undefined;
|
|
549
|
-
}
|
|
550
|
-
else if (trusted) {
|
|
551
|
-
message = scrubStr(e.message);
|
|
552
|
-
fix = scrubAll(e.fix);
|
|
553
|
-
}
|
|
554
|
-
else {
|
|
555
|
-
message = e.category === "authoring" ? scrubStr(e.message) : GENERIC[e.category];
|
|
556
|
-
fix = pickScrub(e.fix, FIX_ALLOW);
|
|
557
|
-
}
|
|
558
|
-
const locator = pickScrub(e.locator, LOCATOR_ALLOW);
|
|
559
|
-
return { ...e, message, fix, locator };
|
|
560
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-cutting invariant code registry.
|
|
3
|
-
*
|
|
4
|
-
* Each domain package declares its own typed code union and constructs
|
|
5
|
-
* `InvariantError` for failures. The shared `InvariantViolation` /
|
|
6
|
-
* `InvariantError` shape gives every domain a uniform error contract
|
|
7
|
-
* (HTTP error mapping, log shape, projection-failure reporting) without
|
|
8
|
-
* forcing all codes into one enum.
|
|
9
|
-
*
|
|
10
|
-
* Usage from a domain package:
|
|
11
|
-
*
|
|
12
|
-
* import { InvariantError, type InvariantViolation } from "@cueframe/foundation/codes";
|
|
13
|
-
*
|
|
14
|
-
* export type CompositionInvariantCode =
|
|
15
|
-
* | "track_clips_overlap"
|
|
16
|
-
* | "transition_no_predecessor";
|
|
17
|
-
*
|
|
18
|
-
* export function trackClipsOverlap(details: { trackId: string }): InvariantViolation<CompositionInvariantCode> {
|
|
19
|
-
* return { code: "track_clips_overlap", message: "...", details };
|
|
20
|
-
* }
|
|
21
|
-
*/
|
|
22
|
-
export class InvariantError extends Error {
|
|
23
|
-
code;
|
|
24
|
-
details;
|
|
25
|
-
constructor(violation) {
|
|
26
|
-
super(`${violation.code}: ${violation.message}`);
|
|
27
|
-
this.code = violation.code;
|
|
28
|
-
this.details = violation.details;
|
|
29
|
-
this.name = "InvariantError";
|
|
30
|
-
}
|
|
31
|
-
}
|