@mengine/medeo-tool 1.4.1-alpha.3 → 1.4.1-alpha.5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-sandbox-TaUVT3on.mjs","names":["isRecord"],"sources":["../../medeo-dsl/src/entities.ts","../../medeo-dsl/src/ids.ts","../../medeo-dsl/src/json-values.ts","../../medeo-dsl/src/composition.ts","../../medeo-dsl/src/rows.ts","../../medeo-dsl/src/invariants.ts","../../medeo-dsl/src/relation-specs.ts","../../medeo-dsl/src/relations.ts","../../medeo-dsl/src/relation-index.ts","../../medeo-dsl/src/entity-relation-rows.ts","../src/sandbox/business-facades.ts","../src/entity/entity-sandbox.ts"],"sourcesContent":["import type { EntityId } from './ids.ts';\nimport type { JsonObject } from './json-values.ts';\n\nexport type KnownEntityKind =\n | 'axvideo'\n | 'timeline'\n | 'track'\n | 'clip'\n | 'asset'\n | 'video'\n | 'audio'\n | 'voice'\n | 'image'\n | 'sequence-marker'\n | 'viewport'\n | 'audio-script'\n | 'phonetic-script'\n | 'caption';\n\nexport type KnownSequenceEntityKind = 'video' | 'audio' | 'voice' | 'image' | 'caption' | 'axvideo';\ndeclare const extensionEntityKindBrand: unique symbol;\nexport type ExtensionEntityKind = string & { readonly [extensionEntityKindBrand]: 'ExtensionEntityKind' };\n\n/** Extensions require explicit branding so removed or reserved domain kinds cannot reappear accidentally. */\nexport type EntityKind = KnownEntityKind | ExtensionEntityKind;\n\nexport type EntityLifecycle = Readonly<Record<string, unknown>>;\n\n/** One independently identified Medeo domain object. Peer associations belong in Relation rows. */\nexport interface MedeoEntity<K extends EntityKind = EntityKind> {\n readonly entityId: EntityId;\n readonly entityKind: K;\n /** Direct variant composition; ordinary associations remain Relation rows. */\n readonly baseEntityIds?: readonly EntityId[];\n readonly lifecycle?: EntityLifecycle;\n}\n\nexport type SequenceExtent<Point> =\n | { readonly kind: 'bounded'; readonly start: Point; readonly end: Point }\n | { readonly kind: 'unbounded'; readonly start: Point };\n\nexport type SequenceSampling = 'native' | 'constant' | 'derived';\n\n/**\n * Shared value shape for an entity's own ordered content domain.\n *\n * This is shared structural vocabulary, not a separately identified object.\n * Video and the other sequence entities own these fields directly.\n */\nexport interface SequenceFields<Point = unknown, CoordinateSpace = unknown> {\n readonly extent: SequenceExtent<Point>;\n readonly sampling: SequenceSampling;\n readonly coordinateSpace: CoordinateSpace;\n}\n\nexport interface SequenceRange<Point = unknown> {\n readonly start: Point;\n readonly end: Point;\n}\n\nexport type SequenceDuration<Span = unknown> =\n | { readonly mode: 'from-source' }\n | { readonly mode: 'fixed'; readonly value: Span };\n\nexport interface ScriptTextSegment {\n readonly segmentId: string;\n readonly text: string;\n readonly language?: string;\n}\n\n/**\n * One directly assigned time value for an AudioScript segment, stored on an\n * annotation Sequence Marker (`audio-script-marker` Relation). `segmentId`\n * quotes the script's own stable segment identity — a local id, never a peer\n * Entity reference. Marker values are assigned by the generation process; they\n * do not reference an upstream Sequence or another Marker.\n */\nexport interface ScriptSegmentRange {\n readonly segmentId: string;\n readonly startMs: number;\n readonly endMs: number;\n}\n\nexport interface ScriptTextFields<Segment extends ScriptTextSegment = ScriptTextSegment> {\n readonly segments: readonly Segment[];\n}\n\nexport interface ExternalAssetLocator {\n readonly system: 'memota' | 'memota-speech';\n readonly key: string;\n}\n\nexport interface VoiceDescriptor {\n readonly system: 'voice-library';\n readonly key: string;\n readonly name?: string;\n}\n\nexport interface CaptionFontDescriptor {\n readonly system: 'font-library';\n readonly key: string;\n}\n\nexport interface CaptionStyleFields {\n readonly font?: CaptionFontDescriptor;\n readonly fontSize?: number;\n readonly fontColor?: string;\n readonly fontWeight?: number;\n readonly entranceAnimation?: string;\n readonly entranceAnimationDurationMs?: number;\n readonly strokeColor?: string;\n readonly strokeWidth?: number;\n readonly positionX?: number;\n readonly positionY?: number;\n}\n\nexport type EmptyFields = Readonly<Record<never, never>>;\n\nexport type Timeline = MedeoEntity<'timeline'>;\n\nexport type Track = MedeoEntity<'track'> & {\n readonly hidden?: boolean;\n /** The vocabulary remains deliberately open in Review v8. */\n readonly role?: string;\n /** Stable stacking order among sibling Tracks. */\n readonly order?: number;\n};\n\nexport type Clip = MedeoEntity<'clip'> & {\n /** Stable flow order for a sequential Clip. */\n readonly order?: number;\n /** Playback gain in decibels. */\n readonly volume?: number;\n};\nexport type Asset = MedeoEntity<'asset'> & {\n readonly external?: ExternalAssetLocator;\n readonly storageKey?: string;\n};\n/**\n * Physical resource fields owned directly by a media variant entity.\n *\n * MEngine decision: media variants are logical facets of their Asset and share\n * one entity identity — a media variant carries its physical locator itself\n * and `external` is required. AudioScript owns editable segmented text;\n * Caption may independently associate with a physical text artifact Asset.\n */\nexport interface MediaAssetFields {\n readonly external: ExternalAssetLocator;\n readonly storageKey?: string;\n}\n\nexport type MediaAssetVariantKind = 'video' | 'image' | 'audio' | 'voice';\n\nexport type Viewport = MedeoEntity<'viewport'>;\n\nexport type Video<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'video'> &\n SequenceFields<Point, CoordinateSpace> &\n MediaAssetFields & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'bounded' }>;\n readonly sampling: 'native';\n };\n\nexport type Audio<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'audio'> &\n SequenceFields<Point, CoordinateSpace> &\n MediaAssetFields & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'bounded' }>;\n readonly sampling: 'native';\n };\n\nexport type Voice<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'voice'> &\n SequenceFields<Point, CoordinateSpace> &\n MediaAssetFields & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'bounded' }>;\n readonly sampling: 'native';\n readonly voice?: VoiceDescriptor;\n };\n\nexport type Image<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'image'> &\n SequenceFields<Point, CoordinateSpace> &\n MediaAssetFields & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'unbounded' }>;\n readonly sampling: 'constant';\n };\n\n/** One entity that is both the Asset and its media variant (shared identity). */\nexport type MediaAssetVariant<Point = unknown, CoordinateSpace = unknown> =\n | Video<Point, CoordinateSpace>\n | Image<Point, CoordinateSpace>\n | Audio<Point, CoordinateSpace>\n | Voice<Point, CoordinateSpace>;\n\n/**\n * Half-open `[start, end)` position window inside one Segment's text, counted\n * in Unicode code points (not UTF-16 code units), so a boundary never splits a\n * surrogate pair. Positions are non-negative safe integers with `start < end`;\n * `end` must not exceed the Segment's code-point length.\n */\nexport interface CaptionTextRange extends JsonObject {\n readonly start: number;\n readonly end: number;\n}\n\n/**\n * The Caption's single text selection. `segmentId` quotes the\n * composed AudioScript's own stable segment identity — a local id quoted by the\n * variant, never a peer Entity reference. Text itself is never copied here;\n * complete Caption content is assembled through its direct baseEntityIds.\n * The optional `textRange` narrows one Segment to an intra-Segment sub-span\n * (intra-segment re-segmentation); without it the whole Segment text is selected.\n */\nexport type CaptionSegmentSelection = JsonObject & {\n readonly segmentId: string;\n readonly textRange?: CaptionTextRange;\n};\n\n/** A selected view of one complete AudioScript; multiple captions may share that text owner. */\nexport type Caption<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'caption'> &\n SequenceFields<Point, CoordinateSpace> & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'bounded' }>;\n readonly sampling: 'native';\n readonly baseEntityIds: readonly EntityId[];\n /** Optional immutable source artifact; resolved by host assembly, not a DSL Asset entity. */\n readonly external?: ExternalAssetLocator;\n /** Exactly one segment, optionally narrowed to one contiguous code-point range. */\n readonly selection: CaptionSegmentSelection;\n /** Intrinsic caption timing, independent of a placed Clip display Marker. */\n readonly segmentRanges?: readonly ScriptSegmentRange[];\n readonly style?: CaptionStyleFields;\n };\n\nexport type AXVideo<Point = unknown, CoordinateSpace = unknown> = MedeoEntity<'axvideo'> &\n SequenceFields<Point, CoordinateSpace> & {\n readonly extent: Extract<SequenceFields<Point, CoordinateSpace>['extent'], { kind: 'bounded' }>;\n readonly sampling: 'derived';\n };\n\nexport type AudioScript<Segment extends ScriptTextSegment = ScriptTextSegment> = MedeoEntity<'audio-script'> &\n ScriptTextFields<Segment>;\n\n/**\n * Pronunciation variant of an AudioScript. Its own row stores phoneme and\n * prosody expression only; the base text stays owned by the composed\n * AudioScript and is assembled through direct baseEntityIds.\n * Per-segment phonetic granularity remains an open wire question.\n */\nexport type PhoneticScript = MedeoEntity<'phonetic-script'> & {\n readonly baseEntityIds: readonly EntityId[];\n /** Whole-script phoneme control expression in the target TTS vocabulary. */\n readonly phonemeScript?: string;\n /** Prosody expression; structure stays open until the TTS contract freezes. */\n readonly prosody?: JsonObject;\n};\n\nexport type SequenceMarker<\n SourcePoint = unknown,\n TargetPoint = SourcePoint,\n Span = unknown,\n Remapping = unknown,\n> = MedeoEntity<'sequence-marker'> & {\n readonly sourceRange: SequenceRange<SourcePoint>;\n readonly targetRange?: SequenceRange<TargetPoint>;\n readonly duration: SequenceDuration<Span>;\n readonly timeRemapping?: Remapping;\n /** Offset from the host Clip selected by an ordered clip-anchor Relation. */\n readonly anchorOffset?: Span;\n /** Dynamic playback behavior. The source duration remains authoritative. */\n readonly durationPolicy?: 'timeline';\n /**\n * Directly assigned per-Segment time values for an AudioScript annotation\n * Marker (`audio-script-marker` Relation). Present only in that scenario;\n * annotation Markers cannot enter Clip/AXVideo use chains, and annotating a\n * script never grants it Sequence or Clip admission.\n */\n readonly segmentRanges?: readonly ScriptSegmentRange[];\n};\n\n/** Capability constraint, intentionally open to future entity kinds. */\nexport type SequenceEntity<\n K extends KnownSequenceEntityKind | ExtensionEntityKind = KnownSequenceEntityKind | ExtensionEntityKind,\n> = MedeoEntity<K> & SequenceFields;\n\nexport function createExtensionEntityKind(value: string): ExtensionEntityKind {\n if (value.length === 0 || value.trim() !== value) {\n throw new Error('ExtensionEntityKind must be a non-empty trimmed string');\n }\n if (isKnownEntityKind(value) || isReservedEntityKind(value)) {\n throw new Error(`Entity kind \"${value}\" is known or reserved and cannot be registered as an extension`);\n }\n return value as ExtensionEntityKind;\n}\n\nexport function hasSequence(entity: MedeoEntity): entity is SequenceEntity {\n if (isKnownNonSequenceKind(entity.entityKind) || isReservedEntityKind(entity.entityKind)) return false;\n return isSequenceFields(entity);\n}\n\nexport function isSequenceFields(value: unknown): value is SequenceFields {\n if (!isRecord(value)) return false;\n const extent = value.extent;\n if (!isRecord(extent) || !('start' in extent) || extent.start === undefined) return false;\n if (extent.kind === 'bounded' && (!('end' in extent) || extent.end === undefined)) return false;\n if (extent.kind === 'unbounded' && 'end' in extent) return false;\n if (extent.kind !== 'bounded' && extent.kind !== 'unbounded') return false;\n if (value.sampling !== 'native' && value.sampling !== 'constant' && value.sampling !== 'derived') return false;\n return 'coordinateSpace' in value && value.coordinateSpace !== undefined;\n}\n\nexport function isKnownSequenceKind(kind: string): kind is KnownSequenceEntityKind {\n return isMediaAssetVariantKind(kind) || kind === 'caption' || kind === 'axvideo';\n}\n\nexport function isMediaAssetVariantKind(kind: string): kind is MediaAssetVariantKind {\n return kind === 'video' || kind === 'image' || kind === 'audio' || kind === 'voice';\n}\n\nexport function isMediaAssetVariant(entity: MedeoEntity): entity is MediaAssetVariant {\n return isMediaAssetVariantKind(entity.entityKind);\n}\n\nexport function isKnownEntityKind(kind: string): kind is KnownEntityKind {\n return isKnownSequenceKind(kind) || isKnownNonSequenceKind(kind);\n}\n\nexport function isReservedEntityKind(kind: string): boolean {\n const normalized = kind.toLowerCase().replaceAll('-', '').replaceAll('_', '');\n return normalized === 'speech' || normalized === 'videodocument';\n}\n\nexport function isKnownNonSequenceKind(kind: string): boolean {\n return (\n kind === 'timeline' ||\n kind === 'track' ||\n kind === 'clip' ||\n kind === 'asset' ||\n kind === 'sequence-marker' ||\n kind === 'viewport' ||\n kind === 'audio-script' ||\n kind === 'phonetic-script'\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n","declare const entityIdBrand: unique symbol;\ndeclare const relationIdBrand: unique symbol;\n\nexport type EntityId = string & { readonly [entityIdBrand]: 'EntityId' };\nexport type RelationId = string & { readonly [relationIdBrand]: 'RelationId' };\n\nexport function createEntityId(value: string): EntityId {\n return createId(value, 'EntityId') as EntityId;\n}\n\nexport function createRelationId(value: string): RelationId {\n return createId(value, 'RelationId') as RelationId;\n}\n\nfunction createId(value: string, label: string): string {\n if (value.length === 0 || value.trim() !== value) throw new Error(`${label} must be a non-empty trimmed string`);\n return value;\n}\n","export type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | readonly JsonValue[];\nexport type JsonObject = { readonly [key: string]: JsonValue };\n\nconst nativeObjectConstructorSource = Function.prototype.toString.call(Object);\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && isJsonValue(value, new Set());\n}\n\nfunction isJsonValue(value: unknown, ancestors: Set<object>): value is JsonValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object') return false;\n\n if (!Array.isArray(value) && !isPlainObject(value)) return false;\n if (ancestors.has(value)) return false;\n\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, ancestors))\n : Object.values(value).every((item) => isJsonValue(item, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\n/** Recognize an ordinary object from any VM realm without admitting class instances. */\nfunction isPlainObject(value: object): boolean {\n try {\n const prototype = Object.getPrototypeOf(value);\n if (prototype === null) return true;\n if (Object.getPrototypeOf(prototype) !== null) return false;\n const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;\n return (\n typeof constructor === 'function' &&\n constructor.prototype === prototype &&\n Function.prototype.toString.call(constructor) === nativeObjectConstructorSource\n );\n } catch {\n return false;\n }\n}\n","import type { CaptionSegmentSelection, ScriptTextSegment } from './entities.ts';\nimport { createEntityId, type EntityId } from './ids.ts';\nimport { isJsonObject, type JsonObject } from './json-values.ts';\nimport type { EntityRelationRows, EntityRow } from './rows.ts';\n\nexport type ScriptCompositionIssueCode =\n | 'field_conflict'\n | 'composition_cycle'\n | 'invalid_bases'\n | 'composition_missing'\n | 'composition_ambiguous'\n | 'composition_dangling'\n | 'unknown_segment'\n | 'empty_selection'\n | 'invalid_script'\n | 'invalid_selection';\n\n/** Assembly fails explicitly when declared bases cannot provide valid, unambiguous content. */\nexport class ScriptCompositionError extends Error {\n constructor(\n readonly code: ScriptCompositionIssueCode,\n readonly entityId: EntityId,\n message: string,\n ) {\n super(message);\n this.name = 'ScriptCompositionError';\n }\n}\n\nexport interface AssembledCaptionContent {\n readonly caption: EntityRow<'caption'>;\n readonly audioScript: EntityRow<'audio-script'>;\n /** Selected AudioScript segments in Caption selection order. */\n readonly segments: readonly ScriptTextSegment[];\n /** Complete display text: the selected segments' text joined in order. */\n readonly text: string;\n}\n\nexport interface AssembledPhoneticScriptContent {\n readonly phoneticScript: EntityRow<'phonetic-script'>;\n readonly audioScript: EntityRow<'audio-script'>;\n /** All AudioScript segments in script order; the pronunciation variant never reorders text. */\n readonly segments: readonly ScriptTextSegment[];\n /** Complete base text owned by the AudioScript. */\n readonly text: string;\n}\n\n/** Direct base IDs are structural fields, never ordinary Relation endpoints. */\nexport function variantBaseEntityIds(entity: EntityRow): readonly EntityId[] {\n if (!Object.hasOwn(entity.payload, 'baseEntityIds')) return [];\n const ids = entity.payload.baseEntityIds;\n if (\n !Array.isArray(ids) ||\n ids.length === 0 ||\n !ids.every((id) => typeof id === 'string' && id.trim() === id && id.length > 0) ||\n new Set(ids).size !== ids.length\n )\n throw new ScriptCompositionError(\n 'invalid_bases',\n entity.entityId,\n `Entity \"${entity.entityId}\" requires non-empty, unique baseEntityIds`,\n );\n return (ids as string[]).map(createEntityId);\n}\n\n/** Validate all base providers before applying explicit own fields; ordering cannot resolve ambiguity. */\nexport function assembleEntityContent(rows: EntityRelationRows, entityId: EntityId): EntityRow {\n const byId = new Map<EntityId, EntityRow>();\n for (const row of rows.entities) {\n if (byId.has(row.entityId))\n throw new ScriptCompositionError('composition_ambiguous', row.entityId, `duplicate entity id \"${row.entityId}\"`);\n byId.set(row.entityId, row);\n }\n const active = new Set<EntityId>();\n const cache = new Map<EntityId, EntityRow>();\n const visit = (id: EntityId): EntityRow => {\n const cached = cache.get(id);\n if (cached !== undefined) return cached;\n if (active.has(id)) throw new ScriptCompositionError('composition_cycle', id, `Cyclic baseEntityIds at \"${id}\"`);\n const row = byId.get(id);\n if (row === undefined)\n throw new ScriptCompositionError('composition_dangling', id, `Missing base entity \"${id}\" in this document`);\n if (\n !isJsonObject(row.payload) ||\n Object.hasOwn(row.payload, 'entityId') ||\n Object.hasOwn(row.payload, 'entityKind')\n )\n throw new ScriptCompositionError(\n 'invalid_bases',\n id,\n `Entity \"${id}\" requires JSON own fields without reserved identity fields`,\n );\n active.add(id);\n const inherited: JsonObject = {};\n const providers = new Map<string, EntityId>();\n for (const baseId of variantBaseEntityIds(row)) {\n const base = visit(baseId);\n for (const [field, value] of Object.entries(base.payload)) {\n if (field === 'baseEntityIds') continue;\n const previous = providers.get(field);\n if (previous !== undefined)\n throw new ScriptCompositionError(\n 'field_conflict',\n id,\n `Entity \"${id}\" field \"${field}\" conflicts between bases \"${previous}\" and \"${baseId}\"; own fields cannot resolve base ambiguity`,\n );\n providers.set(field, baseId);\n Object.defineProperty(inherited, field, { value, enumerable: true, configurable: true, writable: true });\n }\n }\n const assembled: EntityRow = {\n ...row,\n payload: JSON.parse(JSON.stringify({ ...inherited, ...row.payload })) as JsonObject,\n };\n active.delete(id);\n cache.set(id, assembled);\n return assembled;\n };\n return visit(entityId);\n}\n\n/** Resolve a field's declaring entity after validating the entire composition. */\nexport function resolveEntityFieldOwner(rows: EntityRelationRows, entityId: EntityId, field: string): EntityId {\n assembleEntityContent(rows, entityId);\n const byId = new Map(rows.entities.map((row) => [row.entityId, row]));\n const find = (id: EntityId): EntityId | undefined => {\n const row = byId.get(id)!;\n if (Object.hasOwn(row.payload, field)) return id;\n if (field === 'baseEntityIds') return undefined;\n for (const baseId of variantBaseEntityIds(row)) {\n const owner = find(baseId);\n if (owner !== undefined) return owner;\n }\n return undefined;\n };\n return find(entityId) ?? entityId;\n}\n\n/** Patch assembled fields without copying inherited fields into the variant's stored payload. */\nexport function updateEntityFields(\n rows: EntityRelationRows,\n entityId: EntityId,\n fields: JsonObject,\n): readonly EntityRow[] {\n assembleEntityContent(rows, entityId);\n if (!isJsonObject(fields) || Object.hasOwn(fields, 'entityId') || Object.hasOwn(fields, 'entityKind'))\n throw new ScriptCompositionError(\n 'invalid_bases',\n entityId,\n 'Field updates require JSON without reserved identity fields',\n );\n const updates = new Map<EntityId, EntityRow>();\n for (const [field, value] of Object.entries(fields)) {\n const ownerId = resolveEntityFieldOwner(rows, entityId, field);\n const owner = updates.get(ownerId) ?? rows.entities.find((row) => row.entityId === ownerId)!;\n updates.set(ownerId, { ...owner, payload: { ...owner.payload, [field]: value } });\n }\n return [...updates.values()].map((row) => JSON.parse(JSON.stringify(row)) as EntityRow);\n}\n\n/** Find the actual AudioScript text owner through direct variant bases. */\nexport function findComposedAudioScript(\n rows: EntityRelationRows,\n variantEntityId: EntityId,\n variantKind: 'caption' | 'phonetic-script',\n): EntityRow<'audio-script'> {\n const variant = requireEntityKind(rows, variantEntityId, variantKind);\n assembleEntityContent(rows, variantEntityId);\n const sources = new Map<EntityId, EntityRow<'audio-script'>>();\n const seen = new Set<EntityId>();\n const visit = (row: EntityRow): void => {\n for (const id of variantBaseEntityIds(row)) {\n if (seen.has(id)) continue;\n seen.add(id);\n const base = rows.entities.find((candidate) => candidate.entityId === id)!;\n if (base.entityKind === 'audio-script')\n sources.set(id, assembleEntityContent(rows, id) as EntityRow<'audio-script'>);\n else visit(base);\n }\n };\n visit(variant);\n if (sources.size !== 1)\n throw new ScriptCompositionError(\n sources.size === 0 ? 'composition_missing' : 'composition_ambiguous',\n variantEntityId,\n `${variantKind} \"${variantEntityId}\" baseEntityIds must resolve one AudioScript text owner, got ${sources.size}`,\n );\n return [...sources.values()][0]!;\n}\n\n/** Join the whole AudioScript text in segment order. */\nexport function assembleScriptText(script: EntityRow<'audio-script'>): string {\n return scriptSegments(script)\n .map((segment) => segment.text)\n .join('');\n}\n\nfunction scriptSegments(script: EntityRow<'audio-script'>): readonly ScriptTextSegment[] {\n const segments = script.payload.segments;\n if (!Array.isArray(segments)) {\n throw new ScriptCompositionError(\n 'composition_dangling',\n script.entityId,\n `AudioScript \"${script.entityId}\" requires segments`,\n );\n }\n if (!segments.every(isScriptSegment) || new Set(segments.map((s) => s.segmentId)).size !== segments.length) {\n throw new ScriptCompositionError(\n 'invalid_script',\n script.entityId,\n 'AudioScript requires valid segments with unique local segmentId and text',\n );\n }\n return segments;\n}\n\nfunction isScriptSegment(value: unknown): value is ScriptTextSegment {\n if (typeof value !== 'object' || value == null || Array.isArray(value)) return false;\n const segment = value as Record<string, unknown>;\n return (\n typeof segment.segmentId === 'string' &&\n segment.segmentId.trim() !== '' &&\n typeof segment.text === 'string' &&\n (segment.language === undefined || typeof segment.language === 'string')\n );\n}\n\n/** Assemble selected text after base-field validation and explicit variant overrides. */\nexport function assembleCaptionContent(rows: EntityRelationRows, captionEntityId: EntityId): AssembledCaptionContent {\n requireEntityKind(rows, captionEntityId, 'caption');\n const caption = assembleEntityContent(rows, captionEntityId) as EntityRow<'caption'>;\n const script = findComposedAudioScript(rows, captionEntityId, 'caption');\n const segment = selectAudioScriptSegment({ ...script, payload: caption.payload }, captionSelection(caption));\n return {\n caption,\n audioScript: script,\n segments: [segment],\n text: segment.text,\n };\n}\n\n/**\n * Assemble the complete Phonetic Script content for TTS: the composed\n * AudioScript's base text plus the variant's own phoneme and prosody fields.\n */\nexport function assemblePhoneticScriptContent(\n rows: EntityRelationRows,\n phoneticScriptEntityId: EntityId,\n): AssembledPhoneticScriptContent {\n requireEntityKind(rows, phoneticScriptEntityId, 'phonetic-script');\n const phoneticScript = assembleEntityContent(rows, phoneticScriptEntityId) as EntityRow<'phonetic-script'>;\n const audioScript = findComposedAudioScript(rows, phoneticScriptEntityId, 'phonetic-script');\n const segments = scriptSegments({ ...audioScript, payload: phoneticScript.payload });\n return {\n phoneticScript,\n audioScript,\n segments,\n text: segments.map((segment) => segment.text).join(''),\n };\n}\n\nfunction captionSelection(caption: EntityRow<'caption'>): CaptionSegmentSelection {\n if (Object.hasOwn(caption.payload, 'selections') || !isSegmentSelection(caption.payload.selection))\n throw new ScriptCompositionError(\n 'invalid_selection',\n caption.entityId,\n 'Caption requires one selection object with segmentId and optional textRange; selections arrays are forbidden',\n );\n return caption.payload.selection;\n}\n\nfunction isSegmentSelection(value: unknown): value is CaptionSegmentSelection {\n return (\n typeof value === 'object' &&\n value != null &&\n !Array.isArray(value) &&\n typeof (value as CaptionSegmentSelection).segmentId === 'string' &&\n (value as CaptionSegmentSelection).segmentId.trim() !== '' &&\n Object.keys(value).every((key) => key === 'segmentId' || key === 'textRange')\n );\n}\n\n/** Select source text without creating another authoritative text field. */\nexport function selectAudioScriptSegment(\n script: EntityRow<'audio-script'>,\n selection: CaptionSegmentSelection,\n): ScriptTextSegment {\n if (!isSegmentSelection(selection))\n throw new ScriptCompositionError(\n 'invalid_selection',\n script.entityId,\n 'Caption requires one selection object with segmentId and optional textRange',\n );\n const bySegmentId = new Map(scriptSegments(script).map((segment) => [segment.segmentId, segment]));\n const selected = (() => {\n const segment = bySegmentId.get(selection.segmentId);\n if (segment === undefined) {\n throw new ScriptCompositionError(\n 'unknown_segment',\n script.entityId,\n `Caption selection \"${selection.segmentId}\" does not name a segment of AudioScript \"${script.entityId}\"`,\n );\n }\n if (selection.textRange === undefined) return segment;\n const range = selection.textRange;\n const points = Array.from(segment.text);\n if (\n typeof range !== 'object' ||\n range === null ||\n !Number.isSafeInteger(range.start) ||\n !Number.isSafeInteger(range.end) ||\n range.start < 0 ||\n range.end <= range.start ||\n range.end > points.length ||\n Object.keys(range).some((key) => key !== 'start' && key !== 'end')\n ) {\n throw new ScriptCompositionError(\n 'invalid_selection',\n script.entityId,\n 'Caption textRange must be a non-empty half-open Unicode code-point range within its source segment',\n );\n }\n return { ...segment, text: points.slice(range.start, range.end).join('') };\n })();\n if (!selected.text.trim())\n throw new ScriptCompositionError(\n 'empty_selection',\n script.entityId,\n 'Caption selection must contain visible source text',\n );\n return selected;\n}\n\nfunction requireEntityKind<K extends EntityRow['entityKind']>(\n rows: EntityRelationRows,\n entityIdValue: string,\n entityKind: K,\n): EntityRow<K> {\n const entity = rows.entities.find((candidate) => candidate.entityId === entityIdValue);\n if (entity === undefined) {\n throw new ScriptCompositionError(\n 'composition_dangling',\n entityIdValue as EntityId,\n `Entity \"${entityIdValue}\" does not exist`,\n );\n }\n if (entity.entityKind !== entityKind) {\n throw new ScriptCompositionError(\n 'composition_dangling',\n entityIdValue as EntityId,\n `Entity \"${entityIdValue}\" must have kind \"${entityKind}\", got \"${entity.entityKind}\"`,\n );\n }\n return entity as EntityRow<K>;\n}\n","import type { EntityKind, MedeoEntity } from './entities.ts';\nimport type { EntityId } from './ids.ts';\nimport { isJsonObject, type JsonObject } from './json-values.ts';\nimport type { RelationRow } from './relations.ts';\n\n/** One persisted first-class entity. Its owned fields live directly in payload. */\nexport interface EntityRow<K extends EntityKind = EntityKind> {\n readonly entityId: EntityId;\n readonly entityKind: K;\n readonly payload: JsonObject;\n}\n\n/** Complete persistence value for an entity set and its authoritative relations. */\nexport interface EntityRelationRows {\n readonly entities: readonly EntityRow[];\n readonly relations: readonly RelationRow[];\n}\n\nexport function entityToRow<K extends EntityKind>(entity: MedeoEntity<K>): EntityRow<K> {\n const { entityId, entityKind, ...payload } = entity;\n if (!isJsonObject(payload)) {\n throw new Error(`Entity \"${entityId}\" payload must contain only JSON values`);\n }\n return { entityId, entityKind, payload };\n}\n","import { assembleEntityContent, assembleCaptionContent, assemblePhoneticScriptContent } from './composition.ts';\nimport {\n hasSequence,\n isMediaAssetVariantKind,\n isReservedEntityKind,\n type AXVideo,\n type AudioScript,\n type Caption,\n type Clip,\n type MedeoEntity,\n type PhoneticScript,\n type SequenceMarker,\n} from './entities.ts';\nimport type { EntityId } from './ids.ts';\nimport type { BiRelationIndex } from './relation-index.ts';\nimport type { EntityRef, RelationAny } from './relations.ts';\nimport { entityToRow } from './rows.ts';\n\nexport type EntityRelationIssueCode =\n | 'invalid_variant_composition'\n | 'invalid_sequence_composition'\n | 'marker_container_xor'\n | 'marker_content_xor'\n | 'marker_pair_mismatch'\n | 'marker_source_range_empty'\n | 'marker_target_range_empty'\n | 'marker_source_out_of_bounds'\n | 'clip_marker_cardinality'\n | 'clip_content_cardinality'\n | 'clip_content_not_sequence'\n | 'axvideo_marker_cardinality'\n | 'caption_composition_required'\n | 'phonetic_script_composition_required'\n | 'caption_selection_invalid'\n | 'media_physical_asset_forbidden'\n | 'clip_anchor_cardinality'\n | 'clip_anchor_cycle'\n | 'clip_placement_invalid'\n | 'timeline_duration_policy_invalid'\n | 'forbidden_entity_kind'\n | 'invalid_entity_payload'\n | 'peer_entity_id_field'\n | 'duplicate_entity_id';\n\nexport interface EntityRelationIssue {\n readonly code: EntityRelationIssueCode;\n readonly entityId: EntityId;\n readonly message: string;\n}\n\nexport interface MarkerRangeComparators<SourcePoint = unknown, TargetPoint = unknown> {\n readonly source: (left: SourcePoint, right: SourcePoint) => number;\n readonly target: (left: TargetPoint, right: TargetPoint) => number;\n}\n\nexport interface EntityRelationValidationOptions {\n readonly compareMarkerPoints: (\n marker: EntityRef<SequenceMarker>,\n range: 'source' | 'target',\n left: unknown,\n right: unknown,\n ) => number;\n}\n\n/**\n * Media variants own their Asset identity directly: a `physical-asset`\n * Relation may not bind them. Caption may associate with a physical text Asset\n * independently of its AudioScript composition.\n */\nfunction validateMediaAssetIdentity(entity: EntityRef, index: BiRelationIndex): EntityRelationIssue[] {\n return [...index.relationsOf(entity)]\n .filter((relation) => relation.kind === 'physical-asset')\n .map(() => ({\n code: 'media_physical_asset_forbidden' as const,\n entityId: entity.entityId,\n message: `Media entity \"${entity.entityId}\" owns its Asset identity; remove its physical-asset Relation`,\n }));\n}\n\n/** Validates one complete set of entities and its authoritative Relation rows. */\nexport function validateEntityRelationSet(\n entityRefs: readonly EntityRef[],\n index: BiRelationIndex,\n options: EntityRelationValidationOptions,\n): EntityRelationIssue[] {\n const { entities, issues } = collectRelatedEntities(entityRefs, index);\n const entityIds = new Set(entities.map((entity) => entity.entityId));\n const rows = { entities: entities.map((entity) => entityToRow(entity.current())), relations: [] };\n for (const entity of entities) {\n try {\n assembleEntityContent(rows, entity.entityId);\n } catch (error) {\n issues.push({\n code: 'invalid_variant_composition',\n entityId: entity.entityId,\n message: error instanceof Error ? error.message : 'Invalid variant composition',\n });\n }\n }\n for (const entity of entities) {\n const current = entity.current();\n const entityIssues = validateEntity(entity, entityIds);\n issues.push(...entityIssues);\n if (isMediaAssetVariantKind(current.entityKind)) {\n issues.push(...validateMediaAssetIdentity(entity, index));\n }\n if (entityIssues.some((issue) => issue.code === 'invalid_entity_payload')) continue;\n if (current.entityKind === 'sequence-marker') {\n const marker = entity as EntityRef<SequenceMarker>;\n issues.push(...validateMarkerUse(entity as EntityRef<SequenceMarker>, index));\n issues.push(\n ...validateMarkerRanges(marker, {\n source: (left, right) => options.compareMarkerPoints(marker, 'source', left, right),\n target: (left, right) => options.compareMarkerPoints(marker, 'target', left, right),\n }),\n );\n issues.push(\n ...validateMarkerSourceBounds(marker, index, (left, right) =>\n options.compareMarkerPoints(marker, 'source', left, right),\n ),\n );\n }\n if (current.entityKind === 'clip') {\n issues.push(...validateClipAdmission(entity as EntityRef<Clip>, index));\n issues.push(...validateClipPlacement(entity as EntityRef<Clip>, index));\n }\n if (current.entityKind === 'axvideo') issues.push(...validateAXVideoAdmission(entity as EntityRef<AXVideo>, index));\n if (current.entityKind === 'caption')\n issues.push(...validateCaptionComposition(entity as EntityRef<Caption>, index, entities));\n if (current.entityKind === 'phonetic-script')\n issues.push(...validatePhoneticComposition(entity as EntityRef<PhoneticScript>, index, entities));\n issues.push(...validateSequenceComposition(entity));\n }\n issues.push(...validateClipAnchorCycles(entities, index));\n return issues;\n}\n\nexport function validateMarkerUse(marker: EntityRef<SequenceMarker>, index: BiRelationIndex): EntityRelationIssue[] {\n const relations = [...index.relationsOf(marker)];\n const clipEdges = ofKind(relations, 'clip-marker');\n const axVideoEdges = ofKind(relations, 'axvideo-marker');\n const contentEdges = ofKind(relations, 'marker-content');\n const timelineEdges = ofKind(relations, 'marker-timeline');\n const scriptEdges = ofKind(relations, 'audio-script-marker');\n const issues: EntityRelationIssue[] = [];\n\n if (scriptEdges.length > 0) {\n // AudioScript annotation Markers are a separate scenario: they carry only\n // their directly assigned segmentRanges and never join a container use chain.\n if (clipEdges.length + axVideoEdges.length + contentEdges.length + timelineEdges.length > 0) {\n issues.push({\n code: 'marker_container_xor',\n entityId: marker.entityId,\n message: 'An AudioScript annotation Marker must not carry Clip, AXVideo, content, or Timeline relations',\n });\n }\n const ranges = marker.current().segmentRanges;\n if (!ranges?.length) {\n issues.push({\n code: 'invalid_entity_payload',\n entityId: marker.entityId,\n message: 'An AudioScript annotation Marker requires segmentRanges',\n });\n }\n for (const relation of scriptEdges) {\n const script = relation.other(marker)?.deref()?.current();\n if (script?.entityKind !== 'audio-script') continue;\n const segments = (script as AudioScript).segments;\n if (!Array.isArray(segments)) continue;\n const segmentIds = new Set(segments.map((segment) => segment.segmentId));\n if (ranges?.some((range) => !segmentIds.has(range.segmentId))) {\n issues.push({\n code: 'invalid_entity_payload',\n entityId: marker.entityId,\n message: 'Annotation segmentRanges must name segments of the related AudioScript',\n });\n }\n }\n return issues;\n }\n if (marker.current().segmentRanges !== undefined) {\n issues.push({\n code: 'invalid_entity_payload',\n entityId: marker.entityId,\n message: 'segmentRanges belongs to an AudioScript annotation Marker, not a display Marker',\n });\n }\n\n if (clipEdges.length + axVideoEdges.length !== 1) {\n issues.push({\n code: 'marker_container_xor',\n entityId: marker.entityId,\n message: 'Sequence Marker must have exactly one Clip XOR AXVideo container relation',\n });\n }\n if (contentEdges.length + timelineEdges.length !== 1) {\n issues.push({\n code: 'marker_content_xor',\n entityId: marker.entityId,\n message: 'Sequence Marker must have exactly one Sequence content XOR Timeline relation',\n });\n }\n if (\n (clipEdges.length === 1 && timelineEdges.length === 1) ||\n (axVideoEdges.length === 1 && contentEdges.length === 1)\n ) {\n issues.push({\n code: 'marker_pair_mismatch',\n entityId: marker.entityId,\n message: 'Only Clip+Content or AXVideo+Timeline Marker relation pairs are valid',\n });\n }\n return issues;\n}\n\nexport function validateClipAdmission(clip: EntityRef<Clip>, index: BiRelationIndex): EntityRelationIssue[] {\n const markerEdges = ofKind([...index.relationsOf(clip)], 'clip-marker');\n if (markerEdges.length !== 1) {\n return [\n {\n code: 'clip_marker_cardinality',\n entityId: clip.entityId,\n message: 'Clip must have exactly one authoritative Clip-Marker Relation',\n },\n ];\n }\n\n const marker = markerEdges[0]?.other(clip)?.deref();\n if (marker == null) {\n return [\n {\n code: 'clip_content_cardinality',\n entityId: clip.entityId,\n message: 'Clip must resolve one live Sequence Marker and one content Relation',\n },\n ];\n }\n const contentEdges = ofKind([...index.relationsOf(marker)], 'marker-content');\n if (contentEdges.length !== 1) {\n return [\n {\n code: 'clip_content_cardinality',\n entityId: clip.entityId,\n message: 'Clip Marker must resolve exactly one content Relation',\n },\n ];\n }\n const content = contentEdges[0]?.other(marker)?.deref()?.current();\n if (content == null) {\n return [\n {\n code: 'clip_content_cardinality',\n entityId: clip.entityId,\n message: 'Clip Marker content Relation must resolve one live entity',\n },\n ];\n }\n if (!hasSequence(content)) {\n return [\n {\n code: 'clip_content_not_sequence',\n entityId: clip.entityId,\n message: `Clip Marker resolves to non-Sequence entity \"${content.entityId}\"`,\n },\n ];\n }\n return [];\n}\n\nexport function validateAXVideoAdmission(axVideo: EntityRef<AXVideo>, index: BiRelationIndex): EntityRelationIssue[] {\n const markerEdges = ofKind([...index.relationsOf(axVideo)], 'axvideo-marker');\n if (markerEdges.length === 1 && markerEdges[0]?.other(axVideo)?.deref() != null) return [];\n return [\n {\n code: 'axvideo_marker_cardinality',\n entityId: axVideo.entityId,\n message: 'AXVideo must have exactly one live AXVideo-Marker Relation',\n },\n ];\n}\n\n/** Validate a Caption against the complete entity set, including its directly held bases. */\nexport function validateCaptionComposition(\n caption: EntityRef<Caption>,\n index: BiRelationIndex,\n entities: readonly EntityRef[] = [],\n): EntityRelationIssue[] {\n return validateVariantComposition(caption, index, entities, 'caption');\n}\n\nexport function validatePhoneticComposition(\n phonetic: EntityRef<PhoneticScript>,\n index: BiRelationIndex,\n entities: readonly EntityRef[] = [],\n): EntityRelationIssue[] {\n return validateVariantComposition(phonetic, index, entities, 'phonetic-script');\n}\n\nfunction validateVariantComposition(\n variant: EntityRef,\n index: BiRelationIndex,\n entities: readonly EntityRef[],\n kind: 'caption' | 'phonetic-script',\n): EntityRelationIssue[] {\n const issues: EntityRelationIssue[] = [];\n const refs = collectRelatedEntities([...entities, variant], index).entities;\n const rows = { entities: refs.map((ref) => entityToRow(ref.current())), relations: [] };\n try {\n if (kind === 'caption') assembleCaptionContent(rows, variant.entityId);\n else assemblePhoneticScriptContent(rows, variant.entityId);\n } catch (error) {\n issues.push({\n code: kind === 'caption' ? 'caption_composition_required' : 'phonetic_script_composition_required',\n entityId: variant.entityId,\n message: error instanceof Error ? error.message : 'Invalid variant composition',\n });\n }\n return issues;\n}\n\nexport function validateClipPlacement(clip: EntityRef<Clip>, index: BiRelationIndex): EntityRelationIssue[] {\n const markerEdge = ofKind([...index.relationsOf(clip)], 'clip-marker')[0];\n const marker = markerEdge?.other(clip)?.deref();\n if (marker?.current().entityKind !== 'sequence-marker') return [];\n const markerValue = marker.current() as SequenceMarker;\n const anchors = ofKind([...index.relationsOf(clip)], 'clip-anchor').filter(\n (relation) => relation.endpoints[0].deref() === clip,\n );\n const hasOrder = clip.current().order !== undefined;\n const hasTarget = markerValue.targetRange !== undefined;\n const hasAnchorOffset = markerValue.anchorOffset !== undefined;\n const issues: EntityRelationIssue[] = [];\n if (anchors.length > 1) {\n issues.push({\n code: 'clip_anchor_cardinality',\n entityId: clip.entityId,\n message: 'A Clip may follow at most one host Clip',\n });\n }\n const hasAnchor = anchors.length === 1;\n if (\n (hasAnchor && (!hasAnchorOffset || hasOrder || hasTarget)) ||\n (!hasAnchor && (hasAnchorOffset || Number(hasOrder) + Number(hasTarget) !== 1))\n ) {\n issues.push({\n code: 'clip_placement_invalid',\n entityId: clip.entityId,\n message:\n 'Clip placement must be exactly one of Clip.order, Marker.targetRange, or clip-anchor with Marker.anchorOffset',\n });\n }\n if (markerValue.durationPolicy === 'timeline') {\n const content = ofKind([...index.relationsOf(marker)], 'marker-content')[0]\n ?.other(marker)\n ?.deref()\n ?.current();\n const track = ofKind([...index.relationsOf(clip)], 'track-clip')[0]\n ?.other(clip)\n ?.deref()\n ?.current();\n const trackRole =\n track?.entityKind === 'track' ? (track as unknown as Readonly<Record<string, unknown>>).role : undefined;\n if (content?.entityKind !== 'audio' || trackRole !== 'bgm' || (!hasOrder && !hasTarget)) {\n issues.push({\n code: 'timeline_duration_policy_invalid',\n entityId: marker.entityId,\n message:\n 'Marker durationPolicy \"timeline\" is only valid for ordered or absolutely placed Audio Clips on the bgm Track',\n });\n }\n }\n return issues;\n}\n\nfunction validateClipAnchorCycles(entities: readonly EntityRef[], index: BiRelationIndex): EntityRelationIssue[] {\n const hostByChild = new Map<EntityId, EntityId>();\n for (const entity of entities) {\n if (entity.current().entityKind !== 'clip') continue;\n for (const relation of ofKind([...index.relationsOf(entity)], 'clip-anchor')) {\n if (relation.endpoints[0].deref() !== entity) continue;\n const host = relation.endpoints[1].deref();\n if (host != null) hostByChild.set(entity.entityId, host.entityId);\n }\n }\n const issues: EntityRelationIssue[] = [];\n for (const child of hostByChild.keys()) {\n const seen = new Set<EntityId>();\n let current: EntityId | undefined = child;\n while (current !== undefined && !seen.has(current)) {\n seen.add(current);\n current = hostByChild.get(current);\n }\n if (current === undefined) continue;\n issues.push({\n code: 'clip_anchor_cycle',\n entityId: child,\n message: 'clip-anchor Relations must form an acyclic dependency graph',\n });\n }\n return issues;\n}\n\nexport function validateMarkerRanges<SourcePoint, TargetPoint>(\n marker: EntityRef<SequenceMarker<SourcePoint, TargetPoint>>,\n compare: MarkerRangeComparators<SourcePoint, TargetPoint>,\n): EntityRelationIssue[] {\n const current = marker.current();\n const issues: EntityRelationIssue[] = [];\n if (!(compare.source(current.sourceRange.start, current.sourceRange.end) < 0)) {\n issues.push({\n code: 'marker_source_range_empty',\n entityId: marker.entityId,\n message: 'Sequence Marker sourceRange must be a non-empty half-open interval',\n });\n }\n if (current.targetRange != null && !(compare.target(current.targetRange.start, current.targetRange.end) < 0)) {\n issues.push({\n code: 'marker_target_range_empty',\n entityId: marker.entityId,\n message: 'Sequence Marker targetRange must be a non-empty half-open interval',\n });\n }\n return issues;\n}\n\nexport function validateMarkerSourceBounds(\n marker: EntityRef<SequenceMarker>,\n index: BiRelationIndex,\n compare: (left: unknown, right: unknown) => number,\n): EntityRelationIssue[] {\n const contentEdges = ofKind([...index.relationsOf(marker)], 'marker-content');\n if (contentEdges.length !== 1) return [];\n const content = contentEdges[0]?.other(marker)?.deref()?.current();\n if (content == null || !hasSequence(content)) return [];\n\n const sourceRange = marker.current().sourceRange;\n const startVsExtent = compare(sourceRange.start, content.extent.start);\n const endVsExtent = content.extent.kind === 'bounded' ? compare(sourceRange.end, content.extent.end) : undefined;\n if (\n !Number.isNaN(startVsExtent) &&\n startVsExtent >= 0 &&\n (endVsExtent == null || (!Number.isNaN(endVsExtent) && endVsExtent <= 0))\n ) {\n return [];\n }\n return [\n {\n code: 'marker_source_out_of_bounds',\n entityId: marker.entityId,\n message: `Sequence Marker sourceRange must stay within content \"${content.entityId}\" extent`,\n },\n ];\n}\n\nexport function validateSequenceComposition(entity: EntityRef): EntityRelationIssue[] {\n const current = entity.current();\n const expected = expectedSequenceShape(current.entityKind);\n if (expected == null) return [];\n if (hasSequence(current) && current.extent.kind === expected.extent && current.sampling === expected.sampling) {\n return [];\n }\n return [\n {\n code: 'invalid_sequence_composition',\n entityId: current.entityId,\n message: `${current.entityKind} must compose ${expected.extent} / ${expected.sampling} Sequence semantics`,\n },\n ];\n}\n\nexport function validateEntity(entity: EntityRef, entityIds: ReadonlySet<EntityId> = new Set()): EntityRelationIssue[] {\n const current = entity.current();\n const issues: EntityRelationIssue[] = [];\n if (isReservedEntityKind(current.entityKind)) {\n issues.push({\n code: 'forbidden_entity_kind',\n entityId: current.entityId,\n message: `Entity kind \"${current.entityKind}\" is explicitly outside the Medeo DSL`,\n });\n }\n\n for (const problem of validateKnownEntityPayload(current)) {\n issues.push({\n code: 'invalid_entity_payload',\n entityId: current.entityId,\n message: `Entity \"${current.entityKind}\" ${problem}`,\n });\n }\n\n const peerIdPaths = [\n ...collectPeerEntityIdPaths(current, current.entityKind),\n ...collectPeerEntityValuePaths(current, current.entityKind, current.entityId, entityIds),\n ];\n const uniquePeerIdPaths = [...new Set(peerIdPaths)].sort();\n if (uniquePeerIdPaths.length > 0) {\n issues.push({\n code: 'peer_entity_id_field',\n entityId: current.entityId,\n message: `Entity embeds forbidden peer-ID field/value path(s): ${uniquePeerIdPaths.join(', ')}`,\n });\n }\n\n return issues;\n}\n\nfunction validateKnownEntityPayload(entity: MedeoEntity): readonly string[] {\n const value = entity as unknown as Readonly<Record<string, unknown>>;\n const problems: string[] = [];\n\n if (value.lifecycle !== undefined && !isRecord(value.lifecycle)) {\n problems.push('lifecycle must be an object when present');\n }\n\n if (entity.entityKind === 'audio-script' || entity.entityKind === 'phonetic-script') {\n for (const key of [\n 'extent',\n 'sampling',\n 'coordinateSpace',\n 'sourceRange',\n 'targetRange',\n 'duration',\n 'startMs',\n 'endMs',\n ]) {\n if (Object.hasOwn(value, key))\n problems.push(`${key} is not intrinsic script data; assign an external annotation Marker`);\n }\n }\n\n switch (entity.entityKind) {\n case 'track':\n validateOptionalField(value, 'hidden', 'boolean', problems);\n validateOptionalField(value, 'role', 'string', problems);\n validateOptionalFiniteNumber(value, 'order', problems);\n break;\n case 'video':\n case 'audio':\n case 'voice':\n case 'caption':\n validateSequencePayload(value, 'bounded', 'native', problems);\n if (entity.entityKind !== 'caption') validateMediaAssetFields(value, problems);\n if (entity.entityKind === 'voice') validateVoicePayload(value, problems);\n if (entity.entityKind === 'caption') validateCaptionPayload(value, problems);\n break;\n case 'image':\n validateSequencePayload(value, 'unbounded', 'constant', problems);\n validateMediaAssetFields(value, problems);\n break;\n case 'axvideo':\n validateSequencePayload(value, 'bounded', 'derived', problems);\n break;\n case 'sequence-marker':\n validateMarkerPayload(value, problems);\n break;\n case 'audio-script':\n validateScriptPayload(value, problems);\n break;\n case 'phonetic-script':\n validatePhoneticScriptPayload(value, problems);\n break;\n case 'timeline':\n case 'viewport':\n break;\n case 'clip':\n validateOptionalFiniteNumber(value, 'order', problems);\n validateOptionalFiniteNumber(value, 'volume', problems);\n if (typeof value.volume === 'number' && (value.volume < -60 || value.volume > 20)) {\n problems.push('volume must be decibels between -60 and 20');\n }\n break;\n case 'asset':\n validateAssetPayload(value, problems);\n break;\n default:\n break;\n }\n\n return problems;\n}\n\nfunction validateSequencePayload(\n value: Readonly<Record<string, unknown>>,\n expectedExtent: 'bounded' | 'unbounded',\n expectedSampling: 'native' | 'constant' | 'derived',\n problems: string[],\n): void {\n const extent = value.extent;\n if (!isRecord(extent)) {\n problems.push('extent must be an object');\n } else {\n if (extent.kind !== expectedExtent) problems.push(`extent.kind must be \"${expectedExtent}\"`);\n if (!Object.hasOwn(extent, 'start') || extent.start === undefined) {\n problems.push('extent.start is required');\n }\n if (expectedExtent === 'bounded' && (!Object.hasOwn(extent, 'end') || extent.end === undefined)) {\n problems.push('extent.end is required for bounded sequences');\n }\n if (expectedExtent === 'unbounded' && Object.hasOwn(extent, 'end')) {\n problems.push('extent.end is forbidden for unbounded sequences');\n }\n }\n if (value.sampling !== expectedSampling) problems.push(`sampling must be \"${expectedSampling}\"`);\n if (!Object.hasOwn(value, 'coordinateSpace') || value.coordinateSpace === undefined) {\n problems.push('coordinateSpace is required');\n }\n}\n\nfunction validateMarkerPayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n validateRange(value.sourceRange, 'sourceRange', true, problems);\n if (Object.hasOwn(value, 'targetRange') && value.targetRange !== undefined) {\n validateRange(value.targetRange, 'targetRange', true, problems);\n }\n\n const duration = value.duration;\n if (!isRecord(duration)) {\n problems.push('duration must be an object');\n } else if (duration.mode === 'fixed') {\n if (!Object.hasOwn(duration, 'value') || duration.value === undefined) {\n problems.push('duration.value is required when duration.mode is \"fixed\"');\n }\n } else if (duration.mode !== 'from-source') {\n problems.push('duration.mode must be \"from-source\" or \"fixed\"');\n }\n if (value.anchorOffset === undefined && Object.hasOwn(value, 'anchorOffset')) {\n problems.push('anchorOffset cannot be undefined when present');\n }\n if (value.durationPolicy !== undefined && value.durationPolicy !== 'timeline') {\n problems.push('durationPolicy must be \"timeline\" when present');\n }\n if (value.segmentRanges !== undefined) validateSegmentRanges(value.segmentRanges, problems);\n}\n\n/** Annotation Marker time values are directly assigned facts; no cross-references are allowed. */\nfunction validateSegmentRanges(value: unknown, problems: string[]): void {\n if (!Array.isArray(value)) {\n problems.push('segmentRanges must be an array when present');\n return;\n }\n const seen = new Set<string>();\n for (const [index, entry] of value.entries()) {\n if (!isRecord(entry)) {\n problems.push(`segmentRanges[${index}] must be an object`);\n continue;\n }\n if (typeof entry.segmentId !== 'string') problems.push(`segmentRanges[${index}].segmentId must be a string`);\n else if (seen.has(entry.segmentId))\n problems.push(`segmentRanges[${index}].segmentId must be unique within the Marker`);\n else seen.add(entry.segmentId);\n for (const key of ['startMs', 'endMs'] as const) {\n const point = entry[key];\n if (typeof point !== 'number' || !Number.isFinite(point)) {\n problems.push(`segmentRanges[${index}].${key} must be a finite number`);\n }\n }\n if (\n typeof entry.startMs === 'number' &&\n Number.isFinite(entry.startMs) &&\n typeof entry.endMs === 'number' &&\n Number.isFinite(entry.endMs) &&\n entry.startMs > entry.endMs\n ) {\n problems.push(`segmentRanges[${index}].startMs must not exceed segmentRanges[${index}].endMs`);\n }\n }\n}\n\nfunction validateAssetPayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n validateExternalLocator(value, problems);\n validateStorageKey(value, problems);\n if (value.inline !== undefined) {\n problems.push('inline is not a physical location; text is domain content owned by its AudioScript');\n }\n}\n\n/**\n * Media variants own their Asset locator directly: `external` is required and\n * textual domain content is owned by AudioScript; the physical-location\n * vocabularies cannot mix.\n */\nfunction validateMediaAssetFields(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n if (value.external === undefined) problems.push('external is required; media variants own their Asset identity');\n else validateExternalLocator(value, problems);\n validateStorageKey(value, problems);\n if (value.inline !== undefined) problems.push('media variants use external locators, not inline domain text');\n}\n\nfunction validateExternalLocator(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n const external = value.external;\n if (external === undefined) return;\n if (!isRecord(external)) {\n problems.push('external must be an object when present');\n return;\n }\n if (external.system !== 'memota' && external.system !== 'memota-speech') {\n problems.push('external.system must be \"memota\" or \"memota-speech\"');\n }\n if (typeof external.key !== 'string' || external.key.trim() === '') {\n problems.push('external.key must be a non-empty string');\n }\n}\n\nfunction validateStorageKey(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n if (value.storageKey !== undefined && (typeof value.storageKey !== 'string' || value.storageKey.trim() === '')) {\n problems.push('storageKey must be a non-empty string when present');\n }\n}\n\nfunction validateVoicePayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n const voice = value.voice;\n if (voice === undefined) return;\n if (!isRecord(voice)) {\n problems.push('voice must be an object when present');\n return;\n }\n if (voice.system !== 'voice-library') problems.push('voice.system must be \"voice-library\"');\n if (typeof voice.key !== 'string' || voice.key.trim() === '') problems.push('voice.key must be a non-empty string');\n if (voice.name !== undefined && typeof voice.name !== 'string')\n problems.push('voice.name must be a string when present');\n}\n\nfunction validateCaptionPayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n validateExternalLocator(value, problems);\n if (value.segmentRanges !== undefined) validateSegmentRanges(value.segmentRanges, problems);\n if (Object.hasOwn(value, 'selections'))\n problems.push('selections is forbidden; Caption requires one selection object');\n const selection = value.selection;\n if (!isRecord(selection)) {\n problems.push('selection must be one AudioScript segment selection object, not an array');\n } else {\n if (typeof selection.segmentId !== 'string' || !selection.segmentId.trim())\n problems.push('selection.segmentId must be a non-empty string');\n if (Object.keys(selection).some((key) => key !== 'segmentId' && key !== 'textRange'))\n problems.push('selection may only contain segmentId and textRange');\n const range = selection.textRange;\n if (\n range !== undefined &&\n (!isRecord(range) ||\n !Number.isSafeInteger(range.start) ||\n !Number.isSafeInteger(range.end) ||\n (range.start as number) < 0 ||\n (range.end as number) <= (range.start as number) ||\n Object.keys(range).some((key) => key !== 'start' && key !== 'end'))\n )\n problems.push('selection.textRange must be a non-empty half-open code-point range');\n if (\n Array.isArray(value.segmentRanges) &&\n (value.segmentRanges.length !== 1 ||\n !isRecord(value.segmentRanges[0]) ||\n value.segmentRanges[0].segmentId !== selection.segmentId)\n )\n problems.push('Caption segmentRanges must contain only the selected segment timing');\n }\n const style = value.style;\n if (style === undefined) return;\n if (!isRecord(style)) {\n problems.push('style must be an object when present');\n return;\n }\n const font = style.font;\n if (font !== undefined) {\n if (!isRecord(font)) {\n problems.push('style.font must be an object when present');\n } else {\n if (font.system !== 'font-library') problems.push('style.font.system must be \"font-library\"');\n if (typeof font.key !== 'string' || font.key.trim() === '') {\n problems.push('style.font.key must be a non-empty string');\n }\n }\n }\n for (const key of [\n 'fontSize',\n 'fontWeight',\n 'entranceAnimationDurationMs',\n 'strokeWidth',\n 'positionX',\n 'positionY',\n ]) {\n validateOptionalFiniteNumber(style, key, problems, `style.${key}`);\n }\n for (const key of ['fontColor', 'entranceAnimation', 'strokeColor']) {\n if (style[key] !== undefined && typeof style[key] !== 'string') problems.push(`style.${key} must be a string`);\n }\n}\n\nfunction validateRange(value: unknown, path: string, required: boolean, problems: string[]): void {\n if (!isRecord(value)) {\n if (required) problems.push(`${path} must be an object`);\n return;\n }\n if (!Object.hasOwn(value, 'start') || value.start === undefined) problems.push(`${path}.start is required`);\n if (!Object.hasOwn(value, 'end') || value.end === undefined) problems.push(`${path}.end is required`);\n}\n\n/** Phonetic variants store pronunciation fields only; base text stays in the AudioScript. */\nfunction validatePhoneticScriptPayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n if (value.segments !== undefined) validateScriptPayload(value, problems);\n if (\n value.phonemeScript !== undefined &&\n (typeof value.phonemeScript !== 'string' || value.phonemeScript.trim() === '')\n ) {\n problems.push('phonemeScript must be a non-empty string when present');\n }\n if (value.prosody !== undefined && !isRecord(value.prosody)) {\n problems.push('prosody must be an object when present');\n }\n}\n\nfunction validateScriptPayload(value: Readonly<Record<string, unknown>>, problems: string[]): void {\n if (!Array.isArray(value.segments)) {\n problems.push('segments must be an array');\n return;\n }\n for (const [index, segment] of value.segments.entries()) {\n if (!isRecord(segment)) {\n problems.push(`segments[${index}] must be an object`);\n continue;\n }\n for (const key of ['startMs', 'endMs', 'start_ms', 'end_ms', 'sourceRange', 'targetRange', 'duration']) {\n if (Object.hasOwn(segment, key))\n problems.push(`segments[${index}].${key} is timing; attach an AudioScript annotation Marker instead`);\n }\n if (typeof segment.segmentId !== 'string') problems.push(`segments[${index}].segmentId must be a string`);\n if (typeof segment.text !== 'string') problems.push(`segments[${index}].text must be a string`);\n if (segment.language !== undefined && typeof segment.language !== 'string') {\n problems.push(`segments[${index}].language must be a string when present`);\n }\n }\n}\n\nfunction validateOptionalField(\n value: Readonly<Record<string, unknown>>,\n key: string,\n expectedType: 'boolean' | 'string',\n problems: string[],\n): void {\n if (value[key] !== undefined && typeof value[key] !== expectedType) {\n problems.push(`${key} must be a ${expectedType} when present`);\n }\n}\n\nfunction validateOptionalFiniteNumber(\n value: Readonly<Record<string, unknown>>,\n key: string,\n problems: string[],\n label: string = key,\n): void {\n if (value[key] !== undefined && (typeof value[key] !== 'number' || !Number.isFinite(value[key]))) {\n problems.push(`${label} must be a finite number when present`);\n }\n}\n\nfunction collectPeerEntityIdPaths(value: unknown, entityKind: string): readonly string[] {\n const paths: string[] = [];\n visitPeerEntityIdPaths(value, entityKind, '', new Set(), paths);\n return paths;\n}\n\nfunction visitPeerEntityIdPaths(\n value: unknown,\n entityKind: string,\n parentPath: string,\n ancestors: Set<object>,\n paths: string[],\n): void {\n if (typeof value !== 'object' || value == null) return;\n if (ancestors.has(value)) return;\n\n ancestors.add(value);\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n visitPeerEntityIdPaths(item, entityKind, `${parentPath}[${index}]`, ancestors, paths);\n }\n } else {\n for (const [key, child] of Object.entries(value)) {\n const path = parentPath.length === 0 ? key : `${parentPath}.${key}`;\n if (parentPath.length === 0 && key === 'baseEntityIds') continue;\n const isOwnEntityId = parentPath.length === 0 && key === 'entityId';\n if (!isOwnEntityId && !isOwnedLocalIdPath(entityKind, path) && isEntityIdFieldName(key)) paths.push(path);\n visitPeerEntityIdPaths(child, entityKind, path, ancestors, paths);\n }\n }\n ancestors.delete(value);\n}\n\nfunction collectPeerEntityValuePaths(\n value: unknown,\n entityKind: string,\n ownEntityId: EntityId,\n entityIds: ReadonlySet<EntityId>,\n): readonly string[] {\n const paths: string[] = [];\n visitPeerEntityValues(value, entityKind, ownEntityId, entityIds, '', new Set(), paths);\n return paths;\n}\n\nfunction visitPeerEntityValues(\n value: unknown,\n entityKind: string,\n ownEntityId: EntityId,\n entityIds: ReadonlySet<EntityId>,\n path: string,\n ancestors: Set<object>,\n paths: string[],\n): void {\n if (typeof value === 'string') {\n if (value !== ownEntityId && entityIds.has(value as EntityId) && !isOwnedLocalEntityValuePath(entityKind, path))\n paths.push(path);\n return;\n }\n if (typeof value !== 'object' || value == null || ancestors.has(value)) return;\n\n ancestors.add(value);\n if (Array.isArray(value)) {\n for (const [index, item] of value.entries()) {\n visitPeerEntityValues(item, entityKind, ownEntityId, entityIds, `${path}[${index}]`, ancestors, paths);\n }\n } else {\n for (const [key, child] of Object.entries(value)) {\n if (path.length === 0 && (key === 'entityId' || key === 'entityKind' || key === 'baseEntityIds')) continue;\n visitPeerEntityValues(\n child,\n entityKind,\n ownEntityId,\n entityIds,\n path.length === 0 ? key : `${path}.${key}`,\n ancestors,\n paths,\n );\n }\n }\n ancestors.delete(value);\n}\n\nfunction isOwnedLocalEntityValuePath(entityKind: string, path: string): boolean {\n if (entityKind === 'track' && path === 'role') return true;\n if (\n ['video', 'audio', 'voice', 'image', 'caption', 'axvideo'].includes(entityKind) &&\n /^(?:sampling|coordinateSpace|coordinateSpace\\.unit|extent\\.kind)$/.test(path)\n )\n return true;\n if (entityKind === 'sequence-marker' && /^(?:durationPolicy|duration\\.mode|timeRemapping\\.(?:kind|mode))$/.test(path))\n return true;\n if ((entityKind === 'sequence-marker' || entityKind === 'caption') && /^segmentRanges\\[\\d+\\]\\.segmentId$/.test(path))\n return true;\n if (entityKind === 'asset' && /^(?:external\\.(?:system|key)|storageKey)$/.test(path)) return true;\n if (isMediaAssetVariantKind(entityKind) && /^(?:external\\.(?:system|key)|storageKey)$/.test(path)) return true;\n if (entityKind === 'voice' && /^voice\\.(?:system|key|name)$/.test(path)) return true;\n // Caption selection segment ids quote the composed script's own segment identity.\n if (entityKind === 'caption' && (path.startsWith('style.') || path === 'selection.segmentId')) return true;\n if (\n ['audio-script', 'caption', 'phonetic-script'].includes(entityKind) &&\n /^segments\\[\\d+\\]\\.(?:segmentId|text|language)$/.test(path)\n )\n return true;\n return false;\n}\n\nfunction isOwnedLocalIdPath(entityKind: string, path: string): boolean {\n if (path === 'lifecycle.actorId') return true;\n if (['audio-script', 'caption', 'phonetic-script'].includes(entityKind) && /^segments\\[\\d+\\]\\.segmentId$/.test(path))\n return true;\n // Caption selection quote the composed script's own segment identity.\n if (entityKind === 'caption' && path === 'selection.segmentId') return true;\n // Annotation Marker segment ids quote the annotated script's own segment identity.\n if ((entityKind === 'sequence-marker' || entityKind === 'caption') && /^segmentRanges\\[\\d+\\]\\.segmentId$/.test(path))\n return true;\n if (entityKind === 'asset' && /^(?:tracks\\[\\d+\\]\\.trackId|renditions\\[\\d+\\]\\.renditionId)$/.test(path)) {\n return true;\n }\n return false;\n}\n\nfunction isEntityIdFieldName(key: string): boolean {\n return key.endsWith('Id') || key.endsWith('Ids') || key.endsWith('ID') || key.endsWith('IDs') || /_ids?$/i.test(key);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n}\n\nfunction collectRelatedEntities(\n entityRefs: readonly EntityRef[],\n index: BiRelationIndex,\n): { readonly entities: readonly EntityRef[]; readonly issues: EntityRelationIssue[] } {\n const byId = new Map<EntityId, EntityRef>();\n const queue = [...entityRefs];\n const issues: EntityRelationIssue[] = [];\n while (queue.length > 0) {\n const entity = queue.shift();\n if (entity == null) continue;\n const existing = byId.get(entity.entityId);\n if (existing != null) {\n if (existing !== entity) {\n issues.push({\n code: 'duplicate_entity_id',\n entityId: entity.entityId,\n message: `Entity id \"${entity.entityId}\" has more than one live EntityRef`,\n });\n }\n continue;\n }\n byId.set(entity.entityId, entity);\n for (const relation of index.relationsOf(entity)) {\n for (const endpoint of relation.endpoints) {\n const ref = endpoint.deref();\n if (ref != null && !byId.has(ref.entityId)) queue.push(ref);\n }\n }\n }\n return { entities: [...byId.values()], issues };\n}\n\nfunction expectedSequenceShape(\n kind: string,\n): { readonly extent: 'bounded' | 'unbounded'; readonly sampling: 'native' | 'constant' | 'derived' } | undefined {\n if (kind === 'video' || kind === 'audio' || kind === 'voice' || kind === 'caption') {\n return { extent: 'bounded', sampling: 'native' };\n }\n if (kind === 'image') return { extent: 'unbounded', sampling: 'constant' };\n if (kind === 'axvideo') return { extent: 'bounded', sampling: 'derived' };\n return undefined;\n}\n\nfunction ofKind(relations: readonly RelationAny[], kind: string): RelationAny[] {\n return relations.filter((relation) => relation.kind === kind);\n}\n","import type {\n Asset,\n Audio,\n AudioScript,\n AXVideo,\n Caption,\n Clip,\n EntityKind,\n Image,\n MedeoEntity,\n PhoneticScript,\n SequenceEntity,\n SequenceMarker,\n Timeline,\n Track,\n Video,\n Voice,\n} from './entities.ts';\nimport { hasSequence } from './entities.ts';\nimport { isJsonObject, type JsonObject, type JsonValue } from './json-values.ts';\nimport type { EmptyMetadata, EntityRef, RelationEndpoints, RelationKindSpec } from './relations.ts';\n\nexport type AssetBinding = JsonObject;\nexport type GeneratedMedia = Video | Image | Audio | Voice;\nexport type GeneratedMetadata = EmptyMetadata;\n/** Media an AudioScript was transcribed from; script-sourced scripts have no edge. */\nexport type AudioScriptSourceMedia = Audio | Video | Voice;\n\nexport interface SegmentAlignmentMetadata extends JsonObject {\n readonly segmentAlignment: JsonValue;\n}\n\nexport interface CaptionAlignmentMetadata extends JsonObject {\n readonly alignment: JsonValue;\n}\n\nexport const timelineTrackRelationSpec = emptySpec<'timeline-track', Timeline, Track>(\n 'timeline-track',\n 'timeline',\n 'track',\n);\nexport const trackClipRelationSpec = emptySpec<'track-clip', Track, Clip>('track-clip', 'track', 'clip');\nexport const clipMarkerRelationSpec = emptySpec<'clip-marker', Clip, SequenceMarker>(\n 'clip-marker',\n 'clip',\n 'sequence-marker',\n);\nexport const axVideoMarkerRelationSpec = emptySpec<'axvideo-marker', AXVideo, SequenceMarker>(\n 'axvideo-marker',\n 'axvideo',\n 'sequence-marker',\n);\nexport const markerTimelineRelationSpec = emptySpec<'marker-timeline', SequenceMarker, Timeline>(\n 'marker-timeline',\n 'sequence-marker',\n 'timeline',\n);\n\nexport const markerContentRelationSpec: RelationKindSpec<\n 'marker-content',\n SequenceMarker,\n SequenceEntity,\n EmptyMetadata\n> = Object.freeze({\n kind: 'marker-content',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<SequenceMarker>, EntityRef<SequenceEntity>> =>\n hasMarkerAndSequence(endpoints),\n validateMetadata: isEmptyMetadata,\n});\n\nexport const physicalAssetRelationSpec: RelationKindSpec<'physical-asset', SequenceEntity, Asset, AssetBinding> =\n Object.freeze({\n kind: 'physical-asset',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<SequenceEntity>, EntityRef<Asset>> => hasAssetAndSequence(endpoints),\n validateMetadata: isAssetBinding,\n });\n\n/** `generated(output, input)` means endpoint 0 was generated from endpoint 1. */\nexport const generatedRelationSpec: RelationKindSpec<'generated', GeneratedMedia, GeneratedMedia, GeneratedMetadata> =\n Object.freeze({\n kind: 'generated',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<GeneratedMedia>, EntityRef<GeneratedMedia>> =>\n endpoints.every((endpoint) => isGeneratedMedia(endpoint.current())),\n validateMetadata: isEmptyMetadata,\n });\n\nexport const captionAlignmentRelationSpec: RelationKindSpec<\n 'caption-alignment',\n Caption,\n Audio | Voice,\n CaptionAlignmentMetadata\n> = Object.freeze({\n kind: 'caption-alignment',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<Caption>, EntityRef<Audio | Voice>> =>\n hasKinds(endpoints, new Set(['caption']), new Set(['audio', 'voice'])),\n validateMetadata: isCaptionAlignmentMetadata,\n});\n\n/** `clip-anchor(child, host)` means endpoint 0 follows endpoint 1. */\nexport const clipAnchorRelationSpec: RelationKindSpec<'clip-anchor', Clip, Clip, EmptyMetadata> = Object.freeze({\n kind: 'clip-anchor',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<Clip>, EntityRef<Clip>> =>\n endpoints[0].current().entityKind === 'clip' && endpoints[1].current().entityKind === 'clip',\n validateMetadata: isEmptyMetadata,\n});\n\n/** Voice is generated from PhoneticScript; kinds determine roles regardless of endpoint positions. */\nexport const phoneticScriptRenderRelationSpec: RelationKindSpec<\n 'phonetic-script-render',\n Voice,\n PhoneticScript,\n EmptyMetadata\n> = Object.freeze({\n kind: 'phonetic-script-render',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<Voice>, EntityRef<PhoneticScript>> =>\n hasKinds(endpoints, new Set(['voice']), new Set(['phonetic-script'])),\n validateMetadata: isEmptyMetadata,\n});\n\n/** AudioScript was transcribed from Audio, Video, or recorded Voice; kinds determine roles. */\nexport const audioScriptSourceRelationSpec: RelationKindSpec<\n 'audio-script-source',\n AudioScript,\n AudioScriptSourceMedia,\n EmptyMetadata\n> = Object.freeze({\n kind: 'audio-script-source',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<AudioScript>, EntityRef<AudioScriptSourceMedia>> =>\n hasKinds(endpoints, new Set(['audio-script']), new Set(['audio', 'video', 'voice'])),\n validateMetadata: isEmptyMetadata,\n});\n\n/**\n * `audio-script-marker(script, marker)` attaches an annotation Sequence Marker\n * whose `segmentRanges` hold directly assigned per-Segment time values. The\n * script keeps no Sequence and no Clip admission; annotation Markers cannot\n * enter Clip/AXVideo use chains (enforced by the marker-use invariant).\n */\nexport const audioScriptMarkerRelationSpec: RelationKindSpec<\n 'audio-script-marker',\n AudioScript,\n SequenceMarker,\n EmptyMetadata\n> = Object.freeze({\n kind: 'audio-script-marker',\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<AudioScript>, EntityRef<SequenceMarker>> =>\n hasKinds(endpoints, new Set(['audio-script']), new Set(['sequence-marker'])),\n validateMetadata: isEmptyMetadata,\n});\n\n/** Built-in kinds are reserved; callers may add specs only under new names. */\nexport const builtInRelationSpecs = Object.freeze([\n timelineTrackRelationSpec,\n trackClipRelationSpec,\n clipMarkerRelationSpec,\n markerContentRelationSpec,\n axVideoMarkerRelationSpec,\n markerTimelineRelationSpec,\n physicalAssetRelationSpec,\n generatedRelationSpec,\n captionAlignmentRelationSpec,\n clipAnchorRelationSpec,\n phoneticScriptRenderRelationSpec,\n audioScriptSourceRelationSpec,\n audioScriptMarkerRelationSpec,\n]);\n\nfunction emptySpec<K extends string, A extends MedeoEntity<EntityKind>, B extends MedeoEntity<EntityKind>>(\n kind: K,\n a: A['entityKind'],\n b: B['entityKind'],\n): RelationKindSpec<K, A, B, EmptyMetadata> {\n return metadataSpec(kind, a, b, isEmptyMetadata);\n}\n\nfunction metadataSpec<\n K extends string,\n A extends MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind>,\n Metadata extends JsonObject,\n>(\n kind: K,\n a: A['entityKind'],\n b: B['entityKind'],\n validateMetadata: (value: unknown) => value is Metadata,\n): RelationKindSpec<K, A, B, Metadata> {\n return Object.freeze({\n kind,\n validateEndpoints: (\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<A>, EntityRef<B>> => hasKinds(endpoints, new Set([a]), new Set([b])),\n validateMetadata,\n });\n}\n\nfunction hasKinds(\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n aKinds: ReadonlySet<string>,\n bKinds: ReadonlySet<string>,\n): boolean {\n const first = endpoints[0].current().entityKind;\n const second = endpoints[1].current().entityKind;\n return (aKinds.has(first) && bKinds.has(second)) || (aKinds.has(second) && bKinds.has(first));\n}\n\nfunction hasMarkerAndSequence(endpoints: RelationEndpoints<EntityRef, EntityRef>): boolean {\n const first = endpoints[0].current();\n const second = endpoints[1].current();\n return (\n (first.entityKind === 'sequence-marker' && hasSequence(second)) ||\n (second.entityKind === 'sequence-marker' && hasSequence(first))\n );\n}\n\nfunction hasAssetAndSequence(endpoints: RelationEndpoints<EntityRef, EntityRef>): boolean {\n const first = endpoints[0].current();\n const second = endpoints[1].current();\n return (first.entityKind === 'asset' && hasSequence(second)) || (second.entityKind === 'asset' && hasSequence(first));\n}\n\nfunction isGeneratedMedia(entity: MedeoEntity): entity is GeneratedMedia {\n return (\n entity.entityKind === 'video' ||\n entity.entityKind === 'image' ||\n entity.entityKind === 'audio' ||\n entity.entityKind === 'voice'\n );\n}\n\nfunction isEmptyMetadata(value: unknown): value is EmptyMetadata {\n return isJsonObject(value) && Object.keys(value).length === 0;\n}\n\nfunction isAssetBinding(value: unknown): value is AssetBinding {\n if (!isJsonObject(value)) return false;\n const orderingKey = /(order|ordinal|position|rank|index|z[_-]?index)/i;\n return Object.keys(value).every((key) => !orderingKey.test(key));\n}\n\nfunction isCaptionAlignmentMetadata(value: unknown): value is CaptionAlignmentMetadata {\n return isJsonObject(value) && Object.hasOwn(value, 'alignment');\n}\n","import type { EntityKind, MedeoEntity } from './entities.ts';\nimport type { EntityId, RelationId } from './ids.ts';\nimport type { JsonObject } from './json-values.ts';\n\nexport type KnownRelationKind =\n | 'timeline-track'\n | 'track-clip'\n | 'clip-marker'\n | 'marker-content'\n | 'axvideo-marker'\n | 'marker-timeline'\n | 'physical-asset'\n | 'generated'\n | 'caption-alignment'\n | 'clip-anchor'\n | 'phonetic-script-render'\n | 'audio-script-source'\n | 'audio-script-marker';\n\nexport type RelationKind = KnownRelationKind | (string & {});\nexport type RelationTrace = JsonObject;\nexport type EmptyMetadata = Readonly<Record<string, never>>;\n\n/** Two persisted endpoint positions. Their meaning belongs to the Relation kind. */\nexport type RelationEndpoints<A, B> = readonly [A, B] | readonly [B, A];\n\n/**\n * Authoritative persisted relation value.\n *\n * A kind may assign semantic roles to endpoint 0 and endpoint 1. Callers and\n * storage adapters must preserve the submitted positions; kinds whose\n * semantics are unordered simply do not interpret those positions.\n */\nexport interface RelationRow<K extends RelationKind = RelationKind, Metadata extends JsonObject = JsonObject> {\n readonly relationId: RelationId;\n readonly endpoint0EntityId: EntityId;\n readonly endpoint1EntityId: EntityId;\n readonly relationKind: K;\n readonly metadata: Metadata;\n readonly trace: RelationTrace;\n}\n\nexport interface EntityRef<T extends MedeoEntity<EntityKind> = MedeoEntity<EntityKind>> {\n readonly entityId: EntityId;\n current(): T;\n}\n\nexport interface Relation<\n K extends RelationKind = RelationKind,\n A extends MedeoEntity<EntityKind> = MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind> = MedeoEntity<EntityKind>,\n Metadata extends JsonObject = JsonObject,\n> {\n readonly relationId: RelationId;\n readonly kind: K;\n readonly endpoints: RelationEndpoints<WeakRef<EntityRef<A>>, WeakRef<EntityRef<B>>>;\n readonly metadata: Metadata;\n readonly trace: RelationTrace;\n other(entity: EntityRef<A | B>): WeakRef<EntityRef<A | B>> | undefined;\n toRow(): RelationRow<K, Metadata> | undefined;\n}\n\nexport type RelationAny = Relation<RelationKind, MedeoEntity<EntityKind>, MedeoEntity<EntityKind>, JsonObject>;\n\n/** Type-erased validation contract used when decoding persisted relation rows. */\nexport interface RuntimeRelationKindSpec {\n readonly kind: RelationKind;\n validateEndpoints(endpoints: RelationEndpoints<EntityRef, EntityRef>): boolean;\n validateMetadata(value: unknown): value is JsonObject;\n}\n\nexport interface RelationKindSpec<\n K extends RelationKind,\n A extends MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind>,\n Metadata extends JsonObject,\n> extends RuntimeRelationKindSpec {\n readonly kind: K;\n validateEndpoints(\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n ): endpoints is RelationEndpoints<EntityRef<A>, EntityRef<B>>;\n validateMetadata(value: unknown): value is Metadata;\n}\n\nexport function createEntityRef<T extends MedeoEntity<EntityKind>>(entity: T): EntityRef<T> {\n return { entityId: entity.entityId, current: () => entity };\n}\n","import {\n hasSequence,\n type Audio,\n type AudioScript,\n type Clip,\n type EntityKind,\n type MedeoEntity,\n type PhoneticScript,\n type Video,\n type Voice,\n} from './entities.ts';\nimport type { RelationId } from './ids.ts';\nimport type { JsonObject } from './json-values.ts';\nimport {\n audioScriptSourceRelationSpec,\n builtInRelationSpecs,\n clipAnchorRelationSpec,\n generatedRelationSpec,\n type GeneratedMedia,\n type GeneratedMetadata,\n phoneticScriptRenderRelationSpec,\n} from './relation-specs.ts';\nimport {\n type EntityRef,\n type EmptyMetadata,\n type Relation,\n type RelationAny,\n type RelationEndpoints,\n type RelationKind,\n type RelationKindSpec,\n type RelationRow,\n type RelationTrace,\n type RuntimeRelationKindSpec,\n} from './relations.ts';\n\nclass RelationEdge<\n K extends RelationKind,\n A extends MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind>,\n Metadata extends JsonObject,\n> implements Relation<K, A, B, Metadata> {\n readonly endpoints: RelationEndpoints<WeakRef<EntityRef<A>>, WeakRef<EntityRef<B>>>;\n\n constructor(\n readonly relationId: RelationId,\n readonly kind: K,\n endpoints: RelationEndpoints<EntityRef<A>, EntityRef<B>>,\n readonly metadata: Metadata,\n readonly trace: RelationTrace,\n ) {\n this.endpoints = [\n new WeakRef(endpoints[0] as EntityRef<A | B>),\n new WeakRef(endpoints[1] as EntityRef<A | B>),\n ] as unknown as RelationEndpoints<WeakRef<EntityRef<A>>, WeakRef<EntityRef<B>>>;\n }\n\n other(entity: EntityRef<A | B>): WeakRef<EntityRef<A | B>> | undefined {\n const first = this.endpoints[0].deref();\n const second = this.endpoints[1].deref();\n if (first === entity) return this.endpoints[1] as WeakRef<EntityRef<A | B>>;\n if (second === entity) return this.endpoints[0] as WeakRef<EntityRef<A | B>>;\n return undefined;\n }\n\n toRow(): RelationRow<K, Metadata> | undefined {\n const first = this.endpoints[0].deref();\n const second = this.endpoints[1].deref();\n if (first == null || second == null) return undefined;\n return {\n relationId: this.relationId,\n endpoint0EntityId: first.entityId,\n endpoint1EntityId: second.entityId,\n relationKind: this.kind,\n metadata: this.metadata,\n trace: this.trace,\n };\n }\n\n isStale(): boolean {\n return this.endpoints[0].deref() == null || this.endpoints[1].deref() == null;\n }\n}\n\nexport interface LinkRelationInput<\n K extends RelationKind,\n A extends MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind>,\n Metadata extends JsonObject,\n> {\n readonly relationId: RelationId;\n readonly spec: RelationKindSpec<K, A, B, Metadata>;\n readonly endpoints: RelationEndpoints<EntityRef<A>, EntityRef<B>>;\n readonly metadata: Metadata;\n readonly trace?: RelationTrace;\n}\n\nexport interface LinkRuntimeRelationInput {\n readonly relationId: RelationId;\n readonly spec: RuntimeRelationKindSpec;\n readonly endpoints: RelationEndpoints<EntityRef, EntityRef>;\n readonly metadata: unknown;\n readonly trace?: RelationTrace;\n}\n\nexport interface LinkGeneratedRelationInput {\n readonly relationId: RelationId;\n readonly output: EntityRef<GeneratedMedia>;\n readonly input: EntityRef<GeneratedMedia>;\n readonly trace?: RelationTrace;\n}\n\nexport interface LinkClipAnchorRelationInput {\n readonly relationId: RelationId;\n readonly child: EntityRef<Clip>;\n readonly host: EntityRef<Clip>;\n readonly trace?: RelationTrace;\n}\n\nexport interface LinkPhoneticScriptRenderRelationInput {\n readonly relationId: RelationId;\n readonly output: EntityRef<Voice>;\n readonly phoneticScript: EntityRef<PhoneticScript>;\n readonly trace?: RelationTrace;\n}\n\nexport interface LinkAudioScriptSourceRelationInput {\n readonly relationId: RelationId;\n readonly script: EntityRef<AudioScript>;\n readonly source: EntityRef<Audio | Video | Voice>;\n readonly trace?: RelationTrace;\n}\n\n/** Endpoint-agnostic secondary index. Relation rows remain the persistence authority. */\nexport class BiRelationIndex {\n private readonly byEntity = new WeakMap<EntityRef, Set<RelationAny>>();\n private readonly canonicalRefs = new Map<string, WeakRef<EntityRef>>();\n private readonly byRelationId = new Map<RelationId, WeakRef<RelationAny>>();\n\n link<\n K extends RelationKind,\n A extends MedeoEntity<EntityKind>,\n B extends MedeoEntity<EntityKind>,\n Metadata extends JsonObject,\n >(input: LinkRelationInput<K, A, B, Metadata>): Relation<K, A, B, Metadata> {\n if (input.spec.kind === 'generated')\n throw new Error('Author generated Relations with linkGenerated({ output, input })');\n if (\n input.spec.kind === 'clip-anchor' ||\n input.spec.kind === 'phonetic-script-render' ||\n input.spec.kind === 'audio-script-source'\n )\n throw new Error(`Author ordered ${input.spec.kind} Relations with the dedicated role-named method`);\n return this.linkValidated(input) as Relation<K, A, B, Metadata>;\n }\n\n /** Author `generated(output, input)` without exposing positional arguments. */\n linkGenerated(\n input: LinkGeneratedRelationInput,\n ): Relation<'generated', GeneratedMedia, GeneratedMedia, GeneratedMetadata> {\n return this.linkValidated({\n relationId: input.relationId,\n spec: generatedRelationSpec,\n endpoints: [input.output, input.input],\n metadata: {},\n trace: input.trace,\n }) as Relation<'generated', GeneratedMedia, GeneratedMedia, GeneratedMetadata>;\n }\n\n /** Author `clip-anchor(child, host)` without exposing positional arguments. */\n linkClipAnchor(input: LinkClipAnchorRelationInput): Relation<'clip-anchor', Clip, Clip, EmptyMetadata> {\n return this.linkValidated({\n relationId: input.relationId,\n spec: clipAnchorRelationSpec,\n endpoints: [input.child, input.host],\n metadata: {},\n trace: input.trace,\n }) as Relation<'clip-anchor', Clip, Clip, EmptyMetadata>;\n }\n\n /** Author `phonetic-script-render(output, phoneticScript)` without exposing positional arguments. */\n linkPhoneticScriptRender(\n input: LinkPhoneticScriptRenderRelationInput,\n ): Relation<'phonetic-script-render', Voice, PhoneticScript, EmptyMetadata> {\n return this.linkValidated({\n relationId: input.relationId,\n spec: phoneticScriptRenderRelationSpec,\n endpoints: [input.output, input.phoneticScript],\n metadata: {},\n trace: input.trace,\n }) as Relation<'phonetic-script-render', Voice, PhoneticScript, EmptyMetadata>;\n }\n\n /** Author `audio-script-source(script, source)` without exposing positional arguments. */\n linkAudioScriptSource(\n input: LinkAudioScriptSourceRelationInput,\n ): Relation<'audio-script-source', AudioScript, Audio | Video | Voice, EmptyMetadata> {\n return this.linkValidated({\n relationId: input.relationId,\n spec: audioScriptSourceRelationSpec,\n endpoints: [input.script, input.source],\n metadata: {},\n trace: input.trace,\n }) as Relation<'audio-script-source', AudioScript, Audio | Video | Voice, EmptyMetadata>;\n }\n\n /**\n * Rehydrate a persisted row after resolving its spec and endpoint refs.\n *\n * This is a storage-boundary escape hatch, not an authoring API: persisted\n * positions already are the semantic assertion made by their relation kind.\n */\n linkRuntime(input: LinkRuntimeRelationInput): RelationAny {\n return this.linkValidated(input);\n }\n\n private linkValidated(input: LinkRuntimeRelationInput): RelationAny {\n const [first, second] = input.endpoints;\n if (first.entityId === second.entityId) throw new Error('A Relation cannot connect an entity to itself');\n this.assertRelationIdAvailable(input.relationId);\n const builtInSpec = builtInSpecByKind.get(input.spec.kind);\n if (builtInSpec != null && builtInSpec !== input.spec) {\n throw new Error(`Relation kind \"${input.spec.kind}\" must use its built-in specification`);\n }\n if (isForbiddenAuthoritativeRelation(input.spec.kind, input.endpoints)) {\n throw new Error('A direct Clip-Content Relation is derived-only and cannot be authoritative');\n }\n if (!input.spec.validateEndpoints(input.endpoints)) {\n throw new Error(`Relation \"${input.spec.kind}\" received invalid endpoints`);\n }\n if (!input.spec.validateMetadata(input.metadata)) {\n throw new Error(`Relation \"${input.spec.kind}\" received invalid metadata`);\n }\n this.assertCanonicalRefAvailable(first);\n this.assertCanonicalRefAvailable(second);\n\n const relation = new RelationEdge<RelationKind, MedeoEntity<EntityKind>, MedeoEntity<EntityKind>, JsonObject>(\n input.relationId,\n input.spec.kind,\n input.endpoints,\n input.metadata,\n input.trace ?? {},\n );\n this.rememberCanonicalRef(first);\n this.rememberCanonicalRef(second);\n this.add(first, relation);\n this.add(second, relation);\n this.byRelationId.set(input.relationId, new WeakRef(relation));\n return relation;\n }\n\n relationsOf(entity: EntityRef): ReadonlySet<RelationAny> {\n this.registerCanonicalRef(entity);\n const relations = this.byEntity.get(entity);\n if (relations == null) return new Set();\n for (const relation of relations) {\n if (relation instanceof RelationEdge && relation.isStale()) this.unlink(relation);\n }\n return new Set(relations);\n }\n\n unlink(relation: RelationAny): void {\n for (const endpoint of relation.endpoints) {\n const ref = endpoint.deref();\n if (ref != null) this.byEntity.get(ref)?.delete(relation);\n }\n if (this.byRelationId.get(relation.relationId)?.deref() === relation) {\n this.byRelationId.delete(relation.relationId);\n }\n }\n\n private add(entity: EntityRef, relation: RelationAny): void {\n const relations = this.byEntity.get(entity) ?? new Set<RelationAny>();\n relations.add(relation);\n this.byEntity.set(entity, relations);\n }\n\n private registerCanonicalRef(entity: EntityRef): void {\n this.assertCanonicalRefAvailable(entity);\n this.rememberCanonicalRef(entity);\n }\n\n private assertCanonicalRefAvailable(entity: EntityRef): void {\n const existing = this.canonicalRefs.get(entity.entityId)?.deref();\n if (existing != null && existing !== entity) {\n throw new Error(`Entity \"${entity.entityId}\" already has a live canonical EntityRef`);\n }\n }\n\n private rememberCanonicalRef(entity: EntityRef): void {\n this.canonicalRefs.set(entity.entityId, new WeakRef(entity));\n }\n\n private assertRelationIdAvailable(relationId: RelationId): void {\n const existing = this.byRelationId.get(relationId)?.deref();\n if (existing != null) throw new Error(`Relation id \"${relationId}\" already exists`);\n this.byRelationId.delete(relationId);\n }\n}\n\nconst builtInSpecByKind: ReadonlyMap<string, object> = new Map(builtInRelationSpecs.map((spec) => [spec.kind, spec]));\n\nfunction isForbiddenAuthoritativeRelation(\n kind: RelationKind,\n endpoints: RelationEndpoints<EntityRef, EntityRef>,\n): boolean {\n if (kind === 'clip-content') return true;\n const first = endpoints[0].current();\n const second = endpoints[1].current();\n return (first.entityKind === 'clip' && hasSequence(second)) || (second.entityKind === 'clip' && hasSequence(first));\n}\n","import { assembleEntityContent } from './composition.ts';\nimport {\n isKnownEntityKind,\n isReservedEntityKind,\n type EntityKind,\n type ExtensionEntityKind,\n type MedeoEntity,\n} from './entities.ts';\nimport { createEntityId, createRelationId, type EntityId, type RelationId } from './ids.ts';\nimport { validateEntityRelationSet, type EntityRelationValidationOptions } from './invariants.ts';\nimport { isJsonObject } from './json-values.ts';\nimport { BiRelationIndex } from './relation-index.ts';\nimport { builtInRelationSpecs } from './relation-specs.ts';\nimport { createEntityRef, type EntityRef, type RelationAny, type RuntimeRelationKindSpec } from './relations.ts';\nimport type { EntityRelationRows, EntityRow } from './rows.ts';\n\nexport interface DecodeEntityRelationRowsOptions extends EntityRelationValidationOptions {\n /** Extension entity kinds must be explicitly registered; the 14 built-ins are always available. */\n readonly entityKinds?: readonly ExtensionEntityKind[];\n /** Specs for extension relation kinds. Built-in names cannot be replaced. */\n readonly relationSpecs?: readonly RuntimeRelationKindSpec[];\n}\n\nexport interface DecodedEntityRelationSet {\n readonly entitiesById: ReadonlyMap<EntityId, EntityRef>;\n readonly relationIndex: BiRelationIndex;\n readonly relations: readonly RelationAny[];\n}\n\nexport class InvalidEntityRelationRowsError extends Error {\n constructor(readonly issues: readonly string[]) {\n super(`Invalid Medeo entity/relation rows:\\n- ${issues.join('\\n- ')}`);\n this.name = 'InvalidEntityRelationRowsError';\n }\n}\n\n/** Decodes database rows into flat entities and validates the complete relation set. */\nexport function decodeEntityRelationRows(\n rows: EntityRelationRows,\n options: DecodeEntityRelationRowsOptions,\n): DecodedEntityRelationSet {\n const issues: string[] = [];\n const entitiesById = new Map<EntityId, EntityRef>();\n const extensionEntityKinds = new Set<string>(options.entityKinds ?? []);\n\n for (const row of rows.entities) {\n let entity = decodeEntityRow(row, extensionEntityKinds, issues);\n if (entity != null) {\n try {\n entity = decodeEntityRow(assembleEntityContent(rows, row.entityId), extensionEntityKinds, issues);\n } catch (error) {\n issues.push(errorMessage(error));\n continue;\n }\n }\n if (entity == null) continue;\n const ref = createEntityRef(entity);\n if (entitiesById.has(ref.entityId)) {\n issues.push(`duplicate entity id \"${ref.entityId}\"`);\n continue;\n }\n entitiesById.set(ref.entityId, ref);\n }\n\n const specsByKind = collectRelationSpecs(options.relationSpecs ?? [], issues);\n const relationIndex = new BiRelationIndex();\n const relations: RelationAny[] = [];\n const relationIds = new Set<string>();\n\n for (const row of rows.relations) {\n let relationId: RelationId;\n try {\n relationId = createRelationId(row.relationId);\n } catch (error) {\n issues.push(errorMessage(error));\n continue;\n }\n if (relationIds.has(relationId)) {\n issues.push(`duplicate relation id \"${relationId}\"`);\n continue;\n }\n relationIds.add(relationId);\n\n if (!isTrimmedNonEmpty(row.relationKind)) {\n issues.push(`relation \"${relationId}\" has an empty or untrimmed kind`);\n continue;\n }\n const spec = specsByKind.get(row.relationKind);\n if (spec == null) {\n issues.push(`relation \"${relationId}\" has no registered spec for kind \"${row.relationKind}\"`);\n continue;\n }\n\n let endpoint0EntityId: EntityId;\n let endpoint1EntityId: EntityId;\n try {\n endpoint0EntityId = createEntityId(row.endpoint0EntityId);\n endpoint1EntityId = createEntityId(row.endpoint1EntityId);\n } catch (error) {\n issues.push(errorMessage(error));\n continue;\n }\n const endpoint0 = entitiesById.get(endpoint0EntityId);\n const endpoint1 = entitiesById.get(endpoint1EntityId);\n if (endpoint0 == null || endpoint1 == null) {\n const missing = [\n endpoint0 == null ? endpoint0EntityId : undefined,\n endpoint1 == null ? endpoint1EntityId : undefined,\n ]\n .filter((value) => value != null)\n .join(', ');\n issues.push(`relation \"${relationId}\" references missing entity id(s): ${missing}`);\n continue;\n }\n if (!isJsonObject(row.metadata) || !isJsonObject(row.trace)) {\n issues.push(`relation \"${relationId}\" metadata and trace must contain only JSON values`);\n continue;\n }\n\n try {\n relations.push(\n relationIndex.linkRuntime({\n relationId,\n spec,\n endpoints: [endpoint0, endpoint1],\n metadata: row.metadata,\n trace: row.trace,\n }),\n );\n } catch (error) {\n issues.push(errorMessage(error));\n }\n }\n\n if (issues.length === 0) {\n for (const issue of validateEntityRelationSet([...entitiesById.values()], relationIndex, options)) {\n issues.push(`${issue.code}: ${issue.message}`);\n }\n }\n if (issues.length > 0) throw new InvalidEntityRelationRowsError(issues);\n\n return { entitiesById, relationIndex, relations };\n}\n\nfunction decodeEntityRow(\n row: EntityRow,\n extensionEntityKinds: ReadonlySet<string>,\n issues: string[],\n): MedeoEntity | undefined {\n let entityId: EntityId;\n try {\n entityId = createEntityId(row.entityId);\n } catch (error) {\n issues.push(errorMessage(error));\n return undefined;\n }\n if (!isTrimmedNonEmpty(row.entityKind)) {\n issues.push(`entity \"${entityId}\" has an empty or untrimmed kind`);\n return undefined;\n }\n if (isReservedEntityKind(row.entityKind)) {\n issues.push(`entity \"${entityId}\" uses reserved kind \"${row.entityKind}\"`);\n return undefined;\n }\n if (!isKnownEntityKind(row.entityKind) && !extensionEntityKinds.has(row.entityKind)) {\n issues.push(`entity \"${entityId}\" has unregistered extension kind \"${row.entityKind}\"`);\n return undefined;\n }\n if (!isJsonObject(row.payload)) {\n issues.push(`entity \"${entityId}\" payload must contain only JSON values`);\n return undefined;\n }\n const reserved = ['entityId', 'entityKind'].filter((key) => Object.hasOwn(row.payload, key));\n if (reserved.length > 0) {\n issues.push(`entity \"${entityId}\" payload contains reserved field(s): ${reserved.join(', ')}`);\n return undefined;\n }\n return { ...row.payload, entityId, entityKind: row.entityKind as EntityKind } as MedeoEntity;\n}\n\nfunction collectRelationSpecs(\n extensionSpecs: readonly RuntimeRelationKindSpec[],\n issues: string[],\n): ReadonlyMap<string, RuntimeRelationKindSpec> {\n const specs = new Map<string, RuntimeRelationKindSpec>();\n for (const spec of builtInRelationSpecs) specs.set(spec.kind, spec);\n for (const spec of extensionSpecs) {\n if (!isTrimmedNonEmpty(spec.kind)) {\n issues.push('extension relation spec has an empty or untrimmed kind');\n continue;\n }\n if (specs.has(spec.kind)) {\n issues.push(`relation spec kind \"${spec.kind}\" is already registered`);\n continue;\n }\n specs.set(spec.kind, spec);\n }\n return specs;\n}\n\nfunction isTrimmedNonEmpty(value: string): boolean {\n return value.length > 0 && value.trim() === value;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type {\n BusinessEntityFacade,\n BusinessRelationFacade,\n EntityFacade,\n RelationFacade,\n EntityStoreSnapshot,\n SandboxEntity,\n JsonObject,\n} from '../entity/entity-contract.ts';\n\n/** Resource IDs are entity data; physical storage paths remain host-owned. */\nconst infrastructureFields = new Set(['storageKey']);\n\nexport function businessEntity(entity: SandboxEntity): SandboxEntity {\n return {\n ...entity,\n payload: Object.fromEntries(Object.entries(entity.payload).filter(([key]) => !infrastructureFields.has(key))),\n };\n}\n\nexport function businessState(state: EntityStoreSnapshot): EntityStoreSnapshot {\n const assets = new Set(state.entities.filter((row) => row.entity_kind === 'asset').map((row) => row.entity_id));\n return {\n revision: state.revision,\n audioScriptEntityId: state.audioScriptEntityId,\n entities: state.entities.filter((row) => !assets.has(row.entity_id)).map(businessEntity),\n relations: state.relations.filter(\n (row) =>\n row.relation_kind !== 'physical-asset' &&\n !assets.has(row.endpoint_0_entity_id) &&\n !assets.has(row.endpoint_1_entity_id),\n ),\n };\n}\n\n/** Keep infrastructure rows available to assembly without exposing their management to scripts. */\nexport function businessFacades(\n entities: EntityFacade,\n relations: RelationFacade,\n): {\n entities: BusinessEntityFacade;\n relations: BusinessRelationFacade;\n} {\n const isAsset = (id: string) => entities.get(id)?.entity_kind === 'asset';\n const assertBusiness = (id: string) => {\n if (isAsset(id)) throw new Error('Asset entities are managed by host assembly');\n };\n const assertBusinessPayload = (payload: JsonObject) => {\n for (const field of infrastructureFields) {\n if (Object.hasOwn(payload, field)) throw new Error(`Field ${field} is managed by host assembly`);\n }\n if (Array.isArray(payload.baseEntityIds)) {\n for (const id of payload.baseEntityIds) if (typeof id === 'string') assertBusiness(id);\n }\n };\n const visibleRelation = (relation: ReturnType<RelationFacade['list']>[number]) =>\n relation.relation_kind !== 'physical-asset' &&\n !isAsset(relation.endpoint_0_entity_id) &&\n !isAsset(relation.endpoint_1_entity_id);\n return {\n entities: {\n list: () =>\n entities\n .list()\n .filter((entity) => entity.entity_kind !== 'asset')\n .map(businessEntity),\n get: (id) => {\n const entity = entities.get(id);\n return entity && !isAsset(id) ? businessEntity(entity) : null;\n },\n create: (input) => {\n if ((input.entity_kind as string) === 'asset') throw new Error('Asset entities are managed by host assembly');\n assertBusinessPayload(input.payload);\n if (input.entity_id && entities.get(input.entity_id))\n throw new Error(`Entity id ${input.entity_id} already exists`);\n return entities.create(input);\n },\n update: (input) => {\n assertBusiness(input.entity_id);\n if (!Array.isArray(input.changes)) throw new Error('entities.update requires changes');\n for (const change of input.changes) {\n if (infrastructureFields.has(change.path?.[0] as string))\n throw new Error('Field is managed by host assembly');\n if (change.path?.[0] === 'baseEntityIds' && change.op === 'list.insert' && typeof change.value === 'string')\n assertBusiness(change.value);\n }\n entities.changeFields(input);\n },\n declareFields: (input) => {\n assertBusiness(input.entity_id);\n assertBusinessPayload(input.payload);\n entities.declareFields(input);\n },\n delete: (input) => {\n assertBusiness(input.entity_id);\n const incident = relations.of(input.entity_id);\n // Business associations still require explicit handling; only host-owned\n // infrastructure bindings disappear with their deleted business endpoint.\n if (incident.some(visibleRelation)) {\n entities.delete(input);\n return;\n }\n for (const relation of incident) relations.unlink({ relation_id: relation.relation_id });\n entities.delete(input);\n },\n },\n relations: {\n list: () => relations.list().filter(visibleRelation),\n of: (id, kind) => relations.of(id, kind).filter(visibleRelation),\n link: (input) => {\n if ((input.relation_kind as string) === 'physical-asset')\n throw new Error('Asset bindings are managed by host assembly');\n assertBusiness(input.endpoint_0_entity_id);\n assertBusiness(input.endpoint_1_entity_id);\n return relations.link(input);\n },\n unlink: (input) => {\n const relation = relations.list().find((row) => row.relation_id === input.relation_id);\n if (relation && !visibleRelation(relation)) throw new Error('Asset bindings are managed by host assembly');\n relations.unlink(input);\n },\n update: (input) => {\n const relation = relations.list().find((row) => row.relation_id === input.relation_id);\n if (relation && !visibleRelation(relation)) throw new Error('Asset bindings are managed by host assembly');\n relations.update(input);\n },\n },\n };\n}\n","import {\n applyFieldChanges,\n assertFieldChanges,\n assertCanonicalEditorResources,\n readDocumentAudioScript,\n ensureEditorFoundation,\n importMediaAsset,\n type MediaAssetFact,\n} from '@mengine/medeo-client';\nimport {\n assembleCaptionContent,\n findComposedAudioScript,\n assembleEntityContent,\n updateEntityFields,\n resolveEntityFieldOwner,\n validateEntity,\n assemblePhoneticScriptContent,\n BiRelationIndex,\n builtInRelationSpecs,\n createEntityId,\n createEntityRef,\n createRelationId,\n decodeEntityRelationRows,\n entityToRow,\n isJsonObject,\n isKnownEntityKind,\n isMediaAssetVariantKind,\n type Audio,\n type AudioScript,\n type PhoneticScript,\n type Clip,\n type EntityRef,\n type EntityRelationRows,\n type GeneratedMedia,\n type JsonObject as DslJsonObject,\n type MedeoEntity,\n type RelationKindSpec,\n type Video,\n type Voice,\n} from '@mengine/medeo-dsl';\n\nimport type {\n AuthorableRelationKind,\n CreateEntityInput,\n DeleteEntityInput,\n EntityCommand,\n EntityUpdateInput,\n RelationUpdateInput,\n EntityFacade,\n EntityPlanState,\n EntityStoreSnapshot,\n LinkPhoneticScriptRenderRelationInput,\n LinkAudioScriptSourceRelationInput,\n LinkClipAnchorRelationInput,\n JsonObject,\n LinkGeneratedRelationInput,\n LinkRelationInput,\n RelationFacade,\n ResourceEntityKind,\n SandboxEntity,\n SandboxRelation,\n UnlinkRelationInput,\n UpdateEntityInput,\n} from './entity-contract.ts';\n\nexport type DomainIdFactory = (prefix: 'entity' | 'relation') => string;\n\nexport interface EntitySandboxOptions {\n state?: EntityStoreSnapshot;\n idFactory: DomainIdFactory;\n onCommand?: (command: EntityCommand) => void;\n onTruncate?: (index: number) => void;\n}\n\nconst ASSET_SOURCE_KEY = 'external';\nconst MEMOTA_SYSTEM = 'memota';\n\n/** Mutable entity/relation draft whose only durable product is an explicit command plan. */\nexport class EntitySandbox {\n private readonly original: EntityStoreSnapshot;\n private readonly idFactory: DomainIdFactory;\n private readonly onCommand: ((command: EntityCommand) => void) | undefined;\n private readonly onTruncate: ((index: number) => void) | undefined;\n private state: EntityStoreSnapshot;\n private readonly commands: EntityCommand[] = [];\n\n readonly entities: EntityFacade;\n readonly relations: RelationFacade;\n\n constructor(options: EntitySandboxOptions) {\n this.original = cloneSnapshot(\n options.state ?? { revision: 0, audioScriptEntityId: null, entities: [], relations: [] },\n );\n this.state = cloneSnapshot(this.original);\n this.idFactory = options.idFactory;\n this.onCommand = options.onCommand;\n this.onTruncate = options.onTruncate;\n this.entities = this.buildEntityFacade();\n this.relations = this.buildRelationFacade();\n }\n\n get commandCount(): number {\n return this.commands.length;\n }\n\n getCommands(): readonly EntityCommand[] {\n return this.commands;\n }\n\n /** Host-owned fixed structure is journaled through the same CAS graph as model edits. */\n ensureFoundation(timelinePayload: JsonObject = {}): void {\n const foundation = ensureEditorFoundation(\n toDslRows(this.state),\n this.idFactory,\n timelinePayload,\n this.state.audioScriptEntityId,\n );\n this.appendResourceRows(foundation.rows);\n if (this.state.audioScriptEntityId === null) this.state.audioScriptEntityId = foundation.audioScriptEntityId;\n }\n\n /** Host assembly resolves the text owner before a resource Caption is complete. */\n captionAudioScriptId(entityId: string): string {\n return findComposedAudioScript(toDslRows(this.state), createEntityId(entityId), 'caption').entityId;\n }\n\n get audioScriptEntityId(): string | null {\n return this.state.audioScriptEntityId;\n }\n\n rollbackTo(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index > this.commands.length) {\n throw new Error(`rollbackTo: entity checkpoint index ${index} is past journal length ${this.commands.length}`);\n }\n const prefix = this.commands.slice(0, index);\n this.state = cloneSnapshot(this.original);\n for (const command of prefix) this.apply(command, false);\n this.commands.length = 0;\n this.commands.push(...prefix);\n this.onTruncate?.(index);\n }\n\n buildPlan(): EntityPlanState {\n const rows = toDslRows(this.state);\n decodeEntityRelationRows(rows, numericMarkerComparators);\n // A legacy-only script has no Entity state or Entity edits. Initialized\n // projects and every authored Entity graph must satisfy the project contract.\n if (this.state.revision !== 0 || rows.entities.length !== 0 || this.commands.length !== 0) {\n assertCanonicalEditorResources(rows);\n readDocumentAudioScript({ rows, audioScriptEntityId: this.state.audioScriptEntityId });\n }\n const currentEntityIds = new Set(this.state.entities.map((entity) => entity.entity_id));\n const currentRelationIds = new Set(this.state.relations.map((relation) => relation.relation_id));\n return {\n base_revision: this.original.revision,\n commands: this.commands.slice(),\n rows: cloneSnapshot(this.state),\n deleted_entity_ids: this.original.entities\n .map((entity) => entity.entity_id)\n .filter((entityId) => !currentEntityIds.has(entityId))\n .sort(),\n deleted_relation_ids: this.original.relations\n .map((relation) => relation.relation_id)\n .filter((relationId) => !currentRelationIds.has(relationId))\n .sort(),\n };\n }\n\n renderPreview(): string {\n const lines = [\n `Entity plan: base_revision=${this.original.revision} commands=${this.commands.length} entities=${this.state.entities.length} relations=${this.state.relations.length}`,\n ];\n for (const command of this.commands) {\n switch (command.kind) {\n case 'create-entity':\n lines.push(`+ entity ${command.entity.entity_id} kind=${command.entity.entity_kind}`);\n break;\n case 'change-relation':\n lines.push(`~ relation ${command.relation_id} ${command.changes.map((c) => c.op).join(', ')}`);\n break;\n case 'change-entity':\n lines.push(`~ entity ${command.entity_id} ${command.changes.map((c) => c.op).join(', ')}`);\n break;\n case 'update-entity':\n lines.push(`~ entity ${command.entity_id} payload`);\n break;\n case 'delete-entity':\n lines.push(`- entity ${command.entity_id}`);\n break;\n case 'unlink-relation':\n lines.push(`- relation ${command.relation_id}`);\n break;\n case 'link-relation':\n if (command.relation.relation_kind === 'generated') {\n lines.push(\n `+ relation ${command.relation.relation_id} generated(output=${command.relation.endpoint_0_entity_id}, input=${command.relation.endpoint_1_entity_id})`,\n );\n } else {\n lines.push(\n `+ relation ${command.relation.relation_id} kind=${command.relation.relation_kind} endpoints=${command.relation.endpoint_0_entity_id},${command.relation.endpoint_1_entity_id}`,\n );\n }\n break;\n }\n }\n return lines.join('\\n');\n }\n\n private assembledEntity(entity: SandboxEntity): SandboxEntity {\n const assembled = assembleEntityContent(toDslRows(this.state), createEntityId(entity.entity_id));\n return { ...clone(entity), payload: assembled.payload } as SandboxEntity;\n }\n\n private buildEntityFacade(): EntityFacade {\n return {\n list: () => this.state.entities.map((entity) => this.assembledEntity(entity)),\n get: (entityId) => {\n const entity = this.state.entities.find((candidate) => candidate.entity_id === entityId);\n return entity == null ? null : this.assembledEntity(entity);\n },\n findByAssetId: (assetId) => {\n assertTrimmed(assetId, 'assetId');\n return clone(\n this.state.entities\n .map((entity) => this.assembledEntity(entity))\n .filter(\n (entity): entity is SandboxEntity<ResourceEntityKind> =>\n isMediaAssetVariantKind(entity.entity_kind) && isImportedMemotaAsset(entity.payload, assetId),\n ),\n );\n },\n readCaptionContent: (entityId) => {\n const assembled = assembleCaptionContent(toDslRows(this.state), createEntityId(entityId));\n return clone({\n audio_script_entity_id: assembled.audioScript.entityId,\n text: assembled.text,\n segments: assembled.segments.map((segment) => ({ ...segment })),\n });\n },\n readPhoneticScriptContent: (entityId) => {\n const assembled = assemblePhoneticScriptContent(toDslRows(this.state), createEntityId(entityId));\n const own = assembled.phoneticScript.payload;\n return clone({\n audio_script_entity_id: assembled.audioScript.entityId,\n text: assembled.text,\n segments: assembled.segments.map((segment) => ({ ...segment })),\n ...(typeof own.phonemeScript === 'string' ? { phonemeScript: own.phonemeScript } : {}),\n ...(isJsonObject(own.prosody) ? { prosody: clone(own.prosody) as JsonObject } : {}),\n });\n },\n create: (input) => this.createEntity(input),\n changeFields: (input) => this.changeEntity(input),\n update: (input) => {\n assertTrimmed(input.entity_id, 'entity_id');\n if (!this.state.entities.some((entity) => entity.entity_id === input.entity_id))\n throw new Error(`Entity id \"${input.entity_id}\" does not exist`);\n const updates = updateEntityFields(\n toDslRows(this.state),\n createEntityId(input.entity_id),\n input.payload as DslJsonObject,\n );\n for (const row of updates)\n this.replaceOwnedPayload({ entity_id: row.entityId, payload: row.payload as JsonObject });\n },\n declareFields: (input) => {\n const current = this.state.entities.find((entity) => entity.entity_id === input.entity_id);\n if (current === undefined) throw new Error(`Unknown entity \"${input.entity_id}\"`);\n assembleEntityContent(toDslRows(this.state), createEntityId(input.entity_id));\n const payload = { ...current.payload, ...input.payload };\n const candidate = {\n ...this.state,\n entities: this.state.entities.map((row) =>\n row.entity_id === input.entity_id ? ({ ...row, payload } as SandboxEntity) : row,\n ),\n };\n const rows = toDslRows(candidate);\n for (const row of rows.entities) assembleEntityContent(rows, row.entityId);\n const assembled = assembleEntityContent(rows, createEntityId(input.entity_id));\n const issues = validateEntity(\n createEntityRef({\n ...assembled.payload,\n entityId: assembled.entityId,\n entityKind: assembled.entityKind,\n } as MedeoEntity),\n );\n if (issues.length) throw new Error(issues.map((issue) => issue.message).join('; '));\n this.replaceOwnedPayload({ entity_id: input.entity_id, payload });\n },\n delete: (input) => this.deleteEntity(input),\n ensureMedia: (fact) => this.ensureMedia(fact),\n };\n }\n\n private buildRelationFacade(): RelationFacade {\n return {\n list: () => clone(this.state.relations),\n of: (entityId, relationKind) => {\n assertTrimmed(entityId, 'entityId');\n if (relationKind !== undefined && !builtInRelationSpecs.some((spec) => spec.kind === relationKind)) {\n throw new Error(`Unknown Relation kind \"${relationKind}\"`);\n }\n return clone(\n this.state.relations.filter(\n (relation) =>\n (relation.endpoint_0_entity_id === entityId || relation.endpoint_1_entity_id === entityId) &&\n (relationKind === undefined || relation.relation_kind === relationKind),\n ),\n );\n },\n link: (input) => this.link(input),\n linkGenerated: (input) => this.linkGenerated(input),\n linkClipAnchor: (input) => this.linkClipAnchor(input),\n linkPhoneticScriptRender: (input) => this.linkPhoneticScriptRender(input),\n linkAudioScriptSource: (input) => this.linkAudioScriptSource(input),\n unlink: (input) => this.unlinkRelation(input),\n update: (input) => this.changeRelation(input),\n };\n }\n\n private createEntity(input: CreateEntityInput): string {\n if (!isKnownEntityKind(input.entity_kind)) {\n throw new Error(`Unknown or extension Entity kind \"${String(input.entity_kind)}\"`);\n }\n const payload = clone(input.payload);\n if (!isJsonObject(payload)) throw new Error('Entity payload must contain only JSON values');\n if (input.entity_kind === 'timeline' || input.entity_kind === 'track') {\n const matches = this.state.entities.filter(\n (entity) =>\n entity.entity_kind === input.entity_kind &&\n (input.entity_kind === 'timeline' || entity.payload.role === payload.role),\n );\n if (matches.length > 1) throw new Error(`Ambiguous editor ${input.entity_kind}; resolve existing identities`);\n if (matches[0] !== undefined) return this.reuseEntity(matches[0], input, payload);\n }\n const external = payload.external;\n if (\n isMediaAssetVariantKind(input.entity_kind) &&\n isJsonObject(external) &&\n (external.system === 'memota' || external.system === 'memota-speech') &&\n typeof external.key === 'string'\n ) {\n const matches = this.state.entities.filter(\n (entity) =>\n isMediaAssetVariantKind(entity.entity_kind) &&\n isJsonObject(entity.payload.external) &&\n entity.payload.external.system === external.system &&\n entity.payload.external.key === external.key,\n );\n if (matches.length > 1) throw new Error(`Ambiguous Asset bindings for ${external.key}`);\n const existing = matches[0];\n if (existing !== undefined) {\n if (existing.entity_kind !== input.entity_kind)\n throw new Error(\n `Asset kind conflicts for ${external.key}; cannot change ${existing.entity_kind} to ${input.entity_kind}`,\n );\n return this.reuseEntity(existing, input, payload);\n }\n }\n const entityId = input.entity_id ?? this.idFactory('entity');\n assertTrimmed(entityId, 'entity_id');\n const entity: SandboxEntity = {\n entity_id: entityId,\n entity_kind: input.entity_kind,\n payload,\n };\n const decoded = {\n ...entity.payload,\n entityId: createEntityId(entityId),\n entityKind: entity.entity_kind,\n } as MedeoEntity;\n entityToRow(decoded);\n assembleEntityContent(\n toDslRows({ ...this.state, entities: [...this.state.entities, entity] }),\n createEntityId(entityId),\n );\n this.record({ kind: 'create-entity', entity });\n return entityId;\n }\n\n private reuseEntity(existing: SandboxEntity, input: CreateEntityInput, payload: JsonObject): string {\n if (input.entity_id !== undefined && input.entity_id !== existing.entity_id)\n throw new Error(`Entity already exists; reuse ${existing.entity_id}`);\n for (const [key, value] of Object.entries(payload)) {\n if (existing.payload[key] !== undefined && !sameJson(existing.payload[key], value))\n throw new Error(`Resource facts conflict for ${existing.entity_id}: ${key}`);\n }\n const merged = { ...existing.payload, ...payload };\n if (!sameJson(existing.payload, merged))\n this.replaceOwnedPayload({ entity_id: existing.entity_id, payload: merged });\n return existing.entity_id;\n }\n\n /** Host persistence adapter; never exposed as the DSL field update operation. */\n replaceOwnedPayload(input: UpdateEntityInput): void {\n assertTrimmed(input.entity_id, 'entity_id');\n const payload = clone(input.payload);\n if (!isJsonObject(payload)) throw new Error('Entity payload must contain only JSON values');\n this.record({ kind: 'update-entity', entity_id: input.entity_id, payload });\n }\n\n private changeEntity(input: EntityUpdateInput): void {\n assertFieldChanges(input.changes);\n this.record({ kind: 'change-entity', entity_id: input.entity_id, changes: clone(input.changes) });\n }\n\n private changeRelation(input: RelationUpdateInput): void {\n assertFieldChanges(input.changes);\n this.record({ kind: 'change-relation', relation_id: input.relation_id, changes: clone(input.changes) });\n }\n\n private deleteEntity(input: DeleteEntityInput): void {\n assertTrimmed(input.entity_id, 'entity_id');\n this.record({ kind: 'delete-entity', entity_id: input.entity_id });\n }\n\n private ensureMedia(fact: MediaAssetFact): { contentEntityId: string } {\n const checkpoint = this.commandCount;\n try {\n const imported = importMediaAsset(toDslRows(this.state), fact, this.idFactory);\n this.appendResourceRows(imported.rows);\n return { contentEntityId: imported.contentEntityId };\n } catch (error) {\n this.rollbackTo(checkpoint);\n throw error;\n }\n }\n\n private appendResourceRows(rows: EntityRelationRows): void {\n for (const row of rows.entities) {\n const existing = this.state.entities.find((entity) => entity.entity_id === row.entityId);\n if (existing === undefined) {\n this.createEntity({\n entity_id: row.entityId,\n entity_kind: row.entityKind,\n payload: row.payload,\n } as CreateEntityInput);\n } else if (!sameJson(existing.payload, row.payload)) {\n this.replaceOwnedPayload({ entity_id: row.entityId, payload: clone(row.payload) as JsonObject });\n }\n }\n for (const row of rows.relations) {\n if (this.state.relations.some((relation) => relation.relation_id === row.relationId)) continue;\n if (row.relationKind !== 'timeline-track') throw new Error(`Unexpected resource Relation ${row.relationKind}`);\n this.link({\n relation_id: row.relationId,\n relation_kind: row.relationKind,\n endpoint_0_entity_id: row.endpoint0EntityId,\n endpoint_1_entity_id: row.endpoint1EntityId,\n metadata: clone(row.metadata) as JsonObject,\n trace: clone(row.trace) as JsonObject,\n } as LinkRelationInput);\n }\n }\n\n private link(input: LinkRelationInput): string {\n const spec = builtInRelationSpecs.find((candidate) => candidate.kind === input.relation_kind);\n if (spec == null) throw new Error(`Unknown Relation kind \"${String(input.relation_kind)}\"`);\n const relation = this.relationFromInput(input, input.relation_kind);\n const [first, second] = this.refsFor(relation);\n new BiRelationIndex().linkRuntime({\n relationId: createRelationId(relation.relation_id),\n spec: spec as unknown as RelationKindSpec<AuthorableRelationKind, MedeoEntity, MedeoEntity, DslJsonObject>,\n endpoints: [first, second],\n metadata: relation.metadata,\n trace: relation.trace,\n });\n this.record({ kind: 'link-relation', relation });\n return relation.relation_id;\n }\n\n private linkGenerated(input: LinkGeneratedRelationInput): string {\n const relation = this.relationFromInput(\n {\n ...(input.relation_id !== undefined ? { relation_id: input.relation_id } : {}),\n endpoint_0_entity_id: input.output_entity_id,\n endpoint_1_entity_id: input.input_entity_id,\n metadata: {},\n ...(input.trace !== undefined ? { trace: input.trace } : {}),\n },\n 'generated',\n );\n const [output, source] = this.refsFor(relation);\n new BiRelationIndex().linkGenerated({\n relationId: createRelationId(relation.relation_id),\n output: output as EntityRef<GeneratedMedia>,\n input: source as EntityRef<GeneratedMedia>,\n trace: relation.trace,\n });\n this.record({ kind: 'link-relation', relation });\n return relation.relation_id;\n }\n\n private linkClipAnchor(input: LinkClipAnchorRelationInput): string {\n const relation = this.relationFromInput(\n {\n ...(input.relation_id !== undefined ? { relation_id: input.relation_id } : {}),\n endpoint_0_entity_id: input.child_clip_entity_id,\n endpoint_1_entity_id: input.host_clip_entity_id,\n metadata: {},\n ...(input.trace !== undefined ? { trace: input.trace } : {}),\n },\n 'clip-anchor',\n );\n const [child, host] = this.refsFor(relation);\n new BiRelationIndex().linkClipAnchor({\n relationId: createRelationId(relation.relation_id),\n child: child as EntityRef<Clip>,\n host: host as EntityRef<Clip>,\n trace: relation.trace,\n });\n this.record({ kind: 'link-relation', relation });\n return relation.relation_id;\n }\n\n private linkPhoneticScriptRender(input: LinkPhoneticScriptRenderRelationInput): string {\n const relation = this.relationFromInput(\n {\n ...(input.relation_id !== undefined ? { relation_id: input.relation_id } : {}),\n endpoint_0_entity_id: input.output_entity_id,\n endpoint_1_entity_id: input.phonetic_script_entity_id,\n metadata: {},\n ...(input.trace !== undefined ? { trace: input.trace } : {}),\n },\n 'phonetic-script-render',\n );\n const [output, script] = this.refsFor(relation);\n new BiRelationIndex().linkPhoneticScriptRender({\n relationId: createRelationId(relation.relation_id),\n output: output as EntityRef<Voice>,\n phoneticScript: script as EntityRef<PhoneticScript>,\n trace: relation.trace,\n });\n this.record({ kind: 'link-relation', relation });\n return relation.relation_id;\n }\n\n private linkAudioScriptSource(input: LinkAudioScriptSourceRelationInput): string {\n const relation = this.relationFromInput(\n {\n ...(input.relation_id !== undefined ? { relation_id: input.relation_id } : {}),\n endpoint_0_entity_id: input.script_entity_id,\n endpoint_1_entity_id: input.source_entity_id,\n metadata: {},\n ...(input.trace !== undefined ? { trace: input.trace } : {}),\n },\n 'audio-script-source',\n );\n const [script, source] = this.refsFor(relation);\n new BiRelationIndex().linkAudioScriptSource({\n relationId: createRelationId(relation.relation_id),\n script: script as EntityRef<AudioScript>,\n source: source as EntityRef<Audio | Video | Voice>,\n trace: relation.trace,\n });\n this.record({ kind: 'link-relation', relation });\n return relation.relation_id;\n }\n\n private unlinkRelation(input: UnlinkRelationInput): void {\n assertTrimmed(input.relation_id, 'relation_id');\n this.record({ kind: 'unlink-relation', relation_id: input.relation_id });\n }\n\n private relationFromInput(\n input: {\n relation_id?: string;\n endpoint_0_entity_id: string;\n endpoint_1_entity_id: string;\n metadata?: JsonObject;\n trace?: JsonObject;\n },\n relationKind: SandboxRelation['relation_kind'],\n ): SandboxRelation {\n const relationId = input.relation_id ?? this.idFactory('relation');\n assertTrimmed(relationId, 'relation_id');\n assertTrimmed(input.endpoint_0_entity_id, 'endpoint_0_entity_id');\n assertTrimmed(input.endpoint_1_entity_id, 'endpoint_1_entity_id');\n const metadata = clone(input.metadata ?? {});\n const trace = clone(input.trace ?? {});\n if (!isJsonObject(metadata) || !isJsonObject(trace)) {\n throw new Error('Relation metadata and trace must contain only JSON values');\n }\n return {\n relation_id: relationId,\n relation_kind: relationKind,\n endpoint_0_entity_id: input.endpoint_0_entity_id,\n endpoint_1_entity_id: input.endpoint_1_entity_id,\n metadata,\n trace,\n };\n }\n\n private refsFor(relation: SandboxRelation): readonly [EntityRef, EntityRef] {\n const first = this.state.entities.find((entity) => entity.entity_id === relation.endpoint_0_entity_id);\n const second = this.state.entities.find((entity) => entity.entity_id === relation.endpoint_1_entity_id);\n if (first == null || second == null) {\n const missing = [\n first == null ? relation.endpoint_0_entity_id : null,\n second == null ? relation.endpoint_1_entity_id : null,\n ]\n .filter((value) => value != null)\n .join(', ');\n throw new Error(`Relation references missing Entity id(s): ${missing}`);\n }\n return [createEntityRef(toDslEntity(first)), createEntityRef(toDslEntity(second))];\n }\n\n private record(command: EntityCommand): void {\n this.apply(command, true);\n this.commands.push(clone(command));\n this.onCommand?.(clone(command));\n }\n\n private apply(command: EntityCommand, enforceIdentity: boolean): void {\n switch (command.kind) {\n case 'create-entity': {\n if (enforceIdentity && this.state.entities.some((entity) => entity.entity_id === command.entity.entity_id)) {\n throw new Error(`Entity id \"${command.entity.entity_id}\" already exists`);\n }\n const original = this.original.entities.find((entity) => entity.entity_id === command.entity.entity_id);\n if (enforceIdentity && original != null) {\n throw new Error(\n `Entity id \"${command.entity.entity_id}\" was originally kind \"${original.entity_kind}\" and cannot be recreated as \"${command.entity.entity_kind}\"`,\n );\n }\n this.state.entities.push(clone(command.entity));\n if (command.entity.entity_kind === 'audio-script' && this.state.audioScriptEntityId === null) {\n this.state.audioScriptEntityId = command.entity.entity_id;\n }\n return;\n }\n case 'update-entity': {\n const index = this.state.entities.findIndex((entity) => entity.entity_id === command.entity_id);\n if (index < 0) throw new Error(`Entity id \"${command.entity_id}\" does not exist`);\n const current = this.state.entities[index];\n if (current == null) throw new Error(`Entity id \"${command.entity_id}\" does not exist`);\n this.state.entities[index] = { ...current, payload: clone(command.payload) };\n return;\n }\n case 'change-entity': {\n const original = this.state;\n this.state = cloneSnapshot(original);\n try {\n const touched = new Set<string>([command.entity_id]);\n for (const change of command.changes) {\n if (change.path[0] === 'baseEntityIds' && change.op === 'list.move')\n throw new Error('Composition bases are unordered; list.move is not applicable');\n const owner = resolveEntityFieldOwner(\n toDslRows(this.state),\n createEntityId(command.entity_id),\n change.path[0] as string,\n );\n const row = this.state.entities.find((row) => row.entity_id === owner)!;\n row.payload = applyFieldChanges(row.payload, [change]) as SandboxEntity['payload'];\n touched.add(owner);\n }\n const rows = toDslRows(this.state);\n for (const row of rows.entities) {\n const assembled = assembleEntityContent(rows, row.entityId);\n if (touched.has(row.entityId)) {\n const issues = validateEntity(\n createEntityRef({\n ...assembled.payload,\n entityId: row.entityId,\n entityKind: row.entityKind,\n } as MedeoEntity),\n );\n if (issues.length) throw new Error(issues.map((issue) => issue.message).join('; '));\n }\n }\n } catch (error) {\n this.state = original;\n throw error;\n }\n return;\n }\n case 'change-relation': {\n const index = this.state.relations.findIndex((row) => row.relation_id === command.relation_id);\n if (index < 0) throw new Error(`Unknown relation ${command.relation_id}`);\n for (const change of command.changes) {\n if (!['metadata', 'trace'].includes(change.path[0] as string) || change.path.length < 2)\n throw new Error('Relation changes may only edit metadata or trace fields');\n }\n const current = this.state.relations[index]!;\n const fields = applyFieldChanges({ metadata: current.metadata, trace: current.trace }, command.changes);\n const next = { ...current, metadata: fields.metadata as JsonObject, trace: fields.trace as JsonObject };\n const spec = builtInRelationSpecs.find((spec) => spec.kind === next.relation_kind)!;\n new BiRelationIndex().linkRuntime({\n relationId: createRelationId(next.relation_id),\n spec: spec as unknown as RelationKindSpec<AuthorableRelationKind, MedeoEntity, MedeoEntity, DslJsonObject>,\n endpoints: this.refsFor(next),\n metadata: next.metadata,\n trace: next.trace,\n });\n this.state.relations[index] = next;\n return;\n }\n case 'delete-entity': {\n const target = this.state.entities.find((entity) => entity.entity_id === command.entity_id);\n if (target && (target.entity_kind === 'timeline' || target.entity_id === this.state.audioScriptEntityId)) {\n throw new Error('An entity attached to the project editor cannot be deleted');\n }\n const dependents = this.state.entities.filter(\n (entity) =>\n Array.isArray(entity.payload.baseEntityIds) && entity.payload.baseEntityIds.includes(command.entity_id),\n );\n if (dependents.length)\n throw new Error(\n `Entity ${command.entity_id} is still referenced by variants: ${dependents.map((row) => row.entity_id).join(', ')}`,\n );\n const index = this.state.entities.findIndex((entity) => entity.entity_id === command.entity_id);\n if (index < 0) throw new Error(`Entity id \"${command.entity_id}\" does not exist`);\n const incidentRelationIds = this.state.relations\n .filter(\n (relation) =>\n relation.endpoint_0_entity_id === command.entity_id ||\n relation.endpoint_1_entity_id === command.entity_id,\n )\n .map((relation) => relation.relation_id)\n .sort();\n if (incidentRelationIds.length > 0) {\n throw new Error(\n `Entity id \"${command.entity_id}\" still has incident Relation id(s): ${incidentRelationIds.join(', ')}`,\n );\n }\n this.state.entities.splice(index, 1);\n return;\n }\n case 'link-relation':\n if (\n enforceIdentity &&\n this.state.relations.some((relation) => relation.relation_id === command.relation.relation_id)\n ) {\n throw new Error(`Relation id \"${command.relation.relation_id}\" already exists`);\n }\n if (enforceIdentity) {\n const original = this.original.relations.find(\n (relation) => relation.relation_id === command.relation.relation_id,\n );\n if (\n original != null &&\n (original.relation_kind !== command.relation.relation_kind ||\n original.endpoint_0_entity_id !== command.relation.endpoint_0_entity_id ||\n original.endpoint_1_entity_id !== command.relation.endpoint_1_entity_id)\n ) {\n throw new Error(\n `Relation id \"${command.relation.relation_id}\" cannot change its kind or persisted endpoint positions`,\n );\n }\n }\n this.state.relations.push(clone(command.relation));\n return;\n case 'unlink-relation': {\n const index = this.state.relations.findIndex((relation) => relation.relation_id === command.relation_id);\n if (index < 0) throw new Error(`Relation id \"${command.relation_id}\" does not exist`);\n this.state.relations.splice(index, 1);\n return;\n }\n }\n }\n}\n\nfunction isImportedMemotaAsset(payload: JsonObject, assetId: string): boolean {\n const external = payload[ASSET_SOURCE_KEY];\n return (\n external != null &&\n !Array.isArray(external) &&\n typeof external === 'object' &&\n (external.system === MEMOTA_SYSTEM || external.system === 'memota-speech') &&\n external.key === assetId\n );\n}\n\nfunction toDslEntity(entity: SandboxEntity): MedeoEntity {\n return {\n ...clone(entity.payload),\n entityId: createEntityId(entity.entity_id),\n entityKind: entity.entity_kind,\n } as MedeoEntity;\n}\n\nexport function toDslRows(state: EntityStoreSnapshot): EntityRelationRows {\n return {\n entities: state.entities.map((entity) => ({\n entityId: createEntityId(entity.entity_id),\n entityKind: entity.entity_kind,\n payload: clone(entity.payload),\n })),\n relations: state.relations.map((relation) => ({\n relationId: createRelationId(relation.relation_id),\n relationKind: relation.relation_kind,\n endpoint0EntityId: createEntityId(relation.endpoint_0_entity_id),\n endpoint1EntityId: createEntityId(relation.endpoint_1_entity_id),\n metadata: clone(relation.metadata),\n trace: clone(relation.trace),\n })),\n };\n}\n\nfunction cloneSnapshot(state: EntityStoreSnapshot): EntityStoreSnapshot {\n return clone(state);\n}\n\nfunction clone<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (Array.isArray(left) && Array.isArray(right))\n return left.length === right.length && left.every((value, index) => sameJson(value, right[index]));\n if (!isJsonObject(left) || !isJsonObject(right)) return false;\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => Object.hasOwn(right, key) && sameJson(left[key], right[key]))\n );\n}\n\nfunction assertTrimmed(value: string, label: string): void {\n if (typeof value !== 'string' || value.length === 0 || value.trim() !== value) {\n throw new Error(`${label} must be a non-empty trimmed string`);\n }\n}\n\nconst numericMarkerComparators = {\n compareMarkerPoints: (_marker: unknown, _range: 'source' | 'target', left: unknown, right: unknown) => {\n if (typeof left !== 'number' || !Number.isFinite(left) || typeof right !== 'number' || !Number.isFinite(right)) {\n throw new Error('Sequence Marker points require finite numeric coordinates in the entity sandbox');\n }\n return left - right;\n },\n};\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { C as UpdateEntityInput, S as UnlinkRelationInput, _ as LinkRelationInput, a as DeleteEntityInput, b as SandboxEntity, c as EntitySandboxCheckpoint, d as JsonObject, f as JsonPrimitive, g as LinkGeneratedRelationInput, h as KnownRelationKind, i as CreateEntityInput, l as EntityStoreSnapshot, m as KnownEntityKind, n as BusinessEntityFacade, o as EntityCommand, p as JsonValue, r as BusinessRelationFacade, s as EntityPlanState, t as AuthorableRelationKind, u as EntityUpdateInput, v as RelationUpdateInput, x as SandboxRelation, y as ResourceEntityKind } from "./entity-contract-DQ56Ihrh.mjs";
1
+ import { C as UpdateEntityInput, S as UnlinkRelationInput, _ as LinkRelationInput, a as DeleteEntityInput, b as SandboxEntity, c as EntitySandboxCheckpoint, d as JsonObject, f as JsonPrimitive, g as LinkGeneratedRelationInput, h as KnownRelationKind, i as CreateEntityInput, l as EntityStoreSnapshot, m as KnownEntityKind, n as BusinessEntityFacade, o as EntityCommand, p as JsonValue, r as BusinessRelationFacade, s as EntityPlanState, t as AuthorableRelationKind, u as EntityUpdateInput, v as RelationUpdateInput, x as SandboxRelation, y as ResourceEntityKind } from "./entity-contract-DlmUSouB.mjs";
2
2
  import { JournalEntry, ManualSyncDoc, MediaAssetFact, PartIdFactory, SemanticOpName, VideoDocument, VideoDraft } from "@mengine/medeo-client";
3
3
 
4
4
  //#region src/document/compact-projection.d.ts