@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,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CueFrame MCP resources — the read side of the surface (no side effects).
|
|
3
|
-
*
|
|
4
|
-
* Every read endpoint is a URI-addressed MCP *resource*, executed through the
|
|
5
|
-
* transport's `Executor` (stdio: network; hosted: in-process) against the GET
|
|
6
|
-
* op's path from the generated manifest — the SAME single source of truth the
|
|
7
|
-
* tools use, so paths are never hand-maintained. Four templates (media,
|
|
8
|
-
* component, project, brand-kit) also carry a `list` callback so resources/list
|
|
9
|
-
* enumerates concrete instances via the matching list op.
|
|
10
|
-
*
|
|
11
|
-
* Fail-loud: a non-2xx read throws, which the MCP server surfaces as a JSON-RPC
|
|
12
|
-
* error (no try/catch swallow).
|
|
13
|
-
*/
|
|
14
|
-
import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
|
-
import { opById, buildPath, isOk, apiErrorFrom, fetchAsBase64, sniffImageMediaType, } from './core.js';
|
|
16
|
-
/** GET a manifest op's path through the executor; throw on non-2xx (fail loud). Returns parsed JSON. */
|
|
17
|
-
async function read(ex, operationId, mapArg) {
|
|
18
|
-
const op = opById(operationId);
|
|
19
|
-
const res = await ex.invoke({ method: 'GET', path: buildPath(op, mapArg) });
|
|
20
|
-
if (!isOk(res.status))
|
|
21
|
-
throw apiErrorFrom(res);
|
|
22
|
-
try {
|
|
23
|
-
return JSON.parse(res.text);
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
return res.text;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function jsonResource(uri, value) {
|
|
30
|
-
return {
|
|
31
|
-
contents: [{ uri: uri.toString(), mimeType: 'application/json', text: JSON.stringify(value, null, 2) }],
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* A JSON resource PLUS the poster frame, so a client reading a media item can
|
|
36
|
-
* see the footage instead of reading its filename and duration.
|
|
37
|
-
*
|
|
38
|
-
* MCP resource contents carry either `text` or a base64 `blob`; this appends a
|
|
39
|
-
* blob entry alongside the JSON rather than replacing it, matching the additive
|
|
40
|
-
* contract the tool surface uses (`withMedia`). No poster, or a poster that will
|
|
41
|
-
* not load, yields the JSON alone — never an error.
|
|
42
|
-
*/
|
|
43
|
-
async function jsonResourceWithPoster(uri, value) {
|
|
44
|
-
const base = jsonResource(uri, value);
|
|
45
|
-
const url = value?.thumbnail?.url;
|
|
46
|
-
if (!url)
|
|
47
|
-
return base;
|
|
48
|
-
const data = await fetchAsBase64(url);
|
|
49
|
-
if (!data)
|
|
50
|
-
return base;
|
|
51
|
-
return {
|
|
52
|
-
contents: [
|
|
53
|
-
...base.contents,
|
|
54
|
-
{ uri: url, mimeType: sniffImageMediaType(data), blob: data },
|
|
55
|
-
],
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
/** Build a resources/list callback that enumerates `{ data: [{id,name?}] }` under a URI prefix. */
|
|
59
|
-
function listFrom(ex, prefix, listOperationId) {
|
|
60
|
-
return async () => {
|
|
61
|
-
const res = (await read(ex, listOperationId, () => ''));
|
|
62
|
-
return {
|
|
63
|
-
resources: (res.data ?? []).map((item) => ({
|
|
64
|
-
uri: `${prefix}/${item.id}`,
|
|
65
|
-
name: item.name ?? item.id,
|
|
66
|
-
mimeType: 'application/json',
|
|
67
|
-
})),
|
|
68
|
-
};
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* FACET-BEARING resources/list for the component catalog. Unlike `listFrom`
|
|
73
|
-
* (which strips every entry to {uri,name}), this carries the discovery facets
|
|
74
|
-
* (source/category/kind/tier/useCase) + the placement hint into each entry's
|
|
75
|
-
* `description`, so an agent can CHOOSE a primitive from the list alone instead
|
|
76
|
-
* of round-tripping cueframe://component/{id} for all 87 entries to recover them.
|
|
77
|
-
*/
|
|
78
|
-
function listComponentsFrom(ex, prefix) {
|
|
79
|
-
return async () => {
|
|
80
|
-
// No `limit` → the route returns the WHOLE catalog (built-ins + installed)
|
|
81
|
-
// in one page, so resources/list enumerates every primitive, not a slice.
|
|
82
|
-
const res = (await read(ex, 'listCatalog', () => ''));
|
|
83
|
-
return {
|
|
84
|
-
resources: (res.data ?? []).map((e) => {
|
|
85
|
-
const facets = [
|
|
86
|
-
e.source === 'installed' ? 'installed' : 'built-in',
|
|
87
|
-
e.category,
|
|
88
|
-
e.kind,
|
|
89
|
-
e.tier,
|
|
90
|
-
(e.useCase ?? []).length ? `useCase:${(e.useCase ?? []).join('/')}` : undefined,
|
|
91
|
-
e.placement
|
|
92
|
-
? `place as {kind:'${e.placement.clipSourceKind}', ${e.placement.refField}:'${e.id}'}`
|
|
93
|
-
: undefined,
|
|
94
|
-
].filter(Boolean);
|
|
95
|
-
return {
|
|
96
|
-
uri: `${prefix}/${e.id}`,
|
|
97
|
-
name: e.name ?? e.id,
|
|
98
|
-
description: facets.join(' · '),
|
|
99
|
-
mimeType: 'application/json',
|
|
100
|
-
};
|
|
101
|
-
}),
|
|
102
|
-
};
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
export function registerResources(server, ex) {
|
|
106
|
-
// ── composition (per project) ────────────────────────────────────
|
|
107
|
-
server.registerResource('composition', new ResourceTemplate('cueframe://composition/{projectId}', { list: undefined }), {
|
|
108
|
-
title: 'Composition',
|
|
109
|
-
description: 'The saved composition for a project (tracks, clips, captions). Read it before editing with apply_composition. URI: cueframe://composition/{projectId}.',
|
|
110
|
-
mimeType: 'application/json',
|
|
111
|
-
}, async (uri, { projectId }) => jsonResource(uri, await read(ex, 'getComposition', () => String(projectId))));
|
|
112
|
-
// ── media (single + collection) ──────────────────────────────────
|
|
113
|
-
server.registerResource('media', new ResourceTemplate('cueframe://media/{mediaId}', { list: listFrom(ex, 'cueframe://media', 'listMedia') }), {
|
|
114
|
-
title: 'Media item',
|
|
115
|
-
description: 'A media item in the library (id, name, duration, processing status). resources/list enumerates the library. URI: cueframe://media/{mediaId}.',
|
|
116
|
-
mimeType: 'application/json',
|
|
117
|
-
}, async (uri, { mediaId }) => jsonResourceWithPoster(uri, await read(ex, 'getMedia', () => String(mediaId))));
|
|
118
|
-
server.registerResource('media-transcript', new ResourceTemplate('cueframe://media/{mediaId}/transcript', { list: undefined }), {
|
|
119
|
-
title: 'Media transcript',
|
|
120
|
-
description: 'The transcript (diarized words/segments) for a media item. URI: cueframe://media/{mediaId}/transcript.',
|
|
121
|
-
mimeType: 'application/json',
|
|
122
|
-
}, async (uri, { mediaId }) => jsonResource(uri, await read(ex, 'getMediaTranscript', () => String(mediaId))));
|
|
123
|
-
server.registerResource('media-context', new ResourceTemplate('cueframe://media/{mediaId}/context', { list: undefined }), {
|
|
124
|
-
title: 'Media authoring context',
|
|
125
|
-
description: 'Detected faces (subject boxes per frame) + transcript for a media item — the same payload as get_media_context. Use it to align crop intents, captions, timing. URI: cueframe://media/{mediaId}/context.',
|
|
126
|
-
mimeType: 'application/json',
|
|
127
|
-
}, async (uri, { mediaId }) => jsonResource(uri, await read(ex, 'getMediaContext', () => String(mediaId))));
|
|
128
|
-
// ── component (single + collection) ──────────────────────────────
|
|
129
|
-
server.registerResource('component', new ResourceTemplate('cueframe://component/{componentId}', {
|
|
130
|
-
list: listComponentsFrom(ex, 'cueframe://component'),
|
|
131
|
-
}), {
|
|
132
|
-
title: 'Component catalog',
|
|
133
|
-
description: "The component catalog: the FULL built-in primitive catalog (96 primitives + 7 scenes — lower-third, cinematic-title, color-grade, the scenes …) PLUS your org-installed custom components. This is 'discover what to build with'. resources/list enumerates EVERY entry with its discovery facets (source/category/kind/tier/useCase) and a placement hint; read one for its full prop schema. NOT only your authored components. URI: cueframe://component/{componentId}.",
|
|
134
|
-
mimeType: 'application/json',
|
|
135
|
-
}, async (uri, { componentId }) => jsonResource(uri, await read(ex, 'getComponent', () => String(componentId))));
|
|
136
|
-
// ── render (per project) ─────────────────────────────────────────
|
|
137
|
-
server.registerResource('render', new ResourceTemplate('cueframe://render/{projectId}/{renderId}', { list: undefined }), {
|
|
138
|
-
title: 'Render job',
|
|
139
|
-
description: 'The status + output of a render job (status, progress, download URL when complete). URI: cueframe://render/{projectId}/{renderId}.',
|
|
140
|
-
mimeType: 'application/json',
|
|
141
|
-
}, async (uri, { projectId, renderId }) => jsonResource(uri, await read(ex, 'getRender', (p) => (p === 'renderId' ? String(renderId) : String(projectId)))));
|
|
142
|
-
// ── brand-kit (single + collection) ──────────────────────────────
|
|
143
|
-
server.registerResource('brand-kit', new ResourceTemplate('cueframe://brand-kit/{brandKitId}', {
|
|
144
|
-
list: listFrom(ex, 'cueframe://brand-kit', 'listBrandKits'),
|
|
145
|
-
}), {
|
|
146
|
-
title: 'Brand kit',
|
|
147
|
-
description: 'A brand kit (fonts, colors, logos) bound at render time. resources/list enumerates brand kits. URI: cueframe://brand-kit/{brandKitId}.',
|
|
148
|
-
mimeType: 'application/json',
|
|
149
|
-
}, async (uri, { brandKitId }) => jsonResource(uri, await read(ex, 'getBrandKit', () => String(brandKitId))));
|
|
150
|
-
// ── project (single + collection) ────────────────────────────────
|
|
151
|
-
server.registerResource('project', new ResourceTemplate('cueframe://project/{projectId}', { list: listFrom(ex, 'cueframe://project', 'listProjects') }), {
|
|
152
|
-
title: 'Project',
|
|
153
|
-
description: 'A project (the unit you compose + render into). resources/list enumerates your projects. URI: cueframe://project/{projectId}.',
|
|
154
|
-
mimeType: 'application/json',
|
|
155
|
-
}, async (uri, { projectId }) => jsonResource(uri, await read(ex, 'getProject', () => String(projectId))));
|
|
156
|
-
// ── webhook contract (static reference) ──────────────────────────
|
|
157
|
-
// A fixed doc (no {id}) — the delivery envelope, Standard-Webhooks signing, the
|
|
158
|
-
// echo-the-token activation handshake, and every event's `data` shape. This is
|
|
159
|
-
// 'how do I build a receiver' as data, so an agent never has to guess the
|
|
160
|
-
// payload/signature/verification or ask a human. Proxies GET /webhooks/events.
|
|
161
|
-
server.registerResource('webhook-events', 'cueframe://webhook-events', {
|
|
162
|
-
title: 'Webhook delivery contract',
|
|
163
|
-
description: "The webhook delivery/signing/verification contract: the POST envelope { event, timestamp, projectId?, data }, the Standard-Webhooks headers + how to verify the secret, the synchronous echo-the-token ownership handshake (and how to recover a pending webhook with verify_webhook), and every subscribable event with its exact `data` fields. Read it BEFORE building a webhook receiver. URI: cueframe://webhook-events.",
|
|
164
|
-
mimeType: 'application/json',
|
|
165
|
-
}, async (uri) => jsonResource(uri, await read(ex, 'getWebhookEvents', () => '')));
|
|
166
|
-
}
|
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CueFrame MCP — transport-agnostic core. NO transport import lives here, so
|
|
3
|
-
* both the stdio entry (index.ts) and the hosted Hono route
|
|
4
|
-
* (services/convex/api/routes/mcp.ts) build their server from this one module.
|
|
5
|
-
*
|
|
6
|
-
* Layers (all execute through the injected `Executor`, paths from the generated
|
|
7
|
-
* manifest — single source of truth, drift-gated):
|
|
8
|
-
* - curated front-door → registerCuratedTools (hand-picked names + guidance)
|
|
9
|
-
* - raw expert layer → registerRawTools (generic, one tool per op)
|
|
10
|
-
* - read resources → registerResources (resources.ts)
|
|
11
|
-
* - skills-as-prompts → registerSkillPrompts (prompts.ts; async, by caller)
|
|
12
|
-
*/
|
|
13
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
-
import { z } from 'zod';
|
|
15
|
-
import { text, errText, fmtErr, safeParse, withMedia, fetchPreviews, opById, bodySchemaFor, dispatchOp, } from './core.js';
|
|
16
|
-
import { GENERATED_OPERATIONS } from './generated/operations.js';
|
|
17
|
-
import { CURATED_TOOLS } from './curation.js';
|
|
18
|
-
import { registerResources } from './resources.js';
|
|
19
|
-
import { BURNED_NAMES, burnedNameError } from './burnedNames.js';
|
|
20
|
-
import { waitForJob } from './wait.js';
|
|
21
|
-
// Re-exports so a transport (stdio index.ts, or the hosted Convex route) has a
|
|
22
|
-
// single stdio-free import surface: `@cueframe/mcp/server`.
|
|
23
|
-
export { registerSkillPrompts, __resetSkillCache } from './prompts.js';
|
|
24
|
-
export { SERVER_INSTRUCTIONS } from './generated/harness.js';
|
|
25
|
-
/** Emit without ever letting instrumentation surface to the agent. */
|
|
26
|
-
function emit(sink, event) {
|
|
27
|
-
if (!sink)
|
|
28
|
-
return;
|
|
29
|
-
try {
|
|
30
|
-
sink(event);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
/* telemetry is never worth failing a tool call over */
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Time a tool handler and report the outcome. Returns the handler's result
|
|
38
|
-
* untouched — an `isError` result is a normal MCP return, not a throw, so both
|
|
39
|
-
* paths are recorded.
|
|
40
|
-
*/
|
|
41
|
-
async function timed(sink, tool, run) {
|
|
42
|
-
let isError = false;
|
|
43
|
-
let extra = {};
|
|
44
|
-
// A handler enriches the SINGLE event this wrapper emits. Emitting a second
|
|
45
|
-
// event instead does not work: the hosted route's telemetry is request-scoped
|
|
46
|
-
// and captures once per call, so the extra one is silently dropped — verified
|
|
47
|
-
// in PostHog, where preview_urls/preview_fetched came back null on every row
|
|
48
|
-
// while the images themselves were arriving fine.
|
|
49
|
-
const report = (e) => {
|
|
50
|
-
extra = { ...extra, ...e };
|
|
51
|
-
};
|
|
52
|
-
try {
|
|
53
|
-
const res = await run(report);
|
|
54
|
-
isError = Boolean(res?.isError);
|
|
55
|
-
return res;
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
isError = true;
|
|
59
|
-
throw err;
|
|
60
|
-
}
|
|
61
|
-
finally {
|
|
62
|
-
emit(sink, { tool, isError, ...extra });
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Operations the RAW expert layer must not register, even though they are in the
|
|
67
|
-
* manifest. This is a raw-layer property, not a manifest one: the manifest is the
|
|
68
|
-
* transport-agnostic op SSOT the CURATED layer resolves paths through (`opById`),
|
|
69
|
-
* so an op dropped from it becomes uncuratable.
|
|
70
|
-
*
|
|
71
|
-
* `searchLibrary` — the raw registrar builds its inputSchema from path params +
|
|
72
|
-
* the request body only, and every argument of GET /v1/media/search is a QUERY
|
|
73
|
-
* param. `q` is REQUIRED, so the raw tool could not send it and would 400 on
|
|
74
|
-
* every call — worse than absent, because an agent reads that 400 as "the
|
|
75
|
-
* feature is broken". The working surface is the curated `search_library`
|
|
76
|
-
* (internalLoopTools.ts) whose `queryArgs` the adapter threads onto the URL.
|
|
77
|
-
* DELETE this entry once the generator + this registrar thread query params
|
|
78
|
-
* (~/brain/Issues/2026-08-07-raw-mcp-tools-drop-query-params.md — the Executor
|
|
79
|
-
* already carries `query`).
|
|
80
|
-
*/
|
|
81
|
-
export const RAW_EXCLUDED_OPERATION_IDS = new Set(['searchLibrary']);
|
|
82
|
-
export function registerRawTools(server, ex, onEvent) {
|
|
83
|
-
for (const op of GENERATED_OPERATIONS) {
|
|
84
|
-
if (RAW_EXCLUDED_OPERATION_IDS.has(op.operationId))
|
|
85
|
-
continue;
|
|
86
|
-
const inputSchema = {};
|
|
87
|
-
for (const p of op.pathParams)
|
|
88
|
-
inputSchema[p] = z.string().describe(`Path parameter \`${p}\``);
|
|
89
|
-
const bodySchema = bodySchemaFor(op);
|
|
90
|
-
if (bodySchema)
|
|
91
|
-
inputSchema.body = bodySchema.optional().describe('Request body — typed from the OpenAPI spec.');
|
|
92
|
-
server.registerTool(op.toolName, { title: op.title, description: op.description, inputSchema, annotations: op.annotations }, async (args, extra) => timed(onEvent, op.toolName, async () => {
|
|
93
|
-
try {
|
|
94
|
-
return await dispatchOp(ex, op, (p) => args[p], args.body, extra, op.toolName, (res) => text(res.text || `${op.method} ${op.pathTemplate} → ${res.status}`));
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
return errText(`${op.toolName} failed: ${fmtErr(err)}`);
|
|
98
|
-
}
|
|
99
|
-
}));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
103
|
-
// Curated front-door — hand-picked names + agent guidance, paths from the
|
|
104
|
-
// manifest, executed through the Executor. `pathArgs` maps friendly arg names
|
|
105
|
-
// to the op's path params; `okFormat`/`okText` shape the success result.
|
|
106
|
-
// The curated tool set itself is the SSOT in curation.ts (drift-gated against
|
|
107
|
-
// the generated manifest by curation.test.ts).
|
|
108
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
109
|
-
/** `create_render` → "Create Render". Default title for a curated tool. */
|
|
110
|
-
export function titleCase(name) {
|
|
111
|
-
return name
|
|
112
|
-
.split('_')
|
|
113
|
-
.map((w) => (w ? w[0].toUpperCase() + w.slice(1) : w))
|
|
114
|
-
.join(' ');
|
|
115
|
-
}
|
|
116
|
-
export function registerCuratedTools(server, ex, opts) {
|
|
117
|
-
for (const spec of CURATED_TOOLS) {
|
|
118
|
-
// Maturity visibility mirror (spec 2026-07-20 §2.0): 'expert'-flagged
|
|
119
|
-
// entries are hidden from the public listing. Execution gating lives
|
|
120
|
-
// server-side (capabilities.ts) — this only controls what an agent SEES.
|
|
121
|
-
if ((spec.maturity ?? 'stable') === 'expert' && !opts?.expert)
|
|
122
|
-
continue;
|
|
123
|
-
const op = opById(spec.operationId);
|
|
124
|
-
const reverse = {};
|
|
125
|
-
for (const [friendly, opParam] of Object.entries(spec.pathArgs ?? {}))
|
|
126
|
-
reverse[opParam] = friendly;
|
|
127
|
-
const inputSchema = {};
|
|
128
|
-
for (const friendly of Object.keys(spec.pathArgs ?? {})) {
|
|
129
|
-
inputSchema[friendly] = z.string().describe(`${friendly} (path).`);
|
|
130
|
-
}
|
|
131
|
-
const bodySchema = bodySchemaFor(op);
|
|
132
|
-
if (bodySchema)
|
|
133
|
-
inputSchema.body = bodySchema;
|
|
134
|
-
// title/annotations: the curated entry overrides the op's method-derived
|
|
135
|
-
// values PER FIELD, not wholesale. Spreading matters — most curated entries
|
|
136
|
-
// set only one hint (`{ idempotentHint: true }` on the cancels), and a `??`
|
|
137
|
-
// would let that partial object replace the derived base, leaving
|
|
138
|
-
// readOnly/destructive unset. Unset is NOT neutral: the MCP schema defaults
|
|
139
|
-
// destructiveHint and openWorldHint to TRUE. Gated by index.test.ts.
|
|
140
|
-
const annotations = { ...op.annotations, ...spec.annotations };
|
|
141
|
-
server.registerTool(spec.name, { title: spec.title ?? titleCase(spec.name), description: spec.description, inputSchema, annotations }, async (args, extra) => timed(opts?.onEvent, spec.name, async (report) => {
|
|
142
|
-
const a = args;
|
|
143
|
-
try {
|
|
144
|
-
return await dispatchOp(ex, op, (p) => a[reverse[p]], a.body, extra, spec.name, async (res) => {
|
|
145
|
-
if (spec.okText)
|
|
146
|
-
return text(spec.okText(a));
|
|
147
|
-
const json = res.text ? safeParse(res.text) : undefined;
|
|
148
|
-
// Pass {} when the response had no body (e.g. a 204) so okFormat is
|
|
149
|
-
// null-safe; the bodied tools always return JSON.
|
|
150
|
-
const payload = spec.okFormat
|
|
151
|
-
? spec.okFormat(json ?? {}, a)
|
|
152
|
-
: res.text || `${op.method} → ${res.status}`;
|
|
153
|
-
// Give the agent eyes and ears (spec.preview). Media is ADDITIVE:
|
|
154
|
-
// `payload` is the same text block it has always been, so nothing
|
|
155
|
-
// downstream changes, and zero usable previews emits no media block at
|
|
156
|
-
// all. A preview fetch that fails is dropped silently — a dead
|
|
157
|
-
// thumbnail must never fail the tool call it decorates.
|
|
158
|
-
// `attach` gates on the response BEFORE any bytes are fetched — a
|
|
159
|
-
// withheld preview costs no egress, not just no context.
|
|
160
|
-
if (spec.preview && json && (spec.preview.attach?.(json) ?? true)) {
|
|
161
|
-
const kind = typeof spec.preview.kind === 'function'
|
|
162
|
-
? spec.preview.kind(json)
|
|
163
|
-
: spec.preview.kind ?? 'image';
|
|
164
|
-
const urls = spec.preview.urls(json).filter(Boolean);
|
|
165
|
-
const data = await fetchPreviews(urls, spec.preview.cap ?? 12);
|
|
166
|
-
report({ preview: { urls: urls.length, fetched: data.length } });
|
|
167
|
-
if (data.length)
|
|
168
|
-
return withMedia(payload, data.map((d) => ({ data: d, kind })));
|
|
169
|
-
}
|
|
170
|
-
return text(payload);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
return errText(`${spec.name} failed: ${fmtErr(err)}`);
|
|
175
|
-
}
|
|
176
|
-
}));
|
|
177
|
-
}
|
|
178
|
-
registerWaitJob(server, ex, opts?.waitCapMs, opts?.onEvent);
|
|
179
|
-
registerPreviewCard(server, ex, opts?.onEvent);
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* `preview_card` — see ONE authored card before it goes anywhere near a composition.
|
|
183
|
-
*
|
|
184
|
-
* There was no way to look at a card without adding it to a composition, shelling
|
|
185
|
-
* it with a motion preset, and previewing the whole frame. Twenty cards were
|
|
186
|
-
* authored blind in a single session; type overflowing the frame edge was the
|
|
187
|
-
* direct result — nobody could see it until the final render.
|
|
188
|
-
*
|
|
189
|
-
* It needs NO new endpoint. `preview_frame` already accepts an INLINE composition
|
|
190
|
-
* (`PreviewFrameRequest.composition`, evidence.ts:66), so this synthesizes the
|
|
191
|
-
* smallest legal one-card composition and reuses that op — same billing, same
|
|
192
|
-
* bake→capture seam, same content-addressed stills.
|
|
193
|
-
*/
|
|
194
|
-
function registerPreviewCard(server, ex, onEvent) {
|
|
195
|
-
const op = opById('previewFrame');
|
|
196
|
-
server.registerTool('preview_card', {
|
|
197
|
-
title: 'Preview Card',
|
|
198
|
-
description: 'Render ONE authored card on its own and SEE it, before placing it in a composition. Pass the same `html` (+ optional `tokens`) you would put in a {kind:"card"} clip; you get the still back as an image. Use this while writing a card — it is the fast loop for catching type that overflows the frame, a headline that collides with a logo, or tokens that did not resolve. Sized to the format you name, so what you see is what that aspect ratio will show. To judge MOTION rather than layout, shell the card with a motion preset and use preview_clip.',
|
|
199
|
-
inputSchema: {
|
|
200
|
-
projectId: z.string().describe('projectId (path) — the card is rendered inline; nothing is persisted to the project.'),
|
|
201
|
-
html: z.string().min(1).describe('The card markup, exactly as it would appear in a {kind:"card"} clip source.'),
|
|
202
|
-
tokens: z
|
|
203
|
-
.record(z.string())
|
|
204
|
-
.optional()
|
|
205
|
-
.describe('Token substitutions the html references (e.g. brand colours, fonts). Same shape as the clip source `tokens`.'),
|
|
206
|
-
aspectRatio: z
|
|
207
|
-
.enum(['16:9', '9:16', '1:1', '4:5'])
|
|
208
|
-
.optional()
|
|
209
|
-
.describe('Frame to size the card into. Default 9:16 — a card that fits 16:9 often overflows vertical.'),
|
|
210
|
-
},
|
|
211
|
-
// Renders inline and persists nothing — the read-only stance curation.ts
|
|
212
|
-
// already takes for preview_frame. Stated in full: an omitted hint is not
|
|
213
|
-
// neutral (destructiveHint/openWorldHint default TRUE in the schema).
|
|
214
|
-
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
215
|
-
}, async (args, extra) => timed(onEvent, 'preview_card', async (report) => {
|
|
216
|
-
const a = args;
|
|
217
|
-
// The smallest legal composition (Composition.required = v/format/tracks;
|
|
218
|
-
// clip.required = id/startTime/duration/source; card source needs kind+html).
|
|
219
|
-
const composition = {
|
|
220
|
-
v: 1,
|
|
221
|
-
format: { aspectRatio: a.aspectRatio ?? '9:16', fps: 30, resolution: 'fhd' },
|
|
222
|
-
tracks: [
|
|
223
|
-
{
|
|
224
|
-
id: 'card',
|
|
225
|
-
kind: 'overlay',
|
|
226
|
-
contents: [
|
|
227
|
-
{
|
|
228
|
-
id: 'card-1',
|
|
229
|
-
startTime: 0,
|
|
230
|
-
duration: 2,
|
|
231
|
-
source: { kind: 'card', html: a.html, ...(a.tokens ? { tokens: a.tokens } : {}) },
|
|
232
|
-
},
|
|
233
|
-
],
|
|
234
|
-
},
|
|
235
|
-
],
|
|
236
|
-
};
|
|
237
|
-
try {
|
|
238
|
-
return await dispatchOp(ex, op, () => a.projectId, { composition, timestamps: [1] }, extra, 'preview_card', async (res) => {
|
|
239
|
-
const json = res.text ? safeParse(res.text) : undefined;
|
|
240
|
-
const urls = (Array.isArray(json?.stills) ? json.stills : []).map((st) => st?.url);
|
|
241
|
-
const data = await fetchPreviews(urls, 2);
|
|
242
|
-
report({ preview: { urls: urls.filter(Boolean).length, fetched: data.length } });
|
|
243
|
-
const payload = res.text || `previewed card (${a.aspectRatio ?? '9:16'})`;
|
|
244
|
-
return data.length
|
|
245
|
-
? withMedia(payload, data.map((d) => ({ data: d, kind: 'image' })))
|
|
246
|
-
: text(payload);
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
catch (err) {
|
|
250
|
-
return errText(`preview_card failed: ${fmtErr(err)}`);
|
|
251
|
-
}
|
|
252
|
-
}));
|
|
253
|
-
}
|
|
254
|
-
function registerWaitJob(server, ex, waitCapMs, onEvent) {
|
|
255
|
-
server.registerTool('wait_job', {
|
|
256
|
-
title: 'Wait for Job',
|
|
257
|
-
// Polls status; changes nothing. Idempotent by construction — the whole
|
|
258
|
-
// continuation contract is "call again with the same arguments".
|
|
259
|
-
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
260
|
-
description: 'Wait for a long-running job and return the resolved result — a BOUNDED long-poll. Polls the job status (render / compose / consult / clip-suggestions / verify) and blocks up to the transport window (30s on the hosted transport); if the job is still running at the window it returns a `Still running` continuation — call wait_job again with the same arguments to keep waiting (the job keeps executing server-side; nothing is lost between calls). Call this right after compose / create_render / consult / suggest_briefs / score_composition / preview_component. For event-driven fan-out, create_webhook delivers the terminal instead.',
|
|
261
|
-
inputSchema: {
|
|
262
|
-
kind: z
|
|
263
|
-
.enum(['render', 'suggestions', 'compose', 'verify', 'preview', 'brand_kit_extract', 'consult'])
|
|
264
|
-
.describe('What to wait on: a render job, a compose job, a consult advisory, AI clip-suggestion analysis, or a generic async job (verify / preview / brand-kit extract — the kind is named in the enqueue receipt).'),
|
|
265
|
-
id: z
|
|
266
|
-
.string()
|
|
267
|
-
.describe('kind="render": renderId. kind="compose": composeJobId. kind="consult": the consultJobId from the consult receipt (surfaces the advisory envelope — assessment, proposals, principles). kind="suggestions": mediaItemId. kind="verify"/"preview"/"brand_kit_extract": the jobId from the enqueue receipt.'),
|
|
268
|
-
projectId: z
|
|
269
|
-
.string()
|
|
270
|
-
.optional()
|
|
271
|
-
.describe('Required when kind="render", "compose", or "consult".'),
|
|
272
|
-
timeoutMs: z
|
|
273
|
-
.number()
|
|
274
|
-
.int()
|
|
275
|
-
.min(1000)
|
|
276
|
-
.max(30 * 60 * 1000)
|
|
277
|
-
.optional()
|
|
278
|
-
.describe('Maximum wait in ms (default 30 min for render/compose, 5 min for suggestions).'),
|
|
279
|
-
},
|
|
280
|
-
}, async (args) => timed(onEvent, 'wait_job', async (report) => {
|
|
281
|
-
const kind = args.kind;
|
|
282
|
-
if ((kind === 'render' || kind === 'compose' || kind === 'consult') && !args.projectId) {
|
|
283
|
-
return errText(`wait_job(kind="${kind}") requires a projectId.`);
|
|
284
|
-
}
|
|
285
|
-
const defaultCap = kind === 'suggestions' ? 5 * 60 * 1000 : 30 * 60 * 1000;
|
|
286
|
-
// waitCapMs caps the hosted transport well under Convex's httpAction time
|
|
287
|
-
// limit (a 30-min synchronous poll would be killed mid-wait); the agent's
|
|
288
|
-
// own timeoutMs still applies below it. Unset (stdio) → no extra cap.
|
|
289
|
-
const requested = args.timeoutMs ?? defaultCap;
|
|
290
|
-
const deadline = Date.now() + (waitCapMs ? Math.min(requested, waitCapMs) : requested);
|
|
291
|
-
const res = await waitForJob(ex, kind, args.id, args.projectId, deadline);
|
|
292
|
-
if (!res.ok)
|
|
293
|
-
return errText(res.text);
|
|
294
|
-
// An async tool's pixels arrive HERE, not at the enqueue call:
|
|
295
|
-
// preview_component's 202 carries only a jobId, so the still it produces
|
|
296
|
-
// has to surface on the wait. Same url adapter.ts:578 inlines as an image.
|
|
297
|
-
if (res.mediaUrls?.length) {
|
|
298
|
-
const data = await fetchPreviews(res.mediaUrls, 4);
|
|
299
|
-
report({ preview: { urls: res.mediaUrls.length, fetched: data.length } });
|
|
300
|
-
if (data.length)
|
|
301
|
-
return withMedia(res.text, data.map((d) => ({ data: d, kind: 'image' })));
|
|
302
|
-
}
|
|
303
|
-
return text(res.text);
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
export function buildServer(opts) {
|
|
307
|
-
const server = new McpServer({ name: 'cueframe', version: '0.1.0' }, opts.instructions ? { instructions: opts.instructions } : undefined);
|
|
308
|
-
registerCuratedTools(server, opts.executor, {
|
|
309
|
-
waitCapMs: opts.waitCapMs,
|
|
310
|
-
expert: opts.expert,
|
|
311
|
-
onEvent: opts.onEvent,
|
|
312
|
-
});
|
|
313
|
-
registerBurnedTombstones(server, opts.onEvent);
|
|
314
|
-
registerResources(server, opts.executor);
|
|
315
|
-
if (opts.expert)
|
|
316
|
-
registerRawTools(server, opts.executor, opts.onEvent);
|
|
317
|
-
// NOTE: protocol-level traffic (initialize / tools-list / prompts / resources)
|
|
318
|
-
// is NOT observed here. It is captured once at the transport via the public
|
|
319
|
-
// `onmessage` hook, which sees every inbound JSON-RPC method without reaching
|
|
320
|
-
// into SDK internals. This function only instruments what the transport
|
|
321
|
-
// cannot see: per-tool duration and outcome.
|
|
322
|
-
return server;
|
|
323
|
-
}
|
|
324
|
-
/**
|
|
325
|
-
* A12 burned names: each dead verb registers as a TOMBSTONE — calling it
|
|
326
|
-
* hard-errors with the replacement instead of a bare method-not-found, so an
|
|
327
|
-
* agent with a stale memory of the surface gets re-taught in one round-trip.
|
|
328
|
-
*/
|
|
329
|
-
export function registerBurnedTombstones(server, onEvent) {
|
|
330
|
-
for (const b of BURNED_NAMES) {
|
|
331
|
-
server.registerTool(b.name, {
|
|
332
|
-
title: `${titleCase(b.name)} (retired)`,
|
|
333
|
-
description: `RETIRED (2026-07 verb cutover) — use ${b.replacement}. ${b.reason}`,
|
|
334
|
-
// A tombstone only ever throws. Announcing it as read-only and
|
|
335
|
-
// closed-world keeps a stale agent from being made to confirm a
|
|
336
|
-
// "destructive" call that does nothing (schema defaults both to true).
|
|
337
|
-
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
338
|
-
}, async () => timed(onEvent, b.name, async () => errText(burnedNameError(b))));
|
|
339
|
-
}
|
|
340
|
-
}
|