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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/.cursor/mcp.json +1 -1
- package/.cursor/skills/fastr-setup/SKILL.md +4 -4
- package/.cursor/skills/skills.json +1 -1
- package/README.md +87 -36
- package/dist/bin/fastr.js +131 -17
- package/dist/bin/fastr.js.map +1 -1
- package/dist/src/bench/harness.d.ts.map +1 -1
- package/dist/src/bench/harness.js +4 -0
- package/dist/src/bench/harness.js.map +1 -1
- package/dist/src/bench/marker-corpus.d.ts +98 -0
- package/dist/src/bench/marker-corpus.d.ts.map +1 -0
- package/dist/src/bench/marker-corpus.js +306 -0
- package/dist/src/bench/marker-corpus.js.map +1 -0
- package/dist/src/bench/mcp-stdio.d.ts +55 -0
- package/dist/src/bench/mcp-stdio.d.ts.map +1 -0
- package/dist/src/bench/mcp-stdio.js +146 -0
- package/dist/src/bench/mcp-stdio.js.map +1 -0
- package/dist/src/bench/public-datasets.d.ts +2 -0
- package/dist/src/bench/public-datasets.d.ts.map +1 -1
- package/dist/src/bench/public-datasets.js +2 -1
- package/dist/src/bench/public-datasets.js.map +1 -1
- package/dist/src/bench/public-harness.d.ts +14 -0
- package/dist/src/bench/public-harness.d.ts.map +1 -1
- package/dist/src/bench/public-harness.js +83 -8
- package/dist/src/bench/public-harness.js.map +1 -1
- package/dist/src/bench/public-pins.js +5 -5
- package/dist/src/bench/public-pins.js.map +1 -1
- package/dist/src/bench/split.d.ts +33 -0
- package/dist/src/bench/split.d.ts.map +1 -0
- package/dist/src/bench/split.js +56 -0
- package/dist/src/bench/split.js.map +1 -0
- package/dist/src/bench/stats.d.ts +40 -0
- package/dist/src/bench/stats.d.ts.map +1 -0
- package/dist/src/bench/stats.js +99 -0
- package/dist/src/bench/stats.js.map +1 -0
- package/dist/src/bench/vs-engines.d.ts +51 -0
- package/dist/src/bench/vs-engines.d.ts.map +1 -0
- package/dist/src/bench/vs-engines.js +121 -0
- package/dist/src/bench/vs-engines.js.map +1 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +84 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/db/doctor.d.ts +8 -0
- package/dist/src/db/doctor.d.ts.map +1 -1
- package/dist/src/db/doctor.js +65 -1
- package/dist/src/db/doctor.js.map +1 -1
- package/dist/src/db/fts-queue.d.ts +35 -0
- package/dist/src/db/fts-queue.d.ts.map +1 -0
- package/dist/src/db/fts-queue.js +78 -0
- package/dist/src/db/fts-queue.js.map +1 -0
- package/dist/src/db/repository.d.ts +63 -1
- package/dist/src/db/repository.d.ts.map +1 -1
- package/dist/src/db/repository.js +244 -50
- package/dist/src/db/repository.js.map +1 -1
- package/dist/src/db/schema.d.ts +1 -1
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +63 -2
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/installer/copilot.d.ts +21 -0
- package/dist/src/installer/copilot.d.ts.map +1 -1
- package/dist/src/installer/copilot.js +72 -1
- package/dist/src/installer/copilot.js.map +1 -1
- package/dist/src/installer/gemini.d.ts +13 -0
- package/dist/src/installer/gemini.d.ts.map +1 -1
- package/dist/src/installer/gemini.js +64 -1
- package/dist/src/installer/gemini.js.map +1 -1
- package/dist/src/installer/hooks.d.ts +42 -5
- package/dist/src/installer/hooks.d.ts.map +1 -1
- package/dist/src/installer/hooks.js +270 -62
- package/dist/src/installer/hooks.js.map +1 -1
- package/dist/src/installer/json-config.d.ts +25 -1
- package/dist/src/installer/json-config.d.ts.map +1 -1
- package/dist/src/installer/json-config.js +95 -2
- package/dist/src/installer/json-config.js.map +1 -1
- package/dist/src/installer/mcp-command.d.ts +19 -0
- package/dist/src/installer/mcp-command.d.ts.map +1 -0
- package/dist/src/installer/mcp-command.js +57 -0
- package/dist/src/installer/mcp-command.js.map +1 -0
- package/dist/src/installer/mcp-init.d.ts +16 -0
- package/dist/src/installer/mcp-init.d.ts.map +1 -1
- package/dist/src/installer/mcp-init.js +34 -13
- package/dist/src/installer/mcp-init.js.map +1 -1
- package/dist/src/installer/opencode.d.ts +18 -0
- package/dist/src/installer/opencode.d.ts.map +1 -1
- package/dist/src/installer/opencode.js +81 -1
- package/dist/src/installer/opencode.js.map +1 -1
- package/dist/src/installer/setup.d.ts +7 -11
- package/dist/src/installer/setup.d.ts.map +1 -1
- package/dist/src/installer/setup.js +34 -31
- package/dist/src/installer/setup.js.map +1 -1
- package/dist/src/mcp/profiles.d.ts +9 -6
- package/dist/src/mcp/profiles.d.ts.map +1 -1
- package/dist/src/mcp/profiles.js +12 -9
- package/dist/src/mcp/profiles.js.map +1 -1
- package/dist/src/mcp/server.d.ts +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +80 -0
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/search/aggregate.d.ts +24 -0
- package/dist/src/search/aggregate.d.ts.map +1 -0
- package/dist/src/search/aggregate.js +59 -0
- package/dist/src/search/aggregate.js.map +1 -0
- package/dist/src/search/backfill.d.ts.map +1 -1
- package/dist/src/search/backfill.js +7 -2
- package/dist/src/search/backfill.js.map +1 -1
- package/dist/src/search/budget.d.ts +2 -0
- package/dist/src/search/budget.d.ts.map +1 -1
- package/dist/src/search/budget.js.map +1 -1
- package/dist/src/search/embeddings.d.ts +35 -2
- package/dist/src/search/embeddings.d.ts.map +1 -1
- package/dist/src/search/embeddings.js +128 -5
- package/dist/src/search/embeddings.js.map +1 -1
- package/dist/src/search/hybrid-rrf.d.ts +45 -0
- package/dist/src/search/hybrid-rrf.d.ts.map +1 -1
- package/dist/src/search/hybrid-rrf.js +212 -56
- package/dist/src/search/hybrid-rrf.js.map +1 -1
- package/dist/src/search/static-model-install.d.ts +43 -0
- package/dist/src/search/static-model-install.d.ts.map +1 -0
- package/dist/src/search/static-model-install.js +112 -0
- package/dist/src/search/static-model-install.js.map +1 -0
- package/dist/src/search/static-model.d.ts +63 -0
- package/dist/src/search/static-model.d.ts.map +1 -0
- package/dist/src/search/static-model.js +244 -0
- package/dist/src/search/static-model.js.map +1 -0
- package/dist/src/search/temporal.d.ts +32 -0
- package/dist/src/search/temporal.d.ts.map +1 -0
- package/dist/src/search/temporal.js +164 -0
- package/dist/src/search/temporal.js.map +1 -0
- package/dist/src/ui/server.d.ts.map +1 -1
- package/dist/src/ui/server.js +10 -0
- package/dist/src/ui/server.js.map +1 -1
- package/dist-ui/assets/{ActionsPage-B3quzFNF.js → ActionsPage-CI-IRMeS.js} +1 -1
- package/dist-ui/assets/{GraphPage-DetiATmC.js → GraphPage-BdYMF7yz.js} +1 -1
- package/dist-ui/assets/{ObservatoryPage-QIGMwENf.js → ObservatoryPage-BG_vg8B9.js} +1 -1
- package/dist-ui/assets/{TreemapPage-C7uLZd37.js → TreemapPage-CZreyyLA.js} +1 -1
- package/dist-ui/assets/index-Ca9pma3Q.css +1 -0
- package/dist-ui/assets/{index-DWAH--Fu.js → index-MlNuiu0T.js} +17 -17
- package/dist-ui/assets/{maximize-2-BebkGbZA.js → maximize-2-_nvSvCC7.js} +1 -1
- package/dist-ui/build-manifest.json +11 -11
- package/dist-ui/index.html +2 -2
- package/llms-install.md +3 -3
- package/package.json +5 -1
- package/server.json +1 -1
- package/skills/fastr-setup/SKILL.md +4 -4
- package/skills/skills.json +1 -1
- 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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
138
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
|
147
|
-
FROM memories_fts
|
|
148
|
-
JOIN memories
|
|
149
|
-
WHERE
|
|
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
|
|
229
|
+
LIMIT ${bm25Limit}
|
|
153
230
|
)
|
|
154
231
|
`;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
|
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
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
256
|
-
|
|
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,
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|