@mengine/medeo-client 1.2.0 → 1.2.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -87,7 +87,8 @@ function jsonTransform() {
87
87
  const trackItem = schema.LoroMap({
88
88
  part_id: schema.String(),
89
89
  time_position: schema.String().transform(jsonTransform()),
90
- fallback_abs_ms: schema.Number({ required: false })
90
+ fallback_abs_ms: schema.Number({ required: false }),
91
+ duration_override_ms: schema.Number({ required: false })
91
92
  });
92
93
  const track = schema.LoroMap({
93
94
  id: schema.String(),
@@ -773,7 +774,8 @@ const trackItemTimePositionSchema = z.discriminatedUnion("mode", [
773
774
  const trackItemSchema = z.object({
774
775
  part_id: z.string(),
775
776
  time_position: trackItemTimePositionSchema,
776
- fallback_abs_ms: finiteNumber.optional()
777
+ fallback_abs_ms: finiteNumber.optional(),
778
+ duration_override_ms: z.number().finite().positive().optional()
777
779
  }).passthrough();
778
780
  const trackSchema = z.object({
779
781
  id: z.string().optional(),
@@ -1326,7 +1328,7 @@ function fromVideoDocument(document) {
1326
1328
  above_main_tracks: aboveTracks.map((t) => draftTrack(t, view.absByPartId)),
1327
1329
  below_main_tracks: belowTracks.map((t) => draftTrack(t, view.absByPartId)),
1328
1330
  part_aggregations: view.aggregations,
1329
- part_library: toReadViewPartLibrary(view.partLibrary, view.durationMs, view.derivedFillerPartIds),
1331
+ part_library: toReadViewPartLibrary(view.partLibrary, view.durationMs, view.derivedFillerPartIds, captionDurationOverrides(document)),
1330
1332
  version: document.meta.version
1331
1333
  };
1332
1334
  }
@@ -1347,7 +1349,7 @@ function fromVideoDocument(document) {
1347
1349
  * and they are not part of the document (see `fromVideoDocument`). An empty clip a
1348
1350
  * writer placed deliberately is NOT in that set and is projected normally.
1349
1351
  */
1350
- function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
1352
+ function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds, captionDurationByPartId) {
1351
1353
  const out = {};
1352
1354
  for (const [partId, part] of Object.entries(partLibrary)) {
1353
1355
  if (derivedFillerPartIds.has(partId)) continue;
@@ -1367,7 +1369,7 @@ function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
1367
1369
  const caption = clone(part.caption);
1368
1370
  out[partId] = { caption: {
1369
1371
  ...caption,
1370
- duration_ms: caption.initial_duration_ms
1372
+ duration_ms: captionDurationByPartId.get(partId) ?? caption.initial_duration_ms
1371
1373
  } };
1372
1374
  } else if (part.bgm != null) out[partId] = { bgm: {
1373
1375
  ...clone(part.bgm),
@@ -1376,6 +1378,14 @@ function toReadViewPartLibrary(partLibrary, durationMs, derivedFillerPartIds) {
1376
1378
  }
1377
1379
  return out;
1378
1380
  }
1381
+ function captionDurationOverrides(document) {
1382
+ const result = /* @__PURE__ */ new Map();
1383
+ for (const track of document.tracks ?? []) {
1384
+ if (track.parts_kind !== "caption") continue;
1385
+ for (const item of track.items ?? []) if (item.duration_override_ms != null) result.set(item.part_id, item.duration_override_ms);
1386
+ }
1387
+ return result;
1388
+ }
1379
1389
  /** Deep-clone a part payload, dropping the derived read-view `duration_ms`. */
1380
1390
  function omitDurationMs(part) {
1381
1391
  const { duration_ms: _drop, ...rest } = clone(part);
@@ -1538,6 +1548,7 @@ function rowToTrack(row) {
1538
1548
  time_position: item.time_position
1539
1549
  };
1540
1550
  if (item.fallback_abs_ms != null) result.fallback_abs_ms = item.fallback_abs_ms;
1551
+ if (item.duration_override_ms != null) result.duration_override_ms = item.duration_override_ms;
1541
1552
  return result;
1542
1553
  })
1543
1554
  };
@@ -1646,7 +1657,8 @@ function toTrackRow(track) {
1646
1657
  items: (track.items ?? []).map((item) => ({
1647
1658
  part_id: item.part_id,
1648
1659
  time_position: item.time_position,
1649
- fallback_abs_ms: item.fallback_abs_ms
1660
+ fallback_abs_ms: item.fallback_abs_ms,
1661
+ duration_override_ms: item.duration_override_ms
1650
1662
  }))
1651
1663
  };
1652
1664
  }
@@ -545,6 +545,8 @@ interface TrackItem {
545
545
  part_id: string;
546
546
  time_position: TrackItemTimePosition;
547
547
  fallback_abs_ms?: number | undefined;
548
+ /** Presentation window for this placement; currently used by caption resize. */
549
+ duration_override_ms?: number | undefined;
548
550
  }
549
551
  interface Track {
550
552
  id: string | undefined;
@@ -1320,6 +1322,14 @@ declare const replaceVideoClipSequenceInputSchema: z.ZodObject<{
1320
1322
  }, z.core.$strip>;
1321
1323
  type ReplaceVideoClipSequenceInput = z.infer<typeof replaceVideoClipSequenceInputSchema>;
1322
1324
  //#endregion
1325
+ //#region src/editor/schemas/resize-caption.d.ts
1326
+ /** Resize one caption placement without changing its cue/source duration. */
1327
+ declare const resizeCaptionInputSchema: z.ZodObject<{
1328
+ caption_id: z.ZodString;
1329
+ duration_ms: z.ZodNumber;
1330
+ }, z.core.$strip>;
1331
+ type ResizeCaptionInput = z.infer<typeof resizeCaptionInputSchema>;
1332
+ //#endregion
1323
1333
  //#region src/editor/schemas/set-bgm.d.ts
1324
1334
  /**
1325
1335
  * Set the document BGM. The media's stable result (storage key) arrives
@@ -1538,7 +1548,7 @@ type SpeechAsset = z.infer<typeof speechAssetSchema>;
1538
1548
  type CaptionAsset = z.infer<typeof captionAssetSchema>;
1539
1549
  type SpeechAssets = z.infer<typeof speechAssetsSchema>;
1540
1550
  declare namespace index_d_exports {
1541
- export { AddSpeechesInput, AddVideoClipsInput, AdjustBgmVolumeInput, AdjustSpeechVolumeInput, AdjustVideoClipDurationInput, AdjustVideoClipVolumeInput, AnchoredDeletePolicy, AnchoredReplacePolicy, CaptionAsset, ChangeSpeechScriptInput, ChangeSpeechVoiceInput, DeleteBgmInput, DeleteSpeechesInput, DeleteVideoClipsInput, MoveAnchor, MoveSpeechesInput, MoveVideoClipsByAnchorInput, MoveVideoClipsInput, MovedClipAnchoredPolicy, ReplaceVideoClipContentInput, ReplaceVideoClipSequenceInput, SetBgmInput, SetCaptionStyleInput, SetCaptionVisibilityInput, SetVideoClipSpeedShiftInput, SpeechAsset, SpeechAssets, addSpeechesInputSchema, addVideoClipsInputSchema, adjustBgmVolumeInputSchema, adjustSpeechVolumeInputSchema, adjustVideoClipDurationInputSchema, adjustVideoClipVolumeInputSchema, anchoredDeletePolicySchema, anchoredReplacePolicySchema, changeSpeechScriptInputSchema, changeSpeechVoiceInputSchema, clipIdSchema, clipIdsSchema, deleteBgmInputSchema, deleteSpeechesInputSchema, deleteVideoClipsInputSchema, mediaIdSchema, moveAnchorSchema, moveSpeechesInputSchema, moveVideoClipsByAnchorInputSchema, moveVideoClipsInputSchema, movedClipAnchoredPolicySchema, positiveMsSchema, replaceVideoClipContentInputSchema, replaceVideoClipSequenceInputSchema, setBgmInputSchema, setCaptionStyleInputSchema, setCaptionVisibilityInputSchema, setVideoClipSpeedShiftInputSchema, speechAssetsSchema, speechIdSchema, speechIdsSchema, speedShiftSchema, timelineMsSchema, voiceSchema, volumeSchema };
1551
+ export { AddSpeechesInput, AddVideoClipsInput, AdjustBgmVolumeInput, AdjustSpeechVolumeInput, AdjustVideoClipDurationInput, AdjustVideoClipVolumeInput, AnchoredDeletePolicy, AnchoredReplacePolicy, CaptionAsset, ChangeSpeechScriptInput, ChangeSpeechVoiceInput, DeleteBgmInput, DeleteSpeechesInput, DeleteVideoClipsInput, MoveAnchor, MoveSpeechesInput, MoveVideoClipsByAnchorInput, MoveVideoClipsInput, MovedClipAnchoredPolicy, ReplaceVideoClipContentInput, ReplaceVideoClipSequenceInput, ResizeCaptionInput, SetBgmInput, SetCaptionStyleInput, SetCaptionVisibilityInput, SetVideoClipSpeedShiftInput, SpeechAsset, SpeechAssets, addSpeechesInputSchema, addVideoClipsInputSchema, adjustBgmVolumeInputSchema, adjustSpeechVolumeInputSchema, adjustVideoClipDurationInputSchema, adjustVideoClipVolumeInputSchema, anchoredDeletePolicySchema, anchoredReplacePolicySchema, changeSpeechScriptInputSchema, changeSpeechVoiceInputSchema, clipIdSchema, clipIdsSchema, deleteBgmInputSchema, deleteSpeechesInputSchema, deleteVideoClipsInputSchema, mediaIdSchema, moveAnchorSchema, moveSpeechesInputSchema, moveVideoClipsByAnchorInputSchema, moveVideoClipsInputSchema, movedClipAnchoredPolicySchema, positiveMsSchema, replaceVideoClipContentInputSchema, replaceVideoClipSequenceInputSchema, resizeCaptionInputSchema, setBgmInputSchema, setCaptionStyleInputSchema, setCaptionVisibilityInputSchema, setVideoClipSpeedShiftInputSchema, speechAssetsSchema, speechIdSchema, speechIdsSchema, speedShiftSchema, timelineMsSchema, voiceSchema, volumeSchema };
1542
1552
  }
1543
1553
  //#endregion
1544
1554
  //#region src/editor/schema-validator.d.ts
@@ -1590,6 +1600,7 @@ declare class SchemaValidator {
1590
1600
  validateSetBgm(input: SetBgmInput, _doc: SnapshotReadable): void;
1591
1601
  validateDeleteBgm(input: DeleteBgmInput, _doc: SnapshotReadable): void;
1592
1602
  validateSetCaptionVisibility(input: SetCaptionVisibilityInput, _doc: SnapshotReadable): void;
1603
+ validateResizeCaption(input: ResizeCaptionInput, doc: SnapshotReadable): void;
1593
1604
  validateSetCaptionStyle(input: SetCaptionStyleInput, _doc: SnapshotReadable): void;
1594
1605
  private parse;
1595
1606
  private mainTrackIds;
@@ -1638,7 +1649,7 @@ declare class SchemaValidator {
1638
1649
  * side-effect payload contract in
1639
1650
  * `docs/projects/medeo-integration/results/phase-4-side-effect-payload-contract.md`.
1640
1651
  */
1641
- type ImplementedSemanticOpKind = 'MoveVideoClips' | 'MoveVideoClipsByAnchor' | 'DeleteVideoClips' | 'AddVideoClips' | 'AdjustVideoClipVolume' | 'SetVideoClipSpeedShift' | 'ReplaceVideoClipContent' | 'ReplaceVideoClipSequence' | 'AdjustVideoClipDuration' | 'AddSpeeches' | 'DeleteSpeeches' | 'MoveSpeeches' | 'ChangeSpeechScript' | 'ChangeSpeechVoice' | 'AdjustSpeechVolume' | 'SetCaptionVisibility' | 'SetCaptionStyle' | 'SetBgm' | 'DeleteBgm' | 'AdjustBgmVolume';
1652
+ type ImplementedSemanticOpKind = 'MoveVideoClips' | 'MoveVideoClipsByAnchor' | 'DeleteVideoClips' | 'AddVideoClips' | 'AdjustVideoClipVolume' | 'SetVideoClipSpeedShift' | 'ReplaceVideoClipContent' | 'ReplaceVideoClipSequence' | 'AdjustVideoClipDuration' | 'AddSpeeches' | 'DeleteSpeeches' | 'MoveSpeeches' | 'ChangeSpeechScript' | 'ChangeSpeechVoice' | 'AdjustSpeechVolume' | 'ResizeCaption' | 'SetCaptionVisibility' | 'SetCaptionStyle' | 'SetBgm' | 'DeleteBgm' | 'AdjustBgmVolume';
1642
1653
  /**
1643
1654
  * Operations on the roadmap but NOT yet implemented by `SemanticEditor`. Empty:
1644
1655
  * Phase 4 covers every op with a real entry point. Kept as a named type so the
@@ -1700,7 +1711,7 @@ interface CommitOptions {
1700
1711
  /** Author of this op; omitted for writes with no acting user (bootstrap, repair). */
1701
1712
  actor?: OpActor;
1702
1713
  }
1703
- type SemanticOpInput = MoveVideoClipsInput | MoveVideoClipsByAnchorInput | DeleteVideoClipsInput | AddVideoClipsInput | AdjustVideoClipVolumeInput | AdjustSpeechVolumeInput | AdjustBgmVolumeInput | SetVideoClipSpeedShiftInput | ReplaceVideoClipContentInput | ReplaceVideoClipSequenceInput | AdjustVideoClipDurationInput | AddSpeechesInput | DeleteSpeechesInput | MoveSpeechesInput | SetCaptionVisibilityInput | SetCaptionStyleInput | SetBgmInput | DeleteBgmInput;
1714
+ type SemanticOpInput = MoveVideoClipsInput | MoveVideoClipsByAnchorInput | DeleteVideoClipsInput | AddVideoClipsInput | AdjustVideoClipVolumeInput | AdjustSpeechVolumeInput | AdjustBgmVolumeInput | SetVideoClipSpeedShiftInput | ReplaceVideoClipContentInput | ReplaceVideoClipSequenceInput | AdjustVideoClipDurationInput | AddSpeechesInput | DeleteSpeechesInput | MoveSpeechesInput | ResizeCaptionInput | SetCaptionVisibilityInput | SetCaptionStyleInput | SetBgmInput | DeleteBgmInput;
1704
1715
  type SemanticOpName = ImplementedSemanticOpKind;
1705
1716
  /** Audit metadata committed alongside an op's writes. */
1706
1717
  interface TransactAudit {
@@ -1846,6 +1857,8 @@ declare class SemanticEditor {
1846
1857
  deleteBgm(input: DeleteBgmInput, options?: CommitOptions): Promise<void>;
1847
1858
  /** Toggle caption visibility (caption track `is_hidden`). */
1848
1859
  setCaptionVisibility(input: SetCaptionVisibilityInput, options?: CommitOptions): Promise<void>;
1860
+ /** Resize the caption placement window; cue/source duration stays immutable. */
1861
+ resizeCaption(input: ResizeCaptionInput, options?: CommitOptions): Promise<void>;
1849
1862
  /**
1850
1863
  * Set the document-wide caption style. GLOBAL (no `caption_id`): the patch is
1851
1864
  * merged onto EVERY caption part's `style`, mirroring the FE, which applies a
@@ -2030,6 +2043,7 @@ declare const videoDocumentSchema: z.ZodObject<{
2030
2043
  offsetMs: z.ZodNumber;
2031
2044
  }, z.core.$loose>], "mode">;
2032
2045
  fallback_abs_ms: z.ZodOptional<z.ZodNumber>;
2046
+ duration_override_ms: z.ZodOptional<z.ZodNumber>;
2033
2047
  }, z.core.$loose>>>;
2034
2048
  }, z.core.$loose>>>;
2035
2049
  part_library: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as VideoDocumentSchemaVersion, A as assertValidVideoDocument, B as BgmPart, C as index_d_exports, D as VideoDocumentMirrorSchema, E as VideoDocumentDraft, F as SpeechHostMap, G as SpeechPart, H as DEFAULT_UNIT_TIME_MS, I as buildSpeechHostMap, J as TrackItem, K as Timeline, L as derivePositionFromAbs, M as InitialDocumentFacts, N as buildInitialVideoDocument, O as videoDocumentMirrorSchema, P as DerivedItemPosition, Q as VideoDocument, R as fromVideoDocument, S as ValidationError, T as TrackItemDraft, U as PartKind, V as CaptionPart, W as PartUnion, X as VIDEO_DOCUMENT_SCHEMA_VERSION, Y as TrackItemTimePosition, Z as VideoClipPart, _ as PlannedSemanticOpKind, a as MirrorVideoDocumentOptions, at as CaptionPart$1, b as SchemaValidator, c as CommitOptions, ct as SpeedShift, d as SemanticEditor, dt as TrackItem$1, et as VideoDocumentValidationIssue, f as SemanticOpInput, g as ImplementedSemanticOpKind, h as IMPLEMENTED_SEMANTIC_OP_KINDS, i as MirrorVideoDocumentAdapter, it as Attachment, j as validateVideoDocument, k as VideoDocumentValidationError, l as OpActor, lt as Timeline$1, m as TransactAudit, n as videoDocumentSchema, nt as VideoDraft, o as createMirrorVideoDocument, ot as CaptionStyle, p as SemanticOpName, q as Track, r as readVideoDocumentFromDraft, rt as VideoDraftPartUnion, s as createMirrorVideoDocumentAdapter, st as PartAggregation, t as partUnionSchema, tt as VideoDocumentValidationIssueCode, u as SemanticDocumentAdapter, ut as Track$1, v as SemanticOpKind, w as TrackDraft, x as SnapshotReadable, y as isImplementedSemanticOpKind, z as toVideoDocument } from "./index-DWVYLTjv.js";
1
+ import { $ as VideoDocumentSchemaVersion, A as assertValidVideoDocument, B as BgmPart, C as index_d_exports, D as VideoDocumentMirrorSchema, E as VideoDocumentDraft, F as SpeechHostMap, G as SpeechPart, H as DEFAULT_UNIT_TIME_MS, I as buildSpeechHostMap, J as TrackItem, K as Timeline, L as derivePositionFromAbs, M as InitialDocumentFacts, N as buildInitialVideoDocument, O as videoDocumentMirrorSchema, P as DerivedItemPosition, Q as VideoDocument, R as fromVideoDocument, S as ValidationError, T as TrackItemDraft, U as PartKind, V as CaptionPart, W as PartUnion, X as VIDEO_DOCUMENT_SCHEMA_VERSION, Y as TrackItemTimePosition, Z as VideoClipPart, _ as PlannedSemanticOpKind, a as MirrorVideoDocumentOptions, at as CaptionPart$1, b as SchemaValidator, c as CommitOptions, ct as SpeedShift, d as SemanticEditor, dt as TrackItem$1, et as VideoDocumentValidationIssue, f as SemanticOpInput, g as ImplementedSemanticOpKind, h as IMPLEMENTED_SEMANTIC_OP_KINDS, i as MirrorVideoDocumentAdapter, it as Attachment, j as validateVideoDocument, k as VideoDocumentValidationError, l as OpActor, lt as Timeline$1, m as TransactAudit, n as videoDocumentSchema, nt as VideoDraft, o as createMirrorVideoDocument, ot as CaptionStyle, p as SemanticOpName, q as Track, r as readVideoDocumentFromDraft, rt as VideoDraftPartUnion, s as createMirrorVideoDocumentAdapter, st as PartAggregation, t as partUnionSchema, tt as VideoDocumentValidationIssueCode, u as SemanticDocumentAdapter, ut as Track$1, v as SemanticOpKind, w as TrackDraft, x as SnapshotReadable, y as isImplementedSemanticOpKind, z as toVideoDocument } from "./index-CZlTzzrm.js";
2
2
  import { PeerID } from "loro-crdt";
3
3
  import { DocState } from "@mengine/sync";
4
4
  import { BaseDocStorage, Connection, DocDiff, DocPushReceipt, DocSnapshotRecord, DocStorage, DocStorageOptions, DocUpdate, DocUpdateRecord } from "@mengine/storage";
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as __exportAll } from "./chunk-D7D4PA-g.js";
2
- import { A as partDurationMs, C as reassignSpeechesToVideoClipsByTime, D as syncAggregatedClipsTimePosition, E as resolveSpeechOverlapByShiftingVideos, F as partUnionToDraft, I as recordEntries, L as videoDocumentMirrorSchema, M as DEFAULT_UNIT_TIME_MS, N as VIDEO_DOCUMENT_SCHEMA_VERSION, O as TIMELINE_SKELETON_DURATION_MS, P as effectiveVideoClipDurationMs, R as base64ToBytes, S as fillMainTrackTimeGaps, T as resolveAllSpeechOverlaps, _ as findLaneTrack, a as buildInitialVideoDocument, b as cascadeAfterVideoClipChanges, c as fromVideoDocument, d as assertValidVideoDocument, f as validateVideoDocument, g as ensureLaneTrack, h as LANE_KINDS_IN_STACK_ORDER, i as readVideoDocumentFromDraft, j as safeDurationMs, k as isEmptyVideoClip, l as toVideoDocument, m as videoDocumentSchema, n as createMirrorVideoDocument, o as buildSpeechHostMap, p as partUnionSchema, r as createMirrorVideoDocumentAdapter, s as derivePositionFromAbs, t as MirrorVideoDocumentAdapter, u as VideoDocumentValidationError, v as laneTrackId, w as recalculateTimelineDuration, x as arrangeMainTrackSeamlessly, y as solveVideoDocument, z as bytesToBase64 } from "./document-C0o_cjAH.js";
2
+ import { A as partDurationMs, C as reassignSpeechesToVideoClipsByTime, D as syncAggregatedClipsTimePosition, E as resolveSpeechOverlapByShiftingVideos, F as partUnionToDraft, I as recordEntries, L as videoDocumentMirrorSchema, M as DEFAULT_UNIT_TIME_MS, N as VIDEO_DOCUMENT_SCHEMA_VERSION, O as TIMELINE_SKELETON_DURATION_MS, P as effectiveVideoClipDurationMs, R as base64ToBytes, S as fillMainTrackTimeGaps, T as resolveAllSpeechOverlaps, _ as findLaneTrack, a as buildInitialVideoDocument, b as cascadeAfterVideoClipChanges, c as fromVideoDocument, d as assertValidVideoDocument, f as validateVideoDocument, g as ensureLaneTrack, h as LANE_KINDS_IN_STACK_ORDER, i as readVideoDocumentFromDraft, j as safeDurationMs, k as isEmptyVideoClip, l as toVideoDocument, m as videoDocumentSchema, n as createMirrorVideoDocument, o as buildSpeechHostMap, p as partUnionSchema, r as createMirrorVideoDocumentAdapter, s as derivePositionFromAbs, t as MirrorVideoDocumentAdapter, u as VideoDocumentValidationError, v as laneTrackId, w as recalculateTimelineDuration, x as arrangeMainTrackSeamlessly, y as solveVideoDocument, z as bytesToBase64 } from "./document-Dcu87api.js";
3
3
  import { z } from "zod";
4
4
  import { LoroDoc, VersionVector } from "loro-crdt";
5
5
  import { ClientServerSynchronizer, DocManager } from "@mengine/sync";
@@ -670,6 +670,13 @@ const replaceVideoClipSequenceInputSchema = z.object({
670
670
  }
671
671
  });
672
672
  //#endregion
673
+ //#region src/editor/schemas/resize-caption.ts
674
+ /** Resize one caption placement without changing its cue/source duration. */
675
+ const resizeCaptionInputSchema = z.object({
676
+ caption_id: z.string().min(1),
677
+ duration_ms: z.number().finite().positive()
678
+ });
679
+ //#endregion
673
680
  //#region src/editor/schemas/set-bgm.ts
674
681
  /**
675
682
  * Set the document BGM. The media's stable result (storage key) arrives
@@ -765,6 +772,7 @@ var schemas_exports = /* @__PURE__ */ __exportAll({
765
772
  positiveMsSchema: () => positiveMsSchema,
766
773
  replaceVideoClipContentInputSchema: () => replaceVideoClipContentInputSchema,
767
774
  replaceVideoClipSequenceInputSchema: () => replaceVideoClipSequenceInputSchema,
775
+ resizeCaptionInputSchema: () => resizeCaptionInputSchema,
768
776
  setBgmInputSchema: () => setBgmInputSchema,
769
777
  setCaptionStyleInputSchema: () => setCaptionStyleInputSchema,
770
778
  setCaptionVisibilityInputSchema: () => setCaptionVisibilityInputSchema,
@@ -1015,6 +1023,18 @@ var SchemaValidator = class {
1015
1023
  validateSetCaptionVisibility(input, _doc) {
1016
1024
  this.parse(setCaptionVisibilityInputSchema, input, "set_caption_visibility_invalid_input");
1017
1025
  }
1026
+ validateResizeCaption(input, doc) {
1027
+ const parsed = this.parse(resizeCaptionInputSchema, input, "resize_caption_invalid_input");
1028
+ const snapshot = doc.snapshot();
1029
+ this.assertPartKind(snapshot, parsed.caption_id, "caption", "resize_caption");
1030
+ if (snapshot.tracks?.find((track) => track.parts_kind === "caption")?.items?.find((row) => row.part_id === parsed.caption_id) == null) throw new ValidationError("resize_caption_placement_not_found", `caption_id "${parsed.caption_id}" is not placed on the caption track`, { caption_id: parsed.caption_id });
1031
+ const cueDuration = snapshot.part_library?.[parsed.caption_id]?.caption?.initial_duration_ms ?? 0;
1032
+ if (parsed.duration_ms < cueDuration) throw new ValidationError("resize_caption_below_cue", `duration_ms ${parsed.duration_ms} is shorter than cue duration ${cueDuration}`, {
1033
+ caption_id: parsed.caption_id,
1034
+ duration_ms: parsed.duration_ms,
1035
+ cue_duration_ms: cueDuration
1036
+ });
1037
+ }
1018
1038
  validateSetCaptionStyle(input, _doc) {
1019
1039
  this.parse(setCaptionStyleInputSchema, input, "set_caption_style_invalid_input");
1020
1040
  }
@@ -1220,7 +1240,8 @@ var SemanticEditor = class {
1220
1240
  track.items.splice(at, 0, {
1221
1241
  part_id: partId,
1222
1242
  time_position: { mode: "sequential" },
1223
- fallback_abs_ms: void 0
1243
+ fallback_abs_ms: void 0,
1244
+ duration_override_ms: void 0
1224
1245
  });
1225
1246
  at += 1;
1226
1247
  }
@@ -1267,7 +1288,8 @@ var SemanticEditor = class {
1267
1288
  newItems.push({
1268
1289
  part_id: partId,
1269
1290
  time_position: { mode: "sequential" },
1270
- fallback_abs_ms: void 0
1291
+ fallback_abs_ms: void 0,
1292
+ duration_override_ms: void 0
1271
1293
  });
1272
1294
  newClipIds.push(partId);
1273
1295
  }
@@ -1480,7 +1502,8 @@ var SemanticEditor = class {
1480
1502
  mode: "absolute",
1481
1503
  offsetMs: 0
1482
1504
  },
1483
- fallback_abs_ms: void 0
1505
+ fallback_abs_ms: void 0,
1506
+ duration_override_ms: void 0
1484
1507
  }];
1485
1508
  }, audit("SetBgm", input, options));
1486
1509
  }
@@ -1503,6 +1526,15 @@ var SemanticEditor = class {
1503
1526
  track.is_hidden = input.is_hidden;
1504
1527
  }, audit("SetCaptionVisibility", input, options));
1505
1528
  }
1529
+ /** Resize the caption placement window; cue/source duration stays immutable. */
1530
+ async resizeCaption(input, options) {
1531
+ this.validator.validateResizeCaption(input, this.doc);
1532
+ this.doc.transact((draft) => {
1533
+ const item = findLaneTrack(draft, "caption")?.items?.find((row) => row.part_id === input.caption_id);
1534
+ if (item == null) return;
1535
+ item.duration_override_ms = input.duration_ms;
1536
+ }, audit("ResizeCaption", input, options));
1537
+ }
1506
1538
  /**
1507
1539
  * Set the document-wide caption style. GLOBAL (no `caption_id`): the patch is
1508
1540
  * merged onto EVERY caption part's `style`, mirroring the FE, which applies a
@@ -1749,7 +1781,8 @@ function placeRelative(items, partId, anchorPartId, offsetMs, fallbackAbsMs) {
1749
1781
  items.push({
1750
1782
  part_id: partId,
1751
1783
  time_position: timePosition,
1752
- fallback_abs_ms: fallbackAbsMs
1784
+ fallback_abs_ms: fallbackAbsMs,
1785
+ duration_override_ms: void 0
1753
1786
  });
1754
1787
  }
1755
1788
  /**
@@ -1893,6 +1926,7 @@ const IMPLEMENTED_SEMANTIC_OP_KINDS = [
1893
1926
  "ChangeSpeechScript",
1894
1927
  "ChangeSpeechVoice",
1895
1928
  "AdjustSpeechVolume",
1929
+ "ResizeCaption",
1896
1930
  "SetCaptionVisibility",
1897
1931
  "SetCaptionStyle",
1898
1932
  "SetBgm",
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as MirrorVideoDocumentAdapter, nt as VideoDraft } from "./index-DWVYLTjv.js";
1
+ import { i as MirrorVideoDocumentAdapter, nt as VideoDraft } from "./index-CZlTzzrm.js";
2
2
 
3
3
  //#region src/testing/in-memory-mengine-server.d.ts
4
4
  /**
package/dist/testing.js CHANGED
@@ -1,4 +1,4 @@
1
- import { N as VIDEO_DOCUMENT_SCHEMA_VERSION, R as base64ToBytes, r as createMirrorVideoDocumentAdapter, z as bytesToBase64 } from "./document-C0o_cjAH.js";
1
+ import { N as VIDEO_DOCUMENT_SCHEMA_VERSION, R as base64ToBytes, r as createMirrorVideoDocumentAdapter, z as bytesToBase64 } from "./document-Dcu87api.js";
2
2
  import { t as classifyUpdate } from "./loro-relay-doc-ssdYpuef.js";
3
3
  import { LoroDoc, VersionVector, encodeFrontiers } from "loro-crdt";
4
4
  //#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": "1.2.0",
3
+ "version": "1.2.1-alpha.1",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,9 +25,9 @@
25
25
  "dependencies": {
26
26
  "loro-mirror": "^2.2.0",
27
27
  "zod": "^4.4.3",
28
- "@mengine/sync": "1.2.0",
29
- "@mengine/storage": "1.2.0",
30
- "@mengine/utils": "1.2.0"
28
+ "@mengine/storage": "1.2.1-alpha.1",
29
+ "@mengine/sync": "1.2.1-alpha.1",
30
+ "@mengine/utils": "1.2.1-alpha.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^25.9.1",