videobook-engine 5.0.1 → 5.3.2

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.
Files changed (207) hide show
  1. package/README.md +73 -13
  2. package/dist/artifacts.d.ts +2 -2
  3. package/dist/artifacts.d.ts.map +1 -1
  4. package/dist/artifacts.js +42 -11
  5. package/dist/artifacts.js.map +1 -1
  6. package/dist/cas.d.ts +2 -1
  7. package/dist/cas.d.ts.map +1 -1
  8. package/dist/cas.js +33 -4
  9. package/dist/cas.js.map +1 -1
  10. package/dist/catalog-gc-state.d.ts +4 -0
  11. package/dist/catalog-gc-state.d.ts.map +1 -0
  12. package/dist/catalog-gc-state.js +49 -0
  13. package/dist/catalog-gc-state.js.map +1 -0
  14. package/dist/catalog-metadata.d.ts +1 -1
  15. package/dist/catalog-metadata.js +1 -1
  16. package/dist/context.d.ts +2 -0
  17. package/dist/context.d.ts.map +1 -1
  18. package/dist/context.js +7 -1
  19. package/dist/context.js.map +1 -1
  20. package/dist/domain.d.ts.map +1 -1
  21. package/dist/domain.js +2 -2
  22. package/dist/domain.js.map +1 -1
  23. package/dist/edits.js +2 -2
  24. package/dist/edits.js.map +1 -1
  25. package/dist/engine-types.d.ts +97 -12
  26. package/dist/engine-types.d.ts.map +1 -1
  27. package/dist/engine-types.js +2 -0
  28. package/dist/engine-types.js.map +1 -1
  29. package/dist/engine.d.ts +11 -3
  30. package/dist/engine.d.ts.map +1 -1
  31. package/dist/engine.js +43 -1
  32. package/dist/engine.js.map +1 -1
  33. package/dist/files.d.ts +10 -0
  34. package/dist/files.d.ts.map +1 -1
  35. package/dist/files.js +48 -1
  36. package/dist/files.js.map +1 -1
  37. package/dist/fork.d.ts +11 -28
  38. package/dist/fork.d.ts.map +1 -1
  39. package/dist/fork.js +5 -7
  40. package/dist/fork.js.map +1 -1
  41. package/dist/history.js +10 -9
  42. package/dist/history.js.map +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/inline-temporal-models.d.ts +43 -0
  48. package/dist/inline-temporal-models.d.ts.map +1 -0
  49. package/dist/inline-temporal-models.js +236 -0
  50. package/dist/inline-temporal-models.js.map +1 -0
  51. package/dist/isolated-models.d.ts +8 -0
  52. package/dist/isolated-models.d.ts.map +1 -0
  53. package/dist/isolated-models.js +25 -0
  54. package/dist/isolated-models.js.map +1 -0
  55. package/dist/job-queue.d.ts +1 -1
  56. package/dist/job-queue.d.ts.map +1 -1
  57. package/dist/job-queue.js +20 -6
  58. package/dist/job-queue.js.map +1 -1
  59. package/dist/media-image.d.ts +8 -0
  60. package/dist/media-image.d.ts.map +1 -0
  61. package/dist/media-image.js +41 -0
  62. package/dist/media-image.js.map +1 -0
  63. package/dist/media-process.d.ts +13 -0
  64. package/dist/media-process.d.ts.map +1 -0
  65. package/dist/media-process.js +89 -0
  66. package/dist/media-process.js.map +1 -0
  67. package/dist/merge-policy.d.ts +6 -10
  68. package/dist/merge-policy.d.ts.map +1 -1
  69. package/dist/merge-policy.js +5 -10
  70. package/dist/merge-policy.js.map +1 -1
  71. package/dist/metadata.d.ts +1 -0
  72. package/dist/metadata.d.ts.map +1 -1
  73. package/dist/metadata.js +11 -0
  74. package/dist/metadata.js.map +1 -1
  75. package/dist/migrate-grid-text.d.ts +17 -0
  76. package/dist/migrate-grid-text.d.ts.map +1 -0
  77. package/dist/migrate-grid-text.js +117 -0
  78. package/dist/migrate-grid-text.js.map +1 -0
  79. package/dist/migrate-grid-v22.d.ts +12 -0
  80. package/dist/migrate-grid-v22.d.ts.map +1 -0
  81. package/dist/migrate-grid-v22.js +166 -0
  82. package/dist/migrate-grid-v22.js.map +1 -0
  83. package/dist/migrate-grid-v23.d.ts +10 -0
  84. package/dist/migrate-grid-v23.d.ts.map +1 -0
  85. package/dist/migrate-grid-v23.js +31 -0
  86. package/dist/migrate-grid-v23.js.map +1 -0
  87. package/dist/migration-notebooks.d.ts +25 -0
  88. package/dist/migration-notebooks.d.ts.map +1 -0
  89. package/dist/migration-notebooks.js +131 -0
  90. package/dist/migration-notebooks.js.map +1 -0
  91. package/dist/migration-source.d.ts +6 -0
  92. package/dist/migration-source.d.ts.map +1 -0
  93. package/dist/migration-source.js +37 -0
  94. package/dist/migration-source.js.map +1 -0
  95. package/dist/migration-timeline.d.ts +36 -0
  96. package/dist/migration-timeline.d.ts.map +1 -0
  97. package/dist/migration-timeline.js +187 -0
  98. package/dist/migration-timeline.js.map +1 -0
  99. package/dist/migration-validation.d.ts +12 -0
  100. package/dist/migration-validation.d.ts.map +1 -0
  101. package/dist/migration-validation.js +68 -0
  102. package/dist/migration-validation.js.map +1 -0
  103. package/dist/migration.d.ts.map +1 -1
  104. package/dist/migration.js +188 -117
  105. package/dist/migration.js.map +1 -1
  106. package/dist/model-cache-paths.d.ts +2 -0
  107. package/dist/model-cache-paths.d.ts.map +1 -0
  108. package/dist/model-cache-paths.js +5 -0
  109. package/dist/model-cache-paths.js.map +1 -0
  110. package/dist/model-checksums.json +338 -0
  111. package/dist/model-file-resolver.d.ts +30 -0
  112. package/dist/model-file-resolver.d.ts.map +1 -0
  113. package/dist/model-file-resolver.js +304 -0
  114. package/dist/model-file-resolver.js.map +1 -0
  115. package/dist/model-identity.d.ts +13 -0
  116. package/dist/model-identity.d.ts.map +1 -0
  117. package/dist/model-identity.js +44 -0
  118. package/dist/model-identity.js.map +1 -0
  119. package/dist/model-worker-errors.d.ts +3 -0
  120. package/dist/model-worker-errors.d.ts.map +1 -0
  121. package/dist/model-worker-errors.js +12 -0
  122. package/dist/model-worker-errors.js.map +1 -0
  123. package/dist/model-worker-pool.d.ts +32 -0
  124. package/dist/model-worker-pool.d.ts.map +1 -0
  125. package/dist/model-worker-pool.js +269 -0
  126. package/dist/model-worker-pool.js.map +1 -0
  127. package/dist/model-worker-protocol.d.ts +42 -0
  128. package/dist/model-worker-protocol.d.ts.map +1 -0
  129. package/dist/model-worker-protocol.js +2 -0
  130. package/dist/model-worker-protocol.js.map +1 -0
  131. package/dist/model-worker.d.ts +2 -0
  132. package/dist/model-worker.d.ts.map +1 -0
  133. package/dist/model-worker.js +91 -0
  134. package/dist/model-worker.js.map +1 -0
  135. package/dist/mvp-contracts.d.ts +31 -7
  136. package/dist/mvp-contracts.d.ts.map +1 -1
  137. package/dist/mvp-contracts.js +1 -1
  138. package/dist/mvp-contracts.js.map +1 -1
  139. package/dist/notebook-grid.d.ts +13 -4
  140. package/dist/notebook-grid.d.ts.map +1 -1
  141. package/dist/notebook-grid.js +35 -8
  142. package/dist/notebook-grid.js.map +1 -1
  143. package/dist/notebook-mentions.d.ts +1 -1
  144. package/dist/notebook-mentions.d.ts.map +1 -1
  145. package/dist/notebook-mentions.js +2 -1
  146. package/dist/notebook-mentions.js.map +1 -1
  147. package/dist/schema.d.ts +2 -1
  148. package/dist/schema.d.ts.map +1 -1
  149. package/dist/schema.js +7 -4
  150. package/dist/schema.js.map +1 -1
  151. package/dist/search-provider-access.d.ts +11 -0
  152. package/dist/search-provider-access.d.ts.map +1 -0
  153. package/dist/search-provider-access.js +42 -0
  154. package/dist/search-provider-access.js.map +1 -0
  155. package/dist/similarity.d.ts +60 -1
  156. package/dist/similarity.d.ts.map +1 -1
  157. package/dist/similarity.js +165 -145
  158. package/dist/similarity.js.map +1 -1
  159. package/dist/store.d.ts +15 -1
  160. package/dist/store.d.ts.map +1 -1
  161. package/dist/store.js +168 -14
  162. package/dist/store.js.map +1 -1
  163. package/dist/temporal-index-cache.d.ts +13 -0
  164. package/dist/temporal-index-cache.d.ts.map +1 -0
  165. package/dist/temporal-index-cache.js +59 -0
  166. package/dist/temporal-index-cache.js.map +1 -0
  167. package/dist/temporal-model-manifests.d.ts +17 -0
  168. package/dist/temporal-model-manifests.d.ts.map +1 -0
  169. package/dist/temporal-model-manifests.js +33 -0
  170. package/dist/temporal-model-manifests.js.map +1 -0
  171. package/dist/temporal-models.d.ts +20 -35
  172. package/dist/temporal-models.d.ts.map +1 -1
  173. package/dist/temporal-models.js +23 -257
  174. package/dist/temporal-models.js.map +1 -1
  175. package/dist/temporal-search.d.ts +6 -3
  176. package/dist/temporal-search.d.ts.map +1 -1
  177. package/dist/temporal-search.js +404 -132
  178. package/dist/temporal-search.js.map +1 -1
  179. package/dist/temporal-vector-index.d.ts +46 -0
  180. package/dist/temporal-vector-index.d.ts.map +1 -0
  181. package/dist/temporal-vector-index.js +220 -0
  182. package/dist/temporal-vector-index.js.map +1 -0
  183. package/dist/third-party/@huggingface-jinja.LICENSE +21 -0
  184. package/dist/third-party/@huggingface-tokenizers.LICENSE +201 -0
  185. package/dist/third-party/@huggingface-transformers.LICENSE +202 -0
  186. package/dist/third-party/onnxruntime-common.LICENSE +21 -0
  187. package/dist/third-party/versions.json +23 -0
  188. package/dist/transformers-runtime.d.ts +2 -0
  189. package/dist/transformers-runtime.d.ts.map +1 -0
  190. package/dist/transformers-runtime.js +33014 -0
  191. package/dist/transformers-runtime.js.LEGAL.txt +12 -0
  192. package/dist/transformers-runtime.js.map +7 -0
  193. package/docs/doltlite-staging.md +69 -0
  194. package/docs/edit-performance.md +83 -0
  195. package/docs/engine-layout.md +42 -31
  196. package/docs/media-limits.md +57 -0
  197. package/docs/model-download-policy.md +15 -0
  198. package/docs/model-integrity.md +72 -0
  199. package/docs/model-isolation.md +72 -0
  200. package/docs/model-revisions.md +54 -0
  201. package/docs/release-evidence.md +300 -0
  202. package/docs/search-provider-consent.md +67 -0
  203. package/docs/semantic-durability.md +55 -0
  204. package/docs/temporal-search-performance.md +260 -0
  205. package/docs/v4-migration.md +83 -0
  206. package/fixtures/v5/contract-fixtures.json +3 -3
  207. package/package.json +19 -13
@@ -0,0 +1,31 @@
1
+ import { SCHEMA_VERSION } from "./catalog-metadata.js";
2
+ import { rewriteCatalogMentions } from "./migrate-grid-text.js";
3
+ import { notebookGridAddress } from "./notebook-grid.js";
4
+ // Schema 23 labelled columns a-h and rows 1-64 (@a1-@h64). Schema 24 keeps
5
+ // the same 8x64 slots but letters the rows and numbers the columns, so every
6
+ // stored mention is re-encoded in place; no cell moves.
7
+ const V23_ADDRESS_SOURCE = "[a-h](?:6[0-4]|[1-5][0-9]|[1-9])";
8
+ const V23_MENTION_PATTERN = new RegExp(`@(${V23_ADDRESS_SOURCE})(?![\\w-])`, "giu");
9
+ const V23_ADDRESS_PATTERN = new RegExp(`^${V23_ADDRESS_SOURCE}$`, "iu");
10
+ export function parseV23GridAddress(value) {
11
+ const address = value.trim().replace(/^@/u, "").toLowerCase();
12
+ if (!V23_ADDRESS_PATTERN.test(address))
13
+ return undefined;
14
+ return {
15
+ column: address.charCodeAt(0) - 97,
16
+ row: Number(address.slice(1)) - 1,
17
+ };
18
+ }
19
+ export function rewriteV23Mentions(text) {
20
+ return text.replace(V23_MENTION_PATTERN, (raw, address) => {
21
+ const slot = parseV23GridAddress(address);
22
+ return slot ? `@${notebookGridAddress(slot)}` : raw;
23
+ });
24
+ }
25
+ export function applyV23NotebookGridMigration(db) {
26
+ const rewritten = rewriteCatalogMentions(db, () => rewriteV23Mentions);
27
+ db.prepare("UPDATE engine_schema SET version=? WHERE singleton=1")
28
+ .run(SCHEMA_VERSION);
29
+ return { rewritten };
30
+ }
31
+ //# sourceMappingURL=migrate-grid-v23.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-grid-v23.js","sourceRoot":"","sources":["../src/migrate-grid-v23.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,2EAA2E;AAC3E,6EAA6E;AAC7E,wDAAwD;AACxD,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAC9D,MAAM,mBAAmB,GAAG,IAAI,MAAM,CACpC,KAAK,kBAAkB,aAAa,EACpC,KAAK,CACN,CAAC;AACF,MAAM,mBAAmB,GAAG,IAAI,MAAM,CAAC,IAAI,kBAAkB,GAAG,EAAE,IAAI,CAAC,CAAC;AAMxE,MAAM,UAAU,mBAAmB,CACjC,KAAa;IAEb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACzD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE;QAClC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,GAAW,EAAE,OAAe,EAAE,EAAE;QACxE,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,EAAgB;IAEhB,MAAM,SAAS,GAAG,sBAAsB,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC;IACvE,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC;SAC/D,GAAG,CAAC,cAAc,CAAC,CAAC;IACvB,OAAO,EAAE,SAAS,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { DatabaseSync } from "@dolthub/doltlite";
2
+ import type { MigrationIssue } from "./mvp-contracts.js";
3
+ import type { NotebookDocument } from "./notebook/types.js";
4
+ export declare function legacyNotebookPlan(database: DatabaseSync): {
5
+ documents: NotebookDocument[];
6
+ issues: MigrationIssue[];
7
+ decisions: Array<{
8
+ notebookId: string;
9
+ properties: Record<string, unknown>;
10
+ cells: Array<{
11
+ cellId: string;
12
+ legacyType: string;
13
+ type: string;
14
+ x: number;
15
+ y: number;
16
+ row: number;
17
+ column: number;
18
+ legacyModel: string | null;
19
+ model?: string;
20
+ tool?: string;
21
+ modelSource: "explicit" | "legacy-default" | "none";
22
+ }>;
23
+ }>;
24
+ };
25
+ //# sourceMappingURL=migration-notebooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-notebooks.d.ts","sourceRoot":"","sources":["../src/migration-notebooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAsC1E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG;IAC1D,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YACvF,MAAM,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YACpG,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,UAAU,GAAG,gBAAgB,GAAG,MAAM,CAAC;SAChH,CAAC,CAAA;KAAE,CAAC,CAAC;CACP,CAsDA"}
@@ -0,0 +1,131 @@
1
+ import { NOTEBOOK_GRID_CAPACITY, NOTEBOOK_GRID_COLUMN_COUNT } from "./notebook-grid.js";
2
+ import { NOTEBOOK_CELL_TYPES } from "./schema.js";
3
+ const LEGACY_GENERATION_DEFAULTS = {
4
+ image: "generate_kie_gpt_image_2_text_to_image",
5
+ video: "generate_kie_wan_2_7_text_to_video",
6
+ };
7
+ export function legacyNotebookPlan(database) {
8
+ const notebooks = database.prepare("SELECT * FROM notebooks ORDER BY notebook_id").all();
9
+ const cells = database.prepare(`SELECT c.*, a.kind AS artifact_kind FROM cells c
10
+ LEFT JOIN artifacts a ON a.artifact_id=c.output_artifact_id
11
+ ORDER BY c.notebook_id, c.position_y, c.position_x, c.cell_id`).all();
12
+ const edges = database.prepare("SELECT * FROM edges ORDER BY notebook_id, edge_id").all();
13
+ const documents = [];
14
+ const issues = [];
15
+ const decisions = [];
16
+ for (const notebook of notebooks) {
17
+ try {
18
+ const properties = objectJson(notebook.properties_json, "Notebook properties");
19
+ const rows = cells.filter((cell) => cell.notebook_id === notebook.notebook_id);
20
+ if (rows.length > NOTEBOOK_GRID_CAPACITY)
21
+ throw new Error(`Notebook has ${rows.length} cells; the current grid supports ${NOTEBOOK_GRID_CAPACITY}`);
22
+ const converted = rows.map((row, ordinal) => {
23
+ if (!Number.isFinite(row.position_x) || !Number.isFinite(row.position_y))
24
+ throw new Error(`Invalid canvas position for ${row.cell_id}`);
25
+ return {
26
+ id: row.cell_id, type: currentCellType(row), label: row.title,
27
+ slot: { row: Math.floor(ordinal / NOTEBOOK_GRID_COLUMN_COUNT), column: ordinal % NOTEBOOK_GRID_COLUMN_COUNT },
28
+ ...(row.entity_id === null ? {} : { outputEntityId: row.entity_id }),
29
+ ...(row.prompt === null ? {} : { prompt: row.prompt }),
30
+ ...currentModelFields(row),
31
+ inputs: objectJson(row.inputs_json, `Inputs for ${row.cell_id}`),
32
+ ...(row.output_artifact_id === null ? {} : { outputArtifactId: row.output_artifact_id }),
33
+ };
34
+ });
35
+ const notebookEdges = edges.filter((edge) => edge.notebook_id === notebook.notebook_id);
36
+ const occupiedInputs = new Set();
37
+ for (const edge of notebookEdges) {
38
+ const key = `${edge.target_cell_id}:${edge.target_input}`;
39
+ if (occupiedInputs.has(key))
40
+ throw new Error(`Multiple edges target the same input: ${key}`);
41
+ occupiedInputs.add(key);
42
+ }
43
+ const document = {
44
+ ...compatibleProperties(properties),
45
+ id: notebook.notebook_id, name: notebook.name,
46
+ createdAt: new Date(notebook.created_at).toISOString(), cells: converted,
47
+ edges: notebookEdges.map((edge) => ({ id: edge.edge_id, source: edge.source_cell_id,
48
+ target: edge.target_cell_id, targetInput: edge.target_input })),
49
+ };
50
+ documents.push(document);
51
+ decisions.push({ notebookId: notebook.notebook_id, properties, cells: rows.map((row, ordinal) => ({
52
+ cellId: row.cell_id, legacyType: row.type, type: converted[ordinal].type,
53
+ x: row.position_x, y: row.position_y, ...converted[ordinal].slot,
54
+ legacyModel: row.model, ...currentModelFields(row),
55
+ modelSource: LEGACY_GENERATION_DEFAULTS[row.type] && !row.model
56
+ ? "legacy-default" : row.model === null ? "none" : "explicit",
57
+ })) });
58
+ }
59
+ catch (cause) {
60
+ issues.push({ code: "INVALID_REFERENCE", severity: "error", resource: `notebook:${notebook.notebook_id}`,
61
+ message: cause instanceof Error ? cause.message : String(cause) });
62
+ }
63
+ }
64
+ return { documents, decisions, issues };
65
+ }
66
+ function currentCellType(cell) {
67
+ if (cell.type === "image")
68
+ return "generate_image";
69
+ if (cell.type === "video")
70
+ return "generate_video";
71
+ if (NOTEBOOK_CELL_TYPES.includes(cell.type))
72
+ return cell.type;
73
+ if (cell.type === "scene")
74
+ return "prompt";
75
+ if (cell.type === "asset") {
76
+ if (cell.artifact_kind === "image" || cell.artifact_kind === "video" || cell.artifact_kind === "audio")
77
+ return cell.artifact_kind;
78
+ if (cell.artifact_kind === "final")
79
+ return "video";
80
+ if (cell.artifact_kind === "character")
81
+ return "character";
82
+ if (cell.artifact_kind === "script" || cell.artifact_kind === "prompt" || cell.artifact_kind === "scene")
83
+ return "prompt";
84
+ }
85
+ throw new Error(`Cannot represent legacy cell ${cell.cell_id} of type ${cell.type} without a supported source`);
86
+ }
87
+ function currentModelFields(cell) {
88
+ const fallback = LEGACY_GENERATION_DEFAULTS[cell.type];
89
+ if (fallback) {
90
+ const tool = cell.model || fallback;
91
+ return { model: tool, tool };
92
+ }
93
+ return cell.model === null ? {} : { model: cell.model };
94
+ }
95
+ function objectJson(json, label) {
96
+ const value = JSON.parse(json);
97
+ if (!value || typeof value !== "object" || Array.isArray(value))
98
+ throw new Error(`${label} must be an object`);
99
+ return value;
100
+ }
101
+ function compatibleProperties(properties) {
102
+ const result = {};
103
+ for (const key of ["description", "lifecycleState", "analysisRevision"]) {
104
+ if (properties[key] === undefined)
105
+ continue;
106
+ if (typeof properties[key] !== "string")
107
+ throw new Error(`Notebook ${key} must be a string`);
108
+ result[key] = properties[key];
109
+ }
110
+ if (properties.workflowVersion !== undefined) {
111
+ if (!Number.isSafeInteger(properties.workflowVersion))
112
+ throw new Error("Notebook workflowVersion must be an integer");
113
+ result.workflowVersion = properties.workflowVersion;
114
+ }
115
+ for (const key of ["fixture", "execution"]) {
116
+ if (properties[key] === undefined)
117
+ continue;
118
+ if (!properties[key] || typeof properties[key] !== "object" || Array.isArray(properties[key]))
119
+ throw new Error(`Notebook ${key} must be an object`);
120
+ result[key] = properties[key];
121
+ }
122
+ for (const key of ["generationPlans", "notebookRunPlans"]) {
123
+ if (properties[key] === undefined)
124
+ continue;
125
+ if (!Array.isArray(properties[key]))
126
+ throw new Error(`Notebook ${key} must be an array`);
127
+ result[key] = properties[key];
128
+ }
129
+ return result;
130
+ }
131
+ //# sourceMappingURL=migration-notebooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-notebooks.js","sourceRoot":"","sources":["../src/migration-notebooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAgClD,MAAM,0BAA0B,GAA2B;IACzD,KAAK,EAAE,wCAAwC;IAC/C,KAAK,EAAE,oCAAoC;CAC5C,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,QAAsB;IAQvD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAAiC,CAAC;IACxH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;;kEAEiC,CAAC,CAAC,GAAG,EAA6B,CAAC;IACnG,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EAA6B,CAAC;IACrH,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAuD,EAAE,CAAC;IACzE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC/E,IAAI,IAAI,CAAC,MAAM,GAAG,sBAAsB;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,MAAM,qCAAqC,sBAAsB,EAAE,CAAC,CAAC;YACpJ,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAgB,EAAE;gBACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBACxI,OAAO;oBACL,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK;oBAC7D,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,0BAA0B,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,0BAA0B,EAAE;oBAC7G,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;oBACpE,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;oBACtD,GAAG,kBAAkB,CAAC,GAAG,CAAC;oBAC1B,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,GAAG,CAAC,OAAO,EAAE,CAAC;oBAChE,GAAG,CAAC,GAAG,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,EAAE,CAAC;iBACzF,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,WAAW,CAAC,CAAC;YACxF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1D,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;gBAC7F,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,QAAQ,GAAqB;gBACjC,GAAG,oBAAoB,CAAC,UAAU,CAAC;gBACnC,EAAE,EAAE,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI;gBAC7C,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS;gBACxE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc;oBACjF,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;aAClE,CAAC;YACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;oBAChG,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAE,CAAC,IAAI;oBACzE,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,OAAO,CAAE,CAAC,IAAI;oBACjE,WAAW,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC;oBAClD,WAAW,EAAE,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;wBAC7D,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU;iBAChE,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,QAAQ,CAAC,WAAW,EAAE;gBACtG,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IACnD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,gBAAgB,CAAC;IACnD,IAAK,mBAAyC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,IAA4B,CAAC;IAC7G,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAClI,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC;QACnD,IAAI,IAAI,CAAC,aAAa,KAAK,WAAW;YAAE,OAAO,WAAW,CAAC;QAC3D,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;YAAE,OAAO,QAAQ,CAAC;IAC5H,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,YAAY,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;AAClH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IAC1C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;QACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAC/G,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAmC;IAC/D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACxE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;QAC7F,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,UAAU,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACtH,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;QAC3C,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,UAAU,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,oBAAoB,CAAC,CAAC;QACpJ,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC1D,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;QACzF,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAmC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { DatabaseSync } from "@dolthub/doltlite";
2
+ export declare function openV4SourceSnapshot(root: string): {
3
+ database: DatabaseSync;
4
+ close: () => void;
5
+ };
6
+ //# sourceMappingURL=migration-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-source.d.ts","sourceRoot":"","sources":["../src/migration-source.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAwBhG"}
@@ -0,0 +1,37 @@
1
+ import { constants, copyFileSync, mkdtempSync, rmSync, statSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { DatabaseSync } from "@dolthub/doltlite";
5
+ import { EngineFault } from "./store.js";
6
+ export function openV4SourceSnapshot(root) {
7
+ const source = join(root, "data", "videobook.db");
8
+ const directory = mkdtempSync(join(tmpdir(), "videobook-v4-inspect-"));
9
+ try {
10
+ const before = statSync(source, { bigint: true });
11
+ const target = join(directory, "videobook.db");
12
+ // Keep native connections and deferred statement cleanup off the legacy file.
13
+ copyFileSync(source, target, constants.COPYFILE_FICLONE);
14
+ const after = statSync(source, { bigint: true });
15
+ if (before.dev !== after.dev || before.ino !== after.ino || before.size !== after.size || before.mtimeNs !== after.mtimeNs) {
16
+ throw new EngineFault({ code: "STALE_REVISION", message: "Schema-v4 catalog changed while its inspection snapshot was copied" });
17
+ }
18
+ const database = new DatabaseSync(target, { readOnly: true });
19
+ let closed = false;
20
+ return { database, close: () => {
21
+ if (closed)
22
+ return;
23
+ closed = true;
24
+ try {
25
+ database.close();
26
+ }
27
+ finally {
28
+ rmSync(directory, { recursive: true, force: true, maxRetries: 3 });
29
+ }
30
+ } };
31
+ }
32
+ catch (error) {
33
+ rmSync(directory, { recursive: true, force: true, maxRetries: 3 });
34
+ throw error;
35
+ }
36
+ }
37
+ //# sourceMappingURL=migration-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-source.js","sourceRoot":"","sources":["../src/migration-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC/C,8EAA8E;QAC9E,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3H,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,oEAAoE,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC7B,IAAI,MAAM;oBAAE,OAAO;gBACnB,MAAM,GAAG,IAAI,CAAC;gBACd,IAAI,CAAC;oBAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAAC,CAAC;wBACjB,CAAC;oBAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;gBAAC,CAAC;YACjF,CAAC,EAAE,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { DatabaseSync } from "@dolthub/doltlite";
2
+ import type { ObjectStore } from "./cas.js";
3
+ import type { Engine } from "./engine.js";
4
+ import type { ArtifactStream, MigrationIssue, V4MigrationRequest } from "./mvp-contracts.js";
5
+ interface LegacyPlacement {
6
+ legacyId: string;
7
+ artifactId: string;
8
+ path: string;
9
+ objectHash: string;
10
+ kind: "image" | "video" | "audio";
11
+ startFrame?: number;
12
+ durationFrames?: number;
13
+ volume: number | null;
14
+ fadeInMs: number | null;
15
+ fadeOutMs: number | null;
16
+ }
17
+ export declare function legacyTimelinePlan(database: DatabaseSync): {
18
+ placements: LegacyPlacement[];
19
+ issues: MigrationIssue[];
20
+ };
21
+ export declare function convertLegacyTimeline(engine: Engine, plan: ReturnType<typeof legacyTimelinePlan>, objects: ObjectStore, request: V4MigrationRequest): Promise<{
22
+ clips: {
23
+ legacyId: string;
24
+ clipId: string;
25
+ sourcePath: string;
26
+ objectHash: string;
27
+ startFrame: number;
28
+ durationFrames: number;
29
+ }[];
30
+ videoDurationFrames: number;
31
+ streams: ArtifactStream[];
32
+ frameRate: import("./mvp-time.js").Rational;
33
+ audioPlacement: string;
34
+ }>;
35
+ export {};
36
+ //# sourceMappingURL=migration-timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-timeline.d.ts","sourceRoot":"","sources":["../src/migration-timeline.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAgC,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAK3H,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAYD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG;IAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAAC,MAAM,EAAE,cAAc,EAAE,CAAA;CAAE,CA2CtH;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB;;kBAMrH,MAAM;gBAAU,MAAM;oBAAc,MAAM;oBAAc,MAAM;oBAAc,MAAM;wBAAkB,MAAM;;;;;;GA6E9I"}
@@ -0,0 +1,187 @@
1
+ import { execFile } from "node:child_process";
2
+ import { extname } from "node:path";
3
+ import { promisify } from "node:util";
4
+ import sharp from "sharp";
5
+ import { v7 as uuidv7 } from "uuid";
6
+ import { MVP_CONTRACT_VERSION } from "./mvp-contracts.js";
7
+ import { sequenceFramesToSourceTicks, sourceTicksToSequenceFrames } from "./mvp-time.js";
8
+ import { EngineFault } from "./store.js";
9
+ export function legacyTimelinePlan(database) {
10
+ const files = database.prepare("SELECT artifact_id, path, object_hash FROM artifact_files ORDER BY artifact_id, path").all();
11
+ const slots = database.prepare(`SELECT s.*, a.kind FROM timeline_slots s JOIN artifacts a ON a.artifact_id=s.artifact_id
12
+ ORDER BY s.ordinal, s.slot_id`).all();
13
+ const audio = database.prepare(`SELECT s.*, a.kind FROM timeline_audio s JOIN artifacts a ON a.artifact_id=s.artifact_id
14
+ ORDER BY s.ordinal, s.audio_id`).all();
15
+ const placements = [];
16
+ const issues = [];
17
+ const add = (legacyId, artifactId, kind, values) => {
18
+ const extensions = kind === "image" ? [".png", ".jpg", ".jpeg", ".webp", ".avif"]
19
+ : kind === "video" ? [".mp4", ".mov", ".webm", ".mkv", ".avi"]
20
+ : [".wav", ".mp3", ".m4a", ".ogg", ".flac", ".aac", ".weba", ".mp4", ".mov", ".webm"];
21
+ const candidates = files.filter((file) => file.artifact_id === artifactId && extensions.includes(extname(file.path).toLowerCase()));
22
+ candidates.sort((left, right) => sourcePriority(left.path, kind) - sourcePriority(right.path, kind) || left.path.localeCompare(right.path));
23
+ const file = candidates[0];
24
+ if (!file) {
25
+ issues.push({ code: "UNSUPPORTED_MEDIA", severity: "error", resource: `timeline:${legacyId}`, message: `No supported ${kind} source file`, details: { artifactId } });
26
+ return;
27
+ }
28
+ if ([values.volume, values.fadeInMs, values.fadeOutMs].some((value) => value !== null && (!Number.isFinite(value) || value < 0))
29
+ || (values.startFrame !== undefined && (!Number.isSafeInteger(values.startFrame) || values.startFrame < 0))
30
+ || (values.durationFrames !== undefined && (!Number.isSafeInteger(values.durationFrames) || values.durationFrames <= 0))) {
31
+ issues.push({ code: "INVALID_REFERENCE", severity: "error", resource: `timeline:${legacyId}`, message: "Invalid legacy placement, volume or fade" });
32
+ return;
33
+ }
34
+ placements.push({ legacyId, artifactId, path: file.path, objectHash: file.object_hash, kind, ...values });
35
+ if (kind !== "image")
36
+ issues.push({ code: "PROBE_REQUIRED", severity: "warning", resource: `timeline:${legacyId}`,
37
+ message: `${kind} source will be probed during migration before publishing clips`, details: { artifactId, sourcePath: file.path } });
38
+ };
39
+ for (const slot of slots) {
40
+ if (!["image", "video", "final"].includes(slot.kind)) {
41
+ issues.push({ code: "UNSUPPORTED_MEDIA", severity: "error", resource: `timeline:${slot.slot_id}`, message: `Unsupported video-track artifact kind: ${slot.kind}` });
42
+ continue;
43
+ }
44
+ add(slot.slot_id, slot.artifact_id, slot.kind === "image" ? "image" : "video", {
45
+ volume: slot.volume, fadeInMs: slot.audio_fade_in, fadeOutMs: slot.audio_fade_out,
46
+ });
47
+ }
48
+ for (const clip of audio)
49
+ add(clip.audio_id, clip.artifact_id, "audio", {
50
+ startFrame: clip.start_frame, durationFrames: clip.duration_frames,
51
+ volume: clip.volume, fadeInMs: clip.fade_in, fadeOutMs: clip.fade_out,
52
+ });
53
+ return { placements, issues };
54
+ }
55
+ export async function convertLegacyTimeline(engine, plan, objects, request) {
56
+ const sequence = engine.sequences.getPrimary();
57
+ const videoTrack = sequence.tracks.find((track) => track.kind === "video");
58
+ const audioTrack = sequence.tracks.find((track) => track.kind === "audio");
59
+ const streams = new Map();
60
+ const images = new Set();
61
+ const decisions = [];
62
+ let videoEndFrame = 0;
63
+ let audioEndFrame = 0;
64
+ let operations = [];
65
+ const flush = async () => {
66
+ if (!operations.length)
67
+ return;
68
+ const intent = { intentVersion: MVP_CONTRACT_VERSION, commandId: uuidv7(), sequenceId: sequence.sequenceId,
69
+ baseRevision: engine.head, actor: "schema-v4-migration", sourceSurface: "system",
70
+ confirmationPolicy: "always", operations };
71
+ const preview = engine.edits.preview(intent);
72
+ if (!preview.ok)
73
+ throw new EngineFault(preview.error);
74
+ if (!preview.value.valid)
75
+ throw new EngineFault({ code: "INVALID_INPUT", message: "Legacy timeline cannot be represented",
76
+ details: { conflicts: preview.value.conflicts } });
77
+ const committed = await engine.edits.commit(intent, preview.value.previewHash);
78
+ if (!committed.ok)
79
+ throw new EngineFault(committed.error);
80
+ operations = [];
81
+ };
82
+ for (const [index, item] of plan.placements.entries()) {
83
+ if (request.signal?.aborted)
84
+ throw new EngineFault({ code: "CANCELLED", message: "Schema-v4 migration cancelled" });
85
+ const filePath = await objects.ensureLocalPath(item.objectHash);
86
+ let source;
87
+ let durationFrames;
88
+ if (item.kind === "image") {
89
+ if (!images.has(item.objectHash)) {
90
+ const metadata = await sharp(filePath).metadata();
91
+ if (!metadata.width || !metadata.height)
92
+ throw new Error(`Invalid legacy image: ${item.path}`);
93
+ images.add(item.objectHash);
94
+ }
95
+ source = { kind: "still", artifactId: item.artifactId, sourcePath: item.path, objectHash: item.objectHash };
96
+ durationFrames = 90;
97
+ }
98
+ else {
99
+ const key = `${item.artifactId}:${item.path}:${item.kind}`;
100
+ let stream = streams.get(key);
101
+ if (!stream) {
102
+ const profile = await probeStream(filePath, item.kind, request);
103
+ const registered = await engine.streams.register({ ...profile, artifactId: item.artifactId, sourcePath: item.path, objectHash: item.objectHash });
104
+ if (!registered.ok)
105
+ throw new EngineFault(registered.error);
106
+ stream = registered.value;
107
+ streams.set(key, stream);
108
+ }
109
+ durationFrames = item.durationFrames ?? Math.max(1, sourceTicksToSequenceFrames(stream.durationTicks, stream.timeBase, sequence.frameRate));
110
+ const durationTicks = item.kind === "audio"
111
+ ? Math.max(1, Math.min(stream.durationTicks, sequenceFramesToSourceTicks(durationFrames, sequence.frameRate, stream.timeBase)))
112
+ : stream.durationTicks;
113
+ source = { kind: "timed", artifactId: item.artifactId, range: { streamId: stream.streamId, objectHash: item.objectHash,
114
+ startTick: 0, durationTicks, timeBase: stream.timeBase } };
115
+ }
116
+ const timelineStartFrame = item.startFrame ?? videoEndFrame;
117
+ const fadeInFrames = Math.round((item.fadeInMs ?? 0) * 30 / 1000);
118
+ const fadeOutFrames = Math.round((item.fadeOutMs ?? 0) * 30 / 1000);
119
+ if (fadeInFrames + fadeOutFrames > durationFrames) {
120
+ throw new EngineFault({ code: "INVALID_INPUT", message: `Legacy fades exceed the clip duration: ${item.legacyId}`,
121
+ details: { legacyId: item.legacyId, durationFrames, fadeInFrames, fadeOutFrames } });
122
+ }
123
+ const clipId = uuidv7();
124
+ const placement = {
125
+ trackId: item.kind === "audio" ? audioTrack.trackId : videoTrack.trackId, timelineStartFrame, durationFrames, source,
126
+ ...(source.kind === "timed" ? { speed: { numerator: 1, denominator: 1 }, reverse: false, audioPolicy: "preserve-pitch" } : {}),
127
+ ...(item.kind !== "audio" ? { transform: { fit: "fit", positionX: 0, positionY: 0, scaleX: 1, scaleY: 1,
128
+ anchorX: 0.5, anchorY: 0.5, rotationDegrees: 0, cropTop: 0, cropRight: 0, cropBottom: 0, cropLeft: 0, opacity: 1, blendMode: "normal" } } : {}),
129
+ audio: { gainDb: item.volume === null ? 0 : item.volume === 0 ? -120 : 20 * Math.log10(item.volume / 100),
130
+ muted: item.volume === 0, fadeInFrames, fadeOutFrames },
131
+ };
132
+ if (item.kind === "audio") {
133
+ operations.push({ kind: "insert-clip", clipId, placement: { ...placement, timelineStartFrame: audioEndFrame }, mode: "insert" });
134
+ operations.push({ kind: "move-clip", clipId, trackId: audioTrack.trackId, timelineStartFrame });
135
+ audioEndFrame = Math.max(audioEndFrame, timelineStartFrame + durationFrames);
136
+ }
137
+ else
138
+ operations.push({ kind: "insert-clip", clipId, placement, mode: "overwrite" });
139
+ decisions.push({ legacyId: item.legacyId, clipId, sourcePath: item.path, objectHash: item.objectHash, startFrame: timelineStartFrame, durationFrames });
140
+ if (item.kind !== "audio")
141
+ videoEndFrame += durationFrames;
142
+ if (operations.length >= 100)
143
+ await flush();
144
+ request.onProgress?.({ phase: "copy-timeline", completed: index + 1, total: plan.placements.length });
145
+ }
146
+ if (request.signal?.aborted)
147
+ throw new EngineFault({ code: "CANCELLED", message: "Schema-v4 migration cancelled" });
148
+ await flush();
149
+ return { clips: decisions, videoDurationFrames: videoEndFrame, streams: [...streams.values()], frameRate: sequence.frameRate,
150
+ audioPlacement: "legacy start/duration at 30fps; native playback speed; fades in milliseconds" };
151
+ }
152
+ function sourcePriority(path, kind) {
153
+ if (kind === "audio" && /^audio_original\./i.test(path))
154
+ return 0;
155
+ if (/^original\./i.test(path))
156
+ return 1;
157
+ return 2;
158
+ }
159
+ async function probeStream(filePath, kind, request) {
160
+ const { stdout } = await promisify(execFile)(request.ffprobePath ?? "ffprobe", ["-v", "error", "-show_streams", "-show_format", "-of", "json", filePath], { encoding: "utf8", signal: request.signal, timeout: 60_000, maxBuffer: 4 * 1024 * 1024 });
161
+ const data = JSON.parse(stdout);
162
+ const stream = data.streams?.find((value) => value.codec_type === kind);
163
+ if (!stream)
164
+ throw new EngineFault({ code: "INVALID_INPUT", message: `No ${kind} stream in legacy media` });
165
+ const timeBase = ratio(String(stream.time_base));
166
+ const durationTicks = Number(stream.duration_ts ?? Math.round(Number(stream.duration ?? data.format?.duration) * timeBase.denominator / timeBase.numerator));
167
+ if (!Number.isSafeInteger(durationTicks) || durationTicks <= 0)
168
+ throw new EngineFault({ code: "INVALID_INPUT", message: "Legacy media has no finite positive source duration" });
169
+ const common = { streamIndex: Number(stream.index), kind, timeBase, durationTicks, codec: String(stream.codec_name ?? "unknown") };
170
+ if (kind === "audio")
171
+ return { ...common, audio: { sampleRateHz: Number(stream.sample_rate), channels: Number(stream.channels),
172
+ channelLayout: String(stream.channel_layout ?? (Number(stream.channels) === 1 ? "mono" : Number(stream.channels) === 2 ? "stereo" : "unknown")) } };
173
+ const sideData = stream.side_data_list;
174
+ const tags = stream.tags;
175
+ const rotationDegrees = Number(sideData?.find((value) => value.rotation !== undefined)?.rotation ?? tags?.rotate ?? 0);
176
+ return { ...common, video: { width: Number(stream.width), height: Number(stream.height), rotationDegrees,
177
+ pixelAspect: !stream.sample_aspect_ratio || stream.sample_aspect_ratio === "N/A" || stream.sample_aspect_ratio === "0:1"
178
+ ? { numerator: 1, denominator: 1 } : ratio(String(stream.sample_aspect_ratio).replace(":", "/")),
179
+ ...(stream.avg_frame_rate && stream.avg_frame_rate !== "0/0" ? { averageFrameRate: ratio(String(stream.avg_frame_rate)) } : {}) } };
180
+ }
181
+ function ratio(value) {
182
+ const [numerator, denominator] = value.split("/").map(Number);
183
+ if (!Number.isSafeInteger(numerator) || !Number.isSafeInteger(denominator) || numerator <= 0 || denominator <= 0)
184
+ throw new Error(`Invalid legacy media ratio: ${value}`);
185
+ return { numerator: numerator, denominator: denominator };
186
+ }
187
+ //# sourceMappingURL=migration-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-timeline.js","sourceRoot":"","sources":["../src/migration-timeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DatabaseSync } from "@dolthub/doltlite";
2
+ import type { MigrationIssue } from "./mvp-contracts.js";
3
+ export declare function legacyReferenceIssues(database: DatabaseSync): MigrationIssue[];
4
+ export declare function legacyStateSummary(database: DatabaseSync): {
5
+ digest: string;
6
+ tables: Array<{
7
+ table: string;
8
+ rows: number;
9
+ digest: string;
10
+ }>;
11
+ };
12
+ //# sourceMappingURL=migration-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-validation.d.ts","sourceRoot":"","sources":["../src/migration-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgBzD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,GAAG,cAAc,EAAE,CAgC9E;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG;IAC1D,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChF,CASA"}
@@ -0,0 +1,68 @@
1
+ import { createHash } from "node:crypto";
2
+ const REFERENCES = [
3
+ ["artifact_files", "artifact_id", "artifacts", "artifact_id"],
4
+ ["artifact_files", "object_hash", "objects", "object_hash"],
5
+ ["artifact_metadata", "artifact_id", "artifacts", "artifact_id"],
6
+ ["cells", "notebook_id", "notebooks", "notebook_id"],
7
+ ["cells", "entity_id", "entities", "entity_id"],
8
+ ["cells", "output_artifact_id", "artifacts", "artifact_id"],
9
+ ["runs", "notebook_id", "notebooks", "notebook_id"],
10
+ ["timeline", "book_id", "book", "book_id"],
11
+ ["timeline_slots", "artifact_id", "artifacts", "artifact_id"],
12
+ ["timeline_audio", "artifact_id", "artifacts", "artifact_id"],
13
+ ["audio_waveforms", "artifact_id", "artifacts", "artifact_id"],
14
+ ];
15
+ export function legacyReferenceIssues(database) {
16
+ const issues = [];
17
+ for (const [table, field, parent, parentField] of REFERENCES) {
18
+ const missing = database.prepare(`SELECT c.${field} AS id FROM ${table} c
19
+ LEFT JOIN ${parent} p ON p.${parentField}=c.${field}
20
+ WHERE c.${field} IS NOT NULL AND p.${parentField} IS NULL`).all();
21
+ for (const row of missing)
22
+ issues.push(invalid(`${table}:${row.id}`, `Missing ${parent} reference from ${table}.${field}`));
23
+ }
24
+ for (const field of ["source_cell_id", "target_cell_id"]) {
25
+ const missing = database.prepare(`SELECT e.edge_id FROM edges e LEFT JOIN cells c
26
+ ON c.notebook_id=e.notebook_id AND c.cell_id=e.${field}
27
+ WHERE c.cell_id IS NULL`).all();
28
+ for (const row of missing)
29
+ issues.push(invalid(`edge:${row.edge_id}`, `Missing notebook-local ${field}`));
30
+ }
31
+ const files = database.prepare("SELECT artifact_id, path, object_hash FROM artifact_files").all();
32
+ for (const file of files) {
33
+ if (!file.path || file.path.startsWith("/") || file.path.includes("\\") || file.path.includes("\0")
34
+ || file.path.split("/").some((part) => part === "." || part === ".." || part === "")) {
35
+ issues.push(invalid(`artifact:${file.artifact_id}`, `Invalid source file path: ${file.path}`));
36
+ }
37
+ }
38
+ for (const [table, field] of [["book_metadata", "value_json"], ["artifact_metadata", "value_json"], ["entities", "data_json"],
39
+ ["runs", "cell_order_json"], ["runs", "outputs_json"], ["prompt_entries", "context_json"], ["messages", "body_json"], ["audio_waveforms", "peaks_json"]]) {
40
+ const rows = database.prepare(`SELECT ${field} AS value FROM ${table}`).all();
41
+ for (const row of rows) {
42
+ try {
43
+ JSON.parse(row.value);
44
+ }
45
+ catch {
46
+ issues.push(invalid(`${table}:${field}`, "Malformed JSON in legacy semantic state"));
47
+ }
48
+ }
49
+ }
50
+ return issues;
51
+ }
52
+ export function legacyStateSummary(database) {
53
+ const names = database.prepare("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name").all();
54
+ const tables = names.filter(({ name }) => !name.startsWith("runtime_") && !name.startsWith("sqlite_") && !name.startsWith("dolt_"))
55
+ .map(({ name }) => {
56
+ const rows = database.prepare(`SELECT * FROM "${name.replaceAll('"', '""')}"`).all();
57
+ const encoded = rows.map((row) => JSON.stringify(row, (_, value) => typeof value === "bigint" ? String(value) : value)).sort();
58
+ return { table: name, rows: rows.length, digest: digest(encoded) };
59
+ });
60
+ return { digest: digest(tables), tables };
61
+ }
62
+ function digest(value) {
63
+ return `sha256:${createHash("sha256").update(JSON.stringify(value)).digest("hex")}`;
64
+ }
65
+ function invalid(resource, message) {
66
+ return { code: "INVALID_REFERENCE", severity: "error", resource, message };
67
+ }
68
+ //# sourceMappingURL=migration-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-validation.js","sourceRoot":"","sources":["../src/migration-validation.ts"],"names":[],"mappings":"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"}