@claritylabs/cl-sdk 0.17.1 → 0.18.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.
- package/README.md +30 -6
- package/dist/index.d.mts +3543 -282
- package/dist/index.d.ts +3543 -282
- package/dist/index.js +2898 -659
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2836 -659
- package/dist/index.mjs.map +1 -1
- package/dist/storage-sqlite.d.mts +430 -1
- package/dist/storage-sqlite.d.ts +430 -1
- package/dist/storage-sqlite.js +346 -8
- package/dist/storage-sqlite.js.map +1 -1
- package/dist/storage-sqlite.mjs +343 -8
- package/dist/storage-sqlite.mjs.map +1 -1
- package/package.json +2 -2
package/dist/storage-sqlite.mjs
CHANGED
|
@@ -35,10 +35,43 @@ CREATE TABLE IF NOT EXISTS conversation_turns (
|
|
|
35
35
|
embedding BLOB
|
|
36
36
|
);
|
|
37
37
|
|
|
38
|
+
CREATE TABLE IF NOT EXISTS source_spans (
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
document_id TEXT NOT NULL,
|
|
41
|
+
source_kind TEXT,
|
|
42
|
+
chunk_id TEXT,
|
|
43
|
+
kind TEXT NOT NULL,
|
|
44
|
+
text TEXT NOT NULL,
|
|
45
|
+
hash TEXT NOT NULL,
|
|
46
|
+
text_hash TEXT,
|
|
47
|
+
page_start INTEGER,
|
|
48
|
+
page_end INTEGER,
|
|
49
|
+
section_id TEXT,
|
|
50
|
+
form_number TEXT,
|
|
51
|
+
location TEXT,
|
|
52
|
+
bbox TEXT,
|
|
53
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
54
|
+
embedding BLOB
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
CREATE TABLE IF NOT EXISTS source_chunks (
|
|
58
|
+
id TEXT PRIMARY KEY,
|
|
59
|
+
document_id TEXT NOT NULL,
|
|
60
|
+
source_span_ids TEXT NOT NULL,
|
|
61
|
+
text TEXT NOT NULL,
|
|
62
|
+
text_hash TEXT NOT NULL,
|
|
63
|
+
page_start INTEGER,
|
|
64
|
+
page_end INTEGER,
|
|
65
|
+
metadata TEXT NOT NULL DEFAULT '{}'
|
|
66
|
+
);
|
|
67
|
+
|
|
38
68
|
CREATE INDEX IF NOT EXISTS idx_chunks_document_id ON chunks(document_id);
|
|
39
69
|
CREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks(type);
|
|
40
70
|
CREATE INDEX IF NOT EXISTS idx_turns_conversation_id ON conversation_turns(conversation_id);
|
|
41
71
|
CREATE INDEX IF NOT EXISTS idx_turns_timestamp ON conversation_turns(timestamp);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_source_spans_document_id ON source_spans(document_id);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_source_spans_chunk_id ON source_spans(chunk_id);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_source_chunks_document_id ON source_chunks(document_id);
|
|
42
75
|
`;
|
|
43
76
|
|
|
44
77
|
// src/storage/sqlite/document-store.ts
|
|
@@ -87,6 +120,28 @@ function createSqliteDocumentStore(db) {
|
|
|
87
120
|
};
|
|
88
121
|
}
|
|
89
122
|
|
|
123
|
+
// src/core/concurrency.ts
|
|
124
|
+
function pLimit(concurrency) {
|
|
125
|
+
let active = 0;
|
|
126
|
+
const queue = [];
|
|
127
|
+
function next() {
|
|
128
|
+
if (queue.length > 0 && active < concurrency) {
|
|
129
|
+
active++;
|
|
130
|
+
queue.shift()();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return (fn) => new Promise((resolve, reject) => {
|
|
134
|
+
const run = () => {
|
|
135
|
+
fn().then(resolve, reject).finally(() => {
|
|
136
|
+
active--;
|
|
137
|
+
next();
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
queue.push(run);
|
|
141
|
+
next();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
90
145
|
// src/storage/sqlite/memory-store.ts
|
|
91
146
|
function cosineSimilarity(a, b) {
|
|
92
147
|
let dot = 0, magA = 0, magB = 0;
|
|
@@ -98,6 +153,7 @@ function cosineSimilarity(a, b) {
|
|
|
98
153
|
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
99
154
|
}
|
|
100
155
|
function createSqliteMemoryStore(db, embed) {
|
|
156
|
+
const limit = pLimit(4);
|
|
101
157
|
return {
|
|
102
158
|
async addChunks(chunks) {
|
|
103
159
|
const stmt = db.prepare("INSERT OR REPLACE INTO chunks (id, document_id, type, text, metadata, embedding) VALUES (?, ?, ?, ?, ?, ?)");
|
|
@@ -107,14 +163,16 @@ function createSqliteMemoryStore(db, embed) {
|
|
|
107
163
|
}
|
|
108
164
|
});
|
|
109
165
|
insertMany(chunks);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
166
|
+
await Promise.all(chunks.map(
|
|
167
|
+
(chunk) => limit(async () => {
|
|
168
|
+
try {
|
|
169
|
+
const embedding = await embed(chunk.text);
|
|
170
|
+
const buf = Buffer.from(new Float64Array(embedding).buffer);
|
|
171
|
+
db.prepare("UPDATE chunks SET embedding = ? WHERE id = ?").run(buf, chunk.id);
|
|
172
|
+
} catch {
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
));
|
|
118
176
|
},
|
|
119
177
|
async search(query, options) {
|
|
120
178
|
const queryEmbedding = await embed(query);
|
|
@@ -199,6 +257,279 @@ function createSqliteMemoryStore(db, embed) {
|
|
|
199
257
|
};
|
|
200
258
|
}
|
|
201
259
|
|
|
260
|
+
// src/source/schemas.ts
|
|
261
|
+
import { z } from "zod";
|
|
262
|
+
var SourceSpanKindSchema = z.enum([
|
|
263
|
+
"pdf_text",
|
|
264
|
+
"pdf_image",
|
|
265
|
+
"html",
|
|
266
|
+
"markdown",
|
|
267
|
+
"plain_text",
|
|
268
|
+
"structured_field"
|
|
269
|
+
]);
|
|
270
|
+
var SourceKindSchema = z.enum([
|
|
271
|
+
"policy_pdf",
|
|
272
|
+
"application_pdf",
|
|
273
|
+
"email",
|
|
274
|
+
"attachment",
|
|
275
|
+
"manual_note"
|
|
276
|
+
]);
|
|
277
|
+
var SourceSpanBBoxSchema = z.object({
|
|
278
|
+
page: z.number().int().positive(),
|
|
279
|
+
x: z.number(),
|
|
280
|
+
y: z.number(),
|
|
281
|
+
width: z.number(),
|
|
282
|
+
height: z.number()
|
|
283
|
+
});
|
|
284
|
+
var SourceSpanLocationSchema = z.object({
|
|
285
|
+
page: z.number().int().positive().optional(),
|
|
286
|
+
startPage: z.number().int().positive().optional(),
|
|
287
|
+
endPage: z.number().int().positive().optional(),
|
|
288
|
+
charStart: z.number().int().nonnegative().optional(),
|
|
289
|
+
charEnd: z.number().int().nonnegative().optional(),
|
|
290
|
+
lineStart: z.number().int().positive().optional(),
|
|
291
|
+
lineEnd: z.number().int().positive().optional(),
|
|
292
|
+
fieldPath: z.string().optional()
|
|
293
|
+
});
|
|
294
|
+
var SourceSpanSchema = z.object({
|
|
295
|
+
id: z.string().min(1),
|
|
296
|
+
documentId: z.string().min(1),
|
|
297
|
+
sourceKind: SourceKindSchema.optional(),
|
|
298
|
+
chunkId: z.string().optional(),
|
|
299
|
+
kind: SourceSpanKindSchema,
|
|
300
|
+
text: z.string(),
|
|
301
|
+
hash: z.string().min(1),
|
|
302
|
+
textHash: z.string().optional(),
|
|
303
|
+
pageStart: z.number().int().positive().optional(),
|
|
304
|
+
pageEnd: z.number().int().positive().optional(),
|
|
305
|
+
sectionId: z.string().optional(),
|
|
306
|
+
formNumber: z.string().optional(),
|
|
307
|
+
bbox: z.array(SourceSpanBBoxSchema).optional(),
|
|
308
|
+
location: SourceSpanLocationSchema.optional(),
|
|
309
|
+
metadata: z.record(z.string()).optional()
|
|
310
|
+
});
|
|
311
|
+
var SourceSpanRefSchema = z.object({
|
|
312
|
+
sourceSpanId: z.string().min(1),
|
|
313
|
+
documentId: z.string().min(1).optional(),
|
|
314
|
+
chunkId: z.string().optional(),
|
|
315
|
+
quote: z.string().optional(),
|
|
316
|
+
hash: z.string().optional(),
|
|
317
|
+
location: SourceSpanLocationSchema.optional()
|
|
318
|
+
});
|
|
319
|
+
var SourceChunkSchema = z.object({
|
|
320
|
+
id: z.string().min(1),
|
|
321
|
+
documentId: z.string().min(1),
|
|
322
|
+
sourceSpanIds: z.array(z.string().min(1)),
|
|
323
|
+
text: z.string(),
|
|
324
|
+
textHash: z.string().min(1),
|
|
325
|
+
pageStart: z.number().int().positive().optional(),
|
|
326
|
+
pageEnd: z.number().int().positive().optional(),
|
|
327
|
+
metadata: z.record(z.string()).default({})
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
// src/source/retrieval.ts
|
|
331
|
+
function evidenceTieBreakId(evidence) {
|
|
332
|
+
return [
|
|
333
|
+
evidence.source ?? "",
|
|
334
|
+
evidence.sourceSpanId ?? "",
|
|
335
|
+
evidence.chunkId ?? "",
|
|
336
|
+
evidence.documentId ?? "",
|
|
337
|
+
evidence.turnId ?? "",
|
|
338
|
+
evidence.attachmentId ?? "",
|
|
339
|
+
evidence.text
|
|
340
|
+
].join("|");
|
|
341
|
+
}
|
|
342
|
+
function compareSourceEvidence(a, b) {
|
|
343
|
+
const relevanceDelta = b.relevance - a.relevance;
|
|
344
|
+
if (relevanceDelta !== 0) return relevanceDelta;
|
|
345
|
+
return evidenceTieBreakId(a).localeCompare(evidenceTieBreakId(b));
|
|
346
|
+
}
|
|
347
|
+
function orderSourceEvidence(evidence) {
|
|
348
|
+
return [...evidence].sort(compareSourceEvidence);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// src/storage/sqlite/source-store.ts
|
|
352
|
+
function cosineSimilarity2(a, b) {
|
|
353
|
+
let dot = 0, magA = 0, magB = 0;
|
|
354
|
+
for (let i = 0; i < a.length; i++) {
|
|
355
|
+
dot += a[i] * b[i];
|
|
356
|
+
magA += a[i] * a[i];
|
|
357
|
+
magB += b[i] * b[i];
|
|
358
|
+
}
|
|
359
|
+
const denominator = Math.sqrt(magA) * Math.sqrt(magB);
|
|
360
|
+
return denominator === 0 ? 0 : dot / denominator;
|
|
361
|
+
}
|
|
362
|
+
function embeddingToBuffer(embedding) {
|
|
363
|
+
return Buffer.from(new Float64Array(embedding).buffer);
|
|
364
|
+
}
|
|
365
|
+
function bufferToEmbedding(buffer) {
|
|
366
|
+
return Array.from(new Float64Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 8));
|
|
367
|
+
}
|
|
368
|
+
function parseJson(value, fallback) {
|
|
369
|
+
if (!value) return fallback;
|
|
370
|
+
try {
|
|
371
|
+
return JSON.parse(value);
|
|
372
|
+
} catch {
|
|
373
|
+
return fallback;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function rowToSourceSpan(row) {
|
|
377
|
+
const metadata = parseJson(row.metadata, {});
|
|
378
|
+
return {
|
|
379
|
+
id: row.id,
|
|
380
|
+
documentId: row.document_id,
|
|
381
|
+
sourceKind: row.source_kind ?? void 0,
|
|
382
|
+
chunkId: row.chunk_id ?? void 0,
|
|
383
|
+
kind: row.kind,
|
|
384
|
+
text: row.text,
|
|
385
|
+
hash: row.hash,
|
|
386
|
+
textHash: row.text_hash ?? void 0,
|
|
387
|
+
pageStart: row.page_start ?? void 0,
|
|
388
|
+
pageEnd: row.page_end ?? void 0,
|
|
389
|
+
sectionId: row.section_id ?? void 0,
|
|
390
|
+
formNumber: row.form_number ?? void 0,
|
|
391
|
+
location: parseJson(row.location, void 0),
|
|
392
|
+
bbox: parseJson(row.bbox, void 0),
|
|
393
|
+
metadata: Object.keys(metadata).length ? metadata : void 0
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function rowToSourceChunk(row) {
|
|
397
|
+
return {
|
|
398
|
+
id: row.id,
|
|
399
|
+
documentId: row.document_id,
|
|
400
|
+
sourceSpanIds: parseJson(row.source_span_ids, []),
|
|
401
|
+
text: row.text,
|
|
402
|
+
textHash: row.text_hash,
|
|
403
|
+
pageStart: row.page_start,
|
|
404
|
+
pageEnd: row.page_end,
|
|
405
|
+
metadata: parseJson(row.metadata, {})
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
function createSqliteSourceStore(db, embed) {
|
|
409
|
+
const limit = pLimit(4);
|
|
410
|
+
return {
|
|
411
|
+
async addSourceSpans(spans) {
|
|
412
|
+
const stmt = db.prepare(`
|
|
413
|
+
INSERT OR REPLACE INTO source_spans (
|
|
414
|
+
id, document_id, source_kind, chunk_id, kind, text, hash, text_hash,
|
|
415
|
+
page_start, page_end, section_id, form_number, location, bbox, metadata, embedding
|
|
416
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
417
|
+
`);
|
|
418
|
+
const insertMany = db.transaction((items) => {
|
|
419
|
+
for (const span of items) {
|
|
420
|
+
stmt.run(
|
|
421
|
+
span.id,
|
|
422
|
+
span.documentId,
|
|
423
|
+
span.sourceKind ?? null,
|
|
424
|
+
span.chunkId ?? null,
|
|
425
|
+
span.kind,
|
|
426
|
+
span.text,
|
|
427
|
+
span.hash,
|
|
428
|
+
span.textHash ?? null,
|
|
429
|
+
span.pageStart ?? null,
|
|
430
|
+
span.pageEnd ?? null,
|
|
431
|
+
span.sectionId ?? null,
|
|
432
|
+
span.formNumber ?? null,
|
|
433
|
+
span.location ? JSON.stringify(span.location) : null,
|
|
434
|
+
span.bbox ? JSON.stringify(span.bbox) : null,
|
|
435
|
+
JSON.stringify(span.metadata ?? {}),
|
|
436
|
+
null
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
insertMany(spans);
|
|
441
|
+
await Promise.all(spans.map(
|
|
442
|
+
(span) => limit(async () => {
|
|
443
|
+
try {
|
|
444
|
+
const embedding = await embed(span.text);
|
|
445
|
+
db.prepare("UPDATE source_spans SET embedding = ? WHERE id = ?").run(embeddingToBuffer(embedding), span.id);
|
|
446
|
+
} catch {
|
|
447
|
+
}
|
|
448
|
+
})
|
|
449
|
+
));
|
|
450
|
+
},
|
|
451
|
+
async addSourceChunks(chunks) {
|
|
452
|
+
const stmt = db.prepare(`
|
|
453
|
+
INSERT OR REPLACE INTO source_chunks (
|
|
454
|
+
id, document_id, source_span_ids, text, text_hash, page_start, page_end, metadata
|
|
455
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
456
|
+
`);
|
|
457
|
+
const insertMany = db.transaction((items) => {
|
|
458
|
+
for (const chunk of items) {
|
|
459
|
+
stmt.run(
|
|
460
|
+
chunk.id,
|
|
461
|
+
chunk.documentId,
|
|
462
|
+
JSON.stringify(chunk.sourceSpanIds),
|
|
463
|
+
chunk.text,
|
|
464
|
+
chunk.textHash,
|
|
465
|
+
chunk.pageStart ?? null,
|
|
466
|
+
chunk.pageEnd ?? null,
|
|
467
|
+
JSON.stringify(chunk.metadata ?? {})
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
insertMany(chunks);
|
|
472
|
+
},
|
|
473
|
+
async getSourceSpan(id) {
|
|
474
|
+
const row = db.prepare("SELECT * FROM source_spans WHERE id = ?").get(id);
|
|
475
|
+
return row ? rowToSourceSpan(row) : null;
|
|
476
|
+
},
|
|
477
|
+
async getSourceSpansByDocument(documentId) {
|
|
478
|
+
const rows = db.prepare("SELECT * FROM source_spans WHERE document_id = ? ORDER BY id ASC").all(documentId);
|
|
479
|
+
return rows.map(rowToSourceSpan);
|
|
480
|
+
},
|
|
481
|
+
async getSourceChunksByDocument(documentId) {
|
|
482
|
+
const rows = db.prepare("SELECT * FROM source_chunks WHERE document_id = ? ORDER BY id ASC").all(documentId);
|
|
483
|
+
return rows.map(rowToSourceChunk);
|
|
484
|
+
},
|
|
485
|
+
async deleteDocumentSource(documentId) {
|
|
486
|
+
db.prepare("DELETE FROM source_chunks WHERE document_id = ?").run(documentId);
|
|
487
|
+
db.prepare("DELETE FROM source_spans WHERE document_id = ?").run(documentId);
|
|
488
|
+
},
|
|
489
|
+
async searchSourceSpans(query) {
|
|
490
|
+
const queryEmbedding = await embed(query.question);
|
|
491
|
+
const resultLimit = query.limit ?? 10;
|
|
492
|
+
let sql = "SELECT * FROM source_spans WHERE embedding IS NOT NULL";
|
|
493
|
+
const params = [];
|
|
494
|
+
if (query.documentIds?.length) {
|
|
495
|
+
sql += ` AND document_id IN (${query.documentIds.map(() => "?").join(",")})`;
|
|
496
|
+
params.push(...query.documentIds);
|
|
497
|
+
}
|
|
498
|
+
if (query.chunkIds?.length) {
|
|
499
|
+
sql += ` AND chunk_id IN (${query.chunkIds.map(() => "?").join(",")})`;
|
|
500
|
+
params.push(...query.chunkIds);
|
|
501
|
+
}
|
|
502
|
+
if (query.filters?.sourceKind) {
|
|
503
|
+
sql += " AND source_kind = ?";
|
|
504
|
+
params.push(query.filters.sourceKind);
|
|
505
|
+
}
|
|
506
|
+
if (query.filters?.formNumber) {
|
|
507
|
+
sql += " AND form_number = ?";
|
|
508
|
+
params.push(query.filters.formNumber);
|
|
509
|
+
}
|
|
510
|
+
if (query.filters?.sectionId) {
|
|
511
|
+
sql += " AND section_id = ?";
|
|
512
|
+
params.push(query.filters.sectionId);
|
|
513
|
+
}
|
|
514
|
+
const rows = db.prepare(sql).all(...params);
|
|
515
|
+
const scored = rows.map((row) => {
|
|
516
|
+
const span = rowToSourceSpan(row);
|
|
517
|
+
return {
|
|
518
|
+
span,
|
|
519
|
+
relevance: cosineSimilarity2(queryEmbedding, bufferToEmbedding(row.embedding))
|
|
520
|
+
};
|
|
521
|
+
});
|
|
522
|
+
return orderSourceEvidence(scored.map((result) => ({
|
|
523
|
+
...result,
|
|
524
|
+
sourceSpanId: result.span.id,
|
|
525
|
+
chunkId: result.span.chunkId,
|
|
526
|
+
documentId: result.span.documentId,
|
|
527
|
+
text: result.span.text
|
|
528
|
+
}))).map(({ span, relevance }) => ({ span, relevance })).slice(0, resultLimit);
|
|
529
|
+
}
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
|
|
202
533
|
// src/storage/sqlite/index.ts
|
|
203
534
|
function createSqliteStore(options) {
|
|
204
535
|
const BetterSqlite3 = __require("better-sqlite3");
|
|
@@ -209,10 +540,14 @@ function createSqliteStore(options) {
|
|
|
209
540
|
return {
|
|
210
541
|
documents: createSqliteDocumentStore(db),
|
|
211
542
|
memory: createSqliteMemoryStore(db, options.embed),
|
|
543
|
+
source: createSqliteSourceStore(db, options.embed),
|
|
212
544
|
close: () => db.close()
|
|
213
545
|
};
|
|
214
546
|
}
|
|
215
547
|
export {
|
|
548
|
+
createSqliteDocumentStore,
|
|
549
|
+
createSqliteMemoryStore,
|
|
550
|
+
createSqliteSourceStore,
|
|
216
551
|
createSqliteStore
|
|
217
552
|
};
|
|
218
553
|
//# sourceMappingURL=storage-sqlite.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/sqlite/migrations.ts","../src/storage/sqlite/document-store.ts","../src/storage/sqlite/memory-store.ts","../src/storage/sqlite/index.ts"],"sourcesContent":["export const CREATE_TABLES = `\nCREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\n);\n\nCREATE TABLE IF NOT EXISTS chunks (\n id TEXT PRIMARY KEY,\n document_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n embedding BLOB,\n FOREIGN KEY (document_id) REFERENCES documents(id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS conversation_turns (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n tool_name TEXT,\n tool_result TEXT,\n timestamp INTEGER NOT NULL,\n embedding BLOB\n);\n\nCREATE INDEX IF NOT EXISTS idx_chunks_document_id ON chunks(document_id);\nCREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks(type);\nCREATE INDEX IF NOT EXISTS idx_turns_conversation_id ON conversation_turns(conversation_id);\nCREATE INDEX IF NOT EXISTS idx_turns_timestamp ON conversation_turns(timestamp);\n`;\n","import type Database from \"better-sqlite3\";\nimport type { DocumentStore } from \"../interfaces\";\nimport type { InsuranceDocument } from \"../../schemas/document\";\nimport type { DocumentFilters } from \"../chunk-types\";\n\nexport function createSqliteDocumentStore(db: Database.Database): DocumentStore {\n return {\n async save(doc: InsuranceDocument): Promise<void> {\n db.prepare(\"INSERT OR REPLACE INTO documents (id, type, data) VALUES (?, ?, ?)\").run(\n doc.id, doc.type, JSON.stringify(doc),\n );\n },\n\n async get(id: string): Promise<InsuranceDocument | null> {\n const row = db.prepare(\"SELECT data FROM documents WHERE id = ?\").get(id) as { data: string } | undefined;\n return row ? JSON.parse(row.data) : null;\n },\n\n async query(filters: DocumentFilters): Promise<InsuranceDocument[]> {\n let sql = \"SELECT data FROM documents WHERE 1=1\";\n const params: unknown[] = [];\n\n if (filters.type) {\n sql += \" AND type = ?\";\n params.push(filters.type);\n }\n if (filters.carrier) {\n sql += \" AND json_extract(data, '$.carrier') LIKE ?\";\n params.push(`%${filters.carrier}%`);\n }\n if (filters.insuredName) {\n sql += \" AND json_extract(data, '$.insuredName') LIKE ?\";\n params.push(`%${filters.insuredName}%`);\n }\n if (filters.policyNumber) {\n sql += \" AND json_extract(data, '$.policyNumber') = ?\";\n params.push(filters.policyNumber);\n }\n if (filters.quoteNumber) {\n sql += \" AND json_extract(data, '$.quoteNumber') = ?\";\n params.push(filters.quoteNumber);\n }\n\n const rows = db.prepare(sql).all(...params) as { data: string }[];\n return rows.map((r) => JSON.parse(r.data));\n },\n\n async delete(id: string): Promise<void> {\n db.prepare(\"DELETE FROM documents WHERE id = ?\").run(id);\n },\n };\n}\n","import type Database from \"better-sqlite3\";\nimport type { MemoryStore } from \"../interfaces\";\nimport type { DocumentChunk, ConversationTurn, ChunkFilter } from \"../chunk-types\";\nimport type { EmbedText } from \"../../core/types\";\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n\nexport function createSqliteMemoryStore(db: Database.Database, embed: EmbedText): MemoryStore {\n return {\n async addChunks(chunks: DocumentChunk[]): Promise<void> {\n const stmt = db.prepare(\"INSERT OR REPLACE INTO chunks (id, document_id, type, text, metadata, embedding) VALUES (?, ?, ?, ?, ?, ?)\");\n const insertMany = db.transaction((items: DocumentChunk[]) => {\n for (const chunk of items) {\n stmt.run(chunk.id, chunk.documentId, chunk.type, chunk.text, JSON.stringify(chunk.metadata), null);\n }\n });\n insertMany(chunks);\n\n for (const chunk of chunks) {\n try {\n const embedding = await embed(chunk.text);\n const buf = Buffer.from(new Float64Array(embedding).buffer);\n db.prepare(\"UPDATE chunks SET embedding = ? WHERE id = ?\").run(buf, chunk.id);\n } catch {\n // Embedding failure is non-fatal\n }\n }\n },\n\n async search(query: string, options?: { limit?: number; filter?: ChunkFilter }): Promise<DocumentChunk[]> {\n const queryEmbedding = await embed(query);\n const resultLimit = options?.limit ?? 10;\n\n let sql = \"SELECT id, document_id, type, text, metadata, embedding FROM chunks WHERE embedding IS NOT NULL\";\n const params: unknown[] = [];\n\n if (options?.filter?.documentId) {\n sql += \" AND document_id = ?\";\n params.push(options.filter.documentId);\n }\n if (options?.filter?.type) {\n sql += \" AND type = ?\";\n params.push(options.filter.type);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<{\n id: string; document_id: string; type: string; text: string; metadata: string; embedding: Buffer;\n }>;\n\n const scored = rows.map((row) => {\n const stored = Array.from(new Float64Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 8));\n return {\n chunk: {\n id: row.id,\n documentId: row.document_id,\n type: row.type as DocumentChunk[\"type\"],\n text: row.text,\n metadata: JSON.parse(row.metadata),\n },\n score: cosineSimilarity(queryEmbedding, stored),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, resultLimit).map((s) => s.chunk);\n },\n\n async addTurn(turn: ConversationTurn): Promise<void> {\n const embedding = await embed(turn.content).catch(() => null);\n const buf = embedding ? Buffer.from(new Float64Array(embedding).buffer) : null;\n db.prepare(\n \"INSERT INTO conversation_turns (id, conversation_id, role, content, tool_name, tool_result, timestamp, embedding) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\"\n ).run(turn.id, turn.conversationId, turn.role, turn.content, turn.toolName ?? null, turn.toolResult ?? null, turn.timestamp, buf);\n },\n\n async getHistory(conversationId: string, options?: { limit?: number }): Promise<ConversationTurn[]> {\n const resultLimit = options?.limit ?? 50;\n const rows = db.prepare(\n \"SELECT id, conversation_id, role, content, tool_name, tool_result, timestamp FROM conversation_turns WHERE conversation_id = ? ORDER BY timestamp DESC LIMIT ?\"\n ).all(conversationId, resultLimit) as Array<Record<string, unknown>>;\n\n return rows.reverse().map((r) => ({\n id: r.id as string,\n conversationId: r.conversation_id as string,\n role: r.role as ConversationTurn[\"role\"],\n content: r.content as string,\n toolName: r.tool_name as string | undefined,\n toolResult: r.tool_result as string | undefined,\n timestamp: r.timestamp as number,\n }));\n },\n\n async searchHistory(query: string, conversationId?: string): Promise<ConversationTurn[]> {\n const queryEmbedding = await embed(query);\n\n let sql = \"SELECT id, conversation_id, role, content, tool_name, tool_result, timestamp, embedding FROM conversation_turns WHERE embedding IS NOT NULL\";\n const params: unknown[] = [];\n if (conversationId) {\n sql += \" AND conversation_id = ?\";\n params.push(conversationId);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<Record<string, unknown>>;\n\n const scored = rows.map((row) => {\n const buf = row.embedding as Buffer;\n const stored = Array.from(new Float64Array(buf.buffer, buf.byteOffset, buf.byteLength / 8));\n return {\n turn: {\n id: row.id as string,\n conversationId: row.conversation_id as string,\n role: row.role as ConversationTurn[\"role\"],\n content: row.content as string,\n toolName: row.tool_name as string | undefined,\n toolResult: row.tool_result as string | undefined,\n timestamp: row.timestamp as number,\n },\n score: cosineSimilarity(queryEmbedding, stored),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, 10).map((s) => s.turn);\n },\n };\n}\n","import type { EmbedText } from \"../../core/types\";\nimport type { DocumentStore } from \"../interfaces\";\nimport type { MemoryStore } from \"../interfaces\";\nimport { CREATE_TABLES } from \"./migrations\";\nimport { createSqliteDocumentStore } from \"./document-store\";\nimport { createSqliteMemoryStore } from \"./memory-store\";\n\nexport interface SqliteStoreOptions {\n path: string;\n embed: EmbedText;\n}\n\nexport function createSqliteStore(options: SqliteStoreOptions): {\n documents: DocumentStore;\n memory: MemoryStore;\n close: () => void;\n} {\n // Dynamic import to keep better-sqlite3 optional\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const BetterSqlite3 = require(\"better-sqlite3\");\n const db = new BetterSqlite3(options.path);\n\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n db.exec(CREATE_TABLES);\n\n return {\n documents: createSqliteDocumentStore(db),\n memory: createSqliteMemoryStore(db, options.embed),\n close: () => db.close(),\n };\n}\n\nexport type { DocumentStore, MemoryStore } from \"../interfaces\";\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/sqlite/migrations.ts","../src/storage/sqlite/document-store.ts","../src/core/concurrency.ts","../src/storage/sqlite/memory-store.ts","../src/source/schemas.ts","../src/source/retrieval.ts","../src/storage/sqlite/source-store.ts","../src/storage/sqlite/index.ts"],"sourcesContent":["export const CREATE_TABLES = `\nCREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n data TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch())\n);\n\nCREATE TABLE IF NOT EXISTS chunks (\n id TEXT PRIMARY KEY,\n document_id TEXT NOT NULL,\n type TEXT NOT NULL,\n text TEXT NOT NULL,\n metadata TEXT NOT NULL DEFAULT '{}',\n embedding BLOB,\n FOREIGN KEY (document_id) REFERENCES documents(id) ON DELETE CASCADE\n);\n\nCREATE TABLE IF NOT EXISTS conversation_turns (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n tool_name TEXT,\n tool_result TEXT,\n timestamp INTEGER NOT NULL,\n embedding BLOB\n);\n\nCREATE TABLE IF NOT EXISTS source_spans (\n id TEXT PRIMARY KEY,\n document_id TEXT NOT NULL,\n source_kind TEXT,\n chunk_id TEXT,\n kind TEXT NOT NULL,\n text TEXT NOT NULL,\n hash TEXT NOT NULL,\n text_hash TEXT,\n page_start INTEGER,\n page_end INTEGER,\n section_id TEXT,\n form_number TEXT,\n location TEXT,\n bbox TEXT,\n metadata TEXT NOT NULL DEFAULT '{}',\n embedding BLOB\n);\n\nCREATE TABLE IF NOT EXISTS source_chunks (\n id TEXT PRIMARY KEY,\n document_id TEXT NOT NULL,\n source_span_ids TEXT NOT NULL,\n text TEXT NOT NULL,\n text_hash TEXT NOT NULL,\n page_start INTEGER,\n page_end INTEGER,\n metadata TEXT NOT NULL DEFAULT '{}'\n);\n\nCREATE INDEX IF NOT EXISTS idx_chunks_document_id ON chunks(document_id);\nCREATE INDEX IF NOT EXISTS idx_chunks_type ON chunks(type);\nCREATE INDEX IF NOT EXISTS idx_turns_conversation_id ON conversation_turns(conversation_id);\nCREATE INDEX IF NOT EXISTS idx_turns_timestamp ON conversation_turns(timestamp);\nCREATE INDEX IF NOT EXISTS idx_source_spans_document_id ON source_spans(document_id);\nCREATE INDEX IF NOT EXISTS idx_source_spans_chunk_id ON source_spans(chunk_id);\nCREATE INDEX IF NOT EXISTS idx_source_chunks_document_id ON source_chunks(document_id);\n`;\n","import type Database from \"better-sqlite3\";\nimport type { DocumentStore } from \"../interfaces\";\nimport type { InsuranceDocument } from \"../../schemas/document\";\nimport type { DocumentFilters } from \"../chunk-types\";\n\nexport function createSqliteDocumentStore(db: Database.Database): DocumentStore {\n return {\n async save(doc: InsuranceDocument): Promise<void> {\n db.prepare(\"INSERT OR REPLACE INTO documents (id, type, data) VALUES (?, ?, ?)\").run(\n doc.id, doc.type, JSON.stringify(doc),\n );\n },\n\n async get(id: string): Promise<InsuranceDocument | null> {\n const row = db.prepare(\"SELECT data FROM documents WHERE id = ?\").get(id) as { data: string } | undefined;\n return row ? JSON.parse(row.data) : null;\n },\n\n async query(filters: DocumentFilters): Promise<InsuranceDocument[]> {\n let sql = \"SELECT data FROM documents WHERE 1=1\";\n const params: unknown[] = [];\n\n if (filters.type) {\n sql += \" AND type = ?\";\n params.push(filters.type);\n }\n if (filters.carrier) {\n sql += \" AND json_extract(data, '$.carrier') LIKE ?\";\n params.push(`%${filters.carrier}%`);\n }\n if (filters.insuredName) {\n sql += \" AND json_extract(data, '$.insuredName') LIKE ?\";\n params.push(`%${filters.insuredName}%`);\n }\n if (filters.policyNumber) {\n sql += \" AND json_extract(data, '$.policyNumber') = ?\";\n params.push(filters.policyNumber);\n }\n if (filters.quoteNumber) {\n sql += \" AND json_extract(data, '$.quoteNumber') = ?\";\n params.push(filters.quoteNumber);\n }\n\n const rows = db.prepare(sql).all(...params) as { data: string }[];\n return rows.map((r) => JSON.parse(r.data));\n },\n\n async delete(id: string): Promise<void> {\n db.prepare(\"DELETE FROM documents WHERE id = ?\").run(id);\n },\n };\n}\n","/**\n * Concurrency limiter — returns a function that wraps async tasks\n * so at most `concurrency` run simultaneously.\n */\nexport function pLimit(concurrency: number) {\n let active = 0;\n const queue: Array<() => void> = [];\n\n function next() {\n if (queue.length > 0 && active < concurrency) {\n active++;\n queue.shift()!();\n }\n }\n\n return <T>(fn: () => Promise<T>): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n const run = () => {\n fn().then(resolve, reject).finally(() => {\n active--;\n next();\n });\n };\n queue.push(run);\n next();\n });\n}\n","import type Database from \"better-sqlite3\";\nimport type { MemoryStore } from \"../interfaces\";\nimport type { DocumentChunk, ConversationTurn, ChunkFilter } from \"../chunk-types\";\nimport type { EmbedText } from \"../../core/types\";\nimport { pLimit } from \"../../core/concurrency\";\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n}\n\nexport function createSqliteMemoryStore(db: Database.Database, embed: EmbedText): MemoryStore {\n const limit = pLimit(4);\n\n return {\n async addChunks(chunks: DocumentChunk[]): Promise<void> {\n const stmt = db.prepare(\"INSERT OR REPLACE INTO chunks (id, document_id, type, text, metadata, embedding) VALUES (?, ?, ?, ?, ?, ?)\");\n const insertMany = db.transaction((items: DocumentChunk[]) => {\n for (const chunk of items) {\n stmt.run(chunk.id, chunk.documentId, chunk.type, chunk.text, JSON.stringify(chunk.metadata), null);\n }\n });\n insertMany(chunks);\n\n await Promise.all(chunks.map((chunk) =>\n limit(async () => {\n try {\n const embedding = await embed(chunk.text);\n const buf = Buffer.from(new Float64Array(embedding).buffer);\n db.prepare(\"UPDATE chunks SET embedding = ? WHERE id = ?\").run(buf, chunk.id);\n } catch {\n // Embedding failure is non-fatal\n }\n }),\n ));\n },\n\n async search(query: string, options?: { limit?: number; filter?: ChunkFilter }): Promise<DocumentChunk[]> {\n const queryEmbedding = await embed(query);\n const resultLimit = options?.limit ?? 10;\n\n let sql = \"SELECT id, document_id, type, text, metadata, embedding FROM chunks WHERE embedding IS NOT NULL\";\n const params: unknown[] = [];\n\n if (options?.filter?.documentId) {\n sql += \" AND document_id = ?\";\n params.push(options.filter.documentId);\n }\n if (options?.filter?.type) {\n sql += \" AND type = ?\";\n params.push(options.filter.type);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<{\n id: string; document_id: string; type: string; text: string; metadata: string; embedding: Buffer;\n }>;\n\n const scored = rows.map((row) => {\n const stored = Array.from(new Float64Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 8));\n return {\n chunk: {\n id: row.id,\n documentId: row.document_id,\n type: row.type as DocumentChunk[\"type\"],\n text: row.text,\n metadata: JSON.parse(row.metadata),\n },\n score: cosineSimilarity(queryEmbedding, stored),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, resultLimit).map((s) => s.chunk);\n },\n\n async addTurn(turn: ConversationTurn): Promise<void> {\n const embedding = await embed(turn.content).catch(() => null);\n const buf = embedding ? Buffer.from(new Float64Array(embedding).buffer) : null;\n db.prepare(\n \"INSERT INTO conversation_turns (id, conversation_id, role, content, tool_name, tool_result, timestamp, embedding) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\"\n ).run(turn.id, turn.conversationId, turn.role, turn.content, turn.toolName ?? null, turn.toolResult ?? null, turn.timestamp, buf);\n },\n\n async getHistory(conversationId: string, options?: { limit?: number }): Promise<ConversationTurn[]> {\n const resultLimit = options?.limit ?? 50;\n const rows = db.prepare(\n \"SELECT id, conversation_id, role, content, tool_name, tool_result, timestamp FROM conversation_turns WHERE conversation_id = ? ORDER BY timestamp DESC LIMIT ?\"\n ).all(conversationId, resultLimit) as Array<Record<string, unknown>>;\n\n return rows.reverse().map((r) => ({\n id: r.id as string,\n conversationId: r.conversation_id as string,\n role: r.role as ConversationTurn[\"role\"],\n content: r.content as string,\n toolName: r.tool_name as string | undefined,\n toolResult: r.tool_result as string | undefined,\n timestamp: r.timestamp as number,\n }));\n },\n\n async searchHistory(query: string, conversationId?: string): Promise<ConversationTurn[]> {\n const queryEmbedding = await embed(query);\n\n let sql = \"SELECT id, conversation_id, role, content, tool_name, tool_result, timestamp, embedding FROM conversation_turns WHERE embedding IS NOT NULL\";\n const params: unknown[] = [];\n if (conversationId) {\n sql += \" AND conversation_id = ?\";\n params.push(conversationId);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<Record<string, unknown>>;\n\n const scored = rows.map((row) => {\n const buf = row.embedding as Buffer;\n const stored = Array.from(new Float64Array(buf.buffer, buf.byteOffset, buf.byteLength / 8));\n return {\n turn: {\n id: row.id as string,\n conversationId: row.conversation_id as string,\n role: row.role as ConversationTurn[\"role\"],\n content: row.content as string,\n toolName: row.tool_name as string | undefined,\n toolResult: row.tool_result as string | undefined,\n timestamp: row.timestamp as number,\n },\n score: cosineSimilarity(queryEmbedding, stored),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored.slice(0, 10).map((s) => s.turn);\n },\n };\n}\n","import { z } from \"zod\";\n\nexport const SourceSpanKindSchema = z.enum([\n \"pdf_text\",\n \"pdf_image\",\n \"html\",\n \"markdown\",\n \"plain_text\",\n \"structured_field\",\n]);\nexport type SourceSpanKind = z.infer<typeof SourceSpanKindSchema>;\n\nexport const SourceKindSchema = z.enum([\n \"policy_pdf\",\n \"application_pdf\",\n \"email\",\n \"attachment\",\n \"manual_note\",\n]);\nexport type SourceKind = z.infer<typeof SourceKindSchema>;\n\nexport const SourceSpanBBoxSchema = z.object({\n page: z.number().int().positive(),\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n});\nexport type SourceSpanBBox = z.infer<typeof SourceSpanBBoxSchema>;\n\nexport const SourceSpanLocationSchema = z.object({\n page: z.number().int().positive().optional(),\n startPage: z.number().int().positive().optional(),\n endPage: z.number().int().positive().optional(),\n charStart: z.number().int().nonnegative().optional(),\n charEnd: z.number().int().nonnegative().optional(),\n lineStart: z.number().int().positive().optional(),\n lineEnd: z.number().int().positive().optional(),\n fieldPath: z.string().optional(),\n});\nexport type SourceSpanLocation = z.infer<typeof SourceSpanLocationSchema>;\n\nexport const SourceSpanSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceKind: SourceKindSchema.optional(),\n chunkId: z.string().optional(),\n kind: SourceSpanKindSchema,\n text: z.string(),\n hash: z.string().min(1),\n textHash: z.string().optional(),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n sectionId: z.string().optional(),\n formNumber: z.string().optional(),\n bbox: z.array(SourceSpanBBoxSchema).optional(),\n location: SourceSpanLocationSchema.optional(),\n metadata: z.record(z.string()).optional(),\n});\nexport type SourceSpan = z.infer<typeof SourceSpanSchema>;\n\nexport const SourceSpanRefSchema = z.object({\n sourceSpanId: z.string().min(1),\n documentId: z.string().min(1).optional(),\n chunkId: z.string().optional(),\n quote: z.string().optional(),\n hash: z.string().optional(),\n location: SourceSpanLocationSchema.optional(),\n});\nexport type SourceSpanRef = z.infer<typeof SourceSpanRefSchema>;\n\nexport const SourceChunkSchema = z.object({\n id: z.string().min(1),\n documentId: z.string().min(1),\n sourceSpanIds: z.array(z.string().min(1)),\n text: z.string(),\n textHash: z.string().min(1),\n pageStart: z.number().int().positive().optional(),\n pageEnd: z.number().int().positive().optional(),\n metadata: z.record(z.string()).default({}),\n});\nexport type SourceChunk = z.infer<typeof SourceChunkSchema>;\n","import type { SourceSpan } from \"./schemas\";\n\nexport type SourceRetrievalMode = \"graph_only\" | \"source_rag\" | \"long_context\" | \"hybrid\";\n\nexport interface SourceRetrievalQuery {\n question: string;\n documentIds?: string[];\n chunkIds?: string[];\n limit?: number;\n mode?: SourceRetrievalMode;\n filters?: Record<string, string>;\n}\n\nexport interface SourceRetrievalResult {\n span: SourceSpan;\n relevance: number;\n}\n\nexport interface SourceRetriever {\n searchSourceSpans(query: SourceRetrievalQuery): Promise<SourceRetrievalResult[]>;\n}\n\nexport interface OrderableSourceEvidence {\n source?: string;\n sourceSpanId?: string;\n chunkId?: string;\n documentId?: string;\n turnId?: string;\n attachmentId?: string;\n text: string;\n relevance: number;\n}\n\nfunction evidenceTieBreakId(evidence: OrderableSourceEvidence): string {\n return [\n evidence.source ?? \"\",\n evidence.sourceSpanId ?? \"\",\n evidence.chunkId ?? \"\",\n evidence.documentId ?? \"\",\n evidence.turnId ?? \"\",\n evidence.attachmentId ?? \"\",\n evidence.text,\n ].join(\"|\");\n}\n\nexport function compareSourceEvidence(a: OrderableSourceEvidence, b: OrderableSourceEvidence): number {\n const relevanceDelta = b.relevance - a.relevance;\n if (relevanceDelta !== 0) return relevanceDelta;\n return evidenceTieBreakId(a).localeCompare(evidenceTieBreakId(b));\n}\n\nexport function orderSourceEvidence<T extends OrderableSourceEvidence>(evidence: T[]): T[] {\n return [...evidence].sort(compareSourceEvidence);\n}\n","import type Database from \"better-sqlite3\";\nimport type { EmbedText } from \"../../core/types\";\nimport type {\n SourceChunk,\n SourceRetrievalQuery,\n SourceRetrievalResult,\n SourceSpan,\n SourceStore,\n} from \"../../source\";\nimport { orderSourceEvidence } from \"../../source\";\nimport { pLimit } from \"../../core/concurrency\";\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n const denominator = Math.sqrt(magA) * Math.sqrt(magB);\n return denominator === 0 ? 0 : dot / denominator;\n}\n\nfunction embeddingToBuffer(embedding: number[]): Buffer {\n return Buffer.from(new Float64Array(embedding).buffer);\n}\n\nfunction bufferToEmbedding(buffer: Buffer): number[] {\n return Array.from(new Float64Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 8));\n}\n\nfunction parseJson<T>(value: string | null | undefined, fallback: T): T {\n if (!value) return fallback;\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction rowToSourceSpan(row: Record<string, unknown>): SourceSpan {\n const metadata = parseJson(row.metadata as string | undefined, {});\n return {\n id: row.id as string,\n documentId: row.document_id as string,\n sourceKind: (row.source_kind ?? undefined) as SourceSpan[\"sourceKind\"],\n chunkId: (row.chunk_id ?? undefined) as string | undefined,\n kind: row.kind as SourceSpan[\"kind\"],\n text: row.text as string,\n hash: row.hash as string,\n textHash: (row.text_hash ?? undefined) as string | undefined,\n pageStart: (row.page_start ?? undefined) as number | undefined,\n pageEnd: (row.page_end ?? undefined) as number | undefined,\n sectionId: (row.section_id ?? undefined) as string | undefined,\n formNumber: (row.form_number ?? undefined) as string | undefined,\n location: parseJson(row.location as string | undefined, undefined),\n bbox: parseJson(row.bbox as string | undefined, undefined),\n metadata: Object.keys(metadata).length ? metadata : undefined,\n };\n}\n\nfunction rowToSourceChunk(row: Record<string, unknown>): SourceChunk {\n return {\n id: row.id as string,\n documentId: row.document_id as string,\n sourceSpanIds: parseJson(row.source_span_ids as string | undefined, []),\n text: row.text as string,\n textHash: row.text_hash as string,\n pageStart: row.page_start as number | undefined,\n pageEnd: row.page_end as number | undefined,\n metadata: parseJson(row.metadata as string | undefined, {}),\n };\n}\n\nexport function createSqliteSourceStore(db: Database.Database, embed: EmbedText): SourceStore {\n const limit = pLimit(4);\n\n return {\n async addSourceSpans(spans: SourceSpan[]): Promise<void> {\n const stmt = db.prepare(`\n INSERT OR REPLACE INTO source_spans (\n id, document_id, source_kind, chunk_id, kind, text, hash, text_hash,\n page_start, page_end, section_id, form_number, location, bbox, metadata, embedding\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertMany = db.transaction((items: SourceSpan[]) => {\n for (const span of items) {\n stmt.run(\n span.id,\n span.documentId,\n span.sourceKind ?? null,\n span.chunkId ?? null,\n span.kind,\n span.text,\n span.hash,\n span.textHash ?? null,\n span.pageStart ?? null,\n span.pageEnd ?? null,\n span.sectionId ?? null,\n span.formNumber ?? null,\n span.location ? JSON.stringify(span.location) : null,\n span.bbox ? JSON.stringify(span.bbox) : null,\n JSON.stringify(span.metadata ?? {}),\n null,\n );\n }\n });\n insertMany(spans);\n\n await Promise.all(spans.map((span) =>\n limit(async () => {\n try {\n const embedding = await embed(span.text);\n db.prepare(\"UPDATE source_spans SET embedding = ? WHERE id = ?\").run(embeddingToBuffer(embedding), span.id);\n } catch {\n // Embedding failure is non-fatal; span text remains persisted.\n }\n }),\n ));\n },\n\n async addSourceChunks(chunks: SourceChunk[]): Promise<void> {\n const stmt = db.prepare(`\n INSERT OR REPLACE INTO source_chunks (\n id, document_id, source_span_ids, text, text_hash, page_start, page_end, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n const insertMany = db.transaction((items: SourceChunk[]) => {\n for (const chunk of items) {\n stmt.run(\n chunk.id,\n chunk.documentId,\n JSON.stringify(chunk.sourceSpanIds),\n chunk.text,\n chunk.textHash,\n chunk.pageStart ?? null,\n chunk.pageEnd ?? null,\n JSON.stringify(chunk.metadata ?? {}),\n );\n }\n });\n insertMany(chunks);\n },\n\n async getSourceSpan(id: string): Promise<SourceSpan | null> {\n const row = db.prepare(\"SELECT * FROM source_spans WHERE id = ?\").get(id) as Record<string, unknown> | undefined;\n return row ? rowToSourceSpan(row) : null;\n },\n\n async getSourceSpansByDocument(documentId: string): Promise<SourceSpan[]> {\n const rows = db.prepare(\"SELECT * FROM source_spans WHERE document_id = ? ORDER BY id ASC\").all(documentId) as Array<Record<string, unknown>>;\n return rows.map(rowToSourceSpan);\n },\n\n async getSourceChunksByDocument(documentId: string): Promise<SourceChunk[]> {\n const rows = db.prepare(\"SELECT * FROM source_chunks WHERE document_id = ? ORDER BY id ASC\").all(documentId) as Array<Record<string, unknown>>;\n return rows.map(rowToSourceChunk);\n },\n\n async deleteDocumentSource(documentId: string): Promise<void> {\n db.prepare(\"DELETE FROM source_chunks WHERE document_id = ?\").run(documentId);\n db.prepare(\"DELETE FROM source_spans WHERE document_id = ?\").run(documentId);\n },\n\n async searchSourceSpans(query: SourceRetrievalQuery): Promise<SourceRetrievalResult[]> {\n const queryEmbedding = await embed(query.question);\n const resultLimit = query.limit ?? 10;\n let sql = \"SELECT * FROM source_spans WHERE embedding IS NOT NULL\";\n const params: unknown[] = [];\n\n if (query.documentIds?.length) {\n sql += ` AND document_id IN (${query.documentIds.map(() => \"?\").join(\",\")})`;\n params.push(...query.documentIds);\n }\n if (query.chunkIds?.length) {\n sql += ` AND chunk_id IN (${query.chunkIds.map(() => \"?\").join(\",\")})`;\n params.push(...query.chunkIds);\n }\n if (query.filters?.sourceKind) {\n sql += \" AND source_kind = ?\";\n params.push(query.filters.sourceKind);\n }\n if (query.filters?.formNumber) {\n sql += \" AND form_number = ?\";\n params.push(query.filters.formNumber);\n }\n if (query.filters?.sectionId) {\n sql += \" AND section_id = ?\";\n params.push(query.filters.sectionId);\n }\n\n const rows = db.prepare(sql).all(...params) as Array<Record<string, unknown>>;\n const scored = rows.map((row) => {\n const span = rowToSourceSpan(row);\n return {\n span,\n relevance: cosineSimilarity(queryEmbedding, bufferToEmbedding(row.embedding as Buffer)),\n };\n });\n\n return orderSourceEvidence(scored.map((result) => ({\n ...result,\n sourceSpanId: result.span.id,\n chunkId: result.span.chunkId,\n documentId: result.span.documentId,\n text: result.span.text,\n }))).map(({ span, relevance }) => ({ span, relevance })).slice(0, resultLimit);\n },\n };\n}\n","import type { EmbedText } from \"../../core/types\";\nimport type { DocumentStore } from \"../interfaces\";\nimport type { MemoryStore } from \"../interfaces\";\nimport type { SourceStore } from \"../../source\";\nimport { CREATE_TABLES } from \"./migrations\";\nimport { createSqliteDocumentStore } from \"./document-store\";\nimport { createSqliteMemoryStore } from \"./memory-store\";\nimport { createSqliteSourceStore } from \"./source-store\";\n\nexport { createSqliteDocumentStore } from \"./document-store\";\nexport { createSqliteMemoryStore } from \"./memory-store\";\nexport { createSqliteSourceStore } from \"./source-store\";\n\nexport interface SqliteStoreOptions {\n path: string;\n embed: EmbedText;\n}\n\nexport function createSqliteStore(options: SqliteStoreOptions): {\n documents: DocumentStore;\n memory: MemoryStore;\n source: SourceStore;\n close: () => void;\n} {\n // Dynamic import to keep better-sqlite3 optional\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const BetterSqlite3 = require(\"better-sqlite3\");\n const db = new BetterSqlite3(options.path);\n\n db.pragma(\"journal_mode = WAL\");\n db.pragma(\"foreign_keys = ON\");\n db.exec(CREATE_TABLES);\n\n return {\n documents: createSqliteDocumentStore(db),\n memory: createSqliteMemoryStore(db, options.embed),\n source: createSqliteSourceStore(db, options.embed),\n close: () => db.close(),\n };\n}\n\nexport type { DocumentStore, MemoryStore } from \"../interfaces\";\nexport type { SourceStore } from \"../../source\";\n"],"mappings":"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","names":["cosineSimilarity"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claritylabs/cl-sdk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.18.0",
|
|
4
|
+
"description": "Deterministic insurance intelligence primitives for regulated AI agents",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|