@mengine/medeo-client 2.0.1-alpha.29 → 2.0.1-alpha.30

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.
@@ -4959,4 +4959,4 @@ function createPlainMemoryAdapter(document, options) {
4959
4959
  return new PlainMemoryAdapter(document, options);
4960
4960
  }
4961
4961
  //#endregion
4962
- export { fromVideoDocument as $, resolveEntityTimelineLayout as A, base64ToBytes as At, assembleScriptText as B, canonicalJson as C, safeDurationMs as Ct, resolveFieldPath as D, partUnionToDraft as Dt, assertFieldChanges as E, speedOf as Et, relationsTo as F, isJsonObject as G, selectAudioScriptSegment as H, ScriptCompositionError as I, hasSequence as J, createEntityId as K, assembleCaptionContent as L, validateEntityRelationTransition as M, decodeEntityRelationRows as N, projectEntityTimeline as O, recordEntries as Ot, relationsFrom as P, derivePositionFromAbs as Q, assembleEntityContent as R, scriptSourceAssetOf as S, partDurationMs as St, applyFieldChanges as T, effectiveVideoClipDurationMs as Tt, updateEntityFields as U, findComposedAudioScript as V, variantBaseEntityIds as W, buildInitialVideoDocument as X, isMediaAssetVariantKind as Y, buildSpeechHostMap as Z, audioScriptAssetHash as _, resolveAllSpeechOverlaps as _t, createMirrorVideoDocument as a, videoDocumentSchema as at, phoneticScriptAssetHash as b, TIMELINE_SKELETON_DURATION_MS as bt, DocumentMutationGuard as c, findLaneTrack as ct, LoroEntityDraft as d, solveVideoDocument as dt, toVideoDocument as et, readEntityDocument as f, cascadeAfterVideoClipChanges as ft, audioScriptAssetFields as g, recalculateTimelineDuration as gt, audioScriptAssetContent as h, reassignSpeechesToVideoClipsByTime as ht, MirrorVideoDocumentAdapter as i, partUnionSchema as it, EntityTimelineProjectionError as j, bytesToBase64 as jt, EntityProjectionGraph as k, videoDocumentMirrorSchema as kt, LORO_ENTITY_SCHEMA as l, hasResolvedPlacement as lt, entityOrderGroups as m, fillMainTrackTimeGaps as mt, createPlainMemoryAdapter as n, assertValidVideoDocument as nt, createMirrorVideoDocumentAdapter as o, LANE_KINDS_IN_STACK_ORDER as ot, readEntityRelationRecords as p, arrangeMainTrackSeamlessly as pt, createRelationId as q, generatePartId as r, validateVideoDocument as rt, readVideoDocumentFromDraft as s, ensureLaneTrack as st, PlainMemoryAdapter as t, VideoDocumentValidationError as tt, LoroEntityDocument as u, laneTrackId as ut, audioScriptAssetOf as v, resolveSpeechOverlapByShiftingVideos as vt, equalJson as w, DEFAULT_UNIT_TIME_MS as wt, phoneticScriptAssetOf as x, isEmptyVideoClip as xt, phoneticScriptAssetContent as y, syncAggregatedClipsTimePosition as yt, assemblePhoneticScriptContent as z };
4962
+ export { derivePositionFromAbs as $, resolveEntityTimelineLayout as A, videoDocumentMirrorSchema as At, assemblePhoneticScriptContent as B, canonicalJson as C, partDurationMs as Ct, resolveFieldPath as D, speedOf as Dt, assertFieldChanges as E, effectiveVideoClipDurationMs as Et, relationsTo as F, variantBaseEntityIds as G, findComposedAudioScript as H, scriptContentHash as I, createRelationId as J, isJsonObject as K, ScriptCompositionError as L, validateEntityRelationTransition as M, bytesToBase64 as Mt, decodeEntityRelationRows as N, projectEntityTimeline as O, partUnionToDraft as Ot, relationsFrom as P, buildSpeechHostMap as Q, assembleCaptionContent as R, scriptSourceAssetOf as S, isEmptyVideoClip as St, applyFieldChanges as T, DEFAULT_UNIT_TIME_MS as Tt, selectAudioScriptSegment as U, assembleScriptText as V, updateEntityFields as W, isMediaAssetVariantKind as X, hasSequence as Y, buildInitialVideoDocument as Z, audioScriptAssetHash as _, recalculateTimelineDuration as _t, createMirrorVideoDocument as a, partUnionSchema as at, phoneticScriptAssetHash as b, syncAggregatedClipsTimePosition as bt, DocumentMutationGuard as c, ensureLaneTrack as ct, LoroEntityDraft as d, laneTrackId as dt, fromVideoDocument as et, readEntityDocument as f, solveVideoDocument as ft, audioScriptAssetFields as g, reassignSpeechesToVideoClipsByTime as gt, audioScriptAssetContent as h, fillMainTrackTimeGaps as ht, MirrorVideoDocumentAdapter as i, validateVideoDocument as it, EntityTimelineProjectionError as j, base64ToBytes as jt, EntityProjectionGraph as k, recordEntries as kt, LORO_ENTITY_SCHEMA as l, findLaneTrack as lt, entityOrderGroups as m, arrangeMainTrackSeamlessly as mt, createPlainMemoryAdapter as n, VideoDocumentValidationError as nt, createMirrorVideoDocumentAdapter as o, videoDocumentSchema as ot, readEntityRelationRecords as p, cascadeAfterVideoClipChanges as pt, createEntityId as q, generatePartId as r, assertValidVideoDocument as rt, readVideoDocumentFromDraft as s, LANE_KINDS_IN_STACK_ORDER as st, PlainMemoryAdapter as t, toVideoDocument as tt, LoroEntityDocument as u, hasResolvedPlacement as ut, audioScriptAssetOf as v, resolveAllSpeechOverlaps as vt, equalJson as w, safeDurationMs as wt, phoneticScriptAssetOf as x, TIMELINE_SKELETON_DURATION_MS as xt, phoneticScriptAssetContent as y, resolveSpeechOverlapByShiftingVideos as yt, assembleEntityContent as z };
package/dist/index.d.ts CHANGED
@@ -625,6 +625,47 @@ declare class EntityTimelineEditor {
625
625
  private mintRelationId;
626
626
  }
627
627
  //#endregion
628
+ //#region src/entity-editor/visual-assets-effect.d.ts
629
+ type MediaFact = MediaAssetFact;
630
+ interface VisualAssetsEffectInput {
631
+ /** Stable command identity. A retried command must reuse it; a new placement must use a new one. */
632
+ effect_id: string;
633
+ clips: ReadonlyArray<{
634
+ media_id: string;
635
+ media_kind: 'image' | 'video';
636
+ media_duration_ms: number;
637
+ storage_key?: string;
638
+ start_ms?: number;
639
+ play_in?: number;
640
+ play_out?: number;
641
+ volume?: number;
642
+ lineage?: {
643
+ generation_job_id: string;
644
+ sources: ReadonlyArray<MediaFact>;
645
+ script?: {
646
+ entity_id: string;
647
+ segments: ReadonlyArray<{
648
+ segment_id: string;
649
+ text: string;
650
+ language?: string;
651
+ }>;
652
+ content_hash: string;
653
+ };
654
+ };
655
+ }>;
656
+ before_clip_id?: string;
657
+ after_clip_id?: string;
658
+ }
659
+ /** Read the authoritative timeline receipt, not a media-id heuristic. */
660
+ declare function hasVisualAssetsEffect(rows: EntityRelationRows, effectId: string): boolean;
661
+ /**
662
+ * Materialize a host-resolved visual command into native Entity/Relation rows.
663
+ * The result is suitable for one revision-checked `EntityGraphHttpClient.commit`.
664
+ * This does not fetch Assets or write remotely; callers must supply factual media
665
+ * and lineage inputs after their own ownership checks.
666
+ */
667
+ declare function applyVisualAssetsEffect(rows: EntityRelationRows, input: VisualAssetsEffectInput): EntityRelationRows;
668
+ //#endregion
628
669
  //#region src/entity-editor/revise-audio-script.d.ts
629
670
  interface ReviseAudioScriptInput {
630
671
  readonly editId: string;
@@ -1851,4 +1892,4 @@ declare function phoneticScriptAssetHash(rows: EntityRelationRows, entityId: str
1851
1892
  /** The Asset a PhoneticScript was written out to, read from the graph. */
1852
1893
  declare function phoneticScriptAssetOf(rows: EntityRelationRows, entityId: string): EntityRow | undefined;
1853
1894
  //#endregion
1854
- export { type Aggregation, ApplyEntityRowsOptions, type AssembledCaptionContent, type AssembledPhoneticScriptContent, type Attachment, type AudioMediaAssetFact, type BgmPart, type CaptionContentInput, type CaptionDisplayCue, type CaptionPart, type CaptionSegmentSelection, type CaptionStyle, type ClipEntityId, type ClipPlacement, type CommitOptions, DEFAULT_UNIT_TIME_MS, type DeleteBgmInput, type DeleteClipInput, type DeleteClipTreeInput, type DeleteVoiceoverInput, type DerivedItemPosition, type DocStorageLike, type DocVersionMark, type DocumentAudioScript, type DocumentAudioScriptState, type EditorFoundation, EntityDocumentState, type EntityGraphCommitOptions, EntityGraphHttpClient, EntityGraphRevisionConflictError, type EntityGraphRevisionConflictPayload, type EntityGraphState, EntityRelationRecord, EntityTimelineEditor, type EntityTimelineIdFactory, EntityTimelineProjectionError, type EntityTimelineTrackRole, type FieldChange, type FieldPath, IMPLEMENTED_SEMANTIC_OP_KINDS, type ImageMediaAssetFact, type ImplementedSemanticOpKind, type ImportedMediaAsset, type InsertCaptionClipInput, type InsertClipInput, type InsertMediaClipInput, type InsertMediaClipsInput, type InsertPlacedClipInput, type JournalEntry, LANE_KINDS_IN_STACK_ORDER, LORO_ENTITY_SCHEMA, type LaneKind, type LinearClipSpeed, LoroEntityDocument, LoroEntityDraft, type MainClipRange, type MakeEmptyPart, ManualSyncDoc, type ManualSyncDocOptions, MedeoHttpDocStorage, type MedeoHttpDocStorageOptions, type MediaAssetFact, type MediaClipInsertion, MemoryDocStorage, MengineAckFailedError, type MengineAuditEntry, type MengineAuditResponse, MengineDocSession, type MengineDocSessionOptions, type MengineDocSessionUpdateEvent, type MengineDocSyncState, type MengineDocumentVersion, type MengineEventStreamOptions, MengineHttpClient, type MengineHttpClientOptions, MengineHttpRequestError, MenginePushRejectedError, type MenginePushResponse, type MenginePushUpdateResponse, type MengineRejectedResponse, type MengineSnapshotResponse, type MengineSseUpdateEvent, type MengineSyncResponse, type MengineUndoState, type MengineUpdateMeta, MirrorVideoDocumentAdapter, type MirrorVideoDocumentOptions, type MoveClipInput, type MoveClipsToStartsInput, type MoveSequentialClipsInput, type MoveVoiceoverInput, type OpActor, type PartAggregation, type PartIdFactory, type PartKind, type PartUnion, type PatchCaptionStyleInput, PlainMemoryAdapter, type PlainMemoryAdapterOptions, type PlannedSemanticOpKind, type PullFailureReason, type PullResult, type PushOutcome, type PushOutcomeKind, type PushResult, type PushResultKind, type ReplaceClipContentInput, type ReplaceMediaClipInput, type ReplaceSequentialClipsInput, type ReplacementMediaClipInput, type ResolvedEntityClipPlacement, type ResolvedEntityTimelineLayout, type ResolvedEntityTrack, type ReviseAudioScriptInput, type ReviseAudioScriptResult, SchemaValidator, ScriptCompositionError, type SemanticDocumentAdapter, SemanticEditor, type SemanticOpInput, type SemanticOpKind, type SemanticOpName, type SequentialClipAnchor, type SetBgmInput, type SetCaptionVisibilityInput, type SetClipPlacementInput, type SetClipSpeedInput, type SetClipVolumeInput, type SnapshotReadable, type SolvedVideoDocument, type SpeechHostMap, type SpeechPart, type SpeedShift, TIMELINE_SKELETON_DURATION_MS, type Timeline, type TimelineDoc, type TimelineItem, type Track, type TrackDraft, type TrackItem, type TrackItemDraft, type TrackItemTimePosition, type TransactAudit, type TrimClipInput, type UpdateClipInput, type UpdateClipMarkerInput, ValidationError, type VideoClipPart, type VideoDocument, type VideoDocumentDraft, type VideoDocumentMirrorSchema, VideoDocumentValidationError, type VideoDocumentValidationIssue, type VideoDocumentValidationIssueCode, type VideoDraft, type CaptionPart$1 as VideoDraftCaptionPart, type VideoDraftContent, type VideoDraftPartUnion, type Timeline$1 as VideoDraftTimeline, type Track$1 as VideoDraftTrack, type TrackItem$1 as VideoDraftTrackItem, type VideoMediaAssetFact, type VisualMediaAssetFact, type VoiceoverCaptionFact, type VoiceoverMediaAssetFact, type VoiceoverTakeInput, type VoiceoverTakeResult, type WaitForServerAckOptions, applyEntityRows, applyFieldChanges, arrangeMainTrackSeamlessly, assembleCaptionContent, assembleEntityContent, assemblePhoneticScriptContent, assembleScriptText, assertCanonicalEditorResources, assertEntityProjectionPreservesLegacy, assertFieldChanges, assertMediaAssetWritePolicy, assertValidVideoDocument, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetHash, audioScriptAssetOf, base64ToBytes, buildInitialVideoDocument, buildSpeechHostMap, bytesToBase64, cascadeAfterVideoClipChanges, compileEntityRows, createEditSandbox, createMirrorVideoDocument, createMirrorVideoDocumentAdapter, createPlainMemoryAdapter, decodeDocVersionMark, derivePositionFromAbs, effectiveVideoClipDurationMs, encodeDocVersionMark, ensureEditorFoundation, ensureLaneTrack, fillMainTrackTimeGaps, findComposedAudioScript, findLaneTrack, fromVideoDocument, generatePartId, getAt, hostForAbsMs, importMediaAsset, isEmptyVideoClip, isImplementedSemanticOpKind, isMap, laneTrackId, mainTrackRanges, migrateAlpha23EntityDocument, migrateLegacyTimelineToEntities, partDurationMs, partUnionSchema, phoneticScriptAssetContent, phoneticScriptAssetHash, phoneticScriptAssetOf, prepareCaptionContent, projectEntityTimeline, publishEntityRows, readDocumentAudioScript, readEntityDocument, readEntityRelationRecords, readMainTrackItems, readMengineEventStream, readPart, readPartDurationMs, readVideoDocumentFromDraft, reassignSpeechesToVideoClipsByTime, recalculateTimelineDuration, relativePositionForAbs, replayJournal, resolveAllSpeechOverlaps, resolveEntityTimelineLayout, resolveFieldPath, resolveSpeechOverlapByShiftingVideos, reviseAudioScript, safeDurationMs, index_d_exports as schemas, scriptSourceAssetOf, selectAudioScriptSegment, snapshotToPlain, solveVideoDocument, speedOf, syncAggregatedClipsTimePosition, toVideoDocument, validateVideoDocument, videoDocumentMirrorSchema, videoDocumentSchema };
1895
+ export { type Aggregation, ApplyEntityRowsOptions, type AssembledCaptionContent, type AssembledPhoneticScriptContent, type Attachment, type AudioMediaAssetFact, type BgmPart, type CaptionContentInput, type CaptionDisplayCue, type CaptionPart, type CaptionSegmentSelection, type CaptionStyle, type ClipEntityId, type ClipPlacement, type CommitOptions, DEFAULT_UNIT_TIME_MS, type DeleteBgmInput, type DeleteClipInput, type DeleteClipTreeInput, type DeleteVoiceoverInput, type DerivedItemPosition, type DocStorageLike, type DocVersionMark, type DocumentAudioScript, type DocumentAudioScriptState, type EditorFoundation, EntityDocumentState, type EntityGraphCommitOptions, EntityGraphHttpClient, EntityGraphRevisionConflictError, type EntityGraphRevisionConflictPayload, type EntityGraphState, EntityRelationRecord, EntityTimelineEditor, type EntityTimelineIdFactory, EntityTimelineProjectionError, type EntityTimelineTrackRole, type FieldChange, type FieldPath, IMPLEMENTED_SEMANTIC_OP_KINDS, type ImageMediaAssetFact, type ImplementedSemanticOpKind, type ImportedMediaAsset, type InsertCaptionClipInput, type InsertClipInput, type InsertMediaClipInput, type InsertMediaClipsInput, type InsertPlacedClipInput, type JournalEntry, LANE_KINDS_IN_STACK_ORDER, LORO_ENTITY_SCHEMA, type LaneKind, type LinearClipSpeed, LoroEntityDocument, LoroEntityDraft, type MainClipRange, type MakeEmptyPart, ManualSyncDoc, type ManualSyncDocOptions, MedeoHttpDocStorage, type MedeoHttpDocStorageOptions, type MediaAssetFact, type MediaClipInsertion, MemoryDocStorage, MengineAckFailedError, type MengineAuditEntry, type MengineAuditResponse, MengineDocSession, type MengineDocSessionOptions, type MengineDocSessionUpdateEvent, type MengineDocSyncState, type MengineDocumentVersion, type MengineEventStreamOptions, MengineHttpClient, type MengineHttpClientOptions, MengineHttpRequestError, MenginePushRejectedError, type MenginePushResponse, type MenginePushUpdateResponse, type MengineRejectedResponse, type MengineSnapshotResponse, type MengineSseUpdateEvent, type MengineSyncResponse, type MengineUndoState, type MengineUpdateMeta, MirrorVideoDocumentAdapter, type MirrorVideoDocumentOptions, type MoveClipInput, type MoveClipsToStartsInput, type MoveSequentialClipsInput, type MoveVoiceoverInput, type OpActor, type PartAggregation, type PartIdFactory, type PartKind, type PartUnion, type PatchCaptionStyleInput, PlainMemoryAdapter, type PlainMemoryAdapterOptions, type PlannedSemanticOpKind, type PullFailureReason, type PullResult, type PushOutcome, type PushOutcomeKind, type PushResult, type PushResultKind, type ReplaceClipContentInput, type ReplaceMediaClipInput, type ReplaceSequentialClipsInput, type ReplacementMediaClipInput, type ResolvedEntityClipPlacement, type ResolvedEntityTimelineLayout, type ResolvedEntityTrack, type ReviseAudioScriptInput, type ReviseAudioScriptResult, SchemaValidator, ScriptCompositionError, type SemanticDocumentAdapter, SemanticEditor, type SemanticOpInput, type SemanticOpKind, type SemanticOpName, type SequentialClipAnchor, type SetBgmInput, type SetCaptionVisibilityInput, type SetClipPlacementInput, type SetClipSpeedInput, type SetClipVolumeInput, type SnapshotReadable, type SolvedVideoDocument, type SpeechHostMap, type SpeechPart, type SpeedShift, TIMELINE_SKELETON_DURATION_MS, type Timeline, type TimelineDoc, type TimelineItem, type Track, type TrackDraft, type TrackItem, type TrackItemDraft, type TrackItemTimePosition, type TransactAudit, type TrimClipInput, type UpdateClipInput, type UpdateClipMarkerInput, ValidationError, type VideoClipPart, type VideoDocument, type VideoDocumentDraft, type VideoDocumentMirrorSchema, VideoDocumentValidationError, type VideoDocumentValidationIssue, type VideoDocumentValidationIssueCode, type VideoDraft, type CaptionPart$1 as VideoDraftCaptionPart, type VideoDraftContent, type VideoDraftPartUnion, type Timeline$1 as VideoDraftTimeline, type Track$1 as VideoDraftTrack, type TrackItem$1 as VideoDraftTrackItem, type VideoMediaAssetFact, type VisualAssetsEffectInput, type VisualMediaAssetFact, type VoiceoverCaptionFact, type VoiceoverMediaAssetFact, type VoiceoverTakeInput, type VoiceoverTakeResult, type WaitForServerAckOptions, applyEntityRows, applyFieldChanges, applyVisualAssetsEffect, arrangeMainTrackSeamlessly, assembleCaptionContent, assembleEntityContent, assemblePhoneticScriptContent, assembleScriptText, assertCanonicalEditorResources, assertEntityProjectionPreservesLegacy, assertFieldChanges, assertMediaAssetWritePolicy, assertValidVideoDocument, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetHash, audioScriptAssetOf, base64ToBytes, buildInitialVideoDocument, buildSpeechHostMap, bytesToBase64, cascadeAfterVideoClipChanges, compileEntityRows, createEditSandbox, createMirrorVideoDocument, createMirrorVideoDocumentAdapter, createPlainMemoryAdapter, decodeDocVersionMark, derivePositionFromAbs, effectiveVideoClipDurationMs, encodeDocVersionMark, ensureEditorFoundation, ensureLaneTrack, fillMainTrackTimeGaps, findComposedAudioScript, findLaneTrack, fromVideoDocument, generatePartId, getAt, hasVisualAssetsEffect, hostForAbsMs, importMediaAsset, isEmptyVideoClip, isImplementedSemanticOpKind, isMap, laneTrackId, mainTrackRanges, migrateAlpha23EntityDocument, migrateLegacyTimelineToEntities, partDurationMs, partUnionSchema, phoneticScriptAssetContent, phoneticScriptAssetHash, phoneticScriptAssetOf, prepareCaptionContent, projectEntityTimeline, publishEntityRows, readDocumentAudioScript, readEntityDocument, readEntityRelationRecords, readMainTrackItems, readMengineEventStream, readPart, readPartDurationMs, readVideoDocumentFromDraft, reassignSpeechesToVideoClipsByTime, recalculateTimelineDuration, relativePositionForAbs, replayJournal, resolveAllSpeechOverlaps, resolveEntityTimelineLayout, resolveFieldPath, resolveSpeechOverlapByShiftingVideos, reviseAudioScript, safeDurationMs, index_d_exports as schemas, scriptSourceAssetOf, selectAudioScriptSegment, snapshotToPlain, solveVideoDocument, speedOf, syncAggregatedClipsTimePosition, toVideoDocument, validateVideoDocument, videoDocumentMirrorSchema, videoDocumentSchema };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as fromVideoDocument, A as resolveEntityTimelineLayout, At as base64ToBytes, B as assembleScriptText, C as canonicalJson, Ct as safeDurationMs, D as resolveFieldPath, Dt as partUnionToDraft, E as assertFieldChanges, Et as speedOf, F as relationsTo, G as isJsonObject, H as selectAudioScriptSegment, I as ScriptCompositionError, J as hasSequence, K as createEntityId, L as assembleCaptionContent, M as validateEntityRelationTransition, N as decodeEntityRelationRows, O as projectEntityTimeline, Ot as recordEntries, P as relationsFrom, Q as derivePositionFromAbs, R as assembleEntityContent, S as scriptSourceAssetOf, St as partDurationMs, T as applyFieldChanges, Tt as effectiveVideoClipDurationMs, U as updateEntityFields, V as findComposedAudioScript, W as variantBaseEntityIds, X as buildInitialVideoDocument, Y as isMediaAssetVariantKind, Z as buildSpeechHostMap, _ as audioScriptAssetHash, _t as resolveAllSpeechOverlaps, a as createMirrorVideoDocument, at as videoDocumentSchema, b as phoneticScriptAssetHash, bt as TIMELINE_SKELETON_DURATION_MS, c as DocumentMutationGuard, ct as findLaneTrack, d as LoroEntityDraft, dt as solveVideoDocument, et as toVideoDocument, f as readEntityDocument, ft as cascadeAfterVideoClipChanges, g as audioScriptAssetFields, gt as recalculateTimelineDuration, h as audioScriptAssetContent, ht as reassignSpeechesToVideoClipsByTime, i as MirrorVideoDocumentAdapter, it as partUnionSchema, j as EntityTimelineProjectionError, jt as bytesToBase64, k as EntityProjectionGraph, kt as videoDocumentMirrorSchema, l as LORO_ENTITY_SCHEMA, lt as hasResolvedPlacement, m as entityOrderGroups, mt as fillMainTrackTimeGaps, n as createPlainMemoryAdapter, nt as assertValidVideoDocument, o as createMirrorVideoDocumentAdapter, ot as LANE_KINDS_IN_STACK_ORDER, p as readEntityRelationRecords, pt as arrangeMainTrackSeamlessly, q as createRelationId, r as generatePartId, rt as validateVideoDocument, s as readVideoDocumentFromDraft, st as ensureLaneTrack, t as PlainMemoryAdapter, tt as VideoDocumentValidationError, u as LoroEntityDocument, ut as laneTrackId, v as audioScriptAssetOf, vt as resolveSpeechOverlapByShiftingVideos, w as equalJson, wt as DEFAULT_UNIT_TIME_MS, x as phoneticScriptAssetOf, xt as isEmptyVideoClip, y as phoneticScriptAssetContent, yt as syncAggregatedClipsTimePosition, z as assemblePhoneticScriptContent } from "./document-B3RLmTzA.js";
1
+ import { $ as derivePositionFromAbs, A as resolveEntityTimelineLayout, At as videoDocumentMirrorSchema, B as assemblePhoneticScriptContent, C as canonicalJson, Ct as partDurationMs, D as resolveFieldPath, Dt as speedOf, E as assertFieldChanges, Et as effectiveVideoClipDurationMs, F as relationsTo, G as variantBaseEntityIds, H as findComposedAudioScript, I as scriptContentHash, J as createRelationId, K as isJsonObject, L as ScriptCompositionError, M as validateEntityRelationTransition, Mt as bytesToBase64, N as decodeEntityRelationRows, O as projectEntityTimeline, Ot as partUnionToDraft, P as relationsFrom, Q as buildSpeechHostMap, R as assembleCaptionContent, S as scriptSourceAssetOf, St as isEmptyVideoClip, T as applyFieldChanges, Tt as DEFAULT_UNIT_TIME_MS, U as selectAudioScriptSegment, V as assembleScriptText, W as updateEntityFields, X as isMediaAssetVariantKind, Y as hasSequence, Z as buildInitialVideoDocument, _ as audioScriptAssetHash, _t as recalculateTimelineDuration, a as createMirrorVideoDocument, at as partUnionSchema, b as phoneticScriptAssetHash, bt as syncAggregatedClipsTimePosition, c as DocumentMutationGuard, ct as ensureLaneTrack, d as LoroEntityDraft, dt as laneTrackId, et as fromVideoDocument, f as readEntityDocument, ft as solveVideoDocument, g as audioScriptAssetFields, gt as reassignSpeechesToVideoClipsByTime, h as audioScriptAssetContent, ht as fillMainTrackTimeGaps, i as MirrorVideoDocumentAdapter, it as validateVideoDocument, j as EntityTimelineProjectionError, jt as base64ToBytes, k as EntityProjectionGraph, kt as recordEntries, l as LORO_ENTITY_SCHEMA, lt as findLaneTrack, m as entityOrderGroups, mt as arrangeMainTrackSeamlessly, n as createPlainMemoryAdapter, nt as VideoDocumentValidationError, o as createMirrorVideoDocumentAdapter, ot as videoDocumentSchema, p as readEntityRelationRecords, pt as cascadeAfterVideoClipChanges, q as createEntityId, r as generatePartId, rt as assertValidVideoDocument, s as readVideoDocumentFromDraft, st as LANE_KINDS_IN_STACK_ORDER, t as PlainMemoryAdapter, tt as toVideoDocument, u as LoroEntityDocument, ut as hasResolvedPlacement, v as audioScriptAssetOf, vt as resolveAllSpeechOverlaps, w as equalJson, wt as safeDurationMs, x as phoneticScriptAssetOf, xt as TIMELINE_SKELETON_DURATION_MS, y as phoneticScriptAssetContent, yt as resolveSpeechOverlapByShiftingVideos, z as assembleEntityContent } from "./document-e4Y1QNMu.js";
2
2
  import { addSpeechesInputSchema, addVideoClipsInputSchema, adjustBgmVolumeInputSchema, adjustSpeechVolumeInputSchema, adjustVideoClipDurationInputSchema, adjustVideoClipVolumeInputSchema, changeSpeechScriptInputSchema, changeSpeechVoiceInputSchema, deleteBgmInputSchema, deleteSpeechesInputSchema, deleteVideoClipsInputSchema, moveSpeechesInputSchema, moveVideoClipsByAnchorInputSchema, moveVideoClipsInputSchema, replaceVideoClipContentInputSchema, replaceVideoClipSequenceInputSchema, setBgmInputSchema, setCaptionStyleInputSchema, setCaptionVisibilityInputSchema, setVideoClipSpeedShiftInputSchema, t as schemas_exports } from "./schemas.js";
3
3
  import { sha256 } from "@noble/hashes/sha2.js";
4
4
  import { bytesToHex } from "@noble/hashes/utils.js";
@@ -1947,6 +1947,208 @@ function cloneRows(rows) {
1947
1947
  };
1948
1948
  }
1949
1949
  //#endregion
1950
+ //#region src/entity-editor/visual-assets-effect.ts
1951
+ const receiptKey = (effectId) => `editorEffectReceipt:${effectId}`;
1952
+ const effectEntityId = (role, effectId, index) => createEntityId(`entity_visual_effect_${role}_${effectId}_${index}`);
1953
+ const effectRelationId = (role, effectId, index) => createRelationId(`relation_visual_effect_${role}_${effectId}_${index}`);
1954
+ /** Read the authoritative timeline receipt, not a media-id heuristic. */
1955
+ function hasVisualAssetsEffect(rows, effectId) {
1956
+ return rows.entities.find((row) => row.entityKind === "timeline")?.payload[receiptKey(effectId)] === true;
1957
+ }
1958
+ /**
1959
+ * Materialize a host-resolved visual command into native Entity/Relation rows.
1960
+ * The result is suitable for one revision-checked `EntityGraphHttpClient.commit`.
1961
+ * This does not fetch Assets or write remotely; callers must supply factual media
1962
+ * and lineage inputs after their own ownership checks.
1963
+ */
1964
+ function applyVisualAssetsEffect(rows, input) {
1965
+ if (!input.effect_id) throw new Error("Visual effect requires an effect_id");
1966
+ if (hasVisualAssetsEffect(rows, input.effect_id)) return rows;
1967
+ if (input.clips.length === 0) throw new Error("Visual effect requires clips");
1968
+ if (input.before_clip_id !== void 0 && input.after_clip_id !== void 0) throw new Error("Visual effect accepts only one placement anchor");
1969
+ const timeline = rows.entities.find((row) => row.entityKind === "timeline");
1970
+ if (!timeline) throw new Error("Visual effect requires a Timeline");
1971
+ if (!rows.entities.some((row) => row.entityKind === "track" && row.payload.role === "video_clip")) throw new Error("Visual effect requires a video Track");
1972
+ const anchor = input.before_clip_id ?? input.after_clip_id;
1973
+ if (anchor && !resolveEntityTimelineLayout(rows).tracks.find((track) => track.role === "video_clip")?.clips.some((clip) => clip.clipEntityId === anchor)) throw new Error(`Visual effect anchor ${anchor} no longer exists`);
1974
+ let prepared = rows;
1975
+ for (const clip of input.clips) {
1976
+ prepared = importEffectMedia(prepared, visualMediaFact(clip));
1977
+ for (const source of clip.lineage?.sources ?? []) if (source.assetId !== clip.media_id) prepared = importEffectMedia(prepared, source);
1978
+ if (clip.lineage?.script) prepared = materializeScript(prepared, clip.lineage.script);
1979
+ }
1980
+ const entityIds = input.clips.map((_, index) => effectEntityId("marker", input.effect_id, index));
1981
+ const relationIds = input.clips.flatMap((_, index) => [
1982
+ effectRelationId("track_clip", input.effect_id, index),
1983
+ effectRelationId("marker", input.effect_id, index),
1984
+ effectRelationId("content", input.effect_id, index)
1985
+ ]);
1986
+ const editor = new EntityTimelineEditor(prepared, (prefix) => {
1987
+ const id = (prefix === "entity" ? entityIds : relationIds).shift();
1988
+ if (!id) throw new Error(`Visual effect exhausted deterministic ${prefix} identities`);
1989
+ return id;
1990
+ });
1991
+ for (const clip of input.clips) {
1992
+ if (clip.media_kind !== "image" && clip.media_kind !== "video") throw new Error("Expected visual media");
1993
+ if (clip.lineage?.script && clip.media_kind !== "video") throw new Error("Only Video may derive from Script");
1994
+ }
1995
+ editor.insertMediaClips({
1996
+ timelineEntityId: timeline.entityId,
1997
+ clips: input.clips.map((clip, index) => ({
1998
+ clipEntityId: effectEntityId("clip", input.effect_id, index),
1999
+ media: visualMediaFact(clip),
2000
+ inMs: clip.play_in ?? 0,
2001
+ outMs: clip.play_out ?? clip.media_duration_ms,
2002
+ ...clip.volume === void 0 ? {} : { volume: clip.volume }
2003
+ })),
2004
+ insertion: input.before_clip_id !== void 0 ? {
2005
+ kind: "before",
2006
+ clipEntityId: input.before_clip_id
2007
+ } : input.after_clip_id !== void 0 ? {
2008
+ kind: "after",
2009
+ clipEntityId: input.after_clip_id
2010
+ } : {
2011
+ kind: "firstStart",
2012
+ startMs: input.clips.find((clip) => clip.start_ms !== void 0)?.start_ms ?? 0
2013
+ }
2014
+ });
2015
+ let next = editor.rows();
2016
+ const relations = [...next.relations];
2017
+ for (const [clipIndex, clip] of input.clips.entries()) {
2018
+ const output = findMediaId(next, clip.media_id);
2019
+ const seen = /* @__PURE__ */ new Set();
2020
+ for (const [sourceIndex, sourceFact] of (clip.lineage?.sources ?? []).entries()) {
2021
+ if (sourceFact.assetId === clip.media_id || seen.has(sourceFact.assetId)) continue;
2022
+ seen.add(sourceFact.assetId);
2023
+ const source = findMediaId(next, sourceFact.assetId, sourceFact.kind);
2024
+ if (hasDerivation(relations, output, source)) continue;
2025
+ relations.push({
2026
+ relationId: createRelationId(`relation_visual_effect_${input.effect_id}_${clipIndex}_${sourceIndex}`),
2027
+ relationKind: "derived-from",
2028
+ endpoint0EntityId: output,
2029
+ endpoint1EntityId: source,
2030
+ metadata: {},
2031
+ trace: { taskId: clip.lineage.generation_job_id }
2032
+ });
2033
+ }
2034
+ const script = clip.lineage?.script;
2035
+ if (!script) continue;
2036
+ if (relations.filter((relation) => relation.relationKind === "derived-from" && relation.endpoint0EntityId === output && next.entities.some((row) => row.entityId === relation.endpoint1EntityId && row.entityKind === "script")).some((relation) => relation.endpoint1EntityId !== script.entity_id)) throw new Error(`Video ${clip.media_id} already derives from another Script`);
2037
+ if (hasDerivation(relations, output, createEntityId(script.entity_id))) continue;
2038
+ relations.push({
2039
+ relationId: createRelationId(`relation_visual_effect_${input.effect_id}_script_${clipIndex}`),
2040
+ relationKind: "derived-from",
2041
+ endpoint0EntityId: output,
2042
+ endpoint1EntityId: createEntityId(script.entity_id),
2043
+ metadata: {},
2044
+ trace: { taskId: clip.lineage.generation_job_id }
2045
+ });
2046
+ }
2047
+ next = {
2048
+ entities: next.entities,
2049
+ relations
2050
+ };
2051
+ return {
2052
+ entities: next.entities.map((row) => row.entityId === timeline.entityId ? {
2053
+ ...row,
2054
+ payload: {
2055
+ ...row.payload,
2056
+ [receiptKey(input.effect_id)]: true
2057
+ }
2058
+ } : row),
2059
+ relations: next.relations
2060
+ };
2061
+ }
2062
+ function visualMediaFact(clip) {
2063
+ return clip.media_kind === "image" ? {
2064
+ assetId: clip.media_id,
2065
+ kind: "image",
2066
+ ...clip.storage_key ? { storageKey: clip.storage_key } : {}
2067
+ } : {
2068
+ assetId: clip.media_id,
2069
+ kind: "video",
2070
+ durationMs: clip.media_duration_ms,
2071
+ ...clip.storage_key ? { storageKey: clip.storage_key } : {}
2072
+ };
2073
+ }
2074
+ function materializeScript(rows, script) {
2075
+ const payload = {
2076
+ segments: script.segments.map((segment) => ({
2077
+ segmentId: segment.segment_id,
2078
+ text: segment.text,
2079
+ ...segment.language === void 0 ? {} : { language: segment.language }
2080
+ })),
2081
+ contentHash: script.content_hash
2082
+ };
2083
+ if (payload.contentHash !== scriptContentHash(payload.segments)) throw new Error(`Script ${script.entity_id} content hash is invalid`);
2084
+ const existing = rows.entities.find((row) => row.entityId === script.entity_id);
2085
+ if (existing) {
2086
+ if (existing.entityKind !== "script" || existing.payload.contentHash !== payload.contentHash || JSON.stringify(existing.payload.segments) !== JSON.stringify(payload.segments)) throw new Error(`Script ${script.entity_id} identity/content conflict`);
2087
+ return rows;
2088
+ }
2089
+ return {
2090
+ entities: [...rows.entities, {
2091
+ entityId: createEntityId(script.entity_id),
2092
+ entityKind: "script",
2093
+ payload
2094
+ }],
2095
+ relations: rows.relations
2096
+ };
2097
+ }
2098
+ function importEffectMedia(rows, fact) {
2099
+ const system = fact.kind === "voiceover-recording" ? "memota-speech" : "memota";
2100
+ const resolved = findCanonicalMedia(rows, fact.assetId, system);
2101
+ if (resolved.asset && fact.storageKey !== void 0 && resolved.asset.payload.storageKey !== fact.storageKey) throw new Error(`Media ${fact.assetId} storageKey conflicts with its immutable Asset`);
2102
+ const prepared = resolved.asset ? rows : {
2103
+ entities: [...rows.entities, {
2104
+ entityId: createEntityId(`entity_visual_media_${fact.assetId}_0`),
2105
+ entityKind: "asset",
2106
+ payload: {
2107
+ system,
2108
+ key: fact.assetId,
2109
+ ...fact.storageKey ? { storageKey: fact.storageKey } : {}
2110
+ }
2111
+ }],
2112
+ relations: rows.relations
2113
+ };
2114
+ const voiceDescriptor = fact.kind === "voiceover-recording" ? fact.voice : void 0;
2115
+ const existingVoice = voiceDescriptor ? rows.entities.find((row) => {
2116
+ const voice = row.payload.voice;
2117
+ return row.entityKind === "voice" && voice !== void 0 && voice.system === voiceDescriptor.system && voice.key === voiceDescriptor.key && voice.name === voiceDescriptor.name;
2118
+ }) : void 0;
2119
+ const hasTimbre = resolved.media !== void 0 && rows.relations.some((relation) => relation.relationKind === "voice-timbre" && relation.endpoint0EntityId === resolved.media.entityId);
2120
+ const entities = [...resolved.media ? [] : [createEntityId(`entity_visual_media_${fact.assetId}_1`)], ...fact.kind === "voiceover-recording" && fact.voice && !existingVoice ? [createEntityId(`entity_visual_media_${fact.assetId}_2`)] : []];
2121
+ const relations = [...resolved.media ? [] : [createRelationId(`relation_visual_media_${fact.assetId}_0`)], ...fact.kind === "voiceover-recording" && fact.voice && !hasTimbre ? [createRelationId(`relation_visual_media_${fact.assetId}_1`)] : []];
2122
+ return importMediaAsset(prepared, fact, (prefix) => {
2123
+ const id = (prefix === "entity" ? entities : relations).shift();
2124
+ if (!id) throw new Error(`Media ${fact.assetId} exhausted deterministic ${prefix} slots`);
2125
+ return id;
2126
+ }).rows;
2127
+ }
2128
+ function findMediaId(rows, mediaId, kind) {
2129
+ const media = findCanonicalMedia(rows, mediaId, kind === "voiceover-recording" ? "memota-speech" : "memota").media;
2130
+ if (!media) throw new Error(`Imported media ${mediaId} is missing`);
2131
+ return media.entityId;
2132
+ }
2133
+ function findCanonicalMedia(rows, mediaId, system = "memota") {
2134
+ const assets = rows.entities.filter((row) => row.entityKind === "asset" && row.payload.system === system && row.payload.key === mediaId);
2135
+ if (assets.length > 1) throw new Error(`Imported media ${mediaId} has duplicate Asset identities`);
2136
+ const asset = assets[0];
2137
+ if (!asset) return {};
2138
+ const links = rows.relations.filter((relation) => relation.relationKind === "from-asset" && relation.endpoint1EntityId === asset.entityId);
2139
+ if (rows.relations.some((relation) => relation.relationKind === "from-asset" && relation.endpoint0EntityId === asset.entityId)) throw new Error(`Imported media ${mediaId} has reversed from-asset relation`);
2140
+ if (links.length > 1) throw new Error(`Imported media ${mediaId} has duplicate media identities`);
2141
+ const media = rows.entities.find((row) => row.entityId === links[0]?.endpoint0EntityId);
2142
+ if (links.length && (!media || media.entityKind !== "image" && media.entityKind !== "video" && media.entityKind !== "audio" && !(system === "memota-speech" && media.entityKind === "voiceover-recording"))) throw new Error(`Imported media ${mediaId} has invalid media identity`);
2143
+ return {
2144
+ asset,
2145
+ ...media ? { media } : {}
2146
+ };
2147
+ }
2148
+ function hasDerivation(relations, output, source) {
2149
+ return relations.some((relation) => relation.relationKind === "derived-from" && relation.endpoint0EntityId === output && relation.endpoint1EntityId === source);
2150
+ }
2151
+ //#endregion
1950
2152
  //#region src/entity-editor/revise-audio-script.ts
1951
2153
  /** Revise text as an independent authored document, never as a version-family mutation. */
1952
2154
  function reviseAudioScript(rows, input) {
@@ -5388,4 +5590,4 @@ function serverCovers(serverVV, target) {
5388
5590
  return covers(server, target);
5389
5591
  }
5390
5592
  //#endregion
5391
- export { DEFAULT_UNIT_TIME_MS, EntityGraphHttpClient, EntityGraphRevisionConflictError, EntityTimelineEditor, EntityTimelineProjectionError, IMPLEMENTED_SEMANTIC_OP_KINDS, LANE_KINDS_IN_STACK_ORDER, LORO_ENTITY_SCHEMA, LoroEntityDocument, LoroEntityDraft, ManualSyncDoc, MedeoHttpDocStorage, MemoryDocStorage, MengineAckFailedError, MengineDocSession, MengineHttpClient, MengineHttpRequestError, MenginePushRejectedError, MirrorVideoDocumentAdapter, PlainMemoryAdapter, SchemaValidator, ScriptCompositionError, SemanticEditor, TIMELINE_SKELETON_DURATION_MS, ValidationError, VideoDocumentValidationError, applyEntityRows, applyFieldChanges, arrangeMainTrackSeamlessly, assembleCaptionContent, assembleEntityContent, assemblePhoneticScriptContent, assembleScriptText, assertCanonicalEditorResources, assertEntityProjectionPreservesLegacy, assertFieldChanges, assertMediaAssetWritePolicy, assertValidVideoDocument, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetHash, audioScriptAssetOf, base64ToBytes, buildInitialVideoDocument, buildSpeechHostMap, bytesToBase64, cascadeAfterVideoClipChanges, compileEntityRows, createEditSandbox, createMirrorVideoDocument, createMirrorVideoDocumentAdapter, createPlainMemoryAdapter, decodeDocVersionMark, derivePositionFromAbs, effectiveVideoClipDurationMs, encodeDocVersionMark, ensureEditorFoundation, ensureLaneTrack, fillMainTrackTimeGaps, findComposedAudioScript, findLaneTrack, fromVideoDocument, generatePartId, getAt, hostForAbsMs, importMediaAsset, isEmptyVideoClip, isImplementedSemanticOpKind, isMap, laneTrackId, mainTrackRanges, migrateAlpha23EntityDocument, migrateLegacyTimelineToEntities, partDurationMs, partUnionSchema, phoneticScriptAssetContent, phoneticScriptAssetHash, phoneticScriptAssetOf, prepareCaptionContent, projectEntityTimeline, publishEntityRows, readDocumentAudioScript, readEntityDocument, readEntityRelationRecords, readMainTrackItems, readMengineEventStream, readPart, readPartDurationMs, readVideoDocumentFromDraft, reassignSpeechesToVideoClipsByTime, recalculateTimelineDuration, relativePositionForAbs, replayJournal, resolveAllSpeechOverlaps, resolveEntityTimelineLayout, resolveFieldPath, resolveSpeechOverlapByShiftingVideos, reviseAudioScript, safeDurationMs, schemas_exports as schemas, scriptSourceAssetOf, selectAudioScriptSegment, snapshotToPlain, solveVideoDocument, speedOf, syncAggregatedClipsTimePosition, toVideoDocument, validateVideoDocument, videoDocumentMirrorSchema, videoDocumentSchema };
5593
+ export { DEFAULT_UNIT_TIME_MS, EntityGraphHttpClient, EntityGraphRevisionConflictError, EntityTimelineEditor, EntityTimelineProjectionError, IMPLEMENTED_SEMANTIC_OP_KINDS, LANE_KINDS_IN_STACK_ORDER, LORO_ENTITY_SCHEMA, LoroEntityDocument, LoroEntityDraft, ManualSyncDoc, MedeoHttpDocStorage, MemoryDocStorage, MengineAckFailedError, MengineDocSession, MengineHttpClient, MengineHttpRequestError, MenginePushRejectedError, MirrorVideoDocumentAdapter, PlainMemoryAdapter, SchemaValidator, ScriptCompositionError, SemanticEditor, TIMELINE_SKELETON_DURATION_MS, ValidationError, VideoDocumentValidationError, applyEntityRows, applyFieldChanges, applyVisualAssetsEffect, arrangeMainTrackSeamlessly, assembleCaptionContent, assembleEntityContent, assemblePhoneticScriptContent, assembleScriptText, assertCanonicalEditorResources, assertEntityProjectionPreservesLegacy, assertFieldChanges, assertMediaAssetWritePolicy, assertValidVideoDocument, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetHash, audioScriptAssetOf, base64ToBytes, buildInitialVideoDocument, buildSpeechHostMap, bytesToBase64, cascadeAfterVideoClipChanges, compileEntityRows, createEditSandbox, createMirrorVideoDocument, createMirrorVideoDocumentAdapter, createPlainMemoryAdapter, decodeDocVersionMark, derivePositionFromAbs, effectiveVideoClipDurationMs, encodeDocVersionMark, ensureEditorFoundation, ensureLaneTrack, fillMainTrackTimeGaps, findComposedAudioScript, findLaneTrack, fromVideoDocument, generatePartId, getAt, hasVisualAssetsEffect, hostForAbsMs, importMediaAsset, isEmptyVideoClip, isImplementedSemanticOpKind, isMap, laneTrackId, mainTrackRanges, migrateAlpha23EntityDocument, migrateLegacyTimelineToEntities, partDurationMs, partUnionSchema, phoneticScriptAssetContent, phoneticScriptAssetHash, phoneticScriptAssetOf, prepareCaptionContent, projectEntityTimeline, publishEntityRows, readDocumentAudioScript, readEntityDocument, readEntityRelationRecords, readMainTrackItems, readMengineEventStream, readPart, readPartDurationMs, readVideoDocumentFromDraft, reassignSpeechesToVideoClipsByTime, recalculateTimelineDuration, relativePositionForAbs, replayJournal, resolveAllSpeechOverlaps, resolveEntityTimelineLayout, resolveFieldPath, resolveSpeechOverlapByShiftingVideos, reviseAudioScript, safeDurationMs, schemas_exports as schemas, scriptSourceAssetOf, selectAudioScriptSegment, snapshotToPlain, solveVideoDocument, speedOf, syncAggregatedClipsTimePosition, toVideoDocument, validateVideoDocument, videoDocumentMirrorSchema, videoDocumentSchema };
package/dist/testing.js CHANGED
@@ -1,4 +1,4 @@
1
- import { At as base64ToBytes, jt as bytesToBase64, o as createMirrorVideoDocumentAdapter } from "./document-B3RLmTzA.js";
1
+ import { Mt as bytesToBase64, jt as base64ToBytes, o as createMirrorVideoDocumentAdapter } from "./document-e4Y1QNMu.js";
2
2
  import { t as classifyUpdate } from "./loro-relay-doc-cJSY-uau.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": "2.0.1-alpha.29",
3
+ "version": "2.0.1-alpha.30",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,9 +28,9 @@
28
28
  "immer": "^10.2.0",
29
29
  "loro-mirror": "^2.3.3",
30
30
  "zod": "^4.4.3",
31
- "@mengine/storage": "2.0.1-alpha.29",
32
- "@mengine/utils": "2.0.1-alpha.29",
33
- "@mengine/sync": "2.0.1-alpha.29"
31
+ "@mengine/storage": "2.0.1-alpha.30",
32
+ "@mengine/sync": "2.0.1-alpha.30",
33
+ "@mengine/utils": "2.0.1-alpha.30"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^25.9.1",