videobook-engine 2.0.1 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -41
- package/dist/artifact-names.d.ts +6 -0
- package/dist/artifact-names.d.ts.map +1 -0
- package/dist/artifact-names.js +56 -0
- package/dist/artifact-names.js.map +1 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +57 -23
- package/dist/artifacts.js.map +1 -1
- package/dist/books.js +2 -1
- package/dist/books.js.map +1 -1
- package/dist/cas.d.ts +27 -1
- package/dist/cas.d.ts.map +1 -1
- package/dist/cas.js +78 -6
- package/dist/cas.js.map +1 -1
- package/dist/catalog-metadata.d.ts +56 -0
- package/dist/catalog-metadata.d.ts.map +1 -0
- package/dist/catalog-metadata.js +42 -0
- package/dist/catalog-metadata.js.map +1 -0
- package/dist/communications.js +4 -2
- package/dist/communications.js.map +1 -1
- package/dist/context.d.ts +6 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +35 -6
- package/dist/context.js.map +1 -1
- package/dist/domain.d.ts +4 -0
- package/dist/domain.d.ts.map +1 -1
- package/dist/domain.js +870 -58
- package/dist/domain.js.map +1 -1
- package/dist/edit-policy.d.ts +3 -0
- package/dist/edit-policy.d.ts.map +1 -0
- package/dist/edit-policy.js +6 -0
- package/dist/edit-policy.js.map +1 -0
- package/dist/edits.d.ts +10 -0
- package/dist/edits.d.ts.map +1 -0
- package/dist/edits.js +1392 -0
- package/dist/edits.js.map +1 -0
- package/dist/engine-types.d.ts +110 -60
- package/dist/engine-types.d.ts.map +1 -1
- package/dist/engine-types.js +33 -0
- package/dist/engine-types.js.map +1 -1
- package/dist/engine.d.ts +69 -8
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +24 -18
- package/dist/engine.js.map +1 -1
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +31 -27
- package/dist/files.js.map +1 -1
- package/dist/fork.d.ts +147 -0
- package/dist/fork.d.ts.map +1 -0
- package/dist/fork.js +609 -0
- package/dist/fork.js.map +1 -0
- package/dist/history.d.ts +0 -4
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +166 -595
- package/dist/history.js.map +1 -1
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +2 -0
- package/dist/job-queue.d.ts.map +1 -1
- package/dist/job-queue.js +29 -2
- package/dist/job-queue.js.map +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +1 -0
- package/dist/media.js.map +1 -1
- package/dist/merge-policy.d.ts +99 -0
- package/dist/merge-policy.d.ts.map +1 -0
- package/dist/merge-policy.js +310 -0
- package/dist/merge-policy.js.map +1 -0
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +15 -20
- package/dist/metadata.js.map +1 -1
- package/dist/migration.d.ts +9 -0
- package/dist/migration.d.ts.map +1 -0
- package/dist/migration.js +534 -0
- package/dist/migration.js.map +1 -0
- package/dist/mvp-contract-fixtures.d.ts +244 -0
- package/dist/mvp-contract-fixtures.d.ts.map +1 -0
- package/dist/mvp-contract-fixtures.js +556 -0
- package/dist/mvp-contract-fixtures.js.map +1 -0
- package/dist/mvp-contracts.d.ts +761 -0
- package/dist/mvp-contracts.d.ts.map +1 -0
- package/dist/mvp-contracts.js +59 -0
- package/dist/mvp-contracts.js.map +1 -0
- package/dist/mvp-time.d.ts +54 -0
- package/dist/mvp-time.d.ts.map +1 -0
- package/dist/mvp-time.js +148 -0
- package/dist/mvp-time.js.map +1 -0
- package/dist/notebook/types.d.ts +113 -8
- package/dist/notebook/types.d.ts.map +1 -1
- package/dist/order-keys.d.ts +22 -0
- package/dist/order-keys.d.ts.map +1 -0
- package/dist/order-keys.js +262 -0
- package/dist/order-keys.js.map +1 -0
- package/dist/runtime-services.js +4 -2
- package/dist/runtime-services.js.map +1 -1
- package/dist/schema.d.ts +24 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +644 -132
- package/dist/schema.js.map +1 -1
- package/dist/search-benchmark.d.ts +4 -0
- package/dist/search-benchmark.d.ts.map +1 -0
- package/dist/search-benchmark.js +144 -0
- package/dist/search-benchmark.js.map +1 -0
- package/dist/sequences.d.ts +20 -0
- package/dist/sequences.d.ts.map +1 -0
- package/dist/sequences.js +825 -0
- package/dist/sequences.js.map +1 -0
- package/dist/similarity.js +1 -1
- package/dist/storage.d.ts +3 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +388 -7
- package/dist/storage.js.map +1 -1
- package/dist/store.d.ts +63 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +351 -65
- package/dist/store.js.map +1 -1
- package/dist/streams.d.ts +10 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +183 -0
- package/dist/streams.js.map +1 -0
- package/dist/temporal-models.d.ts +48 -0
- package/dist/temporal-models.d.ts.map +1 -0
- package/dist/temporal-models.js +278 -0
- package/dist/temporal-models.js.map +1 -0
- package/dist/temporal-search.d.ts +29 -0
- package/dist/temporal-search.d.ts.map +1 -0
- package/dist/temporal-search.js +1507 -0
- package/dist/temporal-search.js.map +1 -0
- package/dist/transcripts.d.ts +16 -0
- package/dist/transcripts.d.ts.map +1 -0
- package/dist/transcripts.js +519 -0
- package/dist/transcripts.js.map +1 -0
- package/docs/engine-layout.md +346 -106
- package/docs/mvp-prd.md +918 -0
- package/fixtures/media/vancat.mp4 +0 -0
- package/fixtures/media/vancat_profile.jpg +0 -0
- package/fixtures/v5/contract-fixtures.json +1532 -0
- package/package.json +30 -5
- package/dist/history-types.d.ts +0 -74
- package/dist/history-types.d.ts.map +0 -1
- package/dist/history-types.js +0 -2
- package/dist/history-types.js.map +0 -1
- package/dist/timeline.d.ts +0 -9
- package/dist/timeline.d.ts.map +0 -1
- package/dist/timeline.js +0 -236
- package/dist/timeline.js.map +0 -1
|
@@ -0,0 +1,534 @@
|
|
|
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
|
+
initialBookSlug: 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 {
|
|
171
|
+
copyTable(sourceDatabase, destinationDatabase, table);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
destinationDatabase
|
|
175
|
+
.prepare("UPDATE engine_schema SET version=? WHERE singleton=1")
|
|
176
|
+
.run(MVP_SCHEMA_VERSION);
|
|
177
|
+
// The legacy timeline triple does not exist in the v17 schema: the
|
|
178
|
+
// timeline row only pins the primary sequence's render orientation, and
|
|
179
|
+
// still-image slots convert into clips on that sequence. Timed-media
|
|
180
|
+
// slots and timeline audio are dropped with a PROBE_REQUIRED dry-run
|
|
181
|
+
// warning because clip conversion needs a media probe the v4 import
|
|
182
|
+
// does not perform.
|
|
183
|
+
initializePrimarySequence(destinationDatabase, book.book_id, sourceRender(sourceDatabase, book.book_id));
|
|
184
|
+
convertStillTimelineSlots(sourceDatabase, destinationDatabase);
|
|
185
|
+
stageMigration(destinationDatabase);
|
|
186
|
+
destinationDatabase.close();
|
|
187
|
+
destinationDatabase = undefined;
|
|
188
|
+
const objectCounts = await copyObjects(sourceDatabase, sourceRoot, destinationRoot);
|
|
189
|
+
sourceDatabase.close();
|
|
190
|
+
sourceDatabase = undefined;
|
|
191
|
+
const engine = createEngine({ rootDir: destinationRoot });
|
|
192
|
+
await engine.ready;
|
|
193
|
+
const reportArtifact = await engine.artifacts.create({
|
|
194
|
+
kind: "script",
|
|
195
|
+
slug: "migration-report",
|
|
196
|
+
});
|
|
197
|
+
if (!reportArtifact.ok) {
|
|
198
|
+
engine.close();
|
|
199
|
+
return reportArtifact;
|
|
200
|
+
}
|
|
201
|
+
const report = {
|
|
202
|
+
...dryRun.value,
|
|
203
|
+
conversion: {
|
|
204
|
+
timeline: "still-image-slots-converted; timed-media-requires-probe",
|
|
205
|
+
similarity: "runtime-v4-discarded; v5-reindex-required",
|
|
206
|
+
sourceRoot,
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
const reportFile = await engine.files.write(reportArtifact.value.artifactId, "migration-report.json", JSON.stringify(report));
|
|
210
|
+
if (!reportFile.ok) {
|
|
211
|
+
engine.close();
|
|
212
|
+
return reportFile;
|
|
213
|
+
}
|
|
214
|
+
// The import audit is an authored Dolt commit like every other record:
|
|
215
|
+
// the audit payload lands in book_metadata and the commit hash becomes
|
|
216
|
+
// the import's durable handle (importActionId).
|
|
217
|
+
const audit = await engine.metadata.book.write(`migration.${dryRun.value.migrationKey.replaceAll(":", ".")}`, {
|
|
218
|
+
operation: "import_schema_v4",
|
|
219
|
+
migrationKey: dryRun.value.migrationKey,
|
|
220
|
+
sourceBookId: dryRun.value.sourceBookId,
|
|
221
|
+
sourceHeadRevision: dryRun.value.sourceHeadRevision,
|
|
222
|
+
sourceSchemaVersion: MVP_LEGACY_SCHEMA_VERSION,
|
|
223
|
+
destinationSchemaVersion: MVP_SCHEMA_VERSION,
|
|
224
|
+
reportArtifactId: reportArtifact.value.artifactId,
|
|
225
|
+
});
|
|
226
|
+
if (!audit.ok) {
|
|
227
|
+
engine.close();
|
|
228
|
+
return audit;
|
|
229
|
+
}
|
|
230
|
+
if (!audit.revision) {
|
|
231
|
+
engine.close();
|
|
232
|
+
return err({
|
|
233
|
+
code: "STORAGE_ERROR",
|
|
234
|
+
message: "Migration audit commit did not return a revision",
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
const result = {
|
|
238
|
+
...dryRun.value,
|
|
239
|
+
destinationBookId: engine.book.get().bookId,
|
|
240
|
+
destinationRevision: engine.head,
|
|
241
|
+
importActionId: audit.revision,
|
|
242
|
+
reportArtifactId: reportArtifact.value.artifactId,
|
|
243
|
+
copiedObjectCount: objectCounts.copied,
|
|
244
|
+
reusedObjectCount: objectCounts.reused,
|
|
245
|
+
completedAt: Date.now(),
|
|
246
|
+
};
|
|
247
|
+
engine.close();
|
|
248
|
+
return ok(result);
|
|
249
|
+
}
|
|
250
|
+
catch (cause) {
|
|
251
|
+
sourceDatabase?.close();
|
|
252
|
+
destinationDatabase?.close();
|
|
253
|
+
if (destinationCreated) {
|
|
254
|
+
await rm(destinationRoot, { recursive: true, force: true });
|
|
255
|
+
}
|
|
256
|
+
return err(migrationError(cause));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function sourceBook(database) {
|
|
260
|
+
const books = database
|
|
261
|
+
.prepare("SELECT book_id, slug FROM book")
|
|
262
|
+
.all();
|
|
263
|
+
if (books.length !== 1) {
|
|
264
|
+
throw new Error(`Schema-v4 catalog must contain one book; found ${books.length}`);
|
|
265
|
+
}
|
|
266
|
+
return books[0];
|
|
267
|
+
}
|
|
268
|
+
function count(database, table) {
|
|
269
|
+
const row = database
|
|
270
|
+
.prepare(`SELECT COUNT(*) AS total FROM ${table}`)
|
|
271
|
+
.get();
|
|
272
|
+
return row.total;
|
|
273
|
+
}
|
|
274
|
+
function migrationIssues(database, root, bookId) {
|
|
275
|
+
const issues = [];
|
|
276
|
+
const objects = database
|
|
277
|
+
.prepare("SELECT object_hash FROM objects ORDER BY object_hash")
|
|
278
|
+
.all();
|
|
279
|
+
for (const object of objects) {
|
|
280
|
+
if (!existsSync(objectPath(root, object.object_hash))) {
|
|
281
|
+
issues.push({
|
|
282
|
+
code: "MISSING_OBJECT",
|
|
283
|
+
severity: "error",
|
|
284
|
+
resource: `object:${object.object_hash}`,
|
|
285
|
+
message: "Content-addressed object is missing from the schema-v4 root",
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const timedSlots = database
|
|
290
|
+
.prepare(`SELECT s.slot_id, a.artifact_id, a.kind
|
|
291
|
+
FROM timeline_slots s
|
|
292
|
+
JOIN artifacts a ON a.artifact_id=s.artifact_id
|
|
293
|
+
WHERE a.kind <> 'image'
|
|
294
|
+
ORDER BY s.ordinal, s.slot_id`)
|
|
295
|
+
.all();
|
|
296
|
+
for (const slot of timedSlots) {
|
|
297
|
+
issues.push({
|
|
298
|
+
code: "PROBE_REQUIRED",
|
|
299
|
+
severity: "warning",
|
|
300
|
+
resource: `timeline-slot:${slot.slot_id}`,
|
|
301
|
+
message: `${slot.kind} timeline source requires media probing before clip conversion`,
|
|
302
|
+
details: { artifactId: slot.artifact_id },
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
if (count(database, "artifacts") > 0) {
|
|
306
|
+
issues.push({
|
|
307
|
+
code: "REINDEX_REQUIRED",
|
|
308
|
+
severity: "warning",
|
|
309
|
+
resource: `book:${bookId}`,
|
|
310
|
+
message: "Schema-v4 similarity rows are discarded and rebuilt under v5 manifests",
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
return issues;
|
|
314
|
+
}
|
|
315
|
+
function migrationDigest(value) {
|
|
316
|
+
const entries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
|
|
317
|
+
return `sha256:${createHash("sha256")
|
|
318
|
+
.update(JSON.stringify(entries))
|
|
319
|
+
.digest("hex")}`;
|
|
320
|
+
}
|
|
321
|
+
async function emptyDestination(destinationRoot) {
|
|
322
|
+
if (!existsSync(destinationRoot))
|
|
323
|
+
return ok(true);
|
|
324
|
+
const entries = await readdir(destinationRoot);
|
|
325
|
+
return entries.length === 0
|
|
326
|
+
? ok(true)
|
|
327
|
+
: err({
|
|
328
|
+
code: "ALREADY_EXISTS",
|
|
329
|
+
message: `Migration destination is not empty: ${destinationRoot}`,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
function clearFreshDestination(database) {
|
|
333
|
+
database.exec(`
|
|
334
|
+
DELETE FROM sequence_tracks;
|
|
335
|
+
DELETE FROM sequences;
|
|
336
|
+
DELETE FROM book;
|
|
337
|
+
`);
|
|
338
|
+
}
|
|
339
|
+
function copyTable(source, destination, table) {
|
|
340
|
+
const sourceColumns = columns(source, table);
|
|
341
|
+
const destinationColumns = new Set(columns(destination, table));
|
|
342
|
+
const shared = sourceColumns.filter((column) => destinationColumns.has(column));
|
|
343
|
+
if (shared.length === 0)
|
|
344
|
+
return;
|
|
345
|
+
const rows = source
|
|
346
|
+
.prepare(`SELECT ${shared.join(", ")} FROM ${table}`)
|
|
347
|
+
.all();
|
|
348
|
+
if (rows.length === 0)
|
|
349
|
+
return;
|
|
350
|
+
const placeholders = shared.map(() => "?").join(", ");
|
|
351
|
+
const insert = destination.prepare(`INSERT INTO ${table}(${shared.join(", ")}) VALUES (${placeholders})`);
|
|
352
|
+
for (const row of rows) {
|
|
353
|
+
insert.run(...shared.map((column) => row[column] ?? null));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function copyLegacyNotebooks(source, destination) {
|
|
357
|
+
const rows = source
|
|
358
|
+
.prepare(`SELECT notebook_id, name, properties_json, created_at
|
|
359
|
+
FROM notebooks ORDER BY notebook_id`)
|
|
360
|
+
.all();
|
|
361
|
+
const insert = destination.prepare(`INSERT INTO notebooks(
|
|
362
|
+
notebook_id, name, created_at
|
|
363
|
+
) VALUES (?, ?, ?)`);
|
|
364
|
+
for (const row of rows) {
|
|
365
|
+
insert.run(row.notebook_id, row.name, row.created_at);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
function columns(database, table) {
|
|
369
|
+
return database.prepare(`PRAGMA table_info(${table})`).all().map((column) => column.name);
|
|
370
|
+
}
|
|
371
|
+
function sourceRender(database, bookId) {
|
|
372
|
+
const timeline = database
|
|
373
|
+
.prepare("SELECT render FROM timeline WHERE book_id=?")
|
|
374
|
+
.get(bookId);
|
|
375
|
+
return timeline?.render ?? "landscape";
|
|
376
|
+
}
|
|
377
|
+
function initializePrimarySequence(database, bookId, render) {
|
|
378
|
+
const [width, height] = render === "portrait"
|
|
379
|
+
? [1080, 1920]
|
|
380
|
+
: render === "square"
|
|
381
|
+
? [1080, 1080]
|
|
382
|
+
: [1920, 1080];
|
|
383
|
+
const now = Date.now();
|
|
384
|
+
const sequenceId = uuidv7();
|
|
385
|
+
database.prepare(`INSERT INTO sequences(
|
|
386
|
+
sequence_id, book_id, name, is_primary, width, height,
|
|
387
|
+
pixel_aspect_numerator, pixel_aspect_denominator,
|
|
388
|
+
frame_rate_numerator, frame_rate_denominator,
|
|
389
|
+
audio_sample_rate_hz, audio_channel_layout,
|
|
390
|
+
background_rgba_json, created_at
|
|
391
|
+
) VALUES (?, ?, 'Main', 1, ?, ?, 1, 1, 30, 1, 48000, 'stereo', ?, ?)`).run(sequenceId, bookId, width, height, "[0,0,0,1]", now);
|
|
392
|
+
const insert = database.prepare(`INSERT INTO sequence_tracks(
|
|
393
|
+
track_id, sequence_id, kind, order_key, name,
|
|
394
|
+
enabled, locked, muted, solo, blend_mode
|
|
395
|
+
) VALUES (?, ?, ?, ?, ?, 1, 0, ?, ?, ?)`);
|
|
396
|
+
const videoKeys = initialOrderKeys(2);
|
|
397
|
+
insert.run(uuidv7(), sequenceId, "video", videoKeys[0], "Video 1", null, null, "normal");
|
|
398
|
+
insert.run(uuidv7(), sequenceId, "video", videoKeys[1], "Video 2", null, null, "normal");
|
|
399
|
+
const audioKeys = initialOrderKeys(4);
|
|
400
|
+
for (let ordinal = 0; ordinal < 4; ordinal += 1) {
|
|
401
|
+
insert.run(uuidv7(), sequenceId, "audio", audioKeys[ordinal], `Audio ${ordinal + 1}`, 0, 0, null);
|
|
402
|
+
}
|
|
403
|
+
insert.run(uuidv7(), sequenceId, "caption", initialOrderKeys(1)[0], "Captions", null, null, null);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Legacy still-image timeline slots become clips on the primary sequence's
|
|
407
|
+
* first video track, laid out back to back in legacy (ordinal, slot_id)
|
|
408
|
+
* order. Timed media is not converted: the dry run flags every non-image
|
|
409
|
+
* slot with PROBE_REQUIRED because clip conversion needs media probing the
|
|
410
|
+
* import does not perform.
|
|
411
|
+
*/
|
|
412
|
+
function convertStillTimelineSlots(source, destination) {
|
|
413
|
+
const sequence = destination
|
|
414
|
+
.prepare("SELECT sequence_id FROM sequences WHERE is_primary=1")
|
|
415
|
+
.get();
|
|
416
|
+
const track = destination
|
|
417
|
+
.prepare(`SELECT track_id FROM sequence_tracks
|
|
418
|
+
WHERE sequence_id=? AND kind='video'
|
|
419
|
+
ORDER BY order_key, track_id LIMIT 1`)
|
|
420
|
+
.get(sequence.sequence_id);
|
|
421
|
+
const rows = source
|
|
422
|
+
.prepare(`SELECT s.slot_id, s.artifact_id, s.ordinal, a.kind,
|
|
423
|
+
f.path AS source_path, f.object_hash
|
|
424
|
+
FROM timeline_slots s
|
|
425
|
+
JOIN artifacts a ON a.artifact_id=s.artifact_id
|
|
426
|
+
LEFT JOIN artifact_files f ON f.artifact_id=a.artifact_id
|
|
427
|
+
WHERE a.kind='image'
|
|
428
|
+
ORDER BY s.ordinal, s.slot_id, f.path`)
|
|
429
|
+
.all();
|
|
430
|
+
const seen = new Set();
|
|
431
|
+
const insertClip = destination.prepare(`INSERT INTO sequence_clips(
|
|
432
|
+
clip_id, track_id, source_kind, artifact_id, source_path,
|
|
433
|
+
stream_id, object_hash, source_start_tick, source_duration_ticks,
|
|
434
|
+
time_base_numerator, time_base_denominator, timeline_start_frame,
|
|
435
|
+
duration_frames, speed_numerator, speed_denominator, reverse,
|
|
436
|
+
audio_policy, gain_db, audio_muted, fade_in_frames, fade_out_frames,
|
|
437
|
+
enabled
|
|
438
|
+
) VALUES (?, ?, 'still', ?, ?, NULL, ?, NULL, NULL, NULL, NULL,
|
|
439
|
+
?, 90, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1)`);
|
|
440
|
+
const insertTransform = destination.prepare(`INSERT INTO clip_transforms(
|
|
441
|
+
clip_id, fit, position_x, position_y, scale_x, scale_y,
|
|
442
|
+
anchor_x, anchor_y, rotation_degrees, crop_top, crop_right,
|
|
443
|
+
crop_bottom, crop_left, opacity, blend_mode
|
|
444
|
+
) VALUES (?, 'fit', 0, 0, 1, 1, 0.5, 0.5, 0, 0, 0, 0, 0, 1, 'normal')`);
|
|
445
|
+
let ordinal = 0;
|
|
446
|
+
for (const row of rows) {
|
|
447
|
+
if (seen.has(row.slot_id) || !row.source_path || !row.object_hash)
|
|
448
|
+
continue;
|
|
449
|
+
seen.add(row.slot_id);
|
|
450
|
+
const clipId = uuidv7();
|
|
451
|
+
insertClip.run(clipId, track.track_id, row.artifact_id, row.source_path, row.object_hash, ordinal * 90);
|
|
452
|
+
insertTransform.run(clipId);
|
|
453
|
+
ordinal += 1;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function stageMigration(database) {
|
|
457
|
+
for (const table of SEMANTIC_TABLES) {
|
|
458
|
+
database.prepare("SELECT dolt_add(?) AS result").get(table);
|
|
459
|
+
}
|
|
460
|
+
const committed = database
|
|
461
|
+
.prepare("SELECT dolt_commit('-m', ?) AS hash")
|
|
462
|
+
.get("Import schema-v4 current state");
|
|
463
|
+
if (!committed?.hash)
|
|
464
|
+
throw new Error("Migration commit did not return a hash");
|
|
465
|
+
}
|
|
466
|
+
async function copyObjects(source, sourceRoot, destinationRoot) {
|
|
467
|
+
const destinationObjects = path.join(destinationRoot, "data", "objects", "sha256");
|
|
468
|
+
const store = new ObjectStore(destinationObjects);
|
|
469
|
+
const objects = source
|
|
470
|
+
.prepare("SELECT object_hash FROM objects ORDER BY object_hash")
|
|
471
|
+
.all();
|
|
472
|
+
let copied = 0;
|
|
473
|
+
let reused = 0;
|
|
474
|
+
for (const object of objects) {
|
|
475
|
+
const sourcePath = objectPath(sourceRoot, object.object_hash);
|
|
476
|
+
const destinationPath = store.pathFor(object.object_hash);
|
|
477
|
+
if (existsSync(destinationPath)) {
|
|
478
|
+
reused += 1;
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
mkdirSync(path.dirname(destinationPath), { recursive: true });
|
|
482
|
+
try {
|
|
483
|
+
linkSync(sourcePath, destinationPath);
|
|
484
|
+
copied += 1;
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
const imported = await store.import(sourcePath);
|
|
488
|
+
if (imported.hash !== object.object_hash) {
|
|
489
|
+
throw new Error(`Object hash changed during migration: ${object.object_hash}`);
|
|
490
|
+
}
|
|
491
|
+
copied += 1;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
await copyWorkspaceMetadata(sourceRoot, destinationRoot);
|
|
495
|
+
return { copied, reused };
|
|
496
|
+
}
|
|
497
|
+
async function copyWorkspaceMetadata(sourceRoot, destinationRoot) {
|
|
498
|
+
const source = path.join(sourceRoot, "workspaces");
|
|
499
|
+
if (!existsSync(source) || !statSync(source).isDirectory())
|
|
500
|
+
return;
|
|
501
|
+
const destination = path.join(destinationRoot, "workspaces");
|
|
502
|
+
await mkdir(destination, { recursive: true });
|
|
503
|
+
const entries = await readdir(source, { withFileTypes: true });
|
|
504
|
+
for (const entry of entries) {
|
|
505
|
+
if (!entry.isFile())
|
|
506
|
+
continue;
|
|
507
|
+
await copyFile(path.join(source, entry.name), path.join(destination, entry.name));
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function objectPath(root, objectHash) {
|
|
511
|
+
return path.join(root, "data", "objects", "sha256", objectHash.slice(0, 2), objectHash);
|
|
512
|
+
}
|
|
513
|
+
function isInside(parent, candidate) {
|
|
514
|
+
const relative = path.relative(parent, candidate);
|
|
515
|
+
return relative !== ""
|
|
516
|
+
&& relative !== ".."
|
|
517
|
+
&& !relative.startsWith(`..${path.sep}`);
|
|
518
|
+
}
|
|
519
|
+
function migrationError(cause) {
|
|
520
|
+
if (typeof cause === "object"
|
|
521
|
+
&& cause !== null
|
|
522
|
+
&& "error" in cause
|
|
523
|
+
&& typeof cause.error === "object"
|
|
524
|
+
&& cause.error !== null
|
|
525
|
+
&& "code" in cause.error
|
|
526
|
+
&& "message" in cause.error) {
|
|
527
|
+
return cause.error;
|
|
528
|
+
}
|
|
529
|
+
return {
|
|
530
|
+
code: "IO_ERROR",
|
|
531
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"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"}
|