mcp-rag-memory 2.4.1 → 2.7.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/.env.example +3 -1
- package/LICENSE +21 -0
- package/README.md +151 -16
- package/dist/cli.js +102 -34
- package/dist/db/database.d.ts +10 -2
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +119 -18
- package/dist/db/database.js.map +1 -1
- package/dist/env.js +32 -12
- package/dist/mcp/rag-server.js +140 -39
- package/dist/mcp/rag-server.js.map +1 -1
- package/dist/memory/memory.d.ts +5 -1
- package/dist/memory/memory.d.ts.map +1 -1
- package/dist/memory/memory.js +245 -101
- package/dist/memory/memory.js.map +1 -1
- package/dist/rag/chunker.d.ts +7 -0
- package/dist/rag/chunker.d.ts.map +1 -1
- package/dist/rag/chunker.js +119 -11
- package/dist/rag/chunker.js.map +1 -1
- package/dist/rag/embeddings.d.ts +25 -0
- package/dist/rag/embeddings.d.ts.map +1 -1
- package/dist/rag/embeddings.js +56 -4
- package/dist/rag/embeddings.js.map +1 -1
- package/dist/rag/pipeline.d.ts +19 -2
- package/dist/rag/pipeline.d.ts.map +1 -1
- package/dist/rag/pipeline.js +212 -39
- package/dist/rag/pipeline.js.map +1 -1
- package/dist/rag/reindex.d.ts +27 -0
- package/dist/rag/reindex.d.ts.map +1 -0
- package/dist/rag/reindex.js +138 -0
- package/dist/rag/reindex.js.map +1 -0
- package/dist/rag/vector-search.d.ts +26 -1
- package/dist/rag/vector-search.d.ts.map +1 -1
- package/dist/rag/vector-search.js +207 -65
- package/dist/rag/vector-search.js.map +1 -1
- package/dist/session/transcript.d.ts +15 -5
- package/dist/session/transcript.d.ts.map +1 -1
- package/dist/session/transcript.js +152 -25
- package/dist/session/transcript.js.map +1 -1
- package/package.json +6 -3
package/dist/rag/pipeline.js
CHANGED
|
@@ -4,20 +4,53 @@ import { contentHash, getDB, newId, nowMs, packVector } from "../db/database.js"
|
|
|
4
4
|
import { chunkText } from "./chunker.js";
|
|
5
5
|
import { embedText } from "./embeddings.js";
|
|
6
6
|
import { searchChunks, vectorSearch, invalidateVectorCache } from "./vector-search.js";
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
let ftsWarned = false;
|
|
8
|
+
/** Insert a FTS row. Only a genuinely missing FTS5 backend degrades silently —
|
|
9
|
+
* any other failure (disk full, corruption, SQLITE_BUSY) must surface, because
|
|
10
|
+
* swallowing it left every chunk permanently invisible to the keyword leg with
|
|
11
|
+
* no diagnostic and no rebuild path. */
|
|
12
|
+
function insertFtsRow(rowid, text) {
|
|
9
13
|
try {
|
|
10
14
|
getDB().prepare("INSERT INTO chunks_fts(rowid, content) VALUES (?, ?)").run(rowid, text);
|
|
11
15
|
}
|
|
12
|
-
catch {
|
|
13
|
-
|
|
16
|
+
catch (e) {
|
|
17
|
+
const msg = e.message;
|
|
18
|
+
// Match only "the FTS table is not there". A looser /chunks_fts/ test also
|
|
19
|
+
// swallowed UNIQUE and corruption errors, which are exactly the failures
|
|
20
|
+
// this change exists to surface.
|
|
21
|
+
if (!/no such table: chunks_fts|no such module: fts5/i.test(msg))
|
|
22
|
+
throw e;
|
|
23
|
+
if (!ftsWarned) {
|
|
24
|
+
ftsWarned = true;
|
|
25
|
+
process.stderr.write("rag: chunks_fts unavailable — hybrid search degraded to vector-only\n");
|
|
26
|
+
}
|
|
14
27
|
}
|
|
15
28
|
}
|
|
29
|
+
/** SQLite UNIQUE violation, which node:sqlite surfaces as errcode 2067. */
|
|
30
|
+
function isUniqueViolation(e, column) {
|
|
31
|
+
const err = e;
|
|
32
|
+
const msg = err?.message ?? "";
|
|
33
|
+
// "." must be escaped or it matches any character.
|
|
34
|
+
return err?.errcode === 2067 || msg.includes(`UNIQUE constraint failed: ${column}`);
|
|
35
|
+
}
|
|
36
|
+
/** Max content accepted from a tool call or CLI, so one payload cannot stall the server for a minute. */
|
|
37
|
+
export const MAX_INGEST_CHARS = 1_000_000;
|
|
16
38
|
export async function ingestText(content, title, opts = {}) {
|
|
17
39
|
const db = getDB();
|
|
18
40
|
const ts = nowMs();
|
|
19
|
-
//
|
|
20
|
-
|
|
41
|
+
// trim(): whitespace-only content produced a permanent 0-chunk document that
|
|
42
|
+
// could never be searched yet still occupied the content_hash unique index.
|
|
43
|
+
if (typeof content !== "string" || content.trim().length === 0) {
|
|
44
|
+
throw new Error("Ingest content must be a non-empty string");
|
|
45
|
+
}
|
|
46
|
+
if (content.length > MAX_INGEST_CHARS) {
|
|
47
|
+
throw new Error(`Ingest content too large (${content.length} chars > limit ${MAX_INGEST_CHARS}). ` +
|
|
48
|
+
`Split it, or use ingest_file / ingest_dir for large sources.`);
|
|
49
|
+
}
|
|
50
|
+
// Content-hash dedup: identical documents are never re-embedded. `dedupScope`
|
|
51
|
+
// keeps sources that legitimately repeat the same text apart (e.g. "ok" typed
|
|
52
|
+
// in two different sessions).
|
|
53
|
+
const hash = contentHash(`${opts.dedupScope ? `${opts.dedupScope}\u0000` : ""}${content}`);
|
|
21
54
|
const existing = db
|
|
22
55
|
.prepare("SELECT id, title, chunk_count FROM documents WHERE content_hash = ?")
|
|
23
56
|
.get(hash);
|
|
@@ -35,30 +68,102 @@ export async function ingestText(content, title, opts = {}) {
|
|
|
35
68
|
}
|
|
36
69
|
const docId = newId();
|
|
37
70
|
const chunks = chunkText(content);
|
|
38
|
-
|
|
39
|
-
|
|
71
|
+
if (chunks.length === 0) {
|
|
72
|
+
throw new Error("Ingest produced no indexable content (no non-whitespace text)");
|
|
73
|
+
}
|
|
40
74
|
let tokens = 0;
|
|
41
|
-
|
|
75
|
+
// Embed BEFORE opening the transaction. The MCP SDK does not serialize tool
|
|
76
|
+
// calls, so awaiting inside a transaction let a concurrent request's writes
|
|
77
|
+
// join this one — and a failure here rolled back that other request's work.
|
|
78
|
+
// The yield keeps the event loop responsive: a 10 MB file is ~11k chunks and
|
|
79
|
+
// the local embedder is synchronous, so without it the stdio server could not
|
|
80
|
+
// answer any other tool call for the whole ingest.
|
|
81
|
+
const vectors = [];
|
|
42
82
|
for (let i = 0; i < chunks.length; i++) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
83
|
+
vectors.push(await embedText(chunks[i].text));
|
|
84
|
+
if ((i & 15) === 15)
|
|
85
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
86
|
+
}
|
|
87
|
+
// All writes for one document are atomic, and the block below is fully
|
|
88
|
+
// synchronous, so no other request can interleave inside it.
|
|
89
|
+
db.exec("BEGIN IMMEDIATE;");
|
|
90
|
+
try {
|
|
91
|
+
db.prepare(`INSERT INTO documents (id, title, source, content_type, metadata, content_hash, chunk_count, created_at, updated_at)
|
|
92
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(docId, title, opts.source ?? null, opts.contentType ?? "text", JSON.stringify(opts.metadata ?? {}), hash, chunks.length, ts, ts);
|
|
93
|
+
const insertChunk = db.prepare(`INSERT INTO chunks (id, doc_id, idx, content, embedding, token_count, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)`);
|
|
94
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
95
|
+
const chunk = chunks[i];
|
|
96
|
+
tokens += chunk.tokenCount;
|
|
97
|
+
const res = insertChunk.run(newId(), docId, chunk.index, chunk.text, packVector(vectors[i]), chunk.tokenCount, ts);
|
|
98
|
+
insertFtsRow(Number(res.lastInsertRowid), chunk.text);
|
|
99
|
+
}
|
|
100
|
+
db.exec("COMMIT;");
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
try {
|
|
104
|
+
db.exec("ROLLBACK;");
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
/* transaction already closed */
|
|
108
|
+
}
|
|
109
|
+
// Two identical ingests can both pass the dedup SELECT above: the check and
|
|
110
|
+
// this INSERT are separated by chunking + embedding, and MCP tool calls are
|
|
111
|
+
// not serialized. Let the unique index arbitrate and report a dedup hit
|
|
112
|
+
// rather than failing the caller with a raw driver error.
|
|
113
|
+
if (isUniqueViolation(e, "documents.content_hash")) {
|
|
114
|
+
const again = getDB()
|
|
115
|
+
.prepare("SELECT id, title, chunk_count FROM documents WHERE content_hash = ?")
|
|
116
|
+
.get(hash);
|
|
117
|
+
if (again) {
|
|
118
|
+
return {
|
|
119
|
+
docId: again.id,
|
|
120
|
+
title: again.title,
|
|
121
|
+
chunks: again.chunk_count,
|
|
122
|
+
tokens: 0,
|
|
123
|
+
deduplicated: true,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw e;
|
|
48
128
|
}
|
|
49
129
|
invalidateVectorCache();
|
|
50
130
|
return { docId, title, chunks: chunks.length, tokens, deduplicated: false };
|
|
51
131
|
}
|
|
52
|
-
|
|
132
|
+
/** Roots are realpath'd too, so a junction/symlinked allowlist entry still matches. */
|
|
133
|
+
function allowedRoots() {
|
|
53
134
|
const raw = process.env.RAG_ALLOWED_DIRS;
|
|
54
135
|
if (!raw)
|
|
55
|
-
return;
|
|
56
|
-
|
|
136
|
+
return [];
|
|
137
|
+
return raw
|
|
57
138
|
.split(/[;|,]/)
|
|
58
|
-
.map((p) =>
|
|
59
|
-
.filter(Boolean)
|
|
60
|
-
|
|
139
|
+
.map((p) => p.trim())
|
|
140
|
+
.filter(Boolean)
|
|
141
|
+
.map((p) => {
|
|
142
|
+
const abs = path.resolve(p);
|
|
143
|
+
try {
|
|
144
|
+
return fs.realpathSync(abs);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return abs;
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
let warnedOpenAllowlist = false;
|
|
152
|
+
/**
|
|
153
|
+
* RAG_ALLOWED_DIRS is opt-in, so by default any readable path can be ingested
|
|
154
|
+
* and then stays retrievable from every future session sharing this store. Warn
|
|
155
|
+
* once instead of silently widening the blast radius of an agent-driven tool.
|
|
156
|
+
*/
|
|
157
|
+
function assertAllowedPath(abs) {
|
|
158
|
+
const roots = allowedRoots();
|
|
159
|
+
if (roots.length === 0) {
|
|
160
|
+
if (!warnedOpenAllowlist) {
|
|
161
|
+
warnedOpenAllowlist = true;
|
|
162
|
+
process.stderr.write("rag: RAG_ALLOWED_DIRS is not set — any readable path can be ingested and stays " +
|
|
163
|
+
`retrievable from this store. Set RAG_ALLOWED_DIRS to restrict it.\n`);
|
|
164
|
+
}
|
|
61
165
|
return;
|
|
166
|
+
}
|
|
62
167
|
const real = fs.realpathSync(abs);
|
|
63
168
|
if (!roots.some((r) => real === r || real.startsWith(r + path.sep))) {
|
|
64
169
|
throw new Error(`Path not allowed by RAG_ALLOWED_DIRS: ${abs}`);
|
|
@@ -71,7 +176,8 @@ export async function ingestFile(filePath, opts = {}) {
|
|
|
71
176
|
const st = fs.statSync(abs);
|
|
72
177
|
if (!st.isFile())
|
|
73
178
|
throw new Error(`Not a file: ${abs}`);
|
|
74
|
-
const
|
|
179
|
+
const maxMbRaw = Number(process.env.RAG_MAX_FILE_MB ?? 10);
|
|
180
|
+
const maxMb = Number.isFinite(maxMbRaw) && maxMbRaw > 0 ? maxMbRaw : 10;
|
|
75
181
|
const maxBytes = Math.max(1024, Math.floor(maxMb * 1024 * 1024));
|
|
76
182
|
if (st.size > maxBytes) {
|
|
77
183
|
throw new Error(`File too large (${st.size} bytes > limit ${maxBytes}): ${abs}. Raise RAG_MAX_FILE_MB to allow bigger files.`);
|
|
@@ -79,25 +185,53 @@ export async function ingestFile(filePath, opts = {}) {
|
|
|
79
185
|
assertAllowedPath(abs);
|
|
80
186
|
const content = fs.readFileSync(abs, "utf-8");
|
|
81
187
|
const title = path.basename(abs);
|
|
82
|
-
return ingestText(content, title, {
|
|
188
|
+
return ingestText(stripBom(content), title, {
|
|
83
189
|
source: abs,
|
|
84
190
|
contentType: opts.contentType ?? guessContentType(abs),
|
|
85
191
|
metadata: opts.metadata ?? { path: abs },
|
|
86
192
|
});
|
|
87
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Drop a UTF-8 BOM. It survives readFileSync as U+FEFF, so a Windows-authored
|
|
196
|
+
* .md file's first heading indexed as "\ufeff# Title" — the FTS trigram tokenizer
|
|
197
|
+
* keyed on it and the title never matched a plain "Title" query.
|
|
198
|
+
*/
|
|
199
|
+
function stripBom(text) {
|
|
200
|
+
return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
201
|
+
}
|
|
88
202
|
/** Let the event loop breathe every N files during large directory ingests. */
|
|
89
203
|
function yieldLoop() {
|
|
90
204
|
return new Promise((resolve) => setImmediate(resolve));
|
|
91
205
|
}
|
|
206
|
+
/** Cap the payload: a big directory must not return one line per file. */
|
|
207
|
+
const DIR_REPORT_LIMIT = 50;
|
|
208
|
+
/**
|
|
209
|
+
* Hard ceiling on files actually ingested. DIR_REPORT_LIMIT only truncated the
|
|
210
|
+
* response, so pointing this at a large tree still embedded every file and held
|
|
211
|
+
* the server hostage; the cap is reported explicitly instead of silently
|
|
212
|
+
* dropping the remainder.
|
|
213
|
+
*/
|
|
214
|
+
const DIR_MAX_FILES = 500;
|
|
92
215
|
export async function ingestDirectory(dirPath, opts = {}) {
|
|
93
216
|
const root = path.resolve(dirPath);
|
|
94
217
|
if (!fs.existsSync(root) || !fs.statSync(root).isDirectory()) {
|
|
95
218
|
throw new Error(`Not a directory: ${dirPath}`);
|
|
96
219
|
}
|
|
97
220
|
assertAllowedPath(root);
|
|
98
|
-
|
|
221
|
+
if (opts.extensions !== undefined) {
|
|
222
|
+
if (opts.extensions.length === 0)
|
|
223
|
+
throw new Error("extensions must not be empty");
|
|
224
|
+
for (const e of opts.extensions) {
|
|
225
|
+
if (typeof e !== "string" || e.trim() === "")
|
|
226
|
+
throw new Error(`Invalid extension: ${JSON.stringify(e)}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Lowercase once: `full.endsWith(e)` is case-sensitive, so an explicit
|
|
230
|
+
// extensions: [".TS"] silently matched nothing on a Windows-authored tree
|
|
231
|
+
// (or a request for ".Md" against README.MD).
|
|
232
|
+
const exts = (opts.extensions?.map((e) => (e.startsWith(".") ? e : `.${e}`)) ?? [
|
|
99
233
|
".ts", ".tsx", ".js", ".jsx", ".json", ".md", ".txt", ".py", ".go", ".rs", ".java", ".c", ".h", ".cpp", ".html", ".css",
|
|
100
|
-
];
|
|
234
|
+
]).map((e) => e.toLowerCase());
|
|
101
235
|
const skipDirs = new Set([".git", "dist", "node_modules", ".rag-data", ".test-data", ".venv"]);
|
|
102
236
|
const files = [];
|
|
103
237
|
const walk = (dir) => {
|
|
@@ -107,30 +241,48 @@ export async function ingestDirectory(dirPath, opts = {}) {
|
|
|
107
241
|
if (opts.recursive && !skipDirs.has(entry.name) && !entry.name.startsWith("."))
|
|
108
242
|
walk(full);
|
|
109
243
|
}
|
|
110
|
-
else if (entry.isFile() && exts.some((e) => full.endsWith(e))) {
|
|
244
|
+
else if (entry.isFile() && exts.some((e) => full.toLowerCase().endsWith(e))) {
|
|
111
245
|
files.push(full);
|
|
112
246
|
}
|
|
113
247
|
}
|
|
114
248
|
};
|
|
115
249
|
walk(root);
|
|
250
|
+
// Deterministic slice before any work: walk() order is filesystem-dependent,
|
|
251
|
+
// so capping after sorting keeps "which 500" reproducible across machines.
|
|
252
|
+
const sorted = files.sort();
|
|
253
|
+
const truncated = Math.max(0, sorted.length - DIR_MAX_FILES);
|
|
254
|
+
const targets = truncated > 0 ? sorted.slice(0, DIR_MAX_FILES) : sorted;
|
|
116
255
|
const ingested = [];
|
|
117
256
|
const skipped = [];
|
|
118
|
-
|
|
119
|
-
|
|
257
|
+
let ingestedCount = 0;
|
|
258
|
+
let skippedCount = 0;
|
|
259
|
+
for (let i = 0; i < targets.length; i++) {
|
|
260
|
+
const f = targets[i];
|
|
120
261
|
try {
|
|
121
|
-
|
|
262
|
+
const res = await ingestFile(f, { metadata: opts.metadata ?? { ingestDir: root } });
|
|
263
|
+
ingestedCount++;
|
|
264
|
+
if (ingested.length < DIR_REPORT_LIMIT)
|
|
265
|
+
ingested.push(res);
|
|
122
266
|
}
|
|
123
267
|
catch (e) {
|
|
124
|
-
|
|
268
|
+
skippedCount++;
|
|
269
|
+
if (skipped.length < DIR_REPORT_LIMIT)
|
|
270
|
+
skipped.push(`${f} (${e.message})`);
|
|
125
271
|
}
|
|
126
272
|
if (i % 10 === 9)
|
|
127
273
|
await yieldLoop();
|
|
128
274
|
}
|
|
129
|
-
|
|
275
|
+
if (truncated > 0) {
|
|
276
|
+
skippedCount += truncated;
|
|
277
|
+
if (skipped.length < DIR_REPORT_LIMIT) {
|
|
278
|
+
skipped.push(`${truncated} more file(s) matched but were not ingested: directory ingest is capped at ${DIR_MAX_FILES} per call`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return { ingested, skipped, ingestedCount, skippedCount };
|
|
130
282
|
}
|
|
131
|
-
export async function searchDocs(query, topK = 10, minScore = 0.08, filters) {
|
|
283
|
+
export async function searchDocs(query, topK = 10, minScore = 0.08, filters, explain = false) {
|
|
132
284
|
const q = await embedText(query);
|
|
133
|
-
return searchChunks(q, { queryText: query, topK, minScore, filters });
|
|
285
|
+
return searchChunks(q, { queryText: query, topK, minScore, filters, explain });
|
|
134
286
|
}
|
|
135
287
|
export async function retrieve(query, topK = 6, minScore = 0.08, filters) {
|
|
136
288
|
const hits = await searchDocs(query, topK, minScore, filters);
|
|
@@ -146,19 +298,40 @@ export async function retrieve(query, topK = 6, minScore = 0.08, filters) {
|
|
|
146
298
|
totalTokens: withTokens.reduce((acc, c) => acc + c.tokenCount, 0),
|
|
147
299
|
};
|
|
148
300
|
}
|
|
149
|
-
|
|
301
|
+
/** Bounded by default: a big store would otherwise dump every row into one tool result. */
|
|
302
|
+
export const LIST_DOCS_DEFAULT = 100;
|
|
303
|
+
export const LIST_DOCS_MAX = 1000;
|
|
304
|
+
export function listDocuments(opts = {}) {
|
|
150
305
|
const db = getDB();
|
|
306
|
+
const limit = Math.min(Math.max(Math.trunc(opts.limit ?? LIST_DOCS_DEFAULT), 1), LIST_DOCS_MAX);
|
|
307
|
+
const offset = Math.max(Math.trunc(opts.offset ?? 0), 0);
|
|
308
|
+
const total = db.prepare("SELECT COUNT(*) AS c FROM documents").get().c;
|
|
151
309
|
const rows = db
|
|
152
|
-
.prepare(`SELECT id, title, source, content_type, chunk_count, created_at, updated_at, metadata
|
|
153
|
-
|
|
154
|
-
|
|
310
|
+
.prepare(`SELECT id, title, source, content_type, chunk_count, created_at, updated_at, metadata
|
|
311
|
+
FROM documents ORDER BY updated_at DESC LIMIT ? OFFSET ?`)
|
|
312
|
+
.all(limit, offset);
|
|
313
|
+
return { documents: rows, total, limit, offset };
|
|
155
314
|
}
|
|
156
315
|
export function deleteDocument(docId) {
|
|
157
316
|
const db = getDB();
|
|
158
|
-
db.
|
|
159
|
-
|
|
317
|
+
db.exec("BEGIN IMMEDIATE;");
|
|
318
|
+
let changes = 0;
|
|
319
|
+
try {
|
|
320
|
+
db.prepare("DELETE FROM chunks_fts WHERE rowid IN (SELECT rowid FROM chunks WHERE doc_id = ?)").run(docId);
|
|
321
|
+
changes = Number(db.prepare("DELETE FROM documents WHERE id = ?").run(docId).changes);
|
|
322
|
+
db.exec("COMMIT;");
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
try {
|
|
326
|
+
db.exec("ROLLBACK;");
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
/* transaction already closed */
|
|
330
|
+
}
|
|
331
|
+
throw e;
|
|
332
|
+
}
|
|
160
333
|
invalidateVectorCache();
|
|
161
|
-
return { deleted:
|
|
334
|
+
return { deleted: changes > 0 };
|
|
162
335
|
}
|
|
163
336
|
export function documentStats() {
|
|
164
337
|
const db = getDB();
|
package/dist/rag/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/rag/pipeline.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/rag/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const REINDEX_BATCH = 32;
|
|
2
|
+
export type ReindexPhase = "chunks" | "memories" | "finalize";
|
|
3
|
+
export interface ReindexProgress {
|
|
4
|
+
phase: ReindexPhase;
|
|
5
|
+
done: number;
|
|
6
|
+
total: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ReindexResult {
|
|
9
|
+
chunks: number;
|
|
10
|
+
memories: number;
|
|
11
|
+
dimBefore: number;
|
|
12
|
+
dimAfter: number;
|
|
13
|
+
modelBefore: string;
|
|
14
|
+
modelAfter: string;
|
|
15
|
+
ms: number;
|
|
16
|
+
changed: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface ReindexOptions {
|
|
19
|
+
batchSize?: number;
|
|
20
|
+
onProgress?: (p: ReindexProgress) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Migrate the store to the currently configured `EMBEDDING_PROVIDER` /
|
|
24
|
+
* `EMBEDDING_MODEL`. Embedding is deterministic per model, so this is idempotent.
|
|
25
|
+
*/
|
|
26
|
+
export declare function reindex(opts?: ReindexOptions): Promise<ReindexResult>;
|
|
27
|
+
//# sourceMappingURL=reindex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/rag/reindex.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAM,aAAa,KAAK,CAAC;AAIhC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;CAC3C;AAgED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA4D/E"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-embed every stored vector in place.
|
|
3
|
+
*
|
|
4
|
+
* The embedding guard (`ensureDim`) treats mixing two vector spaces as a hard
|
|
5
|
+
* error, which is correct but leaves the operator with a manual chore: point
|
|
6
|
+
* `RAG_DB_DIR` at an empty directory and re-ingest every document from scratch.
|
|
7
|
+
* For a memory store holding months of session history that is not a migration,
|
|
8
|
+
* it is data loss with extra steps.
|
|
9
|
+
*
|
|
10
|
+
* `reindex` performs the migration in place instead:
|
|
11
|
+
* 1. Mark the store `reindexing`, which makes every search and ingest fail
|
|
12
|
+
* loudly (`assertEmbedStateReady`). A partially migrated store would
|
|
13
|
+
* otherwise mix old and new vectors and return confident nonsense.
|
|
14
|
+
* 2. Re-embed chunks, then memories, in batches, committing as it goes so an
|
|
15
|
+
* interrupted run leaves a resumable store rather than a lost one.
|
|
16
|
+
* 3. Rewrite `embed_dim` / `embed_model` and clear the flag.
|
|
17
|
+
*
|
|
18
|
+
* Running it again after an interruption is always safe: the whole store is
|
|
19
|
+
* rewritten from the documents' text, which is the authoritative copy.
|
|
20
|
+
*/
|
|
21
|
+
import { getDB, packVector, unpackVector, getEmbedDim, getEmbedModel, setEmbedMeta, setEmbedState, } from "../db/database.js";
|
|
22
|
+
import { embedTextUnguarded, modelName } from "./embeddings.js";
|
|
23
|
+
import { invalidateVectorCache } from "./vector-search.js";
|
|
24
|
+
export const REINDEX_BATCH = 32;
|
|
25
|
+
/** Yield to the event loop this often so a stdio server stays responsive mid-run. */
|
|
26
|
+
const YIELD_EVERY = 4;
|
|
27
|
+
function resolveBatch(raw) {
|
|
28
|
+
if (raw === undefined || !Number.isFinite(raw) || raw < 1)
|
|
29
|
+
return REINDEX_BATCH;
|
|
30
|
+
return Math.min(200, Math.max(1, Math.trunc(raw)));
|
|
31
|
+
}
|
|
32
|
+
const tick = () => new Promise((r) => setImmediate(r));
|
|
33
|
+
/**
|
|
34
|
+
* Re-embed one table. Uses `iterate()` so content is streamed from disk in
|
|
35
|
+
* batches rather than materialising every row, and the UPDATE is parameterized
|
|
36
|
+
* so document text can never be interpreted as SQL.
|
|
37
|
+
*/
|
|
38
|
+
async function reembedTable(table, batchSize, onProgress) {
|
|
39
|
+
const db = getDB();
|
|
40
|
+
const total = db.prepare(`SELECT COUNT(*) AS n FROM ${table}`).get().n;
|
|
41
|
+
const reader = db
|
|
42
|
+
.prepare(`SELECT id, content FROM ${table}`)
|
|
43
|
+
.iterate();
|
|
44
|
+
const update = db.prepare(`UPDATE ${table} SET embedding = ? WHERE id = ?`);
|
|
45
|
+
let done = 0;
|
|
46
|
+
let pending = [];
|
|
47
|
+
let sinceYield = 0;
|
|
48
|
+
const flush = () => {
|
|
49
|
+
if (pending.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
// One transaction per batch: a crash mid-run loses at most a batch, and the
|
|
52
|
+
// `reindexing` flag stays set so nothing can read the half-updated store.
|
|
53
|
+
db.exec("BEGIN");
|
|
54
|
+
try {
|
|
55
|
+
for (const row of pending)
|
|
56
|
+
update.run(packVector(row.vec), row.id);
|
|
57
|
+
db.exec("COMMIT");
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
db.exec("ROLLBACK");
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
done += pending.length;
|
|
64
|
+
pending = [];
|
|
65
|
+
onProgress?.({ phase: table, done, total });
|
|
66
|
+
};
|
|
67
|
+
for (const row of reader) {
|
|
68
|
+
pending.push({ id: row.id, vec: await embedTextUnguarded(row.content) });
|
|
69
|
+
if (pending.length >= batchSize) {
|
|
70
|
+
flush();
|
|
71
|
+
if (++sinceYield >= YIELD_EVERY) {
|
|
72
|
+
sinceYield = 0;
|
|
73
|
+
await tick();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
flush();
|
|
78
|
+
onProgress?.({ phase: table, done, total });
|
|
79
|
+
return done;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Migrate the store to the currently configured `EMBEDDING_PROVIDER` /
|
|
83
|
+
* `EMBEDDING_MODEL`. Embedding is deterministic per model, so this is idempotent.
|
|
84
|
+
*/
|
|
85
|
+
export async function reindex(opts = {}) {
|
|
86
|
+
const started = Date.now();
|
|
87
|
+
const batchSize = resolveBatch(opts.batchSize);
|
|
88
|
+
const dimBefore = getEmbedDim();
|
|
89
|
+
const modelBefore = getEmbedModel();
|
|
90
|
+
const modelAfter = modelName();
|
|
91
|
+
const chunksRow = getDB().prepare("SELECT COUNT(*) AS n FROM chunks").get();
|
|
92
|
+
const memoriesRow = getDB().prepare("SELECT COUNT(*) AS n FROM memories").get();
|
|
93
|
+
if (chunksRow.n === 0 && memoriesRow.n === 0) {
|
|
94
|
+
// Nothing to migrate. Still normalise the metadata so a fresh store records
|
|
95
|
+
// the model it is about to start writing.
|
|
96
|
+
setEmbedMeta(dimBefore || 0, modelAfter);
|
|
97
|
+
return {
|
|
98
|
+
chunks: 0,
|
|
99
|
+
memories: 0,
|
|
100
|
+
dimBefore,
|
|
101
|
+
dimAfter: dimBefore,
|
|
102
|
+
modelBefore,
|
|
103
|
+
modelAfter,
|
|
104
|
+
ms: Date.now() - started,
|
|
105
|
+
changed: false,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
setEmbedState("reindexing");
|
|
109
|
+
try {
|
|
110
|
+
const chunks = await reembedTable("chunks", batchSize, opts.onProgress);
|
|
111
|
+
const memories = await reembedTable("memories", batchSize, opts.onProgress);
|
|
112
|
+
// Read the dimension the provider actually produced rather than trusting
|
|
113
|
+
// expectedDim(), which is 0 for an unrecognised model name.
|
|
114
|
+
const first = getDB().prepare("SELECT embedding FROM chunks WHERE embedding IS NOT NULL LIMIT 1").get();
|
|
115
|
+
const dimAfter = (unpackVector(first?.embedding ?? null)?.length ?? dimBefore) || dimBefore;
|
|
116
|
+
opts.onProgress?.({ phase: "finalize", done: chunks + memories, total: chunks + memories });
|
|
117
|
+
setEmbedMeta(dimAfter, modelAfter);
|
|
118
|
+
invalidateVectorCache();
|
|
119
|
+
return {
|
|
120
|
+
chunks,
|
|
121
|
+
memories,
|
|
122
|
+
dimBefore,
|
|
123
|
+
dimAfter,
|
|
124
|
+
modelBefore,
|
|
125
|
+
modelAfter,
|
|
126
|
+
ms: Date.now() - started,
|
|
127
|
+
changed: modelBefore !== modelAfter || dimBefore !== dimAfter,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
// Leave the flag set on purpose: the store is genuinely inconsistent now and
|
|
132
|
+
// must not look usable. The message tells the operator to simply re-run.
|
|
133
|
+
throw new Error(`Reindex failed partway (${chunksRow.n} chunks / ${memoriesRow.n} memories pending): ` +
|
|
134
|
+
`${err instanceof Error ? err.message : String(err)}. ` +
|
|
135
|
+
`The store is still flagged as reindexing and will refuse searches until you re-run 'reindex'.`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=reindex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../src/rag/reindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,11 +14,30 @@ export interface SearchHit {
|
|
|
14
14
|
content: string;
|
|
15
15
|
score: number;
|
|
16
16
|
tokenCount: number;
|
|
17
|
+
/** Which retrieval legs surfaced this chunk. Always populated; cheap and useful. */
|
|
18
|
+
legs: SearchLeg[];
|
|
19
|
+
/** Per-leg diagnostics. Populated only when `explain` is requested. */
|
|
20
|
+
explain?: SearchExplain;
|
|
21
|
+
}
|
|
22
|
+
export type SearchLeg = "vector" | "keyword";
|
|
23
|
+
export interface SearchExplain {
|
|
24
|
+
/** Cosine similarity in [-1, 1]; absent when the chunk is keyword-only. */
|
|
25
|
+
vectorScore?: number;
|
|
26
|
+
/** BM25 relevance mapped to 0..1; absent when the chunk is vector-only. */
|
|
27
|
+
keywordScore?: number;
|
|
28
|
+
/** Reciprocal-rank-fusion contribution used to order the fused list. */
|
|
29
|
+
rrfScore: number;
|
|
30
|
+
/** Zero-based rank within each leg that contributed, for tie diagnosis. */
|
|
31
|
+
vectorRank?: number;
|
|
32
|
+
keywordRank?: number;
|
|
17
33
|
}
|
|
18
34
|
export interface SearchOptions {
|
|
19
35
|
topK?: number;
|
|
20
36
|
minScore?: number;
|
|
21
37
|
collection?: "chunks" | "memories";
|
|
38
|
+
onlyKeys?: Set<string>;
|
|
39
|
+
/** Restrict to chunks of these documents (cheap: doc ids, not chunk ids). */
|
|
40
|
+
onlyDocIds?: Set<string>;
|
|
22
41
|
}
|
|
23
42
|
export declare function invalidateVectorCache(): void;
|
|
24
43
|
/** Brute-force vector search over stored vectors (uses the in-memory cache). */
|
|
@@ -35,10 +54,16 @@ export interface SearchChunkOptions {
|
|
|
35
54
|
topK: number;
|
|
36
55
|
minScore: number;
|
|
37
56
|
filters?: SearchChunkFilters;
|
|
57
|
+
/** Attach per-leg scores to every hit. Costs nothing extra, but only populated on request. */
|
|
58
|
+
explain?: boolean;
|
|
38
59
|
}
|
|
39
60
|
/**
|
|
40
|
-
* Hybrid search: FTS5 BM25 keyword + vector, fused with RRF.
|
|
61
|
+
* Hybrid search: FTS5 BM25 keyword + vector, fused with RRF for ranking.
|
|
41
62
|
* Controlled by SEARCH_MODE=hybrid|vector|keyword (default hybrid).
|
|
63
|
+
*
|
|
64
|
+
* The reported `score` is always on a 0..1 relevance scale — the vector cosine
|
|
65
|
+
* when the chunk has one, otherwise a rank-decayed keyword score — so `minScore`
|
|
66
|
+
* means the same thing in every mode (RRF only decides the order).
|
|
42
67
|
*/
|
|
43
68
|
export declare function searchChunks(queryVec: Float64Array, opts: SearchChunkOptions): SearchHit[];
|
|
44
69
|
//# sourceMappingURL=vector-search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../src/rag/vector-search.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../src/rag/vector-search.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,uEAAuE;IACvE,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACnC,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B;AAmBD,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C;AAiGD,gFAAgF;AAChF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,aAAkB,GAC1B,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBvC;AAyED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,8FAA8F;IAC9F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,EAAE,CA6H1F"}
|