@claude-flow/memory 3.0.0-alpha.9 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +308 -37
- package/dist/agent-memory-scope.d.ts.map +1 -1
- package/dist/agent-memory-scope.js +10 -2
- package/dist/agent-memory-scope.js.map +1 -1
- package/dist/agentdb-adapter-key-isolation.test.d.ts +2 -0
- package/dist/agentdb-adapter-key-isolation.test.d.ts.map +1 -0
- package/dist/agentdb-adapter-key-isolation.test.js +175 -0
- package/dist/agentdb-adapter-key-isolation.test.js.map +1 -0
- package/dist/agentdb-adapter-upsert.test.d.ts +2 -0
- package/dist/agentdb-adapter-upsert.test.d.ts.map +1 -0
- package/dist/agentdb-adapter-upsert.test.js +216 -0
- package/dist/agentdb-adapter-upsert.test.js.map +1 -0
- package/dist/agentdb-adapter.d.ts +70 -1
- package/dist/agentdb-adapter.d.ts.map +1 -1
- package/dist/agentdb-adapter.js +365 -32
- package/dist/agentdb-adapter.js.map +1 -1
- package/dist/agentdb-backend.d.ts +25 -0
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +113 -28
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/agentdb-retrieval-guard.d.ts +76 -0
- package/dist/agentdb-retrieval-guard.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.js +77 -0
- package/dist/agentdb-retrieval-guard.js.map +1 -0
- package/dist/agentdb-retrieval-guard.test.d.ts +12 -0
- package/dist/agentdb-retrieval-guard.test.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.test.js +129 -0
- package/dist/agentdb-retrieval-guard.test.js.map +1 -0
- package/dist/auto-memory-bridge.d.ts +12 -1
- package/dist/auto-memory-bridge.d.ts.map +1 -1
- package/dist/auto-memory-bridge.js +101 -7
- package/dist/auto-memory-bridge.js.map +1 -1
- package/dist/auto-memory-bridge.test.js +121 -15
- package/dist/auto-memory-bridge.test.js.map +1 -1
- package/dist/auto-memory-index-3224.test.d.ts +2 -0
- package/dist/auto-memory-index-3224.test.d.ts.map +1 -0
- package/dist/auto-memory-index-3224.test.js +77 -0
- package/dist/auto-memory-index-3224.test.js.map +1 -0
- package/dist/consolidator-embedding-benchmark.test.d.ts +39 -0
- package/dist/consolidator-embedding-benchmark.test.d.ts.map +1 -0
- package/dist/consolidator-embedding-benchmark.test.js +366 -0
- package/dist/consolidator-embedding-benchmark.test.js.map +1 -0
- package/dist/consolidator.d.ts +131 -0
- package/dist/consolidator.d.ts.map +1 -0
- package/dist/consolidator.js +309 -0
- package/dist/consolidator.js.map +1 -0
- package/dist/consolidator.test.d.ts +17 -0
- package/dist/consolidator.test.d.ts.map +1 -0
- package/dist/consolidator.test.js +376 -0
- package/dist/consolidator.test.js.map +1 -0
- package/dist/controller-registry.d.ts +290 -0
- package/dist/controller-registry.d.ts.map +1 -0
- package/dist/controller-registry.js +1095 -0
- package/dist/controller-registry.js.map +1 -0
- package/dist/controller-registry.test.d.ts +14 -0
- package/dist/controller-registry.test.d.ts.map +1 -0
- package/dist/controller-registry.test.js +818 -0
- package/dist/controller-registry.test.js.map +1 -0
- package/dist/database-provider.d.ts +14 -2
- package/dist/database-provider.d.ts.map +1 -1
- package/dist/database-provider.js +63 -3
- package/dist/database-provider.js.map +1 -1
- package/dist/database-provider.test.js +56 -3
- package/dist/database-provider.test.js.map +1 -1
- package/dist/entity-tagger.d.ts +31 -0
- package/dist/entity-tagger.d.ts.map +1 -0
- package/dist/entity-tagger.js +80 -0
- package/dist/entity-tagger.js.map +1 -0
- package/dist/entity-tagger.test.d.ts +12 -0
- package/dist/entity-tagger.test.d.ts.map +1 -0
- package/dist/entity-tagger.test.js +70 -0
- package/dist/entity-tagger.test.js.map +1 -0
- package/dist/fts5.test.d.ts +13 -0
- package/dist/fts5.test.d.ts.map +1 -0
- package/dist/fts5.test.js +144 -0
- package/dist/fts5.test.js.map +1 -0
- package/dist/graceful-retrieval.test.d.ts +14 -0
- package/dist/graceful-retrieval.test.d.ts.map +1 -0
- package/dist/graceful-retrieval.test.js +251 -0
- package/dist/graceful-retrieval.test.js.map +1 -0
- package/dist/hnsw-index.d.ts +62 -0
- package/dist/hnsw-index.d.ts.map +1 -1
- package/dist/hnsw-index.js +461 -16
- package/dist/hnsw-index.js.map +1 -1
- package/dist/hnsw-persistence.test.d.ts +13 -0
- package/dist/hnsw-persistence.test.d.ts.map +1 -0
- package/dist/hnsw-persistence.test.js +208 -0
- package/dist/hnsw-persistence.test.js.map +1 -0
- package/dist/hnsw-quantization.test.d.ts +17 -0
- package/dist/hnsw-quantization.test.d.ts.map +1 -0
- package/dist/hnsw-quantization.test.js +140 -0
- package/dist/hnsw-quantization.test.js.map +1 -0
- package/dist/hybrid-backend.d.ts +46 -2
- package/dist/hybrid-backend.d.ts.map +1 -1
- package/dist/hybrid-backend.js +120 -21
- package/dist/hybrid-backend.js.map +1 -1
- package/dist/hybrid-backend.test.js +139 -5
- package/dist/hybrid-backend.test.js.map +1 -1
- package/dist/index.d.ts +164 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +272 -30
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +10 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +71 -0
- package/dist/index.test.js.map +1 -0
- package/dist/json-security.d.ts +12 -0
- package/dist/json-security.d.ts.map +1 -0
- package/dist/json-security.js +20 -0
- package/dist/json-security.js.map +1 -0
- package/dist/learning-bridge.d.ts +29 -0
- package/dist/learning-bridge.d.ts.map +1 -1
- package/dist/learning-bridge.js +71 -6
- package/dist/learning-bridge.js.map +1 -1
- package/dist/learning-bridge.test.js +181 -1
- package/dist/learning-bridge.test.js.map +1 -1
- package/dist/memory-key.d.ts +3 -0
- package/dist/memory-key.d.ts.map +1 -0
- package/dist/memory-key.js +5 -0
- package/dist/memory-key.js.map +1 -0
- package/dist/migration.d.ts +19 -4
- package/dist/migration.d.ts.map +1 -1
- package/dist/migration.js +99 -24
- package/dist/migration.js.map +1 -1
- package/dist/migration.test.d.ts +11 -0
- package/dist/migration.test.d.ts.map +1 -0
- package/dist/migration.test.js +141 -0
- package/dist/migration.test.js.map +1 -0
- package/dist/mmr-benchmark.test.d.ts +2 -0
- package/dist/mmr-benchmark.test.d.ts.map +1 -0
- package/dist/mmr-benchmark.test.js +286 -0
- package/dist/mmr-benchmark.test.js.map +1 -0
- package/dist/mmr-rerank-cosine-cache.test.d.ts +2 -0
- package/dist/mmr-rerank-cosine-cache.test.d.ts.map +1 -0
- package/dist/mmr-rerank-cosine-cache.test.js +334 -0
- package/dist/mmr-rerank-cosine-cache.test.js.map +1 -0
- package/dist/mmr-rerank-perf.test.d.ts +2 -0
- package/dist/mmr-rerank-perf.test.d.ts.map +1 -0
- package/dist/mmr-rerank-perf.test.js +191 -0
- package/dist/mmr-rerank-perf.test.js.map +1 -0
- package/dist/persistent-sona.d.ts +144 -0
- package/dist/persistent-sona.d.ts.map +1 -0
- package/dist/persistent-sona.js +332 -0
- package/dist/persistent-sona.js.map +1 -0
- package/dist/rvf-backend.d.ts +53 -0
- package/dist/rvf-backend.d.ts.map +1 -0
- package/dist/rvf-backend.js +643 -0
- package/dist/rvf-backend.js.map +1 -0
- package/dist/rvf-learning-store.d.ts +139 -0
- package/dist/rvf-learning-store.d.ts.map +1 -0
- package/dist/rvf-learning-store.js +295 -0
- package/dist/rvf-learning-store.js.map +1 -0
- package/dist/rvf-migration.d.ts +45 -0
- package/dist/rvf-migration.d.ts.map +1 -0
- package/dist/rvf-migration.js +254 -0
- package/dist/rvf-migration.js.map +1 -0
- package/dist/smart-retrieval-scores.test.d.ts +2 -0
- package/dist/smart-retrieval-scores.test.d.ts.map +1 -0
- package/dist/smart-retrieval-scores.test.js +75 -0
- package/dist/smart-retrieval-scores.test.js.map +1 -0
- package/dist/smart-retrieval.d.ts +141 -0
- package/dist/smart-retrieval.d.ts.map +1 -0
- package/dist/smart-retrieval.js +399 -0
- package/dist/smart-retrieval.js.map +1 -0
- package/dist/smart-retrieval.test.d.ts +2 -0
- package/dist/smart-retrieval.test.d.ts.map +1 -0
- package/dist/smart-retrieval.test.js +418 -0
- package/dist/smart-retrieval.test.js.map +1 -0
- package/dist/sqlite-backend.d.ts +10 -0
- package/dist/sqlite-backend.d.ts.map +1 -1
- package/dist/sqlite-backend.js +101 -5
- package/dist/sqlite-backend.js.map +1 -1
- package/dist/sqljs-backend.d.ts +9 -0
- package/dist/sqljs-backend.d.ts.map +1 -1
- package/dist/sqljs-backend.js +91 -3
- package/dist/sqljs-backend.js.map +1 -1
- package/dist/tiered-memory.d.ts +171 -0
- package/dist/tiered-memory.d.ts.map +1 -0
- package/dist/tiered-memory.js +350 -0
- package/dist/tiered-memory.js.map +1 -0
- package/dist/tiered-memory.test.d.ts +9 -0
- package/dist/tiered-memory.test.d.ts.map +1 -0
- package/dist/tiered-memory.test.js +220 -0
- package/dist/tiered-memory.test.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +10 -8
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartRetrieval — LongMemEval-derived retrieval pipeline (ADR-090)
|
|
3
|
+
*
|
|
4
|
+
* Wraps a raw HNSW `SearchFn` with the optimizations identified by the
|
|
5
|
+
* ADR-088 LongMemEval benchmark:
|
|
6
|
+
*
|
|
7
|
+
* 1. Query expansion (template-based, no LLM)
|
|
8
|
+
* 2. Multi-query fan-out + Reciprocal Rank Fusion
|
|
9
|
+
* 3. Recency boost from metadata timestamps
|
|
10
|
+
* 4. MMR diversity re-ranking (token-Jaccard proxy)
|
|
11
|
+
* 5. Session round-robin for multi-session coverage
|
|
12
|
+
*
|
|
13
|
+
* The module is pluggable: callers provide a `SearchFn` that hits whatever
|
|
14
|
+
* raw store they use (AgentDB HNSW, sql.js, a test fake, etc.). That keeps
|
|
15
|
+
* `@claude-flow/memory` free of a hard dependency on the CLI's memory-initializer
|
|
16
|
+
* and makes the pipeline easy to benchmark in isolation.
|
|
17
|
+
*/
|
|
18
|
+
// ── Query Expansion ────────────────────────────────────────────
|
|
19
|
+
const STOPWORDS = new Set([
|
|
20
|
+
'a', 'an', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'did', 'do', 'does',
|
|
21
|
+
'for', 'from', 'has', 'have', 'how', 'i', 'if', 'in', 'is', 'it', 'its', 'me',
|
|
22
|
+
'my', 'of', 'on', 'or', 'that', 'the', 'this', 'to', 'was', 'were', 'what',
|
|
23
|
+
'when', 'where', 'which', 'who', 'why', 'will', 'with', 'you', 'your',
|
|
24
|
+
]);
|
|
25
|
+
/**
|
|
26
|
+
* Default query expansion set. Keeps variants cheap (≤3) so we only pay
|
|
27
|
+
* ~3× the HNSW cost on the hot path.
|
|
28
|
+
*/
|
|
29
|
+
export function defaultQueryExpansions(query) {
|
|
30
|
+
const trimmed = query.trim();
|
|
31
|
+
if (!trimmed)
|
|
32
|
+
return [];
|
|
33
|
+
const variants = new Set();
|
|
34
|
+
variants.add(trimmed);
|
|
35
|
+
const keywords = keywordExtract(trimmed);
|
|
36
|
+
if (keywords && keywords !== trimmed.toLowerCase()) {
|
|
37
|
+
variants.add(keywords);
|
|
38
|
+
}
|
|
39
|
+
// Context-priming variant — helps when the query is short or imperative.
|
|
40
|
+
const words = trimmed.toLowerCase().replace(/[?.!]+$/, '');
|
|
41
|
+
if (words && !words.startsWith('tell me')) {
|
|
42
|
+
variants.add(`tell me about ${words}`);
|
|
43
|
+
}
|
|
44
|
+
return [...variants];
|
|
45
|
+
}
|
|
46
|
+
function keywordExtract(query) {
|
|
47
|
+
return query
|
|
48
|
+
.toLowerCase()
|
|
49
|
+
.replace(/[^\w\s]/g, ' ')
|
|
50
|
+
.split(/\s+/)
|
|
51
|
+
.filter((w) => w.length > 2 && !STOPWORDS.has(w))
|
|
52
|
+
.join(' ');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Public-facing Reciprocal Rank Fusion. Takes any number of pre-sorted
|
|
56
|
+
* candidate lists (best-first) and fuses them with the RRF score
|
|
57
|
+
* `sum(1 / (k + rank_i))`. Used by the ADR-125 Phase 5 hybridSearch
|
|
58
|
+
* controller to fuse dense + sparse arms.
|
|
59
|
+
*/
|
|
60
|
+
export function applyRRF(rankedLists, k = 60) {
|
|
61
|
+
return reciprocalRankFusion(rankedLists, k);
|
|
62
|
+
}
|
|
63
|
+
function reciprocalRankFusion(rankedLists, k) {
|
|
64
|
+
const fused = new Map();
|
|
65
|
+
for (const list of rankedLists) {
|
|
66
|
+
for (let rank = 0; rank < list.length; rank++) {
|
|
67
|
+
const cand = list[rank];
|
|
68
|
+
const rrfContribution = 1 / (k + rank + 1);
|
|
69
|
+
const key = candidateKey(cand);
|
|
70
|
+
const existing = fused.get(key);
|
|
71
|
+
if (existing) {
|
|
72
|
+
existing.score += rrfContribution;
|
|
73
|
+
// Keep the highest raw score we've seen for display purposes.
|
|
74
|
+
if (cand.score > existing.candidate.score) {
|
|
75
|
+
existing.candidate = cand;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
fused.set(key, { candidate: cand, score: rrfContribution });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return [...fused.values()].sort((a, b) => b.score - a.score);
|
|
84
|
+
}
|
|
85
|
+
function candidateKey(cand) {
|
|
86
|
+
// Fall back through id → key → content hash so deduplication is robust
|
|
87
|
+
// even when the raw store omits ids.
|
|
88
|
+
return cand.id || cand.key || cand.content.slice(0, 128);
|
|
89
|
+
}
|
|
90
|
+
// ── Recency Boost ──────────────────────────────────────────────
|
|
91
|
+
function applyRecencyBoost(scored, opts) {
|
|
92
|
+
const halfLifeMs = opts.recencyHalfLifeDays * 24 * 60 * 60 * 1000;
|
|
93
|
+
if (halfLifeMs <= 0)
|
|
94
|
+
return scored;
|
|
95
|
+
return scored
|
|
96
|
+
.map(({ candidate, score }) => {
|
|
97
|
+
const ts = pickTimestamp(candidate);
|
|
98
|
+
if (!ts || !Number.isFinite(ts)) {
|
|
99
|
+
return { candidate, score };
|
|
100
|
+
}
|
|
101
|
+
const ageMs = Math.max(0, opts.now - ts);
|
|
102
|
+
// Exponential decay, normalized to [0,1].
|
|
103
|
+
const recency = Math.pow(0.5, ageMs / halfLifeMs);
|
|
104
|
+
const boosted = score * (1 + opts.recencyWeight * recency);
|
|
105
|
+
return { candidate, score: boosted };
|
|
106
|
+
})
|
|
107
|
+
.sort((a, b) => b.score - a.score);
|
|
108
|
+
}
|
|
109
|
+
function pickTimestamp(cand) {
|
|
110
|
+
if (cand.updatedAt && Number.isFinite(cand.updatedAt))
|
|
111
|
+
return cand.updatedAt;
|
|
112
|
+
if (cand.createdAt && Number.isFinite(cand.createdAt))
|
|
113
|
+
return cand.createdAt;
|
|
114
|
+
const meta = cand.metadata;
|
|
115
|
+
if (meta) {
|
|
116
|
+
const candidates = ['timestamp', 'updatedAt', 'createdAt', 'time', 'ts'];
|
|
117
|
+
for (const k of candidates) {
|
|
118
|
+
const v = meta[k];
|
|
119
|
+
if (typeof v === 'number' && Number.isFinite(v))
|
|
120
|
+
return v;
|
|
121
|
+
if (typeof v === 'string') {
|
|
122
|
+
const parsed = Date.parse(v);
|
|
123
|
+
if (Number.isFinite(parsed))
|
|
124
|
+
return parsed;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
130
|
+
// ── MMR Diversity (embedding-cosine, token-Jaccard fallback) ───
|
|
131
|
+
//
|
|
132
|
+
// Dream Cycle 2026-09-03: 2026 production practice (LangChain's reference
|
|
133
|
+
// `maximal_marginal_relevance`, Qdrant's native `Mmr` query, Weaviate 1.37's
|
|
134
|
+
// MMR reranker) universally computes MMR's "similarity to already-selected"
|
|
135
|
+
// term over the embedding space, not lexical overlap — token-Jaccard misses
|
|
136
|
+
// low-token-overlap paraphrases that embeddings correctly flag as
|
|
137
|
+
// near-duplicates (see e.g. openclaw/openclaw#19760). Ruflo's own retrieval
|
|
138
|
+
// pipeline already computes these embeddings upstream; this only threads
|
|
139
|
+
// them through to MMR. Falls back to token-Jaccard whenever either
|
|
140
|
+
// candidate lacks an embedding (test fakes, or a SearchFn that doesn't
|
|
141
|
+
// supply one) or the two embeddings have mismatched dimensions, so existing
|
|
142
|
+
// callers/tests that never populate `.embedding` are unaffected.
|
|
143
|
+
/**
|
|
144
|
+
* Public-facing MMR rerank.
|
|
145
|
+
*
|
|
146
|
+
* Re-exported as `applyMMR` for ADR-125 Phase 5 callers (the hybridSearch
|
|
147
|
+
* controller). Takes already-scored candidates plus an MMR lambda
|
|
148
|
+
* (1.0 = pure relevance, 0.0 = pure diversity).
|
|
149
|
+
*/
|
|
150
|
+
export function applyMMR(scored, lambda = 0.7, limit) {
|
|
151
|
+
return mmrRerank(scored, lambda, limit ?? scored.length);
|
|
152
|
+
}
|
|
153
|
+
function mmrRerank(scored, lambda, limit) {
|
|
154
|
+
if (scored.length <= 1)
|
|
155
|
+
return scored.slice(0, limit);
|
|
156
|
+
// Lazy, per-candidate token cache: PR #3169 made embedding-cosine the
|
|
157
|
+
// common `pairSimilarity` path, so eager per-outer-pass tokenization
|
|
158
|
+
// (the prior implementation) mostly computed tokens that were then
|
|
159
|
+
// discarded. Tokens are now computed at most once per candidate, only
|
|
160
|
+
// when the Jaccard fallback actually needs them (Dream Cycle 2026-09-10).
|
|
161
|
+
const tokenCache = new Map();
|
|
162
|
+
const getTokens = (item) => {
|
|
163
|
+
let tokens = tokenCache.get(item.candidate);
|
|
164
|
+
if (!tokens) {
|
|
165
|
+
tokens = tokenize(item.candidate.content);
|
|
166
|
+
tokenCache.set(item.candidate, tokens);
|
|
167
|
+
}
|
|
168
|
+
return tokens;
|
|
169
|
+
};
|
|
170
|
+
const selected = [];
|
|
171
|
+
const remaining = [...scored];
|
|
172
|
+
// Running per-remaining-candidate "max similarity to any already-selected
|
|
173
|
+
// item" cache. #3169/#3266 made the Jaccard-fallback *tokenization* lazy
|
|
174
|
+
// but left this half of the redundant-recompute problem untouched: every
|
|
175
|
+
// outer pass still re-walked the full `selected` list for every remaining
|
|
176
|
+
// candidate (O(candidates x selected) `pairSimilarity` calls per pass,
|
|
177
|
+
// growing every round). Since `max(0, s_1, ..., s_k)` can be folded in
|
|
178
|
+
// incrementally, each round only needs one new comparison per remaining
|
|
179
|
+
// candidate (to the just-added item) instead of re-comparing against the
|
|
180
|
+
// whole selected set — turning the total `pairSimilarity` call count from
|
|
181
|
+
// O(candidates x selected^2) into O(candidates x selected) (Dream Cycle
|
|
182
|
+
// 2026-09-28, flagged A-grade by 2026-09-27's memory scan). The zero floor
|
|
183
|
+
// matches the original loop's `let maxOverlap = 0` seed exactly, so the
|
|
184
|
+
// fold-in is mathematically identical to recomputing the max from
|
|
185
|
+
// scratch — output is byte-identical, not merely "close enough".
|
|
186
|
+
const maxSimCache = new Map();
|
|
187
|
+
// Seed with the top-scored candidate.
|
|
188
|
+
const first = remaining.shift();
|
|
189
|
+
selected.push(first);
|
|
190
|
+
while (selected.length < limit && remaining.length > 0) {
|
|
191
|
+
let bestIdx = -1;
|
|
192
|
+
let bestMmr = -Infinity;
|
|
193
|
+
const newest = selected[selected.length - 1];
|
|
194
|
+
for (let i = 0; i < remaining.length; i++) {
|
|
195
|
+
const cand = remaining[i];
|
|
196
|
+
const simToNewest = pairSimilarity(cand.candidate.embedding, newest.candidate.embedding, cand, newest, getTokens);
|
|
197
|
+
const maxOverlap = Math.max(maxSimCache.get(cand) ?? 0, simToNewest);
|
|
198
|
+
maxSimCache.set(cand, maxOverlap);
|
|
199
|
+
const mmr = lambda * cand.score - (1 - lambda) * maxOverlap;
|
|
200
|
+
if (mmr > bestMmr) {
|
|
201
|
+
bestMmr = mmr;
|
|
202
|
+
bestIdx = i;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (bestIdx < 0)
|
|
206
|
+
break;
|
|
207
|
+
const [chosen] = remaining.splice(bestIdx, 1);
|
|
208
|
+
maxSimCache.delete(chosen);
|
|
209
|
+
selected.push(chosen);
|
|
210
|
+
}
|
|
211
|
+
return selected;
|
|
212
|
+
}
|
|
213
|
+
/** Cosine similarity when both embeddings exist, agree in dimension, and are well-formed; token-Jaccard (computed lazily via `getTokens`) otherwise. */
|
|
214
|
+
function pairSimilarity(embA, embB, a, b, getTokens) {
|
|
215
|
+
if (isWellFormedEmbedding(embA) &&
|
|
216
|
+
isWellFormedEmbedding(embB) &&
|
|
217
|
+
embA.length === embB.length) {
|
|
218
|
+
return cosineSimilarity(embA, embB);
|
|
219
|
+
}
|
|
220
|
+
return jaccard(getTokens(a), getTokens(b));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Guards against malformed embeddings (NaN/Infinity components, empty
|
|
224
|
+
* arrays, non-arrays) reaching `cosineSimilarity`, where a single NaN/
|
|
225
|
+
* Infinity would poison the dot product and silently corrupt every
|
|
226
|
+
* downstream MMR comparison for the rest of the rerank — falls back to
|
|
227
|
+
* `jaccard` instead, same as a missing/dimension-mismatched embedding.
|
|
228
|
+
*/
|
|
229
|
+
function isWellFormedEmbedding(emb) {
|
|
230
|
+
return (Array.isArray(emb) &&
|
|
231
|
+
emb.length > 0 &&
|
|
232
|
+
emb.every((v) => typeof v === 'number' && Number.isFinite(v)));
|
|
233
|
+
}
|
|
234
|
+
function cosineSimilarity(a, b) {
|
|
235
|
+
let dot = 0;
|
|
236
|
+
let normA = 0;
|
|
237
|
+
let normB = 0;
|
|
238
|
+
for (let i = 0; i < a.length; i++) {
|
|
239
|
+
dot += a[i] * b[i];
|
|
240
|
+
normA += a[i] * a[i];
|
|
241
|
+
normB += b[i] * b[i];
|
|
242
|
+
}
|
|
243
|
+
if (normA === 0 || normB === 0)
|
|
244
|
+
return 0;
|
|
245
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Exported (this package's `exports` map is a `"./*"` wildcard, so this is
|
|
249
|
+
* real public API, not just test access) so the mmrRerank tokenize-call-
|
|
250
|
+
* count regression test can spy on it (Dream Cycle 2026-09-10). Pure and
|
|
251
|
+
* side-effect-free, so widening its visibility carries no behavioral risk.
|
|
252
|
+
*/
|
|
253
|
+
export function tokenize(text) {
|
|
254
|
+
return new Set(text
|
|
255
|
+
.toLowerCase()
|
|
256
|
+
.replace(/[^\w\s]/g, ' ')
|
|
257
|
+
.split(/\s+/)
|
|
258
|
+
.filter((t) => t.length > 2 && !STOPWORDS.has(t)));
|
|
259
|
+
}
|
|
260
|
+
function jaccard(a, b) {
|
|
261
|
+
if (a.size === 0 && b.size === 0)
|
|
262
|
+
return 0;
|
|
263
|
+
let intersect = 0;
|
|
264
|
+
for (const t of a)
|
|
265
|
+
if (b.has(t))
|
|
266
|
+
intersect++;
|
|
267
|
+
const union = a.size + b.size - intersect;
|
|
268
|
+
return union === 0 ? 0 : intersect / union;
|
|
269
|
+
}
|
|
270
|
+
// ── Session Round-Robin ────────────────────────────────────────
|
|
271
|
+
function sessionRoundRobin(scored, sessionKey, limit) {
|
|
272
|
+
if (scored.length === 0)
|
|
273
|
+
return scored;
|
|
274
|
+
const bySession = new Map();
|
|
275
|
+
for (const item of scored) {
|
|
276
|
+
const sid = getSessionId(item.candidate, sessionKey) ?? '__no_session__';
|
|
277
|
+
const bucket = bySession.get(sid);
|
|
278
|
+
if (bucket)
|
|
279
|
+
bucket.push(item);
|
|
280
|
+
else
|
|
281
|
+
bySession.set(sid, [item]);
|
|
282
|
+
}
|
|
283
|
+
// If every candidate falls in the same bucket we can't diversify — pass through.
|
|
284
|
+
if (bySession.size <= 1)
|
|
285
|
+
return scored.slice(0, limit);
|
|
286
|
+
// Round-robin across session buckets, preferring each bucket's highest score.
|
|
287
|
+
const buckets = [...bySession.values()].map((b) => [...b].sort((a, b) => b.score - a.score));
|
|
288
|
+
const interleaved = [];
|
|
289
|
+
const seen = new Set();
|
|
290
|
+
while (interleaved.length < limit) {
|
|
291
|
+
let progressed = false;
|
|
292
|
+
for (const bucket of buckets) {
|
|
293
|
+
while (bucket.length > 0) {
|
|
294
|
+
const next = bucket.shift();
|
|
295
|
+
const key = candidateKey(next.candidate);
|
|
296
|
+
if (seen.has(key))
|
|
297
|
+
continue;
|
|
298
|
+
seen.add(key);
|
|
299
|
+
interleaved.push(next);
|
|
300
|
+
progressed = true;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
if (interleaved.length >= limit)
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
if (!progressed)
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
return interleaved;
|
|
310
|
+
}
|
|
311
|
+
function getSessionId(cand, key) {
|
|
312
|
+
const meta = cand.metadata;
|
|
313
|
+
if (!meta)
|
|
314
|
+
return undefined;
|
|
315
|
+
const v = meta[key];
|
|
316
|
+
return typeof v === 'string' ? v : undefined;
|
|
317
|
+
}
|
|
318
|
+
// ── Public API ─────────────────────────────────────────────────
|
|
319
|
+
export async function smartSearch(search, opts) {
|
|
320
|
+
const start = Date.now();
|
|
321
|
+
const limit = opts.limit ?? 10;
|
|
322
|
+
const threshold = opts.threshold ?? 0.3;
|
|
323
|
+
const fanOutK = opts.fanOutK ?? Math.max(limit * 3, 20);
|
|
324
|
+
const rrfK = opts.rrfK ?? 60;
|
|
325
|
+
const recencyHalfLifeDays = opts.recencyHalfLifeDays ?? 30;
|
|
326
|
+
const recencyWeight = opts.recencyWeight ?? 0.2;
|
|
327
|
+
const mmrLambda = opts.mmrLambda ?? 0.7;
|
|
328
|
+
const sessionKey = opts.sessionKey ?? 'session_id';
|
|
329
|
+
const now = opts.now ?? Date.now();
|
|
330
|
+
const multiQuery = opts.multiQuery !== false;
|
|
331
|
+
const recencyBoost = opts.recencyBoost !== false;
|
|
332
|
+
const diversityMMR = opts.diversityMMR !== false;
|
|
333
|
+
const sessionDiversity = opts.sessionDiversity !== false;
|
|
334
|
+
const expander = opts.queryExpansions ?? defaultQueryExpansions;
|
|
335
|
+
// ── Phase 1: query expansion + fan-out ──
|
|
336
|
+
const variants = multiQuery ? expander(opts.query) : [opts.query];
|
|
337
|
+
if (variants.length === 0)
|
|
338
|
+
variants.push(opts.query);
|
|
339
|
+
const ranked = [];
|
|
340
|
+
let totalRaw = 0;
|
|
341
|
+
for (const v of variants) {
|
|
342
|
+
const resp = await search({
|
|
343
|
+
query: v,
|
|
344
|
+
namespace: opts.namespace,
|
|
345
|
+
limit: fanOutK,
|
|
346
|
+
threshold,
|
|
347
|
+
});
|
|
348
|
+
ranked.push(resp.results);
|
|
349
|
+
totalRaw += resp.results.length;
|
|
350
|
+
}
|
|
351
|
+
// ── Phase 2: RRF fusion ──
|
|
352
|
+
let scored = ranked.length === 1
|
|
353
|
+
? ranked[0].map((c) => ({ candidate: c, score: c.score }))
|
|
354
|
+
: reciprocalRankFusion(ranked, rrfK);
|
|
355
|
+
const afterRrfCount = scored.length;
|
|
356
|
+
// ── Phase 3: recency boost ──
|
|
357
|
+
if (recencyBoost) {
|
|
358
|
+
scored = applyRecencyBoost(scored, { recencyHalfLifeDays, recencyWeight, now });
|
|
359
|
+
}
|
|
360
|
+
const afterRecencyCount = scored.length;
|
|
361
|
+
// Truncate before MMR so we don't re-rank thousands of items.
|
|
362
|
+
if (scored.length > fanOutK)
|
|
363
|
+
scored = scored.slice(0, fanOutK);
|
|
364
|
+
// ── Phase 4: MMR diversity ──
|
|
365
|
+
if (diversityMMR) {
|
|
366
|
+
scored = mmrRerank(scored, mmrLambda, Math.min(limit * 2, scored.length));
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
scored = scored.slice(0, Math.min(limit * 2, scored.length));
|
|
370
|
+
}
|
|
371
|
+
const afterMmrCount = scored.length;
|
|
372
|
+
// ── Phase 5: session round-robin ──
|
|
373
|
+
let final = scored;
|
|
374
|
+
if (sessionDiversity) {
|
|
375
|
+
final = sessionRoundRobin(scored, sessionKey, limit);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
final = scored.slice(0, limit);
|
|
379
|
+
}
|
|
380
|
+
const afterSessionCount = final.length;
|
|
381
|
+
return {
|
|
382
|
+
results: final.slice(0, limit).map(({ candidate, score }) => ({
|
|
383
|
+
...candidate,
|
|
384
|
+
rawScore: candidate.rawScore ?? candidate.score,
|
|
385
|
+
score,
|
|
386
|
+
})),
|
|
387
|
+
stats: {
|
|
388
|
+
variantCount: variants.length,
|
|
389
|
+
variants,
|
|
390
|
+
rawCandidateCount: totalRaw,
|
|
391
|
+
afterRrfCount,
|
|
392
|
+
afterRecencyCount,
|
|
393
|
+
afterMmrCount,
|
|
394
|
+
afterSessionCount,
|
|
395
|
+
durationMs: Date.now() - start,
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=smart-retrieval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-retrieval.js","sourceRoot":"","sources":["../src/smart-retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-retrieval.test.d.ts","sourceRoot":"","sources":["../src/smart-retrieval.test.ts"],"names":[],"mappings":""}
|