videobook-engine 2.0.1 → 4.2.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/README.md +87 -41
- package/dist/artifact-names.d.ts +6 -0
- package/dist/artifact-names.d.ts.map +1 -0
- package/dist/artifact-names.js +56 -0
- package/dist/artifact-names.js.map +1 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +57 -23
- package/dist/artifacts.js.map +1 -1
- package/dist/books.js +2 -1
- package/dist/books.js.map +1 -1
- package/dist/cas.d.ts +27 -1
- package/dist/cas.d.ts.map +1 -1
- package/dist/cas.js +78 -6
- package/dist/cas.js.map +1 -1
- package/dist/catalog-metadata.d.ts +56 -0
- package/dist/catalog-metadata.d.ts.map +1 -0
- package/dist/catalog-metadata.js +42 -0
- package/dist/catalog-metadata.js.map +1 -0
- package/dist/communications.js +4 -2
- package/dist/communications.js.map +1 -1
- package/dist/context.d.ts +6 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +35 -6
- package/dist/context.js.map +1 -1
- package/dist/domain.d.ts +4 -0
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +870 -58
- package/dist/domain.js.map +1 -1
- package/dist/edit-policy.d.ts +3 -0
- package/dist/edit-policy.d.ts.map +1 -0
- package/dist/edit-policy.js +6 -0
- package/dist/edit-policy.js.map +1 -0
- package/dist/edits.d.ts +10 -0
- package/dist/edits.d.ts.map +1 -0
- package/dist/edits.js +1392 -0
- package/dist/edits.js.map +1 -0
- package/dist/engine-types.d.ts +110 -60
- package/dist/engine-types.d.ts.map +1 -1
- package/dist/engine-types.js +33 -0
- package/dist/engine-types.js.map +1 -1
- package/dist/engine.d.ts +69 -8
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +24 -18
- package/dist/engine.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +31 -27
- package/dist/files.js.map +1 -1
- package/dist/fork.d.ts +147 -0
- package/dist/fork.d.ts.map +1 -0
- package/dist/fork.js +609 -0
- package/dist/fork.js.map +1 -0
- package/dist/history.d.ts +0 -4
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +166 -595
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +2 -0
- package/dist/job-queue.d.ts.map +1 -1
- package/dist/job-queue.js +29 -2
- package/dist/job-queue.js.map +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +1 -0
- package/dist/media.js.map +1 -1
- package/dist/merge-policy.d.ts +99 -0
- package/dist/merge-policy.d.ts.map +1 -0
- package/dist/merge-policy.js +310 -0
- package/dist/merge-policy.js.map +1 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +15 -20
- package/dist/metadata.js.map +1 -1
- package/dist/migration.d.ts +9 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +534 -0
- package/dist/migration.js.map +1 -0
- package/dist/mvp-contract-fixtures.d.ts +244 -0
- package/dist/mvp-contract-fixtures.d.ts.map +1 -0
- package/dist/mvp-contract-fixtures.js +556 -0
- package/dist/mvp-contract-fixtures.js.map +1 -0
- package/dist/mvp-contracts.d.ts +761 -0
- package/dist/mvp-contracts.d.ts.map +1 -0
- package/dist/mvp-contracts.js +59 -0
- package/dist/mvp-contracts.js.map +1 -0
- package/dist/mvp-time.d.ts +54 -0
- package/dist/mvp-time.d.ts.map +1 -0
- package/dist/mvp-time.js +148 -0
- package/dist/mvp-time.js.map +1 -0
- package/dist/notebook/types.d.ts +113 -8
- package/dist/notebook/types.d.ts.map +1 -1
- package/dist/order-keys.d.ts +22 -0
- package/dist/order-keys.d.ts.map +1 -0
- package/dist/order-keys.js +262 -0
- package/dist/order-keys.js.map +1 -0
- package/dist/runtime-services.js +4 -2
- package/dist/runtime-services.js.map +1 -1
- package/dist/schema.d.ts +24 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +644 -132
- package/dist/schema.js.map +1 -1
- package/dist/search-benchmark.d.ts +4 -0
- package/dist/search-benchmark.d.ts.map +1 -0
- package/dist/search-benchmark.js +144 -0
- package/dist/search-benchmark.js.map +1 -0
- package/dist/sequences.d.ts +20 -0
- package/dist/sequences.d.ts.map +1 -0
- package/dist/sequences.js +825 -0
- package/dist/sequences.js.map +1 -0
- package/dist/similarity.js +1 -1
- package/dist/storage.d.ts +3 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +388 -7
- package/dist/storage.js.map +1 -1
- package/dist/store.d.ts +63 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +351 -65
- package/dist/store.js.map +1 -1
- package/dist/streams.d.ts +10 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +183 -0
- package/dist/streams.js.map +1 -0
- package/dist/temporal-models.d.ts +48 -0
- package/dist/temporal-models.d.ts.map +1 -0
- package/dist/temporal-models.js +278 -0
- package/dist/temporal-models.js.map +1 -0
- package/dist/temporal-search.d.ts +29 -0
- package/dist/temporal-search.d.ts.map +1 -0
- package/dist/temporal-search.js +1507 -0
- package/dist/temporal-search.js.map +1 -0
- package/dist/transcripts.d.ts +16 -0
- package/dist/transcripts.d.ts.map +1 -0
- package/dist/transcripts.js +519 -0
- package/dist/transcripts.js.map +1 -0
- package/docs/engine-layout.md +346 -106
- package/docs/mvp-prd.md +918 -0
- package/fixtures/media/vancat.mp4 +0 -0
- package/fixtures/media/vancat_profile.jpg +0 -0
- package/fixtures/v5/contract-fixtures.json +1532 -0
- package/package.json +30 -5
- package/dist/history-types.d.ts +0 -74
- package/dist/history-types.d.ts.map +0 -1
- package/dist/history-types.js +0 -2
- package/dist/history-types.js.map +0 -1
- package/dist/timeline.d.ts +0 -9
- package/dist/timeline.d.ts.map +0 -1
- package/dist/timeline.js +0 -236
- package/dist/timeline.js.map +0 -1
|
@@ -0,0 +1,761 @@
|
|
|
1
|
+
import type { ArtifactKind, EngineError, EngineErrorCode } from "./engine-types.js";
|
|
2
|
+
import type { MediaSourceSnapshot, Rational, SearchLocation, SequenceRange, SourcePoint, SourceRange } from "./mvp-time.js";
|
|
3
|
+
export declare const MVP_CONTRACT_VERSION: 1;
|
|
4
|
+
export declare const MVP_SCHEMA_VERSION: 18;
|
|
5
|
+
export declare const MVP_LEGACY_SCHEMA_VERSION: 4;
|
|
6
|
+
export declare const MVP_PREVIOUS_SCHEMA_VERSION: 5;
|
|
7
|
+
export declare const MVP_CONTRACT_COMPATIBILITY: {
|
|
8
|
+
readonly contractVersion: 1;
|
|
9
|
+
readonly schemaVersion: 18;
|
|
10
|
+
readonly minimumReaderContractVersion: 1;
|
|
11
|
+
readonly legacySchemaVersions: readonly [4, 5];
|
|
12
|
+
readonly legacyTimelineApi: "compile-to-sequence";
|
|
13
|
+
readonly legacySimilarityApi: "read-only-adapter";
|
|
14
|
+
};
|
|
15
|
+
export type MvpContractCompatibility = typeof MVP_CONTRACT_COMPATIBILITY;
|
|
16
|
+
export type MediaStreamKind = "video" | "audio";
|
|
17
|
+
export interface ArtifactStream {
|
|
18
|
+
streamId: string;
|
|
19
|
+
artifactId: string;
|
|
20
|
+
sourcePath: string;
|
|
21
|
+
objectHash: string;
|
|
22
|
+
streamIndex: number;
|
|
23
|
+
kind: MediaStreamKind;
|
|
24
|
+
timeBase: Rational;
|
|
25
|
+
durationTicks: number;
|
|
26
|
+
codec: string;
|
|
27
|
+
video?: {
|
|
28
|
+
width: number;
|
|
29
|
+
height: number;
|
|
30
|
+
rotationDegrees: number;
|
|
31
|
+
pixelAspect: Rational;
|
|
32
|
+
nominalFrameRate?: Rational;
|
|
33
|
+
averageFrameRate?: Rational;
|
|
34
|
+
};
|
|
35
|
+
audio?: {
|
|
36
|
+
sampleRateHz: number;
|
|
37
|
+
channels: number;
|
|
38
|
+
channelLayout: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export type RegisterArtifactStreamInput = Omit<ArtifactStream, "streamId"> & {
|
|
42
|
+
streamId?: string;
|
|
43
|
+
};
|
|
44
|
+
export type MediaProfileState = "complete" | "partial" | "stale" | "failed" | "unsupported";
|
|
45
|
+
export interface MediaProfile {
|
|
46
|
+
artifactId: string;
|
|
47
|
+
sourcePath: string;
|
|
48
|
+
objectHash: string;
|
|
49
|
+
probeVersion: string;
|
|
50
|
+
container: string;
|
|
51
|
+
streams: ArtifactStream[];
|
|
52
|
+
state: MediaProfileState;
|
|
53
|
+
error?: EngineError;
|
|
54
|
+
updatedAt: number;
|
|
55
|
+
}
|
|
56
|
+
export type TranscriptSegmentKind = "speech" | "music" | "sound" | "silence" | "other";
|
|
57
|
+
export interface TranscriptWord {
|
|
58
|
+
wordId: string;
|
|
59
|
+
ordinal: number;
|
|
60
|
+
startTick: number;
|
|
61
|
+
durationTicks: number;
|
|
62
|
+
text: string;
|
|
63
|
+
confidence?: number;
|
|
64
|
+
corrected: boolean;
|
|
65
|
+
}
|
|
66
|
+
export interface TranscriptSegment {
|
|
67
|
+
segmentId: string;
|
|
68
|
+
ordinal: number;
|
|
69
|
+
range: SourceRange;
|
|
70
|
+
speaker?: string;
|
|
71
|
+
text: string;
|
|
72
|
+
confidence?: number;
|
|
73
|
+
kind: TranscriptSegmentKind;
|
|
74
|
+
words: TranscriptWord[];
|
|
75
|
+
}
|
|
76
|
+
export interface Transcript {
|
|
77
|
+
transcriptId: string;
|
|
78
|
+
artifactId: string;
|
|
79
|
+
streamId: string;
|
|
80
|
+
objectHash: string;
|
|
81
|
+
/**
|
|
82
|
+
* SHA-256 of the CAS object holding the segment/word text payload. Bulk
|
|
83
|
+
* transcript text lives behind this hash so it can be forgotten by object
|
|
84
|
+
* deletion; the versioned rows keep only structure (IDs, ticks, speaker,
|
|
85
|
+
* confidence, kind). Reads of a transcript whose payload object was
|
|
86
|
+
* deleted surface OBJECT_UNAVAILABLE.
|
|
87
|
+
*/
|
|
88
|
+
payloadHash: string;
|
|
89
|
+
/**
|
|
90
|
+
* False when the payload object was forgotten (deleted from CAS): the
|
|
91
|
+
* transcript keeps its structure (IDs, ticks, speaker, kind) but every
|
|
92
|
+
* segment and word text is empty. `transcripts.list` degrades this way;
|
|
93
|
+
* `transcripts.get` still surfaces OBJECT_UNAVAILABLE.
|
|
94
|
+
*/
|
|
95
|
+
payloadAvailable: boolean;
|
|
96
|
+
language: string;
|
|
97
|
+
provider?: string;
|
|
98
|
+
model?: string;
|
|
99
|
+
revision: string;
|
|
100
|
+
segments: TranscriptSegment[];
|
|
101
|
+
createdAt: number;
|
|
102
|
+
}
|
|
103
|
+
export type ImportTranscriptWord = Omit<TranscriptWord, "wordId"> & {
|
|
104
|
+
wordId?: string;
|
|
105
|
+
};
|
|
106
|
+
export type ImportTranscriptSegment = Omit<TranscriptSegment, "segmentId" | "words"> & {
|
|
107
|
+
segmentId?: string;
|
|
108
|
+
words: ImportTranscriptWord[];
|
|
109
|
+
};
|
|
110
|
+
export interface ImportTranscriptInput {
|
|
111
|
+
transcriptId?: string;
|
|
112
|
+
artifactId: string;
|
|
113
|
+
streamId: string;
|
|
114
|
+
objectHash: string;
|
|
115
|
+
language: string;
|
|
116
|
+
provider?: string;
|
|
117
|
+
model?: string;
|
|
118
|
+
state?: "current" | "derived";
|
|
119
|
+
segments: ImportTranscriptSegment[];
|
|
120
|
+
}
|
|
121
|
+
export interface ReviseTranscriptInput {
|
|
122
|
+
transcriptId?: string;
|
|
123
|
+
sourceTranscriptId: string;
|
|
124
|
+
language?: string;
|
|
125
|
+
provider?: string;
|
|
126
|
+
model?: string;
|
|
127
|
+
segments: ImportTranscriptSegment[];
|
|
128
|
+
}
|
|
129
|
+
export interface TranscriptSelection {
|
|
130
|
+
transcriptId: string;
|
|
131
|
+
transcriptRevision: string;
|
|
132
|
+
startWordId: string;
|
|
133
|
+
endWordId: string;
|
|
134
|
+
range: SourceRange;
|
|
135
|
+
}
|
|
136
|
+
export type SequenceTrackKind = "video" | "audio" | "caption";
|
|
137
|
+
interface SequenceTrackBase {
|
|
138
|
+
trackId: string;
|
|
139
|
+
sequenceId: string;
|
|
140
|
+
ordinal: number;
|
|
141
|
+
name: string;
|
|
142
|
+
enabled: boolean;
|
|
143
|
+
locked: boolean;
|
|
144
|
+
}
|
|
145
|
+
export interface VideoTrack extends SequenceTrackBase {
|
|
146
|
+
kind: "video";
|
|
147
|
+
blendMode: "normal";
|
|
148
|
+
}
|
|
149
|
+
export interface AudioTrack extends SequenceTrackBase {
|
|
150
|
+
kind: "audio";
|
|
151
|
+
muted: boolean;
|
|
152
|
+
solo: boolean;
|
|
153
|
+
}
|
|
154
|
+
export interface CaptionTrack extends SequenceTrackBase {
|
|
155
|
+
kind: "caption";
|
|
156
|
+
}
|
|
157
|
+
export type SequenceTrack = VideoTrack | AudioTrack | CaptionTrack;
|
|
158
|
+
export interface ClipTransform {
|
|
159
|
+
fit: "fit" | "fill" | "crop";
|
|
160
|
+
positionX: number;
|
|
161
|
+
positionY: number;
|
|
162
|
+
scaleX: number;
|
|
163
|
+
scaleY: number;
|
|
164
|
+
anchorX: number;
|
|
165
|
+
anchorY: number;
|
|
166
|
+
rotationDegrees: number;
|
|
167
|
+
cropTop: number;
|
|
168
|
+
cropRight: number;
|
|
169
|
+
cropBottom: number;
|
|
170
|
+
cropLeft: number;
|
|
171
|
+
opacity: number;
|
|
172
|
+
blendMode: "normal";
|
|
173
|
+
}
|
|
174
|
+
export interface ClipAudio {
|
|
175
|
+
gainDb: number;
|
|
176
|
+
muted: boolean;
|
|
177
|
+
fadeInFrames: number;
|
|
178
|
+
fadeOutFrames: number;
|
|
179
|
+
}
|
|
180
|
+
interface SequenceClipBase {
|
|
181
|
+
clipId: string;
|
|
182
|
+
trackId: string;
|
|
183
|
+
timelineStartFrame: number;
|
|
184
|
+
durationFrames: number;
|
|
185
|
+
enabled: boolean;
|
|
186
|
+
linkGroupId?: string;
|
|
187
|
+
transform?: ClipTransform;
|
|
188
|
+
audio?: ClipAudio;
|
|
189
|
+
}
|
|
190
|
+
export interface StillSequenceClip extends SequenceClipBase {
|
|
191
|
+
source: Extract<MediaSourceSnapshot, {
|
|
192
|
+
kind: "still";
|
|
193
|
+
}>;
|
|
194
|
+
}
|
|
195
|
+
export interface TimedSequenceClip extends SequenceClipBase {
|
|
196
|
+
source: Extract<MediaSourceSnapshot, {
|
|
197
|
+
kind: "timed";
|
|
198
|
+
}>;
|
|
199
|
+
speed: Rational;
|
|
200
|
+
reverse: boolean;
|
|
201
|
+
audioPolicy: "preserve-pitch" | "resample" | "mute";
|
|
202
|
+
}
|
|
203
|
+
export type SequenceClip = StillSequenceClip | TimedSequenceClip;
|
|
204
|
+
export interface SequenceTransition {
|
|
205
|
+
transitionId: string;
|
|
206
|
+
trackId: string;
|
|
207
|
+
outgoingClipId: string;
|
|
208
|
+
incomingClipId: string;
|
|
209
|
+
kind: "cut" | "dissolve";
|
|
210
|
+
durationFrames: number;
|
|
211
|
+
alignment: "start" | "center" | "end";
|
|
212
|
+
}
|
|
213
|
+
export interface CaptionCue {
|
|
214
|
+
cueId: string;
|
|
215
|
+
trackId: string;
|
|
216
|
+
timelineStartFrame: number;
|
|
217
|
+
durationFrames: number;
|
|
218
|
+
text: string;
|
|
219
|
+
speaker?: string;
|
|
220
|
+
styleId: string;
|
|
221
|
+
transcriptSelection?: TranscriptSelection;
|
|
222
|
+
}
|
|
223
|
+
export interface Sequence {
|
|
224
|
+
sequenceId: string;
|
|
225
|
+
name: string;
|
|
226
|
+
width: number;
|
|
227
|
+
height: number;
|
|
228
|
+
pixelAspect: Rational;
|
|
229
|
+
frameRate: Rational;
|
|
230
|
+
audioSampleRateHz: number;
|
|
231
|
+
audioChannelLayout: string;
|
|
232
|
+
backgroundRgba: [number, number, number, number];
|
|
233
|
+
revision: string;
|
|
234
|
+
tracks: SequenceTrack[];
|
|
235
|
+
clips: SequenceClip[];
|
|
236
|
+
transitions: SequenceTransition[];
|
|
237
|
+
captions: CaptionCue[];
|
|
238
|
+
createdAt: number;
|
|
239
|
+
}
|
|
240
|
+
export interface CreateSequenceInput {
|
|
241
|
+
sequenceId?: string;
|
|
242
|
+
name: string;
|
|
243
|
+
width: number;
|
|
244
|
+
height: number;
|
|
245
|
+
pixelAspect?: Rational;
|
|
246
|
+
frameRate: Rational;
|
|
247
|
+
audioSampleRateHz?: number;
|
|
248
|
+
audioChannelLayout?: string;
|
|
249
|
+
backgroundRgba?: [number, number, number, number];
|
|
250
|
+
videoTrackCount?: number;
|
|
251
|
+
audioTrackCount?: number;
|
|
252
|
+
captionTrackCount?: number;
|
|
253
|
+
}
|
|
254
|
+
export interface UpdateSequenceCanvasInput {
|
|
255
|
+
width: number;
|
|
256
|
+
height: number;
|
|
257
|
+
}
|
|
258
|
+
export interface UpdateSequenceTrackInput {
|
|
259
|
+
name?: string;
|
|
260
|
+
enabled?: boolean;
|
|
261
|
+
locked?: boolean;
|
|
262
|
+
muted?: boolean;
|
|
263
|
+
solo?: boolean;
|
|
264
|
+
}
|
|
265
|
+
export interface CreateSequenceTrackInput {
|
|
266
|
+
kind: "video" | "audio" | "caption";
|
|
267
|
+
name?: string;
|
|
268
|
+
}
|
|
269
|
+
export type SourceSurface = "ui" | "slash" | "chat" | "system";
|
|
270
|
+
export type ConfirmationPolicy = "always" | "risk-based" | "reversible-single-step";
|
|
271
|
+
export interface ClipPlacement {
|
|
272
|
+
trackId: string;
|
|
273
|
+
timelineStartFrame: number;
|
|
274
|
+
durationFrames: number;
|
|
275
|
+
source: MediaSourceSnapshot;
|
|
276
|
+
speed?: Rational;
|
|
277
|
+
reverse?: boolean;
|
|
278
|
+
audioPolicy?: "preserve-pitch" | "resample" | "mute";
|
|
279
|
+
transform?: ClipTransform;
|
|
280
|
+
audio?: ClipAudio;
|
|
281
|
+
}
|
|
282
|
+
export interface InsertClipOperation {
|
|
283
|
+
kind: "insert-clip";
|
|
284
|
+
clipId?: string;
|
|
285
|
+
placement: ClipPlacement;
|
|
286
|
+
mode: "insert" | "overwrite";
|
|
287
|
+
}
|
|
288
|
+
export interface RemoveRangeOperation {
|
|
289
|
+
kind: "remove-range";
|
|
290
|
+
trackIds: string[];
|
|
291
|
+
range: SequenceRange;
|
|
292
|
+
ripple: boolean;
|
|
293
|
+
}
|
|
294
|
+
export interface MoveClipOperation {
|
|
295
|
+
kind: "move-clip";
|
|
296
|
+
clipId: string;
|
|
297
|
+
trackId: string;
|
|
298
|
+
timelineStartFrame: number;
|
|
299
|
+
}
|
|
300
|
+
export interface TrimClipOperation {
|
|
301
|
+
kind: "trim-clip";
|
|
302
|
+
clipId: string;
|
|
303
|
+
timelineStartFrame: number;
|
|
304
|
+
durationFrames: number;
|
|
305
|
+
sourceRange?: SourceRange;
|
|
306
|
+
}
|
|
307
|
+
export interface SplitClipOperation {
|
|
308
|
+
kind: "split-clip";
|
|
309
|
+
clipId: string;
|
|
310
|
+
splitFrame: number;
|
|
311
|
+
leftClipId?: string;
|
|
312
|
+
rightClipId?: string;
|
|
313
|
+
}
|
|
314
|
+
export interface RestoreClipOperation {
|
|
315
|
+
kind: "restore-clip";
|
|
316
|
+
sourceActionId: string;
|
|
317
|
+
sourceClipId: string;
|
|
318
|
+
placement: ClipPlacement;
|
|
319
|
+
}
|
|
320
|
+
export interface SetClipTransformOperation {
|
|
321
|
+
kind: "set-clip-transform";
|
|
322
|
+
clipId: string;
|
|
323
|
+
transform: ClipTransform;
|
|
324
|
+
}
|
|
325
|
+
export interface SetClipAudioOperation {
|
|
326
|
+
kind: "set-clip-audio";
|
|
327
|
+
clipId: string;
|
|
328
|
+
audio: ClipAudio;
|
|
329
|
+
}
|
|
330
|
+
export interface SetClipSpeedOperation {
|
|
331
|
+
kind: "set-clip-speed";
|
|
332
|
+
clipId: string;
|
|
333
|
+
speed: Rational;
|
|
334
|
+
reverse: boolean;
|
|
335
|
+
audioPolicy: "preserve-pitch" | "resample" | "mute";
|
|
336
|
+
}
|
|
337
|
+
export interface SetTransitionOperation {
|
|
338
|
+
kind: "set-transition";
|
|
339
|
+
transition: SequenceTransition | null;
|
|
340
|
+
outgoingClipId: string;
|
|
341
|
+
incomingClipId: string;
|
|
342
|
+
}
|
|
343
|
+
export interface UpsertCaptionCueOperation {
|
|
344
|
+
kind: "upsert-caption-cue";
|
|
345
|
+
cue: CaptionCue;
|
|
346
|
+
}
|
|
347
|
+
export interface BatchReplaceRangeOperation {
|
|
348
|
+
kind: "batch-replace-range";
|
|
349
|
+
range: SequenceRange;
|
|
350
|
+
trackIds: string[];
|
|
351
|
+
placements: ClipPlacement[];
|
|
352
|
+
ripple: boolean;
|
|
353
|
+
}
|
|
354
|
+
export declare const MVP_EDIT_OPERATION_KINDS: readonly ["insert-clip", "remove-range", "move-clip", "trim-clip", "split-clip", "restore-clip", "set-clip-transform", "set-clip-audio", "set-clip-speed", "set-transition", "upsert-caption-cue", "batch-replace-range"];
|
|
355
|
+
export type EditOperation = InsertClipOperation | RemoveRangeOperation | MoveClipOperation | TrimClipOperation | SplitClipOperation | RestoreClipOperation | SetClipTransformOperation | SetClipAudioOperation | SetClipSpeedOperation | SetTransitionOperation | UpsertCaptionCueOperation | BatchReplaceRangeOperation;
|
|
356
|
+
export interface EditIntent {
|
|
357
|
+
intentVersion: typeof MVP_CONTRACT_VERSION;
|
|
358
|
+
commandId: string;
|
|
359
|
+
sequenceId: string;
|
|
360
|
+
baseRevision: string;
|
|
361
|
+
actor: string;
|
|
362
|
+
sourceSurface: SourceSurface;
|
|
363
|
+
confirmationPolicy: ConfirmationPolicy;
|
|
364
|
+
operations: EditOperation[];
|
|
365
|
+
}
|
|
366
|
+
export interface NormalizedEditOperation {
|
|
367
|
+
operationId: string;
|
|
368
|
+
ordinal: number;
|
|
369
|
+
operation: EditOperation;
|
|
370
|
+
}
|
|
371
|
+
export type EditWarningCode = "MEDIA_DERIVATION_REQUIRED" | "AUDIO_PITCH_CHANGE" | "CAPTION_OVERFLOW" | "TRANSITION_HANDLE_LIMIT" | "OFFLINE_OBJECT" | "ROUNDING_APPLIED";
|
|
372
|
+
export interface EditWarning {
|
|
373
|
+
code: EditWarningCode;
|
|
374
|
+
message: string;
|
|
375
|
+
operationId?: string;
|
|
376
|
+
range?: SequenceRange;
|
|
377
|
+
details?: Record<string, unknown>;
|
|
378
|
+
}
|
|
379
|
+
export type EditConflictCode = "STALE_REVISION" | "OVERLAPPING_WRITE" | "MISSING_RESOURCE" | "LOCKED_TRACK" | "SOURCE_REPLACED" | "PREVIEW_CHANGED";
|
|
380
|
+
export interface EditConflict {
|
|
381
|
+
code: EditConflictCode;
|
|
382
|
+
message: string;
|
|
383
|
+
resource: string;
|
|
384
|
+
operationId?: string;
|
|
385
|
+
currentRevision?: string;
|
|
386
|
+
details?: Record<string, unknown>;
|
|
387
|
+
}
|
|
388
|
+
export interface SequenceDiff {
|
|
389
|
+
insertedClipIds: string[];
|
|
390
|
+
removedClipIds: string[];
|
|
391
|
+
changedClipIds: string[];
|
|
392
|
+
changedTrackIds: string[];
|
|
393
|
+
changedCaptionCueIds: string[];
|
|
394
|
+
beforeDurationFrames: number;
|
|
395
|
+
afterDurationFrames: number;
|
|
396
|
+
}
|
|
397
|
+
export interface EditPreview {
|
|
398
|
+
commandId: string;
|
|
399
|
+
sequenceId: string;
|
|
400
|
+
baseRevision: string;
|
|
401
|
+
valid: boolean;
|
|
402
|
+
operations: NormalizedEditOperation[];
|
|
403
|
+
affectedRanges: SequenceRange[];
|
|
404
|
+
writeSet: string[];
|
|
405
|
+
warnings: EditWarning[];
|
|
406
|
+
conflicts: EditConflict[];
|
|
407
|
+
diff: SequenceDiff;
|
|
408
|
+
beforeHash: string;
|
|
409
|
+
afterHash: string;
|
|
410
|
+
previewHash: string;
|
|
411
|
+
}
|
|
412
|
+
export interface EditCommit {
|
|
413
|
+
commandId: string;
|
|
414
|
+
actionId: string;
|
|
415
|
+
revision: string;
|
|
416
|
+
sequence: Sequence;
|
|
417
|
+
previewHash: string;
|
|
418
|
+
}
|
|
419
|
+
export interface EditBatchAudit {
|
|
420
|
+
actionId: string;
|
|
421
|
+
commandId: string;
|
|
422
|
+
intentVersion: number;
|
|
423
|
+
sourceSurface: SourceSurface;
|
|
424
|
+
actor: string;
|
|
425
|
+
sequenceId: string;
|
|
426
|
+
baseRevision: string;
|
|
427
|
+
committedRevision: string;
|
|
428
|
+
operations: NormalizedEditOperation[];
|
|
429
|
+
affectedRanges: SequenceRange[];
|
|
430
|
+
writeSet: string[];
|
|
431
|
+
previewHash: string;
|
|
432
|
+
beforeHash: string;
|
|
433
|
+
afterHash: string;
|
|
434
|
+
confirmationPolicy: ConfirmationPolicy;
|
|
435
|
+
warnings: EditWarning[];
|
|
436
|
+
createdAt: number;
|
|
437
|
+
}
|
|
438
|
+
export interface EditRestoreRequest {
|
|
439
|
+
targetActionId?: string;
|
|
440
|
+
targetRevision?: string;
|
|
441
|
+
actor: string;
|
|
442
|
+
sourceSurface: SourceSurface;
|
|
443
|
+
baseRevision: string;
|
|
444
|
+
}
|
|
445
|
+
export interface EditRestoreCommit {
|
|
446
|
+
actionId: string;
|
|
447
|
+
restoredFromActionId?: string;
|
|
448
|
+
restoredFromRevision: string;
|
|
449
|
+
revision: string;
|
|
450
|
+
sequence: Sequence;
|
|
451
|
+
}
|
|
452
|
+
export type SearchModality = "auto" | "visual" | "speech" | "ocr" | "audio" | "metadata";
|
|
453
|
+
export type SearchReference = {
|
|
454
|
+
kind: "image";
|
|
455
|
+
artifact: string;
|
|
456
|
+
} | {
|
|
457
|
+
kind: "frame";
|
|
458
|
+
source: SourcePoint;
|
|
459
|
+
} | {
|
|
460
|
+
kind: "video";
|
|
461
|
+
range: SourceRange;
|
|
462
|
+
} | {
|
|
463
|
+
kind: "audio";
|
|
464
|
+
range: SourceRange;
|
|
465
|
+
};
|
|
466
|
+
export interface PreparedSearchFingerprint {
|
|
467
|
+
kind: string;
|
|
468
|
+
value: string;
|
|
469
|
+
}
|
|
470
|
+
export interface PreparedSearchVideoSample {
|
|
471
|
+
offsetMs: number;
|
|
472
|
+
vector: number[];
|
|
473
|
+
}
|
|
474
|
+
export type PreparedSearchReference = {
|
|
475
|
+
kind: "image";
|
|
476
|
+
embeddingSpace: string;
|
|
477
|
+
vector: number[];
|
|
478
|
+
fingerprints?: PreparedSearchFingerprint[];
|
|
479
|
+
} | {
|
|
480
|
+
kind: "video";
|
|
481
|
+
embeddingSpace: string;
|
|
482
|
+
samples: PreparedSearchVideoSample[];
|
|
483
|
+
};
|
|
484
|
+
export interface PreparedSearchRange {
|
|
485
|
+
startMs: number;
|
|
486
|
+
durationMs?: number;
|
|
487
|
+
}
|
|
488
|
+
export interface PreparedSearchOptions {
|
|
489
|
+
range?: PreparedSearchRange;
|
|
490
|
+
}
|
|
491
|
+
export interface SearchQuery {
|
|
492
|
+
text?: string;
|
|
493
|
+
reference?: SearchReference;
|
|
494
|
+
modalities?: SearchModality[];
|
|
495
|
+
artifactKinds?: ArtifactKind[];
|
|
496
|
+
durationMs?: {
|
|
497
|
+
min?: number;
|
|
498
|
+
max?: number;
|
|
499
|
+
};
|
|
500
|
+
orientations?: Array<"landscape" | "portrait" | "square">;
|
|
501
|
+
labels?: string[];
|
|
502
|
+
sourceArtifactIds?: string[];
|
|
503
|
+
indexingStates?: SearchCoverageState[];
|
|
504
|
+
createdAfter?: number;
|
|
505
|
+
createdBefore?: number;
|
|
506
|
+
minScore?: number;
|
|
507
|
+
limit?: number;
|
|
508
|
+
cursor?: string;
|
|
509
|
+
}
|
|
510
|
+
export type SearchSignalKind = "visual" | "speech" | "ocr" | "audio" | "metadata" | "exact" | "near";
|
|
511
|
+
export interface SearchSignal {
|
|
512
|
+
kind: SearchSignalKind;
|
|
513
|
+
rank: number;
|
|
514
|
+
score?: number;
|
|
515
|
+
explanation?: string;
|
|
516
|
+
}
|
|
517
|
+
export interface SearchHit {
|
|
518
|
+
artifactId: string;
|
|
519
|
+
artifactSlug: string;
|
|
520
|
+
artifactKind: ArtifactKind;
|
|
521
|
+
location: SearchLocation;
|
|
522
|
+
representativeTick?: number;
|
|
523
|
+
score: number;
|
|
524
|
+
signals: SearchSignal[];
|
|
525
|
+
excerpt?: string;
|
|
526
|
+
indexManifestIds: string[];
|
|
527
|
+
}
|
|
528
|
+
export type SearchCoverageState = "not-indexed" | "partial" | "ready" | "stale" | "failed" | "unsupported";
|
|
529
|
+
export type LanguageCoverage = "measured" | "best-effort" | "unsupported";
|
|
530
|
+
export interface SearchModalityCoverage {
|
|
531
|
+
modality: Exclude<SearchModality, "auto">;
|
|
532
|
+
state: SearchCoverageState;
|
|
533
|
+
indexedUnits: number;
|
|
534
|
+
totalUnits?: number;
|
|
535
|
+
languageCoverage?: LanguageCoverage;
|
|
536
|
+
manifestId?: string;
|
|
537
|
+
error?: EngineError;
|
|
538
|
+
}
|
|
539
|
+
export interface SearchCoverage {
|
|
540
|
+
state: SearchCoverageState;
|
|
541
|
+
generation: string;
|
|
542
|
+
modalities: SearchModalityCoverage[];
|
|
543
|
+
indexedArtifactCount: number;
|
|
544
|
+
totalArtifactCount: number;
|
|
545
|
+
partialResults: boolean;
|
|
546
|
+
}
|
|
547
|
+
export interface SearchPage {
|
|
548
|
+
hits: SearchHit[];
|
|
549
|
+
nextCursor?: string;
|
|
550
|
+
coverage: SearchCoverage;
|
|
551
|
+
}
|
|
552
|
+
export interface IndexManifest {
|
|
553
|
+
manifestId: string;
|
|
554
|
+
provider: string;
|
|
555
|
+
modelId: string;
|
|
556
|
+
modelRevision: string;
|
|
557
|
+
license?: string;
|
|
558
|
+
embeddingSpace: string;
|
|
559
|
+
dimensions: number;
|
|
560
|
+
modalities: Array<Exclude<SearchModality, "auto">>;
|
|
561
|
+
supportedLanguages: string[];
|
|
562
|
+
preprocessingVersion: string;
|
|
563
|
+
extractorVersion: string;
|
|
564
|
+
createdAt: number;
|
|
565
|
+
}
|
|
566
|
+
export type IndexPhase = "probe" | "segment" | "transcript" | "ocr" | "visual" | "audio" | "lexical" | "activate";
|
|
567
|
+
export interface IndexCoverage {
|
|
568
|
+
artifactId: string;
|
|
569
|
+
objectHash: string;
|
|
570
|
+
manifestId: string;
|
|
571
|
+
phase: IndexPhase;
|
|
572
|
+
state: SearchCoverageState;
|
|
573
|
+
coveredRanges: SourceRange[];
|
|
574
|
+
indexedUnits: number;
|
|
575
|
+
totalUnits?: number;
|
|
576
|
+
nextCursor?: string;
|
|
577
|
+
retryable: boolean;
|
|
578
|
+
error?: EngineError;
|
|
579
|
+
updatedAt: number;
|
|
580
|
+
}
|
|
581
|
+
export interface IndexBatchRequest {
|
|
582
|
+
artifactId: string;
|
|
583
|
+
objectHash: string;
|
|
584
|
+
manifestId: string;
|
|
585
|
+
phase: IndexPhase;
|
|
586
|
+
cursor?: string;
|
|
587
|
+
maxUnits: number;
|
|
588
|
+
}
|
|
589
|
+
export interface IndexBatchResult {
|
|
590
|
+
artifactId: string;
|
|
591
|
+
manifestId: string;
|
|
592
|
+
phase: IndexPhase;
|
|
593
|
+
committedUnits: number;
|
|
594
|
+
coveredRanges: SourceRange[];
|
|
595
|
+
nextCursor?: string;
|
|
596
|
+
complete: boolean;
|
|
597
|
+
generation: string;
|
|
598
|
+
}
|
|
599
|
+
export type MediaSegmentKind = "shot" | "window" | "frame" | "speech" | "ocr" | "audio-event" | "document" | "metadata";
|
|
600
|
+
export interface SegmentTextObservation {
|
|
601
|
+
textId?: string;
|
|
602
|
+
kind: "transcript" | "ocr" | "description" | "metadata" | "label";
|
|
603
|
+
language?: string;
|
|
604
|
+
text: string;
|
|
605
|
+
startUtf8Byte?: number;
|
|
606
|
+
endUtf8Byte?: number;
|
|
607
|
+
confidence?: number;
|
|
608
|
+
provenance?: Record<string, unknown>;
|
|
609
|
+
}
|
|
610
|
+
export interface SegmentEmbeddingObservation {
|
|
611
|
+
embeddingId?: string;
|
|
612
|
+
modality: Exclude<SearchModality, "auto" | "metadata">;
|
|
613
|
+
embeddingSpace: string;
|
|
614
|
+
vector: number[];
|
|
615
|
+
sourceHash: string;
|
|
616
|
+
}
|
|
617
|
+
export interface SegmentFingerprintObservation {
|
|
618
|
+
fingerprintId?: string;
|
|
619
|
+
kind: "sha256" | "perceptual" | "frame";
|
|
620
|
+
value: string;
|
|
621
|
+
extractorVersion: string;
|
|
622
|
+
}
|
|
623
|
+
export interface TemporalIndexObservation {
|
|
624
|
+
segmentId?: string;
|
|
625
|
+
artifactId: string;
|
|
626
|
+
objectHash: string;
|
|
627
|
+
streamId?: string;
|
|
628
|
+
range?: SourceRange;
|
|
629
|
+
sourcePath?: string;
|
|
630
|
+
kind: MediaSegmentKind;
|
|
631
|
+
representativeTick?: number;
|
|
632
|
+
segmentationVersion: string;
|
|
633
|
+
texts: SegmentTextObservation[];
|
|
634
|
+
embeddings: SegmentEmbeddingObservation[];
|
|
635
|
+
fingerprints: SegmentFingerprintObservation[];
|
|
636
|
+
}
|
|
637
|
+
export interface CommitTemporalIndexBatchInput extends IndexBatchRequest {
|
|
638
|
+
generation: string;
|
|
639
|
+
observations: TemporalIndexObservation[];
|
|
640
|
+
coveredRanges: SourceRange[];
|
|
641
|
+
totalUnits?: number;
|
|
642
|
+
complete: boolean;
|
|
643
|
+
nextCursor?: string;
|
|
644
|
+
}
|
|
645
|
+
export interface TemporalIndexPlan {
|
|
646
|
+
artifactId: string;
|
|
647
|
+
objectHash: string;
|
|
648
|
+
manifestId: string;
|
|
649
|
+
generation: string;
|
|
650
|
+
phases: IndexPhase[];
|
|
651
|
+
pendingPhases: IndexPhase[];
|
|
652
|
+
coverage: IndexCoverage[];
|
|
653
|
+
}
|
|
654
|
+
export interface TemporalSearchProvider {
|
|
655
|
+
readonly manifestId: string;
|
|
656
|
+
prepare(): Promise<void>;
|
|
657
|
+
embedText(text: string): Promise<Float32Array>;
|
|
658
|
+
}
|
|
659
|
+
export interface TemporalSearchStats {
|
|
660
|
+
activeGenerations: number;
|
|
661
|
+
segments: number;
|
|
662
|
+
textObservations: number;
|
|
663
|
+
embeddings: number;
|
|
664
|
+
fingerprints: number;
|
|
665
|
+
}
|
|
666
|
+
export type SearchBenchmarkClass = "natural-language-visual" | "quoted-speech-ocr" | "reverse-image-exact" | "reverse-image-semantic" | "reverse-video" | "audio";
|
|
667
|
+
export interface SearchBenchmarkJudgment {
|
|
668
|
+
artifactId: string;
|
|
669
|
+
range?: SourceRange;
|
|
670
|
+
}
|
|
671
|
+
export interface SearchBenchmarkCase {
|
|
672
|
+
caseId: string;
|
|
673
|
+
class: SearchBenchmarkClass;
|
|
674
|
+
query: SearchQuery;
|
|
675
|
+
judgments: SearchBenchmarkJudgment[];
|
|
676
|
+
}
|
|
677
|
+
export interface SearchBenchmarkCaseResult {
|
|
678
|
+
caseId: string;
|
|
679
|
+
class: SearchBenchmarkClass;
|
|
680
|
+
latencyMs: number;
|
|
681
|
+
recallAt5: number;
|
|
682
|
+
top1Correct: boolean;
|
|
683
|
+
boundaryErrorMs?: number;
|
|
684
|
+
}
|
|
685
|
+
export interface SearchBenchmarkClassMetrics {
|
|
686
|
+
class: SearchBenchmarkClass;
|
|
687
|
+
caseCount: number;
|
|
688
|
+
recallAt5: number;
|
|
689
|
+
top1Accuracy: number;
|
|
690
|
+
}
|
|
691
|
+
export interface SearchBenchmarkReport {
|
|
692
|
+
corpusVersion: string;
|
|
693
|
+
manifestIds: string[];
|
|
694
|
+
caseResults: SearchBenchmarkCaseResult[];
|
|
695
|
+
classes: SearchBenchmarkClassMetrics[];
|
|
696
|
+
latencyP50Ms: number;
|
|
697
|
+
latencyP95Ms: number;
|
|
698
|
+
medianBoundaryErrorMs?: number;
|
|
699
|
+
passed: boolean;
|
|
700
|
+
failures: string[];
|
|
701
|
+
}
|
|
702
|
+
export declare const MVP_JOB_TYPES: readonly ["media-probe", "proxy-transcode", "thumbnail", "storyboard", "waveform", "loudness", "transcript-normalize", "media-segment", "ocr", "embed-visual", "embed-text", "embed-audio", "index-activate", "caption-derive", "preview-render", "final-render"];
|
|
703
|
+
export type MvpJobType = (typeof MVP_JOB_TYPES)[number];
|
|
704
|
+
export declare const MVP_JOB_FAILURE_CODES: readonly ["UNSUPPORTED_MEDIA", "MISSING_OBJECT", "MODEL_UNAVAILABLE", "OFFLINE", "INVALID_OUTPUT", "RESOURCE_EXHAUSTED", "TIMEOUT", "CANCELLED", "INTERNAL_ERROR"];
|
|
705
|
+
export type MvpJobFailureCode = (typeof MVP_JOB_FAILURE_CODES)[number];
|
|
706
|
+
export interface JobProgress {
|
|
707
|
+
phase: string;
|
|
708
|
+
completedUnits: number;
|
|
709
|
+
totalUnits?: number;
|
|
710
|
+
percent?: number;
|
|
711
|
+
elapsedMs: number;
|
|
712
|
+
estimatedRemainingMs?: number;
|
|
713
|
+
}
|
|
714
|
+
export interface MvpJobFailure {
|
|
715
|
+
code: MvpJobFailureCode;
|
|
716
|
+
message: string;
|
|
717
|
+
retryable: boolean;
|
|
718
|
+
engineCode?: EngineErrorCode;
|
|
719
|
+
details?: Record<string, unknown>;
|
|
720
|
+
}
|
|
721
|
+
export interface V4MigrationRequest {
|
|
722
|
+
sourceRoot: string;
|
|
723
|
+
destinationRoot: string;
|
|
724
|
+
dryRun: boolean;
|
|
725
|
+
expectedSourceBookId?: string;
|
|
726
|
+
expectedSourceHead?: string;
|
|
727
|
+
}
|
|
728
|
+
export type MigrationIssueCode = "MISSING_OBJECT" | "UNSUPPORTED_MEDIA" | "INVALID_REFERENCE" | "PROBE_REQUIRED" | "REINDEX_REQUIRED";
|
|
729
|
+
export interface MigrationIssue {
|
|
730
|
+
code: MigrationIssueCode;
|
|
731
|
+
severity: "warning" | "error";
|
|
732
|
+
resource: string;
|
|
733
|
+
message: string;
|
|
734
|
+
details?: Record<string, unknown>;
|
|
735
|
+
}
|
|
736
|
+
export interface V4MigrationDryRun {
|
|
737
|
+
contractVersion: typeof MVP_CONTRACT_VERSION;
|
|
738
|
+
sourceSchemaVersion: typeof MVP_LEGACY_SCHEMA_VERSION;
|
|
739
|
+
destinationSchemaVersion: typeof MVP_SCHEMA_VERSION;
|
|
740
|
+
sourceBookId: string;
|
|
741
|
+
sourceHeadRevision: string;
|
|
742
|
+
artifactCount: number;
|
|
743
|
+
notebookCount: number;
|
|
744
|
+
timelineSlotCount: number;
|
|
745
|
+
timelineAudioCount: number;
|
|
746
|
+
objectCount: number;
|
|
747
|
+
estimatedReindexArtifacts: number;
|
|
748
|
+
issues: MigrationIssue[];
|
|
749
|
+
migrationKey: string;
|
|
750
|
+
}
|
|
751
|
+
export interface V4MigrationResult extends V4MigrationDryRun {
|
|
752
|
+
destinationBookId: string;
|
|
753
|
+
destinationRevision: string;
|
|
754
|
+
importActionId: string;
|
|
755
|
+
reportArtifactId: string;
|
|
756
|
+
copiedObjectCount: number;
|
|
757
|
+
reusedObjectCount: number;
|
|
758
|
+
completedAt: number;
|
|
759
|
+
}
|
|
760
|
+
export {};
|
|
761
|
+
//# sourceMappingURL=mvp-contracts.d.ts.map
|