@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,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Burned tool names (amendment A12, plan 2026-07-10-flow-verbs) — names that
|
|
3
|
-
* DIED in the verb cutover and may NEVER be reused for a different job: a
|
|
4
|
-
* reused name is a silent behavior change for every old caller.
|
|
5
|
-
*
|
|
6
|
-
* Each burned name registers as a TOMBSTONE tool: calling it hard-errors with
|
|
7
|
-
* the replacement (an agent with a stale memory of the surface gets taught,
|
|
8
|
-
* not a bare method-not-found), and the tools/list entry itself documents the
|
|
9
|
-
* cutover. The gate in curation.test.ts ("burned names stay dead") asserts no
|
|
10
|
-
* curated/infrastructure tool ever takes a burned name back, that the
|
|
11
|
-
* internal-loop overlap stays exactly the documented four, and that every
|
|
12
|
-
* tombstone's replacement is a live tool.
|
|
13
|
-
*/
|
|
14
|
-
export const BURNED_NAMES = [
|
|
15
|
-
{
|
|
16
|
-
name: "create_composition",
|
|
17
|
-
replacement: "compose",
|
|
18
|
-
reason: "renamed — one flagship verb: compose {briefId | fromComposition | suggestionId} starts the Director run.",
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
name: "verify_composition",
|
|
22
|
-
replacement: "score_composition",
|
|
23
|
-
reason: "renamed — the standalone sighted check SCORES a composition and returns a Checkpoint packet.",
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: "render_frame",
|
|
27
|
-
replacement: "preview_frame",
|
|
28
|
-
reason: "renamed — the evidence family says preview_*; render_* is the paid finisher family.",
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: "trigger_suggestions",
|
|
32
|
-
replacement: "suggest_briefs",
|
|
33
|
-
reason: "renamed — the analysis mints kind-'clip' Briefs, each composable via compose {briefId}.",
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: "resume_compose",
|
|
37
|
-
replacement: "resume",
|
|
38
|
-
reason: "renamed — checkpoint-addressed: resume(checkpointId, {decision}) answers the packet, not the job.",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
name: "open_session",
|
|
42
|
-
replacement: "score_composition / preview_frame / preview_component",
|
|
43
|
-
reason: "sessions dissolved — each op manages its own warm box server-side, billed flat per operation.",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: "close_session",
|
|
47
|
-
replacement: "(nothing — the managed box reaps itself on idle)",
|
|
48
|
-
reason: "sessions dissolved — there is no client-held box to close.",
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
name: "commit_session",
|
|
52
|
-
replacement: "apply_composition",
|
|
53
|
-
reason: "scratch-vs-active dissolved into composition versioning — there is nothing left to commit.",
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: "new_video",
|
|
57
|
-
replacement: "new_composition",
|
|
58
|
-
reason: "renamed — every verb in the family says composition; only the mint said video.",
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
name: "list_components",
|
|
62
|
-
replacement: "list_catalog",
|
|
63
|
-
reason: "renamed — 'component' on the wire means installed-only; the verb returns the whole catalog.",
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
name: "adopt_candidate",
|
|
67
|
-
replacement: "apply_composition",
|
|
68
|
-
reason: "removed — adopt a consult proposal by applying its composition (the client stays the author).",
|
|
69
|
-
},
|
|
70
|
-
];
|
|
71
|
-
export function burnedNameError(b) {
|
|
72
|
-
return `'${b.name}' was RETIRED in the 2026-07 verb cutover and will never come back. Use ${b.replacement}. (${b.reason})`;
|
|
73
|
-
}
|
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
import { ApiError, adviseError } from '@cueframe/sdk';
|
|
2
|
-
import * as bodySchemas from '@cueframe/sdk/zod';
|
|
3
|
-
import { GENERATED_OPERATIONS } from './generated/operations.js';
|
|
4
|
-
import { MCP_PAYMENT_REQUIRED_CODE, isX402PaymentRequired, extractPaymentFromMeta, encodePaymentSignature, } from './x402Meta.js';
|
|
5
|
-
export function text(s) {
|
|
6
|
-
return { content: [{ type: 'text', text: s }] };
|
|
7
|
-
}
|
|
8
|
-
export function errText(s) {
|
|
9
|
-
return { content: [{ type: 'text', text: s }], isError: true };
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* The JSON payload of a tool result. Since `content` gained image/audio blocks,
|
|
13
|
-
* callers can no longer assume `content[0].text` — but every result still leads
|
|
14
|
-
* with its text block (see `withMedia`), so this is the stable accessor.
|
|
15
|
-
*/
|
|
16
|
-
export function firstText(r) {
|
|
17
|
-
const b = r.content.find((c) => c.type === 'text');
|
|
18
|
-
return b?.text ?? '';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Sniff an image's media type from its base64 magic bytes.
|
|
22
|
-
*
|
|
23
|
-
* Authoritative, never hardcoded: the declared media type must match the pixels
|
|
24
|
-
* or the model API rejects the whole message. Server-rendered stills are PNG,
|
|
25
|
-
* but `view_style_reference` exemplars are USER-UPLOADED frames written as JPEG
|
|
26
|
-
* (`frame-01.jpg`) — hardcoding `image/png` mislabeled every inspiration kit's
|
|
27
|
-
* exemplars and crashed the designer the instant it looked at the reference
|
|
28
|
-
* (2026-07-16, waverly-mercury card-lane bench). Unknown ⇒ png (the server default).
|
|
29
|
-
*
|
|
30
|
-
* Lives here rather than in adapter.ts so the ai-SDK path and the MCP-server path
|
|
31
|
-
* share ONE sniffer — the bug above must not be re-introduced on the new surface.
|
|
32
|
-
*/
|
|
33
|
-
/**
|
|
34
|
-
* base64 ⇄ bytes WITHOUT Node's `Buffer`.
|
|
35
|
-
*
|
|
36
|
-
* The hosted MCP runs in Convex's V8 runtime, which has the web APIs (`btoa`,
|
|
37
|
-
* `atob`, `Uint8Array`) but NOT Node globals. `Buffer.from(...)` threw there on
|
|
38
|
-
* every preview — AFTER a successful fetch — and `fetchAsBase64`'s catch
|
|
39
|
-
* swallowed it, so `mcp_preview` reported `{urls:2, fetched:0}` and the whole
|
|
40
|
-
* eyes-and-ears surface silently did nothing in production while 187 tests
|
|
41
|
-
* passed under Node. Web APIs only, so one implementation serves both runtimes.
|
|
42
|
-
*/
|
|
43
|
-
function bytesToBase64(bytes) {
|
|
44
|
-
// PREFERRED: the TC39 standard method (proposal-arraybuffer-base64, now in MDN).
|
|
45
|
-
// Skips the binary-string round trip entirely, so there is no argument-count
|
|
46
|
-
// limit to trip over. Feature-detected because Convex's runtime version is not
|
|
47
|
-
// ours to pin.
|
|
48
|
-
const std = bytes.toBase64;
|
|
49
|
-
if (typeof std === 'function')
|
|
50
|
-
return std.call(bytes);
|
|
51
|
-
// FALLBACK: chunked String.fromCharCode + btoa — the documented pattern for
|
|
52
|
-
// Workers-like runtimes. 8192 is the size those guides use: passing a whole
|
|
53
|
-
// 100KB thumbnail (or even 32768 bytes) as spread arguments can exceed the
|
|
54
|
-
// engine's max-argument limit and throw. Our tests use 4-byte fixtures, so a
|
|
55
|
-
// too-large chunk would never have failed in CI — only in production, on a
|
|
56
|
-
// real image, silently, exactly like the Buffer bug this replaced.
|
|
57
|
-
let bin = '';
|
|
58
|
-
const CHUNK = 8192;
|
|
59
|
-
for (let i = 0; i < bytes.length; i += CHUNK) {
|
|
60
|
-
bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
|
|
61
|
-
}
|
|
62
|
-
return btoa(bin);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Decode only the leading bytes — enough for a magic-number sniff.
|
|
66
|
-
*
|
|
67
|
-
* `atob` is STRICTER than the `Buffer.from(s,'base64')` this replaced: it throws
|
|
68
|
-
* on a prefix whose length is not a multiple of 4, and on stray padding. So take
|
|
69
|
-
* a 4-aligned prefix and never let a malformed string propagate — an unsniffable
|
|
70
|
-
* blob falls back to the caller's default rather than failing the tool call.
|
|
71
|
-
*/
|
|
72
|
-
function base64Head(base64, n = 12) {
|
|
73
|
-
const want = Math.ceil((n * 4) / 3);
|
|
74
|
-
const aligned = base64.slice(0, Math.min(base64.length, want) & ~3);
|
|
75
|
-
if (!aligned)
|
|
76
|
-
return new Uint8Array(0);
|
|
77
|
-
let bin;
|
|
78
|
-
try {
|
|
79
|
-
bin = atob(aligned);
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return new Uint8Array(0);
|
|
83
|
-
}
|
|
84
|
-
const out = new Uint8Array(Math.min(n, bin.length));
|
|
85
|
-
for (let i = 0; i < out.length; i++)
|
|
86
|
-
out[i] = bin.charCodeAt(i);
|
|
87
|
-
return out;
|
|
88
|
-
}
|
|
89
|
-
function ascii(b, start, end) {
|
|
90
|
-
let s = '';
|
|
91
|
-
for (let i = start; i < end && i < b.length; i++)
|
|
92
|
-
s += String.fromCharCode(b[i]);
|
|
93
|
-
return s;
|
|
94
|
-
}
|
|
95
|
-
export function sniffImageMediaType(base64) {
|
|
96
|
-
const head = base64Head(base64);
|
|
97
|
-
if (head.length >= 4 && head[0] === 0x89 && head[1] === 0x50 && head[2] === 0x4e && head[3] === 0x47)
|
|
98
|
-
return 'image/png';
|
|
99
|
-
if (head.length >= 3 && head[0] === 0xff && head[1] === 0xd8 && head[2] === 0xff)
|
|
100
|
-
return 'image/jpeg';
|
|
101
|
-
if (head.length >= 12 && ascii(head, 0, 4) === 'RIFF' && ascii(head, 8, 12) === 'WEBP')
|
|
102
|
-
return 'image/webp';
|
|
103
|
-
if (head.length >= 4 && ascii(head, 0, 3) === 'GIF')
|
|
104
|
-
return 'image/gif';
|
|
105
|
-
return 'image/png';
|
|
106
|
-
}
|
|
107
|
-
/** Sniff an audio media type from magic bytes; unknown ⇒ mpeg (Freesound previews are mp3). */
|
|
108
|
-
export function sniffAudioMediaType(base64) {
|
|
109
|
-
const head = base64Head(base64);
|
|
110
|
-
if (head.length >= 4 && ascii(head, 0, 4) === 'OggS')
|
|
111
|
-
return 'audio/ogg';
|
|
112
|
-
if (head.length >= 12 && ascii(head, 0, 4) === 'RIFF' && ascii(head, 8, 12) === 'WAVE')
|
|
113
|
-
return 'audio/wav';
|
|
114
|
-
if (head.length >= 4 && ascii(head, 4, 8) === 'ftyp')
|
|
115
|
-
return 'audio/mp4';
|
|
116
|
-
if (head.length >= 3 && ascii(head, 0, 3) === 'ID3')
|
|
117
|
-
return 'audio/mpeg';
|
|
118
|
-
if (head.length >= 2 && head[0] === 0xff && (head[1] & 0xe0) === 0xe0)
|
|
119
|
-
return 'audio/mpeg';
|
|
120
|
-
return 'audio/mpeg';
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* A tool result that carries the JSON payload as text AND the pixels/samples the
|
|
124
|
-
* agent needs to judge it.
|
|
125
|
-
*
|
|
126
|
-
* THE CONTRACT, and why it is shaped this way:
|
|
127
|
-
* - Media is ADDITIVE. The JSON text block is always first and unchanged, so ids,
|
|
128
|
-
* urls and flags keep flowing and nothing downstream breaks.
|
|
129
|
-
* - Zero media ⇒ NO media blocks at all, just the text. An empty content array is
|
|
130
|
-
* the one failure the old `(b) images never leave execute() content-shaped`
|
|
131
|
-
* constraint was written to avoid (adapter.ts:384-390) — the fix for "empty
|
|
132
|
-
* array is invalid" is to omit the block, not to convert every image to text
|
|
133
|
-
* forever.
|
|
134
|
-
* - Media types are SNIFFED per item, never declared by the caller.
|
|
135
|
-
*/
|
|
136
|
-
export function withMedia(payload, media) {
|
|
137
|
-
const blocks = [{ type: 'text', text: payload }];
|
|
138
|
-
for (const m of media) {
|
|
139
|
-
if (!m.data)
|
|
140
|
-
continue;
|
|
141
|
-
blocks.push(m.kind === 'image'
|
|
142
|
-
? { type: 'image', data: m.data, mimeType: sniffImageMediaType(m.data) }
|
|
143
|
-
: { type: 'audio', data: m.data, mimeType: sniffAudioMediaType(m.data) });
|
|
144
|
-
}
|
|
145
|
-
return { content: blocks };
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Fetch a URL and return its bytes as base64. Returns undefined on ANY failure —
|
|
149
|
-
* a preview that will not load must never fail the tool call it decorates, since
|
|
150
|
-
* the JSON payload is still useful on its own.
|
|
151
|
-
*/
|
|
152
|
-
/**
|
|
153
|
-
* Per-image ceiling. A PREVIEW is a thumbnail — 7KB for a catalog poster, ~30KB
|
|
154
|
-
* for a Pexels preview. 2MB is generous headroom; the old 8MB was sized for
|
|
155
|
-
* "some image" rather than for the thing this actually fetches.
|
|
156
|
-
*/
|
|
157
|
-
const MAX_PREVIEW_BYTES = 2 * 1024 * 1024;
|
|
158
|
-
/**
|
|
159
|
-
* Cumulative ceiling across ONE tool response.
|
|
160
|
-
*
|
|
161
|
-
* Convex caps an httpAction response at 20MB
|
|
162
|
-
* (https://docs.convex.dev/production/state/limits), and base64 inflates bytes
|
|
163
|
-
* by 4/3. The count cap alone did NOT bound this: 12 images x the old 8MB
|
|
164
|
-
* per-image limit is 96MB raw => ~128MB encoded, six times over the ceiling. A
|
|
165
|
-
* count is not a size. 3MB raw (~4MB encoded) leaves the response comfortably
|
|
166
|
-
* inside the limit with room for the JSON payload.
|
|
167
|
-
*/
|
|
168
|
-
const MAX_PREVIEW_BYTES_TOTAL = 3 * 1024 * 1024;
|
|
169
|
-
export async function fetchAsBase64(url, opts) {
|
|
170
|
-
const timeoutMs = opts?.timeoutMs ?? 10_000;
|
|
171
|
-
const maxBytes = opts?.maxBytes ?? MAX_PREVIEW_BYTES;
|
|
172
|
-
try {
|
|
173
|
-
const ctl = new AbortController();
|
|
174
|
-
const t = setTimeout(() => ctl.abort(), timeoutMs);
|
|
175
|
-
const res = await fetch(url, { signal: ctl.signal });
|
|
176
|
-
clearTimeout(t);
|
|
177
|
-
if (!res.ok)
|
|
178
|
-
return undefined;
|
|
179
|
-
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
180
|
-
if (bytes.byteLength === 0 || bytes.byteLength > maxBytes)
|
|
181
|
-
return undefined;
|
|
182
|
-
return bytesToBase64(bytes);
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
// Log the REASON. Swallowing this is what hid a Buffer-not-defined crash in
|
|
186
|
-
// the Convex isolate behind an innocent-looking "no previews available".
|
|
187
|
-
console.log(JSON.stringify({ evt: 'preview_fetch_failed', err: err instanceof Error ? err.message : String(err) }));
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Fetch up to `cap` previews concurrently, preserving input order and dropping
|
|
193
|
-
* failures. The cap is a TOKEN budget, not a correctness one: a contact sheet of
|
|
194
|
-
* a dozen downscaled thumbnails is the difference between an agent that can see
|
|
195
|
-
* and one that blows its context on one full-size still.
|
|
196
|
-
*/
|
|
197
|
-
/**
|
|
198
|
-
* Preview cache, keyed by URL.
|
|
199
|
-
*
|
|
200
|
-
* `list_catalog` re-fetched up to 12 posters on EVERY call, and their keys are
|
|
201
|
-
* content-addressed (`<id>@<version>.jpg`) — they can never change, so that was
|
|
202
|
-
* pure repeat work on the hottest discovery verb. Convex reuses a warm isolate
|
|
203
|
-
* across invocations, so a module-level map is the cheapest correct place for
|
|
204
|
-
* this: no new substrate, nothing to invalidate, and it evaporates with the
|
|
205
|
-
* isolate. Presigned R2 URLs carry a fresh signature per call, so they simply
|
|
206
|
-
* never hit — correct by construction rather than by a rule someone must
|
|
207
|
-
* remember.
|
|
208
|
-
*/
|
|
209
|
-
const previewCache = new Map();
|
|
210
|
-
const PREVIEW_CACHE_MAX = 64;
|
|
211
|
-
function cacheGet(url) {
|
|
212
|
-
const hit = previewCache.get(url);
|
|
213
|
-
if (hit === undefined)
|
|
214
|
-
return undefined;
|
|
215
|
-
// refresh recency
|
|
216
|
-
previewCache.delete(url);
|
|
217
|
-
previewCache.set(url, hit);
|
|
218
|
-
return hit;
|
|
219
|
-
}
|
|
220
|
-
function cachePut(url, data) {
|
|
221
|
-
if (previewCache.size >= PREVIEW_CACHE_MAX) {
|
|
222
|
-
const oldest = previewCache.keys().next().value;
|
|
223
|
-
if (oldest !== undefined)
|
|
224
|
-
previewCache.delete(oldest);
|
|
225
|
-
}
|
|
226
|
-
previewCache.set(url, data);
|
|
227
|
-
}
|
|
228
|
-
/** Test seam — the cache is module-level and outlives a single test. */
|
|
229
|
-
export function __resetPreviewCache() {
|
|
230
|
-
previewCache.clear();
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Fetch up to `cap` previews, preserving input order and dropping failures.
|
|
234
|
-
*
|
|
235
|
-
* Bounded by BOTH a count and a cumulative byte budget: the count keeps the
|
|
236
|
-
* contact sheet legible, the bytes keep the response inside Convex's 20MB
|
|
237
|
-
* httpAction ceiling. Sequential rather than parallel because the budget has to
|
|
238
|
-
* be spent in order — a parallel batch cannot know it has already overspent.
|
|
239
|
-
*/
|
|
240
|
-
export async function fetchPreviews(urls, cap = 12, opts) {
|
|
241
|
-
const picked = urls.filter((u) => !!u).slice(0, cap);
|
|
242
|
-
const out = [];
|
|
243
|
-
let spent = 0;
|
|
244
|
-
for (const u of picked) {
|
|
245
|
-
const cached = opts?.fetchOne ? undefined : cacheGet(u);
|
|
246
|
-
const data = cached ??
|
|
247
|
-
(opts?.fetchOne
|
|
248
|
-
? await opts.fetchOne(u).catch(() => undefined)
|
|
249
|
-
: await fetchAsBase64(u, opts));
|
|
250
|
-
if (!data)
|
|
251
|
-
continue;
|
|
252
|
-
// base64 length is a close proxy for encoded bytes; budget on what we SEND.
|
|
253
|
-
if (spent + data.length > MAX_PREVIEW_BYTES_TOTAL * 1.34)
|
|
254
|
-
break;
|
|
255
|
-
spent += data.length;
|
|
256
|
-
if (!cached && !opts?.fetchOne)
|
|
257
|
-
cachePut(u, data);
|
|
258
|
-
out.push(data);
|
|
259
|
-
}
|
|
260
|
-
return out;
|
|
261
|
-
}
|
|
262
|
-
// ── error formatting (reuses the SDK's advice table) ──────────────────────
|
|
263
|
-
export function fmtErr(err) {
|
|
264
|
-
const head = err instanceof ApiError
|
|
265
|
-
? `${err.message} (${err.code}, ${err.status})`
|
|
266
|
-
: err instanceof Error
|
|
267
|
-
? err.message
|
|
268
|
-
: String(err);
|
|
269
|
-
const advice = adviseError(err);
|
|
270
|
-
return advice ? `${head}\n → ${advice}` : head;
|
|
271
|
-
}
|
|
272
|
-
/** Reconstruct an ApiError from a non-2xx executor response so adviseError works. */
|
|
273
|
-
export function apiErrorFrom(res) {
|
|
274
|
-
let code = 'internal_error';
|
|
275
|
-
let message = res.text || `HTTP ${res.status}`;
|
|
276
|
-
let details;
|
|
277
|
-
try {
|
|
278
|
-
const j = JSON.parse(res.text);
|
|
279
|
-
if (j && typeof j === 'object' && j.error) {
|
|
280
|
-
code = j.error.code ?? code;
|
|
281
|
-
message = j.error.message ?? message;
|
|
282
|
-
details = j.error.details;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
/* non-JSON body — keep the raw text as the message */
|
|
287
|
-
}
|
|
288
|
-
return new ApiError(res.status, { code, message, details }, res.requestId);
|
|
289
|
-
}
|
|
290
|
-
export function isOk(status) {
|
|
291
|
-
return status >= 200 && status < 300;
|
|
292
|
-
}
|
|
293
|
-
export function safeParse(textBody) {
|
|
294
|
-
try {
|
|
295
|
-
return JSON.parse(textBody);
|
|
296
|
-
}
|
|
297
|
-
catch {
|
|
298
|
-
return undefined;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
// ── generated-manifest accessors ──────────────────────────────────────────
|
|
302
|
-
const OP_BY_ID = new Map(GENERATED_OPERATIONS.map((o) => [o.operationId, o]));
|
|
303
|
-
/** Look up a generated operation by id; throws (fail-loud) if absent. */
|
|
304
|
-
export function opById(operationId) {
|
|
305
|
-
const op = OP_BY_ID.get(operationId);
|
|
306
|
-
if (!op) {
|
|
307
|
-
throw new Error(`MCP: no generated operation '${operationId}'. The op-manifest (generated/operations.ts) is out of sync — run \`pnpm generate:mcp-tools\`.`);
|
|
308
|
-
}
|
|
309
|
-
return op;
|
|
310
|
-
}
|
|
311
|
-
/** The bound zod body schema for an operation, or undefined for body-less ops. */
|
|
312
|
-
export function bodySchemaFor(op) {
|
|
313
|
-
if (!op.bodyKey)
|
|
314
|
-
return undefined;
|
|
315
|
-
const schema = bodySchemas[op.bodyKey];
|
|
316
|
-
if (!schema) {
|
|
317
|
-
throw new Error(`MCP: bodySchemas.${op.bodyKey} not found for '${op.operationId}'. Run \`pnpm generate:sdk\`.`);
|
|
318
|
-
}
|
|
319
|
-
return schema;
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Substitute path params into an op's template. `mapArg(opParamName)` returns the
|
|
323
|
-
* concrete value (raw layer: the arg of the same name; curated layer: the friendly
|
|
324
|
-
* arg mapped to this op param). Values are URL-encoded.
|
|
325
|
-
*/
|
|
326
|
-
export function buildPath(op, mapArg) {
|
|
327
|
-
let path = op.pathTemplate;
|
|
328
|
-
for (const p of op.pathParams) {
|
|
329
|
-
path = path.replace(`{${p}}`, encodeURIComponent(String(mapArg(p))));
|
|
330
|
-
}
|
|
331
|
-
return path;
|
|
332
|
-
}
|
|
333
|
-
/** Run an operation through the executor. `body` is sent only for bodied ops. */
|
|
334
|
-
export async function invokeOp(ex, op, mapArg, body,
|
|
335
|
-
/** base64 PAYMENT-SIGNATURE for a paid (x402) tool call; omitted for authed calls. */
|
|
336
|
-
payment,
|
|
337
|
-
/** Pre-encoded query string (no leading '?') — curated queryArgs filters. */
|
|
338
|
-
query) {
|
|
339
|
-
return ex.invoke({
|
|
340
|
-
method: op.method,
|
|
341
|
-
path: buildPath(op, mapArg),
|
|
342
|
-
body: op.bodyKey ? (body ?? {}) : undefined,
|
|
343
|
-
...(query ? { query } : {}),
|
|
344
|
-
payment,
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Surface a canonical x402 `PaymentRequired` challenge as the MCP result an
|
|
349
|
-
* x402-aware client acts on. Emit the PaymentRequired JSON in BOTH carriers:
|
|
350
|
-
* `content[0].text` (the spec-required carrier a content-first client parses —
|
|
351
|
-
* matching @x402/mcp's own reference server) AND `structuredContent` (the
|
|
352
|
-
* preferred carrier the pinned client reads first). The envelope already carries
|
|
353
|
-
* a top-level human `error` string, so a non-x402 LLM client still reads a
|
|
354
|
-
* legible reason. `paymentRequired` is pre-parsed + shape-checked by the caller.
|
|
355
|
-
*/
|
|
356
|
-
function paymentRequiredResult(paymentRequired) {
|
|
357
|
-
return {
|
|
358
|
-
content: [{ type: 'text', text: JSON.stringify(paymentRequired) }],
|
|
359
|
-
isError: true,
|
|
360
|
-
structuredContent: paymentRequired,
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Run an op through the executor with x402 pay-per-call support (used by every
|
|
365
|
-
* tool). Reads the client's signed payment from the tool call `_meta`, forwards
|
|
366
|
-
* it as `PAYMENT-SIGNATURE` so the REST x402 middleware verifies + settles (the
|
|
367
|
-
* SAME money path as a direct REST call), turns an inner 402 into a
|
|
368
|
-
* payment-required result, and attaches the settle receipt on success.
|
|
369
|
-
* `formatOk` builds the success result from the executor response; `label` names
|
|
370
|
-
* the tool for the error message. Payment-free (key/OAuth) calls are unaffected.
|
|
371
|
-
*/
|
|
372
|
-
export async function dispatchOp(ex, op, mapArg, body, extra, label, formatOk) {
|
|
373
|
-
const paymentObj = extractPaymentFromMeta(extra?._meta);
|
|
374
|
-
const payment = paymentObj ? encodePaymentSignature(paymentObj) : undefined;
|
|
375
|
-
const res = await invokeOp(ex, op, mapArg, body, payment);
|
|
376
|
-
// Discriminate the x402 challenge from the OTHER errors that share HTTP 402
|
|
377
|
-
// (billing_required, generation_budget_exceeded, payment_invalid, …): only a
|
|
378
|
-
// real PaymentRequired body ({x402Version, accepts[]}) becomes a "pay with
|
|
379
|
-
// x402" result; everything else falls through to its typed error advice.
|
|
380
|
-
if (res.status === MCP_PAYMENT_REQUIRED_CODE) {
|
|
381
|
-
const parsed = safeParse(res.text);
|
|
382
|
-
if (isX402PaymentRequired(parsed))
|
|
383
|
-
return paymentRequiredResult(parsed);
|
|
384
|
-
}
|
|
385
|
-
if (!isOk(res.status))
|
|
386
|
-
return errText(`${label} failed: ${fmtErr(apiErrorFrom(res))}`);
|
|
387
|
-
// No receipt attach: settle is async (see x402.ts) — the caller reads the final
|
|
388
|
-
// outcome from x402Payments, not an inline `_meta["x402/payment-response"]`.
|
|
389
|
-
return formatOk(res);
|
|
390
|
-
}
|