@mengine/medeo-client 2.0.1-alpha.21 → 2.0.1-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{document-BXQcpnOg.js → document-7Vi1AeQc.js} +130 -59
- package/dist/{index-CzDNr1Tb.d.ts → index-mGObzOh4.d.ts} +340 -75
- package/dist/index.d.ts +213 -413
- package/dist/index.js +231 -1617
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/package.json +4 -4
|
@@ -2463,7 +2463,7 @@ const axVideoMarkerRelationSpec = emptySpec("axvideo-marker", "axvideo", "sequen
|
|
|
2463
2463
|
const markerTimelineRelationSpec = emptySpec("marker-timeline", "sequence-marker", "timeline");
|
|
2464
2464
|
const markerContentRelationSpec = Object.freeze({
|
|
2465
2465
|
kind: "marker-content",
|
|
2466
|
-
validateEndpoints: (endpoints) =>
|
|
2466
|
+
validateEndpoints: (endpoints) => endpoints[0].current().entityKind === "sequence-marker" && hasSequence(endpoints[1].current()),
|
|
2467
2467
|
validateMetadata: isEmptyMetadata
|
|
2468
2468
|
});
|
|
2469
2469
|
/**
|
|
@@ -2477,7 +2477,7 @@ const markerContentRelationSpec = Object.freeze({
|
|
|
2477
2477
|
*/
|
|
2478
2478
|
const fromAssetRelationSpec = Object.freeze({
|
|
2479
2479
|
kind: "from-asset",
|
|
2480
|
-
validateEndpoints: (endpoints) =>
|
|
2480
|
+
validateEndpoints: (endpoints) => declaresKind(endpoints[0].current().entityKind, "MediaFile") && endpoints[1].current().entityKind === "asset",
|
|
2481
2481
|
validateMetadata: isAssetBinding
|
|
2482
2482
|
});
|
|
2483
2483
|
/**
|
|
@@ -2497,13 +2497,13 @@ const fromAssetRelationSpec = Object.freeze({
|
|
|
2497
2497
|
*/
|
|
2498
2498
|
const toAssetRelationSpec = Object.freeze({
|
|
2499
2499
|
kind: "to-asset",
|
|
2500
|
-
validateEndpoints: (endpoints) =>
|
|
2500
|
+
validateEndpoints: (endpoints) => declaresKind(endpoints[0].current().entityKind, "MediaFile") && endpoints[1].current().entityKind === "asset",
|
|
2501
2501
|
validateMetadata: isAssetBinding
|
|
2502
2502
|
});
|
|
2503
|
-
/** `generated(output, input)`
|
|
2503
|
+
/** `generated(output, input)` records media generation or an independent AudioScript revision. */
|
|
2504
2504
|
const generatedRelationSpec = Object.freeze({
|
|
2505
2505
|
kind: "generated",
|
|
2506
|
-
validateEndpoints: (endpoints) => endpoints.every((endpoint) => isGeneratedMedia(endpoint.current())),
|
|
2506
|
+
validateEndpoints: (endpoints) => endpoints.every((endpoint) => isGeneratedMedia(endpoint.current())) || endpoints.every((endpoint) => endpoint.current().entityKind === "audio-script"),
|
|
2507
2507
|
validateMetadata: isEmptyMetadata
|
|
2508
2508
|
});
|
|
2509
2509
|
const captionAlignmentRelationSpec = Object.freeze({
|
|
@@ -2518,8 +2518,8 @@ const clipAnchorRelationSpec = Object.freeze({
|
|
|
2518
2518
|
validateMetadata: isEmptyMetadata
|
|
2519
2519
|
});
|
|
2520
2520
|
/**
|
|
2521
|
-
* The Voiceover and the PhoneticScript it was spoken from
|
|
2522
|
-
*
|
|
2521
|
+
* The Voiceover and the PhoneticScript it was spoken from. Endpoint 0 is the
|
|
2522
|
+
* output and endpoint 1 is the input script.
|
|
2523
2523
|
*
|
|
2524
2524
|
* Every Voiceover must carry one: which words were said, and how, is the only
|
|
2525
2525
|
* thing that makes speech reproducible, and a Voiceover that cannot answer it
|
|
@@ -2540,7 +2540,7 @@ const voiceTimbreRelationSpec = Object.freeze({
|
|
|
2540
2540
|
validateEndpoints: (endpoints) => hasKinds(endpoints, new Set(["voiceover"]), new Set(["voice"])),
|
|
2541
2541
|
validateMetadata: isEmptyMetadata
|
|
2542
2542
|
});
|
|
2543
|
-
/** AudioScript was transcribed from Audio
|
|
2543
|
+
/** AudioScript was transcribed from Audio or Video: `[script, source]`. */
|
|
2544
2544
|
const audioScriptSourceRelationSpec = Object.freeze({
|
|
2545
2545
|
kind: "audio-script-source",
|
|
2546
2546
|
validateEndpoints: (endpoints) => hasKinds(endpoints, new Set(["audio-script"]), new Set([
|
|
@@ -2592,19 +2592,7 @@ function metadataSpec(kind, a, b, validateMetadata) {
|
|
|
2592
2592
|
function hasKinds(endpoints, aKinds, bKinds) {
|
|
2593
2593
|
const first = endpoints[0].current().entityKind;
|
|
2594
2594
|
const second = endpoints[1].current().entityKind;
|
|
2595
|
-
return aKinds.has(first) && bKinds.has(second)
|
|
2596
|
-
}
|
|
2597
|
-
function hasMarkerAndSequence(endpoints) {
|
|
2598
|
-
const first = endpoints[0].current();
|
|
2599
|
-
const second = endpoints[1].current();
|
|
2600
|
-
return first.entityKind === "sequence-marker" && hasSequence(second) || second.entityKind === "sequence-marker" && hasSequence(first);
|
|
2601
|
-
}
|
|
2602
|
-
/** Exactly one end is the Asset, so the other end is unambiguously the bound entity. */
|
|
2603
|
-
function hasExactlyOneAsset(endpoints) {
|
|
2604
|
-
const kinds = endpoints.map((endpoint) => endpoint.current().entityKind);
|
|
2605
|
-
const assets = kinds.map((kind) => kind === "asset");
|
|
2606
|
-
if (assets[0] === assets[1]) return false;
|
|
2607
|
-
return declaresKind(assets[0] ? kinds[1] : kinds[0], "MediaFile");
|
|
2595
|
+
return aKinds.has(first) && bKinds.has(second);
|
|
2608
2596
|
}
|
|
2609
2597
|
function isGeneratedMedia(entity) {
|
|
2610
2598
|
return entity.entityKind === "video" || entity.entityKind === "image" || entity.entityKind === "audio" || entity.entityKind === "voiceover";
|
|
@@ -2940,6 +2928,42 @@ function errorMessage(error) {
|
|
|
2940
2928
|
return error instanceof Error ? error.message : String(error);
|
|
2941
2929
|
}
|
|
2942
2930
|
//#endregion
|
|
2931
|
+
//#region ../medeo-dsl/src/relation-transition.ts
|
|
2932
|
+
var InvalidEntityRelationTransitionError = class extends Error {
|
|
2933
|
+
issues;
|
|
2934
|
+
constructor(issues) {
|
|
2935
|
+
super(`Invalid Medeo relation transition:\n- ${issues.join("\n- ")}`);
|
|
2936
|
+
this.issues = issues;
|
|
2937
|
+
this.name = "InvalidEntityRelationTransitionError";
|
|
2938
|
+
}
|
|
2939
|
+
};
|
|
2940
|
+
/** Enforce relation fact identity while admitting a complete candidate view. */
|
|
2941
|
+
function validateEntityRelationTransition(before, candidate) {
|
|
2942
|
+
const issues = [];
|
|
2943
|
+
const previous = new Map(before.relations.map((row) => [row.relationId, row]));
|
|
2944
|
+
for (const relation of candidate.relations) {
|
|
2945
|
+
const original = previous.get(relation.relationId);
|
|
2946
|
+
if (original == null) {
|
|
2947
|
+
if (relation.relationKind === "caption-alignment") issues.push(`new caption-alignment relation "${relation.relationId}" is forbidden`);
|
|
2948
|
+
continue;
|
|
2949
|
+
}
|
|
2950
|
+
if (original.relationKind !== relation.relationKind || original.endpoint0EntityId !== relation.endpoint0EntityId || original.endpoint1EntityId !== relation.endpoint1EntityId) {
|
|
2951
|
+
issues.push(`relation "${relation.relationId}" changed its kind or ordered endpoints`);
|
|
2952
|
+
continue;
|
|
2953
|
+
}
|
|
2954
|
+
if (!sameJson(original.metadata, relation.metadata)) issues.push(`relation "${relation.relationId}" changed semantic metadata without a new identity`);
|
|
2955
|
+
if (relation.relationKind === "caption-alignment" && !sameJson(original.trace, relation.trace)) issues.push(`legacy caption-alignment relation "${relation.relationId}" may only be carried unchanged or deleted`);
|
|
2956
|
+
}
|
|
2957
|
+
if (issues.length > 0) throw new InvalidEntityRelationTransitionError(issues);
|
|
2958
|
+
}
|
|
2959
|
+
function sameJson(left, right) {
|
|
2960
|
+
if (left === right) return true;
|
|
2961
|
+
if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((value, index) => sameJson(value, right[index]));
|
|
2962
|
+
if (!isJsonObject(left) || !isJsonObject(right)) return false;
|
|
2963
|
+
const leftKeys = Object.keys(left);
|
|
2964
|
+
return leftKeys.length === Object.keys(right).length && leftKeys.every((key) => Object.hasOwn(right, key) && sameJson(left[key], right[key]));
|
|
2965
|
+
}
|
|
2966
|
+
//#endregion
|
|
2943
2967
|
//#region src/document/entity-projection-values.ts
|
|
2944
2968
|
/** A graph cannot be represented faithfully by the compatibility reader. */
|
|
2945
2969
|
var EntityTimelineProjectionError = class extends Error {
|
|
@@ -3160,7 +3184,8 @@ function assertTrackContent(graph, role, content) {
|
|
|
3160
3184
|
assertSpeechContent(graph, content);
|
|
3161
3185
|
return;
|
|
3162
3186
|
}
|
|
3163
|
-
|
|
3187
|
+
const expected = role === "video_clip" ? ["image", "video"] : role === "caption" ? ["caption"] : ["audio"];
|
|
3188
|
+
if (!expected.includes(content.entityKind)) fail(`${role} Track accepts ${expected.join(" or ")}, got ${content.entityKind}`);
|
|
3164
3189
|
}
|
|
3165
3190
|
function assertSpeechContent(graph, content) {
|
|
3166
3191
|
const assetLinks = graph.rows.relations.filter((relation) => relation.relationKind === "from-asset" && (relation.endpoint0EntityId === content.entityId || relation.endpoint1EntityId === content.entityId));
|
|
@@ -3179,7 +3204,7 @@ function assertSpeechContent(graph, content) {
|
|
|
3179
3204
|
if (asset.payload.system !== "memota") fail("Recorded Speech Audio requires an explicit memota key");
|
|
3180
3205
|
return;
|
|
3181
3206
|
}
|
|
3182
|
-
fail(`
|
|
3207
|
+
fail(`speech Track accepts voiceover or audio, got ${content.entityKind}`);
|
|
3183
3208
|
}
|
|
3184
3209
|
//#endregion
|
|
3185
3210
|
//#region src/document/entity-projection.ts
|
|
@@ -3781,6 +3806,19 @@ function writeEntityOrder(doc, group, roots, token) {
|
|
|
3781
3806
|
//#region src/entity-crdt/entity-document.ts
|
|
3782
3807
|
const LORO_ENTITY_SCHEMA = "medeo.entities.loro.v1";
|
|
3783
3808
|
const MATERIALIZE_ORIGIN = "medeo.materialize";
|
|
3809
|
+
/** Read persisted relation roots before current entity versions are projected. */
|
|
3810
|
+
function readEntityRelationRecords(doc) {
|
|
3811
|
+
if (root(doc).get("schema") !== "medeo.entities.loro.v1") throw new Error("Document has no Loro entity state");
|
|
3812
|
+
return relationRecords(doc).map(({ rootId, identity, map, deleted }) => ({
|
|
3813
|
+
relationId: createRelationId(rootId),
|
|
3814
|
+
relationKind: identity.kind,
|
|
3815
|
+
endpoint0EntityId: createEntityId(identity.endpoints[0]),
|
|
3816
|
+
endpoint1EntityId: createEntityId(identity.endpoints[1]),
|
|
3817
|
+
metadata: requireMap(map, "metadata").toJSON(),
|
|
3818
|
+
trace: requireMap(map, "trace").toJSON(),
|
|
3819
|
+
deleted
|
|
3820
|
+
}));
|
|
3821
|
+
}
|
|
3784
3822
|
function hash(value) {
|
|
3785
3823
|
return bytesToHex(sha256(new TextEncoder().encode(canonicalJson(value))));
|
|
3786
3824
|
}
|
|
@@ -3872,23 +3910,17 @@ function readEntityDocument(doc, allowSelectionConflicts = false) {
|
|
|
3872
3910
|
}
|
|
3873
3911
|
};
|
|
3874
3912
|
});
|
|
3875
|
-
const relations =
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
if (original.endpoints.some((id) => !ids.has(family(doc, id)))) continue;
|
|
3881
|
-
const endpoints = original.endpoints.map((id) => currentId(doc, id, ids));
|
|
3882
|
-
const relationId = equalJson(endpoints, original.endpoints) ? key : `relation_${hash([key, endpoints])}`;
|
|
3883
|
-
relations.push({
|
|
3884
|
-
relationId: createRelationId(relationId),
|
|
3885
|
-
relationKind: original.kind,
|
|
3913
|
+
const relations = activeRelationRecords(doc, ids).map(({ rootId, identity, map }) => {
|
|
3914
|
+
const endpoints = identity.endpoints.map((id) => currentId(doc, id, ids));
|
|
3915
|
+
return {
|
|
3916
|
+
relationId: createRelationId(equalJson(endpoints, identity.endpoints) ? rootId : `relation_${hash([rootId, endpoints])}`),
|
|
3917
|
+
relationKind: identity.kind,
|
|
3886
3918
|
endpoint0EntityId: createEntityId(endpoints[0]),
|
|
3887
3919
|
endpoint1EntityId: createEntityId(endpoints[1]),
|
|
3888
3920
|
metadata: requireMap(map, "metadata").toJSON(),
|
|
3889
3921
|
trace: requireMap(map, "trace").toJSON()
|
|
3890
|
-
}
|
|
3891
|
-
}
|
|
3922
|
+
};
|
|
3923
|
+
});
|
|
3892
3924
|
const project = {};
|
|
3893
3925
|
for (const [key, value] of Object.entries(section(doc, "attachments").toJSON())) {
|
|
3894
3926
|
if (typeof value !== "string") throw new Error(`Invalid project attachment ${key}`);
|
|
@@ -3907,6 +3939,32 @@ function readEntityDocument(doc, allowSelectionConflicts = false) {
|
|
|
3907
3939
|
}
|
|
3908
3940
|
return state;
|
|
3909
3941
|
}
|
|
3942
|
+
function relationRecords(doc) {
|
|
3943
|
+
const records = [];
|
|
3944
|
+
for (const rootId of section(doc, "relations").keys().sort((a, b) => a < b ? -1 : a > b ? 1 : 0)) {
|
|
3945
|
+
const map = section(doc, "relations").get(rootId);
|
|
3946
|
+
if (!(map instanceof LoroMap)) throw new Error(`Invalid relation record ${rootId}`);
|
|
3947
|
+
const value = map.get("identity");
|
|
3948
|
+
if (!isJsonObject(value) || typeof value.kind !== "string" || !Array.isArray(value.endpoints) || value.endpoints.length !== 2 || !value.endpoints.every((endpoint) => typeof endpoint === "string")) throw new Error(`Invalid relation identity ${rootId}`);
|
|
3949
|
+
const identity = {
|
|
3950
|
+
kind: value.kind,
|
|
3951
|
+
endpoints: [value.endpoints[0], value.endpoints[1]]
|
|
3952
|
+
};
|
|
3953
|
+
records.push({
|
|
3954
|
+
rootId,
|
|
3955
|
+
identity,
|
|
3956
|
+
map,
|
|
3957
|
+
deleted: map.get("deleted") === true
|
|
3958
|
+
});
|
|
3959
|
+
}
|
|
3960
|
+
return records;
|
|
3961
|
+
}
|
|
3962
|
+
function activeRelationRecords(doc, ids) {
|
|
3963
|
+
return relationRecords(doc).filter(({ identity, deleted }) => {
|
|
3964
|
+
if (deleted) return false;
|
|
3965
|
+
return identity.endpoints.every((id) => ids.has(family(doc, id)));
|
|
3966
|
+
});
|
|
3967
|
+
}
|
|
3910
3968
|
/** Native editing containers survive domain version changes and merge independently. */
|
|
3911
3969
|
var LoroEntityDocument = class LoroEntityDocument {
|
|
3912
3970
|
doc;
|
|
@@ -3972,25 +4030,6 @@ var LoroEntityDocument = class LoroEntityDocument {
|
|
|
3972
4030
|
if (id === void 0) return [];
|
|
3973
4031
|
return this.snapshot().rows.relations.filter((row) => row.endpoint0EntityId === id || row.endpoint1EntityId === id);
|
|
3974
4032
|
}
|
|
3975
|
-
/** Read unlinked Relation records for durable effect receipts; never part of the current semantic graph. */
|
|
3976
|
-
tombstonedRelations() {
|
|
3977
|
-
const result = [];
|
|
3978
|
-
for (const key of section(this.doc, "relations").keys().sort((a, b) => a < b ? -1 : a > b ? 1 : 0)) {
|
|
3979
|
-
const map = section(this.doc, "relations").get(key);
|
|
3980
|
-
if (!(map instanceof LoroMap) || map.get("deleted") !== true) continue;
|
|
3981
|
-
const identity = map.get("identity");
|
|
3982
|
-
if (!identity || identity.endpoints.length !== 2) throw new Error(`Invalid tombstoned Relation ${key}`);
|
|
3983
|
-
result.push({
|
|
3984
|
-
relationId: createRelationId(key),
|
|
3985
|
-
relationKind: identity.kind,
|
|
3986
|
-
endpoint0EntityId: createEntityId(identity.endpoints[0]),
|
|
3987
|
-
endpoint1EntityId: createEntityId(identity.endpoints[1]),
|
|
3988
|
-
metadata: requireMap(map, "metadata").toJSON(),
|
|
3989
|
-
trace: requireMap(map, "trace").toJSON()
|
|
3990
|
-
});
|
|
3991
|
-
}
|
|
3992
|
-
return result;
|
|
3993
|
-
}
|
|
3994
4033
|
/** Resolve a queued edit target through its native identity without changing history. */
|
|
3995
4034
|
resolveCurrentEntityId(id) {
|
|
3996
4035
|
return currentId(this.doc, id);
|
|
@@ -4156,16 +4195,47 @@ var LoroEntityDraft = class {
|
|
|
4156
4195
|
});
|
|
4157
4196
|
}
|
|
4158
4197
|
link(row) {
|
|
4198
|
+
if (row.relationKind === "caption-alignment") throw new Error("caption-alignment Relations are read-only legacy facts");
|
|
4199
|
+
if (row.relationKind === "generated" || row.relationKind === "clip-anchor") throw new Error(`Author ordered ${row.relationKind} Relations with the dedicated role-named method`);
|
|
4159
4200
|
this.record({
|
|
4160
4201
|
type: "relation",
|
|
4161
4202
|
row: clone(row)
|
|
4162
4203
|
});
|
|
4163
4204
|
}
|
|
4164
|
-
|
|
4205
|
+
linkGenerated(input) {
|
|
4206
|
+
this.record({
|
|
4207
|
+
type: "relation",
|
|
4208
|
+
row: {
|
|
4209
|
+
relationId: input.relationId,
|
|
4210
|
+
relationKind: "generated",
|
|
4211
|
+
endpoint0EntityId: input.outputEntityId,
|
|
4212
|
+
endpoint1EntityId: input.inputEntityId,
|
|
4213
|
+
metadata: {},
|
|
4214
|
+
trace: clone(input.trace ?? {})
|
|
4215
|
+
}
|
|
4216
|
+
});
|
|
4217
|
+
}
|
|
4218
|
+
linkClipAnchor(input) {
|
|
4219
|
+
this.record({
|
|
4220
|
+
type: "relation",
|
|
4221
|
+
row: {
|
|
4222
|
+
relationId: input.relationId,
|
|
4223
|
+
relationKind: "clip-anchor",
|
|
4224
|
+
endpoint0EntityId: input.childClipEntityId,
|
|
4225
|
+
endpoint1EntityId: input.hostClipEntityId,
|
|
4226
|
+
metadata: {},
|
|
4227
|
+
trace: clone(input.trace ?? {})
|
|
4228
|
+
}
|
|
4229
|
+
});
|
|
4230
|
+
}
|
|
4231
|
+
patchRelationTrace(relationId, trace) {
|
|
4232
|
+
const relation = this.snapshot().rows.relations.find((row) => row.relationId === relationId);
|
|
4233
|
+
if (relation == null) throw new Error(`Unknown relation ${relationId}`);
|
|
4234
|
+
if (relation.relationKind === "caption-alignment") throw new Error("caption-alignment Relations are read-only legacy facts");
|
|
4165
4235
|
this.record({
|
|
4166
4236
|
type: "relation-fields",
|
|
4167
4237
|
root: this.relationRoot(relationId),
|
|
4168
|
-
metadata: clone(metadata),
|
|
4238
|
+
metadata: clone(relation.metadata),
|
|
4169
4239
|
trace: clone(trace)
|
|
4170
4240
|
});
|
|
4171
4241
|
}
|
|
@@ -4261,8 +4331,9 @@ var LoroEntityDraft = class {
|
|
|
4261
4331
|
const key = this.relationRoot(relationId);
|
|
4262
4332
|
const map = section(this.doc, "relations").get(key);
|
|
4263
4333
|
if (!(map instanceof LoroMap) || map.get("deleted") === true) throw new Error("Unknown relation");
|
|
4334
|
+
if (map.get("identity").kind === "caption-alignment") throw new Error("caption-alignment Relations are read-only legacy facts");
|
|
4264
4335
|
for (const change of changes) {
|
|
4265
|
-
if (
|
|
4336
|
+
if (change.path[0] !== "trace" || change.path.length < 2) throw new Error("Relation changes may only edit trace fields");
|
|
4266
4337
|
const payload = {
|
|
4267
4338
|
metadata: requireMap(map, "metadata").toJSON(),
|
|
4268
4339
|
trace: requireMap(map, "trace").toJSON()
|
|
@@ -4778,4 +4849,4 @@ function createPlainMemoryAdapter(document, options) {
|
|
|
4778
4849
|
return new PlainMemoryAdapter(document, options);
|
|
4779
4850
|
}
|
|
4780
4851
|
//#endregion
|
|
4781
|
-
export {
|
|
4852
|
+
export { VideoDocumentValidationError as $, resolveEntityTimelineLayout as A, selectAudioScriptSegment as B, canonicalJson as C, effectiveVideoClipDurationMs as Ct, resolveFieldPath as D, videoDocumentMirrorSchema as Dt, assertFieldChanges as E, recordEntries as Et, assembleCaptionContent as F, createRelationId as G, variantBaseEntityIds as H, assembleEntityContent as I, buildInitialVideoDocument as J, hasSequence as K, assemblePhoneticScriptContent as L, validateEntityRelationTransition as M, decodeEntityRelationRows as N, projectEntityTimeline as O, base64ToBytes as Ot, ScriptCompositionError as P, toVideoDocument as Q, assembleScriptText as R, scriptSourceAssetOf as S, DEFAULT_UNIT_TIME_MS as St, applyFieldChanges as T, partUnionToDraft as Tt, isJsonObject as U, updateEntityFields as V, createEntityId as W, derivePositionFromAbs as X, buildSpeechHostMap as Y, fromVideoDocument as Z, audioScriptAssetHash as _, syncAggregatedClipsTimePosition as _t, createMirrorVideoDocument as a, ensureLaneTrack as at, phoneticScriptAssetHash as b, partDurationMs as bt, DocumentMutationGuard as c, laneTrackId as ct, LoroEntityDraft as d, arrangeMainTrackSeamlessly as dt, assertValidVideoDocument as et, readEntityDocument as f, fillMainTrackTimeGaps as ft, audioScriptAssetFields as g, resolveSpeechOverlapByShiftingVideos as gt, audioScriptAssetContent as h, resolveAllSpeechOverlaps as ht, MirrorVideoDocumentAdapter as i, LANE_KINDS_IN_STACK_ORDER as it, EntityTimelineProjectionError as j, EntityProjectionGraph as k, bytesToBase64 as kt, LORO_ENTITY_SCHEMA as l, solveVideoDocument as lt, entityOrderGroups as m, recalculateTimelineDuration as mt, createPlainMemoryAdapter as n, partUnionSchema as nt, createMirrorVideoDocumentAdapter as o, findLaneTrack as ot, readEntityRelationRecords as p, reassignSpeechesToVideoClipsByTime as pt, isMediaAssetVariantKind as q, generatePartId as r, videoDocumentSchema as rt, readVideoDocumentFromDraft as s, hasResolvedPlacement as st, PlainMemoryAdapter as t, validateVideoDocument as tt, LoroEntityDocument as u, cascadeAfterVideoClipChanges as ut, audioScriptAssetOf as v, TIMELINE_SKELETON_DURATION_MS as vt, equalJson as w, speedOf as wt, phoneticScriptAssetOf as x, safeDurationMs as xt, phoneticScriptAssetContent as y, isEmptyVideoClip as yt, findComposedAudioScript as z };
|