videobook-engine 2.0.1 → 5.0.1

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 (171) hide show
  1. package/README.md +99 -68
  2. package/dist/artifacts.d.ts +4 -9
  3. package/dist/artifacts.d.ts.map +1 -1
  4. package/dist/artifacts.js +78 -138
  5. package/dist/artifacts.js.map +1 -1
  6. package/dist/books.d.ts +1 -1
  7. package/dist/books.d.ts.map +1 -1
  8. package/dist/books.js +18 -10
  9. package/dist/books.js.map +1 -1
  10. package/dist/cas.d.ts +27 -1
  11. package/dist/cas.d.ts.map +1 -1
  12. package/dist/cas.js +78 -6
  13. package/dist/cas.js.map +1 -1
  14. package/dist/catalog-metadata.d.ts +56 -0
  15. package/dist/catalog-metadata.d.ts.map +1 -0
  16. package/dist/catalog-metadata.js +42 -0
  17. package/dist/catalog-metadata.js.map +1 -0
  18. package/dist/communications.js +4 -2
  19. package/dist/communications.js.map +1 -1
  20. package/dist/context.d.ts +9 -6
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +42 -51
  23. package/dist/context.js.map +1 -1
  24. package/dist/domain.d.ts +39 -2
  25. package/dist/domain.d.ts.map +1 -1
  26. package/dist/domain.js +846 -64
  27. package/dist/domain.js.map +1 -1
  28. package/dist/edit-policy.d.ts +3 -0
  29. package/dist/edit-policy.d.ts.map +1 -0
  30. package/dist/edit-policy.js +6 -0
  31. package/dist/edit-policy.js.map +1 -0
  32. package/dist/edits.d.ts +10 -0
  33. package/dist/edits.d.ts.map +1 -0
  34. package/dist/edits.js +1392 -0
  35. package/dist/edits.js.map +1 -0
  36. package/dist/engine-types.d.ts +171 -86
  37. package/dist/engine-types.d.ts.map +1 -1
  38. package/dist/engine-types.js +32 -0
  39. package/dist/engine-types.js.map +1 -1
  40. package/dist/engine.d.ts +89 -26
  41. package/dist/engine.d.ts.map +1 -1
  42. package/dist/engine.js +27 -21
  43. package/dist/engine.js.map +1 -1
  44. package/dist/files.d.ts.map +1 -1
  45. package/dist/files.js +32 -28
  46. package/dist/files.js.map +1 -1
  47. package/dist/fork.d.ts +148 -0
  48. package/dist/fork.d.ts.map +1 -0
  49. package/dist/fork.js +602 -0
  50. package/dist/fork.js.map +1 -0
  51. package/dist/generations.d.ts +9 -0
  52. package/dist/generations.d.ts.map +1 -0
  53. package/dist/generations.js +175 -0
  54. package/dist/generations.js.map +1 -0
  55. package/dist/history.d.ts +2 -5
  56. package/dist/history.d.ts.map +1 -1
  57. package/dist/history.js +183 -640
  58. package/dist/history.js.map +1 -1
  59. package/dist/index.d.ts +21 -7
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +15 -5
  62. package/dist/index.js.map +1 -1
  63. package/dist/job-queue.d.ts +2 -0
  64. package/dist/job-queue.d.ts.map +1 -1
  65. package/dist/job-queue.js +29 -2
  66. package/dist/job-queue.js.map +1 -1
  67. package/dist/media.d.ts +3 -3
  68. package/dist/media.d.ts.map +1 -1
  69. package/dist/media.js +6 -5
  70. package/dist/media.js.map +1 -1
  71. package/dist/merge-policy.d.ts +83 -0
  72. package/dist/merge-policy.d.ts.map +1 -0
  73. package/dist/merge-policy.js +203 -0
  74. package/dist/merge-policy.js.map +1 -0
  75. package/dist/metadata.d.ts.map +1 -1
  76. package/dist/metadata.js +17 -23
  77. package/dist/metadata.js.map +1 -1
  78. package/dist/migration.d.ts +9 -0
  79. package/dist/migration.d.ts.map +1 -0
  80. package/dist/migration.js +564 -0
  81. package/dist/migration.js.map +1 -0
  82. package/dist/mvp-contract-fixtures.d.ts +244 -0
  83. package/dist/mvp-contract-fixtures.d.ts.map +1 -0
  84. package/dist/mvp-contract-fixtures.js +556 -0
  85. package/dist/mvp-contract-fixtures.js.map +1 -0
  86. package/dist/mvp-contracts.d.ts +761 -0
  87. package/dist/mvp-contracts.d.ts.map +1 -0
  88. package/dist/mvp-contracts.js +59 -0
  89. package/dist/mvp-contracts.js.map +1 -0
  90. package/dist/mvp-time.d.ts +54 -0
  91. package/dist/mvp-time.d.ts.map +1 -0
  92. package/dist/mvp-time.js +148 -0
  93. package/dist/mvp-time.js.map +1 -0
  94. package/dist/notebook/types.d.ts +85 -8
  95. package/dist/notebook/types.d.ts.map +1 -1
  96. package/dist/notebook-grid.d.ts +37 -0
  97. package/dist/notebook-grid.d.ts.map +1 -0
  98. package/dist/notebook-grid.js +160 -0
  99. package/dist/notebook-grid.js.map +1 -0
  100. package/dist/notebook-media-artifact.d.ts +23 -0
  101. package/dist/notebook-media-artifact.d.ts.map +1 -0
  102. package/dist/notebook-media-artifact.js +67 -0
  103. package/dist/notebook-media-artifact.js.map +1 -0
  104. package/dist/notebook-mentions.d.ts +20 -0
  105. package/dist/notebook-mentions.d.ts.map +1 -0
  106. package/dist/notebook-mentions.js +53 -0
  107. package/dist/notebook-mentions.js.map +1 -0
  108. package/dist/order-keys.d.ts +22 -0
  109. package/dist/order-keys.d.ts.map +1 -0
  110. package/dist/order-keys.js +262 -0
  111. package/dist/order-keys.js.map +1 -0
  112. package/dist/runtime-services.js +8 -11
  113. package/dist/runtime-services.js.map +1 -1
  114. package/dist/schema.d.ts +8 -5
  115. package/dist/schema.d.ts.map +1 -1
  116. package/dist/schema.js +624 -141
  117. package/dist/schema.js.map +1 -1
  118. package/dist/search-benchmark.d.ts +4 -0
  119. package/dist/search-benchmark.d.ts.map +1 -0
  120. package/dist/search-benchmark.js +144 -0
  121. package/dist/search-benchmark.js.map +1 -0
  122. package/dist/sequences.d.ts +20 -0
  123. package/dist/sequences.d.ts.map +1 -0
  124. package/dist/sequences.js +825 -0
  125. package/dist/sequences.js.map +1 -0
  126. package/dist/similarity.js +10 -10
  127. package/dist/similarity.js.map +1 -1
  128. package/dist/status.js +8 -10
  129. package/dist/status.js.map +1 -1
  130. package/dist/storage.d.ts +3 -1
  131. package/dist/storage.d.ts.map +1 -1
  132. package/dist/storage.js +388 -7
  133. package/dist/storage.js.map +1 -1
  134. package/dist/store.d.ts +64 -3
  135. package/dist/store.d.ts.map +1 -1
  136. package/dist/store.js +354 -68
  137. package/dist/store.js.map +1 -1
  138. package/dist/streams.d.ts +10 -0
  139. package/dist/streams.d.ts.map +1 -0
  140. package/dist/streams.js +183 -0
  141. package/dist/streams.js.map +1 -0
  142. package/dist/temporal-models.d.ts +48 -0
  143. package/dist/temporal-models.d.ts.map +1 -0
  144. package/dist/temporal-models.js +278 -0
  145. package/dist/temporal-models.js.map +1 -0
  146. package/dist/temporal-search.d.ts +29 -0
  147. package/dist/temporal-search.d.ts.map +1 -0
  148. package/dist/temporal-search.js +1551 -0
  149. package/dist/temporal-search.js.map +1 -0
  150. package/dist/transcripts.d.ts +16 -0
  151. package/dist/transcripts.d.ts.map +1 -0
  152. package/dist/transcripts.js +519 -0
  153. package/dist/transcripts.js.map +1 -0
  154. package/docs/engine-layout.md +345 -110
  155. package/docs/mvp-prd.md +918 -0
  156. package/fixtures/media/vancat.mp4 +0 -0
  157. package/fixtures/media/vancat_profile.jpg +0 -0
  158. package/fixtures/v5/contract-fixtures.json +1532 -0
  159. package/package.json +42 -5
  160. package/dist/history-types.d.ts +0 -74
  161. package/dist/history-types.d.ts.map +0 -1
  162. package/dist/history-types.js +0 -2
  163. package/dist/history-types.js.map +0 -1
  164. package/dist/resolver.d.ts +0 -15
  165. package/dist/resolver.d.ts.map +0 -1
  166. package/dist/resolver.js +0 -81
  167. package/dist/resolver.js.map +0 -1
  168. package/dist/timeline.d.ts +0 -9
  169. package/dist/timeline.d.ts.map +0 -1
  170. package/dist/timeline.js +0 -236
  171. package/dist/timeline.js.map +0 -1
@@ -0,0 +1,564 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, linkSync, mkdirSync, statSync } from "node:fs";
3
+ import { copyFile, mkdir, readdir, rm } from "node:fs/promises";
4
+ import * as path from "node:path";
5
+ import { DatabaseSync } from "@dolthub/doltlite";
6
+ import { v7 as uuidv7 } from "uuid";
7
+ import { ObjectStore } from "./cas.js";
8
+ import { createEngine } from "./engine.js";
9
+ import { initialOrderKeys } from "./order-keys.js";
10
+ import { err, ok, } from "./engine-types.js";
11
+ import { MVP_CONTRACT_VERSION, MVP_LEGACY_SCHEMA_VERSION, MVP_SCHEMA_VERSION, } from "./mvp-contracts.js";
12
+ import { SEMANTIC_TABLES } from "./schema.js";
13
+ const COPY_TABLES = [
14
+ "book",
15
+ "artifacts",
16
+ "objects",
17
+ "artifact_files",
18
+ "book_metadata",
19
+ "artifact_metadata",
20
+ "entities",
21
+ "notebooks",
22
+ "audio_waveforms",
23
+ "prompt_entries",
24
+ "messages",
25
+ "job_runs",
26
+ ];
27
+ export function dryRunV4Migration(sourceRoot) {
28
+ let database;
29
+ try {
30
+ const root = path.resolve(sourceRoot);
31
+ const databasePath = path.join(root, "data", "videobook.db");
32
+ if (!existsSync(databasePath)) {
33
+ return err({
34
+ code: "NOT_FOUND",
35
+ message: `Schema-v4 catalog not found: ${databasePath}`,
36
+ });
37
+ }
38
+ database = new DatabaseSync(databasePath, { readOnly: true });
39
+ const schema = database
40
+ .prepare("SELECT version FROM engine_schema WHERE singleton=1")
41
+ .get();
42
+ if (schema?.version !== MVP_LEGACY_SCHEMA_VERSION) {
43
+ return err({
44
+ code: "SCHEMA_INCOMPATIBLE",
45
+ message: `Expected schema ${MVP_LEGACY_SCHEMA_VERSION}; found ${schema?.version ?? "unknown"}`,
46
+ });
47
+ }
48
+ const book = sourceBook(database);
49
+ const sourceHeadRevision = database.doltLog({ limit: 1 })[0]?.commit_hash ?? "";
50
+ const artifactCount = count(database, "artifacts");
51
+ const notebookCount = count(database, "notebooks");
52
+ const timelineSlotCount = count(database, "timeline_slots");
53
+ const timelineAudioCount = count(database, "timeline_audio");
54
+ const objectCount = count(database, "objects");
55
+ const issues = migrationIssues(database, root, book.book_id);
56
+ const migrationKey = migrationDigest({
57
+ sourceBookId: book.book_id,
58
+ sourceHeadRevision,
59
+ artifactCount,
60
+ notebookCount,
61
+ timelineSlotCount,
62
+ timelineAudioCount,
63
+ objectCount,
64
+ });
65
+ return ok({
66
+ contractVersion: MVP_CONTRACT_VERSION,
67
+ sourceSchemaVersion: MVP_LEGACY_SCHEMA_VERSION,
68
+ destinationSchemaVersion: MVP_SCHEMA_VERSION,
69
+ sourceBookId: book.book_id,
70
+ sourceHeadRevision,
71
+ artifactCount,
72
+ notebookCount,
73
+ timelineSlotCount,
74
+ timelineAudioCount,
75
+ objectCount,
76
+ estimatedReindexArtifacts: artifactCount,
77
+ issues,
78
+ migrationKey,
79
+ });
80
+ }
81
+ catch (cause) {
82
+ return err(migrationError(cause));
83
+ }
84
+ finally {
85
+ database?.close();
86
+ }
87
+ }
88
+ export function readV4BookIdentity(sourceRoot) {
89
+ let database;
90
+ try {
91
+ database = new DatabaseSync(path.join(path.resolve(sourceRoot), "data", "videobook.db"), { readOnly: true });
92
+ const schema = database
93
+ .prepare("SELECT version FROM engine_schema WHERE singleton=1")
94
+ .get();
95
+ if (schema?.version !== MVP_LEGACY_SCHEMA_VERSION) {
96
+ return err({
97
+ code: "SCHEMA_INCOMPATIBLE",
98
+ message: `Expected schema ${MVP_LEGACY_SCHEMA_VERSION}; found ${schema?.version ?? "unknown"}`,
99
+ });
100
+ }
101
+ const book = sourceBook(database);
102
+ return ok({ bookId: book.book_id, slug: book.slug });
103
+ }
104
+ catch (cause) {
105
+ return err(migrationError(cause));
106
+ }
107
+ finally {
108
+ database?.close();
109
+ }
110
+ }
111
+ export async function migrateV4(request) {
112
+ const dryRun = dryRunV4Migration(request.sourceRoot);
113
+ if (!dryRun.ok)
114
+ return dryRun;
115
+ if (request.expectedSourceBookId
116
+ && request.expectedSourceBookId !== dryRun.value.sourceBookId) {
117
+ return err({
118
+ code: "STALE_REVISION",
119
+ message: "Schema-v4 source book identity changed after confirmation",
120
+ });
121
+ }
122
+ if (request.expectedSourceHead
123
+ && request.expectedSourceHead !== dryRun.value.sourceHeadRevision) {
124
+ return err({
125
+ code: "STALE_REVISION",
126
+ message: "Schema-v4 source head changed after confirmation",
127
+ });
128
+ }
129
+ if (request.dryRun)
130
+ return dryRun;
131
+ const blocking = dryRun.value.issues.filter((issue) => issue.severity === "error");
132
+ if (blocking.length > 0) {
133
+ return err({
134
+ code: "OBJECT_UNAVAILABLE",
135
+ message: "Schema-v4 migration has blocking source issues",
136
+ details: { issues: blocking },
137
+ });
138
+ }
139
+ const sourceRoot = path.resolve(request.sourceRoot);
140
+ const destinationRoot = path.resolve(request.destinationRoot);
141
+ if (sourceRoot === destinationRoot || isInside(sourceRoot, destinationRoot)) {
142
+ return err({
143
+ code: "INVALID_INPUT",
144
+ message: "Migration destination must be separate from the schema-v4 root",
145
+ });
146
+ }
147
+ const destinationCheck = await emptyDestination(destinationRoot);
148
+ if (!destinationCheck.ok)
149
+ return destinationCheck;
150
+ let sourceDatabase;
151
+ let destinationDatabase;
152
+ let destinationCreated = false;
153
+ try {
154
+ sourceDatabase = new DatabaseSync(path.join(sourceRoot, "data", "videobook.db"), { readOnly: true });
155
+ const book = sourceBook(sourceDatabase);
156
+ const initial = createEngine({
157
+ rootDir: destinationRoot,
158
+ initialBookName: book.slug,
159
+ });
160
+ await initial.ready;
161
+ initial.close();
162
+ destinationCreated = true;
163
+ destinationDatabase = new DatabaseSync(path.join(destinationRoot, "data", "videobook.db"));
164
+ destinationDatabase.exec("PRAGMA foreign_keys=OFF");
165
+ clearFreshDestination(destinationDatabase);
166
+ for (const table of COPY_TABLES) {
167
+ if (table === "notebooks") {
168
+ copyLegacyNotebooks(sourceDatabase, destinationDatabase);
169
+ }
170
+ else if (table === "book") {
171
+ copyLegacyBook(sourceDatabase, destinationDatabase);
172
+ }
173
+ else if (table === "artifacts") {
174
+ copyLegacyArtifacts(sourceDatabase, destinationDatabase);
175
+ }
176
+ else {
177
+ copyTable(sourceDatabase, destinationDatabase, table);
178
+ }
179
+ }
180
+ destinationDatabase
181
+ .prepare("UPDATE engine_schema SET version=? WHERE singleton=1")
182
+ .run(MVP_SCHEMA_VERSION);
183
+ // The legacy timeline triple does not exist in the v17 schema: the
184
+ // timeline row only pins the primary sequence's render orientation, and
185
+ // still-image slots convert into clips on that sequence. Timed-media
186
+ // slots and timeline audio are dropped with a PROBE_REQUIRED dry-run
187
+ // warning because clip conversion needs a media probe the v4 import
188
+ // does not perform.
189
+ initializePrimarySequence(destinationDatabase, book.book_id, sourceRender(sourceDatabase, book.book_id));
190
+ convertStillTimelineSlots(sourceDatabase, destinationDatabase);
191
+ stageMigration(destinationDatabase);
192
+ destinationDatabase.close();
193
+ destinationDatabase = undefined;
194
+ const objectCounts = await copyObjects(sourceDatabase, sourceRoot, destinationRoot);
195
+ sourceDatabase.close();
196
+ sourceDatabase = undefined;
197
+ const engine = createEngine({ rootDir: destinationRoot });
198
+ await engine.ready;
199
+ const reportArtifact = await engine.artifacts.create({
200
+ kind: "script",
201
+ label: "migration-report",
202
+ });
203
+ if (!reportArtifact.ok) {
204
+ engine.close();
205
+ return reportArtifact;
206
+ }
207
+ const report = {
208
+ ...dryRun.value,
209
+ conversion: {
210
+ timeline: "still-image-slots-converted; timed-media-requires-probe",
211
+ similarity: "runtime-v4-discarded; v5-reindex-required",
212
+ sourceRoot,
213
+ },
214
+ };
215
+ const reportFile = await engine.files.write(reportArtifact.value.artifactId, "migration-report.json", JSON.stringify(report));
216
+ if (!reportFile.ok) {
217
+ engine.close();
218
+ return reportFile;
219
+ }
220
+ // The import audit is an authored Dolt commit like every other record:
221
+ // the audit payload lands in book_metadata and the commit hash becomes
222
+ // the import's durable handle (importActionId).
223
+ const audit = await engine.metadata.book.write(`migration.${dryRun.value.migrationKey.replaceAll(":", ".")}`, {
224
+ operation: "import_schema_v4",
225
+ migrationKey: dryRun.value.migrationKey,
226
+ sourceBookId: dryRun.value.sourceBookId,
227
+ sourceHeadRevision: dryRun.value.sourceHeadRevision,
228
+ sourceSchemaVersion: MVP_LEGACY_SCHEMA_VERSION,
229
+ destinationSchemaVersion: MVP_SCHEMA_VERSION,
230
+ reportArtifactId: reportArtifact.value.artifactId,
231
+ });
232
+ if (!audit.ok) {
233
+ engine.close();
234
+ return audit;
235
+ }
236
+ if (!audit.revision) {
237
+ engine.close();
238
+ return err({
239
+ code: "STORAGE_ERROR",
240
+ message: "Migration audit commit did not return a revision",
241
+ });
242
+ }
243
+ const result = {
244
+ ...dryRun.value,
245
+ destinationBookId: engine.book.get().bookId,
246
+ destinationRevision: engine.head,
247
+ importActionId: audit.revision,
248
+ reportArtifactId: reportArtifact.value.artifactId,
249
+ copiedObjectCount: objectCounts.copied,
250
+ reusedObjectCount: objectCounts.reused,
251
+ completedAt: Date.now(),
252
+ };
253
+ engine.close();
254
+ return ok(result);
255
+ }
256
+ catch (cause) {
257
+ sourceDatabase?.close();
258
+ destinationDatabase?.close();
259
+ if (destinationCreated) {
260
+ await rm(destinationRoot, { recursive: true, force: true });
261
+ }
262
+ return err(migrationError(cause));
263
+ }
264
+ }
265
+ function sourceBook(database) {
266
+ const books = database
267
+ .prepare("SELECT book_id, slug FROM book")
268
+ .all();
269
+ if (books.length !== 1) {
270
+ throw new Error(`Schema-v4 catalog must contain one book; found ${books.length}`);
271
+ }
272
+ return books[0];
273
+ }
274
+ function count(database, table) {
275
+ const row = database
276
+ .prepare(`SELECT COUNT(*) AS total FROM ${table}`)
277
+ .get();
278
+ return row.total;
279
+ }
280
+ function migrationIssues(database, root, bookId) {
281
+ const issues = [];
282
+ const objects = database
283
+ .prepare("SELECT object_hash FROM objects ORDER BY object_hash")
284
+ .all();
285
+ for (const object of objects) {
286
+ if (!existsSync(objectPath(root, object.object_hash))) {
287
+ issues.push({
288
+ code: "MISSING_OBJECT",
289
+ severity: "error",
290
+ resource: `object:${object.object_hash}`,
291
+ message: "Content-addressed object is missing from the schema-v4 root",
292
+ });
293
+ }
294
+ }
295
+ const timedSlots = database
296
+ .prepare(`SELECT s.slot_id, a.artifact_id, a.kind
297
+ FROM timeline_slots s
298
+ JOIN artifacts a ON a.artifact_id=s.artifact_id
299
+ WHERE a.kind <> 'image'
300
+ ORDER BY s.ordinal, s.slot_id`)
301
+ .all();
302
+ for (const slot of timedSlots) {
303
+ issues.push({
304
+ code: "PROBE_REQUIRED",
305
+ severity: "warning",
306
+ resource: `timeline-slot:${slot.slot_id}`,
307
+ message: `${slot.kind} timeline source requires media probing before clip conversion`,
308
+ details: { artifactId: slot.artifact_id },
309
+ });
310
+ }
311
+ if (count(database, "artifacts") > 0) {
312
+ issues.push({
313
+ code: "REINDEX_REQUIRED",
314
+ severity: "warning",
315
+ resource: `book:${bookId}`,
316
+ message: "Schema-v4 similarity rows are discarded and rebuilt under v5 manifests",
317
+ });
318
+ }
319
+ return issues;
320
+ }
321
+ function migrationDigest(value) {
322
+ const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
323
+ return `sha256:${createHash("sha256")
324
+ .update(JSON.stringify(entries))
325
+ .digest("hex")}`;
326
+ }
327
+ async function emptyDestination(destinationRoot) {
328
+ if (!existsSync(destinationRoot))
329
+ return ok(true);
330
+ const entries = await readdir(destinationRoot);
331
+ return entries.length === 0
332
+ ? ok(true)
333
+ : err({
334
+ code: "ALREADY_EXISTS",
335
+ message: `Migration destination is not empty: ${destinationRoot}`,
336
+ });
337
+ }
338
+ function clearFreshDestination(database) {
339
+ database.exec(`
340
+ DELETE FROM sequence_tracks;
341
+ DELETE FROM sequences;
342
+ DELETE FROM book;
343
+ `);
344
+ }
345
+ function copyTable(source, destination, table) {
346
+ const sourceColumns = columns(source, table);
347
+ const destinationColumns = new Set(columns(destination, table));
348
+ const shared = sourceColumns.filter((column) => destinationColumns.has(column));
349
+ if (shared.length === 0)
350
+ return;
351
+ const rows = source
352
+ .prepare(`SELECT ${shared.join(", ")} FROM ${table}`)
353
+ .all();
354
+ if (rows.length === 0)
355
+ return;
356
+ const placeholders = shared.map(() => "?").join(", ");
357
+ const insert = destination.prepare(`INSERT INTO ${table}(${shared.join(", ")}) VALUES (${placeholders})`);
358
+ for (const row of rows) {
359
+ insert.run(...shared.map((column) => row[column] ?? null));
360
+ }
361
+ }
362
+ /**
363
+ * Legacy schema-v4 catalogs name books and artifacts with slugs; the
364
+ * current schema stores free-text name/label columns instead, so the old
365
+ * slug is carried over as the display text.
366
+ */
367
+ function copyLegacyBook(source, destination) {
368
+ const rows = source
369
+ .prepare("SELECT book_id, slug, created_at FROM book")
370
+ .all();
371
+ const insert = destination.prepare("INSERT INTO book(book_id, name, created_at) VALUES (?, ?, ?)");
372
+ for (const row of rows) {
373
+ insert.run(row.book_id, row.slug, row.created_at);
374
+ }
375
+ }
376
+ function copyLegacyArtifacts(source, destination) {
377
+ const rows = source
378
+ .prepare("SELECT artifact_id, slug, kind, created_at FROM artifacts")
379
+ .all();
380
+ const insert = destination.prepare(`INSERT INTO artifacts(artifact_id, label, kind, created_at)
381
+ VALUES (?, ?, ?, ?)`);
382
+ for (const row of rows) {
383
+ insert.run(row.artifact_id, row.slug, row.kind, row.created_at);
384
+ }
385
+ }
386
+ function copyLegacyNotebooks(source, destination) {
387
+ const rows = source
388
+ .prepare(`SELECT notebook_id, name, properties_json, created_at
389
+ FROM notebooks ORDER BY notebook_id`)
390
+ .all();
391
+ const insert = destination.prepare(`INSERT INTO notebooks(
392
+ notebook_id, name, created_at
393
+ ) VALUES (?, ?, ?)`);
394
+ for (const row of rows) {
395
+ insert.run(row.notebook_id, row.name, row.created_at);
396
+ }
397
+ }
398
+ function columns(database, table) {
399
+ return database.prepare(`PRAGMA table_info(${table})`).all().map((column) => column.name);
400
+ }
401
+ function sourceRender(database, bookId) {
402
+ const timeline = database
403
+ .prepare("SELECT render FROM timeline WHERE book_id=?")
404
+ .get(bookId);
405
+ return timeline?.render ?? "landscape";
406
+ }
407
+ function initializePrimarySequence(database, bookId, render) {
408
+ const [width, height] = render === "portrait"
409
+ ? [1080, 1920]
410
+ : render === "square"
411
+ ? [1080, 1080]
412
+ : [1920, 1080];
413
+ const now = Date.now();
414
+ const sequenceId = uuidv7();
415
+ database.prepare(`INSERT INTO sequences(
416
+ sequence_id, book_id, name, is_primary, width, height,
417
+ pixel_aspect_numerator, pixel_aspect_denominator,
418
+ frame_rate_numerator, frame_rate_denominator,
419
+ audio_sample_rate_hz, audio_channel_layout,
420
+ background_rgba_json, created_at
421
+ ) VALUES (?, ?, 'Main', 1, ?, ?, 1, 1, 30, 1, 48000, 'stereo', ?, ?)`).run(sequenceId, bookId, width, height, "[0,0,0,1]", now);
422
+ const insert = database.prepare(`INSERT INTO sequence_tracks(
423
+ track_id, sequence_id, kind, order_key, name,
424
+ enabled, locked, muted, solo, blend_mode
425
+ ) VALUES (?, ?, ?, ?, ?, 1, 0, ?, ?, ?)`);
426
+ const videoKeys = initialOrderKeys(2);
427
+ insert.run(uuidv7(), sequenceId, "video", videoKeys[0], "Video 1", null, null, "normal");
428
+ insert.run(uuidv7(), sequenceId, "video", videoKeys[1], "Video 2", null, null, "normal");
429
+ const audioKeys = initialOrderKeys(4);
430
+ for (let ordinal = 0; ordinal < 4; ordinal += 1) {
431
+ insert.run(uuidv7(), sequenceId, "audio", audioKeys[ordinal], `Audio ${ordinal + 1}`, 0, 0, null);
432
+ }
433
+ insert.run(uuidv7(), sequenceId, "caption", initialOrderKeys(1)[0], "Captions", null, null, null);
434
+ }
435
+ /**
436
+ * Legacy still-image timeline slots become clips on the primary sequence's
437
+ * first video track, laid out back to back in legacy (ordinal, slot_id)
438
+ * order. Timed media is not converted: the dry run flags every non-image
439
+ * slot with PROBE_REQUIRED because clip conversion needs media probing the
440
+ * import does not perform.
441
+ */
442
+ function convertStillTimelineSlots(source, destination) {
443
+ const sequence = destination
444
+ .prepare("SELECT sequence_id FROM sequences WHERE is_primary=1")
445
+ .get();
446
+ const track = destination
447
+ .prepare(`SELECT track_id FROM sequence_tracks
448
+ WHERE sequence_id=? AND kind='video'
449
+ ORDER BY order_key, track_id LIMIT 1`)
450
+ .get(sequence.sequence_id);
451
+ const rows = source
452
+ .prepare(`SELECT s.slot_id, s.artifact_id, s.ordinal, a.kind,
453
+ f.path AS source_path, f.object_hash
454
+ FROM timeline_slots s
455
+ JOIN artifacts a ON a.artifact_id=s.artifact_id
456
+ LEFT JOIN artifact_files f ON f.artifact_id=a.artifact_id
457
+ WHERE a.kind='image'
458
+ ORDER BY s.ordinal, s.slot_id, f.path`)
459
+ .all();
460
+ const seen = new Set();
461
+ const insertClip = destination.prepare(`INSERT INTO sequence_clips(
462
+ clip_id, track_id, source_kind, artifact_id, source_path,
463
+ stream_id, object_hash, source_start_tick, source_duration_ticks,
464
+ time_base_numerator, time_base_denominator, timeline_start_frame,
465
+ duration_frames, speed_numerator, speed_denominator, reverse,
466
+ audio_policy, gain_db, audio_muted, fade_in_frames, fade_out_frames,
467
+ enabled
468
+ ) VALUES (?, ?, 'still', ?, ?, NULL, ?, NULL, NULL, NULL, NULL,
469
+ ?, 90, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1)`);
470
+ const insertTransform = destination.prepare(`INSERT INTO clip_transforms(
471
+ clip_id, fit, position_x, position_y, scale_x, scale_y,
472
+ anchor_x, anchor_y, rotation_degrees, crop_top, crop_right,
473
+ crop_bottom, crop_left, opacity, blend_mode
474
+ ) VALUES (?, 'fit', 0, 0, 1, 1, 0.5, 0.5, 0, 0, 0, 0, 0, 1, 'normal')`);
475
+ let ordinal = 0;
476
+ for (const row of rows) {
477
+ if (seen.has(row.slot_id) || !row.source_path || !row.object_hash)
478
+ continue;
479
+ seen.add(row.slot_id);
480
+ const clipId = uuidv7();
481
+ insertClip.run(clipId, track.track_id, row.artifact_id, row.source_path, row.object_hash, ordinal * 90);
482
+ insertTransform.run(clipId);
483
+ ordinal += 1;
484
+ }
485
+ }
486
+ function stageMigration(database) {
487
+ for (const table of SEMANTIC_TABLES) {
488
+ database.prepare("SELECT dolt_add(?) AS result").get(table);
489
+ }
490
+ const committed = database
491
+ .prepare("SELECT dolt_commit('-m', ?) AS hash")
492
+ .get("Import schema-v4 current state");
493
+ if (!committed?.hash)
494
+ throw new Error("Migration commit did not return a hash");
495
+ }
496
+ async function copyObjects(source, sourceRoot, destinationRoot) {
497
+ const destinationObjects = path.join(destinationRoot, "data", "objects", "sha256");
498
+ const store = new ObjectStore(destinationObjects);
499
+ const objects = source
500
+ .prepare("SELECT object_hash FROM objects ORDER BY object_hash")
501
+ .all();
502
+ let copied = 0;
503
+ let reused = 0;
504
+ for (const object of objects) {
505
+ const sourcePath = objectPath(sourceRoot, object.object_hash);
506
+ const destinationPath = store.pathFor(object.object_hash);
507
+ if (existsSync(destinationPath)) {
508
+ reused += 1;
509
+ continue;
510
+ }
511
+ mkdirSync(path.dirname(destinationPath), { recursive: true });
512
+ try {
513
+ linkSync(sourcePath, destinationPath);
514
+ copied += 1;
515
+ }
516
+ catch {
517
+ const imported = await store.import(sourcePath);
518
+ if (imported.hash !== object.object_hash) {
519
+ throw new Error(`Object hash changed during migration: ${object.object_hash}`);
520
+ }
521
+ copied += 1;
522
+ }
523
+ }
524
+ await copyWorkspaceMetadata(sourceRoot, destinationRoot);
525
+ return { copied, reused };
526
+ }
527
+ async function copyWorkspaceMetadata(sourceRoot, destinationRoot) {
528
+ const source = path.join(sourceRoot, "workspaces");
529
+ if (!existsSync(source) || !statSync(source).isDirectory())
530
+ return;
531
+ const destination = path.join(destinationRoot, "workspaces");
532
+ await mkdir(destination, { recursive: true });
533
+ const entries = await readdir(source, { withFileTypes: true });
534
+ for (const entry of entries) {
535
+ if (!entry.isFile())
536
+ continue;
537
+ await copyFile(path.join(source, entry.name), path.join(destination, entry.name));
538
+ }
539
+ }
540
+ function objectPath(root, objectHash) {
541
+ return path.join(root, "data", "objects", "sha256", objectHash.slice(0, 2), objectHash);
542
+ }
543
+ function isInside(parent, candidate) {
544
+ const relative = path.relative(parent, candidate);
545
+ return relative !== ""
546
+ && relative !== ".."
547
+ && !relative.startsWith(`..${path.sep}`);
548
+ }
549
+ function migrationError(cause) {
550
+ if (typeof cause === "object"
551
+ && cause !== null
552
+ && "error" in cause
553
+ && typeof cause.error === "object"
554
+ && cause.error !== null
555
+ && "code" in cause.error
556
+ && "message" in cause.error) {
557
+ return cause.error;
558
+ }
559
+ return {
560
+ code: "IO_ERROR",
561
+ message: cause instanceof Error ? cause.message : String(cause),
562
+ };
563
+ }
564
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"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"}