@tangle-network/agent-app 0.11.1 → 0.13.0
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/dist/DesignCanvas-3JEEIT6Y.js +10 -0
- package/dist/DesignCanvas-3JEEIT6Y.js.map +1 -0
- package/dist/DesignCanvasEditor-37LPJIIR.js +9 -0
- package/dist/DesignCanvasEditor-37LPJIIR.js.map +1 -0
- package/dist/TimelineEditor-OXPJZDP2.js +12 -0
- package/dist/TimelineEditor-OXPJZDP2.js.map +1 -0
- package/dist/apply-Cp8c3K9D.d.ts +249 -0
- package/dist/chunk-2Q73HGDI.js +1743 -0
- package/dist/chunk-2Q73HGDI.js.map +1 -0
- package/dist/chunk-6UOE5CTA.js +1647 -0
- package/dist/chunk-6UOE5CTA.js.map +1 -0
- package/dist/chunk-7QCIYDGC.js +1119 -0
- package/dist/chunk-7QCIYDGC.js.map +1 -0
- package/dist/chunk-A76ZHWNF.js +194 -0
- package/dist/chunk-A76ZHWNF.js.map +1 -0
- package/dist/chunk-ABGSFUJQ.js +111 -0
- package/dist/chunk-ABGSFUJQ.js.map +1 -0
- package/dist/{chunk-4YTWB5MG.js → chunk-ETX4O4BB.js} +98 -1
- package/dist/chunk-ETX4O4BB.js.map +1 -0
- package/dist/chunk-F5KTWRO7.js +2276 -0
- package/dist/chunk-F5KTWRO7.js.map +1 -0
- package/dist/chunk-IHR6K3GF.js +2367 -0
- package/dist/chunk-IHR6K3GF.js.map +1 -0
- package/dist/chunk-JZAJE3JL.js +990 -0
- package/dist/chunk-JZAJE3JL.js.map +1 -0
- package/dist/chunk-ZYBWGSAZ.js +130 -0
- package/dist/chunk-ZYBWGSAZ.js.map +1 -0
- package/dist/design-canvas/drizzle.d.ts +569 -0
- package/dist/design-canvas/drizzle.js +183 -0
- package/dist/design-canvas/drizzle.js.map +1 -0
- package/dist/design-canvas/index.d.ts +261 -0
- package/dist/design-canvas/index.js +96 -0
- package/dist/design-canvas/index.js.map +1 -0
- package/dist/design-canvas-react/index.d.ts +916 -0
- package/dist/design-canvas-react/index.js +423 -0
- package/dist/design-canvas-react/index.js.map +1 -0
- package/dist/export-presets-Dl5Aa5xj.d.ts +284 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.js +224 -6
- package/dist/mcp-CIupfjxV.d.ts +112 -0
- package/dist/mcp-rpc-DLw_r9PQ.d.ts +55 -0
- package/dist/model-BHLN208Z.d.ts +183 -0
- package/dist/runtime/index.d.ts +108 -1
- package/dist/runtime/index.js +7 -1
- package/dist/sequences/drizzle.d.ts +1244 -0
- package/dist/sequences/drizzle.js +368 -0
- package/dist/sequences/drizzle.js.map +1 -0
- package/dist/sequences/index.d.ts +331 -0
- package/dist/sequences/index.js +114 -0
- package/dist/sequences/index.js.map +1 -0
- package/dist/sequences-react/index.d.ts +752 -0
- package/dist/sequences-react/index.js +241 -0
- package/dist/sequences-react/index.js.map +1 -0
- package/dist/store-CUStmtdH.d.ts +64 -0
- package/dist/store-gckrNq-g.d.ts +242 -0
- package/dist/tools/index.d.ts +25 -108
- package/dist/tools/index.js +16 -6
- package/package.json +62 -2
- package/dist/chunk-4YTWB5MG.js.map +0 -1
- package/dist/chunk-OLCVUGGI.js +0 -137
- package/dist/chunk-OLCVUGGI.js.map +0 -1
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { j as SequenceMediaKind, o as SequenceTimeline, r as TimelineInterval, m as SequenceStore } from '../store-gckrNq-g.js';
|
|
2
|
+
export { M as MIN_SEQUENCE_CLIP_FRAMES, N as NewSequenceClip, a as NewSequenceDecision, b as NewSequenceTrack, S as SequenceClip, c as SequenceClipMedia, d as SequenceClipPatch, e as SequenceDecision, f as SequenceExportFormat, g as SequenceExportRecord, h as SequenceExportStatus, i as SequenceFrameSnapshot, k as SequenceMeta, l as SequenceStatus, n as SequenceStoreScope, p as SequenceTrack, q as SequenceTrackKind, T as TimelineClipBounds, s as assertClipFitsSequence, t as chooseCaptionPlacement, u as clampClipDuration, v as clampClipStart, w as formatSeconds, x as formatTimecode, y as framesToSeconds, z as secondsToFrames, A as snapshotFrame, B as trackIntervals } from '../store-gckrNq-g.js';
|
|
3
|
+
export { A as AddCaptionOperation, C as CaptionTargetResolution, a as CreateTrackOperation, D as DeleteClipOperation, E as ExtendSequenceOperation, M as MoveClipOperation, P as PlaceClipOperation, Q as QueueExportOperation, S as SEQUENCE_OPERATION_TYPES, b as SequenceApplyResult, c as SequenceOperation, d as SequenceOperationContext, e as SequenceOperationType, f as SequencePlan, g as SetClipDisabledOperation, h as SetClipTextOperation, i as SplitClipOperation, T as TrimClipOperation, j as applySequenceOperation, k as applySequenceOperations, l as assertSequenceMediaUrl, m as captionTrackNameForLanguage, n as lastClipEndFrame, p as parseSequenceOperations, r as resolveCaptionPlacement, o as resolveCaptionTarget, q as resolvePlaceClipTrack, v as validateAddCaption, s as validateCreateTrack, t as validateDeleteClip, u as validateExtendSequence, w as validateMoveClip, x as validatePlaceClip, y as validateQueueExport, z as validateSequenceOperation, B as validateSequenceOperations, F as validateSetClipDisabled, G as validateSetClipText, H as validateSplitClip, I as validateTrimClip } from '../apply-Cp8c3K9D.js';
|
|
4
|
+
import { f as ToolHeaderNames, a as AppToolMcpServer } from '../mcp-CIupfjxV.js';
|
|
5
|
+
import { b as AppToolContext } from '../types-By4B3K37.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Pure interchange-format builders over `SequenceTimeline` — SRT, WebVTT,
|
|
9
|
+
* CMX3600 EDL, OpenTimelineIO JSON, and the contact-sheet manifest. mp4
|
|
10
|
+
* rendering needs ffmpeg and stays product-side; everything here is
|
|
11
|
+
* deterministic frame math producing strings or JSON-serializable documents.
|
|
12
|
+
*
|
|
13
|
+
* Builders throw instead of emitting empty documents: an empty subtitle file
|
|
14
|
+
* or zero-event EDL downloads "successfully" and then fails silently inside
|
|
15
|
+
* the user's player or NLE — the worst failure mode for an agent-driven
|
|
16
|
+
* editor. The one exception is OTIO, which meaningfully round-trips sequence
|
|
17
|
+
* settings (fps, dimensions, track structure) even with zero clips.
|
|
18
|
+
*
|
|
19
|
+
* Disabled clips are excluded from every format: an export reflects what
|
|
20
|
+
* renders, and a cue or event for an invisible clip is a lie.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
interface CaptionExportOptions {
|
|
24
|
+
/** BCP-47 tag; matched case-insensitively against `clip.language`. Clips
|
|
25
|
+
* with no language never match a language-scoped export. */
|
|
26
|
+
language?: string;
|
|
27
|
+
}
|
|
28
|
+
/** Numbered SubRip cues from caption-track clips, in timeline order. Throws
|
|
29
|
+
* when no cue survives filtering — see module doc on empty documents. */
|
|
30
|
+
declare function buildSrt(timeline: SequenceTimeline, opts?: CaptionExportOptions): string;
|
|
31
|
+
/** WebVTT with numbered cue identifiers; same filtering and frame math as
|
|
32
|
+
* `buildSrt`, dot millisecond separator per the VTT grammar. */
|
|
33
|
+
declare function buildVtt(timeline: SequenceTimeline, opts?: CaptionExportOptions): string;
|
|
34
|
+
/** CMX3600-style EDL: one event per enabled video/audio clip in record-start
|
|
35
|
+
* order. Source in/out come from `sourceInFrame` + `durationFrames`; record
|
|
36
|
+
* in/out from `startFrame`. Timecodes are non-drop `HH:MM:SS:FF` at the
|
|
37
|
+
* sequence fps. Throws when the timeline has no video/audio clips. */
|
|
38
|
+
declare function buildEdl(timeline: SequenceTimeline): string;
|
|
39
|
+
interface OtioRationalTime {
|
|
40
|
+
OTIO_SCHEMA: 'RationalTime.1';
|
|
41
|
+
rate: number;
|
|
42
|
+
value: number;
|
|
43
|
+
}
|
|
44
|
+
interface OtioTimeRange {
|
|
45
|
+
OTIO_SCHEMA: 'TimeRange.1';
|
|
46
|
+
start_time: OtioRationalTime;
|
|
47
|
+
duration: OtioRationalTime;
|
|
48
|
+
}
|
|
49
|
+
interface OtioExternalReference {
|
|
50
|
+
OTIO_SCHEMA: 'ExternalReference.1';
|
|
51
|
+
target_url: string;
|
|
52
|
+
/** Natural extent of the source media when known; null when unknown. */
|
|
53
|
+
available_range: OtioTimeRange | null;
|
|
54
|
+
}
|
|
55
|
+
interface OtioMissingReference {
|
|
56
|
+
OTIO_SCHEMA: 'MissingReference.1';
|
|
57
|
+
}
|
|
58
|
+
interface OtioGap {
|
|
59
|
+
OTIO_SCHEMA: 'Gap.1';
|
|
60
|
+
name: string;
|
|
61
|
+
source_range: OtioTimeRange;
|
|
62
|
+
}
|
|
63
|
+
interface OtioClip {
|
|
64
|
+
OTIO_SCHEMA: 'Clip.2';
|
|
65
|
+
name: string;
|
|
66
|
+
source_range: OtioTimeRange;
|
|
67
|
+
media_reference: OtioExternalReference | OtioMissingReference;
|
|
68
|
+
metadata: Record<string, unknown>;
|
|
69
|
+
}
|
|
70
|
+
interface OtioTrack {
|
|
71
|
+
OTIO_SCHEMA: 'Track.1';
|
|
72
|
+
name: string;
|
|
73
|
+
kind: 'Video' | 'Audio';
|
|
74
|
+
metadata: Record<string, unknown>;
|
|
75
|
+
children: Array<OtioClip | OtioGap>;
|
|
76
|
+
}
|
|
77
|
+
interface OtioStack {
|
|
78
|
+
OTIO_SCHEMA: 'Stack.1';
|
|
79
|
+
name: string;
|
|
80
|
+
children: OtioTrack[];
|
|
81
|
+
}
|
|
82
|
+
interface OtioTimeline {
|
|
83
|
+
OTIO_SCHEMA: 'Timeline.1';
|
|
84
|
+
name: string;
|
|
85
|
+
global_start_time: OtioRationalTime;
|
|
86
|
+
metadata: Record<string, unknown>;
|
|
87
|
+
tracks: OtioStack;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* OpenTimelineIO `Timeline.1` document. Serialize with `JSON.stringify` at the
|
|
91
|
+
* file-write edge.
|
|
92
|
+
*
|
|
93
|
+
* OTIO track children are SEQUENTIAL — position comes from accumulated child
|
|
94
|
+
* durations, so timeline gaps become explicit `Gap.1` children and two enabled
|
|
95
|
+
* clips overlapping on one track are unrepresentable (throws). Caption and
|
|
96
|
+
* reference tracks export as `Video` tracks (OTIO has no caption kind) with
|
|
97
|
+
* the original kind preserved in `metadata.sequenceTrackKind`; agent tracks
|
|
98
|
+
* carry decision markers, never media, and are excluded.
|
|
99
|
+
*/
|
|
100
|
+
declare function buildOtio(timeline: SequenceTimeline): OtioTimeline;
|
|
101
|
+
interface ContactSheetEntry {
|
|
102
|
+
clipId: string;
|
|
103
|
+
trackId: string;
|
|
104
|
+
label: string;
|
|
105
|
+
/** Timeline frame the sample represents — the clip midpoint. */
|
|
106
|
+
frame: number;
|
|
107
|
+
/** `m:ss.ff` timecode of `frame`, for human-readable sheet labels. */
|
|
108
|
+
timecode: string;
|
|
109
|
+
/** Source-media frame to extract: `sourceInFrame` + midpoint offset for
|
|
110
|
+
* video, always 0 for stills (a seek into an image yields nothing). */
|
|
111
|
+
sourceFrame: number;
|
|
112
|
+
sourceSeconds: number;
|
|
113
|
+
url: string;
|
|
114
|
+
mediaKind: SequenceMediaKind;
|
|
115
|
+
}
|
|
116
|
+
interface ContactSheetManifest {
|
|
117
|
+
sequenceId: string;
|
|
118
|
+
title: string;
|
|
119
|
+
fps: number;
|
|
120
|
+
width: number;
|
|
121
|
+
height: number;
|
|
122
|
+
entries: ContactSheetEntry[];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* One sample frame per enabled video-track clip with resolved, completed
|
|
126
|
+
* media — the product side renders the actual sheet (needs ffmpeg/canvas).
|
|
127
|
+
* Clips whose media is still rendering upstream (`providerStatus` queued/
|
|
128
|
+
* processing/failed) have no extractable frame and are excluded; audio media
|
|
129
|
+
* on a video track likewise. Throws when nothing is sampleable — see module
|
|
130
|
+
* doc on empty documents.
|
|
131
|
+
*/
|
|
132
|
+
declare function buildContactSheetManifest(timeline: SequenceTimeline): ContactSheetManifest;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Caption planning — pure, server-safe helpers that turn transcripts into
|
|
136
|
+
* frame-typed caption chunks and answer "are captions complete?" per language.
|
|
137
|
+
* No store access, no React, no provider coupling: products feed transcript
|
|
138
|
+
* segments in (from any transcription provider) and get chunk bounds out,
|
|
139
|
+
* ready to become `add_caption` operations.
|
|
140
|
+
*
|
|
141
|
+
* All outputs are integer frames at the sequence fps. Seconds appear only on
|
|
142
|
+
* the transcript-segment inputs, because that is what transcription providers
|
|
143
|
+
* emit; the conversion happens exactly once, here.
|
|
144
|
+
*/
|
|
145
|
+
|
|
146
|
+
/** Server twin of `TranscriptionSegment` (../sequences-react/contracts) —
|
|
147
|
+
* structurally identical so react-side transcription output feeds
|
|
148
|
+
* `buildCaptionChunks` without mapping. Keep the shapes in lockstep. */
|
|
149
|
+
interface TranscriptSegment {
|
|
150
|
+
text: string;
|
|
151
|
+
startSeconds: number;
|
|
152
|
+
endSeconds: number;
|
|
153
|
+
}
|
|
154
|
+
/** One caption clip's worth of text with its timeline bounds. */
|
|
155
|
+
interface CaptionChunk {
|
|
156
|
+
text: string;
|
|
157
|
+
startFrame: number;
|
|
158
|
+
durationFrames: number;
|
|
159
|
+
}
|
|
160
|
+
interface BuildCaptionChunksOptions {
|
|
161
|
+
/** Upper bound on words per caption; segments split on word boundaries. */
|
|
162
|
+
maxWordsPerChunk?: number;
|
|
163
|
+
/** Readability floor — chunks shorter than this are extended, never
|
|
164
|
+
* overlapped: the following chunk's start is pushed forward instead. */
|
|
165
|
+
minDurationSeconds?: number;
|
|
166
|
+
fps: number;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Split transcript segments into caption chunks. Within each segment, time is
|
|
170
|
+
* apportioned to chunks by word count (a constant words-per-second estimate).
|
|
171
|
+
* Guarantees, across the WHOLE output regardless of segment boundaries:
|
|
172
|
+
*
|
|
173
|
+
* - starts are strictly increasing and chunks never overlap
|
|
174
|
+
* - every chunk lasts at least the min-duration clamp (and at least
|
|
175
|
+
* `MIN_SEQUENCE_CLIP_FRAMES`)
|
|
176
|
+
* - a chunk may extend past its segment's end by at most the clamp — the cost
|
|
177
|
+
* of the readability floor on short tails
|
|
178
|
+
*
|
|
179
|
+
* Whitespace-only segments produce no chunks. Segments may arrive unsorted
|
|
180
|
+
* (providers emit per-channel batches); they are ordered by start before
|
|
181
|
+
* chunking so the no-overlap guarantee holds.
|
|
182
|
+
*/
|
|
183
|
+
declare function buildCaptionChunks(segments: TranscriptSegment[], opts: BuildCaptionChunksOptions): CaptionChunk[];
|
|
184
|
+
/**
|
|
185
|
+
* Normalize a BCP-47 tag to conventional casing: primary subtag lowercase,
|
|
186
|
+
* 4-letter script subtags Title Case, 2-letter region subtags UPPER, all other
|
|
187
|
+
* subtags lowercase. Throws on empty or structurally invalid tags.
|
|
188
|
+
*/
|
|
189
|
+
declare function normalizeLanguageTag(tag: string): string;
|
|
190
|
+
interface LanguageFanoutOptions {
|
|
191
|
+
languages: string[];
|
|
192
|
+
/** Excluded from the plan (exact normalized match only — 'en' does not
|
|
193
|
+
* exclude 'en-US'; a regional variant of the source is still a valid
|
|
194
|
+
* fan-out target). */
|
|
195
|
+
sourceLanguage?: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Plan which caption languages to generate: normalized, deduped (first
|
|
199
|
+
* occurrence wins), source excluded. Throws on an empty request or any
|
|
200
|
+
* invalid tag — a malformed fan-out request must fail before any generation
|
|
201
|
+
* is queued. Returns [] when every requested language IS the source; the
|
|
202
|
+
* caller reports "nothing to fan out" rather than erroring.
|
|
203
|
+
*/
|
|
204
|
+
declare function planLanguageFanout(opts: LanguageFanoutOptions): string[];
|
|
205
|
+
/** Coverage for one caption language across the sequence. `language` is the
|
|
206
|
+
* clip's stored tag verbatim (no normalization — coverage reports what is
|
|
207
|
+
* actually on the timeline); null groups caption clips with no tag. */
|
|
208
|
+
interface CaptionCoverageEntry {
|
|
209
|
+
language: string | null;
|
|
210
|
+
coveredFrames: number;
|
|
211
|
+
totalFrames: number;
|
|
212
|
+
/** Uncovered intervals, ascending; endFrame exclusive. */
|
|
213
|
+
gaps: TimelineInterval[];
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Per-language caption coverage over [0, durationFrames). A frame counts as
|
|
217
|
+
* covered when an enabled, non-empty-text clip on a caption-kind track spans
|
|
218
|
+
* it. Overlapping clips merge (no double counting). Returns one entry per
|
|
219
|
+
* distinct language, null first then lexicographic; [] when the timeline has
|
|
220
|
+
* no caption clips at all.
|
|
221
|
+
*/
|
|
222
|
+
declare function captionCoverage(timeline: SequenceTimeline): CaptionCoverageEntry[];
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* The sequences MCP tool registry — what the in-sandbox agent sees over the
|
|
226
|
+
* live agent→timeline channel. Each entry carries an LLM-facing description,
|
|
227
|
+
* a JSON Schema for the arguments, and the typed dispatch that converts
|
|
228
|
+
* seconds→frames exactly once, validates the resulting operations, applies
|
|
229
|
+
* them through the store, and records ONE decision row per mutating call.
|
|
230
|
+
*
|
|
231
|
+
* Tool arguments speak SECONDS (the unit an LLM reasons in); everything past
|
|
232
|
+
* this edge is integer frames at the sequence fps. Results come back in
|
|
233
|
+
* snake_case with both seconds and `m:ss.ff` timecodes so the model can quote
|
|
234
|
+
* positions back to the user without doing frame math.
|
|
235
|
+
*
|
|
236
|
+
* Every mutation funnels through the ./validate + ./apply kernel: the WHOLE
|
|
237
|
+
* operation batch validates against pre-state before the first write. Errors
|
|
238
|
+
* thrown anywhere in a tool run (argument shape, validation, store) carry the
|
|
239
|
+
* precise reason — the handler surfaces them verbatim as `isError` tool
|
|
240
|
+
* results the model can act on.
|
|
241
|
+
*/
|
|
242
|
+
|
|
243
|
+
/** Everything one tool invocation needs. Constructed per request by the
|
|
244
|
+
* handler — the store is already scoped + authorized by the product. The
|
|
245
|
+
* playhead is server-set (never a tool argument) so auto-placed captions
|
|
246
|
+
* anchor to what the user is actually looking at. */
|
|
247
|
+
interface SequenceMcpToolEnv {
|
|
248
|
+
store: SequenceStore;
|
|
249
|
+
playheadFrame: number;
|
|
250
|
+
}
|
|
251
|
+
interface SequenceMcpToolDefinition {
|
|
252
|
+
name: string;
|
|
253
|
+
description: string;
|
|
254
|
+
inputSchema: Record<string, unknown>;
|
|
255
|
+
run(args: Record<string, unknown>, env: SequenceMcpToolEnv): Promise<unknown>;
|
|
256
|
+
}
|
|
257
|
+
declare const SEQUENCE_EXPORT_FORMATS: readonly ["mp4", "otio", "xml", "edl", "vtt", "srt", "contact_sheet"];
|
|
258
|
+
declare const SEQUENCE_TRACK_KINDS: readonly ["video", "audio", "caption", "reference", "agent"];
|
|
259
|
+
declare const SEQUENCE_MEDIA_KINDS: readonly ["video", "image", "audio"];
|
|
260
|
+
/** Largest accepted `add_captions` batch — bounds one decision row / one
|
|
261
|
+
* validation pass to a size the store can absorb in a single request. */
|
|
262
|
+
declare const MAX_CAPTION_BATCH = 500;
|
|
263
|
+
declare const SEQUENCE_MCP_TOOLS: readonly SequenceMcpToolDefinition[];
|
|
264
|
+
declare function findSequenceMcpTool(name: string): SequenceMcpToolDefinition | undefined;
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Streamable-HTTP MCP server for one sequence — the live agent→timeline
|
|
268
|
+
* channel. JSON-RPC 2.0 over POST, stateless per request (Workers-compatible:
|
|
269
|
+
* no session table, no SSE — a tools-only server answers every request with a
|
|
270
|
+
* single `application/json` body, which the streamable-HTTP transport
|
|
271
|
+
* explicitly permits).
|
|
272
|
+
*
|
|
273
|
+
* Trust boundary: the PRODUCT authenticates the request (capability token,
|
|
274
|
+
* workspace RBAC) BEFORE constructing the scoped {@link SequenceStore} and
|
|
275
|
+
* calling this handler — the handler trusts its store completely. Tool
|
|
276
|
+
* execution failures (argument shape, validation, store throws) become
|
|
277
|
+
* `isError` tool results carrying the thrown message verbatim so the model can
|
|
278
|
+
* read WHY and retry; only protocol-level misuse becomes a JSON-RPC error.
|
|
279
|
+
*
|
|
280
|
+
* The envelope (JSON-RPC framing, initialize/ping/tools/list/tools/call,
|
|
281
|
+
* notification 202, -32601) lives in {@link createMcpToolHandler}; this module
|
|
282
|
+
* is a thin adapter wiring the sequences tool list + playhead env.
|
|
283
|
+
*/
|
|
284
|
+
|
|
285
|
+
/** Newest first. The handler echoes the client's requested version when
|
|
286
|
+
* supported, else answers with the newest it speaks (per MCP negotiation the
|
|
287
|
+
* client then disconnects if it cannot use it). */
|
|
288
|
+
declare const SEQUENCES_MCP_PROTOCOL_VERSIONS: readonly ["2025-06-18", "2025-03-26", "2024-11-05"];
|
|
289
|
+
interface SequencesMcpServerInfo {
|
|
290
|
+
name: string;
|
|
291
|
+
version: string;
|
|
292
|
+
}
|
|
293
|
+
interface CreateSequencesMcpHandlerOptions {
|
|
294
|
+
/** Already scoped + authorized for one (workspace, sequence, actor). */
|
|
295
|
+
store: SequenceStore;
|
|
296
|
+
/** Editor playhead at request time, in frames; anchors auto-placed captions.
|
|
297
|
+
* Default 0 (sequence start) for headless callers. */
|
|
298
|
+
playheadFrame?: number;
|
|
299
|
+
serverInfo?: SequencesMcpServerInfo;
|
|
300
|
+
}
|
|
301
|
+
declare function createSequencesMcpHandler(opts: CreateSequencesMcpHandlerOptions): (request: Request) => Promise<Response>;
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Profile entry for the sequences MCP server — what a product spreads into its
|
|
305
|
+
* sandbox `AgentProfile.mcp` map so the in-sandbox agent gets the live
|
|
306
|
+
* timeline channel. Same shape and conventions as the app-tool bridges in
|
|
307
|
+
* ../tools/mcp: transport 'http', capability token in the Authorization
|
|
308
|
+
* header (server-set, never a tool argument), identity headers when the
|
|
309
|
+
* product recovers the user via `authenticateToolRequest`.
|
|
310
|
+
*/
|
|
311
|
+
|
|
312
|
+
declare const DEFAULT_SEQUENCES_MCP_DESCRIPTION = "Live timeline editor for the current video sequence: read timeline state, place/move/trim/split clips, add captions, manage tracks, and queue exports. All times are seconds.";
|
|
313
|
+
interface BuildSequencesMcpServerEntryOptions {
|
|
314
|
+
/** App base URL the sandbox reaches back to (trailing slash tolerated). */
|
|
315
|
+
baseUrl: string;
|
|
316
|
+
/** Product route serving `createSequencesMcpHandler` for ONE sequence —
|
|
317
|
+
* the sequence id is part of the path, never a tool argument. */
|
|
318
|
+
path: string;
|
|
319
|
+
/** Capability token the product minted for this (user, sequence) scope.
|
|
320
|
+
* With no token there is no entry to build — omit the server instead. */
|
|
321
|
+
token: string;
|
|
322
|
+
description?: string;
|
|
323
|
+
/** Identity headers for products whose route recovers the user via
|
|
324
|
+
* `authenticateToolRequest`. Omit when the bearer token is self-contained. */
|
|
325
|
+
ctx?: AppToolContext;
|
|
326
|
+
headerNames?: ToolHeaderNames;
|
|
327
|
+
}
|
|
328
|
+
/** Build the `AgentProfileMcpServer`-shaped entry for the sequences channel. */
|
|
329
|
+
declare function buildSequencesMcpServerEntry(opts: BuildSequencesMcpServerEntryOptions): AppToolMcpServer;
|
|
330
|
+
|
|
331
|
+
export { type BuildCaptionChunksOptions, type BuildSequencesMcpServerEntryOptions, type CaptionChunk, type CaptionCoverageEntry, type CaptionExportOptions, type ContactSheetEntry, type ContactSheetManifest, type CreateSequencesMcpHandlerOptions, DEFAULT_SEQUENCES_MCP_DESCRIPTION, type LanguageFanoutOptions, MAX_CAPTION_BATCH, type OtioClip, type OtioExternalReference, type OtioGap, type OtioMissingReference, type OtioRationalTime, type OtioStack, type OtioTimeRange, type OtioTimeline, type OtioTrack, SEQUENCES_MCP_PROTOCOL_VERSIONS, SEQUENCE_EXPORT_FORMATS, SEQUENCE_MCP_TOOLS, SEQUENCE_MEDIA_KINDS, SEQUENCE_TRACK_KINDS, type SequenceMcpToolDefinition, type SequenceMcpToolEnv, SequenceMediaKind, SequenceStore, SequenceTimeline, type SequencesMcpServerInfo, TimelineInterval, type TranscriptSegment, buildCaptionChunks, buildContactSheetManifest, buildEdl, buildOtio, buildSequencesMcpServerEntry, buildSrt, buildVtt, captionCoverage, createSequencesMcpHandler, findSequenceMcpTool, normalizeLanguageTag, planLanguageFanout };
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_SEQUENCES_MCP_DESCRIPTION,
|
|
3
|
+
MAX_CAPTION_BATCH,
|
|
4
|
+
SEQUENCES_MCP_PROTOCOL_VERSIONS,
|
|
5
|
+
SEQUENCE_EXPORT_FORMATS,
|
|
6
|
+
SEQUENCE_MCP_TOOLS,
|
|
7
|
+
SEQUENCE_MEDIA_KINDS,
|
|
8
|
+
SEQUENCE_OPERATION_TYPES,
|
|
9
|
+
SEQUENCE_TRACK_KINDS,
|
|
10
|
+
applySequenceOperation,
|
|
11
|
+
applySequenceOperations,
|
|
12
|
+
assertSequenceMediaUrl,
|
|
13
|
+
buildCaptionChunks,
|
|
14
|
+
buildContactSheetManifest,
|
|
15
|
+
buildEdl,
|
|
16
|
+
buildOtio,
|
|
17
|
+
buildSequencesMcpServerEntry,
|
|
18
|
+
buildSrt,
|
|
19
|
+
buildVtt,
|
|
20
|
+
captionCoverage,
|
|
21
|
+
captionTrackNameForLanguage,
|
|
22
|
+
createSequencesMcpHandler,
|
|
23
|
+
findSequenceMcpTool,
|
|
24
|
+
lastClipEndFrame,
|
|
25
|
+
normalizeLanguageTag,
|
|
26
|
+
parseSequenceOperations,
|
|
27
|
+
planLanguageFanout,
|
|
28
|
+
resolveCaptionPlacement,
|
|
29
|
+
resolveCaptionTarget,
|
|
30
|
+
resolvePlaceClipTrack,
|
|
31
|
+
validateAddCaption,
|
|
32
|
+
validateCreateTrack,
|
|
33
|
+
validateDeleteClip,
|
|
34
|
+
validateExtendSequence,
|
|
35
|
+
validateMoveClip,
|
|
36
|
+
validatePlaceClip,
|
|
37
|
+
validateQueueExport,
|
|
38
|
+
validateSequenceOperation,
|
|
39
|
+
validateSequenceOperations,
|
|
40
|
+
validateSetClipDisabled,
|
|
41
|
+
validateSetClipText,
|
|
42
|
+
validateSplitClip,
|
|
43
|
+
validateTrimClip
|
|
44
|
+
} from "../chunk-6UOE5CTA.js";
|
|
45
|
+
import {
|
|
46
|
+
MIN_SEQUENCE_CLIP_FRAMES,
|
|
47
|
+
assertClipFitsSequence,
|
|
48
|
+
chooseCaptionPlacement,
|
|
49
|
+
clampClipDuration,
|
|
50
|
+
clampClipStart,
|
|
51
|
+
formatSeconds,
|
|
52
|
+
formatTimecode,
|
|
53
|
+
framesToSeconds,
|
|
54
|
+
secondsToFrames,
|
|
55
|
+
snapshotFrame,
|
|
56
|
+
trackIntervals
|
|
57
|
+
} from "../chunk-ZYBWGSAZ.js";
|
|
58
|
+
import "../chunk-A76ZHWNF.js";
|
|
59
|
+
export {
|
|
60
|
+
DEFAULT_SEQUENCES_MCP_DESCRIPTION,
|
|
61
|
+
MAX_CAPTION_BATCH,
|
|
62
|
+
MIN_SEQUENCE_CLIP_FRAMES,
|
|
63
|
+
SEQUENCES_MCP_PROTOCOL_VERSIONS,
|
|
64
|
+
SEQUENCE_EXPORT_FORMATS,
|
|
65
|
+
SEQUENCE_MCP_TOOLS,
|
|
66
|
+
SEQUENCE_MEDIA_KINDS,
|
|
67
|
+
SEQUENCE_OPERATION_TYPES,
|
|
68
|
+
SEQUENCE_TRACK_KINDS,
|
|
69
|
+
applySequenceOperation,
|
|
70
|
+
applySequenceOperations,
|
|
71
|
+
assertClipFitsSequence,
|
|
72
|
+
assertSequenceMediaUrl,
|
|
73
|
+
buildCaptionChunks,
|
|
74
|
+
buildContactSheetManifest,
|
|
75
|
+
buildEdl,
|
|
76
|
+
buildOtio,
|
|
77
|
+
buildSequencesMcpServerEntry,
|
|
78
|
+
buildSrt,
|
|
79
|
+
buildVtt,
|
|
80
|
+
captionCoverage,
|
|
81
|
+
captionTrackNameForLanguage,
|
|
82
|
+
chooseCaptionPlacement,
|
|
83
|
+
clampClipDuration,
|
|
84
|
+
clampClipStart,
|
|
85
|
+
createSequencesMcpHandler,
|
|
86
|
+
findSequenceMcpTool,
|
|
87
|
+
formatSeconds,
|
|
88
|
+
formatTimecode,
|
|
89
|
+
framesToSeconds,
|
|
90
|
+
lastClipEndFrame,
|
|
91
|
+
normalizeLanguageTag,
|
|
92
|
+
parseSequenceOperations,
|
|
93
|
+
planLanguageFanout,
|
|
94
|
+
resolveCaptionPlacement,
|
|
95
|
+
resolveCaptionTarget,
|
|
96
|
+
resolvePlaceClipTrack,
|
|
97
|
+
secondsToFrames,
|
|
98
|
+
snapshotFrame,
|
|
99
|
+
trackIntervals,
|
|
100
|
+
validateAddCaption,
|
|
101
|
+
validateCreateTrack,
|
|
102
|
+
validateDeleteClip,
|
|
103
|
+
validateExtendSequence,
|
|
104
|
+
validateMoveClip,
|
|
105
|
+
validatePlaceClip,
|
|
106
|
+
validateQueueExport,
|
|
107
|
+
validateSequenceOperation,
|
|
108
|
+
validateSequenceOperations,
|
|
109
|
+
validateSetClipDisabled,
|
|
110
|
+
validateSetClipText,
|
|
111
|
+
validateSplitClip,
|
|
112
|
+
validateTrimClip
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|