@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.
Files changed (188) hide show
  1. package/README.md +308 -37
  2. package/dist/agent-memory-scope.d.ts.map +1 -1
  3. package/dist/agent-memory-scope.js +10 -2
  4. package/dist/agent-memory-scope.js.map +1 -1
  5. package/dist/agentdb-adapter-key-isolation.test.d.ts +2 -0
  6. package/dist/agentdb-adapter-key-isolation.test.d.ts.map +1 -0
  7. package/dist/agentdb-adapter-key-isolation.test.js +175 -0
  8. package/dist/agentdb-adapter-key-isolation.test.js.map +1 -0
  9. package/dist/agentdb-adapter-upsert.test.d.ts +2 -0
  10. package/dist/agentdb-adapter-upsert.test.d.ts.map +1 -0
  11. package/dist/agentdb-adapter-upsert.test.js +216 -0
  12. package/dist/agentdb-adapter-upsert.test.js.map +1 -0
  13. package/dist/agentdb-adapter.d.ts +70 -1
  14. package/dist/agentdb-adapter.d.ts.map +1 -1
  15. package/dist/agentdb-adapter.js +365 -32
  16. package/dist/agentdb-adapter.js.map +1 -1
  17. package/dist/agentdb-backend.d.ts +25 -0
  18. package/dist/agentdb-backend.d.ts.map +1 -1
  19. package/dist/agentdb-backend.js +113 -28
  20. package/dist/agentdb-backend.js.map +1 -1
  21. package/dist/agentdb-retrieval-guard.d.ts +76 -0
  22. package/dist/agentdb-retrieval-guard.d.ts.map +1 -0
  23. package/dist/agentdb-retrieval-guard.js +77 -0
  24. package/dist/agentdb-retrieval-guard.js.map +1 -0
  25. package/dist/agentdb-retrieval-guard.test.d.ts +12 -0
  26. package/dist/agentdb-retrieval-guard.test.d.ts.map +1 -0
  27. package/dist/agentdb-retrieval-guard.test.js +129 -0
  28. package/dist/agentdb-retrieval-guard.test.js.map +1 -0
  29. package/dist/auto-memory-bridge.d.ts +12 -1
  30. package/dist/auto-memory-bridge.d.ts.map +1 -1
  31. package/dist/auto-memory-bridge.js +101 -7
  32. package/dist/auto-memory-bridge.js.map +1 -1
  33. package/dist/auto-memory-bridge.test.js +121 -15
  34. package/dist/auto-memory-bridge.test.js.map +1 -1
  35. package/dist/auto-memory-index-3224.test.d.ts +2 -0
  36. package/dist/auto-memory-index-3224.test.d.ts.map +1 -0
  37. package/dist/auto-memory-index-3224.test.js +77 -0
  38. package/dist/auto-memory-index-3224.test.js.map +1 -0
  39. package/dist/consolidator-embedding-benchmark.test.d.ts +39 -0
  40. package/dist/consolidator-embedding-benchmark.test.d.ts.map +1 -0
  41. package/dist/consolidator-embedding-benchmark.test.js +366 -0
  42. package/dist/consolidator-embedding-benchmark.test.js.map +1 -0
  43. package/dist/consolidator.d.ts +131 -0
  44. package/dist/consolidator.d.ts.map +1 -0
  45. package/dist/consolidator.js +309 -0
  46. package/dist/consolidator.js.map +1 -0
  47. package/dist/consolidator.test.d.ts +17 -0
  48. package/dist/consolidator.test.d.ts.map +1 -0
  49. package/dist/consolidator.test.js +376 -0
  50. package/dist/consolidator.test.js.map +1 -0
  51. package/dist/controller-registry.d.ts +290 -0
  52. package/dist/controller-registry.d.ts.map +1 -0
  53. package/dist/controller-registry.js +1095 -0
  54. package/dist/controller-registry.js.map +1 -0
  55. package/dist/controller-registry.test.d.ts +14 -0
  56. package/dist/controller-registry.test.d.ts.map +1 -0
  57. package/dist/controller-registry.test.js +818 -0
  58. package/dist/controller-registry.test.js.map +1 -0
  59. package/dist/database-provider.d.ts +14 -2
  60. package/dist/database-provider.d.ts.map +1 -1
  61. package/dist/database-provider.js +63 -3
  62. package/dist/database-provider.js.map +1 -1
  63. package/dist/database-provider.test.js +56 -3
  64. package/dist/database-provider.test.js.map +1 -1
  65. package/dist/entity-tagger.d.ts +31 -0
  66. package/dist/entity-tagger.d.ts.map +1 -0
  67. package/dist/entity-tagger.js +80 -0
  68. package/dist/entity-tagger.js.map +1 -0
  69. package/dist/entity-tagger.test.d.ts +12 -0
  70. package/dist/entity-tagger.test.d.ts.map +1 -0
  71. package/dist/entity-tagger.test.js +70 -0
  72. package/dist/entity-tagger.test.js.map +1 -0
  73. package/dist/fts5.test.d.ts +13 -0
  74. package/dist/fts5.test.d.ts.map +1 -0
  75. package/dist/fts5.test.js +144 -0
  76. package/dist/fts5.test.js.map +1 -0
  77. package/dist/graceful-retrieval.test.d.ts +14 -0
  78. package/dist/graceful-retrieval.test.d.ts.map +1 -0
  79. package/dist/graceful-retrieval.test.js +251 -0
  80. package/dist/graceful-retrieval.test.js.map +1 -0
  81. package/dist/hnsw-index.d.ts +62 -0
  82. package/dist/hnsw-index.d.ts.map +1 -1
  83. package/dist/hnsw-index.js +461 -16
  84. package/dist/hnsw-index.js.map +1 -1
  85. package/dist/hnsw-persistence.test.d.ts +13 -0
  86. package/dist/hnsw-persistence.test.d.ts.map +1 -0
  87. package/dist/hnsw-persistence.test.js +208 -0
  88. package/dist/hnsw-persistence.test.js.map +1 -0
  89. package/dist/hnsw-quantization.test.d.ts +17 -0
  90. package/dist/hnsw-quantization.test.d.ts.map +1 -0
  91. package/dist/hnsw-quantization.test.js +140 -0
  92. package/dist/hnsw-quantization.test.js.map +1 -0
  93. package/dist/hybrid-backend.d.ts +46 -2
  94. package/dist/hybrid-backend.d.ts.map +1 -1
  95. package/dist/hybrid-backend.js +120 -21
  96. package/dist/hybrid-backend.js.map +1 -1
  97. package/dist/hybrid-backend.test.js +139 -5
  98. package/dist/hybrid-backend.test.js.map +1 -1
  99. package/dist/index.d.ts +164 -10
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +272 -30
  102. package/dist/index.js.map +1 -1
  103. package/dist/index.test.d.ts +10 -0
  104. package/dist/index.test.d.ts.map +1 -0
  105. package/dist/index.test.js +71 -0
  106. package/dist/index.test.js.map +1 -0
  107. package/dist/json-security.d.ts +12 -0
  108. package/dist/json-security.d.ts.map +1 -0
  109. package/dist/json-security.js +20 -0
  110. package/dist/json-security.js.map +1 -0
  111. package/dist/learning-bridge.d.ts +29 -0
  112. package/dist/learning-bridge.d.ts.map +1 -1
  113. package/dist/learning-bridge.js +71 -6
  114. package/dist/learning-bridge.js.map +1 -1
  115. package/dist/learning-bridge.test.js +181 -1
  116. package/dist/learning-bridge.test.js.map +1 -1
  117. package/dist/memory-key.d.ts +3 -0
  118. package/dist/memory-key.d.ts.map +1 -0
  119. package/dist/memory-key.js +5 -0
  120. package/dist/memory-key.js.map +1 -0
  121. package/dist/migration.d.ts +19 -4
  122. package/dist/migration.d.ts.map +1 -1
  123. package/dist/migration.js +99 -24
  124. package/dist/migration.js.map +1 -1
  125. package/dist/migration.test.d.ts +11 -0
  126. package/dist/migration.test.d.ts.map +1 -0
  127. package/dist/migration.test.js +141 -0
  128. package/dist/migration.test.js.map +1 -0
  129. package/dist/mmr-benchmark.test.d.ts +2 -0
  130. package/dist/mmr-benchmark.test.d.ts.map +1 -0
  131. package/dist/mmr-benchmark.test.js +286 -0
  132. package/dist/mmr-benchmark.test.js.map +1 -0
  133. package/dist/mmr-rerank-cosine-cache.test.d.ts +2 -0
  134. package/dist/mmr-rerank-cosine-cache.test.d.ts.map +1 -0
  135. package/dist/mmr-rerank-cosine-cache.test.js +334 -0
  136. package/dist/mmr-rerank-cosine-cache.test.js.map +1 -0
  137. package/dist/mmr-rerank-perf.test.d.ts +2 -0
  138. package/dist/mmr-rerank-perf.test.d.ts.map +1 -0
  139. package/dist/mmr-rerank-perf.test.js +191 -0
  140. package/dist/mmr-rerank-perf.test.js.map +1 -0
  141. package/dist/persistent-sona.d.ts +144 -0
  142. package/dist/persistent-sona.d.ts.map +1 -0
  143. package/dist/persistent-sona.js +332 -0
  144. package/dist/persistent-sona.js.map +1 -0
  145. package/dist/rvf-backend.d.ts +53 -0
  146. package/dist/rvf-backend.d.ts.map +1 -0
  147. package/dist/rvf-backend.js +643 -0
  148. package/dist/rvf-backend.js.map +1 -0
  149. package/dist/rvf-learning-store.d.ts +139 -0
  150. package/dist/rvf-learning-store.d.ts.map +1 -0
  151. package/dist/rvf-learning-store.js +295 -0
  152. package/dist/rvf-learning-store.js.map +1 -0
  153. package/dist/rvf-migration.d.ts +45 -0
  154. package/dist/rvf-migration.d.ts.map +1 -0
  155. package/dist/rvf-migration.js +254 -0
  156. package/dist/rvf-migration.js.map +1 -0
  157. package/dist/smart-retrieval-scores.test.d.ts +2 -0
  158. package/dist/smart-retrieval-scores.test.d.ts.map +1 -0
  159. package/dist/smart-retrieval-scores.test.js +75 -0
  160. package/dist/smart-retrieval-scores.test.js.map +1 -0
  161. package/dist/smart-retrieval.d.ts +141 -0
  162. package/dist/smart-retrieval.d.ts.map +1 -0
  163. package/dist/smart-retrieval.js +399 -0
  164. package/dist/smart-retrieval.js.map +1 -0
  165. package/dist/smart-retrieval.test.d.ts +2 -0
  166. package/dist/smart-retrieval.test.d.ts.map +1 -0
  167. package/dist/smart-retrieval.test.js +418 -0
  168. package/dist/smart-retrieval.test.js.map +1 -0
  169. package/dist/sqlite-backend.d.ts +10 -0
  170. package/dist/sqlite-backend.d.ts.map +1 -1
  171. package/dist/sqlite-backend.js +101 -5
  172. package/dist/sqlite-backend.js.map +1 -1
  173. package/dist/sqljs-backend.d.ts +9 -0
  174. package/dist/sqljs-backend.d.ts.map +1 -1
  175. package/dist/sqljs-backend.js +91 -3
  176. package/dist/sqljs-backend.js.map +1 -1
  177. package/dist/tiered-memory.d.ts +171 -0
  178. package/dist/tiered-memory.d.ts.map +1 -0
  179. package/dist/tiered-memory.js +350 -0
  180. package/dist/tiered-memory.js.map +1 -0
  181. package/dist/tiered-memory.test.d.ts +9 -0
  182. package/dist/tiered-memory.test.d.ts.map +1 -0
  183. package/dist/tiered-memory.test.js +220 -0
  184. package/dist/tiered-memory.test.js.map +1 -0
  185. package/dist/types.d.ts +17 -0
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js.map +1 -1
  188. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=smart-retrieval.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-retrieval.test.d.ts","sourceRoot":"","sources":["../src/smart-retrieval.test.ts"],"names":[],"mappings":""}