@vivantel/virage-core 0.2.19 → 0.2.22

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 (59) hide show
  1. package/dist/config-loader.d.ts.map +1 -1
  2. package/dist/config-loader.js +1 -0
  3. package/dist/config-loader.js.map +1 -1
  4. package/dist/core/embedder.d.ts +4 -4
  5. package/dist/core/embedder.d.ts.map +1 -1
  6. package/dist/core/embedder.js.map +1 -1
  7. package/dist/core/orchestrator.d.ts +2 -0
  8. package/dist/core/orchestrator.d.ts.map +1 -1
  9. package/dist/core/orchestrator.js +5 -7
  10. package/dist/core/orchestrator.js.map +1 -1
  11. package/dist/core/telemetry.d.ts +4 -3
  12. package/dist/core/telemetry.d.ts.map +1 -1
  13. package/dist/core/telemetry.js +3 -6
  14. package/dist/core/telemetry.js.map +1 -1
  15. package/dist/core/uploader.d.ts +6 -6
  16. package/dist/core/uploader.d.ts.map +1 -1
  17. package/dist/core/uploader.js.map +1 -1
  18. package/dist/core/{embeddings-db.d.ts → virage-db.d.ts} +34 -2
  19. package/dist/core/virage-db.d.ts.map +1 -0
  20. package/dist/core/virage-db.js +722 -0
  21. package/dist/core/virage-db.js.map +1 -0
  22. package/dist/core/virage-defaults.d.ts +1 -1
  23. package/dist/core/virage-defaults.d.ts.map +1 -1
  24. package/dist/core/virage-defaults.js +2 -2
  25. package/dist/core/virage-defaults.js.map +1 -1
  26. package/dist/eval/experiment-store.d.ts +4 -3
  27. package/dist/eval/experiment-store.d.ts.map +1 -1
  28. package/dist/eval/experiment-store.js +14 -54
  29. package/dist/eval/experiment-store.js.map +1 -1
  30. package/dist/index.d.ts +5 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -2
  33. package/dist/index.js.map +1 -1
  34. package/dist/interfaces/embedder.d.ts +1 -1
  35. package/dist/interfaces/embedder.d.ts.map +1 -1
  36. package/dist/telemetry/flusher.d.ts +58 -0
  37. package/dist/telemetry/flusher.d.ts.map +1 -0
  38. package/dist/telemetry/flusher.js +173 -0
  39. package/dist/telemetry/flusher.js.map +1 -0
  40. package/dist/telemetry/index.d.ts +7 -0
  41. package/dist/telemetry/index.d.ts.map +1 -0
  42. package/dist/telemetry/index.js +5 -0
  43. package/dist/telemetry/index.js.map +1 -0
  44. package/dist/telemetry/manager.d.ts +13 -0
  45. package/dist/telemetry/manager.d.ts.map +1 -0
  46. package/dist/telemetry/manager.js +36 -0
  47. package/dist/telemetry/manager.js.map +1 -0
  48. package/dist/telemetry/session.d.ts +30 -0
  49. package/dist/telemetry/session.d.ts.map +1 -0
  50. package/dist/telemetry/session.js +158 -0
  51. package/dist/telemetry/session.js.map +1 -0
  52. package/dist/telemetry/types.d.ts +97 -0
  53. package/dist/telemetry/types.d.ts.map +1 -0
  54. package/dist/telemetry/types.js +46 -0
  55. package/dist/telemetry/types.js.map +1 -0
  56. package/package.json +6 -5
  57. package/dist/core/embeddings-db.d.ts.map +0 -1
  58. package/dist/core/embeddings-db.js +0 -327
  59. package/dist/core/embeddings-db.js.map +0 -1
@@ -1,327 +0,0 @@
1
- import { createHash } from "crypto";
2
- import { existsSync, mkdirSync, readFileSync } from "fs";
3
- import { dirname } from "path";
4
- import { rename } from "fs/promises";
5
- import Database from "better-sqlite3";
6
- function computeContentHash(content) {
7
- return createHash("sha256").update(content).digest("hex").slice(0, 16);
8
- }
9
- function chunkContentHash(chunk) {
10
- return chunk.contentHash ?? computeContentHash(chunk.content);
11
- }
12
- function embeddingToBlob(embedding) {
13
- return Buffer.from(new Float32Array(embedding).buffer);
14
- }
15
- function blobToEmbedding(blob) {
16
- return Array.from(new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4));
17
- }
18
- function parseMetadata(json) {
19
- try {
20
- return JSON.parse(json);
21
- }
22
- catch {
23
- return {};
24
- }
25
- }
26
- const META_DDL = `
27
- CREATE TABLE IF NOT EXISTS meta (
28
- key TEXT PRIMARY KEY,
29
- value TEXT NOT NULL
30
- );
31
- `;
32
- // embedding: raw IEEE-754 float32 little-endian bytes (~4× smaller than JSON).
33
- // NULL until embedded; cleared after upload to reclaim storage.
34
- const CHUNKS_DDL = `
35
- CREATE TABLE IF NOT EXISTS chunks (
36
- content_hash TEXT PRIMARY KEY,
37
- source_file TEXT NOT NULL,
38
- commit_hash TEXT NOT NULL,
39
- content TEXT NOT NULL,
40
- metadata_json TEXT NOT NULL,
41
- embedding BLOB,
42
- embedded_at INTEGER,
43
- uploaded INTEGER NOT NULL DEFAULT 0
44
- ) STRICT;
45
- CREATE INDEX IF NOT EXISTS idx_source_file ON chunks(source_file);
46
- `;
47
- export class EmbeddingsDb {
48
- db;
49
- constructor(dbPath) {
50
- mkdirSync(dirname(dbPath), { recursive: true });
51
- this.db = new Database(dbPath);
52
- this.db.pragma("journal_mode = WAL");
53
- this.db.exec(META_DDL);
54
- const hasOldTable = this.db
55
- .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='embeddings'")
56
- .get();
57
- if (hasOldTable) {
58
- this.migrateFromEmbeddingsTable();
59
- }
60
- this.db.exec(CHUNKS_DDL);
61
- const jsonPath = dbPath.replace(/\.db$/, ".json");
62
- if (this.isEmpty() && existsSync(jsonPath)) {
63
- this.migrateFromJson(jsonPath);
64
- }
65
- }
66
- isEmpty() {
67
- const row = this.db.prepare("SELECT COUNT(*) as cnt FROM chunks").get();
68
- return row.cnt === 0;
69
- }
70
- migrateFromEmbeddingsTable() {
71
- const rows = this.db.prepare("SELECT * FROM embeddings").all();
72
- const migrate = this.db.transaction(() => {
73
- this.db
74
- .prepare(`
75
- CREATE TABLE IF NOT EXISTS chunks (
76
- content_hash TEXT PRIMARY KEY,
77
- source_file TEXT NOT NULL,
78
- commit_hash TEXT NOT NULL,
79
- content TEXT NOT NULL,
80
- metadata_json TEXT NOT NULL,
81
- embedding BLOB,
82
- embedded_at INTEGER,
83
- uploaded INTEGER NOT NULL DEFAULT 0
84
- ) STRICT
85
- `)
86
- .run();
87
- const stmt = this.db.prepare(`
88
- INSERT OR IGNORE INTO chunks
89
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
90
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
91
- `);
92
- for (const row of rows) {
93
- let blob = null;
94
- if (row.embedding_json) {
95
- try {
96
- blob = embeddingToBlob(JSON.parse(row.embedding_json));
97
- }
98
- catch {
99
- /* skip rows with invalid embedding JSON */
100
- }
101
- }
102
- stmt.run(row.content_hash, row.source_file, row.commit_hash, row.content, row.metadata_json, blob, row.embedded_at != null ? Math.floor(row.embedded_at) : null, row.uploaded);
103
- }
104
- this.db.prepare("DROP TABLE embeddings").run();
105
- this.db.prepare("DROP INDEX IF EXISTS idx_source_file").run();
106
- });
107
- migrate();
108
- }
109
- getMeta() {
110
- const row = this.db
111
- .prepare("SELECT value FROM meta WHERE key = 'meta'")
112
- .get();
113
- if (!row)
114
- return null;
115
- try {
116
- return JSON.parse(row.value);
117
- }
118
- catch {
119
- return null;
120
- }
121
- }
122
- setMeta(meta) {
123
- this.db
124
- .prepare("INSERT OR REPLACE INTO meta (key, value) VALUES ('meta', ?)")
125
- .run(JSON.stringify(meta));
126
- }
127
- // ── Streaming pipeline methods ─────────────────────────────────────────────
128
- /** Insert chunk metadata only (no embedding yet). Safe to call inside a transaction. */
129
- insertChunk(chunk) {
130
- this.db
131
- .prepare(`INSERT OR IGNORE INTO chunks
132
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
133
- VALUES (?, ?, ?, ?, ?, NULL, NULL, 0)`)
134
- .run(chunkContentHash(chunk), chunk.sourceFile, chunk.commitHash, chunk.content, JSON.stringify(chunk.metadata));
135
- }
136
- /** Batch-insert chunk metadata in a single transaction. */
137
- insertChunks(chunks) {
138
- const stmt = this.db.prepare(`INSERT OR IGNORE INTO chunks
139
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
140
- VALUES (?, ?, ?, ?, ?, NULL, NULL, 0)`);
141
- const insertAll = this.db.transaction((items) => {
142
- for (const chunk of items) {
143
- stmt.run(chunkContentHash(chunk), chunk.sourceFile, chunk.commitHash, chunk.content, JSON.stringify(chunk.metadata));
144
- }
145
- });
146
- insertAll(chunks);
147
- }
148
- /** Store the embedding for a previously inserted chunk. */
149
- updateEmbedding(contentHash, embedding, embeddedAt) {
150
- this.db
151
- .prepare("UPDATE chunks SET embedding = ?, embedded_at = ? WHERE content_hash = ?")
152
- .run(embeddingToBlob(embedding), Math.floor(embeddedAt), contentHash);
153
- }
154
- /** Clear embedding data after upload to reclaim storage. */
155
- clearEmbedding(contentHash) {
156
- this.db
157
- .prepare("UPDATE chunks SET embedding = NULL, embedded_at = NULL WHERE content_hash = ?")
158
- .run(contentHash);
159
- }
160
- /** Delete all chunks for a source file (called before re-chunking a changed file). */
161
- deleteBySourceFile(sourceFile) {
162
- this.db.prepare("DELETE FROM chunks WHERE source_file = ?").run(sourceFile);
163
- }
164
- /**
165
- * Atomically replace all chunks for a source file with a new set.
166
- * The delete and insert run in a single SQLite transaction.
167
- */
168
- replaceChunks(sourceFile, chunks) {
169
- const del = this.db.prepare("DELETE FROM chunks WHERE source_file = ?");
170
- const ins = this.db.prepare(`INSERT OR IGNORE INTO chunks
171
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
172
- VALUES (?, ?, ?, ?, ?, NULL, NULL, 0)`);
173
- const txn = this.db.transaction(() => {
174
- del.run(sourceFile);
175
- for (const chunk of chunks) {
176
- ins.run(chunkContentHash(chunk), chunk.sourceFile, chunk.commitHash, chunk.content, JSON.stringify(chunk.metadata));
177
- }
178
- });
179
- txn();
180
- }
181
- /** Chunks inserted during chunking that still need an embedding computed. */
182
- getPendingEmbedChunks() {
183
- const rows = this.db
184
- .prepare("SELECT content_hash, source_file, commit_hash, content, metadata_json FROM chunks WHERE embedding IS NULL AND uploaded = 0")
185
- .all();
186
- return rows.map((row) => ({
187
- contentHash: row.content_hash,
188
- sourceFile: row.source_file,
189
- commitHash: row.commit_hash,
190
- content: row.content,
191
- metadata: parseMetadata(row.metadata_json),
192
- }));
193
- }
194
- /** Embedded chunks that have not yet been uploaded to the vector store. */
195
- getPendingUploadChunks() {
196
- return this.rowsToEmbeddedChunks("SELECT * FROM chunks WHERE uploaded = 0 AND embedding IS NOT NULL");
197
- }
198
- /** Returns all chunk rows as Chunk objects, regardless of embedding or upload status. */
199
- getAllChunks() {
200
- const rows = this.db
201
- .prepare("SELECT content_hash, source_file, commit_hash, content, metadata_json FROM chunks")
202
- .all();
203
- return rows.map((row) => ({
204
- contentHash: row.content_hash,
205
- sourceFile: row.source_file,
206
- commitHash: row.commit_hash,
207
- content: row.content,
208
- metadata: parseMetadata(row.metadata_json),
209
- }));
210
- }
211
- /** Returns a file → commitHash map for all files tracked in the DB. */
212
- getFileStates() {
213
- const rows = this.db
214
- .prepare("SELECT source_file, commit_hash FROM chunks GROUP BY source_file")
215
- .all();
216
- return new Map(rows.map((r) => [r.source_file, r.commit_hash]));
217
- }
218
- // ── Preserved methods ──────────────────────────────────────────────────────
219
- /** Insert fully-embedded chunks (used by migration and legacy callers). */
220
- insert(chunks) {
221
- const stmt = this.db.prepare(`
222
- INSERT OR IGNORE INTO chunks
223
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
224
- VALUES (?, ?, ?, ?, ?, ?, ?, 0)
225
- `);
226
- const insertMany = this.db.transaction((items) => {
227
- for (const chunk of items) {
228
- stmt.run(chunkContentHash(chunk), chunk.sourceFile, chunk.commitHash, chunk.content, JSON.stringify(chunk.metadata), embeddingToBlob(chunk.embedding), Math.floor(chunk.embeddedAt));
229
- }
230
- });
231
- insertMany(chunks);
232
- }
233
- has(contentHash) {
234
- const row = this.db
235
- .prepare("SELECT 1 FROM chunks WHERE content_hash = ?")
236
- .get(contentHash);
237
- return row !== undefined;
238
- }
239
- /** Returns all rows that have an embedding (excludes metadata-only rows). */
240
- getAll() {
241
- return this.rowsToEmbeddedChunks("SELECT * FROM chunks WHERE embedding IS NOT NULL");
242
- }
243
- /** Alias for getPendingUploadChunks() — keeps Uploader compatible. */
244
- getPending() {
245
- return this.getPendingUploadChunks();
246
- }
247
- markUploaded(contentHashes) {
248
- if (contentHashes.length === 0)
249
- return;
250
- const placeholders = contentHashes.map(() => "?").join(", ");
251
- this.db
252
- .prepare(`UPDATE chunks SET uploaded = 1 WHERE content_hash IN (${placeholders})`)
253
- .run(...contentHashes);
254
- }
255
- /** Count of embedded chunks not yet uploaded. */
256
- pendingCount() {
257
- const row = this.db
258
- .prepare("SELECT COUNT(*) as cnt FROM chunks WHERE uploaded = 0 AND embedding IS NOT NULL")
259
- .get();
260
- return row.cnt;
261
- }
262
- clearAll() {
263
- this.db.prepare("DELETE FROM chunks").run();
264
- this.db.prepare("DELETE FROM meta").run();
265
- }
266
- pruneUploaded() {
267
- this.db.prepare("DELETE FROM chunks WHERE uploaded = 1").run();
268
- }
269
- migrateFromJson(jsonPath) {
270
- let raw;
271
- try {
272
- raw = readFileSync(jsonPath, "utf-8");
273
- }
274
- catch {
275
- return;
276
- }
277
- let parsed;
278
- try {
279
- parsed = JSON.parse(raw);
280
- }
281
- catch {
282
- return;
283
- }
284
- let chunks;
285
- let meta = null;
286
- if (Array.isArray(parsed)) {
287
- chunks = parsed;
288
- }
289
- else {
290
- const file = parsed;
291
- chunks = file.chunks ?? [];
292
- meta = file._meta ?? null;
293
- }
294
- if (meta)
295
- this.setMeta(meta);
296
- if (chunks.length > 0) {
297
- const stmt = this.db.prepare(`
298
- INSERT OR IGNORE INTO chunks
299
- (content_hash, source_file, commit_hash, content, metadata_json, embedding, embedded_at, uploaded)
300
- VALUES (?, ?, ?, ?, ?, ?, ?, 1)
301
- `);
302
- const insertAll = this.db.transaction((items) => {
303
- for (const chunk of items) {
304
- stmt.run(chunkContentHash(chunk), chunk.sourceFile, chunk.commitHash, chunk.content, JSON.stringify(chunk.metadata), embeddingToBlob(chunk.embedding), Math.floor(chunk.embeddedAt));
305
- }
306
- });
307
- insertAll(chunks);
308
- }
309
- rename(jsonPath, jsonPath + ".migrated").catch(() => { });
310
- }
311
- close() {
312
- this.db.close();
313
- }
314
- rowsToEmbeddedChunks(sql) {
315
- const rows = this.db.prepare(sql).all();
316
- return rows.map((row) => ({
317
- contentHash: row.content_hash,
318
- sourceFile: row.source_file,
319
- commitHash: row.commit_hash,
320
- content: row.content,
321
- metadata: parseMetadata(row.metadata_json),
322
- embedding: blobToEmbedding(row.embedding),
323
- embeddedAt: row.embedded_at,
324
- }));
325
- }
326
- }
327
- //# sourceMappingURL=embeddings-db.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"embeddings-db.js","sourceRoot":"","sources":["../../src/core/embeddings-db.ts"],"names":[],"mappings":"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"}