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
package/dist/fork.js ADDED
@@ -0,0 +1,602 @@
1
+ import { copyFile, mkdir, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import * as path from "node:path";
4
+ import { DatabaseSync } from "@dolthub/doltlite";
5
+ import { v7 as uuidv7 } from "uuid";
6
+ import { ObjectStore } from "./cas.js";
7
+ import { createEngine } from "./engine.js";
8
+ import { assertSameSchemaVersion, reconcileSingletonFlags, verifyConstraintHealth, } from "./merge-policy.js";
9
+ import { SEMANTIC_TABLES } from "./schema.js";
10
+ import { canonicalJson, EngineFault } from "./store.js";
11
+ const DEFAULT_MERGE_AUTHOR = "Videobook <videobook@localhost>";
12
+ /**
13
+ * Bootstraps a fork: clones the upstream catalog into a new local engine
14
+ * root and opens it as a normal engine. The fork is a full citizen from
15
+ * there — it commits on its own main, backs up to its own catalog remote,
16
+ * and reads upstream objects lazily through its configured `ContentStore`.
17
+ * It never pulls; integration is the merge-back flow's job.
18
+ */
19
+ export async function bootstrapFork(options) {
20
+ if ((options.snapshotPath === undefined) ===
21
+ (options.upstreamUrl === undefined)) {
22
+ throw new EngineFault({
23
+ code: "INVALID_INPUT",
24
+ message: "Exactly one of snapshotPath or upstreamUrl is required",
25
+ });
26
+ }
27
+ const dataDir = path.resolve(options.dataDir);
28
+ const databasePath = path.join(dataDir, "videobook.db");
29
+ await mkdir(dataDir, { recursive: true });
30
+ if (options.snapshotPath !== undefined) {
31
+ await copyFile(options.snapshotPath, databasePath);
32
+ }
33
+ else {
34
+ const db = new DatabaseSync(databasePath);
35
+ try {
36
+ db.prepare("SELECT dolt_clone(?) AS result").get(options.upstreamUrl);
37
+ // ve-wsu: dolt_clone of a full engine catalog yields a database whose
38
+ // schema does not even parse (invalid rootpage on a secondary
39
+ // autoindex). Validate before handing the catalog to the engine.
40
+ db.prepare("SELECT COUNT(*) AS count FROM sqlite_master").get();
41
+ db.close();
42
+ }
43
+ catch (error) {
44
+ try {
45
+ db.close();
46
+ }
47
+ catch {
48
+ // The clone is already unusable; ignore close errors.
49
+ }
50
+ await rm(databasePath, { force: true });
51
+ throw new EngineFault({
52
+ code: "FEATURE_UNAVAILABLE",
53
+ message: "dolt_clone produced a corrupt catalog (upstream doltlite bug " +
54
+ "ve-wsu: multi-table working-set materialization drops index " +
55
+ "rootpages). Bootstrap from a snapshot of the upstream database " +
56
+ "with snapshotPath instead.",
57
+ details: {
58
+ cause: error instanceof Error ? error.message : String(error),
59
+ },
60
+ });
61
+ }
62
+ }
63
+ return createEngine({
64
+ dataDir,
65
+ workspaceDir: path.resolve(options.workspaceDir),
66
+ ...(options.remoteObjects ? { remoteObjects: options.remoteObjects } : {}),
67
+ ...(options.objectPrefix ? { objectPrefix: options.objectPrefix } : {}),
68
+ ...(options.catalogBackup ? { catalogBackup: options.catalogBackup } : {}),
69
+ ...(options.identity ? { identity: options.identity } : {}),
70
+ });
71
+ }
72
+ /**
73
+ * Integrates a fork back into upstream main.
74
+ *
75
+ * Runs entirely in a throwaway copy of the upstream catalog inside a temp
76
+ * directory: fetches the fork, merges under the engine merge policy
77
+ * (same-schema precondition, constraint verification, deterministic
78
+ * singleton reconcile; artifact identity is artifact_id, so there is no
79
+ * name-conflict class to check), uploads the fork's new
80
+ * objects to the upstream object store BEFORE the catalog ref moves — the
81
+ * same objects-before-push ordering as engine.storage.backup — lands one
82
+ * forward integration commit on main, and pushes it.
83
+ *
84
+ * The caller's open engines are never touched: the upstream database file
85
+ * is only read (copied), and the fork is only fetched from. Conflicts and
86
+ * violations surface as the typed MERGE_CONFLICT / MERGE_VIOLATION /
87
+ * SCHEMA_INCOMPATIBLE errors from src/merge-policy.ts.
88
+ */
89
+ export async function mergeBack(options) {
90
+ const workDir = options.workDir ??
91
+ (await mkdtemp(path.join(tmpdir(), "videobook-merge-back-")));
92
+ await mkdir(workDir, { recursive: true });
93
+ try {
94
+ const result = await mergeBackIn(workDir, options);
95
+ if (options.keepWorkDir)
96
+ result.workDir = workDir;
97
+ return result;
98
+ }
99
+ finally {
100
+ if (!options.keepWorkDir) {
101
+ await rm(workDir, { recursive: true, force: true });
102
+ }
103
+ }
104
+ }
105
+ async function mergeBackIn(workDir, options) {
106
+ const forkRemoteName = options.forkRemote.name ?? "fork";
107
+ const forkBranch = options.forkBranch ?? "main";
108
+ const theirsRef = `${forkRemoteName}/${forkBranch}`;
109
+ const localForkRef = `merge-back-${forkRemoteName}-${forkBranch}`;
110
+ await copyFile(options.upstreamDbPath, path.join(workDir, "videobook.db"));
111
+ const db = new DatabaseSync(path.join(workDir, "videobook.db"));
112
+ try {
113
+ const upstreamRemote = options.upstreamRemote ?? findRemote(db, "origin");
114
+ if (!upstreamRemote) {
115
+ throw new EngineFault({
116
+ code: "INVALID_INPUT",
117
+ message: "No upstream remote given and the catalog has no origin remote; " +
118
+ "pass upstreamRemote",
119
+ });
120
+ }
121
+ ensureRemote(db, upstreamRemote.name, upstreamRemote.url);
122
+ ensureRemote(db, forkRemoteName, options.forkRemote.url);
123
+ try {
124
+ db.prepare("SELECT dolt_fetch(?) AS result").get(forkRemoteName);
125
+ }
126
+ catch (error) {
127
+ throw new EngineFault({
128
+ code: "OFFLINE",
129
+ message: `Could not fetch fork remote ${forkRemoteName}: ` +
130
+ (error instanceof Error ? error.message : String(error)),
131
+ });
132
+ }
133
+ // Resolve commit hashes (doltHashOf returns content hashes, not commit
134
+ // hashes): main's head comes from the log, and the fetched
135
+ // remote-tracking ref gets a local branch pointer — a ref-only write
136
+ // that materializes no working set, so it is safe under ve-wsu.
137
+ const oursRevision = db.doltLog({ limit: 1 })[0]?.commit_hash ?? "";
138
+ if (db.doltBranches().some((branch) => branch.name === localForkRef)) {
139
+ db.prepare("SELECT dolt_branch('-D', ?) AS result").get(localForkRef);
140
+ }
141
+ db.doltBranch(localForkRef, theirsRef);
142
+ const theirsRevision = db.doltBranches().find((branch) => branch.name === localForkRef)?.hash ??
143
+ "";
144
+ if (!oursRevision || !theirsRevision) {
145
+ throw new EngineFault({
146
+ code: "STORAGE_ERROR",
147
+ message: `Could not resolve merge heads for main and ${theirsRef}`,
148
+ });
149
+ }
150
+ const baseRow = db
151
+ .prepare("SELECT dolt_merge_base(?, ?) AS hash")
152
+ .get("main", localForkRef);
153
+ const baseRevision = baseRow?.hash ?? null;
154
+ if (!baseRevision) {
155
+ throw new EngineFault({
156
+ code: "MERGE_CONFLICT",
157
+ message: `Merge-back of ${theirsRef} refused: no common ancestor with ` +
158
+ "upstream main (not a fork of this catalog?)",
159
+ details: { branch: theirsRef },
160
+ });
161
+ }
162
+ // The fork objects upstream lacks are uploaded before the catalog ref
163
+ // moves, whether or not a new integration commit is needed.
164
+ const newObjects = objectsAddedByFork(db, "HEAD", localForkRef);
165
+ let integrationCommit = oursRevision;
166
+ let reconciled = { transcripts: 0, sequences: 0 };
167
+ let alreadyIntegrated = baseRevision === theirsRevision || oursRevision === theirsRevision;
168
+ if (!alreadyIntegrated) {
169
+ const integration = integrate(db, localForkRef, {
170
+ baseRevision,
171
+ oursRevision,
172
+ theirsRevision,
173
+ forkRemote: `${forkRemoteName}:${options.forkRemote.url}`,
174
+ forkBranch,
175
+ author: options.author ?? DEFAULT_MERGE_AUTHOR,
176
+ });
177
+ if (integration === null) {
178
+ alreadyIntegrated = true;
179
+ }
180
+ else {
181
+ integrationCommit = integration.commit;
182
+ reconciled = integration.reconciled;
183
+ }
184
+ }
185
+ const uploadedObjects = await uploadForkObjects(db, newObjects, options);
186
+ try {
187
+ db.prepare("SELECT dolt_push(?, 'main') AS result").get(upstreamRemote.name);
188
+ }
189
+ catch (error) {
190
+ const message = error instanceof Error ? error.message : String(error);
191
+ if (/diverg|fast-forward|fetch first/i.test(message)) {
192
+ throw new EngineFault({
193
+ code: "DIVERGED",
194
+ message: "Upstream moved while the merge-back was in flight; re-run " +
195
+ `mergeBack against the moved upstream. (${message})`,
196
+ });
197
+ }
198
+ throw error;
199
+ }
200
+ return {
201
+ integrationCommit,
202
+ baseRevision,
203
+ oursRevision,
204
+ theirsRevision,
205
+ alreadyIntegrated,
206
+ uploadedObjects,
207
+ reconciledTranscripts: reconciled.transcripts,
208
+ reconciledSequences: reconciled.sequences,
209
+ };
210
+ }
211
+ finally {
212
+ db.close();
213
+ }
214
+ }
215
+ /**
216
+ * Merges `theirsRef` into main under the engine merge policy and Dolt-
217
+ * commits the result as one forward integration commit. The policy wrapper
218
+ * is identical to `mergeWithPolicy` (same-schema precondition, constraint
219
+ * verification, deterministic singleton-flag reconcile); only the merge
220
+ * mechanism
221
+ * differs — a projection-level three-way merge instead of `dolt_merge`,
222
+ * which ve-wsu makes unusable on full engine catalogs (see the module
223
+ * comment). Returns null when the fork's net changes are already present
224
+ * on main, in which case nothing is written or committed.
225
+ */
226
+ function integrate(db, forkRef, context) {
227
+ assertSameSchemaVersion(db, "HEAD", forkRef);
228
+ const merge = mergeRefs(db, "HEAD", forkRef, context.baseRevision);
229
+ if (!merge) {
230
+ // The fork's net changes are already present on main (for example a
231
+ // re-run after an earlier integration commit): nothing to commit.
232
+ return null;
233
+ }
234
+ const reconciled = reconcileSingletonFlags(db);
235
+ verifyConstraintHealth(db);
236
+ for (const table of SEMANTIC_TABLES) {
237
+ db.prepare("SELECT dolt_add(?) AS result").get(table);
238
+ }
239
+ const operationId = uuidv7();
240
+ // The write-set trailer names every resource the integration rewrote, so
241
+ // edit conflict detection (revisionConflicts in src/edits.ts) sees
242
+ // integrated changes exactly like locally committed ones. Oversized sets
243
+ // degrade the same way as engine commits: an omitted marker.
244
+ const writeSetJson = canonicalJson([...merge.writeSet].sort());
245
+ const writeSetTrailer = Buffer.byteLength(writeSetJson, "utf8") <= 32_000
246
+ ? `write-set: ${writeSetJson}`
247
+ : `write-set-omitted: ${Buffer.byteLength(writeSetJson, "utf8")}`;
248
+ const message = [
249
+ "merge_back",
250
+ "",
251
+ `op-id: ${operationId}`,
252
+ `base-revision: ${context.baseRevision}`,
253
+ `merged-revision: ${context.theirsRevision}`,
254
+ writeSetTrailer,
255
+ `details: ${canonicalJson({
256
+ forkRemote: context.forkRemote,
257
+ forkBranch: context.forkBranch,
258
+ oursRevision: context.oursRevision,
259
+ })}`,
260
+ ].join("\n");
261
+ const row = db
262
+ .prepare("SELECT dolt_commit('-m', ?, '--author', ?) AS hash")
263
+ .get(message, context.author);
264
+ if (!row?.hash) {
265
+ throw new EngineFault({
266
+ code: "STORAGE_ERROR",
267
+ message: "Dolt commit did not return a revision hash",
268
+ });
269
+ }
270
+ return { commit: row.hash, reconciled };
271
+ }
272
+ /**
273
+ * Projection-level three-way merge: rewrites the working set of every
274
+ * semantic table to the row-level three-way merge of `oursRef` and
275
+ * `theirsRef` against `baseRef`. Row semantics mirror Dolt's merge: a row
276
+ * changed on only one side takes that side's value, identical changes
277
+ * resolve to the same row, and incompatible changes (both sides changed a
278
+ * row differently, or one side modified a row the other deleted) are
279
+ * conflicts and abort before anything is written. Artifact rows are keyed
280
+ * by artifact_id (UUIDv7, collision-free across forks), so independently
281
+ * minted artifacts never collide on identity; labels are non-unique
282
+ * display text and merge like any other column.
283
+ *
284
+ * The rewrite reuses the restore idiom (src/history.ts
285
+ * reloadSemanticTables): `SEMANTIC_TABLES` is ordered parent-before-child,
286
+ * so deleting in reverse and reinserting in forward order satisfies foreign
287
+ * keys, and columns come from `PRAGMA table_info`.
288
+ *
289
+ * Returns whether the merge changed anything relative to `oursRef`; when
290
+ * it did not, the working set is left untouched.
291
+ */
292
+ function mergeRefs(db, oursRef, theirsRef, baseRef) {
293
+ const shapes = SEMANTIC_TABLES.map((table) => tableShape(db, table));
294
+ const merged = [];
295
+ const conflicts = [];
296
+ const writeSet = new Set();
297
+ let changed = false;
298
+ for (const shape of shapes) {
299
+ const base = rowsByKey(db, shape, baseRef);
300
+ const ours = rowsByKey(db, shape, oursRef);
301
+ const theirs = rowsByKey(db, shape, theirsRef);
302
+ const result = new Map(ours);
303
+ const keys = new Set([...base.keys(), ...theirs.keys()]);
304
+ const applyRow = (key, row) => {
305
+ result.set(key, row);
306
+ changed = true;
307
+ resourcesFor(shape, row).forEach((resource) => writeSet.add(resource));
308
+ };
309
+ for (const key of keys) {
310
+ const b = base.get(key);
311
+ const o = ours.get(key);
312
+ const t = theirs.get(key);
313
+ if (t !== undefined && b === undefined) {
314
+ // Added on theirs.
315
+ if (o !== undefined && !rowsEqual(o, t)) {
316
+ const resolved = resolveObjectsRow(shape, o, t);
317
+ if (resolved) {
318
+ if (!rowsEqual(resolved, o))
319
+ applyRow(key, resolved);
320
+ }
321
+ else {
322
+ conflicts.push({
323
+ table: shape.table,
324
+ key: keyObject(shape, key),
325
+ reason: "row added with different content on both sides",
326
+ });
327
+ }
328
+ }
329
+ else if (o === undefined) {
330
+ applyRow(key, t);
331
+ }
332
+ }
333
+ else if (t === undefined && b !== undefined) {
334
+ // Deleted on theirs.
335
+ if (o !== undefined && !rowsEqual(o, b)) {
336
+ conflicts.push({
337
+ table: shape.table,
338
+ key: keyObject(shape, key),
339
+ reason: "row modified on ours but deleted on theirs",
340
+ });
341
+ }
342
+ else if (o !== undefined) {
343
+ result.delete(key);
344
+ changed = true;
345
+ resourcesFor(shape, o).forEach((resource) => writeSet.add(resource));
346
+ }
347
+ }
348
+ else if (t !== undefined && b !== undefined && !rowsEqual(t, b)) {
349
+ // Changed on theirs.
350
+ if (o === undefined) {
351
+ conflicts.push({
352
+ table: shape.table,
353
+ key: keyObject(shape, key),
354
+ reason: "row modified on theirs but deleted on ours",
355
+ });
356
+ }
357
+ else if (rowsEqual(o, b) || rowsEqual(o, t)) {
358
+ if (!rowsEqual(o, t))
359
+ applyRow(key, t);
360
+ }
361
+ else {
362
+ const resolved = resolveObjectsRow(shape, o, t);
363
+ if (resolved) {
364
+ if (!rowsEqual(resolved, o))
365
+ applyRow(key, resolved);
366
+ }
367
+ else {
368
+ conflicts.push({
369
+ table: shape.table,
370
+ key: keyObject(shape, key),
371
+ reason: "row modified differently on both sides",
372
+ });
373
+ }
374
+ }
375
+ }
376
+ }
377
+ merged.push({ shape, rows: [...result.values()] });
378
+ }
379
+ if (conflicts.length > 0) {
380
+ throw new EngineFault({
381
+ code: "MERGE_CONFLICT",
382
+ message: `Merge-back has row-level conflicts in ${conflicts.length} row(s) ` +
383
+ `across ${new Set(conflicts.map((c) => c.table)).size} table(s): ` +
384
+ conflicts
385
+ .slice(0, 5)
386
+ .map((c) => `${c.table}(${JSON.stringify(c.key)})`)
387
+ .join(", ") +
388
+ (conflicts.length > 5 ? ", …" : ""),
389
+ details: { conflicts },
390
+ });
391
+ }
392
+ if (!changed)
393
+ return null;
394
+ db.exec("PRAGMA foreign_keys = OFF");
395
+ try {
396
+ for (const { shape } of [...merged].reverse()) {
397
+ db.prepare(`DELETE FROM ${shape.table}`).run();
398
+ }
399
+ for (const { shape, rows } of merged) {
400
+ if (rows.length === 0)
401
+ continue;
402
+ const insert = db.prepare(`INSERT INTO ${shape.table}(${shape.columns.join(", ")})
403
+ VALUES (${shape.columns.map(() => "?").join(", ")})`);
404
+ for (const row of rows) {
405
+ insert.run(...shape.columns.map((column) => row[column] ?? null));
406
+ }
407
+ }
408
+ }
409
+ finally {
410
+ db.exec("PRAGMA foreign_keys = ON");
411
+ }
412
+ return { writeSet };
413
+ }
414
+ /**
415
+ * `objects` rows merge instead of conflicting when both sides agree on
416
+ * everything except `forgotten_at`: a forget on either side wins (deleted
417
+ * bytes must stay deleted on both lineages), and when both sides forgot
418
+ * independently the earlier wall-clock stamp is kept so the same takedown
419
+ * applied on fork and upstream cannot wedge integration. Returns null for
420
+ * any other table or any other difference.
421
+ */
422
+ function resolveObjectsRow(shape, ours, theirs) {
423
+ if (shape.table !== "objects")
424
+ return null;
425
+ const keys = new Set([...Object.keys(ours), ...Object.keys(theirs)]);
426
+ for (const key of keys) {
427
+ if (key === "forgotten_at")
428
+ continue;
429
+ if (comparable(ours[key]) !== comparable(theirs[key]))
430
+ return null;
431
+ }
432
+ const oursForgotten = ours["forgotten_at"];
433
+ const theirsForgotten = theirs["forgotten_at"];
434
+ const forgotten = oursForgotten != null && theirsForgotten != null
435
+ ? Math.min(oursForgotten, theirsForgotten)
436
+ : (oursForgotten ?? theirsForgotten ?? null);
437
+ return { ...ours, forgotten_at: forgotten };
438
+ }
439
+ /**
440
+ * Resource strings for the integration commit's write-set trailer, using
441
+ * the same vocabulary as engine write sets (src/edits.ts editWriteSet,
442
+ * storage/artifact operations) so overlap detection matches.
443
+ */
444
+ function resourcesFor(shape, row) {
445
+ const value = (column) => String(row[column] ?? "");
446
+ switch (shape.table) {
447
+ case "sequences":
448
+ return [`sequence:${value("sequence_id")}`];
449
+ case "sequence_tracks":
450
+ return [`sequence:${value("sequence_id")}`, `track:${value("track_id")}`];
451
+ case "sequence_clips":
452
+ return [`clip:${value("clip_id")}`, `track:${value("track_id")}`];
453
+ case "clip_links":
454
+ case "clip_transforms":
455
+ return [`clip:${value("clip_id")}`];
456
+ case "transitions":
457
+ return [`transition:${value("transition_id")}`];
458
+ case "caption_cues":
459
+ return [`track:${value("track_id")}`];
460
+ case "artifacts":
461
+ return [`artifact:${value("artifact_id")}`];
462
+ case "artifact_files":
463
+ case "artifact_streams":
464
+ case "artifact_metadata":
465
+ case "audio_waveforms":
466
+ return [`artifact:${value("artifact_id")}`];
467
+ case "objects":
468
+ return [`object:${value("object_hash")}`];
469
+ case "transcripts":
470
+ return [`transcript:${value("transcript_id")}`];
471
+ case "transcript_segments":
472
+ return [`transcript:${value("transcript_id")}`];
473
+ case "book":
474
+ case "book_metadata":
475
+ return ["book"];
476
+ case "notebooks":
477
+ case "cells":
478
+ case "edges":
479
+ case "runs":
480
+ case "cell_references":
481
+ case "pinned_search_results":
482
+ return [`notebook:${value("notebook_id")}`];
483
+ default:
484
+ return [
485
+ `${shape.table}:${shape.primaryKey.map((column) => value(column)).join(":")}`,
486
+ ];
487
+ }
488
+ }
489
+ function tableShape(db, table) {
490
+ const info = db
491
+ .prepare(`PRAGMA table_info(${table})`)
492
+ .all();
493
+ return {
494
+ table,
495
+ columns: info.map((column) => column.name),
496
+ primaryKey: info
497
+ .filter((column) => column.pk > 0)
498
+ .sort((left, right) => left.pk - right.pk)
499
+ .map((column) => column.name),
500
+ };
501
+ }
502
+ function rowsByKey(db, shape, ref) {
503
+ const rows = db
504
+ .prepare(`SELECT * FROM dolt_at_${shape.table}(?)`)
505
+ .all(ref);
506
+ return new Map(rows.map((row) => [rowKey(shape, row), row]));
507
+ }
508
+ function rowKey(shape, row) {
509
+ return canonicalJson(shape.primaryKey.map((column) => comparable(row[column])));
510
+ }
511
+ function keyObject(shape, key) {
512
+ const values = JSON.parse(key);
513
+ return Object.fromEntries(shape.primaryKey.map((column, index) => [column, values[index]]));
514
+ }
515
+ function comparable(value) {
516
+ if (value instanceof Uint8Array) {
517
+ return `blob:${Buffer.from(value).toString("hex")}`;
518
+ }
519
+ return value ?? null;
520
+ }
521
+ function rowsEqual(left, right) {
522
+ const keys = new Set([...Object.keys(left), ...Object.keys(right)]);
523
+ for (const key of keys) {
524
+ const a = comparable(left[key]);
525
+ const b = comparable(right[key]);
526
+ if (a !== b)
527
+ return false;
528
+ }
529
+ return true;
530
+ }
531
+ /** Live (non-forgotten) objects present at `theirsRef` but not at `oursRef`. */
532
+ function objectsAddedByFork(db, oursRef, theirsRef) {
533
+ const ours = new Set(db
534
+ .prepare("SELECT object_hash FROM dolt_at_objects(?)")
535
+ .all(oursRef).map((row) => row.object_hash));
536
+ const theirs = db
537
+ .prepare(`SELECT object_hash, size_bytes, forgotten_at
538
+ FROM dolt_at_objects(?) ORDER BY created_at, object_hash`)
539
+ .all(theirsRef);
540
+ return theirs.filter((row) => row.forgotten_at === null && !ours.has(row.object_hash));
541
+ }
542
+ /**
543
+ * Moves the fork's new objects into the upstream object store. Runs after
544
+ * the merge is verified but before the catalog ref is pushed, so the
545
+ * catalog never points at objects upstream cannot serve — the same
546
+ * objects-before-push ordering as engine.storage.backup.
547
+ */
548
+ async function uploadForkObjects(db, objects, options) {
549
+ if (objects.length === 0)
550
+ return [];
551
+ if (!options.upstreamObjects || !options.forkObjects) {
552
+ throw new EngineFault({
553
+ code: "INVALID_INPUT",
554
+ message: `Fork adds ${objects.length} object(s); upstreamObjects and ` +
555
+ "forkObjects are required to move them before the catalog moves",
556
+ details: { hashes: objects.map((row) => row.object_hash) },
557
+ });
558
+ }
559
+ const prefix = options.objectPrefix;
560
+ const downloadDir = await mkdtemp(path.join(tmpdir(), "videobook-merge-objects-"));
561
+ try {
562
+ const forkStore = new ObjectStore(path.join(downloadDir, "fork"), options.forkObjects, prefix);
563
+ const upstreamStore = new ObjectStore(path.join(downloadDir, "upstream"), options.upstreamObjects, prefix);
564
+ const uploaded = [];
565
+ for (const row of objects) {
566
+ // ensureLocalPath lazily fetches the bytes from the fork's
567
+ // public-read store; publish uploads and verifies the remote copy.
568
+ const localPath = await forkStore.ensureLocalPath(row.object_hash);
569
+ const staged = upstreamStore.pathFor(row.object_hash);
570
+ await mkdir(path.dirname(staged), { recursive: true });
571
+ await copyFile(localPath, staged);
572
+ await upstreamStore.publish(row.object_hash, row.size_bytes);
573
+ uploaded.push(row.object_hash);
574
+ }
575
+ return uploaded;
576
+ }
577
+ finally {
578
+ await rm(downloadDir, { recursive: true, force: true });
579
+ }
580
+ }
581
+ function findRemote(db, name) {
582
+ const rows = db
583
+ .prepare("SELECT * FROM dolt_remotes()")
584
+ .all();
585
+ const remote = rows.find((row) => row.name === name);
586
+ return remote ? { name: remote.name, url: remote.url } : null;
587
+ }
588
+ function ensureRemote(db, name, url) {
589
+ const existing = findRemote(db, name);
590
+ if (existing) {
591
+ if (existing.url !== url) {
592
+ throw new EngineFault({
593
+ code: "INVALID_INPUT",
594
+ message: `Remote ${name} already points to a different URL`,
595
+ details: { name, existing: existing.url, requested: url },
596
+ });
597
+ }
598
+ return;
599
+ }
600
+ db.prepare("SELECT dolt_remote('add', ?, ?) AS result").get(name, url);
601
+ }
602
+ //# sourceMappingURL=fork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fork.js","sourceRoot":"","sources":["../src/fork.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EngineError, Generation, GenerationPatch, ListGenerationsArgs, RecordGenerationArgs, Result } from "./engine-types.js";
2
+ import { EngineContext } from "./context.js";
3
+ export declare function createGenerationsApi(context: EngineContext): {
4
+ record: (input: RecordGenerationArgs) => Promise<Result<Generation, EngineError>>;
5
+ update: (generationId: string, patch: GenerationPatch) => Promise<Result<Generation, EngineError>>;
6
+ listForCell: (notebookId: string, cellId: string, options?: ListGenerationsArgs) => Result<Generation[], EngineError>;
7
+ read: (generationId: string) => Result<Generation, EngineError>;
8
+ };
9
+ //# sourceMappingURL=generations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generations.d.ts","sourceRoot":"","sources":["../src/generations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,eAAe,EAEf,mBAAmB,EACnB,oBAAoB,EACpB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAA0B,MAAM,cAAc,CAAC;AAmCrE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa;oBAG9C,oBAAoB,KAC1B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;2BAG3B,MAAM,SACb,eAAe,KACrB,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;8BAG7B,MAAM,UACV,MAAM,YACL,mBAAmB,KAC3B,MAAM,CAAC,UAAU,EAAE,EAAE,WAAW,CAAC;yBAIf,MAAM,KAAG,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC;EAKhE"}