@veewo/claw-core 0.1.67 → 0.1.68
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/context.d.ts +3 -3
- package/dist/src/context.js +25 -67
- package/dist/src/context.js.map +1 -1
- package/dist/src/embedding-daemon-protocol.d.ts +48 -0
- package/dist/src/embedding-daemon-protocol.js +198 -0
- package/dist/src/embedding-daemon-protocol.js.map +1 -0
- package/dist/src/embedding-daemon.d.ts +1 -0
- package/dist/src/embedding-daemon.js +256 -0
- package/dist/src/embedding-daemon.js.map +1 -0
- package/dist/src/embedding-local-runtime.d.ts +8 -0
- package/dist/src/embedding-local-runtime.js +134 -0
- package/dist/src/embedding-local-runtime.js.map +1 -0
- package/dist/src/embedding-local.d.ts +8 -0
- package/dist/src/embedding-local.js +75 -38
- package/dist/src/embedding-local.js.map +1 -1
- package/dist/src/embedding-worker.js +27 -75
- package/dist/src/embedding-worker.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init.js +3 -0
- package/dist/src/init.js.map +1 -1
- package/dist/src/memory.js +127 -7
- package/dist/src/memory.js.map +1 -1
- package/dist/src/plan.js +39 -37
- package/dist/src/plan.js.map +1 -1
- package/dist/src/project-check.js +5 -2
- package/dist/src/project-check.js.map +1 -1
- package/dist/src/session-bindings.d.ts +5 -0
- package/dist/src/session-bindings.js +85 -0
- package/dist/src/session-bindings.js.map +1 -0
- package/dist/src/switch-task.js +11 -34
- package/dist/src/switch-task.js.map +1 -1
- package/dist/src/task-layout-migration.d.ts +8 -0
- package/dist/src/task-layout-migration.js +210 -0
- package/dist/src/task-layout-migration.js.map +1 -0
- package/dist/src/task-retention.d.ts +2 -1
- package/dist/src/task-retention.js +41 -26
- package/dist/src/task-retention.js.map +1 -1
- package/dist/src/types.d.ts +7 -6
- package/dist/src/workflow-guidance.config.json +3 -3
- package/package.json +1 -1
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import { resolveLocalExecutionDevice, resolveLocalTokenizerMaxLength, runLocalEmbeddingWithFallback, } from "./embedding-local.js";
|
|
6
|
-
import { resolveTransformersModule } from "./embedding-transformers.js";
|
|
7
|
-
const DEFAULT_EMBEDDING_MAX_TOKENS = 2048;
|
|
2
|
+
import { DEFAULT_LOCAL_EMBEDDING_DIMENSIONS, } from "./embedding-defaults.js";
|
|
3
|
+
import { PersistentEmbeddingModelError, requestPersistentEmbedding, } from "./embedding-daemon-protocol.js";
|
|
4
|
+
import { createConfiguredLocalEmbeddingSession, resolveEmbeddingDimensions, } from "./embedding-local-runtime.js";
|
|
8
5
|
async function main() {
|
|
9
6
|
const raw = fs.readFileSync(0, "utf-8").trim();
|
|
10
7
|
if (!raw) {
|
|
@@ -48,44 +45,30 @@ async function buildLocalOutput(input) {
|
|
|
48
45
|
vectors: [],
|
|
49
46
|
};
|
|
50
47
|
}
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
try {
|
|
49
|
+
const persistent = await requestPersistentEmbedding({
|
|
50
|
+
embedding: input.embedding,
|
|
51
|
+
texts: input.texts,
|
|
52
|
+
projectCwd: process.cwd(),
|
|
53
|
+
});
|
|
54
|
+
if (persistent) {
|
|
55
|
+
return persistent;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof PersistentEmbeddingModelError) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
// Transport and startup failures fall back to the original one-shot path.
|
|
63
|
+
}
|
|
64
|
+
const session = await createConfiguredLocalEmbeddingSession(input.embedding, process.cwd());
|
|
65
|
+
try {
|
|
66
|
+
const output = await session.run(input.texts);
|
|
67
|
+
return { dimensions: output.dimensions, vectors: output.vectors };
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
await session.dispose();
|
|
53
71
|
}
|
|
54
|
-
// Prefer project-local installs when present, then fall back to claw-core's
|
|
55
|
-
// own runtime dependencies for globally installed CLI usage.
|
|
56
|
-
const { createRequire } = await import("node:module");
|
|
57
|
-
const projectRequire = createRequire(process.cwd() + "/");
|
|
58
|
-
const workerRequire = createRequire(import.meta.url);
|
|
59
|
-
const { pipeline, env } = resolveTransformersModule(projectRequire, workerRequire);
|
|
60
|
-
env.allowLocalModels = false;
|
|
61
|
-
const modelId = input.embedding.local?.modelPath?.trim() || input.embedding.model;
|
|
62
|
-
env.cacheDir = resolveLocalEmbeddingCacheDir(modelId, input.embedding.local?.modelCacheDir, {
|
|
63
|
-
cwd: process.cwd(),
|
|
64
|
-
});
|
|
65
|
-
const requestedDevice = resolveLocalExecutionDevice(input.embedding, {
|
|
66
|
-
cudaAvailable: isCudaAvailable(),
|
|
67
|
-
});
|
|
68
|
-
const output = await runLocalEmbeddingWithFallback({
|
|
69
|
-
texts: input.texts,
|
|
70
|
-
dimensions: resolveDimensions(input.embedding, DEFAULT_LOCAL_EMBEDDING_DIMENSIONS),
|
|
71
|
-
requestedDevice,
|
|
72
|
-
createExtractor: async (device) => {
|
|
73
|
-
const extractor = await pipeline("feature-extraction", modelId, {
|
|
74
|
-
device,
|
|
75
|
-
dtype: "fp32",
|
|
76
|
-
session_options: { logSeverityLevel: 3 },
|
|
77
|
-
});
|
|
78
|
-
const safeTokenizerMaxLength = resolveLocalTokenizerMaxLength(extractor.tokenizer?.model_max_length, extractor.model?.config?.max_position_embeddings, DEFAULT_EMBEDDING_MAX_TOKENS);
|
|
79
|
-
if (safeTokenizerMaxLength !== null && extractor.tokenizer) {
|
|
80
|
-
extractor.tokenizer.model_max_length = safeTokenizerMaxLength;
|
|
81
|
-
}
|
|
82
|
-
return extractor;
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
return {
|
|
86
|
-
dimensions: output.dimensions,
|
|
87
|
-
vectors: output.vectors,
|
|
88
|
-
};
|
|
89
72
|
}
|
|
90
73
|
async function buildOpenAiOutput(input) {
|
|
91
74
|
if (!input.texts.length) {
|
|
@@ -133,39 +116,8 @@ function resolveOpenAiBaseUrl(embedding) {
|
|
|
133
116
|
? configured
|
|
134
117
|
: `${configured.replace(/\/+$/, "")}/embeddings`;
|
|
135
118
|
}
|
|
136
|
-
function isCudaAvailable() {
|
|
137
|
-
try {
|
|
138
|
-
const out = execFileSync("ldconfig", ["-p"], { timeout: 3000, encoding: "utf-8" });
|
|
139
|
-
if (out.includes("libcublasLt.so.12")) {
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
// Ignore.
|
|
145
|
-
}
|
|
146
|
-
for (const envVar of ["CUDA_PATH", "LD_LIBRARY_PATH"]) {
|
|
147
|
-
const value = process.env[envVar];
|
|
148
|
-
if (!value) {
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
for (const candidate of value.split(":").filter(Boolean)) {
|
|
152
|
-
if (fs.existsSync(path.join(candidate, "lib64", "libcublasLt.so.12")) ||
|
|
153
|
-
fs.existsSync(path.join(candidate, "lib", "libcublasLt.so.12")) ||
|
|
154
|
-
fs.existsSync(path.join(candidate, "libcublasLt.so.12"))) {
|
|
155
|
-
return true;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
119
|
function resolveDimensions(embedding, fallback) {
|
|
162
|
-
|
|
163
|
-
return embedding.outputDimensionality;
|
|
164
|
-
}
|
|
165
|
-
if (embedding.provider === "local") {
|
|
166
|
-
return resolveDefaultLocalEmbeddingDimensions(embedding.model);
|
|
167
|
-
}
|
|
168
|
-
return fallback > 0 ? fallback : 1536;
|
|
120
|
+
return resolveEmbeddingDimensions(embedding, fallback);
|
|
169
121
|
}
|
|
170
122
|
main().catch((error) => {
|
|
171
123
|
const message = error instanceof Error ? error.message : "Unknown embedding worker failure.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-worker.js","sourceRoot":"","sources":["../../src/embedding-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"embedding-worker.js","sourceRoot":"","sources":["../../src/embedding-worker.ts"],"names":[],"mappings":"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"}
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type ClawErrorCode = "PROJECT_ROOT_NOT_FOUND" | "CLAW_DIR_NOT_FOUND" | "PROJECT_ALREADY_INITIALIZED" | "PROJECT_CONFIG_INVALID" | "TASK_NOT_FOUND" | "TASK_NAME_INVALID" | "ACTIVE_PLAN_INVALID" | "ACTIVE_PLAN_MISSING" | "PLAN_NOT_FOUND" | "PLAN_STATUS_INVALID" | "PLAN_STATUS_NOT_SETTABLE" | "PLAN_STATUS_TRANSITION_FORBIDDEN" | "PLAN_STATUS_REOPEN_REQUIRED" | "TASK_STATUS_FORBIDDEN_IN_NON_ACTIVE_PLAN" | "PLAN_WRITE_CONFLICT" | "PLAN_STALE_EDIT" | "RETROSPECTIVE_REQUIRED" | "MEMORY_QUERY_REQUIRED" | "MEMORY_DISABLED" | "MEMORY_STORE_BUSY" | "MEMORY_VECTOR_INDEX_REQUIRED" | "GITNEXUS_REFRESH_FAILED" | "TRUTH_TARGET_INVALID" | "INPUT_REQUIRED";
|
|
1
|
+
export type ClawErrorCode = "PROJECT_ROOT_NOT_FOUND" | "CLAW_DIR_NOT_FOUND" | "PROJECT_ALREADY_INITIALIZED" | "PROJECT_CONFIG_INVALID" | "TASK_NOT_FOUND" | "TASK_NAME_INVALID" | "ACTIVE_PLAN_INVALID" | "ACTIVE_PLAN_MISSING" | "PLAN_NOT_FOUND" | "PLAN_ALREADY_EXISTS" | "PLAN_STATUS_INVALID" | "PLAN_STATUS_NOT_SETTABLE" | "PLAN_STATUS_TRANSITION_FORBIDDEN" | "PLAN_STATUS_REOPEN_REQUIRED" | "TASK_STATUS_FORBIDDEN_IN_NON_ACTIVE_PLAN" | "PLAN_WRITE_CONFLICT" | "PLAN_STALE_EDIT" | "RETROSPECTIVE_REQUIRED" | "MEMORY_QUERY_REQUIRED" | "MEMORY_DISABLED" | "MEMORY_STORE_BUSY" | "MEMORY_VECTOR_INDEX_REQUIRED" | "GITNEXUS_REFRESH_FAILED" | "TRUTH_TARGET_INVALID" | "INPUT_REQUIRED";
|
|
2
2
|
export declare class ClawError extends Error {
|
|
3
3
|
readonly code: ClawErrorCode;
|
|
4
4
|
readonly details: Record<string, unknown> | undefined;
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AA2BA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAgB;IACpB,OAAO,CAAsC;IAEtD,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAiC;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export * from "./memory.js";
|
|
|
6
6
|
export * from "./plan-events.js";
|
|
7
7
|
export * from "./project-check.js";
|
|
8
8
|
export * from "./requirements-gate.js";
|
|
9
|
+
export * from "./session-bindings.js";
|
|
10
|
+
export * from "./task-layout-migration.js";
|
|
9
11
|
export * from "./plan.js";
|
|
10
12
|
export * from "./plan-templates.js";
|
|
11
13
|
export * from "./plan-view.js";
|
package/dist/src/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export * from "./memory.js";
|
|
|
6
6
|
export * from "./plan-events.js";
|
|
7
7
|
export * from "./project-check.js";
|
|
8
8
|
export * from "./requirements-gate.js";
|
|
9
|
+
export * from "./session-bindings.js";
|
|
10
|
+
export * from "./task-layout-migration.js";
|
|
9
11
|
export * from "./plan.js";
|
|
10
12
|
export * from "./plan-templates.js";
|
|
11
13
|
export * from "./plan-view.js";
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC"}
|
package/dist/src/init.js
CHANGED
|
@@ -4,6 +4,7 @@ import { DEFAULT_LOCAL_EMBEDDING_MODEL, } from "./embedding-defaults.js";
|
|
|
4
4
|
import { ClawError } from "./errors.js";
|
|
5
5
|
import { normalizeTaskName } from "./paths.js";
|
|
6
6
|
import { ensureUtf8Bom } from "./text-encoding.js";
|
|
7
|
+
import { markTaskLayoutMigrationComplete } from "./task-layout-migration.js";
|
|
7
8
|
const CORE_VERSION = readCoreVersion();
|
|
8
9
|
const CLAW_GITIGNORE_BLOCK = [
|
|
9
10
|
"# claw-kit",
|
|
@@ -61,6 +62,8 @@ export function initProject(input) {
|
|
|
61
62
|
ensureDir(truthDir, createdPaths);
|
|
62
63
|
ensureDir(tasksDir, createdPaths);
|
|
63
64
|
ensureDir(knowledgeDir, createdPaths);
|
|
65
|
+
const taskLayoutMarkerPath = markTaskLayoutMigrationComplete(clawDir);
|
|
66
|
+
createdPaths.push(taskLayoutMarkerPath);
|
|
64
67
|
writeFile(projectJsonPath, `${JSON.stringify(projectConfig, null, 2)}\n`, createdPaths);
|
|
65
68
|
writeFile(memoryPath, `# Project Memory\n\n- Project initialized for claw-kit.\n- Use \`claw plan create\` to establish the first task scope.\n`, createdPaths);
|
|
66
69
|
ensureClawGitignoreRules(gitignorePath, createdPaths);
|
package/dist/src/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/src/memory.js
CHANGED
|
@@ -18,6 +18,8 @@ const DEFAULT_EMBEDDING_CHARS_PER_TOKEN = 3;
|
|
|
18
18
|
const DEFAULT_EMBEDDING_TARGET_CHARS = DEFAULT_EMBEDDING_TARGET_TOKENS * DEFAULT_EMBEDDING_CHARS_PER_TOKEN;
|
|
19
19
|
const DEFAULT_EMBEDDING_MAX_CHARS = DEFAULT_EMBEDDING_MAX_TOKENS * DEFAULT_EMBEDDING_CHARS_PER_TOKEN;
|
|
20
20
|
const DEFAULT_MEMORY_SQLITE_BUSY_TIMEOUT_MS = 5000;
|
|
21
|
+
const PROJECT_QUERY_EMBEDDING_CACHE_LIMIT = 128;
|
|
22
|
+
const PROJECT_QUERY_EMBEDDING_CACHE_VERSION = "v1";
|
|
21
23
|
export function buildMemoryIndex(input) {
|
|
22
24
|
const { scope, project, task } = resolveMemoryScope(input);
|
|
23
25
|
if (!isProjectMemoryEnabled(project)) {
|
|
@@ -124,6 +126,7 @@ function syncProjectMemoryIndex(db, sources, embedding, maxFiles) {
|
|
|
124
126
|
deleteDocsById(db, docsToDelete.map((doc) => doc.id));
|
|
125
127
|
if (requiresVectorReset) {
|
|
126
128
|
db.exec("DELETE FROM doc_embeddings;");
|
|
129
|
+
db.exec("DELETE FROM query_embeddings;");
|
|
127
130
|
}
|
|
128
131
|
insertDocs(db, limitedDocsToInsert);
|
|
129
132
|
if (shouldIndexVectors && embedding) {
|
|
@@ -425,6 +428,14 @@ function prepareSchema(db) {
|
|
|
425
428
|
" embedding_json TEXT NOT NULL,",
|
|
426
429
|
" PRIMARY KEY (doc_id, chunk_index)",
|
|
427
430
|
");",
|
|
431
|
+
"CREATE TABLE IF NOT EXISTS query_embeddings (",
|
|
432
|
+
" cache_key TEXT PRIMARY KEY,",
|
|
433
|
+
" embedding_fingerprint TEXT NOT NULL,",
|
|
434
|
+
" query_text TEXT NOT NULL,",
|
|
435
|
+
" dimensions INTEGER NOT NULL,",
|
|
436
|
+
" embedding_json TEXT NOT NULL,",
|
|
437
|
+
" created_at INTEGER NOT NULL",
|
|
438
|
+
");",
|
|
428
439
|
].join("\n"));
|
|
429
440
|
const docsColumns = db.prepare("PRAGMA table_info(docs)").all();
|
|
430
441
|
if (!docsColumns.some((column) => column.name === "content_hash")) {
|
|
@@ -710,13 +721,6 @@ function searchProjectMemoryHybrid(db, query, limit, project) {
|
|
|
710
721
|
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Project search requires a refreshed vector index. Run `claw search index --refresh` first.");
|
|
711
722
|
}
|
|
712
723
|
const queryIntent = buildProjectQueryIntent(query);
|
|
713
|
-
const queryEmbedding = runEmbeddingWorker({
|
|
714
|
-
embedding,
|
|
715
|
-
texts: [queryIntent.embeddingText || query],
|
|
716
|
-
}).vectors[0];
|
|
717
|
-
if (!queryEmbedding?.length) {
|
|
718
|
-
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Unable to generate a query embedding for project search.");
|
|
719
|
-
}
|
|
720
724
|
const candidateLimit = Math.max(limit * PROJECT_SEARCH_CANDIDATE_MULTIPLIER, 40);
|
|
721
725
|
const projectDocs = db
|
|
722
726
|
.prepare("SELECT source_path, kind, content FROM docs")
|
|
@@ -732,6 +736,18 @@ function searchProjectMemoryHybrid(db, query, limit, project) {
|
|
|
732
736
|
]));
|
|
733
737
|
const ftsRows = searchProjectMemoryKeywords(db, query, candidateLimit);
|
|
734
738
|
const signalRows = searchProjectMemorySignals(projectDocs, docSignals, candidateLimit);
|
|
739
|
+
const lexicalFastPath = tryProjectLexicalFastPath({
|
|
740
|
+
query,
|
|
741
|
+
queryIntent,
|
|
742
|
+
docSignals,
|
|
743
|
+
ftsRows,
|
|
744
|
+
signalRows,
|
|
745
|
+
limit,
|
|
746
|
+
});
|
|
747
|
+
if (lexicalFastPath) {
|
|
748
|
+
return lexicalFastPath;
|
|
749
|
+
}
|
|
750
|
+
const queryEmbedding = resolveProjectQueryEmbedding(db, embedding, queryIntent.embeddingText || query);
|
|
735
751
|
const vectorRows = db
|
|
736
752
|
.prepare([
|
|
737
753
|
"SELECT source_path, kind, chunk_text, embedding_json",
|
|
@@ -816,6 +832,108 @@ function searchProjectMemoryHybrid(db, query, limit, project) {
|
|
|
816
832
|
});
|
|
817
833
|
return rerankProjectSearchCandidates(Array.from(fused.values()), docSignals, limit);
|
|
818
834
|
}
|
|
835
|
+
function tryProjectLexicalFastPath(input) {
|
|
836
|
+
const { queryIntent } = input;
|
|
837
|
+
const primaryKeywordStep = buildProjectKeywordSearchPlan(input.query)[0];
|
|
838
|
+
if (queryIntent.strongTerms.length === 0
|
|
839
|
+
|| queryIntent.weakTerms.length > 0
|
|
840
|
+
|| !primaryKeywordStep
|
|
841
|
+
|| primaryKeywordStep.substringTerms.length > 0) {
|
|
842
|
+
return null;
|
|
843
|
+
}
|
|
844
|
+
const fullCoverage = Array.from(input.docSignals.entries()).filter(([, signals]) => signals.strongCoverageRatio === 1);
|
|
845
|
+
const pathMatches = fullCoverage.filter(([, signals]) => signals.fileNameHits >= queryIntent.strongTerms.length
|
|
846
|
+
|| signals.pathHits >= queryIntent.strongTerms.length);
|
|
847
|
+
const phraseMatches = fullCoverage.filter(([, signals]) => signals.phraseMatch);
|
|
848
|
+
const confidentSourcePath = pathMatches.length === 1
|
|
849
|
+
? pathMatches[0]?.[0]
|
|
850
|
+
: phraseMatches.length === 1
|
|
851
|
+
? phraseMatches[0]?.[0]
|
|
852
|
+
: null;
|
|
853
|
+
if (!confidentSourcePath) {
|
|
854
|
+
return null;
|
|
855
|
+
}
|
|
856
|
+
const candidates = new Map();
|
|
857
|
+
input.ftsRows.forEach((row, index) => {
|
|
858
|
+
candidates.set(row.source_path, {
|
|
859
|
+
sourcePath: row.source_path,
|
|
860
|
+
kind: row.kind,
|
|
861
|
+
snippet: row.snippet,
|
|
862
|
+
score: reciprocalRankScore(index + 1, 0.85) + (input.docSignals.get(row.source_path)?.exactBoost ?? 0),
|
|
863
|
+
textRank: index + 1,
|
|
864
|
+
});
|
|
865
|
+
});
|
|
866
|
+
input.signalRows.forEach((row, index) => {
|
|
867
|
+
const existing = candidates.get(row.source_path);
|
|
868
|
+
candidates.set(row.source_path, {
|
|
869
|
+
sourcePath: row.source_path,
|
|
870
|
+
kind: existing?.kind ?? row.kind,
|
|
871
|
+
snippet: existing?.snippet || row.snippet,
|
|
872
|
+
score: (existing?.score ?? 0)
|
|
873
|
+
+ reciprocalRankScore(index + 1, 0.15)
|
|
874
|
+
+ (existing ? 0 : (input.docSignals.get(row.source_path)?.exactBoost ?? 0)),
|
|
875
|
+
textRank: existing?.textRank,
|
|
876
|
+
signalRank: index + 1,
|
|
877
|
+
});
|
|
878
|
+
});
|
|
879
|
+
const confidentCandidate = candidates.get(confidentSourcePath);
|
|
880
|
+
if (!confidentCandidate) {
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
confidentCandidate.score += 0.1;
|
|
884
|
+
return rerankProjectSearchCandidates(Array.from(candidates.values()), input.docSignals, input.limit);
|
|
885
|
+
}
|
|
886
|
+
function resolveProjectQueryEmbedding(db, embedding, queryText) {
|
|
887
|
+
const normalizedQueryText = queryText.trim().replace(/\s+/g, " ");
|
|
888
|
+
const embeddingFingerprint = createHash("sha256")
|
|
889
|
+
.update(JSON.stringify(embedding))
|
|
890
|
+
.digest("hex");
|
|
891
|
+
const cacheKey = createHash("sha256")
|
|
892
|
+
.update(`${PROJECT_QUERY_EMBEDDING_CACHE_VERSION}\0${embeddingFingerprint}\0${normalizedQueryText}`)
|
|
893
|
+
.digest("hex");
|
|
894
|
+
const cached = db
|
|
895
|
+
.prepare([
|
|
896
|
+
"SELECT dimensions, embedding_json",
|
|
897
|
+
"FROM query_embeddings",
|
|
898
|
+
"WHERE cache_key = ? AND embedding_fingerprint = ? AND query_text = ?",
|
|
899
|
+
].join(" "))
|
|
900
|
+
.get(cacheKey, embeddingFingerprint, normalizedQueryText);
|
|
901
|
+
if (cached) {
|
|
902
|
+
const vector = parseEmbeddingJson(cached.embedding_json);
|
|
903
|
+
if (cached.dimensions > 0 && vector.length === cached.dimensions) {
|
|
904
|
+
return vector;
|
|
905
|
+
}
|
|
906
|
+
db.prepare("DELETE FROM query_embeddings WHERE cache_key = ?").run(cacheKey);
|
|
907
|
+
}
|
|
908
|
+
const generated = runEmbeddingWorker({
|
|
909
|
+
embedding,
|
|
910
|
+
texts: [normalizedQueryText],
|
|
911
|
+
});
|
|
912
|
+
const vector = generated.vectors[0];
|
|
913
|
+
if (!vector?.length) {
|
|
914
|
+
throw new ClawError("MEMORY_VECTOR_INDEX_REQUIRED", "Unable to generate a query embedding for project search.");
|
|
915
|
+
}
|
|
916
|
+
db.prepare([
|
|
917
|
+
"INSERT INTO query_embeddings",
|
|
918
|
+
" (cache_key, embedding_fingerprint, query_text, dimensions, embedding_json, created_at)",
|
|
919
|
+
"VALUES (?, ?, ?, ?, ?, ?)",
|
|
920
|
+
"ON CONFLICT(cache_key) DO UPDATE SET",
|
|
921
|
+
" embedding_fingerprint = excluded.embedding_fingerprint,",
|
|
922
|
+
" query_text = excluded.query_text,",
|
|
923
|
+
" dimensions = excluded.dimensions,",
|
|
924
|
+
" embedding_json = excluded.embedding_json,",
|
|
925
|
+
" created_at = excluded.created_at",
|
|
926
|
+
].join(" ")).run(cacheKey, embeddingFingerprint, normalizedQueryText, vector.length, JSON.stringify(vector), Date.now());
|
|
927
|
+
db.prepare([
|
|
928
|
+
"DELETE FROM query_embeddings",
|
|
929
|
+
"WHERE cache_key IN (",
|
|
930
|
+
" SELECT cache_key FROM query_embeddings",
|
|
931
|
+
" ORDER BY created_at DESC, rowid DESC",
|
|
932
|
+
" LIMIT -1 OFFSET ?",
|
|
933
|
+
")",
|
|
934
|
+
].join(" ")).run(PROJECT_QUERY_EMBEDDING_CACHE_LIMIT);
|
|
935
|
+
return vector;
|
|
936
|
+
}
|
|
819
937
|
function searchProjectMemoryKeywords(db, query, limit) {
|
|
820
938
|
const plan = buildProjectKeywordSearchPlan(query);
|
|
821
939
|
if (plan.length === 0) {
|
|
@@ -1051,6 +1169,8 @@ function buildProjectSearchSignals(input) {
|
|
|
1051
1169
|
strongMatchedTermCount: strongMatchedTerms.size,
|
|
1052
1170
|
fileNameHits,
|
|
1053
1171
|
pathHits,
|
|
1172
|
+
phraseMatch,
|
|
1173
|
+
strongCoverageRatio,
|
|
1054
1174
|
exactBoost: strongMatchedTerms.size * 0.016
|
|
1055
1175
|
+ weakMatchedTerms.size * 0.004
|
|
1056
1176
|
+ coverageRatio * 0.008
|