videobook-engine 2.0.1 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/README.md +99 -68
  2. package/dist/artifacts.d.ts +4 -9
  3. package/dist/artifacts.d.ts.map +1 -1
  4. package/dist/artifacts.js +78 -138
  5. package/dist/artifacts.js.map +1 -1
  6. package/dist/books.d.ts +1 -1
  7. package/dist/books.d.ts.map +1 -1
  8. package/dist/books.js +18 -10
  9. package/dist/books.js.map +1 -1
  10. package/dist/cas.d.ts +27 -1
  11. package/dist/cas.d.ts.map +1 -1
  12. package/dist/cas.js +78 -6
  13. package/dist/cas.js.map +1 -1
  14. package/dist/catalog-metadata.d.ts +56 -0
  15. package/dist/catalog-metadata.d.ts.map +1 -0
  16. package/dist/catalog-metadata.js +42 -0
  17. package/dist/catalog-metadata.js.map +1 -0
  18. package/dist/communications.js +4 -2
  19. package/dist/communications.js.map +1 -1
  20. package/dist/context.d.ts +9 -6
  21. package/dist/context.d.ts.map +1 -1
  22. package/dist/context.js +42 -51
  23. package/dist/context.js.map +1 -1
  24. package/dist/domain.d.ts +39 -2
  25. package/dist/domain.d.ts.map +1 -1
  26. package/dist/domain.js +846 -64
  27. package/dist/domain.js.map +1 -1
  28. package/dist/edit-policy.d.ts +3 -0
  29. package/dist/edit-policy.d.ts.map +1 -0
  30. package/dist/edit-policy.js +6 -0
  31. package/dist/edit-policy.js.map +1 -0
  32. package/dist/edits.d.ts +10 -0
  33. package/dist/edits.d.ts.map +1 -0
  34. package/dist/edits.js +1392 -0
  35. package/dist/edits.js.map +1 -0
  36. package/dist/engine-types.d.ts +171 -86
  37. package/dist/engine-types.d.ts.map +1 -1
  38. package/dist/engine-types.js +32 -0
  39. package/dist/engine-types.js.map +1 -1
  40. package/dist/engine.d.ts +89 -26
  41. package/dist/engine.d.ts.map +1 -1
  42. package/dist/engine.js +27 -21
  43. package/dist/engine.js.map +1 -1
  44. package/dist/files.d.ts.map +1 -1
  45. package/dist/files.js +32 -28
  46. package/dist/files.js.map +1 -1
  47. package/dist/fork.d.ts +148 -0
  48. package/dist/fork.d.ts.map +1 -0
  49. package/dist/fork.js +602 -0
  50. package/dist/fork.js.map +1 -0
  51. package/dist/generations.d.ts +9 -0
  52. package/dist/generations.d.ts.map +1 -0
  53. package/dist/generations.js +175 -0
  54. package/dist/generations.js.map +1 -0
  55. package/dist/history.d.ts +2 -5
  56. package/dist/history.d.ts.map +1 -1
  57. package/dist/history.js +183 -640
  58. package/dist/history.js.map +1 -1
  59. package/dist/index.d.ts +21 -7
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +15 -5
  62. package/dist/index.js.map +1 -1
  63. package/dist/job-queue.d.ts +2 -0
  64. package/dist/job-queue.d.ts.map +1 -1
  65. package/dist/job-queue.js +29 -2
  66. package/dist/job-queue.js.map +1 -1
  67. package/dist/media.d.ts +3 -3
  68. package/dist/media.d.ts.map +1 -1
  69. package/dist/media.js +6 -5
  70. package/dist/media.js.map +1 -1
  71. package/dist/merge-policy.d.ts +83 -0
  72. package/dist/merge-policy.d.ts.map +1 -0
  73. package/dist/merge-policy.js +203 -0
  74. package/dist/merge-policy.js.map +1 -0
  75. package/dist/metadata.d.ts.map +1 -1
  76. package/dist/metadata.js +17 -23
  77. package/dist/metadata.js.map +1 -1
  78. package/dist/migration.d.ts +9 -0
  79. package/dist/migration.d.ts.map +1 -0
  80. package/dist/migration.js +564 -0
  81. package/dist/migration.js.map +1 -0
  82. package/dist/mvp-contract-fixtures.d.ts +244 -0
  83. package/dist/mvp-contract-fixtures.d.ts.map +1 -0
  84. package/dist/mvp-contract-fixtures.js +556 -0
  85. package/dist/mvp-contract-fixtures.js.map +1 -0
  86. package/dist/mvp-contracts.d.ts +761 -0
  87. package/dist/mvp-contracts.d.ts.map +1 -0
  88. package/dist/mvp-contracts.js +59 -0
  89. package/dist/mvp-contracts.js.map +1 -0
  90. package/dist/mvp-time.d.ts +54 -0
  91. package/dist/mvp-time.d.ts.map +1 -0
  92. package/dist/mvp-time.js +148 -0
  93. package/dist/mvp-time.js.map +1 -0
  94. package/dist/notebook/types.d.ts +85 -8
  95. package/dist/notebook/types.d.ts.map +1 -1
  96. package/dist/notebook-grid.d.ts +37 -0
  97. package/dist/notebook-grid.d.ts.map +1 -0
  98. package/dist/notebook-grid.js +160 -0
  99. package/dist/notebook-grid.js.map +1 -0
  100. package/dist/notebook-media-artifact.d.ts +23 -0
  101. package/dist/notebook-media-artifact.d.ts.map +1 -0
  102. package/dist/notebook-media-artifact.js +67 -0
  103. package/dist/notebook-media-artifact.js.map +1 -0
  104. package/dist/notebook-mentions.d.ts +20 -0
  105. package/dist/notebook-mentions.d.ts.map +1 -0
  106. package/dist/notebook-mentions.js +53 -0
  107. package/dist/notebook-mentions.js.map +1 -0
  108. package/dist/order-keys.d.ts +22 -0
  109. package/dist/order-keys.d.ts.map +1 -0
  110. package/dist/order-keys.js +262 -0
  111. package/dist/order-keys.js.map +1 -0
  112. package/dist/runtime-services.js +8 -11
  113. package/dist/runtime-services.js.map +1 -1
  114. package/dist/schema.d.ts +8 -5
  115. package/dist/schema.d.ts.map +1 -1
  116. package/dist/schema.js +624 -141
  117. package/dist/schema.js.map +1 -1
  118. package/dist/search-benchmark.d.ts +4 -0
  119. package/dist/search-benchmark.d.ts.map +1 -0
  120. package/dist/search-benchmark.js +144 -0
  121. package/dist/search-benchmark.js.map +1 -0
  122. package/dist/sequences.d.ts +20 -0
  123. package/dist/sequences.d.ts.map +1 -0
  124. package/dist/sequences.js +825 -0
  125. package/dist/sequences.js.map +1 -0
  126. package/dist/similarity.js +10 -10
  127. package/dist/similarity.js.map +1 -1
  128. package/dist/status.js +8 -10
  129. package/dist/status.js.map +1 -1
  130. package/dist/storage.d.ts +3 -1
  131. package/dist/storage.d.ts.map +1 -1
  132. package/dist/storage.js +388 -7
  133. package/dist/storage.js.map +1 -1
  134. package/dist/store.d.ts +64 -3
  135. package/dist/store.d.ts.map +1 -1
  136. package/dist/store.js +354 -68
  137. package/dist/store.js.map +1 -1
  138. package/dist/streams.d.ts +10 -0
  139. package/dist/streams.d.ts.map +1 -0
  140. package/dist/streams.js +183 -0
  141. package/dist/streams.js.map +1 -0
  142. package/dist/temporal-models.d.ts +48 -0
  143. package/dist/temporal-models.d.ts.map +1 -0
  144. package/dist/temporal-models.js +278 -0
  145. package/dist/temporal-models.js.map +1 -0
  146. package/dist/temporal-search.d.ts +29 -0
  147. package/dist/temporal-search.d.ts.map +1 -0
  148. package/dist/temporal-search.js +1551 -0
  149. package/dist/temporal-search.js.map +1 -0
  150. package/dist/transcripts.d.ts +16 -0
  151. package/dist/transcripts.d.ts.map +1 -0
  152. package/dist/transcripts.js +519 -0
  153. package/dist/transcripts.js.map +1 -0
  154. package/docs/engine-layout.md +345 -110
  155. package/docs/mvp-prd.md +918 -0
  156. package/fixtures/media/vancat.mp4 +0 -0
  157. package/fixtures/media/vancat_profile.jpg +0 -0
  158. package/fixtures/v5/contract-fixtures.json +1532 -0
  159. package/package.json +42 -5
  160. package/dist/history-types.d.ts +0 -74
  161. package/dist/history-types.d.ts.map +0 -1
  162. package/dist/history-types.js +0 -2
  163. package/dist/history-types.js.map +0 -1
  164. package/dist/resolver.d.ts +0 -15
  165. package/dist/resolver.d.ts.map +0 -1
  166. package/dist/resolver.js +0 -81
  167. package/dist/resolver.js.map +0 -1
  168. package/dist/timeline.d.ts +0 -9
  169. package/dist/timeline.d.ts.map +0 -1
  170. package/dist/timeline.js +0 -236
  171. package/dist/timeline.js.map +0 -1
@@ -0,0 +1,183 @@
1
+ import { ok } from "./engine-types.js";
2
+ import { resultOf, syncResultOf, } from "./context.js";
3
+ import { assertUuidV7, newUuidV7 } from "./ids.js";
4
+ import { normalizeRational } from "./mvp-time.js";
5
+ import { canonicalJson, parseJson } from "./store.js";
6
+ import { EngineFault } from "./store.js";
7
+ export function createStreamsApi(context) {
8
+ return {
9
+ register: (input) => registerStream(context, input),
10
+ get: (streamId) => syncResultOf(() => requiredStream(context, streamId)),
11
+ getAtRevision: (streamId, revision) => syncResultOf(() => requiredStream(context, streamId, revision)),
12
+ list: (artifact) => syncResultOf(() => listStreams(context, artifact)),
13
+ };
14
+ }
15
+ async function registerStream(context, input) {
16
+ return resultOf(async () => {
17
+ const artifact = context.artifactRow(input.artifactId);
18
+ const streamId = input.streamId ?? newUuidV7();
19
+ assertUuidV7(streamId, "Stream ID");
20
+ const sourcePath = requiredText(input.sourcePath, "Stream source path");
21
+ const objectHash = requiredText(input.objectHash, "Stream object hash");
22
+ const timeBase = normalizeRational(input.timeBase);
23
+ safeIntegerAtLeast(input.streamIndex, 0, "Stream index");
24
+ safeIntegerAtLeast(input.durationTicks, 1, "Stream duration");
25
+ const codec = requiredText(input.codec, "Stream codec");
26
+ validateProfile(input);
27
+ const file = context.store.db
28
+ .prepare(`SELECT object_hash FROM artifact_files
29
+ WHERE artifact_id=? AND path=?`)
30
+ .get(artifact.artifact_id, sourcePath);
31
+ if (!file) {
32
+ throw new EngineFault({
33
+ code: "NOT_FOUND",
34
+ message: `Artifact source file not found: ${artifact.artifact_id}/${sourcePath}`,
35
+ });
36
+ }
37
+ if (file.object_hash !== objectHash) {
38
+ throw new EngineFault({
39
+ code: "OBJECT_UNAVAILABLE",
40
+ message: "Stream object hash does not match the artifact file",
41
+ details: {
42
+ artifactId: artifact.artifact_id,
43
+ sourcePath,
44
+ expectedObjectHash: file.object_hash,
45
+ objectHash,
46
+ },
47
+ });
48
+ }
49
+ const existing = findStreamBySource(context, artifact.artifact_id, sourcePath, objectHash, input.streamIndex);
50
+ if (existing)
51
+ return existing;
52
+ const profile = {
53
+ ...(input.video ? { video: input.video } : {}),
54
+ ...(input.audio ? { audio: input.audio } : {}),
55
+ };
56
+ const mutation = await context.store.semantic({
57
+ operation: "register_artifact_stream",
58
+ tables: ["artifact_streams"],
59
+ artifactId: artifact.artifact_id,
60
+ details: {
61
+ streamId,
62
+ sourcePath,
63
+ objectHash,
64
+ streamIndex: input.streamIndex,
65
+ kind: input.kind,
66
+ },
67
+ writeSet: [
68
+ `artifact:${artifact.artifact_id}`,
69
+ `stream:${streamId}`,
70
+ `object:${objectHash}`,
71
+ ],
72
+ }, (_operationId, now) => {
73
+ context.store.db
74
+ .prepare(`INSERT INTO artifact_streams(
75
+ stream_id, artifact_id, source_path, object_hash,
76
+ stream_index, kind, time_base_numerator,
77
+ time_base_denominator, duration_ticks, codec,
78
+ profile_json, created_at
79
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
80
+ .run(streamId, artifact.artifact_id, sourcePath, objectHash, input.streamIndex, input.kind, timeBase.numerator, timeBase.denominator, input.durationTicks, codec, canonicalJson(profile), now);
81
+ });
82
+ return ok(requiredStream(context, streamId), mutation.revision);
83
+ });
84
+ }
85
+ function requiredStream(context, streamId, revision) {
86
+ assertUuidV7(streamId, "Stream ID");
87
+ const source = revision
88
+ ? "dolt_at_artifact_streams(?)"
89
+ : "artifact_streams";
90
+ const row = context.store.db
91
+ .prepare(`${STREAM_SELECT} FROM ${source} WHERE stream_id=?`)
92
+ .get(...(revision ? [revision, streamId] : [streamId]));
93
+ if (!row) {
94
+ throw new EngineFault({
95
+ code: "NOT_FOUND",
96
+ message: revision
97
+ ? `Stream not found at revision: ${streamId}`
98
+ : `Stream not found: ${streamId}`,
99
+ });
100
+ }
101
+ return streamFromRow(row);
102
+ }
103
+ function listStreams(context, artifact) {
104
+ const artifactId = artifact
105
+ ? context.artifactRow(artifact).artifact_id
106
+ : undefined;
107
+ const rows = artifactId
108
+ ? context.store.db
109
+ .prepare(`${STREAM_SELECT} FROM artifact_streams
110
+ WHERE artifact_id=?
111
+ ORDER BY source_path, stream_index, stream_id`)
112
+ .all(artifactId)
113
+ : context.store.db
114
+ .prepare(`${STREAM_SELECT} FROM artifact_streams
115
+ ORDER BY artifact_id, source_path, stream_index, stream_id`)
116
+ .all();
117
+ return rows.map(streamFromRow);
118
+ }
119
+ function findStreamBySource(context, artifactId, sourcePath, objectHash, streamIndex) {
120
+ const row = context.store.db
121
+ .prepare(`${STREAM_SELECT} FROM artifact_streams
122
+ WHERE artifact_id=? AND source_path=? AND object_hash=? AND stream_index=?`)
123
+ .get(artifactId, sourcePath, objectHash, streamIndex);
124
+ return row ? streamFromRow(row) : null;
125
+ }
126
+ function streamFromRow(row) {
127
+ const profile = parseJson(row.profile_json, {});
128
+ return {
129
+ streamId: row.stream_id,
130
+ artifactId: row.artifact_id,
131
+ sourcePath: row.source_path,
132
+ objectHash: row.object_hash,
133
+ streamIndex: row.stream_index,
134
+ kind: row.kind,
135
+ timeBase: {
136
+ numerator: row.time_base_numerator,
137
+ denominator: row.time_base_denominator,
138
+ },
139
+ durationTicks: row.duration_ticks,
140
+ codec: row.codec,
141
+ ...(profile.video ? { video: profile.video } : {}),
142
+ ...(profile.audio ? { audio: profile.audio } : {}),
143
+ };
144
+ }
145
+ function validateProfile(input) {
146
+ if (input.kind === "video") {
147
+ if (!input.video || input.audio) {
148
+ throw new Error("Video streams require only a video profile");
149
+ }
150
+ safeIntegerAtLeast(input.video.width, 1, "Video width");
151
+ safeIntegerAtLeast(input.video.height, 1, "Video height");
152
+ normalizeRational(input.video.pixelAspect);
153
+ if (input.video.nominalFrameRate) {
154
+ normalizeRational(input.video.nominalFrameRate);
155
+ }
156
+ if (input.video.averageFrameRate) {
157
+ normalizeRational(input.video.averageFrameRate);
158
+ }
159
+ return;
160
+ }
161
+ if (!input.audio || input.video) {
162
+ throw new Error("Audio streams require only an audio profile");
163
+ }
164
+ safeIntegerAtLeast(input.audio.sampleRateHz, 1, "Audio sample rate");
165
+ safeIntegerAtLeast(input.audio.channels, 1, "Audio channels");
166
+ requiredText(input.audio.channelLayout, "Audio channel layout");
167
+ }
168
+ function requiredText(value, label) {
169
+ const normalized = value.trim();
170
+ if (!normalized)
171
+ throw new Error(`${label} is required`);
172
+ return normalized;
173
+ }
174
+ function safeIntegerAtLeast(value, minimum, label) {
175
+ if (!Number.isSafeInteger(value) || value < minimum) {
176
+ throw new Error(`${label} must be a safe integer of at least ${minimum}`);
177
+ }
178
+ }
179
+ const STREAM_SELECT = `
180
+ SELECT stream_id, artifact_id, source_path, object_hash,
181
+ stream_index, kind, time_base_numerator, time_base_denominator,
182
+ duration_ticks, codec, profile_json`;
183
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { IndexManifest, TemporalSearchProvider } from "./mvp-contracts.js";
2
+ export declare const LOCAL_CLIP_MODEL_ID = "Xenova/clip-vit-base-patch32";
3
+ export declare const LOCAL_CLIP_MODEL_REVISION = "d15189d7028b43f1d3e65039190477f6af591c2a";
4
+ export declare const LOCAL_CLIP_MANIFEST: IndexManifest;
5
+ export declare const LOCAL_CLAP_MODEL_ID = "Xenova/clap-htsat-unfused";
6
+ export declare const LOCAL_CLAP_MODEL_REVISION = "c28f2883575e590e04d3146ff0713c2448d691ba";
7
+ export declare const LOCAL_CLAP_MANIFEST: IndexManifest;
8
+ export interface LocalClipTemporalProviderOptions {
9
+ modelCacheDir: string;
10
+ allowModelDownload?: boolean;
11
+ }
12
+ export interface LocalClapTemporalProviderOptions {
13
+ modelCacheDir: string;
14
+ ffmpegPath?: string;
15
+ allowModelDownload?: boolean;
16
+ }
17
+ export declare class LocalClipTemporalProvider implements TemporalSearchProvider {
18
+ private readonly options;
19
+ readonly manifestId: string;
20
+ readonly embeddingSpace: string;
21
+ readonly dimensions: number;
22
+ private imagePipeline;
23
+ private tokenizer;
24
+ private textModel;
25
+ constructor(options: LocalClipTemporalProviderOptions);
26
+ prepare(): Promise<void>;
27
+ embedText(text: string): Promise<Float32Array>;
28
+ embedImage(sourcePath: string): Promise<Float32Array>;
29
+ private loadImagePipeline;
30
+ private loadTextModel;
31
+ }
32
+ export declare class LocalClapTemporalProvider implements TemporalSearchProvider {
33
+ private readonly options;
34
+ readonly manifestId: string;
35
+ readonly embeddingSpace: string;
36
+ readonly dimensions: number;
37
+ private processor;
38
+ private audioModel;
39
+ private tokenizer;
40
+ private textModel;
41
+ constructor(options: LocalClapTemporalProviderOptions);
42
+ prepare(): Promise<void>;
43
+ embedText(text: string): Promise<Float32Array>;
44
+ embedAudio(sourcePath: string, startSeconds?: number, durationSeconds?: number): Promise<Float32Array>;
45
+ private loadAudioModel;
46
+ private loadTextModel;
47
+ }
48
+ //# sourceMappingURL=temporal-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-models.d.ts","sourceRoot":"","sources":["../src/temporal-models.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAG5B,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,eAAO,MAAM,yBAAyB,6CACM,CAAC;AAC7C,eAAO,MAAM,mBAAmB,EAAE,aAcjC,CAAC;AAEF,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,yBAAyB,6CACM,CAAC;AAC7C,eAAO,MAAM,mBAAmB,EAAE,aAcjC,CAAC;AAEF,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA0CD,qBAAa,yBAA0B,YAAW,sBAAsB;IAQ1D,OAAO,CAAC,QAAQ,CAAC,OAAO;IAPpC,QAAQ,CAAC,UAAU,SAAkC;IACrD,QAAQ,CAAC,cAAc,SAAsC;IAC7D,QAAQ,CAAC,UAAU,SAAkC;IACrD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,SAAS,CAA8B;gBAElB,OAAO,EAAE,gCAAgC;IAEhE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkB9C,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAgB7C,iBAAiB;YAoBjB,aAAa;CA2B5B;AAED,qBAAa,yBAA0B,YAAW,sBAAsB;IAS1D,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,QAAQ,CAAC,UAAU,SAAkC;IACrD,QAAQ,CAAC,cAAc,SAAsC;IAC7D,QAAQ,CAAC,UAAU,SAAkC;IACrD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,SAAS,CAA8B;gBAElB,OAAO,EAAE,gCAAgC;IAEhE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAa9C,UAAU,CACd,UAAU,EAAE,MAAM,EAClB,YAAY,SAAI,EAChB,eAAe,SAAK,GACnB,OAAO,CAAC,YAAY,CAAC;YAgBV,cAAc;YAgCd,aAAa;CA+B5B"}
@@ -0,0 +1,278 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir } from "node:fs/promises";
3
+ import { AutoProcessor, AutoTokenizer, ClapAudioModelWithProjection, ClapTextModelWithProjection, CLIPTextModelWithProjection, pipeline, RawImage, } from "@huggingface/transformers";
4
+ import sharp from "sharp";
5
+ import { EngineFault } from "./store.js";
6
+ export const LOCAL_CLIP_MODEL_ID = "Xenova/clip-vit-base-patch32";
7
+ export const LOCAL_CLIP_MODEL_REVISION = "d15189d7028b43f1d3e65039190477f6af591c2a";
8
+ export const LOCAL_CLIP_MANIFEST = {
9
+ manifestId: "videobook-clip-vit-b32-q8-v1",
10
+ provider: "huggingface-transformers",
11
+ modelId: LOCAL_CLIP_MODEL_ID,
12
+ modelRevision: LOCAL_CLIP_MODEL_REVISION,
13
+ license: "MIT",
14
+ embeddingSpace: "clip-vit-b32-q8-d15189d7028b43f1d3e65039190477f6af591c2a-v1",
15
+ dimensions: 512,
16
+ modalities: ["visual"],
17
+ supportedLanguages: ["en"],
18
+ preprocessingVersion: "clip-224-rgb-v1",
19
+ extractorVersion: "transformers-js-4.2.0",
20
+ createdAt: 1,
21
+ };
22
+ export const LOCAL_CLAP_MODEL_ID = "Xenova/clap-htsat-unfused";
23
+ export const LOCAL_CLAP_MODEL_REVISION = "c28f2883575e590e04d3146ff0713c2448d691ba";
24
+ export const LOCAL_CLAP_MANIFEST = {
25
+ manifestId: "videobook-clap-htsat-q8-v1",
26
+ provider: "huggingface-transformers",
27
+ modelId: LOCAL_CLAP_MODEL_ID,
28
+ modelRevision: LOCAL_CLAP_MODEL_REVISION,
29
+ license: "Apache-2.0",
30
+ embeddingSpace: "clap-htsat-q8-c28f2883575e590e04d3146ff0713c2448d691ba-v1",
31
+ dimensions: 512,
32
+ modalities: ["audio"],
33
+ supportedLanguages: ["en"],
34
+ preprocessingVersion: "clap-mono-48khz-10s-v1",
35
+ extractorVersion: "transformers-js-4.2.0",
36
+ createdAt: 1,
37
+ };
38
+ export class LocalClipTemporalProvider {
39
+ options;
40
+ manifestId = LOCAL_CLIP_MANIFEST.manifestId;
41
+ embeddingSpace = LOCAL_CLIP_MANIFEST.embeddingSpace;
42
+ dimensions = LOCAL_CLIP_MANIFEST.dimensions;
43
+ imagePipeline = null;
44
+ tokenizer = null;
45
+ textModel = null;
46
+ constructor(options) {
47
+ this.options = options;
48
+ }
49
+ async prepare() {
50
+ await Promise.all([this.loadImagePipeline(), this.loadTextModel()]);
51
+ }
52
+ async embedText(text) {
53
+ const { tokenizer, model } = await this.loadTextModel();
54
+ const output = await model(tokenizer([text], {
55
+ padding: true,
56
+ truncation: true,
57
+ }));
58
+ if (output.text_embeds.dims.length !== 2
59
+ || output.text_embeds.dims[0] !== 1
60
+ || output.text_embeds.dims[1] !== this.dimensions) {
61
+ throw new Error(`Unexpected CLIP text embedding shape: ${output.text_embeds.dims.join("x")}`);
62
+ }
63
+ return normalized(output.text_embeds.data.slice());
64
+ }
65
+ async embedImage(sourcePath) {
66
+ const embedder = await this.loadImagePipeline();
67
+ const image = await readNormalizedImage(sourcePath);
68
+ const output = await embedder(image);
69
+ if (output.dims.length !== 2
70
+ || output.dims[0] !== 1
71
+ || output.dims[1] !== this.dimensions) {
72
+ throw new Error(`Unexpected CLIP image embedding shape: ${output.dims.join("x")}`);
73
+ }
74
+ return normalized(output.data.slice());
75
+ }
76
+ async loadImagePipeline() {
77
+ if (this.imagePipeline)
78
+ return this.imagePipeline;
79
+ await mkdir(this.options.modelCacheDir, { recursive: true });
80
+ try {
81
+ this.imagePipeline = await pipeline("image-feature-extraction", LOCAL_CLIP_MODEL_ID, {
82
+ dtype: "q8",
83
+ cache_dir: this.options.modelCacheDir,
84
+ local_files_only: this.options.allowModelDownload === false,
85
+ revision: LOCAL_CLIP_MODEL_REVISION,
86
+ });
87
+ return this.imagePipeline;
88
+ }
89
+ catch (error) {
90
+ throw modelFault(error, this.options.allowModelDownload);
91
+ }
92
+ }
93
+ async loadTextModel() {
94
+ if (this.tokenizer && this.textModel) {
95
+ return { tokenizer: this.tokenizer, model: this.textModel };
96
+ }
97
+ await mkdir(this.options.modelCacheDir, { recursive: true });
98
+ try {
99
+ const options = {
100
+ cache_dir: this.options.modelCacheDir,
101
+ local_files_only: this.options.allowModelDownload === false,
102
+ revision: LOCAL_CLIP_MODEL_REVISION,
103
+ };
104
+ this.tokenizer = await AutoTokenizer.from_pretrained(LOCAL_CLIP_MODEL_ID, options);
105
+ this.textModel = await CLIPTextModelWithProjection.from_pretrained(LOCAL_CLIP_MODEL_ID, { ...options, dtype: "q8" });
106
+ return { tokenizer: this.tokenizer, model: this.textModel };
107
+ }
108
+ catch (error) {
109
+ throw modelFault(error, this.options.allowModelDownload);
110
+ }
111
+ }
112
+ }
113
+ export class LocalClapTemporalProvider {
114
+ options;
115
+ manifestId = LOCAL_CLAP_MANIFEST.manifestId;
116
+ embeddingSpace = LOCAL_CLAP_MANIFEST.embeddingSpace;
117
+ dimensions = LOCAL_CLAP_MANIFEST.dimensions;
118
+ processor = null;
119
+ audioModel = null;
120
+ tokenizer = null;
121
+ textModel = null;
122
+ constructor(options) {
123
+ this.options = options;
124
+ }
125
+ async prepare() {
126
+ await Promise.all([this.loadAudioModel(), this.loadTextModel()]);
127
+ }
128
+ async embedText(text) {
129
+ const { tokenizer, model } = await this.loadTextModel();
130
+ const output = await model(tokenizer([text], {
131
+ padding: true,
132
+ truncation: true,
133
+ }));
134
+ return checkedEmbedding(output.text_embeds, this.dimensions, "CLAP text");
135
+ }
136
+ async embedAudio(sourcePath, startSeconds = 0, durationSeconds = 10) {
137
+ const { processor, model } = await this.loadAudioModel();
138
+ const decoded = await decodeAudio(this.options.ffmpegPath ?? "ffmpeg", sourcePath, startSeconds, durationSeconds);
139
+ const output = await model(await processor(decoded));
140
+ return checkedEmbedding(output.audio_embeds, this.dimensions, "CLAP audio");
141
+ }
142
+ async loadAudioModel() {
143
+ if (this.processor && this.audioModel) {
144
+ return { processor: this.processor, model: this.audioModel };
145
+ }
146
+ await mkdir(this.options.modelCacheDir, { recursive: true });
147
+ try {
148
+ const options = modelOptions(this.options.modelCacheDir, this.options.allowModelDownload, LOCAL_CLAP_MODEL_REVISION);
149
+ this.processor = await AutoProcessor.from_pretrained(LOCAL_CLAP_MODEL_ID, options);
150
+ this.audioModel = await ClapAudioModelWithProjection.from_pretrained(LOCAL_CLAP_MODEL_ID, { ...options, dtype: "q8" });
151
+ return { processor: this.processor, model: this.audioModel };
152
+ }
153
+ catch (error) {
154
+ throw localModelFault("CLAP audio", error, this.options.allowModelDownload);
155
+ }
156
+ }
157
+ async loadTextModel() {
158
+ if (this.tokenizer && this.textModel) {
159
+ return { tokenizer: this.tokenizer, model: this.textModel };
160
+ }
161
+ await mkdir(this.options.modelCacheDir, { recursive: true });
162
+ try {
163
+ const options = modelOptions(this.options.modelCacheDir, this.options.allowModelDownload, LOCAL_CLAP_MODEL_REVISION);
164
+ this.tokenizer = await AutoTokenizer.from_pretrained(LOCAL_CLAP_MODEL_ID, options);
165
+ this.textModel = await ClapTextModelWithProjection.from_pretrained(LOCAL_CLAP_MODEL_ID, { ...options, dtype: "q8" });
166
+ return { tokenizer: this.tokenizer, model: this.textModel };
167
+ }
168
+ catch (error) {
169
+ throw localModelFault("CLAP text", error, this.options.allowModelDownload);
170
+ }
171
+ }
172
+ }
173
+ async function readNormalizedImage(sourcePath) {
174
+ const decoded = await sharp(sourcePath, { animated: false })
175
+ .rotate()
176
+ .toColourspace("srgb")
177
+ .removeAlpha()
178
+ .raw()
179
+ .toBuffer({ resolveWithObject: true });
180
+ if (decoded.info.width <= 0
181
+ || decoded.info.height <= 0
182
+ || decoded.info.channels !== 3) {
183
+ throw new Error(`Unable to normalize image for CLIP: ${sourcePath}`);
184
+ }
185
+ return new RawImage(decoded.data, decoded.info.width, decoded.info.height, 3);
186
+ }
187
+ function normalized(vector) {
188
+ const magnitude = Math.sqrt(vector.reduce((sum, value) => sum + value * value, 0));
189
+ if (!Number.isFinite(magnitude) || magnitude <= 0) {
190
+ throw new Error("CLIP returned a zero or invalid embedding");
191
+ }
192
+ return Float32Array.from(vector, (value) => value / magnitude);
193
+ }
194
+ function checkedEmbedding(output, dimensions, label) {
195
+ if (output.dims.length !== 2
196
+ || output.dims[0] !== 1
197
+ || output.dims[1] !== dimensions) {
198
+ throw new Error(`Unexpected ${label} embedding shape: ${output.dims.join("x")}`);
199
+ }
200
+ return normalized(output.data.slice());
201
+ }
202
+ function modelOptions(cacheDir, allowModelDownload, revision) {
203
+ return {
204
+ cache_dir: cacheDir,
205
+ local_files_only: allowModelDownload === false,
206
+ revision,
207
+ };
208
+ }
209
+ function decodeAudio(ffmpegPath, sourcePath, startSeconds, durationSeconds) {
210
+ if (!Number.isFinite(startSeconds)
211
+ || startSeconds < 0
212
+ || !Number.isFinite(durationSeconds)
213
+ || durationSeconds <= 0) {
214
+ throw new Error("CLAP audio range must have a non-negative start and positive duration");
215
+ }
216
+ return new Promise((resolve, reject) => {
217
+ const child = spawn(ffmpegPath, [
218
+ "-hide_banner",
219
+ "-loglevel",
220
+ "error",
221
+ "-nostdin",
222
+ "-ss",
223
+ String(startSeconds),
224
+ "-i",
225
+ sourcePath,
226
+ "-map",
227
+ "0:a:0",
228
+ "-vn",
229
+ "-ac",
230
+ "1",
231
+ "-ar",
232
+ "48000",
233
+ "-t",
234
+ String(Math.min(durationSeconds, 10)),
235
+ "-f",
236
+ "f32le",
237
+ "-acodec",
238
+ "pcm_f32le",
239
+ "pipe:1",
240
+ ], { stdio: ["ignore", "pipe", "pipe"] });
241
+ const stdout = [];
242
+ const stderr = [];
243
+ child.stdout.on("data", (chunk) => stdout.push(chunk));
244
+ child.stderr.on("data", (chunk) => stderr.push(chunk));
245
+ child.once("error", (error) => reject(localModelFault("CLAP audio decoder", error, true)));
246
+ child.once("close", (code) => {
247
+ if (code !== 0) {
248
+ reject(new EngineFault({
249
+ code: "INVALID_INPUT",
250
+ message: `Unable to decode audio for CLAP: ${Buffer.concat(stderr).toString("utf8").trim()}`,
251
+ }));
252
+ return;
253
+ }
254
+ const buffer = Buffer.concat(stdout);
255
+ if (buffer.byteLength === 0
256
+ || buffer.byteLength % Float32Array.BYTES_PER_ELEMENT !== 0) {
257
+ reject(new Error("CLAP audio decoder returned invalid PCM"));
258
+ return;
259
+ }
260
+ const bytes = new Uint8Array(buffer.byteLength);
261
+ bytes.set(buffer);
262
+ resolve(new Float32Array(bytes.buffer));
263
+ });
264
+ });
265
+ }
266
+ function modelFault(error, allowModelDownload) {
267
+ return new EngineFault({
268
+ code: allowModelDownload === false ? "OFFLINE" : "FEATURE_UNAVAILABLE",
269
+ message: `Unable to load the pinned local CLIP model: ${error instanceof Error ? error.message : String(error)}`,
270
+ });
271
+ }
272
+ function localModelFault(label, error, allowModelDownload) {
273
+ return new EngineFault({
274
+ code: allowModelDownload === false ? "OFFLINE" : "FEATURE_UNAVAILABLE",
275
+ message: `Unable to load the pinned local ${label} model: ${error instanceof Error ? error.message : String(error)}`,
276
+ });
277
+ }
278
+ //# sourceMappingURL=temporal-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-models.js","sourceRoot":"","sources":["../src/temporal-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { EngineError, Result } from "./engine-types.js";
2
+ import type { CommitTemporalIndexBatchInput, IndexBatchResult, IndexManifest, PreparedSearchOptions, PreparedSearchReference, SearchCoverage, SearchPage, SearchQuery, TemporalIndexPlan, TemporalSearchProvider, TemporalSearchStats } from "./mvp-contracts.js";
3
+ import { EngineContext } from "./context.js";
4
+ export declare function createTemporalSearchApi(context: EngineContext): {
5
+ providers: {
6
+ register: (provider: TemporalSearchProvider) => void;
7
+ list: () => string[];
8
+ };
9
+ manifests: {
10
+ register: (manifest: IndexManifest) => Result<IndexManifest, EngineError>;
11
+ list: () => IndexManifest[];
12
+ get: (manifestId: string) => Result<IndexManifest, EngineError>;
13
+ };
14
+ plan: (artifact: string, objectHash: string, manifestId: string, generation: string) => Result<TemporalIndexPlan, EngineError>;
15
+ commitBatch: (input: CommitTemporalIndexBatchInput) => Result<IndexBatchResult, EngineError>;
16
+ activate: (manifestId: string, generation: string) => Result<{
17
+ manifestId: string;
18
+ generation: string;
19
+ }, EngineError>;
20
+ coverage: (artifact?: string) => Result<SearchCoverage, EngineError>;
21
+ query: (query: SearchQuery) => Promise<Result<SearchPage, EngineError>>;
22
+ queryPrepared: (query: SearchQuery, reference: PreparedSearchReference, options?: PreparedSearchOptions) => Promise<Result<SearchPage, EngineError>>;
23
+ invalidate: (artifact: string, objectHash?: string) => Result<number, EngineError>;
24
+ cleanup: () => Result<{
25
+ removedSegments: number;
26
+ }, EngineError>;
27
+ stats: () => TemporalSearchStats;
28
+ };
29
+ //# sourceMappingURL=temporal-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-search.d.ts","sourceRoot":"","sources":["../src/temporal-search.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAEhB,aAAa,EAGb,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EAGd,UAAU,EACV,WAAW,EAIX,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,aAAa,EAA0B,MAAM,cAAc,CAAC;AA2HrE,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,aAAa;;6BAInC,sBAAsB,KAAG,IAAI;oBAIxC,MAAM,EAAE;;;6BAGG,aAAa,KAAG,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;oBAE7D,aAAa,EAAE;0BACP,MAAM,KAAG,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC;;qBAInD,MAAM,cACJ,MAAM,cACN,MAAM,cACN,MAAM,KACjB,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC;yBAKhC,6BAA6B,KACnC,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC;2BAG1B,MAAM,cACN,MAAM,KACjB,MAAM,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,WAAW,CAAC;0BAE5C,MAAM,KAAG,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC;mBAGzD,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;2BAGlC,WAAW,aACP,uBAAuB,YACzB,qBAAqB,KAC7B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;2BAG/B,MAAM,eACH,MAAM,KAClB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;mBAEjB,MAAM,CAAC;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,EAAE,WAAW,CAAC;iBAElD,mBAAmB;EAEjC"}