@mengine/medeo-client 3.0.1-tool-guardrails.0 → 3.1.1-dsl.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 CHANGED
@@ -47,7 +47,7 @@ For explicit synchronization, use `ManualSyncDoc.open({client, peerId})`, then `
47
47
  - AudioScript: segmented text; segments are inserted, moved and deleted by id, each with its own native Text. A transcript names the transcription file it was read from, and its segments keep the `startMs`/`endMs` that file gave them (`tx.insertSegment(..., time)`); a segment's time is written when it is added and never edited.
48
48
  - Caption: independent native Text or a selection of one script segment (whole, or a Cursor run inside it); style and source switching.
49
49
 
50
- `resolveDslLayout`, `toVideoDraft`, `fromVideoDraft`, `toAudioScriptViews`, `MedeoDsl` and the model types are exported from the root and `/dsl`. `toAudioScriptViews` (on a session, `projectAudioScripts()`) reads the same snapshot as the VideoDraft and lists every AudioScript with its segments — a transcript's with their `startMs`/`endMs` and a `timelineMs`, the position on the earliest Clip playing the transcribed medium whose window holds that moment — its PhoneticScripts with their digests, the speech Clips saying it (with `applied`) and the Caption Clips showing one of its segments. Projection returns diagnostics; unrepresentable legacy output throws `DslProjectionError`. `MengineHttpClient.fetchDraft()` / `fetchDraftAt(seq)` read the server's content, diagnostics and matching version.
50
+ `resolveDslLayout`, `toVideoDraft`, `fromVideoDraft`, `normalizeLegacyVideoDraft` (the repairs a saved Legacy draft gets before import), `toAudioScriptViews`, `MedeoDsl`, the placeholder media (`BLANK_PLACEHOLDER`, `missingMediaPlaceholder`) and the model types are exported from the root and `/dsl`. `toAudioScriptViews` (on a session, `projectAudioScripts()`) reads the same snapshot as the VideoDraft and lists every AudioScript with its segments — a transcript's with their `startMs`/`endMs` and a `timelineMs`, the position on the earliest Clip playing the transcribed medium whose window holds that moment — its PhoneticScripts with their digests, the speech Clips saying it (with `applied`) and the Caption Clips showing one of its segments. Projection returns diagnostics; unrepresentable legacy output throws `DslProjectionError`. `MengineHttpClient.fetchDraft()` / `fetchDraftAt(seq)` read the server's content, diagnostics and matching version.
51
51
 
52
52
  ## The DSL document
53
53
 
@@ -173,9 +173,39 @@ function assertScriptSegment(value) {
173
173
  /** A script's segments: each with its own id, unique within the script. */
174
174
  const segments = (v) => Array.isArray(v) && v.every(segment) && new Set(v.map((s) => s.id)).size === v.length;
175
175
  const locator = {
176
- system: required(oneOf("memota", "memota-speech")),
176
+ system: required(oneOf("memota", "memota-speech", "placeholder")),
177
177
  key: required(nonempty)
178
178
  };
179
+ /**
180
+ * A placeholder medium is an Image with no file, standing in where a legacy VideoDraft placed a
181
+ * visual clip the old editor drew as a blank (D205). The blank one stands in for a clip placed
182
+ * without media (`origin_media_id: ''`); one keyed by a memota media id stands in for media the
183
+ * clip named but Director found missing, so the id survives. Importing keeps the clips' time on
184
+ * them instead of dropping them. Only migration authors them.
185
+ */
186
+ const BLANK_PLACEHOLDER = {
187
+ system: "placeholder",
188
+ key: "blank",
189
+ kind: "image"
190
+ };
191
+ /**
192
+ * Only a memota media id may key a missing-media placeholder: visual parts name media and nothing
193
+ * else, and a key of this shape can never be mistaken for a file.
194
+ */
195
+ const MISSING_MEDIA_KEY = /^media_[0-9A-Za-z]+$/;
196
+ /** The placeholder for a memota media id Director found missing. */
197
+ function missingMediaPlaceholder(mediaId) {
198
+ return {
199
+ system: "placeholder",
200
+ key: mediaId,
201
+ kind: "image"
202
+ };
203
+ }
204
+ function assertPlaceholder(media) {
205
+ if (media.system !== "placeholder") return;
206
+ if (media.kind !== "image" || media.key !== BLANK_PLACEHOLDER.key && !(typeof media.key === "string" && MISSING_MEDIA_KEY.test(media.key))) throw new Error("A placeholder is the blank Image or one standing in for a missing memota media id");
207
+ if (media.storageKey !== void 0 || media.digest !== void 0) throw new Error("A placeholder has no file");
208
+ }
179
209
  const entityFields = {
180
210
  "timeline-entities": {},
181
211
  "track-entities": {
@@ -271,6 +301,7 @@ function assertEntity(table, value) {
271
301
  checkFields(value, entityFields[table]);
272
302
  if (table === "audio-script-entities") assertTranscriptFile(value);
273
303
  if (table === "media-entities") {
304
+ assertPlaceholder(value);
274
305
  if (value.kind === "image" && value.durationMs !== void 0) throw new Error("Image has no intrinsic duration");
275
306
  if (value.kind !== "image" && !positive(value.durationMs)) throw new Error("Finite media requires durationMs");
276
307
  if (["audio", "voiceover-recording"].includes(value.kind) && !nonempty(value.storageKey)) throw new Error("Audio requires storageKey");
@@ -299,6 +330,7 @@ function assertEntityPatch(table, patch, current) {
299
330
  ]) if (Object.hasOwn(patch, key) && patch[key] !== current[key]) throw new Error(`Resource identity field is immutable: ${key}`);
300
331
  }
301
332
  if (table === "media-entities") {
333
+ assertPlaceholder(next);
302
334
  if (Object.hasOwn(patch, "durationMs")) {
303
335
  if (next.kind === "image" ? next.durationMs !== void 0 : !positive(next.durationMs)) throw new Error("durationMs must match the media kind");
304
336
  }
@@ -8290,13 +8322,14 @@ function toVideoDraft(snapshot) {
8290
8322
  duration_ms: clip.durationMs
8291
8323
  };
8292
8324
  if (track.role === "video_clip") {
8293
- if (!source || !["image", "video"].includes(source.kind) || source.system !== "memota") fail("Visual playback requires a memota Image or Video");
8325
+ const placeholder = source?.system === "placeholder";
8326
+ if (!source || !["image", "video"].includes(source.kind) || !(source.system === "memota" || placeholder)) fail("Visual playback requires a memota Image or Video, or a placeholder Image");
8294
8327
  if (clip.fillTimeline) fail("VideoDraft cannot express timeline-filling visual content");
8295
8328
  parts[clip.clipId] = { video_clip: {
8296
8329
  ...common,
8297
8330
  play_in: clip.inMs,
8298
8331
  play_out: clip.outMs,
8299
- origin_media_id: source.key,
8332
+ origin_media_id: placeholder && source.key === BLANK_PLACEHOLDER.key ? "" : source.key,
8300
8333
  volume: clip.volume,
8301
8334
  ...snapshot["clip-entities"][clip.clipId].seqMarker.rate === void 0 ? {} : { speed_shift: {
8302
8335
  category: "linear",
@@ -8518,6 +8551,7 @@ function prepare(input, options) {
8518
8551
  if (facts.has(id)) fail("mediaFacts", `Duplicate facts for ${fact.system}/${fact.key}`);
8519
8552
  facts.set(id, fact);
8520
8553
  }
8554
+ for (const fact of facts.values()) if (fact.system === "placeholder" && facts.has(resourceId("media", "memota", fact.key))) fail("mediaFacts", `Media cannot be both present and missing: ${fact.key}`);
8521
8555
  const register = (media) => {
8522
8556
  const id = resourceId("media", media.system, media.key), old = imported.get(id);
8523
8557
  if (old) {
@@ -8543,6 +8577,15 @@ function prepare(input, options) {
8543
8577
  const mediaByPart = /* @__PURE__ */ new Map(), scriptByRecording = /* @__PURE__ */ new Map(), scriptsByPart = /* @__PURE__ */ new Map();
8544
8578
  const voices = /* @__PURE__ */ new Set();
8545
8579
  for (const [id, p] of Object.entries(library)) if (p.video_clip) {
8580
+ if (p.video_clip.origin_media_id === "") {
8581
+ mediaByPart.set(id, register(BLANK_PLACEHOLDER));
8582
+ continue;
8583
+ }
8584
+ const missing = p.video_clip.origin_media_id && facts.get(resourceId("media", "placeholder", p.video_clip.origin_media_id));
8585
+ if (missing) {
8586
+ mediaByPart.set(id, register(missing));
8587
+ continue;
8588
+ }
8546
8589
  const fact = factFor("memota", p.video_clip.origin_media_id);
8547
8590
  if (fact.kind !== "image" && fact.kind !== "video") fail(`part_library/${id}`, "Expected Image or Video facts");
8548
8591
  mediaByPart.set(id, register(fact));
@@ -8760,5 +8803,122 @@ function importedScript(id, text, mintSegment) {
8760
8803
  segments
8761
8804
  };
8762
8805
  }
8806
+ function normalizeLegacyVideoDraft(input, mediaFacts = []) {
8807
+ const draft = structuredClone(input);
8808
+ const diagnostics = [];
8809
+ const note = (code, path, message) => diagnostics.push({
8810
+ code,
8811
+ path,
8812
+ message
8813
+ });
8814
+ const library = draft.part_library ?? {};
8815
+ const tracks = [
8816
+ ...draft.above_main_tracks ?? [],
8817
+ ...draft.main_track ? [draft.main_track] : [],
8818
+ ...draft.below_main_tracks ?? []
8819
+ ];
8820
+ const facts = new Map(mediaFacts.map((fact) => [resourceId("media", fact.system, fact.key), fact]));
8821
+ const round = (owner, field, path) => {
8822
+ const fields = owner;
8823
+ const value = fields[field];
8824
+ if (typeof value !== "number" || !Number.isFinite(value) || Number.isSafeInteger(value)) return;
8825
+ const rounded = Math.round(value);
8826
+ fields[field] = rounded;
8827
+ note("legacy-time-rounded", `${path}/${field}`, `${value} → ${rounded}`);
8828
+ };
8829
+ for (const track of tracks) for (const item of track.items ?? []) round(item, "abs_time_position", `tracks/${track.id}/${item.part_id}`);
8830
+ for (const [id, part] of Object.entries(library)) {
8831
+ const path = `part_library/${id}`;
8832
+ if (part.video_clip) for (const f of [
8833
+ "play_in",
8834
+ "play_out",
8835
+ "duration_ms"
8836
+ ]) round(part.video_clip, f, path);
8837
+ if (part.speech) for (const f of ["duration_ms", "media_duration_ms"]) round(part.speech, f, path);
8838
+ if (part.caption) for (const f of [
8839
+ "duration_ms",
8840
+ "initial_duration_ms",
8841
+ "start_ms"
8842
+ ]) round(part.caption, f, path);
8843
+ if (part.bgm) round(part.bgm, "duration_ms", path);
8844
+ }
8845
+ for (const aggregation of draft.part_aggregations ?? []) for (const attachment of aggregation.attachments ?? []) round(attachment, "relative_time_position", `part_aggregations/${aggregation.body_part_id}/${attachment.part_id}`);
8846
+ const dropped = /* @__PURE__ */ new Set();
8847
+ const drop = (id, why) => {
8848
+ dropped.add(id);
8849
+ note("legacy-part-dropped", `part_library/${id}`, why);
8850
+ };
8851
+ for (const [id, part] of Object.entries(library)) {
8852
+ const path = `part_library/${id}`;
8853
+ const clip = part.video_clip;
8854
+ const sound = part.bgm ?? part.speech;
8855
+ const fact = part.bgm ? facts.get(resourceId("media", "memota", part.bgm.origin_media_id ?? "")) : part.speech && facts.get(resourceId("media", "memota-speech", part.speech.origin_speech_id ?? ""));
8856
+ if (sound && fact && "storageKey" in fact && fact.storageKey && fact.storageKey !== sound.audio_storage_key) {
8857
+ note("legacy-storage-key-current", `${path}/audio_storage_key`, `${sound.audio_storage_key} → ${fact.storageKey}`);
8858
+ sound.audio_storage_key = fact.storageKey;
8859
+ }
8860
+ if (!clip) continue;
8861
+ const rate = clip.speed_shift?.config?.linear?.speed ?? 1;
8862
+ const inMs = clip.play_in ?? 0;
8863
+ const outMs = clip.play_out ?? (clip.duration_ms === void 0 ? void 0 : inMs + Math.round(clip.duration_ms * rate));
8864
+ const source = facts.get(resourceId("media", "memota", clip.origin_media_id ?? ""));
8865
+ let windowEnd = outMs;
8866
+ if (source?.kind === "video" && outMs !== void 0 && outMs > source.durationMs) {
8867
+ windowEnd = source.durationMs;
8868
+ if (windowEnd > inMs) {
8869
+ note("legacy-window-cut", `${path}/play_out`, `${outMs} → ${windowEnd} (source length)`);
8870
+ clip.play_out = windowEnd;
8871
+ if (clip.duration_ms !== void 0) clip.duration_ms = Math.max(0, Math.round((windowEnd - inMs) / rate));
8872
+ }
8873
+ }
8874
+ if (windowEnd === void 0) continue;
8875
+ const length = windowEnd - inMs;
8876
+ if (length <= 0) drop(id, `Empty window ${inMs}–${windowEnd}`);
8877
+ else if (clip.origin_media_id === "" && length / rate < 40) drop(id, `Placeholder sliver of ${length / rate}ms`);
8878
+ }
8879
+ for (const id of dropped) delete library[id];
8880
+ for (const track of tracks) track.items = track.items?.filter((item) => !dropped.has(item.part_id ?? ""));
8881
+ const abs = /* @__PURE__ */ new Map();
8882
+ for (const track of tracks) for (const item of track.items ?? []) abs.set(item.part_id ?? "", item.abs_time_position ?? 0);
8883
+ const mainOrder = new Map((draft.main_track?.items ?? []).map((item, index) => [item.part_id ?? "", index]));
8884
+ const candidates = /* @__PURE__ */ new Map();
8885
+ for (const aggregation of draft.part_aggregations ?? []) {
8886
+ const host = aggregation.body_part_id ?? "";
8887
+ for (const attachment of aggregation.attachments ?? []) {
8888
+ const speech = attachment.part_id ?? "";
8889
+ const path = `part_aggregations/${host}/${speech}`;
8890
+ if (!library[speech]?.speech) note("legacy-attachment-dropped", path, "Not a placed Speech");
8891
+ else if (!library[host]?.video_clip || !mainOrder.has(host)) note("legacy-attachment-dropped", path, "Host is not a placed visual clip");
8892
+ else candidates.set(speech, [...candidates.get(speech) ?? [], {
8893
+ host,
8894
+ offset: attachment.relative_time_position ?? 0
8895
+ }]);
8896
+ }
8897
+ }
8898
+ const chosen = /* @__PURE__ */ new Map();
8899
+ for (const [speech, list] of candidates) {
8900
+ if (list.length === 1) {
8901
+ chosen.set(speech, list[0]);
8902
+ continue;
8903
+ }
8904
+ const playing = list.filter((c) => (abs.get(c.host) ?? 0) + c.offset === abs.get(speech)).sort((a, b) => mainOrder.get(a.host) - mainOrder.get(b.host));
8905
+ const pick = playing[0] ?? list[0];
8906
+ chosen.set(speech, pick);
8907
+ note(playing.length ? "legacy-speech-host-chosen" : "legacy-speech-host-unmatched", `part_aggregations/${pick.host}/${speech}`, `${list.length} hosts: ${list.map((c) => c.host).join(", ")}`);
8908
+ }
8909
+ const byHost = /* @__PURE__ */ new Map();
8910
+ for (const [speech, { host, offset }] of chosen) byHost.set(host, [...byHost.get(host) ?? [], {
8911
+ part_id: speech,
8912
+ relative_time_position: offset
8913
+ }]);
8914
+ if (draft.part_aggregations) draft.part_aggregations = [...new Set(draft.part_aggregations.map((a) => a.body_part_id ?? ""))].filter((host) => byHost.has(host)).map((host) => ({
8915
+ body_part_id: host,
8916
+ attachments: byHost.get(host)
8917
+ }));
8918
+ return {
8919
+ draft,
8920
+ diagnostics
8921
+ };
8922
+ }
8763
8923
  //#endregion
8764
- export { tupleHash as S, resolveDslLayout as _, DslEditor as a, relationId as b, MedeoDsl as c, assertPhoneticBindingFormat as d, documentFormat as f, timeAnchorCodec as g, isInvalidAtomic as h, createInitialMedeoDsl as i, UnsupportedDocumentFormatError as l, captionContentCodec as m, toVideoDraft as n, spokenScripts as o, medeoDslLoroShape as p, DEFAULT_UNIT_TIME_MS as r, toAudioScriptViews as s, fromVideoDraft as t, assertDslDocument as u, DslProjectionError as v, resourceId as x, defaultIdFactory as y };
8924
+ export { relationId as C, defaultIdFactory as S, tupleHash as T, timeAnchorCodec as _, createInitialMedeoDsl as a, BLANK_PLACEHOLDER as b, toAudioScriptViews as c, assertDslDocument as d, assertPhoneticBindingFormat as f, isInvalidAtomic as g, captionContentCodec as h, DEFAULT_UNIT_TIME_MS as i, MedeoDsl as l, medeoDslLoroShape as m, fromVideoDraft as n, DslEditor as o, documentFormat as p, toVideoDraft as r, spokenScripts as s, normalizeLegacyVideoDraft as t, UnsupportedDocumentFormatError as u, resolveDslLayout as v, resourceId as w, missingMediaPlaceholder as x, DslProjectionError as y };
package/dist/dsl.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as MoveDslClipsInput, A as ApplyVoiceoverInput, At as RelationValues, B as InvalidAtomic, Bt as Track, C as DslClipLayout, Ct as EntityValues, D as createInitialMedeoDsl, Dt as RelationMutation, E as DslTrackLayout, Et as Media, F as DslAudit, Ft as TextEdit, G as MedeoDslLoroState, H as isInvalidAtomic, Ht as Voice, I as DslTransaction, It as TextMark, J as OpActor, K as medeoDslLoroShape, L as UnsupportedDocumentFormatError, Lt as TextMutation, M as VoiceoverResult, Mt as RichTextSnapshot, N as CreateMedeoDslOptions, Nt as StoredFile, O as DslEditor, Ot as RelationTable, P as MedeoDsl, Pt as TextDelta, Q as DslClipUpdate, R as assertDslDocument, Rt as TextRun, S as resolveDslLayout, St as EntityTables, T as DslProjectionError, Tt as MedeoDslSnapshot, U as timeAnchorCodec, V as captionContentCodec, Vt as TrackRole, W as MedeoDslDraft, X as AddDslClipsInput, Y as AddDslClip, Z as ClipSource, _ as VideoDraftInput, _t as DeepReadonly, a as SpokenScript, at as relationId, b as VideoDraftTrack, bt as EntityMutation, c as VideoDraftProjection, ct as AudioScript, d as DEFAULT_UNIT_TIME_MS, dt as CaptionSelection, et as ReplaceDslClipsInput, f as VideoCreationSettings, ft as CaptionStyle, g as VideoDraftContentPartUnion, gt as ContainNode, h as VideoDraftContent, ht as ContainMutation, i as AudioScriptView, it as defaultIdFactory, j as VoiceoverCaptionInput, jt as ResourceSystem, k as UploadText, kt as RelationTables, l as toVideoDraft, lt as Caption, m as VideoDraftCaptionStyle, mt as Clip, n as ImportedVideoDraft, nt as DslIdFactory, o as spokenScripts, ot as resourceId, p as VideoDraft, pt as CaptionText, q as CommitOptions, r as fromVideoDraft, rt as EntityIdKind, s as toAudioScriptViews, st as tupleHash, t as FromVideoDraftOptions, tt as ClipPlacement, u as CaptionDisplayCue, ut as CaptionContent, v as VideoDraftPartUnion, vt as DslDiagnostic, w as DslLayout, wt as FieldPatch, x as VideoDraftTrackItem, xt as EntityTable, y as VideoDraftTimeline, yt as DslMutation, z as documentFormat, zt as TimeAnchor } from "./index-C1iiDt_Q.js";
2
- export { type AddDslClip, type AddDslClipsInput, type ApplyVoiceoverInput, type AudioScript, type AudioScriptView, type Caption, type CaptionContent, type CaptionDisplayCue, type CaptionSelection, type CaptionStyle, type CaptionText, type Clip, type ClipPlacement, type ClipSource, type CommitOptions, type ContainMutation, type ContainNode, type CreateMedeoDslOptions, DEFAULT_UNIT_TIME_MS, type DeepReadonly, type DslAudit, type DslClipLayout, type DslClipUpdate, type DslDiagnostic, DslEditor, type DslIdFactory, type DslLayout, type DslMutation, DslProjectionError, type DslTrackLayout, type DslTransaction, type EntityIdKind, type EntityMutation, type EntityTable, type EntityTables, type EntityValues, type FieldPatch, type FromVideoDraftOptions, type ImportedVideoDraft, type InvalidAtomic, MedeoDsl, type MedeoDslDraft, type MedeoDslLoroState, type MedeoDslSnapshot, type Media, type MoveDslClipsInput, type OpActor, type RelationMutation, type RelationTable, type RelationTables, type RelationValues, type ReplaceDslClipsInput, type ResourceSystem, type RichTextSnapshot, type SpokenScript, type StoredFile, type TextDelta, type TextEdit, type TextMark, type TextMutation, type TextRun, type TimeAnchor, type Track, type TrackRole, UnsupportedDocumentFormatError, type UploadText, type VideoCreationSettings, type VideoDraft, type VideoDraftCaptionStyle, type VideoDraftContent, type VideoDraftContentPartUnion, type VideoDraftInput, type VideoDraftPartUnion, type VideoDraftProjection, type VideoDraftTimeline, type VideoDraftTrack, type VideoDraftTrackItem, type Voice, type VoiceoverCaptionInput, type VoiceoverResult, assertDslDocument, captionContentCodec, createInitialMedeoDsl, defaultIdFactory, documentFormat, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
1
+ import { $ as ClipSource, A as DslEditor, At as Media, B as assertDslDocument, Bt as TextMark, C as VideoDraftTrackItem, Ct as DslMutation, D as DslProjectionError, Dt as EntityValues, E as DslLayout, Et as EntityTables, F as CreateMedeoDslOptions, Ft as ResourceSystem, G as timeAnchorCodec, Gt as TrackRole, H as InvalidAtomic, Ht as TextRun, I as MedeoDsl, It as RichTextSnapshot, J as medeoDslLoroShape, K as MedeoDslDraft, Kt as Voice, L as DslAudit, Lt as StoredFile, M as ApplyVoiceoverInput, Mt as RelationTable, N as VoiceoverCaptionInput, Nt as RelationTables, O as DslTrackLayout, Ot as FieldPatch, P as VoiceoverResult, Pt as RelationValues, Q as AddDslClipsInput, R as DslTransaction, Rt as TextDelta, S as VideoDraftTrack, St as DslDiagnostic, T as DslClipLayout, Tt as EntityTable, U as captionContentCodec, Ut as TimeAnchor, V as documentFormat, Vt as TextMutation, W as isInvalidAtomic, Wt as Track, X as OpActor, Y as CommitOptions, Z as AddDslClip, _ as VideoDraftContent, _t as CaptionText, a as fromVideoDraft, at as missingMediaPlaceholder, b as VideoDraftPartUnion, bt as ContainNode, c as spokenScripts, ct as defaultIdFactory, d as toVideoDraft, dt as tupleHash, et as DslClipUpdate, f as CaptionDisplayCue, ft as AudioScript, g as VideoDraftCaptionStyle, gt as CaptionStyle, h as VideoDraft, ht as CaptionSelection, i as ImportedVideoDraft, it as BLANK_PLACEHOLDER, j as UploadText, jt as RelationMutation, k as createInitialMedeoDsl, kt as MedeoDslSnapshot, l as toAudioScriptViews, lt as relationId, m as VideoCreationSettings, mt as CaptionContent, n as normalizeLegacyVideoDraft, nt as ReplaceDslClipsInput, o as AudioScriptView, ot as DslIdFactory, p as DEFAULT_UNIT_TIME_MS, pt as Caption, q as MedeoDslLoroState, r as FromVideoDraftOptions, rt as ClipPlacement, s as SpokenScript, st as EntityIdKind, t as NormalizedLegacyVideoDraft, tt as MoveDslClipsInput, u as VideoDraftProjection, ut as resourceId, v as VideoDraftContentPartUnion, vt as Clip, w as resolveDslLayout, wt as EntityMutation, x as VideoDraftTimeline, xt as DeepReadonly, y as VideoDraftInput, yt as ContainMutation, z as UnsupportedDocumentFormatError, zt as TextEdit } from "./index-CQ8h3u9S.js";
2
+ export { type AddDslClip, type AddDslClipsInput, type ApplyVoiceoverInput, type AudioScript, type AudioScriptView, BLANK_PLACEHOLDER, type Caption, type CaptionContent, type CaptionDisplayCue, type CaptionSelection, type CaptionStyle, type CaptionText, type Clip, type ClipPlacement, type ClipSource, type CommitOptions, type ContainMutation, type ContainNode, type CreateMedeoDslOptions, DEFAULT_UNIT_TIME_MS, type DeepReadonly, type DslAudit, type DslClipLayout, type DslClipUpdate, type DslDiagnostic, DslEditor, type DslIdFactory, type DslLayout, type DslMutation, DslProjectionError, type DslTrackLayout, type DslTransaction, type EntityIdKind, type EntityMutation, type EntityTable, type EntityTables, type EntityValues, type FieldPatch, type FromVideoDraftOptions, type ImportedVideoDraft, type InvalidAtomic, MedeoDsl, type MedeoDslDraft, type MedeoDslLoroState, type MedeoDslSnapshot, type Media, type MoveDslClipsInput, type NormalizedLegacyVideoDraft, type OpActor, type RelationMutation, type RelationTable, type RelationTables, type RelationValues, type ReplaceDslClipsInput, type ResourceSystem, type RichTextSnapshot, type SpokenScript, type StoredFile, type TextDelta, type TextEdit, type TextMark, type TextMutation, type TextRun, type TimeAnchor, type Track, type TrackRole, UnsupportedDocumentFormatError, type UploadText, type VideoCreationSettings, type VideoDraft, type VideoDraftCaptionStyle, type VideoDraftContent, type VideoDraftContentPartUnion, type VideoDraftInput, type VideoDraftPartUnion, type VideoDraftProjection, type VideoDraftTimeline, type VideoDraftTrack, type VideoDraftTrackItem, type Voice, type VoiceoverCaptionInput, type VoiceoverResult, assertDslDocument, captionContentCodec, createInitialMedeoDsl, defaultIdFactory, documentFormat, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, missingMediaPlaceholder, normalizeLegacyVideoDraft, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
package/dist/dsl.js CHANGED
@@ -1,2 +1,2 @@
1
- import { S as tupleHash, _ as resolveDslLayout, a as DslEditor, b as relationId, c as MedeoDsl, f as documentFormat, g as timeAnchorCodec, h as isInvalidAtomic, i as createInitialMedeoDsl, l as UnsupportedDocumentFormatError, m as captionContentCodec, n as toVideoDraft, o as spokenScripts, p as medeoDslLoroShape, r as DEFAULT_UNIT_TIME_MS, s as toAudioScriptViews, t as fromVideoDraft, u as assertDslDocument, v as DslProjectionError, x as resourceId, y as defaultIdFactory } from "./dsl-96AZnd7O.js";
2
- export { DEFAULT_UNIT_TIME_MS, DslEditor, DslProjectionError, MedeoDsl, UnsupportedDocumentFormatError, assertDslDocument, captionContentCodec, createInitialMedeoDsl, defaultIdFactory, documentFormat, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
1
+ import { C as relationId, S as defaultIdFactory, T as tupleHash, _ as timeAnchorCodec, a as createInitialMedeoDsl, b as BLANK_PLACEHOLDER, c as toAudioScriptViews, d as assertDslDocument, g as isInvalidAtomic, h as captionContentCodec, i as DEFAULT_UNIT_TIME_MS, l as MedeoDsl, m as medeoDslLoroShape, n as fromVideoDraft, o as DslEditor, p as documentFormat, r as toVideoDraft, s as spokenScripts, t as normalizeLegacyVideoDraft, u as UnsupportedDocumentFormatError, v as resolveDslLayout, w as resourceId, x as missingMediaPlaceholder, y as DslProjectionError } from "./dsl-Xm5NW58k.js";
2
+ export { BLANK_PLACEHOLDER, DEFAULT_UNIT_TIME_MS, DslEditor, DslProjectionError, MedeoDsl, UnsupportedDocumentFormatError, assertDslDocument, captionContentCodec, createInitialMedeoDsl, defaultIdFactory, documentFormat, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, missingMediaPlaceholder, normalizeLegacyVideoDraft, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
@@ -2,7 +2,11 @@ import { ContainerType, Cursor, LoroDoc, PeerID, TreeID } from "loro-crdt";
2
2
 
3
3
  //#region ../medeo-dsl/src/types.d.ts
4
4
  type TrackRole = 'video_clip' | 'speech' | 'caption' | 'bgm';
5
- type ResourceSystem = 'memota' | 'memota-speech';
5
+ /**
6
+ * Where a resource's bytes live. `placeholder` is no store: its Images stand in for a visual Clip a
7
+ * legacy VideoDraft placed without media ({@link BLANK_PLACEHOLDER}) or with media found missing.
8
+ */
9
+ type ResourceSystem = 'memota' | 'memota-speech' | 'placeholder';
6
10
  interface Track$1 {
7
11
  role: TrackRole;
8
12
  hidden?: boolean;
@@ -335,6 +339,22 @@ type EntityIdKind = 'timeline' | 'track' | 'clip' | 'audio-script' | 'segment' |
335
339
  type DslIdFactory = (kind: EntityIdKind) => string;
336
340
  declare const defaultIdFactory: DslIdFactory;
337
341
  //#endregion
342
+ //#region ../medeo-dsl/src/fields.d.ts
343
+ /**
344
+ * A placeholder medium is an Image with no file, standing in where a legacy VideoDraft placed a
345
+ * visual clip the old editor drew as a blank (D205). The blank one stands in for a clip placed
346
+ * without media (`origin_media_id: ''`); one keyed by a memota media id stands in for media the
347
+ * clip named but Director found missing, so the id survives. Importing keeps the clips' time on
348
+ * them instead of dropping them. Only migration authors them.
349
+ */
350
+ declare const BLANK_PLACEHOLDER: {
351
+ readonly system: "placeholder";
352
+ readonly key: "blank";
353
+ readonly kind: "image";
354
+ };
355
+ /** The placeholder for a memota media id Director found missing. */
356
+ declare function missingMediaPlaceholder(mediaId: string): Media;
357
+ //#endregion
338
358
  //#region src/dsl/action-context.d.ts
339
359
  type ClipPlacement = {
340
360
  kind: 'sequential';
@@ -1862,4 +1882,12 @@ interface ImportedVideoDraft {
1862
1882
  /** One-time import into a newly owned document; never reverse-diff a live collaborative document. */
1863
1883
  declare function fromVideoDraft(input: VideoDraftInput, options: FromVideoDraftOptions): ImportedVideoDraft;
1864
1884
  //#endregion
1865
- export { MoveDslClipsInput as $, ApplyVoiceoverInput as A, RelationValues as At, InvalidAtomic as B, Track$1 as Bt, DslClipLayout as C, EntityValues as Ct, createInitialMedeoDsl as D, RelationMutation as Dt, DslTrackLayout as E, Media as Et, DslAudit as F, TextEdit as Ft, MedeoDslLoroState as G, isInvalidAtomic as H, Voice as Ht, DslTransaction as I, TextMark as It, OpActor as J, medeoDslLoroShape as K, UnsupportedDocumentFormatError as L, TextMutation as Lt, VoiceoverResult as M, RichTextSnapshot as Mt, CreateMedeoDslOptions as N, StoredFile as Nt, DslEditor as O, RelationTable as Ot, MedeoDsl as P, TextDelta as Pt, DslClipUpdate as Q, assertDslDocument as R, TextRun as Rt, resolveDslLayout as S, EntityTables as St, DslProjectionError as T, MedeoDslSnapshot as Tt, timeAnchorCodec as U, captionContentCodec as V, TrackRole as Vt, MedeoDslDraft as W, AddDslClipsInput as X, AddDslClip as Y, ClipSource as Z, VideoDraftInput as _, DeepReadonly as _t, SpokenScript as a, relationId as at, VideoDraftTrack as b, EntityMutation as bt, VideoDraftProjection as c, AudioScript as ct, DEFAULT_UNIT_TIME_MS as d, CaptionSelection as dt, ReplaceDslClipsInput as et, VideoCreationSettings as f, CaptionStyle$1 as ft, VideoDraftContentPartUnion as g, ContainNode as gt, VideoDraftContent as h, ContainMutation as ht, AudioScriptView as i, defaultIdFactory as it, VoiceoverCaptionInput as j, ResourceSystem as jt, UploadText as k, RelationTables as kt, toVideoDraft as l, Caption as lt, VideoDraftCaptionStyle as m, Clip as mt, ImportedVideoDraft as n, DslIdFactory as nt, spokenScripts as o, resourceId as ot, VideoDraft as p, CaptionText as pt, CommitOptions as q, fromVideoDraft as r, EntityIdKind as rt, toAudioScriptViews as s, tupleHash as st, FromVideoDraftOptions as t, ClipPlacement as tt, CaptionDisplayCue as u, CaptionContent as ut, VideoDraftPartUnion as v, DslDiagnostic as vt, DslLayout as w, FieldPatch as wt, VideoDraftTrackItem as x, EntityTable as xt, VideoDraftTimeline as y, DslMutation as yt, documentFormat as z, TimeAnchor as zt };
1885
+ //#region src/dsl/projection/normalize-legacy-video-draft.d.ts
1886
+ interface NormalizedLegacyVideoDraft {
1887
+ draft: VideoDraftInput;
1888
+ /** One entry per repair, naming the part or field and its value before and after. */
1889
+ diagnostics: DslDiagnostic[];
1890
+ }
1891
+ declare function normalizeLegacyVideoDraft(input: VideoDraftInput, mediaFacts?: readonly Media[]): NormalizedLegacyVideoDraft;
1892
+ //#endregion
1893
+ export { ClipSource as $, DslEditor as A, Media as At, assertDslDocument as B, TextMark as Bt, VideoDraftTrackItem as C, DslMutation as Ct, DslProjectionError as D, EntityValues as Dt, DslLayout as E, EntityTables as Et, CreateMedeoDslOptions as F, ResourceSystem as Ft, timeAnchorCodec as G, TrackRole as Gt, InvalidAtomic as H, TextRun as Ht, MedeoDsl as I, RichTextSnapshot as It, medeoDslLoroShape as J, MedeoDslDraft as K, Voice as Kt, DslAudit as L, StoredFile as Lt, ApplyVoiceoverInput as M, RelationTable as Mt, VoiceoverCaptionInput as N, RelationTables as Nt, DslTrackLayout as O, FieldPatch as Ot, VoiceoverResult as P, RelationValues as Pt, AddDslClipsInput as Q, DslTransaction as R, TextDelta as Rt, VideoDraftTrack as S, DslDiagnostic as St, DslClipLayout as T, EntityTable as Tt, captionContentCodec as U, TimeAnchor as Ut, documentFormat as V, TextMutation as Vt, isInvalidAtomic as W, Track$1 as Wt, OpActor as X, CommitOptions as Y, AddDslClip as Z, VideoDraftContent as _, CaptionText as _t, fromVideoDraft as a, missingMediaPlaceholder as at, VideoDraftPartUnion as b, ContainNode as bt, spokenScripts as c, defaultIdFactory as ct, toVideoDraft as d, tupleHash as dt, DslClipUpdate as et, CaptionDisplayCue as f, AudioScript as ft, VideoDraftCaptionStyle as g, CaptionStyle$1 as gt, VideoDraft as h, CaptionSelection as ht, ImportedVideoDraft as i, BLANK_PLACEHOLDER as it, UploadText as j, RelationMutation as jt, createInitialMedeoDsl as k, MedeoDslSnapshot as kt, toAudioScriptViews as l, relationId as lt, VideoCreationSettings as m, CaptionContent as mt, normalizeLegacyVideoDraft as n, ReplaceDslClipsInput as nt, AudioScriptView as o, DslIdFactory as ot, DEFAULT_UNIT_TIME_MS as p, Caption as pt, MedeoDslLoroState as q, FromVideoDraftOptions as r, ClipPlacement as rt, SpokenScript as s, EntityIdKind as st, NormalizedLegacyVideoDraft as t, MoveDslClipsInput as tt, VideoDraftProjection as u, resourceId as ut, VideoDraftContentPartUnion as v, Clip as vt, resolveDslLayout as w, EntityMutation as wt, VideoDraftTimeline as x, DeepReadonly as xt, VideoDraftInput as y, ContainMutation as yt, UnsupportedDocumentFormatError as z, TextEdit as zt };
@@ -1,4 +1,4 @@
1
- import { O as DslEditor, P as MedeoDsl, Tt as MedeoDslSnapshot, Vt as TrackRole, c as VideoDraftProjection, h as VideoDraftContent, i as AudioScriptView, jt as ResourceSystem, k as UploadText, q as CommitOptions, vt as DslDiagnostic } from "./index-C1iiDt_Q.js";
1
+ import { A as DslEditor, Ft as ResourceSystem, Gt as TrackRole, I as MedeoDsl, St as DslDiagnostic, Y as CommitOptions, _ as VideoDraftContent, j as UploadText, kt as MedeoDslSnapshot, o as AudioScriptView, u as VideoDraftProjection } from "./index-CQ8h3u9S.js";
2
2
  import { LoroDoc, PeerID, VersionVector } from "loro-crdt";
3
3
  import { DocState, LocalSaveState } from "@mengine/sync";
4
4
  import { BaseDocStorage, Connection, DocDiff, DocPushReceipt, DocSnapshotRecord, DocStorage, DocStorageOptions, DocUpdate, DocUpdateRecord } from "@mengine/storage";
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { $ as MoveDslClipsInput, A as ApplyVoiceoverInput, At as RelationValues, B as InvalidAtomic, Bt as Track, C as DslClipLayout, Ct as EntityValues, D as createInitialMedeoDsl, Dt as RelationMutation, E as DslTrackLayout, Et as Media, F as DslAudit, Ft as TextEdit, G as MedeoDslLoroState, H as isInvalidAtomic, Ht as Voice, I as DslTransaction, It as TextMark, J as OpActor, K as medeoDslLoroShape, L as UnsupportedDocumentFormatError, Lt as TextMutation, M as VoiceoverResult, Mt as RichTextSnapshot, N as CreateMedeoDslOptions, Nt as StoredFile, O as DslEditor, Ot as RelationTable, P as MedeoDsl, Pt as TextDelta, Q as DslClipUpdate, R as assertDslDocument, Rt as TextRun, S as resolveDslLayout, St as EntityTables, T as DslProjectionError, Tt as MedeoDslSnapshot, U as timeAnchorCodec, V as captionContentCodec, Vt as TrackRole, W as MedeoDslDraft, X as AddDslClipsInput, Y as AddDslClip, Z as ClipSource, _ as VideoDraftInput, _t as DeepReadonly, a as SpokenScript, at as relationId, b as VideoDraftTrack, bt as EntityMutation, c as VideoDraftProjection, ct as AudioScript, d as DEFAULT_UNIT_TIME_MS, dt as CaptionSelection, et as ReplaceDslClipsInput, f as VideoCreationSettings, ft as CaptionStyle, g as VideoDraftContentPartUnion, gt as ContainNode, h as VideoDraftContent, ht as ContainMutation, i as AudioScriptView, it as defaultIdFactory, j as VoiceoverCaptionInput, jt as ResourceSystem, k as UploadText, kt as RelationTables, l as toVideoDraft, lt as Caption, m as VideoDraftCaptionStyle, mt as Clip, n as ImportedVideoDraft, nt as DslIdFactory, o as spokenScripts, ot as resourceId, p as VideoDraft, pt as CaptionText, q as CommitOptions, r as fromVideoDraft, rt as EntityIdKind, s as toAudioScriptViews, st as tupleHash, t as FromVideoDraftOptions, tt as ClipPlacement, u as CaptionDisplayCue, ut as CaptionContent, v as VideoDraftPartUnion, vt as DslDiagnostic, w as DslLayout, wt as FieldPatch, x as VideoDraftTrackItem, xt as EntityTable, y as VideoDraftTimeline, yt as DslMutation, z as documentFormat, zt as TimeAnchor } from "./index-C1iiDt_Q.js";
2
- import { A as MenginePushRejectedError, B as MengineSyncResponse, C as PushResult, D as MengineHttpClient, E as readMengineEventStream, F as MenginePushResponse, H as base64ToBytes, I as MenginePushUpdateResponse, L as MengineRejectedResponse, M as MengineAuditResponse, N as MengineDocumentVersion, O as MengineHttpClientOptions, P as MengineDraftResponse, R as MengineSnapshotResponse, S as PullResult, T as MengineEventStreamOptions, U as bytesToBase64, V as MengineUpdateMeta, _ as ManualSyncDocOptions, a as MengineDocSessionOptions, b as DocVersionMark, c as WaitForLocalSaveOptions, d as MengineUndoState, f as MedeoHttpDocStorage, g as ManualSyncDoc, h as PushOutcomeKind, i as MengineAckFailedError, j as MengineAuditEntry, k as MengineHttpRequestError, l as WaitForServerAckOptions, m as PushOutcome, n as MengineDocSession, o as MengineDocSyncState, p as MedeoHttpDocStorageOptions, r as MengineDocSessionUpdateEvent, s as MengineLocalSaveState, t as MemoryDocStorage, u as DocStorageLike, v as decodeDocVersionMark, w as PushResultKind, x as PullFailureReason, y as encodeDocVersionMark, z as MengineSseUpdateEvent } from "./index-CSjqNIoR.js";
3
- export { type AddDslClip, type AddDslClipsInput, type ApplyVoiceoverInput, type AudioScript, type AudioScriptView, type Caption, type CaptionContent, type CaptionDisplayCue, type CaptionSelection, type CaptionStyle, type CaptionText, type Clip, type ClipPlacement, type ClipSource, type CommitOptions, type ContainMutation, type ContainNode, type CreateMedeoDslOptions, DEFAULT_UNIT_TIME_MS, type DeepReadonly, type DocStorageLike, type DocVersionMark, type DslAudit, type DslClipLayout, type DslClipUpdate, type DslDiagnostic, DslEditor, type DslIdFactory, type DslLayout, type DslMutation, DslProjectionError, type DslTrackLayout, type DslTransaction, type EntityIdKind, type EntityMutation, type EntityTable, type EntityTables, type EntityValues, type FieldPatch, type FromVideoDraftOptions, type ImportedVideoDraft, type InvalidAtomic, ManualSyncDoc, type ManualSyncDocOptions, MedeoDsl, type MedeoDslDraft, type MedeoDslLoroState, type MedeoDslSnapshot, MedeoHttpDocStorage, type MedeoHttpDocStorageOptions, type Media, MemoryDocStorage, MengineAckFailedError, type MengineAuditEntry, type MengineAuditResponse, MengineDocSession, type MengineDocSessionOptions, type MengineDocSessionUpdateEvent, type MengineDocSyncState, type MengineDocumentVersion, type MengineDraftResponse, type MengineEventStreamOptions, MengineHttpClient, type MengineHttpClientOptions, MengineHttpRequestError, type MengineLocalSaveState, MenginePushRejectedError, type MenginePushResponse, type MenginePushUpdateResponse, type MengineRejectedResponse, type MengineSnapshotResponse, type MengineSseUpdateEvent, type MengineSyncResponse, type MengineUndoState, type MengineUpdateMeta, type MoveDslClipsInput, type OpActor, type PullFailureReason, type PullResult, type PushOutcome, type PushOutcomeKind, type PushResult, type PushResultKind, type RelationMutation, type RelationTable, type RelationTables, type RelationValues, type ReplaceDslClipsInput, type ResourceSystem, type RichTextSnapshot, type SpokenScript, type StoredFile, type TextDelta, type TextEdit, type TextMark, type TextMutation, type TextRun, type TimeAnchor, type Track, type TrackRole, UnsupportedDocumentFormatError, type UploadText, type VideoCreationSettings, type VideoDraft, type VideoDraftCaptionStyle, type VideoDraftContent, type VideoDraftContentPartUnion, type VideoDraftInput, type VideoDraftPartUnion, type VideoDraftProjection, type VideoDraftTimeline, type VideoDraftTrack, type VideoDraftTrackItem, type Voice, type VoiceoverCaptionInput, type VoiceoverResult, type WaitForLocalSaveOptions, type WaitForServerAckOptions, assertDslDocument, base64ToBytes, bytesToBase64, captionContentCodec, createInitialMedeoDsl, decodeDocVersionMark, defaultIdFactory, documentFormat, encodeDocVersionMark, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, readMengineEventStream, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
1
+ import { $ as ClipSource, A as DslEditor, At as Media, B as assertDslDocument, Bt as TextMark, C as VideoDraftTrackItem, Ct as DslMutation, D as DslProjectionError, Dt as EntityValues, E as DslLayout, Et as EntityTables, F as CreateMedeoDslOptions, Ft as ResourceSystem, G as timeAnchorCodec, Gt as TrackRole, H as InvalidAtomic, Ht as TextRun, I as MedeoDsl, It as RichTextSnapshot, J as medeoDslLoroShape, K as MedeoDslDraft, Kt as Voice, L as DslAudit, Lt as StoredFile, M as ApplyVoiceoverInput, Mt as RelationTable, N as VoiceoverCaptionInput, Nt as RelationTables, O as DslTrackLayout, Ot as FieldPatch, P as VoiceoverResult, Pt as RelationValues, Q as AddDslClipsInput, R as DslTransaction, Rt as TextDelta, S as VideoDraftTrack, St as DslDiagnostic, T as DslClipLayout, Tt as EntityTable, U as captionContentCodec, Ut as TimeAnchor, V as documentFormat, Vt as TextMutation, W as isInvalidAtomic, Wt as Track, X as OpActor, Y as CommitOptions, Z as AddDslClip, _ as VideoDraftContent, _t as CaptionText, a as fromVideoDraft, at as missingMediaPlaceholder, b as VideoDraftPartUnion, bt as ContainNode, c as spokenScripts, ct as defaultIdFactory, d as toVideoDraft, dt as tupleHash, et as DslClipUpdate, f as CaptionDisplayCue, ft as AudioScript, g as VideoDraftCaptionStyle, gt as CaptionStyle, h as VideoDraft, ht as CaptionSelection, i as ImportedVideoDraft, it as BLANK_PLACEHOLDER, j as UploadText, jt as RelationMutation, k as createInitialMedeoDsl, kt as MedeoDslSnapshot, l as toAudioScriptViews, lt as relationId, m as VideoCreationSettings, mt as CaptionContent, n as normalizeLegacyVideoDraft, nt as ReplaceDslClipsInput, o as AudioScriptView, ot as DslIdFactory, p as DEFAULT_UNIT_TIME_MS, pt as Caption, q as MedeoDslLoroState, r as FromVideoDraftOptions, rt as ClipPlacement, s as SpokenScript, st as EntityIdKind, t as NormalizedLegacyVideoDraft, tt as MoveDslClipsInput, u as VideoDraftProjection, ut as resourceId, v as VideoDraftContentPartUnion, vt as Clip, w as resolveDslLayout, wt as EntityMutation, x as VideoDraftTimeline, xt as DeepReadonly, y as VideoDraftInput, yt as ContainMutation, z as UnsupportedDocumentFormatError, zt as TextEdit } from "./index-CQ8h3u9S.js";
2
+ import { A as MenginePushRejectedError, B as MengineSyncResponse, C as PushResult, D as MengineHttpClient, E as readMengineEventStream, F as MenginePushResponse, H as base64ToBytes, I as MenginePushUpdateResponse, L as MengineRejectedResponse, M as MengineAuditResponse, N as MengineDocumentVersion, O as MengineHttpClientOptions, P as MengineDraftResponse, R as MengineSnapshotResponse, S as PullResult, T as MengineEventStreamOptions, U as bytesToBase64, V as MengineUpdateMeta, _ as ManualSyncDocOptions, a as MengineDocSessionOptions, b as DocVersionMark, c as WaitForLocalSaveOptions, d as MengineUndoState, f as MedeoHttpDocStorage, g as ManualSyncDoc, h as PushOutcomeKind, i as MengineAckFailedError, j as MengineAuditEntry, k as MengineHttpRequestError, l as WaitForServerAckOptions, m as PushOutcome, n as MengineDocSession, o as MengineDocSyncState, p as MedeoHttpDocStorageOptions, r as MengineDocSessionUpdateEvent, s as MengineLocalSaveState, t as MemoryDocStorage, u as DocStorageLike, v as decodeDocVersionMark, w as PushResultKind, x as PullFailureReason, y as encodeDocVersionMark, z as MengineSseUpdateEvent } from "./index-D48u9I25.js";
3
+ export { type AddDslClip, type AddDslClipsInput, type ApplyVoiceoverInput, type AudioScript, type AudioScriptView, BLANK_PLACEHOLDER, type Caption, type CaptionContent, type CaptionDisplayCue, type CaptionSelection, type CaptionStyle, type CaptionText, type Clip, type ClipPlacement, type ClipSource, type CommitOptions, type ContainMutation, type ContainNode, type CreateMedeoDslOptions, DEFAULT_UNIT_TIME_MS, type DeepReadonly, type DocStorageLike, type DocVersionMark, type DslAudit, type DslClipLayout, type DslClipUpdate, type DslDiagnostic, DslEditor, type DslIdFactory, type DslLayout, type DslMutation, DslProjectionError, type DslTrackLayout, type DslTransaction, type EntityIdKind, type EntityMutation, type EntityTable, type EntityTables, type EntityValues, type FieldPatch, type FromVideoDraftOptions, type ImportedVideoDraft, type InvalidAtomic, ManualSyncDoc, type ManualSyncDocOptions, MedeoDsl, type MedeoDslDraft, type MedeoDslLoroState, type MedeoDslSnapshot, MedeoHttpDocStorage, type MedeoHttpDocStorageOptions, type Media, MemoryDocStorage, MengineAckFailedError, type MengineAuditEntry, type MengineAuditResponse, MengineDocSession, type MengineDocSessionOptions, type MengineDocSessionUpdateEvent, type MengineDocSyncState, type MengineDocumentVersion, type MengineDraftResponse, type MengineEventStreamOptions, MengineHttpClient, type MengineHttpClientOptions, MengineHttpRequestError, type MengineLocalSaveState, MenginePushRejectedError, type MenginePushResponse, type MenginePushUpdateResponse, type MengineRejectedResponse, type MengineSnapshotResponse, type MengineSseUpdateEvent, type MengineSyncResponse, type MengineUndoState, type MengineUpdateMeta, type MoveDslClipsInput, type NormalizedLegacyVideoDraft, type OpActor, type PullFailureReason, type PullResult, type PushOutcome, type PushOutcomeKind, type PushResult, type PushResultKind, type RelationMutation, type RelationTable, type RelationTables, type RelationValues, type ReplaceDslClipsInput, type ResourceSystem, type RichTextSnapshot, type SpokenScript, type StoredFile, type TextDelta, type TextEdit, type TextMark, type TextMutation, type TextRun, type TimeAnchor, type Track, type TrackRole, UnsupportedDocumentFormatError, type UploadText, type VideoCreationSettings, type VideoDraft, type VideoDraftCaptionStyle, type VideoDraftContent, type VideoDraftContentPartUnion, type VideoDraftInput, type VideoDraftPartUnion, type VideoDraftProjection, type VideoDraftTimeline, type VideoDraftTrack, type VideoDraftTrackItem, type Voice, type VoiceoverCaptionInput, type VoiceoverResult, type WaitForLocalSaveOptions, type WaitForServerAckOptions, assertDslDocument, base64ToBytes, bytesToBase64, captionContentCodec, createInitialMedeoDsl, decodeDocVersionMark, defaultIdFactory, documentFormat, encodeDocVersionMark, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, missingMediaPlaceholder, normalizeLegacyVideoDraft, readMengineEventStream, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as bytesToBase64, t as base64ToBytes } from "./base64-D-jd-dr5.js";
2
- import { S as tupleHash, _ as resolveDslLayout, a as DslEditor, b as relationId, c as MedeoDsl, f as documentFormat, g as timeAnchorCodec, h as isInvalidAtomic, i as createInitialMedeoDsl, l as UnsupportedDocumentFormatError, m as captionContentCodec, n as toVideoDraft, o as spokenScripts, p as medeoDslLoroShape, r as DEFAULT_UNIT_TIME_MS, s as toAudioScriptViews, t as fromVideoDraft, u as assertDslDocument, v as DslProjectionError, x as resourceId, y as defaultIdFactory } from "./dsl-96AZnd7O.js";
2
+ import { C as relationId, S as defaultIdFactory, T as tupleHash, _ as timeAnchorCodec, a as createInitialMedeoDsl, b as BLANK_PLACEHOLDER, c as toAudioScriptViews, d as assertDslDocument, g as isInvalidAtomic, h as captionContentCodec, i as DEFAULT_UNIT_TIME_MS, l as MedeoDsl, m as medeoDslLoroShape, n as fromVideoDraft, o as DslEditor, p as documentFormat, r as toVideoDraft, s as spokenScripts, t as normalizeLegacyVideoDraft, u as UnsupportedDocumentFormatError, v as resolveDslLayout, w as resourceId, x as missingMediaPlaceholder, y as DslProjectionError } from "./dsl-Xm5NW58k.js";
3
3
  import { LoroDoc, UndoManager, VersionVector, decodeImportBlobMeta } from "loro-crdt";
4
4
  import { ClientServerSynchronizer, DocManager } from "@mengine/sync";
5
5
  import { DisposableSet, EventBus, Task } from "@mengine/utils";
@@ -1472,4 +1472,4 @@ var MengineDocSession = class extends DocumentSession {
1472
1472
  }
1473
1473
  };
1474
1474
  //#endregion
1475
- export { DEFAULT_UNIT_TIME_MS, DslEditor, DslProjectionError, ManualSyncDoc, MedeoDsl, MedeoHttpDocStorage, MemoryDocStorage, MengineAckFailedError, MengineDocSession, MengineHttpClient, MengineHttpRequestError, MenginePushRejectedError, UnsupportedDocumentFormatError, assertDslDocument, base64ToBytes, bytesToBase64, captionContentCodec, createInitialMedeoDsl, decodeDocVersionMark, defaultIdFactory, documentFormat, encodeDocVersionMark, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, readMengineEventStream, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
1475
+ export { BLANK_PLACEHOLDER, DEFAULT_UNIT_TIME_MS, DslEditor, DslProjectionError, ManualSyncDoc, MedeoDsl, MedeoHttpDocStorage, MemoryDocStorage, MengineAckFailedError, MengineDocSession, MengineHttpClient, MengineHttpRequestError, MenginePushRejectedError, UnsupportedDocumentFormatError, assertDslDocument, base64ToBytes, bytesToBase64, captionContentCodec, createInitialMedeoDsl, decodeDocVersionMark, defaultIdFactory, documentFormat, encodeDocVersionMark, fromVideoDraft, isInvalidAtomic, medeoDslLoroShape, missingMediaPlaceholder, normalizeLegacyVideoDraft, readMengineEventStream, relationId, resolveDslLayout, resourceId, spokenScripts, timeAnchorCodec, toAudioScriptViews, toVideoDraft, tupleHash };
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { P as MedeoDsl, p as VideoDraft } from "./index-C1iiDt_Q.js";
1
+ import { I as MedeoDsl, h as VideoDraft } from "./index-CQ8h3u9S.js";
2
2
  import { LoroDoc } from "loro-crdt";
3
3
 
4
4
  //#region src/testing/in-memory-mengine-server.d.ts
package/dist/testing.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { n as bytesToBase64, t as base64ToBytes } from "./base64-D-jd-dr5.js";
2
- import { a as DslEditor, c as MedeoDsl, d as assertPhoneticBindingFormat, f as documentFormat, i as createInitialMedeoDsl, n as toVideoDraft, u as assertDslDocument, v as DslProjectionError } from "./dsl-96AZnd7O.js";
2
+ import { a as createInitialMedeoDsl, d as assertDslDocument, f as assertPhoneticBindingFormat, l as MedeoDsl, o as DslEditor, p as documentFormat, r as toVideoDraft, y as DslProjectionError } from "./dsl-Xm5NW58k.js";
3
3
  import { t as classifyUpdate } from "./loro-relay-doc-Bi6JKqtQ.js";
4
4
  import { LoroDoc, VersionVector, encodeFrontiers } from "loro-crdt";
5
5
  //#region src/testing/in-memory-mengine-server.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mengine/medeo-client",
3
- "version": "3.0.1-tool-guardrails.0",
3
+ "version": "3.1.1-dsl.0",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,9 +27,9 @@
27
27
  "dependencies": {
28
28
  "@noble/hashes": "^2.4.0",
29
29
  "zod": "^4.4.3",
30
- "@mengine/storage": "3.0.1-tool-guardrails.0",
31
- "@mengine/sync": "3.0.1-tool-guardrails.0",
32
- "@mengine/utils": "3.0.1-tool-guardrails.0"
30
+ "@mengine/storage": "3.1.1-dsl.0",
31
+ "@mengine/sync": "3.1.1-dsl.0",
32
+ "@mengine/utils": "3.1.1-dsl.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "^25.9.1",