@veewo/claw-core 0.1.93 → 0.1.94
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/dist/src/embedding-daemon.js +2 -2
- package/dist/src/embedding-daemon.js.map +1 -1
- package/dist/src/embedding-local-runtime.js +0 -2
- package/dist/src/embedding-local-runtime.js.map +1 -1
- package/dist/src/memory.d.ts +1 -0
- package/dist/src/memory.js +318 -70
- package/dist/src/memory.js.map +1 -1
- package/dist/src/search-daemon-protocol.d.ts +32 -0
- package/dist/src/search-daemon-protocol.js +183 -0
- package/dist/src/search-daemon-protocol.js.map +1 -0
- package/dist/src/search-daemon.d.ts +1 -0
- package/dist/src/search-daemon.js +112 -0
- package/dist/src/search-daemon.js.map +1 -0
- package/dist/src/search.d.ts +3 -0
- package/dist/src/search.js +4 -0
- package/dist/src/search.js.map +1 -0
- package/dist/src/templates/plans/default.js +1 -1
- package/dist/src/types.d.ts +4 -0
- package/package.json +5 -1
|
@@ -4,8 +4,8 @@ import net from "node:net";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { EMBEDDING_DAEMON_MAX_MESSAGE_BYTES, EMBEDDING_DAEMON_PROTOCOL_VERSION, createEmbeddingDaemonToken, removeStateIfOwned, writeEmbeddingDaemonState, } from "./embedding-daemon-protocol.js";
|
|
6
6
|
import { createConfiguredLocalEmbeddingSession, resolveConfiguredLocalEmbeddingFingerprint, resolveEmbeddingDimensions, } from "./embedding-local-runtime.js";
|
|
7
|
-
const DEFAULT_IDLE_TTL_MS =
|
|
8
|
-
const DEFAULT_SESSION_LIMIT =
|
|
7
|
+
const DEFAULT_IDLE_TTL_MS = 10 * 60 * 1000;
|
|
8
|
+
const DEFAULT_SESSION_LIMIT = 2;
|
|
9
9
|
const runtimeDir = resolveRuntimeDirFromArgs(process.argv.slice(2));
|
|
10
10
|
const instanceId = randomBytes(16).toString("hex");
|
|
11
11
|
const token = createEmbeddingDaemonToken();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-daemon.js","sourceRoot":"","sources":["../../src/embedding-daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,kCAAkC,EAClC,iCAAiC,EACjC,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,GAI1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,qCAAqC,EACrC,0CAA0C,EAC1C,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAUtC,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"embedding-daemon.js","sourceRoot":"","sources":["../../src/embedding-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,6 @@ export async function createConfiguredLocalEmbeddingSession(embedding, projectCw
|
|
|
24
24
|
const fingerprint = createHash("sha256")
|
|
25
25
|
.update(JSON.stringify({
|
|
26
26
|
version: 1,
|
|
27
|
-
projectCwd: path.resolve(projectCwd),
|
|
28
27
|
resolvedModulePath,
|
|
29
28
|
modelId,
|
|
30
29
|
modelSignature: resolveModelSignature(embedding.local?.modelPath),
|
|
@@ -63,7 +62,6 @@ export function resolveConfiguredLocalEmbeddingFingerprint(embedding, projectCwd
|
|
|
63
62
|
return createHash("sha256")
|
|
64
63
|
.update(JSON.stringify({
|
|
65
64
|
version: 1,
|
|
66
|
-
projectCwd: path.resolve(projectCwd),
|
|
67
65
|
resolvedModulePath: resolveTransformersModulePath(projectRequire, workerRequire),
|
|
68
66
|
modelId,
|
|
69
67
|
modelSignature: resolveModelSignature(embedding.local?.modelPath),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-local-runtime.js","sourceRoot":"","sources":["../../src/embedding-local-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,kCAAkC,EAClC,sCAAsC,EACtC,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,8BAA8B,GAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,MAAM,4BAA4B,GAAG,IAAI,CAAC;AAa1C,MAAM,CAAC,KAAK,UAAU,qCAAqC,CACzD,SAAgC,EAChC,UAAkB;IAElB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC;IAClC,CAAC;IACD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5E,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,6BAA6B,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACxF,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,yBAAyB,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACnF,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;IACtE,MAAM,QAAQ,GAAG,6BAA6B,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7G,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxB,MAAM,eAAe,GAAG,2BAA2B,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;IACrG,MAAM,UAAU,GAAG,0BAA0B,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IAC7F,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;SACrC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,OAAO,EAAE,CAAC;QACV,
|
|
1
|
+
{"version":3,"file":"embedding-local-runtime.js","sourceRoot":"","sources":["../../src/embedding-local-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/src/memory.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export type ProjectEmbeddingWarmupResult = {
|
|
|
7
7
|
};
|
|
8
8
|
export declare function buildMemoryIndex(input: MemoryIndexInput): MemoryIndexResult;
|
|
9
9
|
export declare function searchMemory(input: MemorySearchInput): MemorySearchResult;
|
|
10
|
+
export declare function searchMemoryAsync(input: MemorySearchInput): Promise<MemorySearchResult>;
|
|
10
11
|
export declare function getMemory(input: MemoryGetInput): MemoryGetResult;
|
|
11
12
|
export declare function warmProjectMemoryEmbedding(input: {
|
|
12
13
|
cwd: string;
|
package/dist/src/memory.js
CHANGED
|
@@ -23,6 +23,10 @@ const DEFAULT_MEMORY_SQLITE_BUSY_TIMEOUT_MS = 5000;
|
|
|
23
23
|
const PROJECT_QUERY_EMBEDDING_CACHE_LIMIT = 128;
|
|
24
24
|
const PROJECT_QUERY_EMBEDDING_CACHE_VERSION = "v1";
|
|
25
25
|
const PROJECT_EMBEDDING_CHUNKING_VERSION = "generic-knowledge-markers-v3";
|
|
26
|
+
const PROJECT_EMBEDDING_VECTOR_STORAGE_VERSION = "float32-blob-v1";
|
|
27
|
+
const DEFAULT_PERSISTENT_SEARCH_DATABASE_LIMIT = 2;
|
|
28
|
+
const persistentMemoryDatabases = new Map();
|
|
29
|
+
const projectVectorRowsByDatabase = new WeakMap();
|
|
26
30
|
export function buildMemoryIndex(input) {
|
|
27
31
|
const { scope, project, task } = resolveMemoryScope(input);
|
|
28
32
|
if (!isProjectMemoryEnabled(project)) {
|
|
@@ -80,6 +84,7 @@ function rebuildTaskMemoryIndex(db, sources) {
|
|
|
80
84
|
db.exec("DELETE FROM docs;");
|
|
81
85
|
db.exec("DELETE FROM docs_fts;");
|
|
82
86
|
db.exec("DELETE FROM doc_embeddings;");
|
|
87
|
+
db.exec("DELETE FROM doc_embedding_vectors;");
|
|
83
88
|
const insertDoc = db.prepare("INSERT INTO docs (source_path, kind, content, content_hash) VALUES (?, ?, ?, ?)");
|
|
84
89
|
const insertFts = db.prepare("INSERT INTO docs_fts (rowid, source_path, kind, content) VALUES (?, ?, ?, ?)");
|
|
85
90
|
for (const source of sources) {
|
|
@@ -134,6 +139,7 @@ function syncProjectMemoryIndex(db, sources, embedding, maxFiles) {
|
|
|
134
139
|
deleteDocsById(db, docsToDelete.map((doc) => doc.id));
|
|
135
140
|
if (requiresVectorReset) {
|
|
136
141
|
db.exec("DELETE FROM doc_embeddings;");
|
|
142
|
+
db.exec("DELETE FROM doc_embedding_vectors;");
|
|
137
143
|
db.exec("DELETE FROM query_embeddings;");
|
|
138
144
|
}
|
|
139
145
|
insertDocs(db, limitedDocsToInsert);
|
|
@@ -162,6 +168,8 @@ function syncProjectMemoryIndex(db, sources, embedding, maxFiles) {
|
|
|
162
168
|
pendingFileCount,
|
|
163
169
|
};
|
|
164
170
|
}
|
|
171
|
+
backfillDocEmbeddingVectors(db);
|
|
172
|
+
upsertMetadata(db, "embedding_vector_storage", PROJECT_EMBEDDING_VECTOR_STORAGE_VERSION);
|
|
165
173
|
return {
|
|
166
174
|
vectorIndex: summarizeVectorIndex(db, embedding),
|
|
167
175
|
processedFileCount: limitedDocsToInsert.length,
|
|
@@ -191,10 +199,12 @@ function deleteDocsById(db, docIds) {
|
|
|
191
199
|
}
|
|
192
200
|
const deleteFts = db.prepare("DELETE FROM docs_fts WHERE rowid = ?");
|
|
193
201
|
const deleteEmbeddings = db.prepare("DELETE FROM doc_embeddings WHERE doc_id = ?");
|
|
202
|
+
const deleteEmbeddingVectors = db.prepare("DELETE FROM doc_embedding_vectors WHERE doc_id = ?");
|
|
194
203
|
const deleteDoc = db.prepare("DELETE FROM docs WHERE id = ?");
|
|
195
204
|
for (const docId of docIds) {
|
|
196
205
|
deleteFts.run(docId);
|
|
197
206
|
deleteEmbeddings.run(docId);
|
|
207
|
+
deleteEmbeddingVectors.run(docId);
|
|
198
208
|
deleteDoc.run(docId);
|
|
199
209
|
}
|
|
200
210
|
}
|
|
@@ -256,6 +266,60 @@ export function searchMemory(input) {
|
|
|
256
266
|
};
|
|
257
267
|
});
|
|
258
268
|
}
|
|
269
|
+
export async function searchMemoryAsync(input) {
|
|
270
|
+
const startedAt = performance.now();
|
|
271
|
+
const primedRuntime = await primePersistentProjectQueryEmbedding(input);
|
|
272
|
+
const result = searchMemory(input);
|
|
273
|
+
result.telemetry.durationMs = Number((performance.now() - startedAt).toFixed(2));
|
|
274
|
+
if (primedRuntime) {
|
|
275
|
+
result.telemetry.queryEmbedding = "generated";
|
|
276
|
+
result.telemetry.embeddingRuntime = primedRuntime;
|
|
277
|
+
}
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
async function primePersistentProjectQueryEmbedding(input) {
|
|
281
|
+
if (input.scope === "task"
|
|
282
|
+
|| process.env.CLAW_EMBEDDING_MOCK === "1"
|
|
283
|
+
|| process.env.CLAW_EMBEDDING_PERSISTENT_WORKER === "0"
|
|
284
|
+
|| !input.query.trim()) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
const project = resolveProjectContext(input.cwd);
|
|
288
|
+
const embedding = resolveProjectMemoryEmbeddingConfig(project);
|
|
289
|
+
const storePath = getMemoryStorePath(project, "project");
|
|
290
|
+
if (embedding?.provider !== "local" || !fs.existsSync(storePath)) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
const queryText = buildProjectQueryIntent(input.query).embeddingText || input.query;
|
|
294
|
+
const identity = buildProjectQueryEmbeddingCacheIdentity(embedding, queryText);
|
|
295
|
+
const cached = withMemoryDatabase(storePath, "query embedding cache lookup", "read", (db) => {
|
|
296
|
+
prepareSchema(db);
|
|
297
|
+
return readProjectQueryEmbeddingCache(db, identity);
|
|
298
|
+
});
|
|
299
|
+
if (cached) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
let generated;
|
|
303
|
+
try {
|
|
304
|
+
generated = await requestPersistentEmbedding({
|
|
305
|
+
embedding,
|
|
306
|
+
texts: [identity.normalizedQueryText],
|
|
307
|
+
projectCwd: project.projectRoot,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
const vector = generated?.vectors[0];
|
|
314
|
+
if (!vector?.length) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
withMemoryDatabase(storePath, "query embedding cache update", "write", (db) => {
|
|
318
|
+
prepareSchema(db);
|
|
319
|
+
writeProjectQueryEmbeddingCache(db, identity, vector);
|
|
320
|
+
});
|
|
321
|
+
return "persistent_daemon";
|
|
322
|
+
}
|
|
259
323
|
export function getMemory(input) {
|
|
260
324
|
const { scope, project, task } = resolveMemoryScope(input);
|
|
261
325
|
const storePath = getMemoryStorePath(project, scope, task);
|
|
@@ -288,10 +352,26 @@ function getMemoryStorePath(project, scope, task) {
|
|
|
288
352
|
return path.join(project.clawDir, "memory.sqlite");
|
|
289
353
|
}
|
|
290
354
|
function withMemoryDatabase(storePath, operation, access, callback) {
|
|
355
|
+
const persistentRead = access === "read" && process.env.CLAW_SEARCH_DAEMON === "1";
|
|
291
356
|
let db = null;
|
|
292
357
|
try {
|
|
293
|
-
|
|
294
|
-
|
|
358
|
+
if (persistentRead) {
|
|
359
|
+
db = persistentMemoryDatabases.get(storePath) ?? null;
|
|
360
|
+
if (!db) {
|
|
361
|
+
evictPersistentMemoryDatabases();
|
|
362
|
+
db = new DatabaseSync(storePath);
|
|
363
|
+
configureMemoryDatabase(db, access);
|
|
364
|
+
persistentMemoryDatabases.set(storePath, db);
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
persistentMemoryDatabases.delete(storePath);
|
|
368
|
+
persistentMemoryDatabases.set(storePath, db);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
db = new DatabaseSync(storePath);
|
|
373
|
+
configureMemoryDatabase(db, access);
|
|
374
|
+
}
|
|
295
375
|
return callback(db);
|
|
296
376
|
}
|
|
297
377
|
catch (error) {
|
|
@@ -301,7 +381,23 @@ function withMemoryDatabase(storePath, operation, access, callback) {
|
|
|
301
381
|
throw error;
|
|
302
382
|
}
|
|
303
383
|
finally {
|
|
304
|
-
|
|
384
|
+
if (!persistentRead) {
|
|
385
|
+
db?.close();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function evictPersistentMemoryDatabases() {
|
|
390
|
+
const rawLimit = Number.parseInt(process.env.CLAW_SEARCH_DATABASE_LIMIT ?? "", 10);
|
|
391
|
+
const limit = Number.isFinite(rawLimit) && rawLimit > 0
|
|
392
|
+
? rawLimit
|
|
393
|
+
: DEFAULT_PERSISTENT_SEARCH_DATABASE_LIMIT;
|
|
394
|
+
while (persistentMemoryDatabases.size >= limit) {
|
|
395
|
+
const oldest = persistentMemoryDatabases.entries().next().value;
|
|
396
|
+
if (!oldest) {
|
|
397
|
+
return;
|
|
398
|
+
}
|
|
399
|
+
persistentMemoryDatabases.delete(oldest[0]);
|
|
400
|
+
oldest[1].close();
|
|
305
401
|
}
|
|
306
402
|
}
|
|
307
403
|
function configureMemoryDatabase(db, access) {
|
|
@@ -469,6 +565,19 @@ function prepareSchema(db) {
|
|
|
469
565
|
" embedding_json TEXT NOT NULL,",
|
|
470
566
|
" created_at INTEGER NOT NULL",
|
|
471
567
|
");",
|
|
568
|
+
"CREATE TABLE IF NOT EXISTS doc_embedding_vectors (",
|
|
569
|
+
" doc_id INTEGER NOT NULL,",
|
|
570
|
+
" chunk_index INTEGER NOT NULL,",
|
|
571
|
+
" source_path TEXT NOT NULL,",
|
|
572
|
+
" kind TEXT NOT NULL,",
|
|
573
|
+
" heading_path TEXT NOT NULL DEFAULT '',",
|
|
574
|
+
" document_kind TEXT NOT NULL DEFAULT 'other',",
|
|
575
|
+
" document_state TEXT,",
|
|
576
|
+
" chunk_state TEXT,",
|
|
577
|
+
" dated TEXT,",
|
|
578
|
+
" embedding_blob BLOB NOT NULL,",
|
|
579
|
+
" PRIMARY KEY (doc_id, chunk_index)",
|
|
580
|
+
") WITHOUT ROWID;",
|
|
472
581
|
].join("\n"));
|
|
473
582
|
const docsColumns = db.prepare("PRAGMA table_info(docs)").all();
|
|
474
583
|
if (!docsColumns.some((column) => column.name === "content_hash")) {
|
|
@@ -642,10 +751,47 @@ function insertDocEmbeddings(db, embeddings) {
|
|
|
642
751
|
"INSERT OR REPLACE INTO doc_embeddings (doc_id, chunk_index, source_path, kind, chunk_text, heading_path, document_kind, document_state, chunk_state, dated, embedding_json)",
|
|
643
752
|
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
644
753
|
].join(" "));
|
|
754
|
+
const insertEmbeddingVector = db.prepare([
|
|
755
|
+
"INSERT OR REPLACE INTO doc_embedding_vectors",
|
|
756
|
+
" (doc_id, chunk_index, source_path, kind, heading_path, document_kind, document_state, chunk_state, dated, embedding_blob)",
|
|
757
|
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
758
|
+
].join(" "));
|
|
645
759
|
embeddings.forEach((embedding) => {
|
|
646
760
|
insertEmbedding.run(embedding.docId, embedding.chunkIndex, embedding.sourcePath, embedding.kind, embedding.chunkText, embedding.headingPath, embedding.documentKind, embedding.documentState, embedding.state, embedding.dated, JSON.stringify(embedding.vector));
|
|
761
|
+
insertEmbeddingVector.run(embedding.docId, embedding.chunkIndex, embedding.sourcePath, embedding.kind, embedding.headingPath, embedding.documentKind, embedding.documentState, embedding.state, embedding.dated, serializeNormalizedEmbedding(embedding.vector));
|
|
647
762
|
});
|
|
648
763
|
}
|
|
764
|
+
function backfillDocEmbeddingVectors(db) {
|
|
765
|
+
const missing = db
|
|
766
|
+
.prepare([
|
|
767
|
+
"SELECT e.doc_id, e.chunk_index, e.source_path, e.kind, e.heading_path, e.document_kind,",
|
|
768
|
+
" e.document_state, e.chunk_state, e.dated, e.embedding_json",
|
|
769
|
+
"FROM doc_embeddings e",
|
|
770
|
+
"LEFT JOIN doc_embedding_vectors v",
|
|
771
|
+
" ON v.doc_id = e.doc_id AND v.chunk_index = e.chunk_index",
|
|
772
|
+
"WHERE v.doc_id IS NULL",
|
|
773
|
+
].join(" "))
|
|
774
|
+
.all();
|
|
775
|
+
if (missing.length === 0) {
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
const insert = db.prepare([
|
|
779
|
+
"INSERT OR REPLACE INTO doc_embedding_vectors",
|
|
780
|
+
" (doc_id, chunk_index, source_path, kind, heading_path, document_kind, document_state, chunk_state, dated, embedding_blob)",
|
|
781
|
+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
782
|
+
].join(" "));
|
|
783
|
+
db.exec("BEGIN");
|
|
784
|
+
try {
|
|
785
|
+
for (const row of missing) {
|
|
786
|
+
insert.run(row.doc_id, row.chunk_index, row.source_path, row.kind, row.heading_path, row.document_kind, row.document_state, row.chunk_state, row.dated, serializeNormalizedEmbedding(parseEmbeddingJson(row.embedding_json)));
|
|
787
|
+
}
|
|
788
|
+
db.exec("COMMIT");
|
|
789
|
+
}
|
|
790
|
+
catch (error) {
|
|
791
|
+
db.exec("ROLLBACK");
|
|
792
|
+
throw error;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
649
795
|
function listDocsMissingEmbeddings(db) {
|
|
650
796
|
return db
|
|
651
797
|
.prepare([
|
|
@@ -1001,75 +1147,67 @@ function searchProjectMemoryHybrid(db, query, limit, project) {
|
|
|
1001
1147
|
};
|
|
1002
1148
|
}
|
|
1003
1149
|
const queryEmbedding = resolveProjectQueryEmbedding(db, embedding, queryIntent.embeddingText || query);
|
|
1004
|
-
const
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
const
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
documentState: row.document_state,
|
|
1025
|
-
state: row.chunk_state,
|
|
1026
|
-
dated: row.dated,
|
|
1027
|
-
}),
|
|
1028
|
-
documentKind: row.document_kind,
|
|
1150
|
+
const bestVectorBySource = new Map();
|
|
1151
|
+
const compactVectorStorage = getMetadata(db, "embedding_vector_storage")
|
|
1152
|
+
=== PROJECT_EMBEDDING_VECTOR_STORAGE_VERSION;
|
|
1153
|
+
const vectorRows = loadProjectVectorRows(db, compactVectorStorage);
|
|
1154
|
+
const normalizedQueryEmbedding = normalizeEmbedding(queryEmbedding.vector);
|
|
1155
|
+
const vectorScanStartedAt = performance.now();
|
|
1156
|
+
let vectorCount = 0;
|
|
1157
|
+
let vectorBytes = 0;
|
|
1158
|
+
for (const row of vectorRows) {
|
|
1159
|
+
const ordinal = vectorCount;
|
|
1160
|
+
vectorCount += 1;
|
|
1161
|
+
const similarity = row.embedding_blob
|
|
1162
|
+
? dotProductFloat32(normalizedQueryEmbedding, row.embedding_blob)
|
|
1163
|
+
: dotProduct(normalizedQueryEmbedding, normalizeEmbedding(parseEmbeddingJson(row.embedding_json ?? "[]")));
|
|
1164
|
+
vectorBytes += row.embedding_blob?.byteLength ?? Buffer.byteLength(row.embedding_json ?? "", "utf-8");
|
|
1165
|
+
if (!Number.isFinite(similarity)) {
|
|
1166
|
+
continue;
|
|
1167
|
+
}
|
|
1168
|
+
const temporalBoost = calculateTemporalChunkBoost({
|
|
1169
|
+
intent: temporalIntent,
|
|
1029
1170
|
documentState: row.document_state,
|
|
1030
1171
|
state: row.chunk_state,
|
|
1031
1172
|
dated: row.dated,
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
.filter((row) => Number.isFinite(row.similarity))
|
|
1036
|
-
.sort((left, right) => {
|
|
1037
|
-
const leftScore = left.similarity + left.exactBoost + left.temporalBoost;
|
|
1038
|
-
const rightScore = right.similarity + right.exactBoost + right.temporalBoost;
|
|
1039
|
-
return rightScore - leftScore;
|
|
1040
|
-
});
|
|
1041
|
-
const bestVectorBySource = new Map();
|
|
1042
|
-
for (const row of rankedVectors) {
|
|
1043
|
-
const existing = bestVectorBySource.get(row.sourcePath);
|
|
1044
|
-
const vectorScore = row.similarity + row.temporalBoost;
|
|
1173
|
+
});
|
|
1174
|
+
const existing = bestVectorBySource.get(row.source_path);
|
|
1175
|
+
const vectorScore = similarity + temporalBoost;
|
|
1045
1176
|
if (!existing || vectorScore > existing.vectorScore) {
|
|
1046
|
-
bestVectorBySource.set(row.
|
|
1177
|
+
bestVectorBySource.set(row.source_path, {
|
|
1178
|
+
docId: row.doc_id,
|
|
1179
|
+
chunkIndex: row.chunk_index,
|
|
1047
1180
|
kind: row.kind,
|
|
1048
|
-
|
|
1049
|
-
similarity: row.similarity,
|
|
1181
|
+
similarity,
|
|
1050
1182
|
vectorScore,
|
|
1051
|
-
documentKind: row.
|
|
1052
|
-
documentState: row.
|
|
1053
|
-
state: row.
|
|
1183
|
+
documentKind: row.document_kind,
|
|
1184
|
+
documentState: row.document_state,
|
|
1185
|
+
state: row.chunk_state,
|
|
1054
1186
|
dated: row.dated,
|
|
1055
|
-
headingPath: row.
|
|
1187
|
+
headingPath: row.heading_path,
|
|
1188
|
+
ordinal,
|
|
1056
1189
|
});
|
|
1057
1190
|
}
|
|
1058
1191
|
}
|
|
1192
|
+
const vectorScanMs = performance.now() - vectorScanStartedAt;
|
|
1193
|
+
if (vectorCount === 0) {
|
|
1194
|
+
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Project search requires stored vectors. Run `claw search index --refresh` first.");
|
|
1195
|
+
}
|
|
1196
|
+
const fusionStartedAt = performance.now();
|
|
1059
1197
|
const fused = new Map();
|
|
1060
|
-
Array.from(bestVectorBySource.entries())
|
|
1198
|
+
const selectedVectorCandidates = Array.from(bestVectorBySource.entries())
|
|
1061
1199
|
.sort((left, right) => {
|
|
1062
1200
|
const leftScore = left[1].vectorScore + (docSignals.get(left[0])?.exactBoost ?? 0);
|
|
1063
1201
|
const rightScore = right[1].vectorScore + (docSignals.get(right[0])?.exactBoost ?? 0);
|
|
1064
|
-
return rightScore - leftScore;
|
|
1202
|
+
return rightScore - leftScore || left[1].ordinal - right[1].ordinal;
|
|
1065
1203
|
})
|
|
1066
|
-
.slice(0, candidateLimit)
|
|
1067
|
-
|
|
1204
|
+
.slice(0, candidateLimit);
|
|
1205
|
+
selectedVectorCandidates.forEach(([sourcePath, row], index) => {
|
|
1068
1206
|
const signals = docSignals.get(sourcePath);
|
|
1069
1207
|
fused.set(sourcePath, {
|
|
1070
1208
|
sourcePath,
|
|
1071
1209
|
kind: row.kind,
|
|
1072
|
-
snippet:
|
|
1210
|
+
snippet: "",
|
|
1073
1211
|
score: reciprocalRankScore(index + 1, 0.5) + (signals?.exactBoost ?? 0),
|
|
1074
1212
|
vectorRank: index + 1,
|
|
1075
1213
|
documentKind: row.documentKind,
|
|
@@ -1108,15 +1246,60 @@ function searchProjectMemoryHybrid(db, query, limit, project) {
|
|
|
1108
1246
|
...(existing ? pickTemporalResultMetadata(existing) : {}),
|
|
1109
1247
|
});
|
|
1110
1248
|
});
|
|
1249
|
+
const results = rerankProjectSearchCandidates(Array.from(fused.values()), docSignals, limit);
|
|
1250
|
+
hydrateMissingVectorSnippets(db, results, new Map(selectedVectorCandidates));
|
|
1251
|
+
const fusionMs = performance.now() - fusionStartedAt;
|
|
1111
1252
|
return {
|
|
1112
|
-
results
|
|
1253
|
+
results,
|
|
1113
1254
|
telemetry: {
|
|
1114
1255
|
route: "hybrid",
|
|
1115
1256
|
queryEmbedding: queryEmbedding.cacheHit ? "cache_hit" : "generated",
|
|
1116
1257
|
...(queryEmbedding.runtime ? { embeddingRuntime: queryEmbedding.runtime } : {}),
|
|
1258
|
+
vectorScanMs: Number(vectorScanMs.toFixed(2)),
|
|
1259
|
+
fusionMs: Number(fusionMs.toFixed(2)),
|
|
1260
|
+
vectorCount,
|
|
1261
|
+
vectorBytes,
|
|
1117
1262
|
},
|
|
1118
1263
|
};
|
|
1119
1264
|
}
|
|
1265
|
+
function loadProjectVectorRows(db, compactVectorStorage) {
|
|
1266
|
+
const statement = compactVectorStorage
|
|
1267
|
+
? db.prepare([
|
|
1268
|
+
"SELECT doc_id, chunk_index, source_path, kind, heading_path, document_kind, document_state, chunk_state, dated, embedding_blob",
|
|
1269
|
+
"FROM doc_embedding_vectors",
|
|
1270
|
+
].join(" "))
|
|
1271
|
+
: db.prepare([
|
|
1272
|
+
"SELECT doc_id, chunk_index, source_path, kind, heading_path, document_kind, document_state, chunk_state, dated, embedding_json",
|
|
1273
|
+
"FROM doc_embeddings",
|
|
1274
|
+
].join(" "));
|
|
1275
|
+
if (process.env.CLAW_SEARCH_DAEMON !== "1") {
|
|
1276
|
+
return statement.iterate();
|
|
1277
|
+
}
|
|
1278
|
+
const indexedAt = getMetadata(db, "indexed_at");
|
|
1279
|
+
const cached = projectVectorRowsByDatabase.get(db);
|
|
1280
|
+
if (cached?.indexedAt === indexedAt && cached.compactVectorStorage === compactVectorStorage) {
|
|
1281
|
+
return cached.rows;
|
|
1282
|
+
}
|
|
1283
|
+
const rows = statement.all();
|
|
1284
|
+
projectVectorRowsByDatabase.set(db, { indexedAt, compactVectorStorage, rows });
|
|
1285
|
+
return rows;
|
|
1286
|
+
}
|
|
1287
|
+
function hydrateMissingVectorSnippets(db, results, vectorCandidates) {
|
|
1288
|
+
const readChunk = db.prepare("SELECT chunk_text FROM doc_embeddings WHERE doc_id = ? AND chunk_index = ?");
|
|
1289
|
+
for (const result of results) {
|
|
1290
|
+
if (result.snippet) {
|
|
1291
|
+
continue;
|
|
1292
|
+
}
|
|
1293
|
+
const candidate = vectorCandidates.get(result.sourcePath);
|
|
1294
|
+
if (!candidate) {
|
|
1295
|
+
continue;
|
|
1296
|
+
}
|
|
1297
|
+
const row = readChunk.get(candidate.docId, candidate.chunkIndex);
|
|
1298
|
+
if (row) {
|
|
1299
|
+
result.snippet = buildSnippet(row.chunk_text);
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1120
1303
|
function tryProjectLexicalFastPath(input) {
|
|
1121
1304
|
const { queryIntent } = input;
|
|
1122
1305
|
const primaryKeywordStep = buildProjectKeywordSearchPlan(input.query)[0];
|
|
@@ -1181,6 +1364,23 @@ function tryProjectLexicalFastPath(input) {
|
|
|
1181
1364
|
return rerankProjectSearchCandidates(Array.from(candidates.values()), input.docSignals, input.limit);
|
|
1182
1365
|
}
|
|
1183
1366
|
function resolveProjectQueryEmbedding(db, embedding, queryText) {
|
|
1367
|
+
const identity = buildProjectQueryEmbeddingCacheIdentity(embedding, queryText);
|
|
1368
|
+
const cached = readProjectQueryEmbeddingCache(db, identity);
|
|
1369
|
+
if (cached) {
|
|
1370
|
+
return { vector: cached, cacheHit: true };
|
|
1371
|
+
}
|
|
1372
|
+
const generated = runEmbeddingWorker({
|
|
1373
|
+
embedding,
|
|
1374
|
+
texts: [identity.normalizedQueryText],
|
|
1375
|
+
});
|
|
1376
|
+
const vector = generated.vectors[0];
|
|
1377
|
+
if (!vector?.length) {
|
|
1378
|
+
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Unable to generate a query embedding for project search.");
|
|
1379
|
+
}
|
|
1380
|
+
writeProjectQueryEmbeddingCache(db, identity, vector);
|
|
1381
|
+
return { vector, cacheHit: false, ...(generated.runtime ? { runtime: generated.runtime } : {}) };
|
|
1382
|
+
}
|
|
1383
|
+
function buildProjectQueryEmbeddingCacheIdentity(embedding, queryText) {
|
|
1184
1384
|
const normalizedQueryText = queryText.trim().replace(/\s+/g, " ");
|
|
1185
1385
|
const embeddingFingerprint = createHash("sha256")
|
|
1186
1386
|
.update(JSON.stringify(embedding))
|
|
@@ -1188,28 +1388,27 @@ function resolveProjectQueryEmbedding(db, embedding, queryText) {
|
|
|
1188
1388
|
const cacheKey = createHash("sha256")
|
|
1189
1389
|
.update(`${PROJECT_QUERY_EMBEDDING_CACHE_VERSION}\0${embeddingFingerprint}\0${normalizedQueryText}`)
|
|
1190
1390
|
.digest("hex");
|
|
1391
|
+
return { cacheKey, embeddingFingerprint, normalizedQueryText };
|
|
1392
|
+
}
|
|
1393
|
+
function readProjectQueryEmbeddingCache(db, identity) {
|
|
1191
1394
|
const cached = db
|
|
1192
1395
|
.prepare([
|
|
1193
1396
|
"SELECT dimensions, embedding_json",
|
|
1194
1397
|
"FROM query_embeddings",
|
|
1195
1398
|
"WHERE cache_key = ? AND embedding_fingerprint = ? AND query_text = ?",
|
|
1196
1399
|
].join(" "))
|
|
1197
|
-
.get(cacheKey, embeddingFingerprint, normalizedQueryText);
|
|
1198
|
-
if (cached) {
|
|
1199
|
-
|
|
1200
|
-
if (cached.dimensions > 0 && vector.length === cached.dimensions) {
|
|
1201
|
-
return { vector, cacheHit: true };
|
|
1202
|
-
}
|
|
1203
|
-
db.prepare("DELETE FROM query_embeddings WHERE cache_key = ?").run(cacheKey);
|
|
1400
|
+
.get(identity.cacheKey, identity.embeddingFingerprint, identity.normalizedQueryText);
|
|
1401
|
+
if (!cached) {
|
|
1402
|
+
return null;
|
|
1204
1403
|
}
|
|
1205
|
-
const
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
});
|
|
1209
|
-
const vector = generated.vectors[0];
|
|
1210
|
-
if (!vector?.length) {
|
|
1211
|
-
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Unable to generate a query embedding for project search.");
|
|
1404
|
+
const vector = parseEmbeddingJson(cached.embedding_json);
|
|
1405
|
+
if (cached.dimensions > 0 && vector.length === cached.dimensions) {
|
|
1406
|
+
return vector;
|
|
1212
1407
|
}
|
|
1408
|
+
db.prepare("DELETE FROM query_embeddings WHERE cache_key = ?").run(identity.cacheKey);
|
|
1409
|
+
return null;
|
|
1410
|
+
}
|
|
1411
|
+
function writeProjectQueryEmbeddingCache(db, identity, vector) {
|
|
1213
1412
|
db.prepare([
|
|
1214
1413
|
"INSERT INTO query_embeddings",
|
|
1215
1414
|
" (cache_key, embedding_fingerprint, query_text, dimensions, embedding_json, created_at)",
|
|
@@ -1220,7 +1419,7 @@ function resolveProjectQueryEmbedding(db, embedding, queryText) {
|
|
|
1220
1419
|
" dimensions = excluded.dimensions,",
|
|
1221
1420
|
" embedding_json = excluded.embedding_json,",
|
|
1222
1421
|
" created_at = excluded.created_at",
|
|
1223
|
-
].join(" ")).run(cacheKey, embeddingFingerprint, normalizedQueryText, vector.length, JSON.stringify(vector), Date.now());
|
|
1422
|
+
].join(" ")).run(identity.cacheKey, identity.embeddingFingerprint, identity.normalizedQueryText, vector.length, JSON.stringify(vector), Date.now());
|
|
1224
1423
|
db.prepare([
|
|
1225
1424
|
"DELETE FROM query_embeddings",
|
|
1226
1425
|
"WHERE cache_key IN (",
|
|
@@ -1229,7 +1428,6 @@ function resolveProjectQueryEmbedding(db, embedding, queryText) {
|
|
|
1229
1428
|
" LIMIT -1 OFFSET ?",
|
|
1230
1429
|
")",
|
|
1231
1430
|
].join(" ")).run(PROJECT_QUERY_EMBEDDING_CACHE_LIMIT);
|
|
1232
|
-
return { vector, cacheHit: false, ...(generated.runtime ? { runtime: generated.runtime } : {}) };
|
|
1233
1431
|
}
|
|
1234
1432
|
function searchProjectMemoryKeywords(db, query, limit) {
|
|
1235
1433
|
const plan = buildProjectKeywordSearchPlan(query);
|
|
@@ -1667,6 +1865,56 @@ function parseEmbeddingJson(value) {
|
|
|
1667
1865
|
const parsed = JSON.parse(value);
|
|
1668
1866
|
return Array.isArray(parsed) ? parsed.map((entry) => Number(entry)) : [];
|
|
1669
1867
|
}
|
|
1868
|
+
function normalizeEmbedding(vector) {
|
|
1869
|
+
let squaredNorm = 0;
|
|
1870
|
+
for (const value of vector) {
|
|
1871
|
+
squaredNorm += value * value;
|
|
1872
|
+
}
|
|
1873
|
+
if (squaredNorm === 0) {
|
|
1874
|
+
return [];
|
|
1875
|
+
}
|
|
1876
|
+
const inverseNorm = 1 / Math.sqrt(squaredNorm);
|
|
1877
|
+
return vector.map((value) => value * inverseNorm);
|
|
1878
|
+
}
|
|
1879
|
+
function serializeNormalizedEmbedding(vector) {
|
|
1880
|
+
const normalized = normalizeEmbedding(vector);
|
|
1881
|
+
const buffer = Buffer.allocUnsafe(normalized.length * Float32Array.BYTES_PER_ELEMENT);
|
|
1882
|
+
for (let index = 0; index < normalized.length; index += 1) {
|
|
1883
|
+
buffer.writeFloatLE(normalized[index] ?? 0, index * Float32Array.BYTES_PER_ELEMENT);
|
|
1884
|
+
}
|
|
1885
|
+
return buffer;
|
|
1886
|
+
}
|
|
1887
|
+
function dotProduct(left, right) {
|
|
1888
|
+
const dimensions = Math.min(left.length, right.length);
|
|
1889
|
+
if (dimensions === 0) {
|
|
1890
|
+
return Number.NEGATIVE_INFINITY;
|
|
1891
|
+
}
|
|
1892
|
+
let dot = 0;
|
|
1893
|
+
for (let index = 0; index < dimensions; index += 1) {
|
|
1894
|
+
dot += (left[index] ?? 0) * (right[index] ?? 0);
|
|
1895
|
+
}
|
|
1896
|
+
return dot;
|
|
1897
|
+
}
|
|
1898
|
+
function dotProductFloat32(left, right) {
|
|
1899
|
+
const dimensions = Math.min(left.length, Math.floor(right.byteLength / Float32Array.BYTES_PER_ELEMENT));
|
|
1900
|
+
if (dimensions === 0) {
|
|
1901
|
+
return Number.NEGATIVE_INFINITY;
|
|
1902
|
+
}
|
|
1903
|
+
let dot = 0;
|
|
1904
|
+
if (right.byteOffset % Float32Array.BYTES_PER_ELEMENT === 0) {
|
|
1905
|
+
const view = new Float32Array(right.buffer, right.byteOffset, dimensions);
|
|
1906
|
+
for (let index = 0; index < dimensions; index += 1) {
|
|
1907
|
+
dot += (left[index] ?? 0) * (view[index] ?? 0);
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
else {
|
|
1911
|
+
const view = new DataView(right.buffer, right.byteOffset, right.byteLength);
|
|
1912
|
+
for (let index = 0; index < dimensions; index += 1) {
|
|
1913
|
+
dot += (left[index] ?? 0) * view.getFloat32(index * Float32Array.BYTES_PER_ELEMENT, true);
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
return dot;
|
|
1917
|
+
}
|
|
1670
1918
|
function cosineSimilarity(left, right) {
|
|
1671
1919
|
const dimensions = Math.min(left.length, right.length);
|
|
1672
1920
|
if (dimensions === 0) {
|