@mengine/medeo-tool 2.0.1-alpha.11 → 2.0.1-alpha.13

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.
@@ -30,6 +30,18 @@ type CreateEntityInput = { [K in KnownEntityKind]: {
30
30
  entity_id?: string;
31
31
  entity_kind: K;
32
32
  payload: StoredEntityPayload<K>;
33
+ /**
34
+ * The stored resource this entity is made from.
35
+ *
36
+ * Naming it here is the only way to say where an entity's bytes come from:
37
+ * the Asset row and the `from-asset` Relation that reaches it are assembled
38
+ * by the host, never authored. Only a kind that declares `Asset` — video,
39
+ * audio, image, caption, audio-script, phonetic-script — accepts one.
40
+ */
41
+ asset?: {
42
+ system: 'memota' | 'memota-speech';
43
+ key: string;
44
+ };
33
45
  } }[KnownEntityKind];
34
46
  interface DeleteEntityInput {
35
47
  entity_id: string;
@@ -1,4 +1,4 @@
1
- import { l as EntityStoreSnapshot } from "./entity-contract-Cf3AiSe7.mjs";
1
+ import { l as EntityStoreSnapshot } from "./entity-contract-Dy0cozPt.mjs";
2
2
  import { VideoDocument } from "@mengine/medeo-client";
3
3
 
4
4
  //#region src/sandbox/worker-entry.d.ts
@@ -1,5 +1,5 @@
1
- import { n as toDslRows, r as businessFacades, t as EntitySandbox } from "./entity-sandbox-BTR2cRl1.mjs";
2
- import { LoroEntityDocument, assertCanonicalEditorResources, assertMediaAssetWritePolicy, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetOf, base64ToBytes, bytesToBase64, projectEntityTimeline } from "@mengine/medeo-client";
1
+ import { n as toDslRows, r as businessFacades, t as EntitySandbox } from "./entity-sandbox-CulJBYrI.mjs";
2
+ import { LoroEntityDocument, assertCanonicalEditorResources, assertMediaAssetWritePolicy, audioScriptAssetContent, audioScriptAssetFields, audioScriptAssetOf, base64ToBytes, bytesToBase64, phoneticScriptAssetContent, phoneticScriptAssetHash, phoneticScriptAssetOf, projectEntityTimeline, scriptSourceAssetOf } from "@mengine/medeo-client";
3
3
  import { parentPort, workerData } from "node:worker_threads";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import vm from "node:vm";
@@ -127,10 +127,13 @@ var EntityEditSandboxSession = class {
127
127
  }
128
128
  }
129
129
  /** Direct script writes save a resource before the entity graph can be committed. */
130
- async persistAudioScriptAssets(write) {
130
+ async persistScriptAssets(write) {
131
131
  for (const entity of this.entitySandbox.entities.list()) {
132
132
  if (entity.entity_kind !== "audio-script") continue;
133
- if (audioScriptAssetOf(this.entitySandbox.rows(), entity.entity_id) !== void 0 || !this.directScriptWrites.has(entity.entity_id)) continue;
133
+ const rows = this.entitySandbox.rows();
134
+ if (!this.directScriptWrites.has(entity.entity_id)) continue;
135
+ if (audioScriptAssetOf(rows, entity.entity_id) !== void 0) continue;
136
+ if (scriptSourceAssetOf(rows, entity.entity_id) !== void 0) continue;
134
137
  const content = audioScriptAssetContent(entity.payload);
135
138
  const saved = await write(entity, content);
136
139
  if (JSON.stringify(saved.content) !== JSON.stringify(content)) throw new Error("AudioScript resource writer changed the submitted content");
@@ -139,7 +142,7 @@ var EntityEditSandboxSession = class {
139
142
  key: saved.assetId
140
143
  });
141
144
  this.entitySandbox.relations.link({
142
- relation_kind: "from-asset",
145
+ relation_kind: "to-asset",
143
146
  endpoint_0_entity_id: entity.entity_id,
144
147
  endpoint_1_entity_id: assetEntityId
145
148
  });
@@ -148,6 +151,29 @@ var EntityEditSandboxSession = class {
148
151
  payload: audioScriptAssetFields(entity.payload)
149
152
  });
150
153
  }
154
+ for (const entity of this.entitySandbox.entities.list()) {
155
+ if (entity.entity_kind !== "phonetic-script") continue;
156
+ const rows = this.entitySandbox.rows();
157
+ if (phoneticScriptAssetOf(rows, entity.entity_id) !== void 0) continue;
158
+ if (scriptSourceAssetOf(rows, entity.entity_id) !== void 0) continue;
159
+ const content = phoneticScriptAssetContent(rows, entity.entity_id);
160
+ if (typeof content.text !== "string" || content.text.trim() === "") continue;
161
+ const saved = await write(entity, content);
162
+ if (JSON.stringify(saved.content) !== JSON.stringify(content)) throw new Error("PhoneticScript resource writer changed the submitted content");
163
+ const assetEntityId = this.entitySandbox.entities.ensureAsset({
164
+ system: "memota",
165
+ key: saved.assetId
166
+ });
167
+ this.entitySandbox.relations.link({
168
+ relation_kind: "to-asset",
169
+ endpoint_0_entity_id: entity.entity_id,
170
+ endpoint_1_entity_id: assetEntityId
171
+ });
172
+ this.entitySandbox.entities.declareFields({
173
+ entity_id: entity.entity_id,
174
+ payload: { assetContentHash: phoneticScriptAssetHash(rows, entity.entity_id) }
175
+ });
176
+ }
151
177
  }
152
178
  buildPlan(baseVersion) {
153
179
  const entityPlan = this.entitySandbox.buildPlan();
@@ -386,11 +412,11 @@ async function main() {
386
412
  const invoke = run;
387
413
  post({ t: "ready" });
388
414
  await invoke(session.entities, session.relations, session.checkpoint, session.rollbackTo, data.inputs ?? {}, session.console, async (entityId) => {
389
- await session.persistAudioScriptAssets(writeEntityAsset);
415
+ await session.persistScriptAssets(writeEntityAsset);
390
416
  return session.rgetAssetFromEntity(entityId, loadEntityAsset);
391
417
  });
392
418
  await session.prepareEntityAssets(loadEntityAsset);
393
- await session.persistAudioScriptAssets(writeEntityAsset);
419
+ await session.persistScriptAssets(writeEntityAsset);
394
420
  } catch (error) {
395
421
  post({
396
422
  t: "fail",
@@ -1 +1 @@
1
- {"version":3,"file":"worker-entry.mjs","names":[],"sources":["../src/entity/entity-asset.ts","../src/sandbox/entity-script-session.ts","../src/sandbox/worker-entry.ts"],"sourcesContent":["import type { JsonObject, JsonValue, SandboxEntity } from './entity-contract.ts';\n\n/** Immutable resource content resolved by the host for a document Entity. */\nexport interface EntityAssetContent {\n assetId: string;\n content: JsonValue;\n}\n\n/** Host-only I/O. The sandbox supplies an Entity, never an arbitrary Asset query. */\n/**\n * Resolve one entity's stored resource.\n *\n * The Asset travels with the entity because the locator lives on the Asset\n * alone: an entity made from stored bytes names them through a `from-asset`\n * Relation, never on its own row, so a loader given only the entity would have\n * nothing to look up.\n */\nexport type EntityAssetLoader = (\n docId: string,\n entity: SandboxEntity,\n asset: SandboxEntity,\n) => Promise<EntityAssetContent>;\n\n/** Program-only initial resource creation; never exposed as a sandbox API. */\nexport type EntityAssetWriter = (\n docId: string,\n entity: SandboxEntity,\n content: JsonValue,\n) => Promise<EntityAssetContent>;\n\nexport interface CaptionAssetSegment {\n text: string;\n start_time_ms: number;\n end_time_ms: number;\n}\n\n/** MCAP's output_caption JSON contract; unknown formats never become invented captions. */\nexport function captionAssetSegments(content: JsonValue): CaptionAssetSegment[] {\n if (!content || typeof content !== 'object' || Array.isArray(content) || !Array.isArray(content.segments))\n throw new Error('Caption Asset must contain an output_caption object with segments');\n if (!content.segments.length) throw new Error('Caption Asset contains no speech segments');\n return content.segments.map((value) => {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n typeof value.text !== 'string' ||\n !value.text.trim() ||\n !Number.isSafeInteger(value.start_time_ms) ||\n !Number.isSafeInteger(value.end_time_ms) ||\n (value.start_time_ms as number) < 0 ||\n (value.end_time_ms as number) <= (value.start_time_ms as number)\n )\n throw new Error('Caption Asset has invalid text or millisecond timing');\n return { text: value.text, start_time_ms: value.start_time_ms as number, end_time_ms: value.end_time_ms as number };\n });\n}\n\n/**\n * Persisted voiceover Audio facts, resolved by the host rather than inferred\n * from transcript timing.\n *\n * A returned voice-library descriptor is validated but never written here: the\n * timbre is its own Voice entity linked by a `voice-timbre` Relation, so the\n * rendered Audio row stays resource-only.\n */\nexport function speechAssetFields(content: JsonValue): JsonObject {\n if (\n !content ||\n typeof content !== 'object' ||\n Array.isArray(content) ||\n typeof content.storageKey !== 'string' ||\n !content.storageKey.trim() ||\n !Number.isSafeInteger(content.durationMs) ||\n (content.durationMs as number) <= 0\n )\n throw new Error('Speech Asset requires factual storageKey and positive millisecond duration');\n const voice = content.voice;\n if (\n voice !== undefined &&\n (!voice ||\n typeof voice !== 'object' ||\n Array.isArray(voice) ||\n voice.system !== 'voice-library' ||\n typeof voice.key !== 'string' ||\n !voice.key.trim())\n )\n throw new Error('Speech Asset has an invalid voice-library identity');\n // Where the bytes live is a fact about the Asset; how long they play is a\n // fact about the Audio made from them.\n return { durationMs: content.durationMs };\n}\n\n/** The storage path the speech resource reports, destined for its Asset. */\nexport function speechAssetStorageKey(content: JsonValue): string {\n speechAssetFields(content);\n return (content as { storageKey: string }).storageKey;\n}\n","import {\n LoroEntityDocument,\n audioScriptAssetContent,\n audioScriptAssetFields,\n audioScriptAssetOf,\n projectEntityTimeline,\n base64ToBytes,\n bytesToBase64,\n assertCanonicalEditorResources,\n assertMediaAssetWritePolicy,\n} from '@mengine/medeo-client';\nimport type { EntityRelationRows } from '@mengine/medeo-dsl';\n\nimport { speechAssetFields, speechAssetStorageKey, type EntityAssetContent } from '../entity/entity-asset.ts';\nimport type {\n BusinessEntityFacade,\n BusinessRelationFacade,\n EntitySandboxCheckpoint,\n SandboxEntity,\n JsonObject,\n} from '../entity/entity-contract.ts';\nimport { EntitySandbox, toDslRows, type DomainIdFactory } from '../entity/entity-sandbox.ts';\nimport { businessFacades } from './business-facades.ts';\nimport type { ChangePlan, ConsoleShim, EditSandboxSessionOptions } from './script-session.ts';\n\nconst LOG_LINE_MAX = 2000;\nconst LOG_LINE_CAP = 1000;\nconst LOG_BYTE_CAP = 64 * 1024;\nconst TRUNCATE_MARK = '[truncated]';\nconst LOG_TRUNCATED = '[log truncated]';\n\n/** Entity/relation script session; compilation retains the ordered operation journal. */\nexport class EntityEditSandboxSession {\n private readonly docId: string;\n private readonly entitySandbox: EntitySandbox;\n private readonly baseRows: EntityRelationRows;\n private readonly domainIdFactory: DomainIdFactory;\n private readonly logs: string[] = [];\n private readonly onLog: ((line: string) => void) | undefined;\n private logBytes = 0;\n private readonly directScriptWrites = new Set<string>();\n private logCapped = false;\n\n readonly entities: BusinessEntityFacade;\n readonly relations: BusinessRelationFacade;\n readonly console: ConsoleShim;\n readonly checkpoint: () => EntitySandboxCheckpoint;\n readonly rollbackTo: (cp: EntitySandboxCheckpoint) => void;\n\n // The Entity sandbox edits Entity rows only; the legacy VideoDocument\n // projection is not an input to it (P7M14 separated content from identity).\n constructor(options?: EditSandboxSessionOptions) {\n this.docId = options?.docId ?? '';\n this.baseRows = toDslRows(\n options?.entityState ?? { revision: 0, audioScriptEntityId: null, entities: [], relations: [] },\n );\n this.domainIdFactory =\n options?.domainIdFactory ??\n (() => {\n throw new Error('Entity id factory is unavailable in this sandbox host');\n });\n this.onLog = options?.onLog;\n this.entitySandbox = new EntitySandbox({\n state: options?.entityState,\n idFactory: this.domainIdFactory,\n onCommand: options?.onEntityCommand,\n onTruncate: options?.onEntityTruncate,\n });\n\n const business = businessFacades(this.entitySandbox.entities, this.entitySandbox.relations, (id) =>\n this.directScriptWrites.add(id),\n );\n this.entities = business.entities;\n this.relations = business.relations;\n this.console = this.buildConsoleShim();\n const checkpoints = new Map<EntitySandboxCheckpoint, { index: number; scripts: Set<string> }>();\n this.checkpoint = () => {\n const token = Object.freeze({}) as EntitySandboxCheckpoint;\n checkpoints.set(token, { index: this.entitySandbox.commandCount, scripts: new Set(this.directScriptWrites) });\n return token;\n };\n this.rollbackTo = (cp) => {\n const index = checkpoints.get(cp);\n if (index === undefined) throw new Error('Invalid or expired sandbox checkpoint');\n this.entitySandbox.rollbackTo(index.index);\n this.directScriptWrites.clear();\n for (const id of index.scripts) this.directScriptWrites.add(id);\n let later = false;\n for (const token of checkpoints.keys()) {\n if (later) checkpoints.delete(token);\n if (token === cp) later = true;\n }\n };\n }\n\n /** Resolve only the resource attached to this Entity; I/O remains in the parent host. */\n async rgetAssetFromEntity(\n entityId: string,\n load: (entity: SandboxEntity, asset: SandboxEntity) => Promise<EntityAssetContent>,\n ): Promise<EntityAssetContent> {\n const entity = this.entitySandbox.entities.get(entityId);\n if (!entity || entity.entity_kind === 'asset') throw new Error(`Business Entity not found: ${entityId}`);\n const locator = this.entitySandbox.assetOf(entityId);\n if (!locator || typeof locator.payload.key !== 'string')\n throw new Error(`Entity ${entityId} has no attached Asset`);\n const assetId = locator.payload.key;\n const result = await load(entity, locator);\n if (result.assetId !== assetId) throw new Error('Host returned a different Entity Asset');\n const current = this.entitySandbox.entities.get(entityId);\n if (!current || this.entitySandbox.assetOf(entityId)?.entity_id !== locator.entity_id)\n throw new Error('Entity resource changed during its read');\n if (entity.entity_kind === 'audio' && locator.payload.system === 'memota-speech') {\n const fields = speechAssetFields(result.content);\n // Host declarations initialize nested facts; native compilation writes only\n // their changed leaves against this session's original causal baseline.\n if (Object.entries(fields).some(([key, value]) => JSON.stringify(current.payload[key]) !== JSON.stringify(value)))\n this.entitySandbox.entities.declareFields({ entity_id: entityId, payload: fields });\n this.entitySandbox.entities.declareFields({\n entity_id: locator.entity_id,\n payload: { storageKey: speechAssetStorageKey(result.content) },\n });\n }\n return result;\n }\n\n /** A speech resource is hydrated once its Asset names where the bytes live. */\n private initializedSpeech(asset: SandboxEntity): boolean {\n return typeof asset.payload.storageKey === 'string' && asset.payload.storageKey.trim() !== '';\n }\n\n /** Finish resource initialization before validation; no partial rows are published. */\n async prepareEntityAssets(\n load: (entity: SandboxEntity, asset: SandboxEntity) => Promise<EntityAssetContent>,\n ): Promise<void> {\n for (const entity of this.entitySandbox.entities.list()) {\n const locator = this.entitySandbox.assetOf(entity.entity_id);\n if (typeof locator?.payload.key !== 'string') continue;\n if (\n entity.entity_kind === 'audio' &&\n locator.payload.system === 'memota-speech' &&\n !this.initializedSpeech(locator)\n )\n await this.rgetAssetFromEntity(entity.entity_id, load);\n }\n }\n\n /** Direct script writes save a resource before the entity graph can be committed. */\n async persistAudioScriptAssets(\n write: (\n entity: SandboxEntity,\n content: import('../entity/entity-contract.ts').JsonValue,\n ) => Promise<EntityAssetContent>,\n ): Promise<void> {\n for (const entity of this.entitySandbox.entities.list()) {\n if (entity.entity_kind !== 'audio-script') continue;\n // Existing script resources are versioned by the server after native merge.\n const rows = this.entitySandbox.rows();\n if (audioScriptAssetOf(rows, entity.entity_id) !== undefined || !this.directScriptWrites.has(entity.entity_id))\n continue;\n const content = audioScriptAssetContent(entity.payload) as JsonObject;\n const saved = await write(entity, content);\n if (JSON.stringify(saved.content) !== JSON.stringify(content))\n throw new Error('AudioScript resource writer changed the submitted content');\n // The bytes are named on an Asset entity; the script keeps the fingerprint.\n const assetEntityId = this.entitySandbox.entities.ensureAsset({ system: 'memota', key: saved.assetId });\n this.entitySandbox.relations.link({\n relation_kind: 'from-asset',\n endpoint_0_entity_id: entity.entity_id,\n endpoint_1_entity_id: assetEntityId,\n });\n this.entitySandbox.entities.declareFields({\n entity_id: entity.entity_id,\n payload: audioScriptAssetFields(entity.payload) as JsonObject,\n });\n }\n }\n\n buildPlan(baseVersion: string): ChangePlan {\n const entityPlan = this.entitySandbox.buildPlan();\n assertCanonicalEditorResources(toDslRows(entityPlan.rows));\n assertMediaAssetWritePolicy(this.baseRows, toDslRows(entityPlan.rows));\n if (entityPlan.rows.loroSnapshot) projectEntityTimeline(toDslRows(entityPlan.rows));\n return {\n ...(entityPlan.rows.loroSnapshot\n ? {\n loro_update: bytesToBase64(this.compileJournal(entityPlan)),\n }\n : {}),\n plan_kind: 'entities',\n doc_id: this.docId,\n base_version: baseVersion,\n ops: [],\n entity_base_revision: entityPlan.base_revision,\n entity_commands: entityPlan.commands,\n entity_rows: entityPlan.rows,\n deleted_entity_ids: entityPlan.deleted_entity_ids,\n deleted_relation_ids: entityPlan.deleted_relation_ids,\n preview: this.entitySandbox.renderPreview(),\n logs: this.logs.slice(),\n };\n }\n\n private compileJournal(plan: ReturnType<EntitySandbox['buildPlan']>): Uint8Array {\n const editor = LoroEntityDocument.fromSnapshot(base64ToBytes(plan.rows.loroSnapshot!), (state) => {\n assertCanonicalEditorResources(state.rows);\n projectEntityTimeline(state.rows);\n });\n return editor.transact((draft) => {\n for (const command of plan.commands) {\n switch (command.kind) {\n case 'create-entity': {\n const rows = toDslRows({\n revision: 0,\n audioScriptEntityId: null,\n entities: [command.entity],\n relations: [],\n });\n draft.create(rows.entities[0]!);\n if (\n command.entity.entity_kind === 'audio-script' &&\n command.entity.entity_id === plan.rows.audioScriptEntityId\n )\n draft.attach('audioScriptEntityId', command.entity.entity_id);\n break;\n }\n case 'update-entity':\n draft.replaceOwned(command.entity_id, command.payload);\n break;\n case 'change-entity':\n draft.change(command.entity_id, command.changes);\n break;\n case 'delete-entity':\n draft.delete(command.entity_id);\n break;\n case 'link-relation': {\n const rows = toDslRows({\n revision: 0,\n audioScriptEntityId: null,\n entities: [],\n relations: [command.relation],\n });\n draft.link(rows.relations[0]!);\n break;\n }\n case 'change-relation':\n draft.changeRelation(command.relation_id, command.changes);\n break;\n case 'unlink-relation':\n draft.unlink(command.relation_id);\n break;\n }\n }\n draft.reconcileOrder(toDslRows(plan.rows));\n });\n }\n\n getLogs(): readonly string[] {\n return this.logs;\n }\n\n private appendLog(line: string): void {\n if (this.logCapped) return;\n if (this.logs.length >= LOG_LINE_CAP || this.logBytes >= LOG_BYTE_CAP) {\n this.logs.push(LOG_TRUNCATED);\n this.logCapped = true;\n this.onLog?.(LOG_TRUNCATED);\n return;\n }\n const out =\n line.length > LOG_LINE_MAX ? `${line.slice(0, LOG_LINE_MAX - TRUNCATE_MARK.length)}${TRUNCATE_MARK}` : line;\n this.logs.push(out);\n this.logBytes += out.length;\n this.onLog?.(out);\n }\n\n private buildConsoleShim(): ConsoleShim {\n const write = (...args: unknown[]) => this.appendLog(args.map(formatLogArg).join(' '));\n return { log: write, info: write, warn: write, error: write };\n }\n}\n\nfunction formatLogArg(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return '[unstringifiable]';\n }\n}\n","/// <reference types=\"node\" />\nimport { randomUUID } from 'node:crypto';\nimport vm from 'node:vm';\nimport { parentPort, workerData } from 'node:worker_threads';\n\nimport type { JournalEntry, PartIdFactory, VideoDocument } from '@mengine/medeo-client';\n\nimport type { EntityAssetContent } from '../entity/entity-asset.ts';\nimport type { SandboxEntity } from '../entity/entity-contract.ts';\nimport type { EntityCommand, EntityStoreSnapshot } from '../entity/entity-contract.ts';\nimport type { DomainIdFactory } from '../entity/entity-sandbox.ts';\nimport { EntityEditSandboxSession } from './entity-script-session.ts';\nimport { type EditSandboxSessionOptions } from './script-session.ts';\n\n/**\n * Node worker entry for trusted edit scripts.\n *\n * Spawns the requested sandbox session, runs the agent script in a bare `vm`\n * context (no fetch/process/setTimeout), and streams journals + logs to the\n * host so hard timeout / OOM termination still preserves partial products.\n */\n\nexport interface WorkerData {\n docId: string;\n document: VideoDocument;\n script: string;\n inputs?: Record<string, unknown>;\n entityState?: EntityStoreSnapshot;\n idLabel?: string;\n}\n\ntype HostMessage =\n | { t: 'entity-asset'; requestId: number; entity: SandboxEntity }\n | { t: 'write-entity-asset'; requestId: number; entity: SandboxEntity; content: EntityAssetContent['content'] }\n | { t: 'ready' }\n | { t: 'entry'; entry: JournalEntry }\n | { t: 'entity-entry'; command: EntityCommand }\n | { t: 'log'; line: string }\n | { t: 'truncate'; index: number }\n | { t: 'entity-truncate'; index: number }\n | {\n t: 'done';\n preview: string;\n opsCount: number;\n entityCommandsCount: number;\n loroUpdate?: string;\n entityBaseRevision: number;\n entityRows?: EntityStoreSnapshot;\n deletedEntityIds: readonly string[];\n deletedRelationIds: readonly string[];\n planKind: 'timeline' | 'entities';\n }\n | {\n t: 'fail';\n phase: 'parse' | 'runtime';\n error: { message: string; line?: number; column?: number; stack?: string };\n };\n\nconst data = workerData as WorkerData;\nif (parentPort == null) {\n throw new Error('worker-entry must run inside a worker_threads Worker');\n}\nconst port = parentPort;\nlet requestId = 0;\nconst pending = new Map<number, { resolve: (result: EntityAssetContent) => void; reject: (error: Error) => void }>();\nport.on('message', (message: { t: string; requestId: number; result: EntityAssetContent; error?: string }) => {\n if (message.t !== 'entity-asset-result') return;\n const waiter = pending.get(message.requestId);\n pending.delete(message.requestId);\n if (message.error) waiter?.reject(new Error(message.error));\n else waiter?.resolve(message.result);\n});\nfunction loadEntityAsset(entity: SandboxEntity, asset: SandboxEntity): Promise<EntityAssetContent> {\n return new Promise((resolve, reject) => {\n const id = ++requestId;\n pending.set(id, { resolve, reject });\n port.postMessage({ t: 'entity-asset', requestId: id, entity, asset });\n });\n}\n\nfunction writeEntityAsset(entity: SandboxEntity, content: EntityAssetContent['content']): Promise<EntityAssetContent> {\n return new Promise((resolve, reject) => {\n const id = ++requestId;\n pending.set(id, { resolve, reject });\n port.postMessage({ t: 'write-entity-asset', requestId: id, entity, content });\n });\n}\n\nfunction post(message: HostMessage): void {\n port.postMessage(message);\n}\n\nfunction countingFactory(label: string): PartIdFactory {\n let n = 0;\n return (prefix) => `${prefix}_${label}${++n}`;\n}\n\nfunction domainIdFactory(label?: string): DomainIdFactory {\n let n = 0;\n return (prefix) => `${prefix}_${label == null ? randomUUID() : `${label}${++n}`}`;\n}\n\n/** Extract script line/column from the first `agent-script.js` stack frame. */\nfunction positionFromError(\n error: unknown,\n script?: string,\n phase?: 'parse' | 'runtime',\n): { line?: number; column?: number; stack?: string; message: string } {\n // Duck-type: vm SyntaxError in a worker may fail `instanceof Error` across realms.\n const obj = error != null && typeof error === 'object' ? (error as Record<string, unknown>) : null;\n const message =\n obj != null && typeof obj.message === 'string'\n ? obj.message\n : error instanceof Error\n ? error.message\n : String(error);\n const stack = obj != null && typeof obj.stack === 'string' ? obj.stack : undefined;\n\n let line = typeof obj?.lineNumber === 'number' ? obj.lineNumber : undefined;\n let column = typeof obj?.columnNumber === 'number' ? obj.columnNumber : undefined;\n\n if (stack != null) {\n // Prefer the header form `agent-script.js:N` (SyntaxError) or `agent-script.js:N:M`.\n const match = /agent-script\\.js:(\\d+)(?::(\\d+))?/.exec(stack);\n if (match != null) {\n line = Number(match[1]);\n if (match[2] != null) column = Number(match[2]);\n }\n }\n\n // Parse-phase refinement: V8 often points at the token after an unclosed\n // `{`/`(`/`[`; walk back one line when the previous line ends that way so\n // the reported line matches the agent-authored incomplete construct.\n if (phase === 'parse' && script != null && line != null && line >= 2) {\n const lines = script.split('\\n');\n const prev = lines[line - 2];\n if (prev != null && /[{([]\\s*$/.test(prev)) {\n line = line - 1;\n column = prev.length;\n }\n }\n\n return { message, line, column, stack };\n}\n\nasync function main(): Promise<void> {\n const idFactory = data.idLabel != null ? countingFactory(data.idLabel) : undefined;\n const options: EditSandboxSessionOptions = {\n docId: data.docId,\n idFactory,\n entityState: data.entityState,\n domainIdFactory: domainIdFactory(data.idLabel),\n onEntry: (entry) => post({ t: 'entry', entry }),\n onEntityCommand: (command) => post({ t: 'entity-entry', command }),\n onLog: (line) => post({ t: 'log', line }),\n onTruncate: (index) => post({ t: 'truncate', index }),\n onEntityTruncate: (index) => post({ t: 'entity-truncate', index }),\n };\n const session = new EntityEditSandboxSession(options);\n\n // Prelude stays on the same physical line as script line 1 so stack line\n // numbers map 1:1 onto the agent script (no leading newline).\n const wrapped = `(async (entities, relations, checkpoint, rollbackTo, inputs, console, rgetAssetFromEntity) => {${data.script}\\n})`;\n\n const ctx = vm.createContext(Object.create(null) as Record<string, unknown>);\n\n let run: unknown;\n try {\n run = vm.runInContext(wrapped, ctx, { filename: 'agent-script.js' });\n } catch (error) {\n const pos = positionFromError(error, data.script, 'parse');\n post({ t: 'fail', phase: 'parse', error: pos });\n return;\n }\n\n if (typeof run !== 'function') {\n post({\n t: 'fail',\n phase: 'runtime',\n error: { message: 'agent script wrapper did not evaluate to a function' },\n });\n return;\n }\n\n try {\n const invoke = run as (\n entities: typeof session.entities,\n relations: typeof session.relations,\n checkpoint: typeof session.checkpoint,\n rollbackTo: typeof session.rollbackTo,\n inputs: Record<string, unknown>,\n console: typeof session.console,\n rgetAssetFromEntity: (entityId: string) => Promise<EntityAssetContent>,\n ) => Promise<unknown>;\n // Signal host that cold start is done; timeout wall-clock starts here.\n post({ t: 'ready' });\n await invoke(\n session.entities,\n session.relations,\n session.checkpoint,\n session.rollbackTo,\n data.inputs ?? {},\n session.console,\n async (entityId) => {\n await session.persistAudioScriptAssets(writeEntityAsset);\n return session.rgetAssetFromEntity(entityId, loadEntityAsset);\n },\n );\n await session.prepareEntityAssets(loadEntityAsset);\n await session.persistAudioScriptAssets(writeEntityAsset);\n } catch (error) {\n const pos = positionFromError(error, data.script, 'runtime');\n post({ t: 'fail', phase: 'runtime', error: pos });\n return;\n }\n\n const plan = session.buildPlan('');\n post({\n t: 'done',\n ...(plan.loro_update ? { loroUpdate: plan.loro_update } : {}),\n preview: plan.preview,\n opsCount: plan.ops.length,\n entityCommandsCount: plan.entity_commands.length,\n entityBaseRevision: plan.entity_base_revision,\n ...(plan.entity_rows !== undefined ? { entityRows: plan.entity_rows } : {}),\n deletedEntityIds: plan.deleted_entity_ids ?? [],\n deletedRelationIds: plan.deleted_relation_ids ?? [],\n planKind: plan.plan_kind,\n });\n}\n\nmain().catch((error: unknown) => {\n const pos = positionFromError(error);\n post({ t: 'fail', phase: 'runtime', error: pos });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"worker-entry.mjs","names":[],"sources":["../src/entity/entity-asset.ts","../src/sandbox/entity-script-session.ts","../src/sandbox/worker-entry.ts"],"sourcesContent":["import type { JsonObject, JsonValue, SandboxEntity } from './entity-contract.ts';\n\n/** Immutable resource content resolved by the host for a document Entity. */\nexport interface EntityAssetContent {\n assetId: string;\n content: JsonValue;\n}\n\n/** Host-only I/O. The sandbox supplies an Entity, never an arbitrary Asset query. */\n/**\n * Resolve one entity's stored resource.\n *\n * The Asset travels with the entity because the locator lives on the Asset\n * alone: an entity made from stored bytes names them through a `from-asset`\n * Relation, never on its own row, so a loader given only the entity would have\n * nothing to look up.\n */\nexport type EntityAssetLoader = (\n docId: string,\n entity: SandboxEntity,\n asset: SandboxEntity,\n) => Promise<EntityAssetContent>;\n\n/** Program-only initial resource creation; never exposed as a sandbox API. */\nexport type EntityAssetWriter = (\n docId: string,\n entity: SandboxEntity,\n content: JsonValue,\n) => Promise<EntityAssetContent>;\n\nexport interface CaptionAssetSegment {\n text: string;\n start_time_ms: number;\n end_time_ms: number;\n}\n\n/** MCAP's output_caption JSON contract; unknown formats never become invented captions. */\nexport function captionAssetSegments(content: JsonValue): CaptionAssetSegment[] {\n if (!content || typeof content !== 'object' || Array.isArray(content) || !Array.isArray(content.segments))\n throw new Error('Caption Asset must contain an output_caption object with segments');\n if (!content.segments.length) throw new Error('Caption Asset contains no speech segments');\n return content.segments.map((value) => {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n typeof value.text !== 'string' ||\n !value.text.trim() ||\n !Number.isSafeInteger(value.start_time_ms) ||\n !Number.isSafeInteger(value.end_time_ms) ||\n (value.start_time_ms as number) < 0 ||\n (value.end_time_ms as number) <= (value.start_time_ms as number)\n )\n throw new Error('Caption Asset has invalid text or millisecond timing');\n return { text: value.text, start_time_ms: value.start_time_ms as number, end_time_ms: value.end_time_ms as number };\n });\n}\n\n/**\n * Persisted voiceover Audio facts, resolved by the host rather than inferred\n * from transcript timing.\n *\n * A returned voice-library descriptor is validated but never written here: the\n * timbre is its own Voice entity linked by a `voice-timbre` Relation, so the\n * rendered Audio row stays resource-only.\n */\nexport function speechAssetFields(content: JsonValue): JsonObject {\n if (\n !content ||\n typeof content !== 'object' ||\n Array.isArray(content) ||\n typeof content.storageKey !== 'string' ||\n !content.storageKey.trim() ||\n !Number.isSafeInteger(content.durationMs) ||\n (content.durationMs as number) <= 0\n )\n throw new Error('Speech Asset requires factual storageKey and positive millisecond duration');\n const voice = content.voice;\n if (\n voice !== undefined &&\n (!voice ||\n typeof voice !== 'object' ||\n Array.isArray(voice) ||\n voice.system !== 'voice-library' ||\n typeof voice.key !== 'string' ||\n !voice.key.trim())\n )\n throw new Error('Speech Asset has an invalid voice-library identity');\n // Where the bytes live is a fact about the Asset; how long they play is a\n // fact about the Audio made from them.\n return { durationMs: content.durationMs };\n}\n\n/** The storage path the speech resource reports, destined for its Asset. */\nexport function speechAssetStorageKey(content: JsonValue): string {\n speechAssetFields(content);\n return (content as { storageKey: string }).storageKey;\n}\n","import {\n LoroEntityDocument,\n audioScriptAssetContent,\n audioScriptAssetFields,\n audioScriptAssetOf,\n phoneticScriptAssetContent,\n phoneticScriptAssetHash,\n phoneticScriptAssetOf,\n projectEntityTimeline,\n scriptSourceAssetOf,\n base64ToBytes,\n bytesToBase64,\n assertCanonicalEditorResources,\n assertMediaAssetWritePolicy,\n} from '@mengine/medeo-client';\nimport type { EntityRelationRows } from '@mengine/medeo-dsl';\n\nimport { speechAssetFields, speechAssetStorageKey, type EntityAssetContent } from '../entity/entity-asset.ts';\nimport type {\n BusinessEntityFacade,\n BusinessRelationFacade,\n EntitySandboxCheckpoint,\n SandboxEntity,\n JsonObject,\n} from '../entity/entity-contract.ts';\nimport { EntitySandbox, toDslRows, type DomainIdFactory } from '../entity/entity-sandbox.ts';\nimport { businessFacades } from './business-facades.ts';\nimport type { ChangePlan, ConsoleShim, EditSandboxSessionOptions } from './script-session.ts';\n\nconst LOG_LINE_MAX = 2000;\nconst LOG_LINE_CAP = 1000;\nconst LOG_BYTE_CAP = 64 * 1024;\nconst TRUNCATE_MARK = '[truncated]';\nconst LOG_TRUNCATED = '[log truncated]';\n\n/** Entity/relation script session; compilation retains the ordered operation journal. */\nexport class EntityEditSandboxSession {\n private readonly docId: string;\n private readonly entitySandbox: EntitySandbox;\n private readonly baseRows: EntityRelationRows;\n private readonly domainIdFactory: DomainIdFactory;\n private readonly logs: string[] = [];\n private readonly onLog: ((line: string) => void) | undefined;\n private logBytes = 0;\n private readonly directScriptWrites = new Set<string>();\n private logCapped = false;\n\n readonly entities: BusinessEntityFacade;\n readonly relations: BusinessRelationFacade;\n readonly console: ConsoleShim;\n readonly checkpoint: () => EntitySandboxCheckpoint;\n readonly rollbackTo: (cp: EntitySandboxCheckpoint) => void;\n\n // The Entity sandbox edits Entity rows only; the legacy VideoDocument\n // projection is not an input to it (P7M14 separated content from identity).\n constructor(options?: EditSandboxSessionOptions) {\n this.docId = options?.docId ?? '';\n this.baseRows = toDslRows(\n options?.entityState ?? { revision: 0, audioScriptEntityId: null, entities: [], relations: [] },\n );\n this.domainIdFactory =\n options?.domainIdFactory ??\n (() => {\n throw new Error('Entity id factory is unavailable in this sandbox host');\n });\n this.onLog = options?.onLog;\n this.entitySandbox = new EntitySandbox({\n state: options?.entityState,\n idFactory: this.domainIdFactory,\n onCommand: options?.onEntityCommand,\n onTruncate: options?.onEntityTruncate,\n });\n\n const business = businessFacades(this.entitySandbox.entities, this.entitySandbox.relations, (id) =>\n this.directScriptWrites.add(id),\n );\n this.entities = business.entities;\n this.relations = business.relations;\n this.console = this.buildConsoleShim();\n const checkpoints = new Map<EntitySandboxCheckpoint, { index: number; scripts: Set<string> }>();\n this.checkpoint = () => {\n const token = Object.freeze({}) as EntitySandboxCheckpoint;\n checkpoints.set(token, { index: this.entitySandbox.commandCount, scripts: new Set(this.directScriptWrites) });\n return token;\n };\n this.rollbackTo = (cp) => {\n const index = checkpoints.get(cp);\n if (index === undefined) throw new Error('Invalid or expired sandbox checkpoint');\n this.entitySandbox.rollbackTo(index.index);\n this.directScriptWrites.clear();\n for (const id of index.scripts) this.directScriptWrites.add(id);\n let later = false;\n for (const token of checkpoints.keys()) {\n if (later) checkpoints.delete(token);\n if (token === cp) later = true;\n }\n };\n }\n\n /** Resolve only the resource attached to this Entity; I/O remains in the parent host. */\n async rgetAssetFromEntity(\n entityId: string,\n load: (entity: SandboxEntity, asset: SandboxEntity) => Promise<EntityAssetContent>,\n ): Promise<EntityAssetContent> {\n const entity = this.entitySandbox.entities.get(entityId);\n if (!entity || entity.entity_kind === 'asset') throw new Error(`Business Entity not found: ${entityId}`);\n const locator = this.entitySandbox.assetOf(entityId);\n if (!locator || typeof locator.payload.key !== 'string')\n throw new Error(`Entity ${entityId} has no attached Asset`);\n const assetId = locator.payload.key;\n const result = await load(entity, locator);\n if (result.assetId !== assetId) throw new Error('Host returned a different Entity Asset');\n const current = this.entitySandbox.entities.get(entityId);\n if (!current || this.entitySandbox.assetOf(entityId)?.entity_id !== locator.entity_id)\n throw new Error('Entity resource changed during its read');\n if (entity.entity_kind === 'audio' && locator.payload.system === 'memota-speech') {\n const fields = speechAssetFields(result.content);\n // Host declarations initialize nested facts; native compilation writes only\n // their changed leaves against this session's original causal baseline.\n if (Object.entries(fields).some(([key, value]) => JSON.stringify(current.payload[key]) !== JSON.stringify(value)))\n this.entitySandbox.entities.declareFields({ entity_id: entityId, payload: fields });\n this.entitySandbox.entities.declareFields({\n entity_id: locator.entity_id,\n payload: { storageKey: speechAssetStorageKey(result.content) },\n });\n }\n return result;\n }\n\n /** A speech resource is hydrated once its Asset names where the bytes live. */\n private initializedSpeech(asset: SandboxEntity): boolean {\n return typeof asset.payload.storageKey === 'string' && asset.payload.storageKey.trim() !== '';\n }\n\n /** Finish resource initialization before validation; no partial rows are published. */\n async prepareEntityAssets(\n load: (entity: SandboxEntity, asset: SandboxEntity) => Promise<EntityAssetContent>,\n ): Promise<void> {\n for (const entity of this.entitySandbox.entities.list()) {\n const locator = this.entitySandbox.assetOf(entity.entity_id);\n if (typeof locator?.payload.key !== 'string') continue;\n if (\n entity.entity_kind === 'audio' &&\n locator.payload.system === 'memota-speech' &&\n !this.initializedSpeech(locator)\n )\n await this.rgetAssetFromEntity(entity.entity_id, load);\n }\n }\n\n /** Direct script writes save a resource before the entity graph can be committed. */\n async persistScriptAssets(\n write: (\n entity: SandboxEntity,\n content: import('../entity/entity-contract.ts').JsonValue,\n ) => Promise<EntityAssetContent>,\n ): Promise<void> {\n for (const entity of this.entitySandbox.entities.list()) {\n if (entity.entity_kind !== 'audio-script') continue;\n // Existing script resources are versioned by the server after native merge.\n const rows = this.entitySandbox.rows();\n if (!this.directScriptWrites.has(entity.entity_id)) continue;\n if (audioScriptAssetOf(rows, entity.entity_id) !== undefined) continue;\n if (scriptSourceAssetOf(rows, entity.entity_id) !== undefined) continue;\n const content = audioScriptAssetContent(entity.payload) as JsonObject;\n const saved = await write(entity, content);\n if (JSON.stringify(saved.content) !== JSON.stringify(content))\n throw new Error('AudioScript resource writer changed the submitted content');\n // The snapshot is the script's own content written out, so it is reached\n // by to-asset; the script keeps the fingerprint of what was written.\n const assetEntityId = this.entitySandbox.entities.ensureAsset({ system: 'memota', key: saved.assetId });\n this.entitySandbox.relations.link({\n relation_kind: 'to-asset',\n endpoint_0_entity_id: entity.entity_id,\n endpoint_1_entity_id: assetEntityId,\n });\n this.entitySandbox.entities.declareFields({\n entity_id: entity.entity_id,\n payload: audioScriptAssetFields(entity.payload) as JsonObject,\n });\n }\n\n // A pronunciation variant's content is the model's to write, but synthesis\n // does not handle entities: the bytes have to leave the graph to reach it.\n // Writing them down here is that crossing, and it is why generated speech\n // can only come from a PhoneticScript.\n for (const entity of this.entitySandbox.entities.list()) {\n if (entity.entity_kind !== 'phonetic-script') continue;\n const rows = this.entitySandbox.rows();\n // A variant read from a transcript already names its bytes — the caption\n // resource it was transcribed from — so nothing is written for it. Only a\n // variant the model wrote needs bytes of its own, and those bytes are what\n // synthesis is given instead of a string.\n if (phoneticScriptAssetOf(rows, entity.entity_id) !== undefined) continue;\n if (scriptSourceAssetOf(rows, entity.entity_id) !== undefined) continue;\n const content = phoneticScriptAssetContent(rows, entity.entity_id) as JsonObject;\n if (typeof content.text !== 'string' || content.text.trim() === '') continue;\n const saved = await write(entity, content);\n if (JSON.stringify(saved.content) !== JSON.stringify(content))\n throw new Error('PhoneticScript resource writer changed the submitted content');\n const assetEntityId = this.entitySandbox.entities.ensureAsset({ system: 'memota', key: saved.assetId });\n this.entitySandbox.relations.link({\n relation_kind: 'to-asset',\n endpoint_0_entity_id: entity.entity_id,\n endpoint_1_entity_id: assetEntityId,\n });\n this.entitySandbox.entities.declareFields({\n entity_id: entity.entity_id,\n payload: { assetContentHash: phoneticScriptAssetHash(rows, entity.entity_id) },\n });\n }\n }\n\n buildPlan(baseVersion: string): ChangePlan {\n const entityPlan = this.entitySandbox.buildPlan();\n assertCanonicalEditorResources(toDslRows(entityPlan.rows));\n assertMediaAssetWritePolicy(this.baseRows, toDslRows(entityPlan.rows));\n if (entityPlan.rows.loroSnapshot) projectEntityTimeline(toDslRows(entityPlan.rows));\n return {\n ...(entityPlan.rows.loroSnapshot\n ? {\n loro_update: bytesToBase64(this.compileJournal(entityPlan)),\n }\n : {}),\n plan_kind: 'entities',\n doc_id: this.docId,\n base_version: baseVersion,\n ops: [],\n entity_base_revision: entityPlan.base_revision,\n entity_commands: entityPlan.commands,\n entity_rows: entityPlan.rows,\n deleted_entity_ids: entityPlan.deleted_entity_ids,\n deleted_relation_ids: entityPlan.deleted_relation_ids,\n preview: this.entitySandbox.renderPreview(),\n logs: this.logs.slice(),\n };\n }\n\n private compileJournal(plan: ReturnType<EntitySandbox['buildPlan']>): Uint8Array {\n const editor = LoroEntityDocument.fromSnapshot(base64ToBytes(plan.rows.loroSnapshot!), (state) => {\n assertCanonicalEditorResources(state.rows);\n projectEntityTimeline(state.rows);\n });\n return editor.transact((draft) => {\n for (const command of plan.commands) {\n switch (command.kind) {\n case 'create-entity': {\n const rows = toDslRows({\n revision: 0,\n audioScriptEntityId: null,\n entities: [command.entity],\n relations: [],\n });\n draft.create(rows.entities[0]!);\n if (\n command.entity.entity_kind === 'audio-script' &&\n command.entity.entity_id === plan.rows.audioScriptEntityId\n )\n draft.attach('audioScriptEntityId', command.entity.entity_id);\n break;\n }\n case 'update-entity':\n draft.replaceOwned(command.entity_id, command.payload);\n break;\n case 'change-entity':\n draft.change(command.entity_id, command.changes);\n break;\n case 'delete-entity':\n draft.delete(command.entity_id);\n break;\n case 'link-relation': {\n const rows = toDslRows({\n revision: 0,\n audioScriptEntityId: null,\n entities: [],\n relations: [command.relation],\n });\n draft.link(rows.relations[0]!);\n break;\n }\n case 'change-relation':\n draft.changeRelation(command.relation_id, command.changes);\n break;\n case 'unlink-relation':\n draft.unlink(command.relation_id);\n break;\n }\n }\n draft.reconcileOrder(toDslRows(plan.rows));\n });\n }\n\n getLogs(): readonly string[] {\n return this.logs;\n }\n\n private appendLog(line: string): void {\n if (this.logCapped) return;\n if (this.logs.length >= LOG_LINE_CAP || this.logBytes >= LOG_BYTE_CAP) {\n this.logs.push(LOG_TRUNCATED);\n this.logCapped = true;\n this.onLog?.(LOG_TRUNCATED);\n return;\n }\n const out =\n line.length > LOG_LINE_MAX ? `${line.slice(0, LOG_LINE_MAX - TRUNCATE_MARK.length)}${TRUNCATE_MARK}` : line;\n this.logs.push(out);\n this.logBytes += out.length;\n this.onLog?.(out);\n }\n\n private buildConsoleShim(): ConsoleShim {\n const write = (...args: unknown[]) => this.appendLog(args.map(formatLogArg).join(' '));\n return { log: write, info: write, warn: write, error: write };\n }\n}\n\nfunction formatLogArg(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean' || value === null || value === undefined) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return '[unstringifiable]';\n }\n}\n","/// <reference types=\"node\" />\nimport { randomUUID } from 'node:crypto';\nimport vm from 'node:vm';\nimport { parentPort, workerData } from 'node:worker_threads';\n\nimport type { JournalEntry, PartIdFactory, VideoDocument } from '@mengine/medeo-client';\n\nimport type { EntityAssetContent } from '../entity/entity-asset.ts';\nimport type { SandboxEntity } from '../entity/entity-contract.ts';\nimport type { EntityCommand, EntityStoreSnapshot } from '../entity/entity-contract.ts';\nimport type { DomainIdFactory } from '../entity/entity-sandbox.ts';\nimport { EntityEditSandboxSession } from './entity-script-session.ts';\nimport { type EditSandboxSessionOptions } from './script-session.ts';\n\n/**\n * Node worker entry for trusted edit scripts.\n *\n * Spawns the requested sandbox session, runs the agent script in a bare `vm`\n * context (no fetch/process/setTimeout), and streams journals + logs to the\n * host so hard timeout / OOM termination still preserves partial products.\n */\n\nexport interface WorkerData {\n docId: string;\n document: VideoDocument;\n script: string;\n inputs?: Record<string, unknown>;\n entityState?: EntityStoreSnapshot;\n idLabel?: string;\n}\n\ntype HostMessage =\n | { t: 'entity-asset'; requestId: number; entity: SandboxEntity }\n | { t: 'write-entity-asset'; requestId: number; entity: SandboxEntity; content: EntityAssetContent['content'] }\n | { t: 'ready' }\n | { t: 'entry'; entry: JournalEntry }\n | { t: 'entity-entry'; command: EntityCommand }\n | { t: 'log'; line: string }\n | { t: 'truncate'; index: number }\n | { t: 'entity-truncate'; index: number }\n | {\n t: 'done';\n preview: string;\n opsCount: number;\n entityCommandsCount: number;\n loroUpdate?: string;\n entityBaseRevision: number;\n entityRows?: EntityStoreSnapshot;\n deletedEntityIds: readonly string[];\n deletedRelationIds: readonly string[];\n planKind: 'timeline' | 'entities';\n }\n | {\n t: 'fail';\n phase: 'parse' | 'runtime';\n error: { message: string; line?: number; column?: number; stack?: string };\n };\n\nconst data = workerData as WorkerData;\nif (parentPort == null) {\n throw new Error('worker-entry must run inside a worker_threads Worker');\n}\nconst port = parentPort;\nlet requestId = 0;\nconst pending = new Map<number, { resolve: (result: EntityAssetContent) => void; reject: (error: Error) => void }>();\nport.on('message', (message: { t: string; requestId: number; result: EntityAssetContent; error?: string }) => {\n if (message.t !== 'entity-asset-result') return;\n const waiter = pending.get(message.requestId);\n pending.delete(message.requestId);\n if (message.error) waiter?.reject(new Error(message.error));\n else waiter?.resolve(message.result);\n});\nfunction loadEntityAsset(entity: SandboxEntity, asset: SandboxEntity): Promise<EntityAssetContent> {\n return new Promise((resolve, reject) => {\n const id = ++requestId;\n pending.set(id, { resolve, reject });\n port.postMessage({ t: 'entity-asset', requestId: id, entity, asset });\n });\n}\n\nfunction writeEntityAsset(entity: SandboxEntity, content: EntityAssetContent['content']): Promise<EntityAssetContent> {\n return new Promise((resolve, reject) => {\n const id = ++requestId;\n pending.set(id, { resolve, reject });\n port.postMessage({ t: 'write-entity-asset', requestId: id, entity, content });\n });\n}\n\nfunction post(message: HostMessage): void {\n port.postMessage(message);\n}\n\nfunction countingFactory(label: string): PartIdFactory {\n let n = 0;\n return (prefix) => `${prefix}_${label}${++n}`;\n}\n\nfunction domainIdFactory(label?: string): DomainIdFactory {\n let n = 0;\n return (prefix) => `${prefix}_${label == null ? randomUUID() : `${label}${++n}`}`;\n}\n\n/** Extract script line/column from the first `agent-script.js` stack frame. */\nfunction positionFromError(\n error: unknown,\n script?: string,\n phase?: 'parse' | 'runtime',\n): { line?: number; column?: number; stack?: string; message: string } {\n // Duck-type: vm SyntaxError in a worker may fail `instanceof Error` across realms.\n const obj = error != null && typeof error === 'object' ? (error as Record<string, unknown>) : null;\n const message =\n obj != null && typeof obj.message === 'string'\n ? obj.message\n : error instanceof Error\n ? error.message\n : String(error);\n const stack = obj != null && typeof obj.stack === 'string' ? obj.stack : undefined;\n\n let line = typeof obj?.lineNumber === 'number' ? obj.lineNumber : undefined;\n let column = typeof obj?.columnNumber === 'number' ? obj.columnNumber : undefined;\n\n if (stack != null) {\n // Prefer the header form `agent-script.js:N` (SyntaxError) or `agent-script.js:N:M`.\n const match = /agent-script\\.js:(\\d+)(?::(\\d+))?/.exec(stack);\n if (match != null) {\n line = Number(match[1]);\n if (match[2] != null) column = Number(match[2]);\n }\n }\n\n // Parse-phase refinement: V8 often points at the token after an unclosed\n // `{`/`(`/`[`; walk back one line when the previous line ends that way so\n // the reported line matches the agent-authored incomplete construct.\n if (phase === 'parse' && script != null && line != null && line >= 2) {\n const lines = script.split('\\n');\n const prev = lines[line - 2];\n if (prev != null && /[{([]\\s*$/.test(prev)) {\n line = line - 1;\n column = prev.length;\n }\n }\n\n return { message, line, column, stack };\n}\n\nasync function main(): Promise<void> {\n const idFactory = data.idLabel != null ? countingFactory(data.idLabel) : undefined;\n const options: EditSandboxSessionOptions = {\n docId: data.docId,\n idFactory,\n entityState: data.entityState,\n domainIdFactory: domainIdFactory(data.idLabel),\n onEntry: (entry) => post({ t: 'entry', entry }),\n onEntityCommand: (command) => post({ t: 'entity-entry', command }),\n onLog: (line) => post({ t: 'log', line }),\n onTruncate: (index) => post({ t: 'truncate', index }),\n onEntityTruncate: (index) => post({ t: 'entity-truncate', index }),\n };\n const session = new EntityEditSandboxSession(options);\n\n // Prelude stays on the same physical line as script line 1 so stack line\n // numbers map 1:1 onto the agent script (no leading newline).\n const wrapped = `(async (entities, relations, checkpoint, rollbackTo, inputs, console, rgetAssetFromEntity) => {${data.script}\\n})`;\n\n const ctx = vm.createContext(Object.create(null) as Record<string, unknown>);\n\n let run: unknown;\n try {\n run = vm.runInContext(wrapped, ctx, { filename: 'agent-script.js' });\n } catch (error) {\n const pos = positionFromError(error, data.script, 'parse');\n post({ t: 'fail', phase: 'parse', error: pos });\n return;\n }\n\n if (typeof run !== 'function') {\n post({\n t: 'fail',\n phase: 'runtime',\n error: { message: 'agent script wrapper did not evaluate to a function' },\n });\n return;\n }\n\n try {\n const invoke = run as (\n entities: typeof session.entities,\n relations: typeof session.relations,\n checkpoint: typeof session.checkpoint,\n rollbackTo: typeof session.rollbackTo,\n inputs: Record<string, unknown>,\n console: typeof session.console,\n rgetAssetFromEntity: (entityId: string) => Promise<EntityAssetContent>,\n ) => Promise<unknown>;\n // Signal host that cold start is done; timeout wall-clock starts here.\n post({ t: 'ready' });\n await invoke(\n session.entities,\n session.relations,\n session.checkpoint,\n session.rollbackTo,\n data.inputs ?? {},\n session.console,\n async (entityId) => {\n await session.persistScriptAssets(writeEntityAsset);\n return session.rgetAssetFromEntity(entityId, loadEntityAsset);\n },\n );\n await session.prepareEntityAssets(loadEntityAsset);\n await session.persistScriptAssets(writeEntityAsset);\n } catch (error) {\n const pos = positionFromError(error, data.script, 'runtime');\n post({ t: 'fail', phase: 'runtime', error: pos });\n return;\n }\n\n const plan = session.buildPlan('');\n post({\n t: 'done',\n ...(plan.loro_update ? { loroUpdate: plan.loro_update } : {}),\n preview: plan.preview,\n opsCount: plan.ops.length,\n entityCommandsCount: plan.entity_commands.length,\n entityBaseRevision: plan.entity_base_revision,\n ...(plan.entity_rows !== undefined ? { entityRows: plan.entity_rows } : {}),\n deletedEntityIds: plan.deleted_entity_ids ?? [],\n deletedRelationIds: plan.deleted_relation_ids ?? [],\n planKind: plan.plan_kind,\n });\n}\n\nmain().catch((error: unknown) => {\n const pos = positionFromError(error);\n post({ t: 'fail', phase: 'runtime', error: pos });\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mengine/medeo-tool",
3
- "version": "2.0.1-alpha.11",
3
+ "version": "2.0.1-alpha.13",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,7 +24,7 @@
24
24
  "registry": "https://registry.npmjs.org/"
25
25
  },
26
26
  "dependencies": {
27
- "@mengine/medeo-client": "2.0.1-alpha.11"
27
+ "@mengine/medeo-client": "2.0.1-alpha.13"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^25.9.1",