fastrmemory 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.cursor/mcp.json +1 -1
  4. package/.cursor/skills/fastr-setup/SKILL.md +4 -4
  5. package/.cursor/skills/skills.json +1 -1
  6. package/README.md +87 -36
  7. package/dist/bin/fastr.js +131 -17
  8. package/dist/bin/fastr.js.map +1 -1
  9. package/dist/src/bench/harness.d.ts.map +1 -1
  10. package/dist/src/bench/harness.js +4 -0
  11. package/dist/src/bench/harness.js.map +1 -1
  12. package/dist/src/bench/marker-corpus.d.ts +98 -0
  13. package/dist/src/bench/marker-corpus.d.ts.map +1 -0
  14. package/dist/src/bench/marker-corpus.js +306 -0
  15. package/dist/src/bench/marker-corpus.js.map +1 -0
  16. package/dist/src/bench/mcp-stdio.d.ts +55 -0
  17. package/dist/src/bench/mcp-stdio.d.ts.map +1 -0
  18. package/dist/src/bench/mcp-stdio.js +146 -0
  19. package/dist/src/bench/mcp-stdio.js.map +1 -0
  20. package/dist/src/bench/public-datasets.d.ts +2 -0
  21. package/dist/src/bench/public-datasets.d.ts.map +1 -1
  22. package/dist/src/bench/public-datasets.js +2 -1
  23. package/dist/src/bench/public-datasets.js.map +1 -1
  24. package/dist/src/bench/public-harness.d.ts +14 -0
  25. package/dist/src/bench/public-harness.d.ts.map +1 -1
  26. package/dist/src/bench/public-harness.js +83 -8
  27. package/dist/src/bench/public-harness.js.map +1 -1
  28. package/dist/src/bench/public-pins.js +5 -5
  29. package/dist/src/bench/public-pins.js.map +1 -1
  30. package/dist/src/bench/split.d.ts +33 -0
  31. package/dist/src/bench/split.d.ts.map +1 -0
  32. package/dist/src/bench/split.js +56 -0
  33. package/dist/src/bench/split.js.map +1 -0
  34. package/dist/src/bench/stats.d.ts +40 -0
  35. package/dist/src/bench/stats.d.ts.map +1 -0
  36. package/dist/src/bench/stats.js +99 -0
  37. package/dist/src/bench/stats.js.map +1 -0
  38. package/dist/src/bench/vs-engines.d.ts +51 -0
  39. package/dist/src/bench/vs-engines.d.ts.map +1 -0
  40. package/dist/src/bench/vs-engines.js +121 -0
  41. package/dist/src/bench/vs-engines.js.map +1 -0
  42. package/dist/src/config.d.ts +33 -0
  43. package/dist/src/config.d.ts.map +1 -1
  44. package/dist/src/config.js +84 -1
  45. package/dist/src/config.js.map +1 -1
  46. package/dist/src/db/doctor.d.ts +8 -0
  47. package/dist/src/db/doctor.d.ts.map +1 -1
  48. package/dist/src/db/doctor.js +65 -1
  49. package/dist/src/db/doctor.js.map +1 -1
  50. package/dist/src/db/fts-queue.d.ts +35 -0
  51. package/dist/src/db/fts-queue.d.ts.map +1 -0
  52. package/dist/src/db/fts-queue.js +78 -0
  53. package/dist/src/db/fts-queue.js.map +1 -0
  54. package/dist/src/db/repository.d.ts +63 -1
  55. package/dist/src/db/repository.d.ts.map +1 -1
  56. package/dist/src/db/repository.js +244 -50
  57. package/dist/src/db/repository.js.map +1 -1
  58. package/dist/src/db/schema.d.ts +1 -1
  59. package/dist/src/db/schema.d.ts.map +1 -1
  60. package/dist/src/db/schema.js +63 -2
  61. package/dist/src/db/schema.js.map +1 -1
  62. package/dist/src/installer/copilot.d.ts +21 -0
  63. package/dist/src/installer/copilot.d.ts.map +1 -1
  64. package/dist/src/installer/copilot.js +72 -1
  65. package/dist/src/installer/copilot.js.map +1 -1
  66. package/dist/src/installer/gemini.d.ts +13 -0
  67. package/dist/src/installer/gemini.d.ts.map +1 -1
  68. package/dist/src/installer/gemini.js +64 -1
  69. package/dist/src/installer/gemini.js.map +1 -1
  70. package/dist/src/installer/hooks.d.ts +42 -5
  71. package/dist/src/installer/hooks.d.ts.map +1 -1
  72. package/dist/src/installer/hooks.js +270 -62
  73. package/dist/src/installer/hooks.js.map +1 -1
  74. package/dist/src/installer/json-config.d.ts +25 -1
  75. package/dist/src/installer/json-config.d.ts.map +1 -1
  76. package/dist/src/installer/json-config.js +95 -2
  77. package/dist/src/installer/json-config.js.map +1 -1
  78. package/dist/src/installer/mcp-command.d.ts +19 -0
  79. package/dist/src/installer/mcp-command.d.ts.map +1 -0
  80. package/dist/src/installer/mcp-command.js +57 -0
  81. package/dist/src/installer/mcp-command.js.map +1 -0
  82. package/dist/src/installer/mcp-init.d.ts +16 -0
  83. package/dist/src/installer/mcp-init.d.ts.map +1 -1
  84. package/dist/src/installer/mcp-init.js +34 -13
  85. package/dist/src/installer/mcp-init.js.map +1 -1
  86. package/dist/src/installer/opencode.d.ts +18 -0
  87. package/dist/src/installer/opencode.d.ts.map +1 -1
  88. package/dist/src/installer/opencode.js +81 -1
  89. package/dist/src/installer/opencode.js.map +1 -1
  90. package/dist/src/installer/setup.d.ts +7 -11
  91. package/dist/src/installer/setup.d.ts.map +1 -1
  92. package/dist/src/installer/setup.js +34 -31
  93. package/dist/src/installer/setup.js.map +1 -1
  94. package/dist/src/mcp/profiles.d.ts +9 -6
  95. package/dist/src/mcp/profiles.d.ts.map +1 -1
  96. package/dist/src/mcp/profiles.js +12 -9
  97. package/dist/src/mcp/profiles.js.map +1 -1
  98. package/dist/src/mcp/server.d.ts +1 -1
  99. package/dist/src/mcp/server.d.ts.map +1 -1
  100. package/dist/src/mcp/server.js +80 -0
  101. package/dist/src/mcp/server.js.map +1 -1
  102. package/dist/src/search/aggregate.d.ts +24 -0
  103. package/dist/src/search/aggregate.d.ts.map +1 -0
  104. package/dist/src/search/aggregate.js +59 -0
  105. package/dist/src/search/aggregate.js.map +1 -0
  106. package/dist/src/search/backfill.d.ts.map +1 -1
  107. package/dist/src/search/backfill.js +7 -2
  108. package/dist/src/search/backfill.js.map +1 -1
  109. package/dist/src/search/budget.d.ts +2 -0
  110. package/dist/src/search/budget.d.ts.map +1 -1
  111. package/dist/src/search/budget.js.map +1 -1
  112. package/dist/src/search/embeddings.d.ts +35 -2
  113. package/dist/src/search/embeddings.d.ts.map +1 -1
  114. package/dist/src/search/embeddings.js +128 -5
  115. package/dist/src/search/embeddings.js.map +1 -1
  116. package/dist/src/search/hybrid-rrf.d.ts +45 -0
  117. package/dist/src/search/hybrid-rrf.d.ts.map +1 -1
  118. package/dist/src/search/hybrid-rrf.js +212 -56
  119. package/dist/src/search/hybrid-rrf.js.map +1 -1
  120. package/dist/src/search/static-model-install.d.ts +43 -0
  121. package/dist/src/search/static-model-install.d.ts.map +1 -0
  122. package/dist/src/search/static-model-install.js +112 -0
  123. package/dist/src/search/static-model-install.js.map +1 -0
  124. package/dist/src/search/static-model.d.ts +63 -0
  125. package/dist/src/search/static-model.d.ts.map +1 -0
  126. package/dist/src/search/static-model.js +244 -0
  127. package/dist/src/search/static-model.js.map +1 -0
  128. package/dist/src/search/temporal.d.ts +32 -0
  129. package/dist/src/search/temporal.d.ts.map +1 -0
  130. package/dist/src/search/temporal.js +164 -0
  131. package/dist/src/search/temporal.js.map +1 -0
  132. package/dist/src/ui/server.d.ts.map +1 -1
  133. package/dist/src/ui/server.js +10 -0
  134. package/dist/src/ui/server.js.map +1 -1
  135. package/dist-ui/assets/{ActionsPage-B3quzFNF.js → ActionsPage-CI-IRMeS.js} +1 -1
  136. package/dist-ui/assets/{GraphPage-DetiATmC.js → GraphPage-BdYMF7yz.js} +1 -1
  137. package/dist-ui/assets/{ObservatoryPage-QIGMwENf.js → ObservatoryPage-BG_vg8B9.js} +1 -1
  138. package/dist-ui/assets/{TreemapPage-C7uLZd37.js → TreemapPage-CZreyyLA.js} +1 -1
  139. package/dist-ui/assets/index-Ca9pma3Q.css +1 -0
  140. package/dist-ui/assets/{index-DWAH--Fu.js → index-MlNuiu0T.js} +17 -17
  141. package/dist-ui/assets/{maximize-2-BebkGbZA.js → maximize-2-_nvSvCC7.js} +1 -1
  142. package/dist-ui/build-manifest.json +11 -11
  143. package/dist-ui/index.html +2 -2
  144. package/llms-install.md +3 -3
  145. package/package.json +5 -1
  146. package/server.json +1 -1
  147. package/skills/fastr-setup/SKILL.md +4 -4
  148. package/skills/skills.json +1 -1
  149. package/dist-ui/assets/index-BJnPINTu.css +0 -1
@@ -1,7 +1,10 @@
1
- import { cosineSimilarity, decodeTaggedEmbedding, EMBEDDING_MODEL_IDS, getProviderForModel, VECTOR_SIMILARITY_THRESHOLDS, warmupEmbeddingModel } from './embeddings.js';
1
+ import { cosineSimilarity, decodeTaggedEmbedding, EMBEDDING_MODEL_IDS, embedQueryCached, getProviderForModel, resolveVectorMode, VECTOR_SIMILARITY_THRESHOLDS, warmupEmbeddingModel } from './embeddings.js';
2
2
  import { scheduleBackfill } from './backfill.js';
3
+ import { drainFtsQueue } from '../db/fts-queue.js';
3
4
  import { packMemoriesIntoBudget, TOKEN_LEVELS } from './budget.js';
4
5
  import { extractEntities } from '../learn/ner.js';
6
+ import { detectTemporalWindow, parseQuestionDate, withinWindow } from './temporal.js';
7
+ import { detectAggregateIntent } from './aggregate.js';
5
8
  /**
6
9
  * Annotate ranked results with open contradictions. Both sides are marked when both are
7
10
  * present, so an agent sees the warning regardless of which rule it recalls first.
@@ -99,16 +102,56 @@ export function sanitizeFtsQuery(query) {
99
102
  return words.map((w) => `"${w}"`).join(' OR ');
100
103
  }
101
104
  export async function searchMemories(db, params) {
102
- const { projectId, query, files = [], module: targetModule, includeHistory = false, budgetTokens = TOKEN_LEVELS.L2_TASK_RECALL, maxPerSession = 3, limit, backfill = process.env.FASTR_EMBEDDINGS_MODEL === '1' } = params;
105
+ const { projectId, query, files = [], module: targetModule, includeHistory = false, budgetTokens = TOKEN_LEVELS.L2_TASK_RECALL, maxPerSession = 3, limit, backfill } = params;
103
106
  const retrieval = params.retrieval ?? {};
104
107
  const rrfK = Math.max(1, retrieval.rrfK ?? 20);
108
+ /**
109
+ * Temporal window: parsed once from the query and the question date, then applied at
110
+ * fusion time. Date-bounded questions ("how many times did I bake in the past two
111
+ * weeks") share words with every session, so BM25 alone ranks by topic and loses the
112
+ * rows that actually fall inside the range. The window is a filter, never a score.
113
+ */
114
+ const temporalWindow = retrieval.temporalFilter
115
+ ? detectTemporalWindow(query, parseQuestionDate(retrieval.questionDate))
116
+ : null;
117
+ // A window makes most candidates irrelevant, so the first stage keeps a deeper pool;
118
+ // without one the caps stay at 50 and query cost is unchanged.
119
+ const bm25Limit = temporalWindow ? 200 : 50;
120
+ const vectorLimit = temporalWindow ? 100 : 50;
121
+ /**
122
+ * Aggregate intent. A counting question is answered by collecting every session that
123
+ * mentions the activity, so the lexical query drops the scaffolding words that are
124
+ * frequent across the corpus and keeps only the content terms.
125
+ */
126
+ const aggregate = retrieval.aggregateCoverage === false
127
+ ? { detected: false, terms: [] }
128
+ : detectAggregateIntent(query);
129
+ const lexicalQuery = aggregate.detected && aggregate.terms.length > 0
130
+ ? aggregate.terms.join(' ')
131
+ : query;
105
132
  const streamWeights = {
106
133
  bm25: retrieval.streamWeights?.bm25 ?? 1,
107
134
  vector: retrieval.streamWeights?.vector ?? 1,
108
135
  graph: retrieval.streamWeights?.graph ?? 1
109
136
  };
110
137
  const enableBm25 = retrieval.enableBm25 ?? true;
111
- const enableVector = retrieval.enableVector ?? true;
138
+ /**
139
+ * Production default: the vector stream is off unless a real semantic provider is loaded.
140
+ * Feature-hash vectors duplicate BM25 lexically and measurably regress Hit@1, so they are
141
+ * reachable only via an explicit vectorMode: 'hash' or FASTR_VECTOR_MODE=hash.
142
+ */
143
+ const vectorMode = retrieval.vectorMode
144
+ ? resolveVectorMode(retrieval.vectorMode)
145
+ : retrieval.enableVector === true
146
+ ? 'hash'
147
+ : retrieval.enableVector === false
148
+ ? 'off'
149
+ : resolveVectorMode();
150
+ const enableVector = vectorMode !== 'off';
151
+ const allowHashVectors = vectorMode === 'hash';
152
+ // Embedding backfill follows the same rule as recall: it never generates hash vectors
153
+ // implicitly. A caller may still force it explicitly.
154
+ const shouldBackfill = backfill ?? enableVector;
112
155
  const enableGraph = retrieval.enableGraph ?? true;
113
156
  const graphSeedFromCandidates = retrieval.graphSeedFromCandidates ?? false;
114
157
  const trapBoost = retrieval.trapBoost ?? 2.0;
@@ -117,7 +160,7 @@ export async function searchMemories(db, params) {
117
160
  const queryHasTrapIntent = /\b(trap|avoid|mistake|error|fail(?:ed|ure)?|bug|regression|before editing|warning|guard)\b/i.test(query);
118
161
  const candidatesMap = new Map();
119
162
  // Semantic vectors and feature-hash vectors need different fusion weights:
120
- // hash vectors are lexical duplicates of BM25, while MiniLM adds independent signal.
163
+ // hash vectors are lexical duplicates of BM25, while a semantic model adds independent signal.
121
164
  let semanticVectorSeen = false;
122
165
  // Helper to test if a memory passes filters
123
166
  const passesFilter = (m) => {
@@ -134,48 +177,99 @@ export async function searchMemories(db, params) {
134
177
  return true;
135
178
  };
136
179
  // --- STREAM A: BM25 FTS5 Keyword Search ---
137
- const ftsQuery = enableBm25 ? sanitizeFtsQuery(query) : '';
138
- if (ftsQuery) {
180
+ // Read-your-writes: index anything the writer deferred before running BM25. This is a
181
+ // bounded, idempotent batch and a no-op once the queue is empty.
182
+ if (enableBm25) {
139
183
  try {
140
- const isGlobalAttached = hasGlobalDb(db);
141
- // Column order is id (UNINDEXED), title, module, content. The leading 0.0 weight
142
- // keeps the unindexed id column out of the score while boosting title and module.
143
- const bm25Expr = 'bm25(memories_fts, 0.0, 10.0, 5.0, 1.0)';
144
- let querySql = `
184
+ drainFtsQueue(db, { limit: 500, schema: 'main' });
185
+ if (hasGlobalDb(db))
186
+ drainFtsQueue(db, { limit: 500, schema: 'global_db' });
187
+ }
188
+ catch {
189
+ // A stale index must never fail a search.
190
+ }
191
+ }
192
+ /**
193
+ * Runs one FTS5 MATCH and returns the matching rows in BM25 order. The main and global
194
+ * databases are queried separately and merged locally so each branch is capped on its
195
+ * own; a global row never displaces a project row before the cap.
196
+ */
197
+ const runBm25 = (expression) => {
198
+ if (!expression)
199
+ return [];
200
+ const isGlobalAttached = hasGlobalDb(db);
201
+ // Column order is id (UNINDEXED), title, module, content. The leading 0.0 weight
202
+ // keeps the unindexed id column out of the score while boosting title and module.
203
+ const bm25Expr = 'bm25(memories_fts, 0.0, 10.0, 5.0, 1.0)';
204
+ let querySql = `
205
+ SELECT * FROM (
206
+ SELECT m.*, ${bm25Expr} AS rank
207
+ FROM memories_fts f
208
+ JOIN memories m ON m.id = f.id
209
+ WHERE (m.project_id = ? OR m.project_id = 'global')
210
+ AND memories_fts MATCH ?
211
+ ORDER BY rank ASC
212
+ LIMIT ${bm25Limit}
213
+ )
214
+ `;
215
+ const ftsParams = [projectId, expression];
216
+ if (isGlobalAttached) {
217
+ // FTS5's bm25() and MATCH both take the table name, not a schema-qualified
218
+ // name or an alias. Keeping the FTS table unaliased makes the unqualified
219
+ // `memories_fts` resolve to the attached table in this subquery.
220
+ const globalBm25Expr = 'bm25(memories_fts, 0.0, 10.0, 5.0, 1.0)';
221
+ querySql += `
222
+ UNION ALL
145
223
  SELECT * FROM (
146
- SELECT m.*, ${bm25Expr} AS rank
147
- FROM memories_fts f
148
- JOIN memories m ON m.id = f.id
149
- WHERE (m.project_id = ? OR m.project_id = 'global')
150
- AND memories_fts MATCH ?
224
+ SELECT gm.*, ${globalBm25Expr} AS rank
225
+ FROM global_db.memories_fts
226
+ JOIN global_db.memories gm ON gm.id = memories_fts.id
227
+ WHERE memories_fts MATCH ?
151
228
  ORDER BY rank ASC
152
- LIMIT 50
229
+ LIMIT ${bm25Limit}
153
230
  )
154
231
  `;
155
- const ftsParams = [projectId, ftsQuery];
156
- if (isGlobalAttached) {
157
- // FTS5's bm25() and MATCH both take the table name, not a schema-qualified
158
- // name or an alias. Keeping the FTS table unaliased makes the unqualified
159
- // `memories_fts` resolve to the attached table in this subquery.
160
- const globalBm25Expr = 'bm25(memories_fts, 0.0, 10.0, 5.0, 1.0)';
161
- querySql += `
162
- UNION ALL
163
- SELECT * FROM (
164
- SELECT gm.*, ${globalBm25Expr} AS rank
165
- FROM global_db.memories_fts
166
- JOIN global_db.memories gm ON gm.id = memories_fts.id
167
- WHERE memories_fts MATCH ?
168
- ORDER BY rank ASC
169
- LIMIT 50
170
- )
171
- `;
172
- ftsParams.push(ftsQuery);
232
+ ftsParams.push(expression);
233
+ }
234
+ // Merge the two locally-limited streams and cap the combined candidate set.
235
+ querySql = `SELECT * FROM (${querySql}) ORDER BY rank ASC LIMIT ${bm25Limit}`;
236
+ return db.prepare(querySql).all(...ftsParams);
237
+ };
238
+ const ftsQuery = enableBm25 ? sanitizeFtsQuery(query) : '';
239
+ const aggregateFtsQuery = enableBm25 && lexicalQuery !== query ? sanitizeFtsQuery(lexicalQuery) : '';
240
+ if (ftsQuery || aggregateFtsQuery) {
241
+ try {
242
+ const primary = runBm25(ftsQuery);
243
+ const secondary = aggregateFtsQuery ? runBm25(aggregateFtsQuery) : [];
244
+ /**
245
+ * When an aggregate question runs two lexical queries, a document found by both
246
+ * outranks a document found by only one: the two rank lists are fused with the same
247
+ * reciprocal-rank rule the streams use. That keeps the original query's precision
248
+ * (its rank-1 is almost always also in the stripped list) while admitting the
249
+ * deeper rows only the stripped query reaches.
250
+ */
251
+ let ordered;
252
+ if (secondary.length === 0) {
253
+ ordered = primary.map((row) => ({ row, score: row.rank }));
254
+ }
255
+ else {
256
+ const fused = new Map();
257
+ primary.forEach((row, index) => {
258
+ fused.set(row.id, { row, score: 1 / (rrfK + index + 1) });
259
+ });
260
+ secondary.forEach((row, index) => {
261
+ const contribution = 1 / (rrfK + index + 1);
262
+ const existing = fused.get(row.id);
263
+ if (existing)
264
+ existing.score += contribution;
265
+ else
266
+ fused.set(row.id, { row, score: contribution });
267
+ });
268
+ // Higher fused score first; ties keep the primary query's order via insertion.
269
+ ordered = [...fused.values()].sort((a, b) => b.score - a.score);
173
270
  }
174
- // Merge the two locally-limited streams and cap the combined candidate set.
175
- querySql = `SELECT * FROM (${querySql}) ORDER BY rank ASC LIMIT 50`;
176
- const rows = db.prepare(querySql).all(...ftsParams);
177
271
  let rank = 1;
178
- for (const row of rows) {
272
+ for (const { row } of ordered) {
179
273
  if (passesFilter(row)) {
180
274
  if (!candidatesMap.has(row.id)) {
181
275
  candidatesMap.set(row.id, { memory: row, rankA: rank });
@@ -197,10 +291,17 @@ export async function searchMemories(db, params) {
197
291
  // if memories in scope are already embedded, and only with a provider for the SAME
198
292
  // model id that is usable right now (offline feature-hash, or an already-loaded model).
199
293
  // Vectors from different/unknown models are never compared.
200
- if (enableVector) {
201
- warmupEmbeddingModel(); // no-op unless FASTR_EMBEDDINGS_MODEL=1; never awaited
202
- }
294
+ // Model warmup is an explicit operator opt-in (FASTR_EMBEDDINGS_MODEL=1) and is never
295
+ // awaited, so it stays independent of the vector stream being enabled for this query.
296
+ warmupEmbeddingModel();
203
297
  if (enableVector && query.trim().length > 0) {
298
+ // Static vectors rerank only the BM25 candidate set. BM25 already caps at 50 rows;
299
+ // 100 is the ceiling if that cap grows, so query cost does not scale with the database.
300
+ const bm25CandidateIds = new Set([...candidatesMap.values()]
301
+ .filter((candidate) => candidate.rankA !== undefined)
302
+ .sort((a, b) => (a.rankA ?? 0) - (b.rankA ?? 0))
303
+ .slice(0, 100)
304
+ .map((candidate) => candidate.memory.id));
204
305
  const isGlobalAttached = hasGlobalDb(db);
205
306
  let vecSql = `
206
307
  SELECT * FROM memories
@@ -232,14 +333,27 @@ export async function searchMemories(db, params) {
232
333
  const decoded = decodeTaggedEmbedding(row.embedding);
233
334
  if (!decoded)
234
335
  continue; // legacy / untagged vector: unknown model, never compared
235
- if (decoded.modelId === EMBEDDING_MODEL_IDS.MINILM_L6_V2)
336
+ // Rows embedded by the feature-hash vectorizer are inert unless hash mode is on.
337
+ // This keeps a database written by an older default from re-enabling the regression.
338
+ if (decoded.modelId === EMBEDDING_MODEL_IDS.FEATURE_HASH_384 && !allowHashVectors)
339
+ continue;
340
+ if (decoded.modelId === EMBEDDING_MODEL_IDS.MINILM_L6_V2 ||
341
+ decoded.modelId === EMBEDDING_MODEL_IDS.STATIC_POTION_256) {
236
342
  semanticVectorSeen = true;
343
+ }
344
+ // The static tier is a bounded reranker, not a full scan: it only scores the BM25
345
+ // candidate set (top 50 today, capped at 100) so query cost stays flat as the
346
+ // database grows.
347
+ if (decoded.modelId === EMBEDDING_MODEL_IDS.STATIC_POTION_256 &&
348
+ !bm25CandidateIds.has(row.id)) {
349
+ continue;
350
+ }
237
351
  if (!queryVecs.has(decoded.modelId)) {
238
- const provider = getProviderForModel(decoded.modelId);
352
+ const provider = getProviderForModel(decoded.modelId, allowHashVectors);
239
353
  let qv = null;
240
354
  if (provider) {
241
355
  try {
242
- qv = await provider.embed(query);
356
+ qv = await embedQueryCached(provider, lexicalQuery);
243
357
  }
244
358
  catch {
245
359
  qv = null;
@@ -252,18 +366,27 @@ export async function searchMemories(db, params) {
252
366
  continue;
253
367
  const sim = cosineSimilarity(queryVec, decoded.vector);
254
368
  const threshold = retrieval.vectorThreshold ?? VECTOR_SIMILARITY_THRESHOLDS[decoded.modelId] ?? 0.5;
255
- if (sim >= threshold) {
256
- scoredVectors.push({ memory: row, sim });
369
+ // A zero cosine means an empty or orthogonal vector; it is never a match.
370
+ if (sim > 0 && sim >= threshold) {
371
+ scoredVectors.push({ memory: row, sim, modelId: decoded.modelId });
257
372
  }
258
373
  }
259
374
  scoredVectors.sort((a, b) => b.sim - a.sim);
260
375
  let rank = 1;
261
- for (const item of scoredVectors.slice(0, 50)) {
262
- if (!candidatesMap.has(item.memory.id)) {
263
- candidatesMap.set(item.memory.id, { memory: item.memory, rankB: rank });
376
+ for (const item of scoredVectors.slice(0, vectorLimit)) {
377
+ const existing = candidatesMap.get(item.memory.id);
378
+ const isStatic = item.modelId === EMBEDDING_MODEL_IDS.STATIC_POTION_256;
379
+ if (!existing) {
380
+ candidatesMap.set(item.memory.id, isStatic
381
+ ? { memory: item.memory, staticSim: item.sim }
382
+ : { memory: item.memory, rankB: rank });
383
+ }
384
+ else if (isStatic) {
385
+ // A static vector is a bounded rerank score, never a rank contribution.
386
+ existing.staticSim = item.sim;
264
387
  }
265
388
  else {
266
- candidatesMap.get(item.memory.id).rankB = rank;
389
+ existing.rankB = rank;
267
390
  }
268
391
  rank++;
269
392
  }
@@ -413,9 +536,10 @@ export async function searchMemories(db, params) {
413
536
  }
414
537
  // --- RRF FUSION & MULTIPLIERS ---
415
538
  const effectiveVectorWeight = retrieval.streamWeights?.vector ?? (semanticVectorSeen ? 3 : 1);
416
- const allScored = [];
539
+ const staticBlendWeight = retrieval.staticBlendWeight ?? 0.15;
540
+ let allScored = [];
417
541
  for (const [, item] of candidatesMap) {
418
- const { memory, rankA, rankB, rankC } = item;
542
+ const { memory, rankA, rankB, rankC, staticSim } = item;
419
543
  let rrf = 0;
420
544
  if (rankA !== undefined)
421
545
  rrf += streamWeights.bm25 / (rrfK + rankA);
@@ -423,6 +547,12 @@ export async function searchMemories(db, params) {
423
547
  rrf += effectiveVectorWeight / (rrfK + rankB);
424
548
  if (rankC !== undefined)
425
549
  rrf += streamWeights.graph / (rrfK + rankC);
550
+ // The static tier reranks BM25 candidates by adding a bounded cosine bonus: at most
551
+ // `staticBlendWeight` of a rank-1 BM25 hit, so it can settle near-ties but never
552
+ // displace a clearly better lexical match.
553
+ if (staticSim !== undefined && staticBlendWeight > 0) {
554
+ rrf += (staticBlendWeight * Math.max(0, staticSim)) / (rrfK + 1);
555
+ }
426
556
  if (rrf === 0)
427
557
  continue;
428
558
  // Multipliers (both are configurable so ablations can disable them cleanly).
@@ -443,6 +573,26 @@ export async function searchMemories(db, params) {
443
573
  }
444
574
  // Sort by final score FIRST, then diversify, so per-session caps drop the weakest items.
445
575
  allScored.sort((a, b) => b.score - a.score);
576
+ /**
577
+ * Temporal filter. Applied after fusion and before diversification so the window can
578
+ * never change the relative order of the rows it keeps. If the window excludes every
579
+ * candidate the parse was wrong for this corpus, so retrieval falls back to the
580
+ * unfiltered ranking and says so instead of returning nothing.
581
+ */
582
+ let temporalFallback = false;
583
+ let temporalRows = allScored;
584
+ if (temporalWindow) {
585
+ const inWindow = allScored.filter((item) => withinWindow(item.memory.valid_from, temporalWindow));
586
+ if (inWindow.length > 0) {
587
+ for (const item of inWindow)
588
+ item.temporalMatch = true;
589
+ temporalRows = inWindow;
590
+ }
591
+ else {
592
+ temporalFallback = true;
593
+ }
594
+ }
595
+ allScored = temporalRows;
446
596
  // Session Diversification: only applies to memories with a known source session;
447
597
  // memories without provenance (empty source_event_ids) are never capped.
448
598
  const scoredMemories = [];
@@ -464,7 +614,11 @@ export async function searchMemories(db, params) {
464
614
  }
465
615
  scoredMemories.push(scored);
466
616
  }
467
- const maxItems = limit !== undefined && limit >= 0 ? Math.floor(limit) : Number.POSITIVE_INFINITY;
617
+ // An aggregate question needs the whole set, not the usual handful, so the caller can
618
+ // count or enumerate. The cap is explicit and bounded; it never widens a normal query.
619
+ const aggregateLimit = aggregate.detected ? Math.max(0, Math.floor(retrieval.aggregateLimit ?? 20)) : 0;
620
+ const requested = limit !== undefined && limit >= 0 ? Math.floor(limit) : Number.POSITIVE_INFINITY;
621
+ const maxItems = aggregateLimit > 0 ? Math.max(requested, aggregateLimit) : requested;
468
622
  // `memories` is the ranked result set (metadata + full content). `text` is the
469
623
  // compact prompt context and is the only part constrained by budgetTokens.
470
624
  // Keeping the two separate means a small context never hides the full ranked
@@ -475,13 +629,15 @@ export async function searchMemories(db, params) {
475
629
  // Bounded, non-blocking embedding backfill. Enabled by default only when the
476
630
  // local semantic model is explicitly enabled; hash vectors duplicate lexical BM25
477
631
  // and should not be generated implicitly.
478
- if (backfill) {
632
+ if (shouldBackfill) {
479
633
  scheduleBackfill(db, projectId);
480
634
  }
481
635
  return {
482
636
  text: packed.text,
483
637
  memories: ranked,
484
- totalTokens: packed.totalTokens
638
+ totalTokens: packed.totalTokens,
639
+ ...(temporalWindow ? { temporalWindow, temporalFallback } : {}),
640
+ ...(aggregate.detected ? { aggregate: { detected: true, limit: aggregateLimit } } : {})
485
641
  };
486
642
  }
487
643
  //# sourceMappingURL=hybrid-rrf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-rrf.js","sourceRoot":"","sources":["../../../src/search/hybrid-rrf.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hybrid-rrf.js","sourceRoot":"","sources":["../../../src/search/hybrid-rrf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Installer for the optional static semantic model (model2vec `potion-base-8M`).
3
+ *
4
+ * The 30 MB asset is never downloaded implicitly: `fastr model install` is an explicit
5
+ * operator action, the download is pinned to a revision and verified by SHA-256, and a
6
+ * failed verification leaves no partial model behind.
7
+ */
8
+ export interface StaticModelFilePin {
9
+ file: string;
10
+ bytes: number;
11
+ sha256: string;
12
+ }
13
+ export declare const STATIC_MODEL_FILES: StaticModelFilePin[];
14
+ export declare function staticModelDir(homeDir?: string): string;
15
+ export interface StaticModelStatus {
16
+ installed: boolean;
17
+ dir: string;
18
+ bytes: number;
19
+ missing: string[];
20
+ }
21
+ /** Reports whether a complete, loadable model is present. Never downloads. */
22
+ export declare function staticModelStatus(homeDir?: string): StaticModelStatus;
23
+ export interface InstallStaticModelOptions {
24
+ homeDir?: string;
25
+ /** Re-download even when a valid copy is present. */
26
+ force?: boolean;
27
+ onProgress?: (message: string) => void;
28
+ /** Injectable for tests; defaults to the pinned HuggingFace URLs. */
29
+ urlFor?: (file: string) => string;
30
+ }
31
+ export interface InstallStaticModelResult {
32
+ dir: string;
33
+ downloaded: string[];
34
+ alreadyPresent: boolean;
35
+ }
36
+ /**
37
+ * Downloads and verifies the static model. Idempotent: a verified existing copy is reused
38
+ * unless `force` is set. Any hash/size mismatch aborts and deletes the partial file.
39
+ */
40
+ export declare function installStaticModel(options?: InstallStaticModelOptions): Promise<InstallStaticModelResult>;
41
+ /** Removes the installed model. Returns true when something was deleted. */
42
+ export declare function removeStaticModel(homeDir?: string): boolean;
43
+ //# sourceMappingURL=static-model-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-model-install.d.ts","sourceRoot":"","sources":["../../../src/search/static-model-install.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,EAGlD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,GAAE,MAA2B,GAAG,MAAM,CAE3E;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAA2B,GAAG,iBAAiB,CAazF;AAmCD,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,qEAAqE;IACrE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAsCnH;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAA2B,GAAG,OAAO,CAK/E"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Installer for the optional static semantic model (model2vec `potion-base-8M`).
3
+ *
4
+ * The 30 MB asset is never downloaded implicitly: `fastr model install` is an explicit
5
+ * operator action, the download is pinned to a revision and verified by SHA-256, and a
6
+ * failed verification leaves no partial model behind.
7
+ */
8
+ import { createHash } from 'node:crypto';
9
+ import * as fs from 'node:fs';
10
+ import * as path from 'node:path';
11
+ import { resolveFastrHome } from '../config.js';
12
+ import { POTION_BASE_8M, loadStaticModel } from './static-model.js';
13
+ const RESOLVE_BASE = `https://huggingface.co/${POTION_BASE_8M.name}/resolve/${POTION_BASE_8M.revision}`;
14
+ export const STATIC_MODEL_FILES = [
15
+ { file: POTION_BASE_8M.modelFile, bytes: POTION_BASE_8M.modelBytes, sha256: POTION_BASE_8M.modelSha256 },
16
+ { file: POTION_BASE_8M.tokenizerFile, bytes: POTION_BASE_8M.tokenizerBytes, sha256: POTION_BASE_8M.tokenizerSha256 }
17
+ ];
18
+ export function staticModelDir(homeDir = resolveFastrHome()) {
19
+ return path.join(homeDir, '.fastr', 'models', 'potion-base-8M');
20
+ }
21
+ /** Reports whether a complete, loadable model is present. Never downloads. */
22
+ export function staticModelStatus(homeDir = resolveFastrHome()) {
23
+ const dir = staticModelDir(homeDir);
24
+ const missing = [];
25
+ let bytes = 0;
26
+ for (const pin of STATIC_MODEL_FILES) {
27
+ const file = path.join(dir, pin.file);
28
+ if (!fs.existsSync(file) || fs.statSync(file).size !== pin.bytes) {
29
+ missing.push(pin.file);
30
+ continue;
31
+ }
32
+ bytes += pin.bytes;
33
+ }
34
+ return { installed: missing.length === 0, dir, bytes, missing };
35
+ }
36
+ function sha256File(file) {
37
+ return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
38
+ }
39
+ async function download(file, url, expectedBytes, onProgress) {
40
+ const response = await fetch(url, { redirect: 'follow' });
41
+ if (!response.ok || !response.body) {
42
+ throw new Error(`download failed: ${response.status} ${response.statusText} (${url})`);
43
+ }
44
+ const total = Number(response.headers.get('content-length')) || expectedBytes;
45
+ const temp = `${file}.part`;
46
+ const handle = fs.openSync(temp, 'w');
47
+ let received = 0;
48
+ let lastReported = 0;
49
+ try {
50
+ for await (const chunk of response.body) {
51
+ fs.writeSync(handle, chunk);
52
+ received += chunk.byteLength;
53
+ if (onProgress && (received - lastReported >= 4_000_000 || received === total)) {
54
+ lastReported = received;
55
+ onProgress(received, total);
56
+ }
57
+ }
58
+ }
59
+ finally {
60
+ fs.closeSync(handle);
61
+ }
62
+ if (received !== expectedBytes) {
63
+ fs.rmSync(temp, { force: true });
64
+ throw new Error(`${path.basename(file)} is ${received} bytes, expected ${expectedBytes}`);
65
+ }
66
+ fs.renameSync(temp, file);
67
+ }
68
+ /**
69
+ * Downloads and verifies the static model. Idempotent: a verified existing copy is reused
70
+ * unless `force` is set. Any hash/size mismatch aborts and deletes the partial file.
71
+ */
72
+ export async function installStaticModel(options = {}) {
73
+ const dir = staticModelDir(options.homeDir);
74
+ const log = options.onProgress ?? (() => { });
75
+ const urlFor = options.urlFor ?? ((file) => `${RESOLVE_BASE}/${file}?download=true`);
76
+ fs.mkdirSync(dir, { recursive: true });
77
+ const downloaded = [];
78
+ for (const pin of STATIC_MODEL_FILES) {
79
+ const target = path.join(dir, pin.file);
80
+ const valid = fs.existsSync(target)
81
+ && fs.statSync(target).size === pin.bytes
82
+ && sha256File(target) === pin.sha256;
83
+ if (valid && !options.force) {
84
+ log(`${pin.file}: already installed (${pin.bytes} bytes, sha256 verified)`);
85
+ continue;
86
+ }
87
+ log(`${pin.file}: downloading ${(pin.bytes / 1_000_000).toFixed(1)} MB from ${POTION_BASE_8M.name}@${POTION_BASE_8M.revision}`);
88
+ await download(target, urlFor(pin.file), pin.bytes, (received, total) => {
89
+ log(`${pin.file}: ${((received / Math.max(1, total)) * 100).toFixed(0)}%`);
90
+ });
91
+ const actual = sha256File(target);
92
+ if (actual !== pin.sha256) {
93
+ fs.rmSync(target, { force: true });
94
+ throw new Error(`${pin.file} sha256 ${actual} does not match the pin ${pin.sha256}`);
95
+ }
96
+ log(`${pin.file}: sha256 verified`);
97
+ downloaded.push(pin.file);
98
+ }
99
+ // Load once so a corrupt-but-correct-size file fails here, not inside recall.
100
+ const model = loadStaticModel(dir);
101
+ log(`model ready: ${model.vocabSize} x ${model.dim} float32`);
102
+ return { dir, downloaded, alreadyPresent: downloaded.length === 0 };
103
+ }
104
+ /** Removes the installed model. Returns true when something was deleted. */
105
+ export function removeStaticModel(homeDir = resolveFastrHome()) {
106
+ const dir = staticModelDir(homeDir);
107
+ if (!fs.existsSync(dir))
108
+ return false;
109
+ fs.rmSync(dir, { recursive: true, force: true });
110
+ return true;
111
+ }
112
+ //# sourceMappingURL=static-model-install.js.map