@traqr/memory 0.2.33 → 0.2.34
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/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/classification-enforcement.integration.test.d.ts +7 -5
- package/dist/lib/classification-enforcement.integration.test.js +26 -48
- package/dist/lib/classification-enforcement.integration.test.js.map +1 -1
- package/dist/lib/retrieval.d.ts +24 -66
- package/dist/lib/retrieval.js +38 -315
- package/dist/lib/retrieval.js.map +1 -1
- package/dist/lib/retrieval.test.d.ts +8 -6
- package/dist/lib/retrieval.test.js +13 -67
- package/dist/lib/retrieval.test.js.map +1 -1
- package/dist/routes/search.js +4 -3
- package/dist/routes/search.js.map +1 -1
- package/dist/vectordb/postgres.d.ts +1 -23
- package/dist/vectordb/postgres.js +0 -78
- package/dist/vectordb/postgres.js.map +1 -1
- package/dist/vectordb/supabase.d.ts +1 -23
- package/dist/vectordb/supabase.js +0 -101
- package/dist/vectordb/supabase.js.map +1 -1
- package/dist/vectordb/types.d.ts +0 -47
- package/dist/vectordb/types.js.map +1 -1
- package/package.json +1 -1
- package/setup.sql +6 -178
package/dist/lib/retrieval.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Retrieval — semantic search + classification ceiling + exact-ID recall.
|
|
3
3
|
*
|
|
4
|
-
* SearchOrchestrator for Memory Engine v2.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* SearchOrchestrator for Memory Engine v2. Semantic is the ONLY strategy:
|
|
5
|
+
* the bm25/temporal/graph fusion legs (TD-158/159/160) were dead in prod for
|
|
6
|
+
* months (42P01 — see TD-894) and were torn down in TD-906 Slice C. The one
|
|
7
|
+
* proven BM25 upside — exact-ID/acronym recall — was reclaimed semantically
|
|
8
|
+
* in TD-906 Slice B (step 6.7 below). RRF scoring is retained as the ranking
|
|
9
|
+
* contract (rank-monotonic over the single strategy).
|
|
7
10
|
*/
|
|
8
11
|
import { getVectorDB } from '../vectordb/index.js';
|
|
9
12
|
import { generateEmbedding, formatEmbeddingForPgVector } from './embeddings.js';
|
|
@@ -54,12 +57,13 @@ export function reciprocalRankFusion(strategyResults, k = 60, topN = 20) {
|
|
|
54
57
|
/**
|
|
55
58
|
* Drop any result whose classification exceeds the ceiling for the caller.
|
|
56
59
|
*
|
|
57
|
-
* TD-810:
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
60
|
+
* TD-810 origin: the (since torn-down, TD-906 Slice C) bm25/temporal/graph
|
|
61
|
+
* legs and their getById hydration were classification-BLIND, so this
|
|
62
|
+
* post-filter closed that leak at the result boundary. It is RETAINED as the
|
|
63
|
+
* defense-in-depth backstop on the live path: the semantic RPC already
|
|
64
|
+
* DB-filters on p_max_classification, but step 6.5 re-enforces the ceiling at
|
|
65
|
+
* the boundary and step 6.7 (exact-ID augmentation) depends on it to never
|
|
66
|
+
* widen the caller's tier (integration-test Sections 1 + 1b pin both).
|
|
63
67
|
*
|
|
64
68
|
* FAIL-SAFE: when neither maxClassification nor accessLevel is provided there is
|
|
65
69
|
* no ceiling, so the input is returned UNCHANGED (byte-identical to pre-TD-810).
|
|
@@ -199,220 +203,18 @@ export function appendExactIdMatches(head, matches, topN) {
|
|
|
199
203
|
return [...head.slice(0, keepHead), ...capped];
|
|
200
204
|
}
|
|
201
205
|
// ---------------------------------------------------------------------------
|
|
202
|
-
// Strategy Detection (TD-159)
|
|
203
|
-
// ---------------------------------------------------------------------------
|
|
204
|
-
const DATE_PATTERNS = [
|
|
205
|
-
/\b(yesterday|today|last\s+(week|month|day|year))\b/i,
|
|
206
|
-
/\b(this\s+(week|month|year))\b/i,
|
|
207
|
-
/\b\d{4}-\d{2}(-\d{2})?\b/, // 2026-03-15 or 2026-03
|
|
208
|
-
/\b(january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{4}\b/i,
|
|
209
|
-
/\b(in\s+\d{4})\b/i, // "in 2020"
|
|
210
|
-
/\b(\d+\s+(days?|weeks?|months?|years?)\s+ago)\b/i, // "3 months ago"
|
|
211
|
-
/\b(recent(ly)?|lately|earlier)\b/i,
|
|
212
|
-
];
|
|
213
|
-
/**
|
|
214
|
-
* Detect which search strategies should be activated for a query.
|
|
215
|
-
*
|
|
216
|
-
* TD-894 Path B (Sean-approved, Granola "Ultracode response 2" 2026-06-22:
|
|
217
|
-
* "Let's do infrastructure… let's do Path B. I trust your guidance… there's a
|
|
218
|
-
* ton of bloat in here"): the auto-detected default is now SEMANTIC-ONLY.
|
|
219
|
-
*
|
|
220
|
-
* Why: `bm25_search`/`temporal_search`/`graph_search` all carry `search_path=''`
|
|
221
|
-
* with unqualified table refs → every live call throws 42P01 (swallowed to []),
|
|
222
|
-
* so BM25/temporal/graph fusion has been a production no-op for months while
|
|
223
|
-
* still paying per-search dead RPC round-trips. The recall A/B on a *repaired*
|
|
224
|
-
* BM25 also showed equal-weight RRF evicting Sean's curated steering memories on
|
|
225
|
-
* conceptual queries (q08), so re-enabling as-is would regress recall. Per Path B
|
|
226
|
-
* we stop invoking the dead legs by default and reclaim the 21 MB of GIN indexes
|
|
227
|
-
* (migration 021); TD-587 (the never-ran hybrid) is superseded.
|
|
228
|
-
*
|
|
229
|
-
* The bm25/temporal/graph legs in searchMemoriesV2 remain reachable via an
|
|
230
|
-
* explicit `options.strategies` override (preserves the TD-810/885 classification
|
|
231
|
-
* regression test + any deliberate caller); they are simply no longer auto-on.
|
|
232
|
-
* `entityIds`/`temporalRange` are still returned so an override caller can drive
|
|
233
|
-
* graph/temporal, but they no longer flip a strategy on by themselves.
|
|
234
|
-
*/
|
|
235
|
-
export function detectStrategies(query, entityIds) {
|
|
236
|
-
const strategies = ['semantic'];
|
|
237
|
-
// Date pattern still parsed so an explicit temporal-override caller gets a
|
|
238
|
-
// range, but it no longer auto-activates the (dead) temporal leg.
|
|
239
|
-
const hasDatePattern = DATE_PATTERNS.some((p) => p.test(query));
|
|
240
|
-
const temporalRange = hasDatePattern ? parseTemporalRange(query) : undefined;
|
|
241
|
-
return {
|
|
242
|
-
strategies,
|
|
243
|
-
temporalRange,
|
|
244
|
-
graphSeedIds: entityIds,
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Parse temporal references in a query to a date range.
|
|
249
|
-
* Falls back to 30-day lookback for ambiguous patterns.
|
|
250
|
-
*/
|
|
251
|
-
export function parseTemporalRange(query) {
|
|
252
|
-
const now = new Date();
|
|
253
|
-
const end = now;
|
|
254
|
-
// "yesterday"
|
|
255
|
-
if (/\byesterday\b/i.test(query)) {
|
|
256
|
-
const start = new Date(now);
|
|
257
|
-
start.setDate(start.getDate() - 1);
|
|
258
|
-
start.setHours(0, 0, 0, 0);
|
|
259
|
-
return { start, end };
|
|
260
|
-
}
|
|
261
|
-
// "last week/month/year"
|
|
262
|
-
const lastMatch = query.match(/\blast\s+(week|month|year|day)\b/i);
|
|
263
|
-
if (lastMatch) {
|
|
264
|
-
const start = new Date(now);
|
|
265
|
-
switch (lastMatch[1].toLowerCase()) {
|
|
266
|
-
case 'day':
|
|
267
|
-
start.setDate(start.getDate() - 1);
|
|
268
|
-
break;
|
|
269
|
-
case 'week':
|
|
270
|
-
start.setDate(start.getDate() - 7);
|
|
271
|
-
break;
|
|
272
|
-
case 'month':
|
|
273
|
-
start.setMonth(start.getMonth() - 1);
|
|
274
|
-
break;
|
|
275
|
-
case 'year':
|
|
276
|
-
start.setFullYear(start.getFullYear() - 1);
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
return { start, end };
|
|
280
|
-
}
|
|
281
|
-
// "N days/weeks/months/years ago"
|
|
282
|
-
const agoMatch = query.match(/\b(\d+)\s+(days?|weeks?|months?|years?)\s+ago\b/i);
|
|
283
|
-
if (agoMatch) {
|
|
284
|
-
const n = parseInt(agoMatch[1], 10);
|
|
285
|
-
const unit = agoMatch[2].toLowerCase().replace(/s$/, '');
|
|
286
|
-
const start = new Date(now);
|
|
287
|
-
switch (unit) {
|
|
288
|
-
case 'day':
|
|
289
|
-
start.setDate(start.getDate() - n);
|
|
290
|
-
break;
|
|
291
|
-
case 'week':
|
|
292
|
-
start.setDate(start.getDate() - n * 7);
|
|
293
|
-
break;
|
|
294
|
-
case 'month':
|
|
295
|
-
start.setMonth(start.getMonth() - n);
|
|
296
|
-
break;
|
|
297
|
-
case 'year':
|
|
298
|
-
start.setFullYear(start.getFullYear() - n);
|
|
299
|
-
break;
|
|
300
|
-
}
|
|
301
|
-
return { start, end };
|
|
302
|
-
}
|
|
303
|
-
// "March 2026" or "in 2026"
|
|
304
|
-
const monthYearMatch = query.match(/\b(january|february|march|april|may|june|july|august|september|october|november|december)\s+(\d{4})\b/i);
|
|
305
|
-
if (monthYearMatch) {
|
|
306
|
-
const months = {
|
|
307
|
-
january: 0, february: 1, march: 2, april: 3, may: 4, june: 5,
|
|
308
|
-
july: 6, august: 7, september: 8, october: 9, november: 10, december: 11,
|
|
309
|
-
};
|
|
310
|
-
const month = months[monthYearMatch[1].toLowerCase()];
|
|
311
|
-
const year = parseInt(monthYearMatch[2], 10);
|
|
312
|
-
const start = new Date(year, month, 1);
|
|
313
|
-
const monthEnd = new Date(year, month + 1, 0, 23, 59, 59, 999);
|
|
314
|
-
return { start, end: monthEnd };
|
|
315
|
-
}
|
|
316
|
-
// "2026-03-15" or "2026-03"
|
|
317
|
-
const isoMatch = query.match(/\b(\d{4})-(\d{2})(?:-(\d{2}))?\b/);
|
|
318
|
-
if (isoMatch) {
|
|
319
|
-
const year = parseInt(isoMatch[1], 10);
|
|
320
|
-
const month = parseInt(isoMatch[2], 10) - 1;
|
|
321
|
-
if (isoMatch[3]) {
|
|
322
|
-
const day = parseInt(isoMatch[3], 10);
|
|
323
|
-
const start = new Date(year, month, day, 0, 0, 0, 0);
|
|
324
|
-
const dayEnd = new Date(year, month, day, 23, 59, 59, 999);
|
|
325
|
-
return { start, end: dayEnd };
|
|
326
|
-
}
|
|
327
|
-
const start = new Date(year, month, 1);
|
|
328
|
-
const monthEnd = new Date(year, month + 1, 0, 23, 59, 59, 999);
|
|
329
|
-
return { start, end: monthEnd };
|
|
330
|
-
}
|
|
331
|
-
// "in 2020"
|
|
332
|
-
const yearMatch = query.match(/\bin\s+(\d{4})\b/i);
|
|
333
|
-
if (yearMatch) {
|
|
334
|
-
const year = parseInt(yearMatch[1], 10);
|
|
335
|
-
return { start: new Date(year, 0, 1), end: new Date(year, 11, 31, 23, 59, 59, 999) };
|
|
336
|
-
}
|
|
337
|
-
// Default: 30-day lookback
|
|
338
|
-
const start = new Date(now);
|
|
339
|
-
start.setDate(start.getDate() - 30);
|
|
340
|
-
return { start, end };
|
|
341
|
-
}
|
|
342
|
-
// ---------------------------------------------------------------------------
|
|
343
|
-
// Entity Resolution from Query (TD-180)
|
|
344
|
-
// ---------------------------------------------------------------------------
|
|
345
|
-
const STOPWORDS = new Set([
|
|
346
|
-
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
347
|
-
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
|
|
348
|
-
'should', 'may', 'might', 'shall', 'can', 'need', 'must',
|
|
349
|
-
'how', 'what', 'when', 'where', 'why', 'who', 'which', 'that', 'this',
|
|
350
|
-
'about', 'with', 'from', 'into', 'for', 'and', 'or', 'but', 'not',
|
|
351
|
-
'of', 'in', 'on', 'at', 'to', 'by', 'up', 'if', 'so', 'no', 'my',
|
|
352
|
-
'i', 'me', 'we', 'you', 'he', 'she', 'it', 'they', 'them', 'our',
|
|
353
|
-
'your', 'his', 'her', 'its', 'their', 'all', 'each', 'any', 'some',
|
|
354
|
-
'say', 'said', 'tell', 'think', 'know', 'use', 'work', 'like',
|
|
355
|
-
]);
|
|
356
|
-
/**
|
|
357
|
-
* Find known entities mentioned in a search query.
|
|
358
|
-
* Tokenizes the query, filters stopwords, looks up against memory_entities.
|
|
359
|
-
* Returns entity IDs for graph search activation.
|
|
360
|
-
*/
|
|
361
|
-
export async function findEntitiesInQuery(query, provider) {
|
|
362
|
-
// Tokenize: split on spaces + punctuation, filter stopwords
|
|
363
|
-
const words = query
|
|
364
|
-
.split(/[\s,.!?;:'"()\[\]{}]+/)
|
|
365
|
-
.map((w) => w.trim())
|
|
366
|
-
.filter((w) => w.length > 1 && !STOPWORDS.has(w.toLowerCase()));
|
|
367
|
-
// Also extract bigrams for multi-word entity names
|
|
368
|
-
const rawWords = query.split(/\s+/);
|
|
369
|
-
const bigrams = [];
|
|
370
|
-
for (let i = 0; i < rawWords.length - 1; i++) {
|
|
371
|
-
bigrams.push(`${rawWords[i]} ${rawWords[i + 1]}`);
|
|
372
|
-
}
|
|
373
|
-
const allTokens = [...new Set([...words, ...bigrams])];
|
|
374
|
-
if (allTokens.length === 0)
|
|
375
|
-
return [];
|
|
376
|
-
try {
|
|
377
|
-
const entities = await provider.findEntitiesByNames(allTokens);
|
|
378
|
-
return entities.map((e) => e.id);
|
|
379
|
-
}
|
|
380
|
-
catch {
|
|
381
|
-
return [];
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
// ---------------------------------------------------------------------------
|
|
385
206
|
// Search Orchestrator (TD-160)
|
|
386
207
|
// ---------------------------------------------------------------------------
|
|
387
208
|
/**
|
|
388
|
-
*
|
|
389
|
-
*
|
|
390
|
-
* TD-894: the bm25/temporal/graph legs each `.catch(() => [])` on failure. When
|
|
391
|
-
* all three threw `42P01` (search_path='' + unqualified tables), fusion silently
|
|
392
|
-
* degraded to semantic-only and the no-op rotted undetected for MONTHS — the
|
|
393
|
-
* exact "silent proxy" failure the proxy-invariant warns about. A broken RPC
|
|
394
|
-
* errors on EVERY call, so warn-once-per-process keeps the signal loud without
|
|
395
|
-
* flooding logs on every search. (Semantic stays warn-always at its own call
|
|
396
|
-
* site — it's the critical leg; you want every transient failure, not just the
|
|
397
|
-
* first.)
|
|
398
|
-
*/
|
|
399
|
-
const warnedDeadStrategies = new Set();
|
|
400
|
-
function noteStrategyFailure(strategy, err) {
|
|
401
|
-
if (!warnedDeadStrategies.has(strategy)) {
|
|
402
|
-
warnedDeadStrategies.add(strategy);
|
|
403
|
-
console.warn(`[retrieval] "${strategy}" strategy failed — degrading to remaining strategies (warn-once/process):`, err);
|
|
404
|
-
}
|
|
405
|
-
return { strategy, items: [] };
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Multi-strategy search with RRF fusion.
|
|
209
|
+
* Semantic search with RRF-shaped scoring.
|
|
409
210
|
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
412
|
-
*
|
|
413
|
-
*
|
|
414
|
-
*
|
|
415
|
-
* Returns MemorySearchResult[] for backward
|
|
211
|
+
* SEMANTIC-ONLY: TD-894 Path B stopped auto-invoking the dead bm25/temporal/
|
|
212
|
+
* graph legs (42P01 in prod for months; re-enabling regressed curated-memory
|
|
213
|
+
* recall); TD-906 Slice C then removed the legs, their `options.strategies`
|
|
214
|
+
* override, and the getById hydration of non-semantic hits entirely. The one
|
|
215
|
+
* proven BM25 upside — exact-ID/acronym recall — lives on semantically at
|
|
216
|
+
* step 6.7 (TD-906 Slice B). Returns MemorySearchResult[] for backward
|
|
217
|
+
* compatibility.
|
|
416
218
|
*/
|
|
417
219
|
export async function searchMemoriesV2(query, options = {}) {
|
|
418
220
|
const db = getVectorDB();
|
|
@@ -426,24 +228,10 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
426
228
|
// Empty for ordinary prose → the semantic fetch is unchanged.
|
|
427
229
|
const exactIdTokens = extractExactIdTokens(query);
|
|
428
230
|
const semanticOverFetch = exactIdTokens.length > 0 ? Math.max(overFetchLimit, EXACT_ID_RECALL_POOL) : overFetchLimit;
|
|
429
|
-
// 0.5 Auto-resolve entities from query — ONLY when a caller explicitly opts
|
|
430
|
-
// into the graph leg via options.strategies. TD-894 Path B made the default
|
|
431
|
-
// path semantic-only, so the per-search findEntitiesByNames round-trip (which
|
|
432
|
-
// exists solely to seed the dead `graph_search`) is pure overhead otherwise.
|
|
433
|
-
let resolvedEntityIds = options.entityIds || [];
|
|
434
|
-
const wantsGraph = options.strategies?.includes('graph') ?? false;
|
|
435
|
-
if (wantsGraph && resolvedEntityIds.length === 0) {
|
|
436
|
-
resolvedEntityIds = await findEntitiesInQuery(query, provider);
|
|
437
|
-
}
|
|
438
|
-
// 1. Detect strategies (with resolved entity IDs)
|
|
439
|
-
const detected = options.strategies
|
|
440
|
-
? { strategies: options.strategies, temporalRange: undefined, graphSeedIds: resolvedEntityIds }
|
|
441
|
-
: detectStrategies(query, resolvedEntityIds);
|
|
442
231
|
// 2. Generate embedding ONCE
|
|
443
232
|
const embeddingResult = await generateEmbedding(query);
|
|
444
233
|
const embeddingStr = formatEmbeddingForPgVector(embeddingResult.embedding);
|
|
445
|
-
// 3. Run
|
|
446
|
-
// Keep full semantic results for hydration + BM25 content for reranking
|
|
234
|
+
// 3. Run the semantic strategy (keep the full results for hydration).
|
|
447
235
|
//
|
|
448
236
|
// TD-885 regression-guard fidelity: the classification post-filter (step 6.5)
|
|
449
237
|
// is exercised end-to-end by classification-enforcement.integration.test.ts via
|
|
@@ -452,10 +240,8 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
452
240
|
// fakeProvider — otherwise its "0 over-tier rows across every path" assertion
|
|
453
241
|
// passes blind to the new path, and a classification leak ships green.
|
|
454
242
|
let semanticFullResults = [];
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
if (detected.strategies.includes('semantic')) {
|
|
458
|
-
strategyPromises.push(provider
|
|
243
|
+
const strategyResults = [
|
|
244
|
+
await provider
|
|
459
245
|
.search(query, {
|
|
460
246
|
...options,
|
|
461
247
|
limit: semanticOverFetch,
|
|
@@ -471,53 +257,11 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
471
257
|
.catch((err) => {
|
|
472
258
|
console.warn('[retrieval] Semantic search failed:', err);
|
|
473
259
|
return { strategy: 'semantic', items: [] };
|
|
474
|
-
})
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
category: options.category,
|
|
480
|
-
limit: overFetchLimit,
|
|
481
|
-
})
|
|
482
|
-
.then((results) => {
|
|
483
|
-
bm25ContentMap = new Map(results.map((r) => [r.id, r.content]));
|
|
484
|
-
return {
|
|
485
|
-
strategy: 'bm25',
|
|
486
|
-
items: results.map((r, i) => ({ id: r.id, rank: i + 1 })),
|
|
487
|
-
};
|
|
488
|
-
})
|
|
489
|
-
.catch((err) => noteStrategyFailure('bm25', err)));
|
|
490
|
-
}
|
|
491
|
-
if (detected.strategies.includes('temporal') && detected.temporalRange) {
|
|
492
|
-
strategyPromises.push(provider
|
|
493
|
-
.temporalSearch(query, detected.temporalRange.start, detected.temporalRange.end, {
|
|
494
|
-
limit: overFetchLimit,
|
|
495
|
-
precomputedEmbedding: embeddingStr,
|
|
496
|
-
})
|
|
497
|
-
.then((results) => ({
|
|
498
|
-
strategy: 'temporal',
|
|
499
|
-
items: results.map((r, i) => ({ id: r.id, rank: i + 1 })),
|
|
500
|
-
}))
|
|
501
|
-
.catch((err) => noteStrategyFailure('temporal', err)));
|
|
502
|
-
}
|
|
503
|
-
if (detected.strategies.includes('graph') && detected.graphSeedIds?.length) {
|
|
504
|
-
strategyPromises.push(provider
|
|
505
|
-
.graphSearch(detected.graphSeedIds, {
|
|
506
|
-
limit: overFetchLimit,
|
|
507
|
-
})
|
|
508
|
-
.then((results) => ({
|
|
509
|
-
strategy: 'graph',
|
|
510
|
-
items: results.map((r, i) => ({ id: r.id, rank: i + 1 })),
|
|
511
|
-
}))
|
|
512
|
-
.catch((err) => noteStrategyFailure('graph', err)));
|
|
513
|
-
}
|
|
514
|
-
// 4. Fuse via RRF
|
|
515
|
-
const strategyResults = await Promise.all(strategyPromises);
|
|
516
|
-
// Observability: log when entities activate graph search
|
|
517
|
-
if (resolvedEntityIds.length > 0) {
|
|
518
|
-
const strategyLog = strategyResults.map((sr) => `${sr.strategy}:${sr.items.length}`).join(', ');
|
|
519
|
-
console.error(`[retrieval] q="${query.slice(0, 50)}" strategies=[${strategyLog}] entities=${resolvedEntityIds.length}`);
|
|
520
|
-
}
|
|
260
|
+
}),
|
|
261
|
+
];
|
|
262
|
+
// 4. Score via RRF — with a single strategy this is a rank-monotonic
|
|
263
|
+
// pass-through of the semantic order; kept as the scoring contract.
|
|
264
|
+
//
|
|
521
265
|
// TD-810: when a classification ceiling will apply, over-fetch the fused pool
|
|
522
266
|
// so the post-filter can drop over-tier rows and still return up to topN.
|
|
523
267
|
// No accessLevel/maxClassification → fuseLimit === topN → behavior unchanged.
|
|
@@ -529,7 +273,7 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
529
273
|
// 4.5 Optional: Cohere rerank (graceful — skips if no API key)
|
|
530
274
|
const rerankDocs = fused.map((f) => ({
|
|
531
275
|
id: f.id,
|
|
532
|
-
content: semanticFullResults.find((r) => r.id === f.id)?.content ||
|
|
276
|
+
content: semanticFullResults.find((r) => r.id === f.id)?.content || '',
|
|
533
277
|
})).filter((d) => d.content.length > 0);
|
|
534
278
|
if (rerankDocs.length > 0) {
|
|
535
279
|
const reranked = await cohereRerank(query, rerankDocs, topN);
|
|
@@ -544,10 +288,12 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
544
288
|
fused.sort((a, b) => b.normalizedScore - a.normalizedScore);
|
|
545
289
|
}
|
|
546
290
|
}
|
|
547
|
-
// 5. Hydrate: map fused items to full MemorySearchResult
|
|
291
|
+
// 5. Hydrate: map fused items to full MemorySearchResult. Every fused id
|
|
292
|
+
// comes from the semantic pool by construction (semantic is the only
|
|
293
|
+
// strategy), so no secondary getById hydration exists anymore (TD-906
|
|
294
|
+
// Slice C removed the classification-blind hydration of non-semantic hits).
|
|
548
295
|
const semanticMap = new Map(semanticFullResults.map((r) => [r.id, r]));
|
|
549
296
|
const hydratedResults = [];
|
|
550
|
-
const idsToFetch = [];
|
|
551
297
|
for (const item of fused) {
|
|
552
298
|
const semantic = semanticMap.get(item.id);
|
|
553
299
|
if (semantic) {
|
|
@@ -556,36 +302,13 @@ export async function searchMemoriesV2(query, options = {}) {
|
|
|
556
302
|
relevanceScore: item.normalizedScore,
|
|
557
303
|
});
|
|
558
304
|
}
|
|
559
|
-
else {
|
|
560
|
-
idsToFetch.push({ id: item.id, normalizedScore: item.normalizedScore });
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
// Fetch non-semantic results by ID (BM25/graph-only hits)
|
|
564
|
-
if (idsToFetch.length > 0) {
|
|
565
|
-
const fetched = await Promise.all(
|
|
566
|
-
// TD-884: thread the ceiling so non-semantic (BM25/graph) hydration never
|
|
567
|
-
// decrypts over-tier content — the getById choke-point also redacts these as
|
|
568
|
-
// null, ahead of the applyClassificationCeiling drop below (defense-in-depth).
|
|
569
|
-
idsToFetch.map(({ id }) => provider
|
|
570
|
-
.getById(id, { accessLevel: options.accessLevel, maxClassification: options.maxClassification })
|
|
571
|
-
.catch(() => null)));
|
|
572
|
-
for (let i = 0; i < fetched.length; i++) {
|
|
573
|
-
const memory = fetched[i];
|
|
574
|
-
if (!memory)
|
|
575
|
-
continue;
|
|
576
|
-
hydratedResults.push({
|
|
577
|
-
...memory,
|
|
578
|
-
currentConfidence: memory.originalConfidence,
|
|
579
|
-
similarity: 0,
|
|
580
|
-
relevanceScore: idsToFetch[i].normalizedScore,
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
305
|
}
|
|
584
306
|
// 6. Final sort by RRF score
|
|
585
307
|
hydratedResults.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
586
308
|
// 6.5 TD-810: defense-in-depth classification choke point. Drops any row above
|
|
587
|
-
// the caller's ceiling —
|
|
588
|
-
//
|
|
309
|
+
// the caller's ceiling at the result boundary — the semantic RPC already
|
|
310
|
+
// DB-filters, so this is the fail-safe backstop (see applyClassificationCeiling
|
|
311
|
+
// docstring). Fail-safe: no ceiling → unchanged.
|
|
589
312
|
const filtered = applyClassificationCeiling(hydratedResults, options.accessLevel, options.maxClassification);
|
|
590
313
|
const finalResults = filtered.slice(0, topN);
|
|
591
314
|
// 6.7 TD-906 Slice B — exact-ID/acronym recall augmentation (augment-not-rerank).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../../src/lib/retrieval.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../../src/lib/retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Retrieval — RRF
|
|
2
|
+
* Retrieval — RRF scoring + exact-ID recall augmentation tests.
|
|
3
3
|
*
|
|
4
|
-
* Covers the pure, deterministic core of searchMemoriesV2
|
|
5
|
-
* reciprocalRankFusion
|
|
6
|
-
* + DB-backed
|
|
7
|
-
* + COHERE_API_KEY); these tests pin
|
|
8
|
-
* memory search fleet-wide.
|
|
4
|
+
* Covers the pure, deterministic core of searchMemoriesV2:
|
|
5
|
+
* reciprocalRankFusion (the scoring contract) and the TD-906 Slice B exact-ID
|
|
6
|
+
* helpers. The Cohere rerank + DB-backed semantic search are exercised
|
|
7
|
+
* separately (they require a live provider + COHERE_API_KEY); these tests pin
|
|
8
|
+
* the math that runs on every memory search fleet-wide. (detectStrategies /
|
|
9
|
+
* parseTemporalRange / the bm25/temporal/graph legs were removed in TD-906
|
|
10
|
+
* Slice C — semantic is the only strategy.)
|
|
9
11
|
*
|
|
10
12
|
* Run: npx tsx packages/memory/src/lib/retrieval.test.ts
|
|
11
13
|
*/
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Retrieval — RRF
|
|
2
|
+
* Retrieval — RRF scoring + exact-ID recall augmentation tests.
|
|
3
3
|
*
|
|
4
|
-
* Covers the pure, deterministic core of searchMemoriesV2
|
|
5
|
-
* reciprocalRankFusion
|
|
6
|
-
* + DB-backed
|
|
7
|
-
* + COHERE_API_KEY); these tests pin
|
|
8
|
-
* memory search fleet-wide.
|
|
4
|
+
* Covers the pure, deterministic core of searchMemoriesV2:
|
|
5
|
+
* reciprocalRankFusion (the scoring contract) and the TD-906 Slice B exact-ID
|
|
6
|
+
* helpers. The Cohere rerank + DB-backed semantic search are exercised
|
|
7
|
+
* separately (they require a live provider + COHERE_API_KEY); these tests pin
|
|
8
|
+
* the math that runs on every memory search fleet-wide. (detectStrategies /
|
|
9
|
+
* parseTemporalRange / the bm25/temporal/graph legs were removed in TD-906
|
|
10
|
+
* Slice C — semantic is the only strategy.)
|
|
9
11
|
*
|
|
10
12
|
* Run: npx tsx packages/memory/src/lib/retrieval.test.ts
|
|
11
13
|
*/
|
|
12
|
-
import { reciprocalRankFusion,
|
|
14
|
+
import { reciprocalRankFusion, extractExactIdTokens, findExactIdMatches, appendExactIdMatches, } from './retrieval.js';
|
|
13
15
|
let passed = 0;
|
|
14
16
|
let failed = 0;
|
|
15
17
|
function assert(label, condition) {
|
|
@@ -36,11 +38,13 @@ assert('empty strategies → []', reciprocalRankFusion([]).length === 0);
|
|
|
36
38
|
assert('top item normalizedScore === 1', fused[0].normalizedScore === 1);
|
|
37
39
|
assert('strategies tracked', fused[0].strategies.join() === 'semantic');
|
|
38
40
|
}
|
|
39
|
-
// Multi-
|
|
41
|
+
// Multi-list: an item in BOTH ranked lists outranks an item in only one
|
|
42
|
+
// (RRF is a pure utility over labeled rank lists; semantic is the only live
|
|
43
|
+
// strategy since TD-906 Slice C, but the math stays list-count-generic.)
|
|
40
44
|
{
|
|
41
45
|
const fused = reciprocalRankFusion([
|
|
42
46
|
{ strategy: 'semantic', items: [{ id: 'x', rank: 1 }, { id: 'y', rank: 2 }] },
|
|
43
|
-
{ strategy: '
|
|
47
|
+
{ strategy: 'other', items: [{ id: 'x', rank: 1 }, { id: 'z', rank: 2 }] },
|
|
44
48
|
]);
|
|
45
49
|
const x = fused.find((f) => f.id === 'x');
|
|
46
50
|
const y = fused.find((f) => f.id === 'y');
|
|
@@ -62,64 +66,6 @@ assert('empty strategies → []', reciprocalRankFusion([]).length === 0);
|
|
|
62
66
|
assert('rank 1 scores above rank 10', fused[0].id === 'first' && fused[0].rrfScore > fused[1].rrfScore);
|
|
63
67
|
}
|
|
64
68
|
// ============================================================
|
|
65
|
-
// detectStrategies
|
|
66
|
-
// ============================================================
|
|
67
|
-
console.log('\n--- detectStrategies ---');
|
|
68
|
-
// TD-894 Path B (Sean-approved 2026-06-22): the auto-detected default is now
|
|
69
|
-
// SEMANTIC-ONLY. bm25/temporal/graph are dead in prod (42P01) and no longer
|
|
70
|
-
// auto-activate; they stay reachable only via an explicit options.strategies
|
|
71
|
-
// override (exercised by classification-enforcement.integration.test.ts).
|
|
72
|
-
assert('default is semantic-only (no auto bm25/temporal/graph)', (() => {
|
|
73
|
-
const d = detectStrategies('what do we know about caching');
|
|
74
|
-
return (d.strategies.includes('semantic') &&
|
|
75
|
-
!d.strategies.includes('bm25') &&
|
|
76
|
-
!d.strategies.includes('temporal') &&
|
|
77
|
-
!d.strategies.includes('graph'));
|
|
78
|
-
})());
|
|
79
|
-
assert('date phrase no longer auto-activates the dead temporal leg', (() => {
|
|
80
|
-
const d = detectStrategies('what happened last week with the deploy');
|
|
81
|
-
return !d.strategies.includes('temporal');
|
|
82
|
-
})());
|
|
83
|
-
assert('date phrase still parses a temporalRange (for override callers)', (() => {
|
|
84
|
-
const d = detectStrategies('what happened last week with the deploy');
|
|
85
|
-
return d.temporalRange !== undefined;
|
|
86
|
-
})());
|
|
87
|
-
assert('entityIds no longer auto-activate the dead graph leg', (() => {
|
|
88
|
-
const d = detectStrategies('AVGO thesis', ['ent-1']);
|
|
89
|
-
return !d.strategies.includes('graph') && d.graphSeedIds?.length === 1;
|
|
90
|
-
})());
|
|
91
|
-
// ============================================================
|
|
92
|
-
// parseTemporalRange
|
|
93
|
-
// ============================================================
|
|
94
|
-
console.log('\n--- parseTemporalRange ---');
|
|
95
|
-
assert('"yesterday" → ~1 day window', (() => {
|
|
96
|
-
const { start, end } = parseTemporalRange('yesterday');
|
|
97
|
-
const days = (end.getTime() - start.getTime()) / 86400000;
|
|
98
|
-
return days >= 0.5 && days <= 2;
|
|
99
|
-
})());
|
|
100
|
-
assert('"last month" → ~30 day window', (() => {
|
|
101
|
-
const { start, end } = parseTemporalRange('last month');
|
|
102
|
-
return start < end && (end.getTime() - start.getTime()) > 20 * 86400000;
|
|
103
|
-
})());
|
|
104
|
-
assert('"3 days ago" → 3-day lookback', (() => {
|
|
105
|
-
const { start, end } = parseTemporalRange('something 3 days ago');
|
|
106
|
-
const days = Math.round((end.getTime() - start.getTime()) / 86400000);
|
|
107
|
-
return days === 3;
|
|
108
|
-
})());
|
|
109
|
-
assert('"March 2026" → month start', (() => {
|
|
110
|
-
const { start } = parseTemporalRange('the March 2026 print');
|
|
111
|
-
return start.getFullYear() === 2026 && start.getMonth() === 2 && start.getDate() === 1;
|
|
112
|
-
})());
|
|
113
|
-
assert('ISO "2026-03-15" → that day', (() => {
|
|
114
|
-
const { start } = parseTemporalRange('on 2026-03-15');
|
|
115
|
-
return start.getFullYear() === 2026 && start.getMonth() === 2 && start.getDate() === 15;
|
|
116
|
-
})());
|
|
117
|
-
assert('no date pattern → 30-day default', (() => {
|
|
118
|
-
const { start, end } = parseTemporalRange('no temporal words here');
|
|
119
|
-
const days = Math.round((end.getTime() - start.getTime()) / 86400000);
|
|
120
|
-
return days === 30;
|
|
121
|
-
})());
|
|
122
|
-
// ============================================================
|
|
123
69
|
// extractExactIdTokens (TD-906 Slice B)
|
|
124
70
|
// ============================================================
|
|
125
71
|
console.log('\n--- extractExactIdTokens ---');
|