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.
Files changed (148) hide show
  1. package/README.md +87 -41
  2. package/dist/artifact-names.d.ts +6 -0
  3. package/dist/artifact-names.d.ts.map +1 -0
  4. package/dist/artifact-names.js +56 -0
  5. package/dist/artifact-names.js.map +1 -0
  6. package/dist/artifacts.d.ts.map +1 -1
  7. package/dist/artifacts.js +57 -23
  8. package/dist/artifacts.js.map +1 -1
  9. package/dist/books.js +2 -1
  10. package/dist/books.js.map +1 -1
  11. package/dist/cas.d.ts +27 -1
  12. package/dist/cas.d.ts.map +1 -1
  13. package/dist/cas.js +78 -6
  14. package/dist/cas.js.map +1 -1
  15. package/dist/catalog-metadata.d.ts +56 -0
  16. package/dist/catalog-metadata.d.ts.map +1 -0
  17. package/dist/catalog-metadata.js +42 -0
  18. package/dist/catalog-metadata.js.map +1 -0
  19. package/dist/communications.js +4 -2
  20. package/dist/communications.js.map +1 -1
  21. package/dist/context.d.ts +6 -1
  22. package/dist/context.d.ts.map +1 -1
  23. package/dist/context.js +35 -6
  24. package/dist/context.js.map +1 -1
  25. package/dist/domain.d.ts +4 -0
  26. package/dist/domain.d.ts.map +1 -1
  27. package/dist/domain.js +870 -58
  28. package/dist/domain.js.map +1 -1
  29. package/dist/edit-policy.d.ts +3 -0
  30. package/dist/edit-policy.d.ts.map +1 -0
  31. package/dist/edit-policy.js +6 -0
  32. package/dist/edit-policy.js.map +1 -0
  33. package/dist/edits.d.ts +10 -0
  34. package/dist/edits.d.ts.map +1 -0
  35. package/dist/edits.js +1392 -0
  36. package/dist/edits.js.map +1 -0
  37. package/dist/engine-types.d.ts +110 -60
  38. package/dist/engine-types.d.ts.map +1 -1
  39. package/dist/engine-types.js +33 -0
  40. package/dist/engine-types.js.map +1 -1
  41. package/dist/engine.d.ts +69 -8
  42. package/dist/engine.d.ts.map +1 -1
  43. package/dist/engine.js +24 -18
  44. package/dist/engine.js.map +1 -1
  45. package/dist/files.d.ts.map +1 -1
  46. package/dist/files.js +31 -27
  47. package/dist/files.js.map +1 -1
  48. package/dist/fork.d.ts +147 -0
  49. package/dist/fork.d.ts.map +1 -0
  50. package/dist/fork.js +609 -0
  51. package/dist/fork.js.map +1 -0
  52. package/dist/history.d.ts +0 -4
  53. package/dist/history.d.ts.map +1 -1
  54. package/dist/history.js +166 -595
  55. package/dist/history.js.map +1 -1
  56. package/dist/index.d.ts +16 -4
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +12 -2
  59. package/dist/index.js.map +1 -1
  60. package/dist/job-queue.d.ts +2 -0
  61. package/dist/job-queue.d.ts.map +1 -1
  62. package/dist/job-queue.js +29 -2
  63. package/dist/job-queue.js.map +1 -1
  64. package/dist/media.d.ts.map +1 -1
  65. package/dist/media.js +1 -0
  66. package/dist/media.js.map +1 -1
  67. package/dist/merge-policy.d.ts +99 -0
  68. package/dist/merge-policy.d.ts.map +1 -0
  69. package/dist/merge-policy.js +310 -0
  70. package/dist/merge-policy.js.map +1 -0
  71. package/dist/metadata.d.ts.map +1 -1
  72. package/dist/metadata.js +15 -20
  73. package/dist/metadata.js.map +1 -1
  74. package/dist/migration.d.ts +9 -0
  75. package/dist/migration.d.ts.map +1 -0
  76. package/dist/migration.js +534 -0
  77. package/dist/migration.js.map +1 -0
  78. package/dist/mvp-contract-fixtures.d.ts +244 -0
  79. package/dist/mvp-contract-fixtures.d.ts.map +1 -0
  80. package/dist/mvp-contract-fixtures.js +556 -0
  81. package/dist/mvp-contract-fixtures.js.map +1 -0
  82. package/dist/mvp-contracts.d.ts +761 -0
  83. package/dist/mvp-contracts.d.ts.map +1 -0
  84. package/dist/mvp-contracts.js +59 -0
  85. package/dist/mvp-contracts.js.map +1 -0
  86. package/dist/mvp-time.d.ts +54 -0
  87. package/dist/mvp-time.d.ts.map +1 -0
  88. package/dist/mvp-time.js +148 -0
  89. package/dist/mvp-time.js.map +1 -0
  90. package/dist/notebook/types.d.ts +113 -8
  91. package/dist/notebook/types.d.ts.map +1 -1
  92. package/dist/order-keys.d.ts +22 -0
  93. package/dist/order-keys.d.ts.map +1 -0
  94. package/dist/order-keys.js +262 -0
  95. package/dist/order-keys.js.map +1 -0
  96. package/dist/runtime-services.js +4 -2
  97. package/dist/runtime-services.js.map +1 -1
  98. package/dist/schema.d.ts +24 -5
  99. package/dist/schema.d.ts.map +1 -1
  100. package/dist/schema.js +644 -132
  101. package/dist/schema.js.map +1 -1
  102. package/dist/search-benchmark.d.ts +4 -0
  103. package/dist/search-benchmark.d.ts.map +1 -0
  104. package/dist/search-benchmark.js +144 -0
  105. package/dist/search-benchmark.js.map +1 -0
  106. package/dist/sequences.d.ts +20 -0
  107. package/dist/sequences.d.ts.map +1 -0
  108. package/dist/sequences.js +825 -0
  109. package/dist/sequences.js.map +1 -0
  110. package/dist/similarity.js +1 -1
  111. package/dist/storage.d.ts +3 -1
  112. package/dist/storage.d.ts.map +1 -1
  113. package/dist/storage.js +388 -7
  114. package/dist/storage.js.map +1 -1
  115. package/dist/store.d.ts +63 -2
  116. package/dist/store.d.ts.map +1 -1
  117. package/dist/store.js +351 -65
  118. package/dist/store.js.map +1 -1
  119. package/dist/streams.d.ts +10 -0
  120. package/dist/streams.d.ts.map +1 -0
  121. package/dist/streams.js +183 -0
  122. package/dist/streams.js.map +1 -0
  123. package/dist/temporal-models.d.ts +48 -0
  124. package/dist/temporal-models.d.ts.map +1 -0
  125. package/dist/temporal-models.js +278 -0
  126. package/dist/temporal-models.js.map +1 -0
  127. package/dist/temporal-search.d.ts +29 -0
  128. package/dist/temporal-search.d.ts.map +1 -0
  129. package/dist/temporal-search.js +1507 -0
  130. package/dist/temporal-search.js.map +1 -0
  131. package/dist/transcripts.d.ts +16 -0
  132. package/dist/transcripts.d.ts.map +1 -0
  133. package/dist/transcripts.js +519 -0
  134. package/dist/transcripts.js.map +1 -0
  135. package/docs/engine-layout.md +346 -106
  136. package/docs/mvp-prd.md +918 -0
  137. package/fixtures/media/vancat.mp4 +0 -0
  138. package/fixtures/media/vancat_profile.jpg +0 -0
  139. package/fixtures/v5/contract-fixtures.json +1532 -0
  140. package/package.json +30 -5
  141. package/dist/history-types.d.ts +0 -74
  142. package/dist/history-types.d.ts.map +0 -1
  143. package/dist/history-types.js +0 -2
  144. package/dist/history-types.js.map +0 -1
  145. package/dist/timeline.d.ts +0 -9
  146. package/dist/timeline.d.ts.map +0 -1
  147. package/dist/timeline.js +0 -236
  148. package/dist/timeline.js.map +0 -1
package/package.json CHANGED
@@ -1,26 +1,43 @@
1
1
  {
2
2
  "name": "videobook-engine",
3
- "version": "2.0.1",
3
+ "version": "4.2.0",
4
4
  "description": "Dolt-native local-first storage engine for Videobook",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
8
  "import": "./dist/index.js",
9
9
  "types": "./dist/index.d.ts"
10
- }
10
+ },
11
+ "./artifact-names": {
12
+ "import": "./dist/artifact-names.js",
13
+ "types": "./dist/artifact-names.d.ts"
14
+ },
15
+ "./catalog-metadata": {
16
+ "import": "./dist/catalog-metadata.js",
17
+ "types": "./dist/catalog-metadata.d.ts"
18
+ },
19
+ "./edit-policy": {
20
+ "import": "./dist/edit-policy.js",
21
+ "types": "./dist/edit-policy.d.ts"
22
+ },
23
+ "./package.json": "./package.json",
24
+ "./fixtures/v5": "./fixtures/v5/contract-fixtures.json"
11
25
  },
12
26
  "main": "./dist/index.js",
13
27
  "types": "./dist/index.d.ts",
14
28
  "files": [
15
29
  "dist",
16
- "docs"
30
+ "docs",
31
+ "fixtures"
17
32
  ],
18
33
  "scripts": {
34
+ "benchmark:api": "tsx benchmarks/run-api-benchmark.ts",
35
+ "benchmark:api:smoke": "tsx benchmarks/run-api-benchmark.ts --quick",
19
36
  "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
20
37
  "build": "npm run clean && tsc",
21
38
  "prepare": "npm run build",
22
39
  "prepack": "npm run build",
23
- "typecheck": "tsc --noEmit",
40
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.benchmarks.json",
24
41
  "lint": "knip",
25
42
  "test": "vitest run",
26
43
  "test:watch": "vitest",
@@ -49,7 +66,15 @@
49
66
  "overrides": {
50
67
  "adm-zip": "0.6.0",
51
68
  "esbuild": "0.28.1",
52
- "postcss": "^8.5.10",
69
+ "postcss": "^8.5.23",
53
70
  "sharp": "0.35.3"
71
+ },
72
+ "allowScripts": {
73
+ "@dolthub/doltlite@0.11.37": true,
74
+ "esbuild@0.28.1": true,
75
+ "fsevents@2.3.3": true,
76
+ "onnxruntime-node@1.24.3": true,
77
+ "protobufjs@7.6.5": true,
78
+ "usearch@2.26.0": true
54
79
  }
55
80
  }
@@ -1,74 +0,0 @@
1
- import type { Revision, RevisionFileChange } from "./engine-types.js";
2
- import type { ArtifactKind } from "./engine-types.js";
3
- export type HistoryActionPhase = "requested" | "started" | "completed" | "failed" | "cancelled" | "conflicted";
4
- export type HistoryActionScope = "book" | "artifact" | "layout" | "external" | "system";
5
- export type HistoryArtifactKind = ArtifactKind | "unknown";
6
- export interface HistoryLayout {
7
- stage: number;
8
- column: number;
9
- }
10
- export interface HistoryActionEvent {
11
- id: string;
12
- revision: string;
13
- phase: HistoryActionPhase;
14
- date: string;
15
- details: Record<string, unknown>;
16
- files: string[];
17
- fileChanges: RevisionFileChange[];
18
- }
19
- export interface HistoryArtifactRef {
20
- id: string;
21
- slug: string;
22
- kind: HistoryArtifactKind;
23
- }
24
- export interface HistoryAction {
25
- id: string;
26
- operation: string;
27
- title: string;
28
- scope: HistoryActionScope;
29
- actor: string;
30
- lane: string;
31
- date: string;
32
- phase: HistoryActionPhase;
33
- baseRevision?: string;
34
- rebasedOver?: string;
35
- parentActionIds: string[];
36
- inputArtifacts: HistoryArtifactRef[];
37
- outputArtifacts: HistoryArtifactRef[];
38
- targetArtifactId?: string;
39
- targetActionId?: string;
40
- layout?: HistoryLayout;
41
- details: Record<string, unknown>;
42
- events: HistoryActionEvent[];
43
- }
44
- export interface HistoryActionPage {
45
- headRevision: string;
46
- actions: HistoryAction[];
47
- nextCursor?: string;
48
- }
49
- export interface GetHistoryActionsOptions {
50
- limit?: number;
51
- cursor?: string;
52
- }
53
- export interface RecordActionInput {
54
- actionId?: string;
55
- operation: string;
56
- phase?: HistoryActionPhase;
57
- scope?: HistoryActionScope;
58
- actor?: string;
59
- lane?: string;
60
- baseRevision?: string;
61
- parentActionIds?: string[];
62
- inputArtifactIds?: string[];
63
- outputArtifactIds?: string[];
64
- targetArtifactId?: string;
65
- targetActionId?: string;
66
- layout?: HistoryLayout;
67
- writeSet?: string[];
68
- details?: Record<string, unknown>;
69
- }
70
- export interface HistoryActionRevision {
71
- action: HistoryAction;
72
- revision: Revision;
73
- }
74
- //# sourceMappingURL=history-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-types.d.ts","sourceRoot":"","sources":["../src/history-types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=history-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-types.js","sourceRoot":"","sources":["../src/history-types.ts"],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}
package/dist/timeline.js DELETED
@@ -1,236 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}