mcp-rag-memory 2.4.1 → 2.6.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.
@@ -1,6 +1,6 @@
1
1
  import { getDB, newId, nowMs, packVector, unpackVector } from "../db/database.js";
2
2
  import { dotProduct } from "../rag/embedder.js";
3
- import { estimateTokens } from "../rag/chunker.js";
3
+ import { estimateTokensFromChars } from "../rag/chunker.js";
4
4
  import { embedText } from "../rag/embeddings.js";
5
5
  import { vectorSearch, invalidateVectorCache } from "../rag/vector-search.js";
6
6
  export const MEMORY_TYPES = [
@@ -12,45 +12,93 @@ export const MEMORY_TYPES = [
12
12
  "insight",
13
13
  "conversation",
14
14
  ];
15
- /** Half-life in days for the recall decay curve. */
16
- const DECAY_HALF_LIFE_DAYS = Number(process.env.RAG_MEMORY_HALF_LIFE_DAYS ?? 14);
15
+ /** Half-life in days for the recall decay curve (invalid values fall back to 14). */
16
+ const DECAY_HALF_LIFE_DAYS = numEnv("RAG_MEMORY_HALF_LIFE_DAYS", 14, (n) => n > 0);
17
+ function numEnv(name, fallback, valid) {
18
+ const raw = process.env[name];
19
+ if (raw === undefined || raw === "")
20
+ return fallback;
21
+ const n = Number(raw);
22
+ return Number.isFinite(n) && valid(n) ? n : fallback;
23
+ }
17
24
  export async function remember(input) {
18
- const db = getDB();
19
25
  const id = newId();
20
26
  const ts = nowMs();
21
27
  const type = input.type ?? "fact";
22
28
  const importance = clampImportance(input.importance ?? 0.5);
23
29
  const tags = JSON.stringify(input.tags ?? []);
24
30
  const vec = await embedText(input.content);
31
+ // Re-acquire after the await: nothing below should use a handle captured
32
+ // before a yield point, where closeDB() could have invalidated it.
33
+ const db = getDB();
25
34
  db.prepare(`INSERT INTO memories (id, type, content, importance, embedding, tags, recall_count, last_recalled, created_at, updated_at)
26
35
  VALUES (?, ?, ?, ?, ?, ?, 0, NULL, ?, ?)`).run(id, type, input.content, importance, packVector(vec), tags, ts, ts);
27
36
  invalidateVectorCache();
28
- return getMemory(id);
37
+ const rec = getMemory(id);
38
+ if (!rec)
39
+ throw new Error("Memory insert failed: row disappeared immediately after write");
40
+ return rec;
41
+ }
42
+ const MEMORY_TYPE_SET = new Set(MEMORY_TYPES);
43
+ /** One query for the whole page — getMemory() per row used to be an N+1. */
44
+ function toRecords(rows) {
45
+ return rows.map((row) => ({
46
+ id: row.id,
47
+ type: MEMORY_TYPE_SET.has(row.type) ? row.type : "fact",
48
+ content: row.content,
49
+ importance: typeof row.importance === "number" && Number.isFinite(row.importance) ? row.importance : 0.5,
50
+ tags: parseTags(row.tags),
51
+ recallCount: row.recall_count,
52
+ lastRecalled: row.last_recalled,
53
+ createdAt: row.created_at,
54
+ updatedAt: row.updated_at,
55
+ }));
56
+ }
57
+ const MEMORY_COLUMNS = "id, type, content, importance, tags, recall_count, last_recalled, created_at, updated_at";
58
+ /** Never let a malformed row break every read path. */
59
+ function parseTags(raw) {
60
+ try {
61
+ const parsed = JSON.parse(raw);
62
+ return Array.isArray(parsed) ? parsed.map((t) => String(t)) : [];
63
+ }
64
+ catch {
65
+ return [];
66
+ }
29
67
  }
30
68
  export async function recall(query, topK = 8, minScore = 0.1) {
31
69
  const db = getDB();
32
70
  const q = await embedText(query);
33
71
  const hits = vectorSearch(q, { topK: topK * 2, minScore, collection: "memories" });
72
+ if (hits.length === 0)
73
+ return [];
34
74
  const ts = nowMs();
35
- const bump = db.prepare("UPDATE memories SET recall_count = recall_count + 1, last_recalled = ? WHERE id = ?");
36
- const results = [];
75
+ const rows = db
76
+ .prepare(`SELECT ${MEMORY_COLUMNS} FROM memories WHERE id IN (${hits.map(() => "?").join(", ")})`)
77
+ .all(...hits.map((h) => h.key));
78
+ const byId = new Map(toRecords(rows).map((r) => [r.id, r]));
79
+ const scored = [];
37
80
  for (const h of hits) {
38
- const rec = getMemory(h.key);
81
+ const rec = byId.get(h.key);
39
82
  if (!rec)
40
83
  continue;
41
- bump.run(ts, rec.id);
42
84
  const ageMs = ts - (rec.lastRecalled ?? rec.createdAt);
43
85
  const decay = Math.pow(0.5, ageMs / (DECAY_HALF_LIFE_DAYS * 86_400_000));
44
- results.push({
45
- ...rec,
46
- recallCount: rec.recallCount + 1,
47
- lastRecalled: ts,
48
- score: h.score * decay,
49
- decay,
50
- });
51
- }
52
- results.sort((a, b) => b.score - a.score);
53
- return results.slice(0, topK);
86
+ // min_score gates the raw cosine inside vectorSearch; decay shrinks the
87
+ // score afterwards, so a stale-but-perfect match could come back at ~0.
88
+ // Re-apply the floor to the score the caller actually receives.
89
+ const score = h.score * decay;
90
+ if (score < minScore)
91
+ continue;
92
+ scored.push({ ...rec, score, decay });
93
+ }
94
+ scored.sort((a, b) => b.score - a.score);
95
+ const results = scored.slice(0, topK);
96
+ // Bump only what is actually returned: a memory nobody saw is not "recalled",
97
+ // and phantom bumps used to feed decay and the promotion threshold.
98
+ const bump = db.prepare("UPDATE memories SET recall_count = recall_count + 1, last_recalled = ? WHERE id = ?");
99
+ for (const r of results)
100
+ bump.run(ts, r.id);
101
+ return results.map((r) => ({ ...r, recallCount: r.recallCount + 1, lastRecalled: ts }));
54
102
  }
55
103
  export function listMemories(opts = {}) {
56
104
  const db = getDB();
@@ -61,7 +109,9 @@ export function listMemories(opts = {}) {
61
109
  params.push(opts.type);
62
110
  }
63
111
  if (opts.tag) {
64
- clauses.push("EXISTS (SELECT 1 FROM json_each(memories.tags) AS _tg WHERE _tg.value = ?)");
112
+ // json_each() raises "malformed JSON" on a corrupted column, which would
113
+ // break the whole listing. Feed it a guaranteed-valid array instead.
114
+ clauses.push("EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(memories.tags) THEN memories.tags ELSE '[]' END) AS _tg WHERE _tg.value = ?)");
65
115
  params.push(opts.tag);
66
116
  }
67
117
  if (opts.minImportance !== undefined) {
@@ -69,133 +119,208 @@ export function listMemories(opts = {}) {
69
119
  params.push(opts.minImportance);
70
120
  }
71
121
  const where = clauses.length ? ` WHERE ${clauses.join(" AND ")}` : "";
72
- const limit = Math.min(opts.limit ?? 100, 500);
122
+ const rawLimit = opts.limit;
123
+ const limit = rawLimit === undefined || !Number.isFinite(rawLimit)
124
+ ? 100
125
+ : Math.min(Math.max(Math.trunc(rawLimit), 1), 500);
126
+ // id as tiebreaker: updated_at is millisecond-resolution, so a bulk write
127
+ // leaves large tie groups and LIMIT would pick an arbitrary subset.
73
128
  const rows = db
74
- .prepare(`SELECT id FROM memories${where} ORDER BY updated_at DESC LIMIT ${limit}`)
129
+ .prepare(`SELECT ${MEMORY_COLUMNS} FROM memories${where} ORDER BY updated_at DESC, id DESC LIMIT ${limit}`)
75
130
  .all(...params);
76
- return rows.map((r) => getMemory(r.id)).filter(Boolean);
131
+ return toRecords(rows);
77
132
  }
78
133
  export function getMemory(id) {
79
134
  const db = getDB();
80
135
  const row = db
81
- .prepare("SELECT * FROM memories WHERE id = ?")
136
+ .prepare(`SELECT ${MEMORY_COLUMNS} FROM memories WHERE id = ?`)
82
137
  .get(id);
83
138
  if (!row)
84
139
  return null;
85
- return {
86
- id: row.id,
87
- type: row.type,
88
- content: row.content,
89
- importance: row.importance,
90
- tags: JSON.parse(row.tags),
91
- recallCount: row.recall_count,
92
- lastRecalled: row.last_recalled,
93
- createdAt: row.created_at,
94
- updatedAt: row.updated_at,
95
- };
140
+ return toRecords([row])[0];
96
141
  }
97
142
  export async function updateMemory(id, patch) {
98
- const db = getDB();
99
143
  const existing = getMemory(id);
100
144
  if (!existing)
101
145
  return null;
102
- const content = patch.content ?? existing.content;
103
- const type = patch.type ?? existing.type;
104
- const importance = patch.importance !== undefined ? clampImportance(patch.importance) : existing.importance;
105
- const tags = patch.tags ?? existing.tags;
106
- const vec = await embedText(content);
107
- const ts = nowMs();
108
- db.prepare("UPDATE memories SET content = ?, type = ?, importance = ?, tags = ?, embedding = ?, updated_at = ? WHERE id = ?").run(content, type, importance, JSON.stringify(tags), packVector(vec), ts, id);
109
- invalidateVectorCache();
110
- return getMemory(id);
146
+ // Build the SET list from the patch only. Rewriting every column from a
147
+ // pre-read snapshot made this a lost-update: two concurrent patches (CLI +
148
+ // server, or two sessions) each wrote back the other's stale values.
149
+ const sets = [];
150
+ const params = [];
151
+ if (patch.content !== undefined) {
152
+ sets.push("content = ?");
153
+ params.push(patch.content);
154
+ }
155
+ if (patch.type !== undefined) {
156
+ sets.push("type = ?");
157
+ params.push(patch.type);
158
+ }
159
+ if (patch.importance !== undefined) {
160
+ sets.push("importance = ?");
161
+ params.push(clampImportance(patch.importance));
162
+ }
163
+ if (patch.tags !== undefined) {
164
+ sets.push("tags = ?");
165
+ params.push(JSON.stringify(patch.tags));
166
+ }
167
+ // An all-undefined patch must not touch the row (or re-embed) at all.
168
+ if (sets.length === 0)
169
+ return existing;
170
+ // Only a real text edit needs the model; metadata-only patches stay cheap.
171
+ if (patch.content !== undefined && patch.content !== existing.content) {
172
+ const vec = await embedText(patch.content);
173
+ sets.push("embedding = ?");
174
+ params.push(packVector(vec));
175
+ invalidateVectorCache();
176
+ }
177
+ sets.push("updated_at = ?");
178
+ params.push(nowMs());
179
+ // Re-acquire after the await above: the handle could have been closed.
180
+ const db = getDB();
181
+ const res = db
182
+ .prepare(`UPDATE memories SET ${sets.join(", ")} WHERE id = ?`)
183
+ .run(...params, id);
184
+ return Number(res.changes) > 0 ? getMemory(id) : null;
111
185
  }
112
186
  export function forget(id) {
113
187
  const db = getDB();
114
188
  const res = db.prepare("DELETE FROM memories WHERE id = ?").run(id);
115
- invalidateVectorCache();
116
- return { deleted: Number(res.changes) > 0 };
189
+ const deleted = Number(res.changes) > 0;
190
+ // A mistyped id used to force a full vector re-read on the next search.
191
+ if (deleted)
192
+ invalidateVectorCache();
193
+ return { deleted };
194
+ }
195
+ /** Above this many vectors the O(n^2) dedup pass is skipped (event-loop budget). */
196
+ const DEDUP_MAX_VECTORS = 500;
197
+ const DEDUP_SIMILARITY = 0.92;
198
+ const DEDUP_TOKEN_OVERLAP = 0.8;
199
+ function tokenSet(text) {
200
+ return new Set((text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? []).filter((t) => t.length > 1));
201
+ }
202
+ /** Jaccard overlap of word sets — the second gate before anything is deleted. */
203
+ function tokenOverlap(a, b) {
204
+ const ta = tokenSet(a);
205
+ const tb = tokenSet(b);
206
+ if (ta.size === 0 || tb.size === 0)
207
+ return 0;
208
+ let shared = 0;
209
+ for (const t of ta)
210
+ if (tb.has(t))
211
+ shared++;
212
+ return shared / (ta.size + tb.size - shared);
117
213
  }
118
214
  /**
119
- * - Removes near-duplicate memories (dot product > 0.92) keeping the highest-importance one.
215
+ * - Removes near-duplicate memories (cosine >= 0.92 AND >= 80% word overlap)
216
+ * keeping the highest-importance one. The text gate matters: templated agent
217
+ * memories ("The user's X is Y") sit at ~0.95 cosine while being distinct, and
218
+ * deleting those is unrecoverable.
120
219
  * - Promotes importance of frequently-needed memories (recall_count >= 5) by +0.1.
121
220
  * - Optionally prunes stale, low-importance, never-recalled memories (RAG_PRUNE=1,
122
221
  * RAG_PRUNE_IMPORTANCE=0.2, RAG_PRUNE_AGE_DAYS=90). Off by default — deletes are irreversible.
123
222
  */
124
223
  export async function consolidate() {
125
224
  const db = getDB();
126
- const rows = db.prepare("SELECT id, embedding FROM memories").all();
127
- const records = rows
128
- .map((r) => ({ id: r.id, rec: getMemory(r.id) }))
129
- .filter((r) => r.rec !== null && r.rec !== undefined);
130
- const recordsById = new Map(records.map((r) => [r.id, r.rec]));
225
+ // ORDER BY so the dedup anchor (and therefore the survivor) is deterministic:
226
+ // scan order can change with the query plan and flip which memory survives.
227
+ const rows = db
228
+ .prepare(`SELECT ${MEMORY_COLUMNS}, embedding FROM memories ORDER BY importance DESC, created_at, id`)
229
+ .all();
131
230
  const vectors = [];
132
231
  for (const r of rows) {
133
- if (!recordsById.has(r.id))
134
- continue;
135
232
  const vec = unpackVector(r.embedding);
136
233
  if (vec)
137
234
  vectors.push({ id: r.id, vec });
138
235
  }
236
+ const records = new Map(toRecords(rows).map((r) => [r.id, r]));
139
237
  let removedDuplicates = 0;
238
+ const skippedDedup = vectors.length > DEDUP_MAX_VECTORS;
140
239
  const toDelete = new Set();
141
- for (let i = 0; i < vectors.length; i++) {
142
- if (toDelete.has(vectors[i].id))
143
- continue;
144
- for (let j = i + 1; j < vectors.length; j++) {
145
- if (toDelete.has(vectors[j].id))
240
+ if (!skippedDedup) {
241
+ for (let i = 0; i < vectors.length; i++) {
242
+ if (toDelete.has(vectors[i].id))
146
243
  continue;
147
- const sim = dotProduct(vectors[i].vec, vectors[j].vec);
148
- if (sim >= 0.92) {
149
- const a = recordsById.get(vectors[i].id);
150
- const b = recordsById.get(vectors[j].id);
244
+ for (let j = i + 1; j < vectors.length; j++) {
245
+ if (toDelete.has(vectors[j].id))
246
+ continue;
247
+ if (dotProduct(vectors[i].vec, vectors[j].vec) < DEDUP_SIMILARITY)
248
+ continue;
249
+ const a = records.get(vectors[i].id);
250
+ const b = records.get(vectors[j].id);
251
+ if (!a || !b || tokenOverlap(a.content, b.content) < DEDUP_TOKEN_OVERLAP)
252
+ continue;
151
253
  if (a.importance >= b.importance) {
152
- toDelete.add(vectors[j].id);
254
+ toDelete.add(b.id);
153
255
  }
154
256
  else {
155
- toDelete.add(vectors[i].id);
156
- const tmpId = vectors[i].id;
157
- vectors[i].id = vectors[j].id;
158
- vectors[j].id = tmpId;
257
+ toDelete.add(a.id);
258
+ // Swap the WHOLE entry, not just the id: swapping ids alone leaves
259
+ // vectors[i] holding the survivor's id with the *deleted* memory's
260
+ // embedding, so a later comparison gates one memory's cosine on
261
+ // another's vector and deletes distinct memories.
262
+ const tmp = vectors[i];
263
+ vectors[i] = vectors[j];
264
+ vectors[j] = tmp;
159
265
  }
160
266
  removedDuplicates++;
161
267
  }
162
268
  }
163
269
  }
164
270
  const delStmt = db.prepare("DELETE FROM memories WHERE id = ?");
165
- for (const id of toDelete)
166
- delStmt.run(id);
167
- let promoted = 0;
168
- const bumpPromotion = async () => {
169
- for (const rec of listMemories()) {
170
- if (rec.recallCount >= 5 && rec.importance < 1) {
171
- await updateMemory(rec.id, { importance: Math.min(1, rec.importance + 0.1) });
172
- promoted++;
271
+ // One transaction for the whole destructive pass. In autocommit each delete
272
+ // committed on its own, so a SQLITE_BUSY or crash midway left duplicates
273
+ // deleted but promotion (or the prune half) unapplied — unrecoverable and
274
+ // unreported, because the throw propagated instead of the counts.
275
+ db.exec("BEGIN IMMEDIATE;");
276
+ try {
277
+ for (const id of toDelete)
278
+ delStmt.run(id);
279
+ // One UPDATE for the whole store: the old per-row updateMemory() re-embedded
280
+ // every candidate (a full model inference each) and only saw the newest 100.
281
+ const promoted = Number(db
282
+ .prepare("UPDATE memories SET importance = min(1, importance + 0.1) WHERE recall_count >= 5 AND importance < 1")
283
+ .run().changes);
284
+ let pruned = 0;
285
+ const pruneEnabled = process.env.RAG_PRUNE === "1" || process.env.RAG_PRUNE === "true";
286
+ if (pruneEnabled) {
287
+ const minImp = numEnv("RAG_PRUNE_IMPORTANCE", 0.2, (n) => n >= 0 && n <= 1);
288
+ const maxAgeDays = numEnv("RAG_PRUNE_AGE_DAYS", 90, (n) => n >= 0);
289
+ const cutoff = nowMs() - maxAgeDays * 86_400_000;
290
+ const stale = db
291
+ // <= so RAG_PRUNE_AGE_DAYS=0 means "everything is stale"; a strict <
292
+ // skipped rows created in the same millisecond as the cutoff, which made
293
+ // the prune silently no-op on a fast machine.
294
+ .prepare("SELECT id FROM memories WHERE importance < ? AND recall_count = 0 AND created_at <= ?")
295
+ .all(minImp, cutoff);
296
+ for (const s of stale) {
297
+ delStmt.run(s.id);
298
+ pruned++;
173
299
  }
174
300
  }
175
- };
176
- let pruned = 0;
177
- const pruneEnabled = process.env.RAG_PRUNE === "1" || process.env.RAG_PRUNE === "true";
178
- if (pruneEnabled) {
179
- const minImp = Number(process.env.RAG_PRUNE_IMPORTANCE ?? 0.2);
180
- const maxAgeDays = Number(process.env.RAG_PRUNE_AGE_DAYS ?? 90);
181
- const cutoff = nowMs() - maxAgeDays * 86_400_000;
182
- const stale = db
183
- .prepare("SELECT id FROM memories WHERE importance < ? AND recall_count = 0 AND created_at < ?")
184
- .all(minImp, cutoff);
185
- for (const s of stale) {
186
- delStmt.run(s.id);
187
- pruned++;
301
+ db.exec("COMMIT;");
302
+ // Deleted rows must leave the vector cache, or the next search still scores
303
+ // them and can return a memory that no longer exists.
304
+ if (removedDuplicates > 0 || pruned > 0)
305
+ invalidateVectorCache();
306
+ const stats = memoryStats();
307
+ return {
308
+ removedDuplicates,
309
+ promoted,
310
+ pruned,
311
+ skippedDedup,
312
+ totals: { memories: stats.memories, tokens: stats.tokens },
313
+ };
314
+ }
315
+ catch (e) {
316
+ try {
317
+ db.exec("ROLLBACK;");
188
318
  }
319
+ catch {
320
+ /* transaction already closed */
321
+ }
322
+ throw e;
189
323
  }
190
- await bumpPromotion();
191
- invalidateVectorCache();
192
- const stats = memoryStats();
193
- return {
194
- removedDuplicates,
195
- promoted,
196
- pruned,
197
- totals: { memories: stats.memories, tokens: stats.tokens },
198
- };
199
324
  }
200
325
  export function memoryStats() {
201
326
  const db = getDB();
@@ -205,10 +330,15 @@ export function memoryStats() {
205
330
  const byType = {};
206
331
  for (const r of byTypeRows)
207
332
  byType[r.type] = r.c;
208
- let totalTokens = 0;
209
- for (const r of db.prepare("SELECT content FROM memories").all()) {
210
- totalTokens += estimateTokens(r.content);
333
+ // LENGTH() in SQL: loading every content blob just to count tokens was a full
334
+ // table pull on each system_stats / memory_stats call. Keep the char count in
335
+ // SQL and estimate here — materialising "x".repeat(n) per row re-allocated the
336
+ // very blobs this was meant to avoid.
337
+ let chars = 0;
338
+ for (const r of db.prepare("SELECT LENGTH(content) AS n FROM memories").all()) {
339
+ chars += Math.max(0, r.n ?? 0);
211
340
  }
341
+ const totalTokens = estimateTokensFromChars(chars);
212
342
  return { memories: count.c, tokens: totalTokens, avgImportance: avg.a, byType };
213
343
  }
214
344
  export async function contextPrompt(query, topK = 6) {
@@ -219,6 +349,8 @@ export async function contextPrompt(query, topK = 6) {
219
349
  return { context: lines.join("\n"), sources: hits };
220
350
  }
221
351
  function clampImportance(v) {
352
+ if (!Number.isFinite(v))
353
+ return 0.5;
222
354
  return Math.min(1, Math.max(0, v));
223
355
  }
224
356
  //# sourceMappingURL=memory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory/memory.ts"],"names":[],"mappings":"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"}
@@ -13,4 +13,11 @@ export interface ChunkOptions {
13
13
  export declare function chunkText(text: string, options?: ChunkOptions): Chunk[];
14
14
  /** Rough token estimate: ~4 chars per token for latin, ~1.5 for CJK. */
15
15
  export declare function estimateTokens(text: string): number;
16
+ /**
17
+ * Same estimate for an already-known character count. Lets a caller total
18
+ * LENGTH() across many rows in SQL instead of materialising each content
19
+ * blob just to re-count its characters. Assumes no CJK in the total, which
20
+ * under-counts CJK-heavy stores — the same tradeoff the SQL path already made.
21
+ */
22
+ export declare function estimateTokensFromChars(chars: number): number;
16
23
  //# sourceMappingURL=chunker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/rag/chunker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,KAAK,EAAE,CA6C3E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD"}
1
+ {"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/rag/chunker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwHD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,KAAK,EAAE,CAiF3E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7D"}