@traqr/memory 0.2.33 → 0.2.35

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,9 +1,12 @@
1
1
  /**
2
- * Multi-Strategy Retrieval + RRF Fusion
2
+ * Retrieval — semantic search + classification ceiling + exact-ID recall.
3
3
  *
4
- * SearchOrchestrator for Memory Engine v2.
5
- * Combines semantic, BM25, temporal, and graph search via
6
- * Reciprocal Rank Fusion. Replaces single-strategy semantic search.
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: of the 4 retrieval strategies fused in searchMemoriesV2, only
58
- * `semantic` threads accessLevel to the DB (search_memories has
59
- * p_max_classification). bm25/temporal/graph and the getById hydration of
60
- * BM25/graph-only hits are classification-BLIND. So a confidential/restricted
61
- * row surfaced by any non-semantic strategy leaks regardless of accessLevel.
62
- * This is the post-filter that closes that gap at the result boundary.
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
- * Surface a dead/failing OPTIONAL retrieval strategy ONCE per process.
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
- * Default path is SEMANTIC-ONLY as of TD-894 Path B (see detectStrategies): the
411
- * bm25/temporal/graph legs are dead in prod (42P01) and re-enabling as-is
412
- * regresses curated-memory recall, so they no longer auto-activate. They remain
413
- * reachable and RRF-fused via an explicit `options.strategies` override,
414
- * which keeps the TD-810/885 classification post-filter exercised end-to-end.
415
- * Returns MemorySearchResult[] for backward compatibility.
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 active strategies in parallel
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
- let bm25ContentMap = new Map();
456
- const strategyPromises = [];
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
- if (detected.strategies.includes('bm25')) {
477
- strategyPromises.push(provider
478
- .bm25Search(query, {
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 || bm25ContentMap.get(f.id) || '',
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 — closing the leak from classification-blind strategies
588
- // (bm25/temporal/graph + getById hydration). Fail-safe: no ceiling → unchanged.
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AAwC3F,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,eAAiC,EACjC,IAAY,EAAE,EACd,OAAe,EAAE;IAEjB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsD,CAAA;IAE9E,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;YACzE,QAAQ,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;YACxC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;YACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,EAAE;QACF,QAAQ;QACR,eAAe,EAAE,CAAC;QAClB,UAAU;KACX,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAEjB,yBAAyB;IACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,0BAA0B,CACxC,OAAY,EACZ,WAA+B,EAC/B,iBAAwC;IAExC,yEAAyE;IACzE,yDAAyD;IACzD,MAAM,OAAO,GAAG,4BAA4B,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IAE5E,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IAE5B,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAEhD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAA;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAA2B,CAAC,CAAA;QAC7D,uEAAuE;QACvE,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,KAAK,CAAA;QACpC,OAAO,IAAI,IAAI,WAAW,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,WAA+B,EAC/B,iBAAwC;IAExC,OAAO,CACL,iBAAiB;QACjB,CAAC,WAAW,CAAC,CAAC,CAAC,+BAA+B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CACzE,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gCAAgC,CAC9C,WAA+B,EAC/B,iBAAwC;IAExC,MAAM,OAAO,GAAG,4BAA4B,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;IAC5E,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAChD,OAAQ,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAA4B,CAAC,MAAM,CACxE,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,WAAW,CACjD,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAA;AAEvC,qFAAqF;AACrF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACxE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IACzE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;CACnC,CAAC,CAAA;AAEF,0FAA0F;AAC1F,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACjD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACd,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAQ;QAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACf,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAA;AACpB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAEhC,IAAkB,EAAE,MAAyB,EAAE,UAA+B;IAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACxE,MAAM,GAAG,GAAQ,EAAE,CAAA;IACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QACpC,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;QACtF,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAkB,EAClB,OAAqB,EACrB,IAAY;IAEZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;AAChD,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,aAAa,GAAG;IACpB,qDAAqD;IACrD,iCAAiC;IACjC,0BAA0B,EAAyB,wBAAwB;IAC3E,sGAAsG;IACtG,mBAAmB,EAAiC,YAAY;IAChE,kDAAkD,EAAG,iBAAiB;IACtE,mCAAmC;CACpC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,SAAoB;IAEpB,MAAM,UAAU,GAAqB,CAAC,UAAU,CAAC,CAAA;IAEjD,2EAA2E;IAC3E,kEAAkE;IAClE,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/D,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE5E,OAAO;QACL,UAAU;QACV,aAAa;QACb,YAAY,EAAE,SAAS;KACxB,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,GAAG,GAAG,GAAG,CAAA;IAEf,cAAc;IACd,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;QAClC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IACvB,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAClE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,QAAQ,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnC,KAAK,KAAK;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YACrD,KAAK,MAAM;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YACtD,KAAK,OAAO;gBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YACzD,KAAK,MAAM;gBAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;QAChE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IACvB,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAA;IAChF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACxD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,KAAK;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YACrD,KAAK,MAAM;gBAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YAC1D,KAAK,OAAO;gBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;YACzD,KAAK,MAAM;gBAAE,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;gBAAC,MAAK;QAChE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IACvB,CAAC;IAED,4BAA4B;IAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAChC,wGAAwG,CACzG,CAAA;IACD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,MAAM,GAA2B;YACrC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YAC5D,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;SACzE,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;IACjC,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAChE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;YAC1D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;QAC/B,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;IACjC,CAAC;IAED,YAAY;IACZ,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IAClD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACvC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAA;IACtF,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;IACnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AACvB,CAAC;AAED,8EAA8E;AAC9E,wCAAwC;AACxC,8EAA8E;AAE9E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;IACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IACxD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK;IACjE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IAChE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;IAChE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAClE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;CAC9D,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,QAA0B;IAE1B,4DAA4D;IAC5D,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,uBAAuB,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAEjE,mDAAmD;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACnC,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACtD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAErC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAA;QAC9D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;AAC9C,SAAS,mBAAmB,CAAC,QAAgB,EAAE,GAAY;IACzD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClC,OAAO,CAAC,IAAI,CACV,gBAAgB,QAAQ,4EAA4E,EACpG,GAAG,CACJ,CAAA;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,UAA2B,EAAE;IAE7B,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IAExB,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAA;IAChC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA;IAC5B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAA;IAE/B,2EAA2E;IAC3E,+EAA+E;IAC/E,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,iBAAiB,GACrB,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;IAE5F,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,iBAAiB,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAA;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAA;IACjE,IAAI,UAAU,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,iBAAiB,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAChE,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU;QACjC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE;QAC/F,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAE9C,6BAA6B;IAC7B,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,YAAY,GAAG,0BAA0B,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAE1E,uCAAuC;IACvC,wEAAwE;IACxE,EAAE;IACF,8EAA8E;IAC9E,gFAAgF;IAChF,iFAAiF;IACjF,gFAAgF;IAChF,8EAA8E;IAC9E,uEAAuE;IACvE,IAAI,mBAAmB,GAAyB,EAAE,CAAA;IAClD,IAAI,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE9C,MAAM,gBAAgB,GAA8B,EAAE,CAAA;IAEtD,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,gBAAgB,CAAC,IAAI,CACnB,QAAQ;aACL,MAAM,CAAC,KAAK,EAAE;YACb,GAAG,OAAO;YACV,KAAK,EAAE,iBAAiB;YACxB,oBAAoB,EAAE,YAAY;SACnC,CAAC;aACD,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,mBAAmB,GAAG,OAAO,CAAA;YAC7B,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aAC1D,CAAA;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAA;YACxD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;QAC5C,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,gBAAgB,CAAC,IAAI,CACnB,QAAQ;aACL,UAAU,CAAC,KAAK,EAAE;YACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,cAAc;SACtB,CAAC;aACD,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChB,cAAc,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC/D,OAAO;gBACL,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;aAC1D,CAAA;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CACpD,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QACvE,gBAAgB,CAAC,IAAI,CACnB,QAAQ;aACL,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE;YAC/E,KAAK,EAAE,cAAc;YACrB,oBAAoB,EAAE,YAAY;SACnC,CAAC;aACD,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAClB,QAAQ,EAAE,UAAU;YACpB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC1D,CAAC,CAAC;aACF,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CACxD,CAAA;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3E,gBAAgB,CAAC,IAAI,CACnB,QAAQ;aACL,WAAW,CAAC,QAAQ,CAAC,YAAY,EAAE;YAClC,KAAK,EAAE,cAAc;SACtB,CAAC;aACD,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAClB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC1D,CAAC,CAAC;aACF,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CACrD,CAAA;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAE3D,yDAAyD;IACzD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/F,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,WAAW,cAAc,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAA;IACzH,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1F,MAAM,KAAK,GAAG,oBAAoB,CAAC,eAAe,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;IAEjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,OAAO,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;KACnG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEvC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;YACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC1C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBAC9B,IAAI,CAAC,eAAe,GAAG,WAAW,CAAA;gBACpC,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACtE,MAAM,eAAe,GAAyB,EAAE,CAAA;IAChD,MAAM,UAAU,GAA8C,EAAE,CAAA;IAEhE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzC,IAAI,QAAQ,EAAE,CAAC;YACb,eAAe,CAAC,IAAI,CAAC;gBACnB,GAAG,QAAQ;gBACX,cAAc,EAAE,IAAI,CAAC,eAAe;aACrC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG;QAC/B,0EAA0E;QAC1E,6EAA6E;QAC7E,+EAA+E;QAC/E,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CACxB,QAAQ;aACL,OAAO,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;aAC/F,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CACrB,CACF,CAAA;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;YACzB,IAAI,CAAC,MAAM;gBAAE,SAAQ;YACrB,eAAe,CAAC,IAAI,CAAC;gBACnB,GAAG,MAAM;gBACT,iBAAiB,EAAE,MAAM,CAAC,kBAAkB;gBAC5C,UAAU,EAAE,CAAC;gBACb,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe;aAC9C,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC,CAAA;IAEnE,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,MAAM,QAAQ,GAAG,0BAA0B,CAAC,eAAe,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAE5G,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAE5C,kFAAkF;IAClF,kFAAkF;IAClF,gFAAgF;IAChF,8EAA8E;IAC9E,+EAA+E;IAC/E,8EAA8E;IAC9E,mFAAmF;IACnF,kFAAkF;IAClF,yDAAyD;IACzD,IAAI,eAAe,GAAG,YAAY,CAAA;IAClC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACtD,MAAM,OAAO,GAAG,0BAA0B,CACxC,kBAAkB,CAAC,mBAAmB,EAAE,aAAa,EAAE,OAAO,CAAC,EAC/D,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,iBAAiB,CAC1B,CAAA;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,2EAA2E;YAC3E,+EAA+E;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;YAClF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;YACzF,eAAe,GAAG,oBAAoB,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,wEAAwE;IACxE,yEAAyE;IACzE,uDAAuD;IACvD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,4CAA4C,EAAE,GAAG,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAA;AACxB,CAAC"}
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 Fusion + Strategy Detection + Temporal Parsing tests.
2
+ * Retrieval — RRF scoring + exact-ID recall augmentation tests.
3
3
  *
4
- * Covers the pure, deterministic core of searchMemoriesV2 (TD-158/159/160):
5
- * reciprocalRankFusion, detectStrategies, parseTemporalRange. The Cohere rerank
6
- * + DB-backed strategies are exercised separately (they require a live provider
7
- * + COHERE_API_KEY); these tests pin the fusion math + routing that run on every
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 Fusion + Strategy Detection + Temporal Parsing tests.
2
+ * Retrieval — RRF scoring + exact-ID recall augmentation tests.
3
3
  *
4
- * Covers the pure, deterministic core of searchMemoriesV2 (TD-158/159/160):
5
- * reciprocalRankFusion, detectStrategies, parseTemporalRange. The Cohere rerank
6
- * + DB-backed strategies are exercised separately (they require a live provider
7
- * + COHERE_API_KEY); these tests pin the fusion math + routing that run on every
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, detectStrategies, parseTemporalRange, extractExactIdTokens, findExactIdMatches, appendExactIdMatches, } from './retrieval.js';
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-strategy: an item in BOTH strategies outranks an item in only one
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: 'bm25', items: [{ id: 'x', rank: 1 }, { id: 'z', rank: 2 }] },
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 ---');