videobook-engine 2.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 (103) hide show
  1. package/README.md +214 -0
  2. package/dist/artifacts.d.ts +20 -0
  3. package/dist/artifacts.d.ts.map +1 -0
  4. package/dist/artifacts.js +312 -0
  5. package/dist/artifacts.js.map +1 -0
  6. package/dist/books.d.ts +7 -0
  7. package/dist/books.d.ts.map +1 -0
  8. package/dist/books.js +27 -0
  9. package/dist/books.js.map +1 -0
  10. package/dist/cas.d.ts +26 -0
  11. package/dist/cas.d.ts.map +1 -0
  12. package/dist/cas.js +139 -0
  13. package/dist/cas.js.map +1 -0
  14. package/dist/communications.d.ts +15 -0
  15. package/dist/communications.d.ts.map +1 -0
  16. package/dist/communications.js +139 -0
  17. package/dist/communications.js.map +1 -0
  18. package/dist/context.d.ts +42 -0
  19. package/dist/context.d.ts.map +1 -0
  20. package/dist/context.js +197 -0
  21. package/dist/context.js.map +1 -0
  22. package/dist/domain.d.ts +32 -0
  23. package/dist/domain.d.ts.map +1 -0
  24. package/dist/domain.js +399 -0
  25. package/dist/domain.js.map +1 -0
  26. package/dist/engine-types.d.ts +548 -0
  27. package/dist/engine-types.d.ts.map +1 -0
  28. package/dist/engine-types.js +10 -0
  29. package/dist/engine-types.js.map +1 -0
  30. package/dist/engine.d.ts +213 -0
  31. package/dist/engine.d.ts.map +1 -0
  32. package/dist/engine.js +130 -0
  33. package/dist/engine.js.map +1 -0
  34. package/dist/files.d.ts +28 -0
  35. package/dist/files.d.ts.map +1 -0
  36. package/dist/files.js +476 -0
  37. package/dist/files.js.map +1 -0
  38. package/dist/history-types.d.ts +74 -0
  39. package/dist/history-types.d.ts.map +1 -0
  40. package/dist/history-types.js +2 -0
  41. package/dist/history-types.js.map +1 -0
  42. package/dist/history.d.ts +20 -0
  43. package/dist/history.d.ts.map +1 -0
  44. package/dist/history.js +921 -0
  45. package/dist/history.js.map +1 -0
  46. package/dist/ids.d.ts +4 -0
  47. package/dist/ids.d.ts.map +1 -0
  48. package/dist/ids.js +14 -0
  49. package/dist/ids.js.map +1 -0
  50. package/dist/index.d.ts +16 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +12 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/job-queue.d.ts +51 -0
  55. package/dist/job-queue.d.ts.map +1 -0
  56. package/dist/job-queue.js +443 -0
  57. package/dist/job-queue.js.map +1 -0
  58. package/dist/media.d.ts +7 -0
  59. package/dist/media.d.ts.map +1 -0
  60. package/dist/media.js +60 -0
  61. package/dist/media.js.map +1 -0
  62. package/dist/metadata.d.ts +21 -0
  63. package/dist/metadata.d.ts.map +1 -0
  64. package/dist/metadata.js +222 -0
  65. package/dist/metadata.js.map +1 -0
  66. package/dist/notebook/types.d.ts +51 -0
  67. package/dist/notebook/types.d.ts.map +1 -0
  68. package/dist/notebook/types.js +2 -0
  69. package/dist/notebook/types.js.map +1 -0
  70. package/dist/resolver.d.ts +15 -0
  71. package/dist/resolver.d.ts.map +1 -0
  72. package/dist/resolver.js +81 -0
  73. package/dist/resolver.js.map +1 -0
  74. package/dist/runtime-services.d.ts +65 -0
  75. package/dist/runtime-services.d.ts.map +1 -0
  76. package/dist/runtime-services.js +584 -0
  77. package/dist/runtime-services.js.map +1 -0
  78. package/dist/schema.d.ts +7 -0
  79. package/dist/schema.d.ts.map +1 -0
  80. package/dist/schema.js +509 -0
  81. package/dist/schema.js.map +1 -0
  82. package/dist/similarity.d.ts +4 -0
  83. package/dist/similarity.d.ts.map +1 -0
  84. package/dist/similarity.js +1551 -0
  85. package/dist/similarity.js.map +1 -0
  86. package/dist/status.d.ts +9 -0
  87. package/dist/status.d.ts.map +1 -0
  88. package/dist/status.js +231 -0
  89. package/dist/status.js.map +1 -0
  90. package/dist/storage.d.ts +7 -0
  91. package/dist/storage.d.ts.map +1 -0
  92. package/dist/storage.js +129 -0
  93. package/dist/storage.js.map +1 -0
  94. package/dist/store.d.ts +55 -0
  95. package/dist/store.d.ts.map +1 -0
  96. package/dist/store.js +378 -0
  97. package/dist/store.js.map +1 -0
  98. package/dist/timeline.d.ts +9 -0
  99. package/dist/timeline.d.ts.map +1 -0
  100. package/dist/timeline.js +236 -0
  101. package/dist/timeline.js.map +1 -0
  102. package/docs/engine-layout.md +489 -0
  103. package/package.json +55 -0
package/dist/store.js ADDED
@@ -0,0 +1,378 @@
1
+ import { mkdirSync, existsSync } from "node:fs";
2
+ import * as path from "node:path";
3
+ import { DatabaseSync, } from "@dolthub/doltlite";
4
+ import { v7 as uuidv7 } from "uuid";
5
+ import { RUNTIME_SCHEMA_SQL, RUNTIME_TABLES, SCHEMA_VERSION, SEMANTIC_SCHEMA_SQL, SEMANTIC_TABLES, } from "./schema.js";
6
+ export class EngineFault extends Error {
7
+ error;
8
+ constructor(error) {
9
+ super(error.message);
10
+ this.name = "EngineFault";
11
+ this.error = error;
12
+ }
13
+ }
14
+ export class DoltStore {
15
+ db;
16
+ dataDir;
17
+ databasePath;
18
+ objectsDir;
19
+ workspaceDir;
20
+ writeChain = Promise.resolve();
21
+ constructor(input) {
22
+ this.dataDir = path.resolve(input.dataDir);
23
+ this.workspaceDir = path.resolve(input.workspaceDir);
24
+ this.databasePath = path.join(this.dataDir, "videobook.db");
25
+ this.objectsDir = path.join(this.dataDir, "objects", "sha256");
26
+ mkdirSync(this.dataDir, { recursive: true });
27
+ mkdirSync(this.objectsDir, { recursive: true });
28
+ mkdirSync(this.workspaceDir, { recursive: true });
29
+ const existed = existsSync(this.databasePath);
30
+ this.db = new DatabaseSync(this.databasePath);
31
+ this.configureConnection();
32
+ this.initialize(existed, input.initialBook);
33
+ if (input.catalogBackup)
34
+ this.configureRemote(input.catalogBackup);
35
+ }
36
+ get head() {
37
+ return this.db.doltLog({ limit: 1 })[0]?.commit_hash ?? "";
38
+ }
39
+ get status() {
40
+ return this.db.doltStatus();
41
+ }
42
+ close() {
43
+ this.db.close();
44
+ }
45
+ async semantic(input, tables, mutate) {
46
+ return this.serial(async () => {
47
+ const operationId = uuidv7();
48
+ const now = Date.now();
49
+ const touched = uniqueSemanticTables([...tables, "operations"]);
50
+ this.assertRuntimeUnstaged();
51
+ this.begin();
52
+ let value;
53
+ try {
54
+ value = mutate(operationId, now);
55
+ this.db
56
+ .prepare(`INSERT INTO operations(
57
+ operation_id, operation, artifact_id, details_json,
58
+ write_set_json, base_revision, created_at, author
59
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
60
+ .run(operationId, input.operation, input.artifactId ?? null, canonicalJson(input.details ?? {}), canonicalJson(input.writeSet ?? []), input.baseRevision ?? null, now, input.author ?? "videobook");
61
+ this.db
62
+ .prepare(`INSERT INTO runtime_commit_outbox(
63
+ operation_id, tables_json, message, created_at
64
+ ) VALUES (?, ?, ?, ?)`)
65
+ .run(operationId, canonicalJson(touched), commitMessage(input, operationId), now);
66
+ this.commitSql();
67
+ }
68
+ catch (error) {
69
+ this.rollback();
70
+ throw error;
71
+ }
72
+ const revision = this.commitOutbox(operationId);
73
+ return { value, revision, operationId };
74
+ });
75
+ }
76
+ runtime(mutate) {
77
+ this.assertRuntimeUnstaged();
78
+ this.begin();
79
+ try {
80
+ const value = mutate(Date.now());
81
+ this.commitSql();
82
+ return value;
83
+ }
84
+ catch (error) {
85
+ this.rollback();
86
+ throw error;
87
+ }
88
+ }
89
+ diff(from, to, table) {
90
+ return this.db.doltDiff(from, to, table);
91
+ }
92
+ push(remoteName) {
93
+ this.assertRuntimeUnstaged();
94
+ this.db
95
+ .prepare("SELECT dolt_push(?, 'main') AS result")
96
+ .get(remoteName);
97
+ }
98
+ configureConnection() {
99
+ this.db.exec("PRAGMA foreign_keys = ON");
100
+ this.db.exec("PRAGMA synchronous = FULL");
101
+ this.db.exec("PRAGMA busy_timeout = 10000");
102
+ try {
103
+ this.db.exec("PRAGMA journal_mode = WAL");
104
+ }
105
+ catch {
106
+ // DoltLite builds that do not expose WAL still provide atomic commits.
107
+ }
108
+ }
109
+ initialize(existed, initialBook) {
110
+ const schemaExists = this.tableExists("engine_schema");
111
+ if (existed && !schemaExists) {
112
+ const userTables = this.userTables();
113
+ if (userTables.length > 0) {
114
+ this.db.close();
115
+ throw new EngineFault({
116
+ code: "SCHEMA_INCOMPATIBLE",
117
+ message: "Existing database is not a supported Videobook catalog; choose an empty dataDir",
118
+ details: { tables: userTables },
119
+ });
120
+ }
121
+ }
122
+ if (!schemaExists) {
123
+ if (!initialBook) {
124
+ this.db.close();
125
+ throw new EngineFault({
126
+ code: "INVALID_INPUT",
127
+ message: "initialBookSlug is required when creating a new engine root",
128
+ });
129
+ }
130
+ this.db.exec(SEMANTIC_SCHEMA_SQL);
131
+ this.db.exec(`CREATE TABLE IF NOT EXISTS dolt_ignore(
132
+ pattern TEXT NOT NULL,
133
+ ignored TINYINT NOT NULL,
134
+ PRIMARY KEY(pattern)
135
+ )`);
136
+ this.db
137
+ .prepare(`INSERT INTO dolt_ignore(pattern, ignored)
138
+ VALUES ('runtime_%', 1), ('sqlite_sequence', 1)
139
+ ON CONFLICT(pattern) DO UPDATE SET ignored=excluded.ignored`)
140
+ .run();
141
+ const now = Date.now();
142
+ this.db
143
+ .prepare("INSERT INTO engine_schema(singleton, version, created_at) VALUES (1, ?, ?)")
144
+ .run(SCHEMA_VERSION, now);
145
+ this.db
146
+ .prepare("INSERT INTO book(book_id, slug, created_at) VALUES (?, ?, ?)")
147
+ .run(initialBook.bookId, initialBook.slug, now);
148
+ this.db
149
+ .prepare("INSERT INTO timeline(book_id, render) VALUES (?, 'landscape')")
150
+ .run(initialBook.bookId);
151
+ this.stageTables(SEMANTIC_TABLES);
152
+ this.db
153
+ .prepare("SELECT dolt_add('dolt_ignore') AS result")
154
+ .get();
155
+ this.assertOnlyVersionedStaged();
156
+ this.sqlCommit("Initialize Videobook book");
157
+ }
158
+ else {
159
+ const row = this.db
160
+ .prepare("SELECT version FROM engine_schema WHERE singleton = 1")
161
+ .get();
162
+ if (!row || row.version !== SCHEMA_VERSION) {
163
+ this.db.close();
164
+ throw new EngineFault({
165
+ code: "SCHEMA_INCOMPATIBLE",
166
+ message: `Database schema ${row?.version ?? "unknown"} is not supported by engine schema ${SCHEMA_VERSION}`,
167
+ });
168
+ }
169
+ const books = this.db
170
+ .prepare("SELECT book_id FROM book")
171
+ .all();
172
+ if (books.length !== 1) {
173
+ this.db.close();
174
+ throw new EngineFault({
175
+ code: "SCHEMA_INCOMPATIBLE",
176
+ message: `Book catalog must contain exactly one book record; found ${books.length}`,
177
+ });
178
+ }
179
+ if (this.db.doltActiveBranch() !== "main") {
180
+ this.db.close();
181
+ throw new EngineFault({
182
+ code: "SCHEMA_INCOMPATIBLE",
183
+ message: "Videobook only supports the main branch",
184
+ });
185
+ }
186
+ }
187
+ this.db.exec(RUNTIME_SCHEMA_SQL);
188
+ this.db
189
+ .prepare(`INSERT INTO runtime_meta(key, value_json, updated_at)
190
+ VALUES ('schema_version', ?, ?)
191
+ ON CONFLICT(key) DO UPDATE SET
192
+ value_json=excluded.value_json,
193
+ updated_at=excluded.updated_at`)
194
+ .run(String(SCHEMA_VERSION), Date.now());
195
+ this.assertRuntimeUnstaged();
196
+ this.recoverOutbox();
197
+ }
198
+ configureRemote(remote) {
199
+ const rows = this.db
200
+ .prepare("SELECT * FROM dolt_remotes()")
201
+ .all();
202
+ const current = rows.find((row) => row.name === remote.name);
203
+ if (current) {
204
+ if (current.url !== remote.url) {
205
+ throw new EngineFault({
206
+ code: "SCHEMA_INCOMPATIBLE",
207
+ message: `Catalog remote ${remote.name} already points to a different URL`,
208
+ });
209
+ }
210
+ return;
211
+ }
212
+ this.db
213
+ .prepare("SELECT dolt_remote('add', ?, ?) AS result")
214
+ .get(remote.name, remote.url);
215
+ }
216
+ recoverOutbox() {
217
+ const rows = this.db
218
+ .prepare(`SELECT operation_id, tables_json, message
219
+ FROM runtime_commit_outbox
220
+ ORDER BY created_at, operation_id`)
221
+ .all();
222
+ for (const row of rows) {
223
+ this.commitOutbox(row.operation_id);
224
+ }
225
+ }
226
+ commitOutbox(operationId) {
227
+ const row = this.db
228
+ .prepare(`SELECT operation_id, tables_json, message
229
+ FROM runtime_commit_outbox
230
+ WHERE operation_id = ?`)
231
+ .get(operationId);
232
+ if (!row)
233
+ return this.head;
234
+ const tables = parseStringArray(row.tables_json);
235
+ const changedTables = [];
236
+ for (const table of tables) {
237
+ if (!isSemanticTable(table)) {
238
+ throw new EngineFault({
239
+ code: "STORAGE_ERROR",
240
+ message: `Commit outbox contains non-semantic table: ${table}`,
241
+ });
242
+ }
243
+ const changed = this.db
244
+ .doltStatus()
245
+ .some((entry) => entry.table_name === table &&
246
+ entry.staged === 0 &&
247
+ entry.status !== "ignored");
248
+ if (changed)
249
+ changedTables.push(table);
250
+ }
251
+ this.stageTables(changedTables);
252
+ this.assertOnlyVersionedStaged();
253
+ const hasStaged = this.db
254
+ .doltStatus()
255
+ .some((entry) => entry.staged === 1);
256
+ const revision = hasStaged ? this.sqlCommit(row.message) : this.head;
257
+ this.runtime(() => {
258
+ this.db
259
+ .prepare("DELETE FROM runtime_commit_outbox WHERE operation_id = ?")
260
+ .run(operationId);
261
+ });
262
+ return revision;
263
+ }
264
+ sqlCommit(message) {
265
+ const row = this.db
266
+ .prepare("SELECT dolt_commit('-m', ?) AS hash")
267
+ .get(message);
268
+ const hash = row?.hash;
269
+ if (!hash) {
270
+ throw new EngineFault({
271
+ code: "STORAGE_ERROR",
272
+ message: "Dolt commit did not return a revision hash",
273
+ });
274
+ }
275
+ this.assertRuntimeUnstaged();
276
+ return hash;
277
+ }
278
+ stageTables(tables) {
279
+ const unique = uniqueSemanticTables(tables);
280
+ for (const table of unique) {
281
+ this.db
282
+ .prepare("SELECT dolt_add(?) AS result")
283
+ .get(table);
284
+ }
285
+ }
286
+ assertOnlyVersionedStaged() {
287
+ for (const entry of this.db.doltStatus()) {
288
+ if (entry.staged !== 1)
289
+ continue;
290
+ if (!isSemanticTable(entry.table_name) &&
291
+ entry.table_name !== "dolt_ignore") {
292
+ throw new EngineFault({
293
+ code: "STORAGE_ERROR",
294
+ message: `Refusing to commit non-versioned table ${entry.table_name}`,
295
+ });
296
+ }
297
+ }
298
+ }
299
+ assertRuntimeUnstaged() {
300
+ const runtime = new Set(RUNTIME_TABLES);
301
+ const staged = this.db
302
+ .doltStatus()
303
+ .find((entry) => entry.staged === 1 && runtime.has(entry.table_name));
304
+ if (staged) {
305
+ throw new EngineFault({
306
+ code: "STORAGE_ERROR",
307
+ message: `Runtime table ${staged.table_name} must never be staged`,
308
+ });
309
+ }
310
+ }
311
+ userTables() {
312
+ return this.db
313
+ .prepare(`SELECT name
314
+ FROM sqlite_master
315
+ WHERE type = 'table'
316
+ AND name NOT LIKE 'sqlite_%'
317
+ AND name NOT LIKE 'dolt_%'
318
+ ORDER BY name`)
319
+ .all().map((row) => row.name);
320
+ }
321
+ tableExists(table) {
322
+ return Boolean(this.db
323
+ .prepare("SELECT 1 AS present FROM sqlite_master WHERE type='table' AND name=?")
324
+ .get(table));
325
+ }
326
+ begin() {
327
+ this.db.exec("BEGIN IMMEDIATE");
328
+ }
329
+ commitSql() {
330
+ this.db.exec("COMMIT");
331
+ }
332
+ rollback() {
333
+ if (this.db.inTransaction)
334
+ this.db.exec("ROLLBACK");
335
+ }
336
+ serial(work) {
337
+ const result = this.writeChain.then(work, work);
338
+ this.writeChain = result.then(() => undefined, () => undefined);
339
+ return result;
340
+ }
341
+ }
342
+ export function canonicalJson(value) {
343
+ return JSON.stringify(sortJson(value));
344
+ }
345
+ export function parseJson(text, fallback) {
346
+ try {
347
+ return JSON.parse(text);
348
+ }
349
+ catch {
350
+ return fallback;
351
+ }
352
+ }
353
+ function sortJson(value) {
354
+ if (Array.isArray(value))
355
+ return value.map(sortJson);
356
+ if (value === null || typeof value !== "object")
357
+ return value;
358
+ return Object.fromEntries(Object.entries(value)
359
+ .sort(([left], [right]) => left.localeCompare(right))
360
+ .map(([key, item]) => [key, sortJson(item)]));
361
+ }
362
+ function commitMessage(input, operationId) {
363
+ const target = input.artifactId ? ` artifact:${input.artifactId}` : "";
364
+ return `${input.operation}${target}\n\nop-id: ${operationId}`;
365
+ }
366
+ function parseStringArray(text) {
367
+ const parsed = parseJson(text, []);
368
+ return Array.isArray(parsed)
369
+ ? parsed.filter((item) => typeof item === "string")
370
+ : [];
371
+ }
372
+ function isSemanticTable(table) {
373
+ return SEMANTIC_TABLES.includes(table);
374
+ }
375
+ function uniqueSemanticTables(tables) {
376
+ return [...new Set(tables)];
377
+ }
378
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EngineError, Result, Timeline, TimelineInput } from "./engine-types.js";
2
+ import { EngineContext } from "./context.js";
3
+ export declare function createTimelineApi(context: EngineContext): {
4
+ get: () => Timeline;
5
+ getAtRevision: (revision: string) => Result<Timeline, EngineError>;
6
+ set: (input: TimelineInput) => Promise<Result<Timeline, EngineError>>;
7
+ reset: () => Promise<Result<Timeline, EngineError>>;
8
+ };
9
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,QAAQ,EAGR,aAAa,EAId,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EAGd,MAAM,cAAc,CAAC;AA6BtB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa;eAE3C,QAAQ;8BAEL,MAAM,KACf,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;iBAGvB,aAAa,KACnB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;iBAE9B,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;EAGpD"}
@@ -0,0 +1,236 @@
1
+ import { ok } from "./engine-types.js";
2
+ import { resultOf, syncResultOf, } from "./context.js";
3
+ import { assertUuidV7, newUuidV7 } from "./ids.js";
4
+ import { EngineFault } from "./store.js";
5
+ export function createTimelineApi(context) {
6
+ return {
7
+ get: () => readTimeline(context),
8
+ getAtRevision: (revision) => syncResultOf(() => readTimeline(context, revision)),
9
+ set: (input) => setTimeline(context, input),
10
+ reset: () => resetTimeline(context),
11
+ };
12
+ }
13
+ async function setTimeline(context, input) {
14
+ return resultOf(async () => {
15
+ validateRender(input.render);
16
+ const slots = (input.slots ?? []).map((slot) => resolveSlot(context, slot));
17
+ const audio = (input.audio ?? []).map((item) => resolveAudio(context, item));
18
+ ensureUniqueIds(slots, "timeline slot");
19
+ ensureUniqueIds(audio, "timeline audio");
20
+ const bookId = context.bookRow().book_id;
21
+ const mutation = await context.store.semantic({
22
+ operation: "set_timeline",
23
+ details: {
24
+ render: input.render,
25
+ slots: slots.length,
26
+ audio: audio.length,
27
+ },
28
+ writeSet: [
29
+ "timeline",
30
+ ...slots.map((slot) => `timeline-slot:${slot.id}`),
31
+ ...audio.map((item) => `timeline-audio:${item.id}`),
32
+ ],
33
+ }, ["timeline", "timeline_slots", "timeline_audio"], () => {
34
+ context.store.db
35
+ .prepare("UPDATE timeline SET render=? WHERE book_id=?")
36
+ .run(input.render, bookId);
37
+ synchronizeSlots(context, slots);
38
+ synchronizeAudio(context, audio);
39
+ });
40
+ return ok(readTimeline(context), mutation.revision);
41
+ });
42
+ }
43
+ async function resetTimeline(context) {
44
+ return resultOf(async () => {
45
+ const bookId = context.bookRow().book_id;
46
+ const mutation = await context.store.semantic({
47
+ operation: "reset_timeline",
48
+ writeSet: ["timeline"],
49
+ }, ["timeline", "timeline_slots", "timeline_audio"], () => {
50
+ context.store.db.prepare("DELETE FROM timeline_slots").run();
51
+ context.store.db.prepare("DELETE FROM timeline_audio").run();
52
+ context.store.db
53
+ .prepare("UPDATE timeline SET render='landscape' WHERE book_id=?")
54
+ .run(bookId);
55
+ });
56
+ return ok(readTimeline(context), mutation.revision);
57
+ });
58
+ }
59
+ function readTimeline(context, revision) {
60
+ const source = revision ? "dolt_at_timeline(?)" : "timeline";
61
+ const params = revision ? [revision] : [];
62
+ const row = context.store.db
63
+ .prepare(`SELECT book_id, render FROM ${source}`)
64
+ .get(...params);
65
+ if (!row) {
66
+ throw new EngineFault({
67
+ code: "NOT_FOUND",
68
+ message: revision
69
+ ? `Timeline not found at revision: ${revision}`
70
+ : "Timeline not found",
71
+ });
72
+ }
73
+ const slotSource = revision
74
+ ? "dolt_at_timeline_slots(?)"
75
+ : "timeline_slots";
76
+ const audioSource = revision
77
+ ? "dolt_at_timeline_audio(?)"
78
+ : "timeline_audio";
79
+ const slots = context.store.db
80
+ .prepare(`SELECT slot_id, artifact_id, ordinal, volume,
81
+ audio_fade_in, audio_fade_out
82
+ FROM ${slotSource} ORDER BY ordinal, slot_id`)
83
+ .all(...params);
84
+ const audio = context.store.db
85
+ .prepare(`SELECT audio_id, artifact_id, ordinal, start_frame,
86
+ duration_frames, volume, fade_in, fade_out
87
+ FROM ${audioSource} ORDER BY ordinal, audio_id`)
88
+ .all(...params);
89
+ return {
90
+ bookId: row.book_id,
91
+ render: row.render,
92
+ slots: slots.map(slotFromRow),
93
+ audio: audio.map(audioFromRow),
94
+ };
95
+ }
96
+ function resolveSlot(context, input) {
97
+ const id = input.id ?? newUuidV7();
98
+ assertUuidV7(id, "Timeline slot ID");
99
+ const artifactId = resolveArtifact(context, input.artifact, input.artifactId);
100
+ optionalNonNegative(input.volume, "Timeline slot volume");
101
+ optionalNonNegative(input.audioFadeIn, "Timeline slot audioFadeIn");
102
+ optionalNonNegative(input.audioFadeOut, "Timeline slot audioFadeOut");
103
+ return {
104
+ id,
105
+ artifactId,
106
+ ...(input.volume === undefined ? {} : { volume: input.volume }),
107
+ ...(input.audioFadeIn === undefined
108
+ ? {}
109
+ : { audioFadeIn: input.audioFadeIn }),
110
+ ...(input.audioFadeOut === undefined
111
+ ? {}
112
+ : { audioFadeOut: input.audioFadeOut }),
113
+ };
114
+ }
115
+ function resolveAudio(context, input) {
116
+ const id = input.id ?? newUuidV7();
117
+ assertUuidV7(id, "Timeline audio ID");
118
+ const artifactId = resolveArtifact(context, input.artifact, input.artifactId);
119
+ integerAtLeast(input.startFrame, 0, "Timeline audio startFrame");
120
+ integerAtLeast(input.durationFrames, 1, "Timeline audio durationFrames");
121
+ optionalNonNegative(input.volume, "Timeline audio volume");
122
+ optionalNonNegative(input.fadeIn, "Timeline audio fadeIn");
123
+ optionalNonNegative(input.fadeOut, "Timeline audio fadeOut");
124
+ return {
125
+ id,
126
+ artifactId,
127
+ startFrame: input.startFrame,
128
+ durationFrames: input.durationFrames,
129
+ ...(input.volume === undefined ? {} : { volume: input.volume }),
130
+ ...(input.fadeIn === undefined ? {} : { fadeIn: input.fadeIn }),
131
+ ...(input.fadeOut === undefined ? {} : { fadeOut: input.fadeOut }),
132
+ };
133
+ }
134
+ function resolveArtifact(context, artifact, artifactId) {
135
+ if (!artifact && !artifactId) {
136
+ throw new Error("Timeline artifact reference is required");
137
+ }
138
+ const resolved = context.artifactRow(artifact ?? artifactId).artifact_id;
139
+ if (artifact &&
140
+ artifactId &&
141
+ context.artifactRow(artifactId).artifact_id !== resolved) {
142
+ throw new Error("Timeline artifact and artifactId must identify the same artifact");
143
+ }
144
+ return resolved;
145
+ }
146
+ function synchronizeSlots(context, slots) {
147
+ deleteMissing(context, "timeline_slots", "slot_id", slots.map((slot) => slot.id));
148
+ const upsert = context.store.db.prepare(`INSERT INTO timeline_slots(
149
+ slot_id, artifact_id, ordinal, volume, audio_fade_in, audio_fade_out
150
+ ) VALUES (?, ?, ?, ?, ?, ?)
151
+ ON CONFLICT(slot_id) DO UPDATE SET
152
+ artifact_id=excluded.artifact_id,
153
+ ordinal=excluded.ordinal,
154
+ volume=excluded.volume,
155
+ audio_fade_in=excluded.audio_fade_in,
156
+ audio_fade_out=excluded.audio_fade_out`);
157
+ slots.forEach((slot, ordinal) => {
158
+ upsert.run(slot.id, slot.artifactId, ordinal, slot.volume ?? null, slot.audioFadeIn ?? null, slot.audioFadeOut ?? null);
159
+ });
160
+ }
161
+ function synchronizeAudio(context, audio) {
162
+ deleteMissing(context, "timeline_audio", "audio_id", audio.map((item) => item.id));
163
+ const upsert = context.store.db.prepare(`INSERT INTO timeline_audio(
164
+ audio_id, artifact_id, ordinal, start_frame, duration_frames,
165
+ volume, fade_in, fade_out
166
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
167
+ ON CONFLICT(audio_id) DO UPDATE SET
168
+ artifact_id=excluded.artifact_id,
169
+ ordinal=excluded.ordinal,
170
+ start_frame=excluded.start_frame,
171
+ duration_frames=excluded.duration_frames,
172
+ volume=excluded.volume,
173
+ fade_in=excluded.fade_in,
174
+ fade_out=excluded.fade_out`);
175
+ audio.forEach((item, ordinal) => {
176
+ upsert.run(item.id, item.artifactId, ordinal, item.startFrame, item.durationFrames, item.volume ?? null, item.fadeIn ?? null, item.fadeOut ?? null);
177
+ });
178
+ }
179
+ function deleteMissing(context, table, idColumn, ids) {
180
+ if (ids.length === 0) {
181
+ context.store.db.prepare(`DELETE FROM ${table}`).run();
182
+ return;
183
+ }
184
+ const placeholders = ids.map(() => "?").join(", ");
185
+ context.store.db
186
+ .prepare(`DELETE FROM ${table} WHERE ${idColumn} NOT IN (${placeholders})`)
187
+ .run(...ids);
188
+ }
189
+ function slotFromRow(row) {
190
+ return {
191
+ id: row.slot_id,
192
+ artifactId: row.artifact_id,
193
+ ...(row.volume === null ? {} : { volume: row.volume }),
194
+ ...(row.audio_fade_in === null
195
+ ? {}
196
+ : { audioFadeIn: row.audio_fade_in }),
197
+ ...(row.audio_fade_out === null
198
+ ? {}
199
+ : { audioFadeOut: row.audio_fade_out }),
200
+ };
201
+ }
202
+ function audioFromRow(row) {
203
+ return {
204
+ id: row.audio_id,
205
+ artifactId: row.artifact_id,
206
+ startFrame: row.start_frame,
207
+ durationFrames: row.duration_frames,
208
+ ...(row.volume === null ? {} : { volume: row.volume }),
209
+ ...(row.fade_in === null ? {} : { fadeIn: row.fade_in }),
210
+ ...(row.fade_out === null ? {} : { fadeOut: row.fade_out }),
211
+ };
212
+ }
213
+ function ensureUniqueIds(items, label) {
214
+ const seen = new Set();
215
+ for (const item of items) {
216
+ if (seen.has(item.id))
217
+ throw new Error(`Duplicate ${label} ID: ${item.id}`);
218
+ seen.add(item.id);
219
+ }
220
+ }
221
+ function validateRender(value) {
222
+ if (!["landscape", "portrait", "square"].includes(value)) {
223
+ throw new Error(`Invalid timeline render: ${value}`);
224
+ }
225
+ }
226
+ function optionalNonNegative(value, label) {
227
+ if (value !== undefined && (!Number.isFinite(value) || value < 0)) {
228
+ throw new Error(`${label} must be a non-negative finite number`);
229
+ }
230
+ }
231
+ function integerAtLeast(value, minimum, label) {
232
+ if (!Number.isInteger(value) || value < minimum) {
233
+ throw new Error(`${label} must be an integer >= ${minimum}`);
234
+ }
235
+ }
236
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAEL,QAAQ,EACR,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2BzC,MAAM,UAAU,iBAAiB,CAAC,OAAsB;IACtD,OAAO;QACL,GAAG,EAAE,GAAa,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;QAC1C,aAAa,EAAE,CACb,QAAgB,EACe,EAAE,CACjC,YAAY,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrD,GAAG,EAAE,CACH,KAAoB,EACoB,EAAE,CAC1C,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;QAC7B,KAAK,EAAE,GAA2C,EAAE,CAClD,aAAa,CAAC,OAAO,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAsB,EACtB,KAAoB;IAEpB,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAC3B,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAC5B,CAAC;QACF,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACxC,eAAe,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAC3C;YACE,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB;YACD,QAAQ,EAAE;gBACR,UAAU;gBACV,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,CAAC;gBAClD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,IAAI,CAAC,EAAE,EAAE,CAAC;aACpD;SACF,EACD,CAAC,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAChD,GAAG,EAAE;YACH,OAAO,CAAC,KAAK,CAAC,EAAE;iBACb,OAAO,CAAC,8CAA8C,CAAC;iBACvD,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7B,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACjC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC,CACF,CAAC;QACF,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAsB;IAEtB,OAAO,QAAQ,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,CAC3C;YACE,SAAS,EAAE,gBAAgB;YAC3B,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB,EACD,CAAC,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAChD,GAAG,EAAE;YACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAAE,CAAC;YAC7D,OAAO,CAAC,KAAK,CAAC,EAAE;iBACb,OAAO,CAAC,wDAAwD,CAAC;iBACjE,GAAG,CAAC,MAAM,CAAC,CAAC;QACjB,CAAC,CACF,CAAC;QACF,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,OAAsB,EAAE,QAAiB;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE;SACzB,OAAO,CAAC,+BAA+B,MAAM,EAAE,CAAC;SAChD,GAAG,CAAC,GAAG,MAAM,CAAuC,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;gBACf,CAAC,CAAC,mCAAmC,QAAQ,EAAE;gBAC/C,CAAC,CAAC,oBAAoB;SACzB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ;QACzB,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,WAAW,GAAG,QAAQ;QAC1B,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE;SAC3B,OAAO,CACN;;cAEQ,UAAU,4BAA4B,CAC/C;SACA,GAAG,CAAC,GAAG,MAAM,CAAiC,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE;SAC3B,OAAO,CACN;;cAEQ,WAAW,6BAA6B,CACjD;SACA,GAAG,CAAC,GAAG,MAAM,CAAkC,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;QAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,OAAsB,EACtB,KAAwB;IAExB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9E,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC1D,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,2BAA2B,CAAC,CAAC;IACpE,mBAAmB,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;IACtE,OAAO;QACL,EAAE;QACF,UAAU;QACV,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,GAAG,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS;YAClC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,OAAsB,EACtB,KAAyB;IAEzB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9E,cAAc,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACjE,cAAc,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,+BAA+B,CAAC,CAAC;IACzE,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC3D,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC3D,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC7D,OAAO;QACL,EAAE;QACF,UAAU;QACV,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,OAAsB,EACtB,QAA4B,EAC5B,UAA8B;IAE9B,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,IAAI,UAAW,CAAC,CAAC,WAAW,CAAC;IAC1E,IACE,QAAQ;QACR,UAAU;QACV,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,WAAW,KAAK,QAAQ,EACxD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAsB,EACtB,KAAqB;IAErB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CACrC;;;;;;;;6CAQyC,CAC1C,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,OAAO,EACP,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,WAAW,IAAI,IAAI,EACxB,IAAI,CAAC,YAAY,IAAI,IAAI,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAsB,EACtB,KAAsB;IAEtB,aAAa,CACX,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAC7B,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CACrC;;;;;;;;;;;iCAW6B,CAC9B,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,UAAU,EACf,OAAO,EACP,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,OAAO,IAAI,IAAI,CACrB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CACpB,OAAsB,EACtB,KAA0C,EAC1C,QAAgC,EAChC,GAAa;IAEb,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QACvD,OAAO;IACT,CAAC;IACD,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,CAAC,KAAK,CAAC,EAAE;SACb,OAAO,CAAC,eAAe,KAAK,UAAU,QAAQ,YAAY,YAAY,GAAG,CAAC;SAC1E,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB;IACvC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,OAAO;QACf,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI;YAC5B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,cAAc,KAAK,IAAI;YAC7B,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAqB;IACzC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,QAAQ;QAChB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,cAAc,EAAE,GAAG,CAAC,eAAe;QACnC,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QACtD,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,KAA4B,EAC5B,KAAa;IAEb,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAyB,EAAE,KAAa;IACnE,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uCAAuC,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa;IACnE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}