@amsterdamdatalabs/enact-docs-search 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +2 -2
- package/README.md +10 -5
- package/dist/cli.js +51 -20
- package/dist/cli.js.map +1 -1
- package/dist/embeddings/embedding-service.d.ts +9 -0
- package/dist/embeddings/embedding-service.d.ts.map +1 -1
- package/dist/embeddings/embedding-service.js +33 -7
- package/dist/embeddings/embedding-service.js.map +1 -1
- package/dist/indexing/indexing-service.d.ts +2 -0
- package/dist/indexing/indexing-service.d.ts.map +1 -1
- package/dist/indexing/indexing-service.js +90 -32
- package/dist/indexing/indexing-service.js.map +1 -1
- package/dist/search/search-service.d.ts +1 -1
- package/dist/storage/persistence.d.ts +33 -5
- package/dist/storage/persistence.d.ts.map +1 -1
- package/dist/storage/persistence.js +88 -24
- package/dist/storage/persistence.js.map +1 -1
- package/dist/storage/vector-store.d.ts +28 -1
- package/dist/storage/vector-store.d.ts.map +1 -1
- package/dist/storage/vector-store.js +41 -5
- package/dist/storage/vector-store.js.map +1 -1
- package/package.json +3 -2
package/NOTICE
CHANGED
|
@@ -26,7 +26,7 @@ specific plumbing with no Node analogue worth porting):
|
|
|
26
26
|
|
|
27
27
|
src/embeddings/embedding-service.ts (upstream patches ONNX Runtime for
|
|
28
28
|
Obsidian's Electron renderer via blob
|
|
29
|
-
URLs; @
|
|
29
|
+
URLs; @huggingface/transformers needs none
|
|
30
30
|
of that under plain Node/Bun)
|
|
31
31
|
src/adapter/repo-walker.ts (replaces Obsidian's `Vault` with
|
|
32
32
|
node:fs/promises)
|
|
@@ -44,7 +44,7 @@ Runtime dependencies and their licences (all permissive, verified in
|
|
|
44
44
|
package.json / node_modules at time of writing):
|
|
45
45
|
|
|
46
46
|
minisearch MIT BM25 full-text index
|
|
47
|
-
@
|
|
47
|
+
@huggingface/transformers Apache-2.0 local embeddings (no API key/network
|
|
48
48
|
call after the model is first cached)
|
|
49
49
|
hnswlib-node Apache-2.0 HNSW vector index (native Node build,
|
|
50
50
|
not the wasm build obsidian-qmd uses)
|
package/README.md
CHANGED
|
@@ -10,8 +10,9 @@ npm install -g @amsterdamdatalabs/enact-docs-search
|
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
Node.js 22 or newer is required. The first semantic query downloads the local
|
|
13
|
-
`Xenova/all-MiniLM-L6-v2` embedding model
|
|
14
|
-
cache
|
|
13
|
+
`Xenova/all-MiniLM-L6-v2` embedding model into the target repository's
|
|
14
|
+
`.cache/docs/models/` directory. The search index is stored alongside it under
|
|
15
|
+
`.cache/docs/index/`.
|
|
15
16
|
|
|
16
17
|
## Usage
|
|
17
18
|
|
|
@@ -21,11 +22,15 @@ Run inside a target repository:
|
|
|
21
22
|
enact-docs-search query "how crate boundaries are defined?"
|
|
22
23
|
enact-docs-search index
|
|
23
24
|
enact-docs-search index --force
|
|
25
|
+
enact-docs-search prepare
|
|
24
26
|
```
|
|
25
27
|
|
|
26
|
-
Queries automatically
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
Queries automatically provision a missing model and refresh missing or stale
|
|
29
|
+
indexes incrementally. If keyword-only indexing leaves semantic vectors stale,
|
|
30
|
+
the next hybrid or semantic query repairs them automatically before searching.
|
|
31
|
+
`prepare` performs the model bootstrap and a complete semantic index build
|
|
32
|
+
explicitly. Use `enact-docs-search --help` for advanced scope, mode, JSON, and
|
|
33
|
+
exclusion controls.
|
|
29
34
|
|
|
30
35
|
The package is also usable through `npx` or `bunx`:
|
|
31
36
|
|
package/dist/cli.js
CHANGED
|
@@ -14,7 +14,7 @@ import { EmbeddingService, DependencyError as EmbeddingDependencyError } from ".
|
|
|
14
14
|
import { SearchService } from "./search/search-service.js";
|
|
15
15
|
import { runIndex } from "./indexing/indexing-service.js";
|
|
16
16
|
import { listMarkdownFiles } from "./adapter/repo-walker.js";
|
|
17
|
-
import { repoCacheDir, paths, readManifest, readDocumentStoreExport, readVectorSidecar, vectorIndexExists, checkFreshness, } from "./storage/persistence.js";
|
|
17
|
+
import { repoCacheDir, repoCacheRoot, repoModelCacheDir, ensureRepoCache, CachePermissionError, paths, readManifest, readDocumentStoreExport, readVectorSidecar, vectorIndexExists, checkFreshness, EMBEDDING_MODEL_ID, } from "./storage/persistence.js";
|
|
18
18
|
import { scopesToRoots } from "./types.js";
|
|
19
19
|
import { existsSync } from "node:fs";
|
|
20
20
|
import { dirname, join } from "node:path";
|
|
@@ -24,6 +24,7 @@ function usage() {
|
|
|
24
24
|
|
|
25
25
|
Usage:
|
|
26
26
|
enact-docs-search index --repo <path> [--scope docs|plans|specs|all] [--force] [--keyword-only] [--exclude <glob>]
|
|
27
|
+
enact-docs-search prepare --repo <path> [--scope docs|plans|specs|all] [--force] [--exclude <glob>]
|
|
27
28
|
enact-docs-search query "<text>" --repo <path> [--scope docs|plans|specs|all] [--mode hybrid|keyword|semantic] [--limit N] [--exclude <glob>]
|
|
28
29
|
|
|
29
30
|
Options:
|
|
@@ -33,7 +34,7 @@ Options:
|
|
|
33
34
|
--scope <scope> docs | plans | specs | all (default: all)
|
|
34
35
|
--mode <mode> hybrid | keyword | semantic (default: hybrid, query only)
|
|
35
36
|
--limit <n> Max results to return (default: 10, query only)
|
|
36
|
-
--force Full rebuild, ignoring the incremental manifest (index only)
|
|
37
|
+
--force Full rebuild, ignoring the incremental manifest (index/prepare only)
|
|
37
38
|
--keyword-only Skip embedding generation entirely (index only, much faster)
|
|
38
39
|
--exclude <glob> Additional glob to exclude from scanning; repeatable
|
|
39
40
|
--json Emit machine-readable JSON instead of text (query only)
|
|
@@ -134,7 +135,7 @@ function validateMode(mode) {
|
|
|
134
135
|
fail(`unknown mode '${mode}' (use keyword, semantic, or hybrid)`);
|
|
135
136
|
}
|
|
136
137
|
}
|
|
137
|
-
|
|
138
|
+
function resolveRepo(args) {
|
|
138
139
|
if (!args.repo) {
|
|
139
140
|
const detected = detectRepoRoot(process.cwd());
|
|
140
141
|
if (!detected) {
|
|
@@ -144,6 +145,10 @@ async function cmdIndex(args) {
|
|
|
144
145
|
}
|
|
145
146
|
args.repo = detected;
|
|
146
147
|
}
|
|
148
|
+
return args.repo;
|
|
149
|
+
}
|
|
150
|
+
async function cmdIndex(args) {
|
|
151
|
+
resolveRepo(args);
|
|
147
152
|
validateScope(args.scope);
|
|
148
153
|
info(`root: ${args.repo} (scope: ${args.scope})`);
|
|
149
154
|
const t0 = Date.now();
|
|
@@ -154,6 +159,7 @@ async function cmdIndex(args) {
|
|
|
154
159
|
force: args.force,
|
|
155
160
|
skipEmbeddings: args.keywordOnly,
|
|
156
161
|
exclude: args.exclude,
|
|
162
|
+
allowRemoteModels: true,
|
|
157
163
|
onProgress: (p) => {
|
|
158
164
|
if (p.phase !== lastPhase) {
|
|
159
165
|
process.stderr.write(`\n[${p.phase}] `);
|
|
@@ -169,23 +175,35 @@ async function cmdIndex(args) {
|
|
|
169
175
|
`${result.filesScanned} files scanned, ${result.filesChanged} changed, ${result.filesRemoved} removed, ` +
|
|
170
176
|
`${result.chunksIndexed} chunks, ${result.embeddingsGenerated} embeddings ` +
|
|
171
177
|
`(${(Date.now() - t0)}ms)`);
|
|
172
|
-
console.log(`enact-docs-search: cache at ${
|
|
178
|
+
console.log(`enact-docs-search: cache at ${repoCacheRoot(args.repo)}`);
|
|
179
|
+
}
|
|
180
|
+
async function cmdPrepare(args) {
|
|
181
|
+
resolveRepo(args);
|
|
182
|
+
validateScope(args.scope);
|
|
183
|
+
await ensureRepoCache(args.repo);
|
|
184
|
+
const embeddingService = new EmbeddingService({
|
|
185
|
+
modelCacheDir: repoModelCacheDir(args.repo),
|
|
186
|
+
allowRemoteModels: true,
|
|
187
|
+
});
|
|
188
|
+
await embeddingService.initialize();
|
|
189
|
+
await embeddingService.embed("semantic search bootstrap");
|
|
190
|
+
await runIndex({
|
|
191
|
+
repoPath: args.repo,
|
|
192
|
+
scope: args.scope,
|
|
193
|
+
force: args.force,
|
|
194
|
+
exclude: args.exclude,
|
|
195
|
+
allowRemoteModels: true,
|
|
196
|
+
});
|
|
197
|
+
console.log(`enact-docs-search: prepared cache at ${repoCacheRoot(args.repo)}`);
|
|
173
198
|
}
|
|
174
199
|
async function cmdQuery(args) {
|
|
175
200
|
const query = args.positional[0];
|
|
176
201
|
if (!query)
|
|
177
202
|
fail("a query string is required");
|
|
178
|
-
|
|
179
|
-
const detected = detectRepoRoot(process.cwd());
|
|
180
|
-
if (!detected) {
|
|
181
|
-
fail("--repo <path> was not given, and no docs/, .plans/, or .specs/ found walking up from " +
|
|
182
|
-
process.cwd() +
|
|
183
|
-
" — pass --repo explicitly");
|
|
184
|
-
}
|
|
185
|
-
args.repo = detected;
|
|
186
|
-
}
|
|
203
|
+
resolveRepo(args);
|
|
187
204
|
validateScope(args.scope);
|
|
188
205
|
validateMode(args.mode);
|
|
206
|
+
await ensureRepoCache(args.repo);
|
|
189
207
|
// In --json mode, stdout must be pure JSON for downstream parsers — route
|
|
190
208
|
// this status line to stderr instead of suppressing it outright.
|
|
191
209
|
if (args.json) {
|
|
@@ -199,10 +217,12 @@ async function cmdQuery(args) {
|
|
|
199
217
|
// Freshness check (I-08: refresh stale or missing results before serving them).
|
|
200
218
|
const roots = scopesToRoots(args.scope);
|
|
201
219
|
const currentFiles = await listMarkdownFiles(args.repo, roots, { exclude: args.exclude });
|
|
202
|
-
const freshness = checkFreshness(manifest, args.scope, currentFiles);
|
|
220
|
+
const freshness = checkFreshness(manifest, args.scope, currentFiles, args.mode !== "keyword");
|
|
203
221
|
const hasVectorFile = args.mode !== "keyword" && await vectorIndexExists(cacheDir);
|
|
204
222
|
const vectorSidecar = args.mode !== "keyword" ? await readVectorSidecar(cacheDir) : null;
|
|
205
|
-
const needsVectorIndex = args.mode !== "keyword" &&
|
|
223
|
+
const needsVectorIndex = args.mode !== "keyword" &&
|
|
224
|
+
(!hasVectorFile || !vectorSidecar || freshness.vectorStaleCount > 0 ||
|
|
225
|
+
manifest?.embeddingModel !== EMBEDDING_MODEL_ID);
|
|
206
226
|
const rebuildVectorIndex = args.mode !== "keyword" && hasVectorFile && !vectorSidecar;
|
|
207
227
|
const needsRefresh = freshness.neverIndexed || freshness.staleCount > 0 || needsVectorIndex;
|
|
208
228
|
if (needsRefresh) {
|
|
@@ -210,7 +230,9 @@ async function cmdQuery(args) {
|
|
|
210
230
|
? "no index"
|
|
211
231
|
: freshness.staleCount > 0
|
|
212
232
|
? `${freshness.staleCount} changed file(s)`
|
|
213
|
-
:
|
|
233
|
+
: freshness.vectorStaleCount > 0
|
|
234
|
+
? `${freshness.vectorStaleCount} stale vector file(s)`
|
|
235
|
+
: "no usable vector index";
|
|
214
236
|
const message = `enact-docs-search: refreshing ${args.scope} index (${reason})`;
|
|
215
237
|
if (args.json)
|
|
216
238
|
console.error(message);
|
|
@@ -223,10 +245,11 @@ async function cmdQuery(args) {
|
|
|
223
245
|
force: rebuildVectorIndex,
|
|
224
246
|
skipEmbeddings: args.mode === "keyword",
|
|
225
247
|
exclude: args.exclude,
|
|
248
|
+
allowRemoteModels: true,
|
|
226
249
|
});
|
|
227
250
|
}
|
|
228
251
|
catch (error) {
|
|
229
|
-
if (error instanceof VectorDependencyError || error instanceof EmbeddingDependencyError) {
|
|
252
|
+
if (error instanceof VectorDependencyError || error instanceof EmbeddingDependencyError || error instanceof CachePermissionError) {
|
|
230
253
|
fail(error.message);
|
|
231
254
|
}
|
|
232
255
|
throw error;
|
|
@@ -247,11 +270,14 @@ async function cmdQuery(args) {
|
|
|
247
270
|
fail("vector index sidecar is missing or corrupt; re-run index --force");
|
|
248
271
|
try {
|
|
249
272
|
await vectorStore.loadFromDisk(paths(cacheDir).vectorIndex, sidecar);
|
|
250
|
-
embeddingService = new EmbeddingService(
|
|
273
|
+
embeddingService = new EmbeddingService({
|
|
274
|
+
modelCacheDir: repoModelCacheDir(args.repo),
|
|
275
|
+
allowRemoteModels: true,
|
|
276
|
+
});
|
|
251
277
|
await embeddingService.initialize();
|
|
252
278
|
}
|
|
253
279
|
catch (error) {
|
|
254
|
-
if (error instanceof VectorDependencyError || error instanceof EmbeddingDependencyError) {
|
|
280
|
+
if (error instanceof VectorDependencyError || error instanceof EmbeddingDependencyError || error instanceof CachePermissionError) {
|
|
255
281
|
fail(error.message);
|
|
256
282
|
}
|
|
257
283
|
throw error;
|
|
@@ -296,14 +322,19 @@ async function main() {
|
|
|
296
322
|
case "index":
|
|
297
323
|
await cmdIndex(args);
|
|
298
324
|
break;
|
|
325
|
+
case "prepare":
|
|
326
|
+
await cmdPrepare(args);
|
|
327
|
+
break;
|
|
299
328
|
case "query":
|
|
300
329
|
await cmdQuery(args);
|
|
301
330
|
break;
|
|
302
331
|
default:
|
|
303
|
-
fail(`unknown command '${command}' (use 'index' or 'query')`);
|
|
332
|
+
fail(`unknown command '${command}' (use 'index', 'prepare', or 'query')`);
|
|
304
333
|
}
|
|
305
334
|
}
|
|
306
335
|
main().catch((error) => {
|
|
336
|
+
if (error instanceof CachePermissionError)
|
|
337
|
+
fail(error.message);
|
|
307
338
|
console.error(`enact-docs-search: FAIL — unexpected error: ${error.stack ?? error}`);
|
|
308
339
|
process.exit(2);
|
|
309
340
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
export declare const MODEL_ID = "Xenova/all-MiniLM-L6-v2";
|
|
1
2
|
export declare const EMBEDDING_DIMENSIONS = 384;
|
|
2
3
|
export declare class DependencyError extends Error {
|
|
3
4
|
}
|
|
5
|
+
export interface EmbeddingServiceOptions {
|
|
6
|
+
/** Transformers.js filesystem cache; always supplied by the repo cache resolver. */
|
|
7
|
+
modelCacheDir: string;
|
|
8
|
+
/** Permit Transformers.js to download missing model files. */
|
|
9
|
+
allowRemoteModels?: boolean;
|
|
10
|
+
}
|
|
4
11
|
export declare class EmbeddingService {
|
|
12
|
+
private readonly options;
|
|
5
13
|
private embeddingPipeline;
|
|
6
14
|
private ready;
|
|
15
|
+
constructor(options: EmbeddingServiceOptions);
|
|
7
16
|
initialize(): Promise<void>;
|
|
8
17
|
isReady(): boolean;
|
|
9
18
|
embed(text: string): Promise<number[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-service.d.ts","sourceRoot":"","sources":["../../src/embeddings/embedding-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embedding-service.d.ts","sourceRoot":"","sources":["../../src/embeddings/embedding-service.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,QAAQ,4BAA4B,CAAC;AAClD,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAE7C,MAAM,WAAW,uBAAuB;IACtC,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,iBAAiB,CAA0C;IACnE,OAAO,CAAC,KAAK,CAAS;gBAEO,OAAO,EAAE,uBAAuB;IAEvD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDjC,OAAO,IAAI,OAAO;IAIZ,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAqBvD"}
|
|
@@ -1,32 +1,58 @@
|
|
|
1
|
-
|
|
1
|
+
import { rm } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export const MODEL_ID = "Xenova/all-MiniLM-L6-v2";
|
|
2
4
|
export const EMBEDDING_DIMENSIONS = 384;
|
|
3
5
|
export class DependencyError extends Error {
|
|
4
6
|
}
|
|
5
7
|
export class EmbeddingService {
|
|
8
|
+
options;
|
|
6
9
|
embeddingPipeline = null;
|
|
7
10
|
ready = false;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
8
14
|
async initialize() {
|
|
9
15
|
let transformers;
|
|
10
16
|
try {
|
|
11
|
-
transformers = await import("@
|
|
17
|
+
transformers = await import("@huggingface/transformers");
|
|
12
18
|
}
|
|
13
19
|
catch (error) {
|
|
14
|
-
throw new DependencyError("Semantic search requires @
|
|
20
|
+
throw new DependencyError("Semantic search requires @huggingface/transformers, which is not installed.\n" +
|
|
15
21
|
"Run `npm install` in the enact-docs-search directory, then retry.\n" +
|
|
16
22
|
`Original error: ${error.message}`);
|
|
17
23
|
}
|
|
18
24
|
const { pipeline, env } = transformers;
|
|
19
|
-
env.allowLocalModels =
|
|
25
|
+
env.allowLocalModels = true;
|
|
26
|
+
env.allowRemoteModels = this.options.allowRemoteModels ?? true;
|
|
27
|
+
env.cacheDir = this.options.modelCacheDir;
|
|
20
28
|
try {
|
|
21
29
|
this.embeddingPipeline = (await pipeline("feature-extraction", MODEL_ID, {
|
|
22
|
-
|
|
30
|
+
dtype: "fp32",
|
|
23
31
|
}));
|
|
24
32
|
this.ready = true;
|
|
25
33
|
}
|
|
26
34
|
catch (error) {
|
|
35
|
+
// A partially downloaded model is recoverable. Remove only this model's
|
|
36
|
+
// repo-local cache and retry once; all other cache contents remain intact.
|
|
37
|
+
if (env.allowRemoteModels) {
|
|
38
|
+
try {
|
|
39
|
+
await rm(join(this.options.modelCacheDir, MODEL_ID), { recursive: true, force: true });
|
|
40
|
+
this.embeddingPipeline = (await pipeline("feature-extraction", MODEL_ID, {
|
|
41
|
+
dtype: "fp32",
|
|
42
|
+
}));
|
|
43
|
+
this.ready = true;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
catch (retryError) {
|
|
47
|
+
throw new DependencyError("Failed to load the local embedding model (Xenova/all-MiniLM-L6-v2).\n" +
|
|
48
|
+
"The model is downloaded automatically into the repository-local cache; " +
|
|
49
|
+
"check network access and repository write permissions.\n" +
|
|
50
|
+
`Original error: ${retryError.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
27
53
|
throw new DependencyError("Failed to load the local embedding model (Xenova/all-MiniLM-L6-v2).\n" +
|
|
28
|
-
"
|
|
29
|
-
"
|
|
54
|
+
"The repository-local model cache is incomplete or unreadable; retry after " +
|
|
55
|
+
"running the search command again.\n" +
|
|
30
56
|
`Original error: ${error.message}`);
|
|
31
57
|
}
|
|
32
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-service.js","sourceRoot":"","sources":["../../src/embeddings/embedding-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embedding-service.js","sourceRoot":"","sources":["../../src/embeddings/embedding-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ export interface IndexOptions {
|
|
|
22
22
|
skipEmbeddings?: boolean;
|
|
23
23
|
/** Ignore the manifest and rebuild every file in scope from scratch. */
|
|
24
24
|
force?: boolean;
|
|
25
|
+
/** Permit automatic model download when semantic indexing is required. */
|
|
26
|
+
allowRemoteModels?: boolean;
|
|
25
27
|
exclude?: string[];
|
|
26
28
|
onProgress?: ProgressCallback;
|
|
27
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexing-service.d.ts","sourceRoot":"","sources":["../../src/indexing/indexing-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indexing-service.d.ts","sourceRoot":"","sources":["../../src/indexing/indexing-service.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,MAAM,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAKD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA0M7E"}
|
|
@@ -14,7 +14,7 @@ import { VectorStore } from "../storage/vector-store.js";
|
|
|
14
14
|
import { EmbeddingService, EMBEDDING_DIMENSIONS } from "../embeddings/embedding-service.js";
|
|
15
15
|
import { Chunker } from "./chunker.js";
|
|
16
16
|
import { listMarkdownFiles, readRepoFile } from "../adapter/repo-walker.js";
|
|
17
|
-
import {
|
|
17
|
+
import { ensureRepoCache, readManifest, writeManifest, emptyManifest, readDocumentStoreExport, writeDocumentStoreExport, readVectorSidecar, writeVectorSidecar, removeVectorCache, vectorIndexExists, repoCacheDir, repoModelCacheDir, paths, EMBEDDING_MODEL_ID, } from "../storage/persistence.js";
|
|
18
18
|
import { scopesToRoots } from "../types.js";
|
|
19
19
|
const CHUNK_SIZE = 3200;
|
|
20
20
|
const CHUNK_OVERLAP = 0.15;
|
|
@@ -22,63 +22,97 @@ export async function runIndex(options) {
|
|
|
22
22
|
const start = Date.now();
|
|
23
23
|
const { repoPath, scope, onProgress } = options;
|
|
24
24
|
const cacheDir = repoCacheDir(repoPath);
|
|
25
|
-
await
|
|
26
|
-
const
|
|
25
|
+
await ensureRepoCache(repoPath);
|
|
26
|
+
const persistedManifest = await readManifest(cacheDir);
|
|
27
|
+
const manifest = persistedManifest ?? emptyManifest();
|
|
28
|
+
const cacheRequiresRebuild = persistedManifest === null;
|
|
29
|
+
if (cacheRequiresRebuild && options.skipEmbeddings) {
|
|
30
|
+
// An incompatible cache cannot be safely reconciled without loading its
|
|
31
|
+
// vector index. Drop the disposable vector files so the next semantic
|
|
32
|
+
// query rebuilds them automatically instead of mixing old metadata in.
|
|
33
|
+
await removeVectorCache(cacheDir);
|
|
34
|
+
}
|
|
27
35
|
onProgress?.({ phase: "scanning", filesProcessed: 0, totalFiles: 0 });
|
|
28
36
|
const roots = scopesToRoots(scope);
|
|
29
37
|
const files = await listMarkdownFiles(repoPath, roots, { exclude: options.exclude });
|
|
30
38
|
const docStore = new DocumentStore();
|
|
31
|
-
await docStore.initialize((await readDocumentStoreExport(cacheDir)) ?? undefined);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
await docStore.initialize(cacheRequiresRebuild ? undefined : (await readDocumentStoreExport(cacheDir)) ?? undefined);
|
|
40
|
+
let vectorStore = null;
|
|
41
|
+
let sidecar = null;
|
|
42
|
+
if (!options.skipEmbeddings) {
|
|
43
|
+
vectorStore = new VectorStore({ dimensions: EMBEDDING_DIMENSIONS });
|
|
44
|
+
const hasExistingVectors = await vectorIndexExists(cacheDir);
|
|
45
|
+
sidecar = !cacheRequiresRebuild && hasExistingVectors
|
|
46
|
+
? await readVectorSidecar(cacheDir)
|
|
47
|
+
: null;
|
|
48
|
+
if (sidecar && !options.force) {
|
|
37
49
|
await vectorStore.loadFromDisk(paths(cacheDir).vectorIndex, sidecar);
|
|
38
50
|
}
|
|
39
51
|
else {
|
|
40
52
|
await vectorStore.initialize();
|
|
41
53
|
}
|
|
42
54
|
}
|
|
43
|
-
else {
|
|
44
|
-
await vectorStore.initialize();
|
|
45
|
-
}
|
|
46
55
|
const chunker = new Chunker({ maxChunkSize: CHUNK_SIZE, overlapPercent: CHUNK_OVERLAP });
|
|
47
56
|
const currentPaths = new Set(files.map((f) => f.path));
|
|
48
|
-
const
|
|
57
|
+
const textChanged = [];
|
|
58
|
+
const filesToProcess = [];
|
|
49
59
|
for (const f of files) {
|
|
50
60
|
const entry = manifest.files[f.path];
|
|
51
|
-
|
|
52
|
-
|
|
61
|
+
const textIsStale = options.force || !entry || entry.textMtimeMs !== f.mtimeMs;
|
|
62
|
+
const vectorIsStale = !options.skipEmbeddings &&
|
|
63
|
+
(manifest.embeddingModel !== EMBEDDING_MODEL_ID ||
|
|
64
|
+
!sidecar || !entry || entry.vectorStale || entry.vectorMtimeMs !== f.mtimeMs);
|
|
65
|
+
if (textIsStale)
|
|
66
|
+
textChanged.push(f);
|
|
67
|
+
if (textIsStale || vectorIsStale)
|
|
68
|
+
filesToProcess.push(f);
|
|
53
69
|
}
|
|
54
70
|
// Files that were indexed under this manifest for this scope but no longer exist on disk.
|
|
55
71
|
const removed = Object.keys(manifest.files).filter((p) => {
|
|
56
72
|
const inScope = roots.some((r) => p === r || p.startsWith(r + "/"));
|
|
57
|
-
|
|
73
|
+
const entry = manifest.files[p];
|
|
74
|
+
return inScope && !currentPaths.has(p) &&
|
|
75
|
+
(entry.textMtimeMs !== null || entry.vectorMtimeMs !== null || entry.vectorStale);
|
|
58
76
|
});
|
|
59
77
|
onProgress?.({
|
|
60
78
|
phase: "text-indexing",
|
|
61
79
|
filesProcessed: 0,
|
|
62
|
-
totalFiles:
|
|
80
|
+
totalFiles: filesToProcess.length,
|
|
63
81
|
});
|
|
64
82
|
let chunksIndexed = 0;
|
|
65
83
|
const changedDocsForEmbedding = [];
|
|
66
84
|
for (const path of removed) {
|
|
67
85
|
await docStore.deleteByFilePath(path);
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
if (vectorStore)
|
|
87
|
+
await vectorStore.deleteByFilePath(path);
|
|
88
|
+
const entry = manifest.files[path];
|
|
89
|
+
entry.textMtimeMs = null;
|
|
90
|
+
if (vectorStore) {
|
|
91
|
+
entry.vectorMtimeMs = null;
|
|
92
|
+
entry.vectorStale = false;
|
|
93
|
+
}
|
|
94
|
+
else if (entry.vectorMtimeMs !== null) {
|
|
95
|
+
// Keep a tombstone until a semantic run can remove the old vector.
|
|
96
|
+
entry.vectorStale = true;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
entry.vectorStale = false;
|
|
100
|
+
}
|
|
101
|
+
if (entry.textMtimeMs === null && entry.vectorMtimeMs === null)
|
|
102
|
+
delete manifest.files[path];
|
|
70
103
|
}
|
|
71
|
-
for (let i = 0; i <
|
|
72
|
-
const file =
|
|
104
|
+
for (let i = 0; i < filesToProcess.length; i++) {
|
|
105
|
+
const file = filesToProcess[i];
|
|
73
106
|
onProgress?.({
|
|
74
107
|
phase: "text-indexing",
|
|
75
108
|
filesProcessed: i,
|
|
76
|
-
totalFiles:
|
|
109
|
+
totalFiles: filesToProcess.length,
|
|
77
110
|
currentFile: file.path,
|
|
78
111
|
});
|
|
79
112
|
const content = await readRepoFile(file.absPath);
|
|
80
113
|
await docStore.deleteByFilePath(file.path);
|
|
81
|
-
|
|
114
|
+
if (vectorStore)
|
|
115
|
+
await vectorStore.deleteByFilePath(file.path);
|
|
82
116
|
const chunks = chunker.chunk(content, file.path);
|
|
83
117
|
const docs = chunks.map((chunk, idx) => ({
|
|
84
118
|
id: `${file.path}:${idx}`,
|
|
@@ -91,12 +125,34 @@ export async function runIndex(options) {
|
|
|
91
125
|
}));
|
|
92
126
|
await docStore.indexDocuments(docs);
|
|
93
127
|
chunksIndexed += docs.length;
|
|
94
|
-
|
|
95
|
-
|
|
128
|
+
if (vectorStore)
|
|
129
|
+
changedDocsForEmbedding.push(...docs);
|
|
130
|
+
const entry = manifest.files[file.path] ?? {
|
|
131
|
+
textMtimeMs: null,
|
|
132
|
+
vectorMtimeMs: null,
|
|
133
|
+
vectorStale: false,
|
|
134
|
+
};
|
|
135
|
+
entry.textMtimeMs = file.mtimeMs;
|
|
136
|
+
if (!vectorStore) {
|
|
137
|
+
// The text index is current, but semantic vectors are intentionally not
|
|
138
|
+
// touched by keyword-only indexing. The next semantic/hybrid query will
|
|
139
|
+
// refresh this file automatically.
|
|
140
|
+
entry.vectorStale = true;
|
|
141
|
+
}
|
|
142
|
+
else if (docs.length === 0) {
|
|
143
|
+
// An empty file is fully represented by the absence of vector points;
|
|
144
|
+
// record that fact so it does not trigger a refresh forever.
|
|
145
|
+
entry.vectorMtimeMs = file.mtimeMs;
|
|
146
|
+
entry.vectorStale = false;
|
|
147
|
+
}
|
|
148
|
+
manifest.files[file.path] = entry;
|
|
96
149
|
}
|
|
97
150
|
let embeddingsGenerated = 0;
|
|
98
|
-
if (
|
|
99
|
-
const embeddingService = new EmbeddingService(
|
|
151
|
+
if (vectorStore && changedDocsForEmbedding.length > 0) {
|
|
152
|
+
const embeddingService = new EmbeddingService({
|
|
153
|
+
modelCacheDir: repoModelCacheDir(repoPath),
|
|
154
|
+
allowRemoteModels: options.allowRemoteModels ?? true,
|
|
155
|
+
});
|
|
100
156
|
await embeddingService.initialize();
|
|
101
157
|
onProgress?.({
|
|
102
158
|
phase: "embedding",
|
|
@@ -115,6 +171,8 @@ export async function runIndex(options) {
|
|
|
115
171
|
chunkIndex: doc.chunkIndex,
|
|
116
172
|
embedding: embeddings[j],
|
|
117
173
|
});
|
|
174
|
+
manifest.files[doc.filePath].vectorMtimeMs = doc.mtimeMs;
|
|
175
|
+
manifest.files[doc.filePath].vectorStale = false;
|
|
118
176
|
embeddingsGenerated++;
|
|
119
177
|
}
|
|
120
178
|
onProgress?.({
|
|
@@ -126,13 +184,13 @@ export async function runIndex(options) {
|
|
|
126
184
|
}
|
|
127
185
|
// Persist.
|
|
128
186
|
await writeDocumentStoreExport(cacheDir, docStore.export());
|
|
129
|
-
if (
|
|
130
|
-
const
|
|
131
|
-
await writeVectorSidecar(cacheDir,
|
|
187
|
+
if (vectorStore) {
|
|
188
|
+
const updatedSidecar = await vectorStore.saveToDisk(paths(cacheDir).vectorIndex);
|
|
189
|
+
await writeVectorSidecar(cacheDir, updatedSidecar);
|
|
132
190
|
}
|
|
133
191
|
const updatedManifest = {
|
|
134
192
|
...manifest,
|
|
135
|
-
embeddingModel: EMBEDDING_MODEL_ID,
|
|
193
|
+
embeddingModel: options.skipEmbeddings ? manifest.embeddingModel : EMBEDDING_MODEL_ID,
|
|
136
194
|
indexedScopes: Array.from(new Set([...manifest.indexedScopes, scope])),
|
|
137
195
|
lastIndexedAt: Date.now(),
|
|
138
196
|
};
|
|
@@ -141,7 +199,7 @@ export async function runIndex(options) {
|
|
|
141
199
|
return {
|
|
142
200
|
scope,
|
|
143
201
|
filesScanned: files.length,
|
|
144
|
-
filesChanged:
|
|
202
|
+
filesChanged: textChanged.length,
|
|
145
203
|
filesRemoved: removed.length,
|
|
146
204
|
chunksIndexed,
|
|
147
205
|
embeddingsGenerated,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexing-service.js","sourceRoot":"","sources":["../../src/indexing/indexing-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAwB,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAiB,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"indexing-service.js","sourceRoot":"","sources":["../../src/indexing/indexing-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* constant as upstream). Dropped: `QueryExpansionService` and
|
|
7
7
|
* `RerankingService` integration — both call out to an LLM, which is out of
|
|
8
8
|
* scope for this offline CLI (the brief's three dependencies are minisearch,
|
|
9
|
-
* @
|
|
9
|
+
* @huggingface/transformers, and hnswlib-node; no LLM client). Also dropped:
|
|
10
10
|
* `groupByFile`/section dedup UI conveniences not needed by a line-oriented
|
|
11
11
|
* CLI, since callers get raw scored chunks that already carry a line number.
|
|
12
12
|
*/
|
|
@@ -2,8 +2,12 @@ import type { ExportedDocumentStore } from "./document-store.js";
|
|
|
2
2
|
import type { SidecarData } from "./vector-store.js";
|
|
3
3
|
import type { Scope } from "../types.js";
|
|
4
4
|
export interface ManifestEntry {
|
|
5
|
-
/** mtime (epoch ms) at the time this file was last indexed */
|
|
6
|
-
|
|
5
|
+
/** mtime (epoch ms) at the time this file was last text-indexed; null means removed */
|
|
6
|
+
textMtimeMs: number | null;
|
|
7
|
+
/** mtime (epoch ms) represented by the vector index; null means not embedded */
|
|
8
|
+
vectorMtimeMs: number | null;
|
|
9
|
+
/** True when the vector cache must be reconciled by a semantic index run. */
|
|
10
|
+
vectorStale: boolean;
|
|
7
11
|
}
|
|
8
12
|
export interface Manifest {
|
|
9
13
|
/** Schema/model version — bump to force a full rebuild on incompatible change */
|
|
@@ -18,10 +22,30 @@ export interface Manifest {
|
|
|
18
22
|
/** epoch ms of the last successful index run */
|
|
19
23
|
lastIndexedAt: number;
|
|
20
24
|
}
|
|
21
|
-
export declare const MANIFEST_VERSION =
|
|
25
|
+
export declare const MANIFEST_VERSION = 3;
|
|
22
26
|
export declare const EMBEDDING_MODEL_ID = "Xenova/all-MiniLM-L6-v2";
|
|
23
|
-
|
|
27
|
+
export declare class CachePermissionError extends Error {
|
|
28
|
+
}
|
|
29
|
+
/** Fixed repo-local cache root. This is intentionally not configurable. */
|
|
30
|
+
export declare function repoCacheRoot(repoPath: string): string;
|
|
31
|
+
/** Repo-local index cache directory. */
|
|
24
32
|
export declare function repoCacheDir(repoPath: string): string;
|
|
33
|
+
/** Repo-local Transformers.js model cache directory. */
|
|
34
|
+
export declare function repoModelCacheDir(repoPath: string): string;
|
|
35
|
+
/** Ensure both cache trees are available before a command starts work. */
|
|
36
|
+
export declare function ensureRepoCache(repoPath: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Write `data` to `destPath` without ever leaving a partially-written file
|
|
39
|
+
* at that path. A crash (OOM kill, SIGKILL, power loss) mid-`writeFile`
|
|
40
|
+
* would otherwise truncate the destination in place; the next run would
|
|
41
|
+
* then hit a corrupt manifest/sidecar/index and, for the binary vector
|
|
42
|
+
* index, fail hard on load with no path back to a working cache. Writing to
|
|
43
|
+
* a sibling temp file first and `rename`-ing over the destination is safe
|
|
44
|
+
* because POSIX rename within the same directory (same filesystem) is
|
|
45
|
+
* atomic: readers only ever observe the old complete file or the new
|
|
46
|
+
* complete file, never a partial one.
|
|
47
|
+
*/
|
|
48
|
+
export declare function atomicWriteFile(destPath: string, data: string | Uint8Array): Promise<void>;
|
|
25
49
|
export declare function paths(cacheDir: string): {
|
|
26
50
|
manifest: string;
|
|
27
51
|
documentStore: string;
|
|
@@ -36,10 +60,14 @@ export declare function readDocumentStoreExport(cacheDir: string): Promise<Expor
|
|
|
36
60
|
export declare function writeDocumentStoreExport(cacheDir: string, data: ExportedDocumentStore): Promise<void>;
|
|
37
61
|
export declare function readVectorSidecar(cacheDir: string): Promise<SidecarData | null>;
|
|
38
62
|
export declare function writeVectorSidecar(cacheDir: string, data: SidecarData): Promise<void>;
|
|
63
|
+
/** Remove the disposable vector cache when an incompatible manifest is found. */
|
|
64
|
+
export declare function removeVectorCache(cacheDir: string): Promise<void>;
|
|
39
65
|
export declare function vectorIndexExists(cacheDir: string): Promise<boolean>;
|
|
40
66
|
export interface FreshnessReport {
|
|
41
67
|
/** Repo-relative paths that are new, changed, or removed since the last index for this scope. */
|
|
42
68
|
staleCount: number;
|
|
69
|
+
/** Repo-relative paths whose vector embeddings are missing or stale. */
|
|
70
|
+
vectorStaleCount: number;
|
|
43
71
|
/** True if this scope has never been indexed at all. */
|
|
44
72
|
neverIndexed: boolean;
|
|
45
73
|
}
|
|
@@ -51,5 +79,5 @@ export interface FreshnessReport {
|
|
|
51
79
|
export declare function checkFreshness(manifest: Manifest | null, scope: Scope, currentFiles: {
|
|
52
80
|
path: string;
|
|
53
81
|
mtimeMs: number;
|
|
54
|
-
}[]): FreshnessReport;
|
|
82
|
+
}[], requireVectors?: boolean): FreshnessReport;
|
|
55
83
|
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/storage/persistence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/storage/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,29 +9,72 @@
|
|
|
9
9
|
* ever been indexed (so a query can refresh an un-indexed scope instead of
|
|
10
10
|
* silently returning nothing).
|
|
11
11
|
*/
|
|
12
|
-
import { mkdir, readFile, writeFile, stat } from "node:fs/promises";
|
|
13
|
-
import { createHash } from "node:crypto";
|
|
14
|
-
import { homedir } from "node:os";
|
|
12
|
+
import { mkdir, readFile, writeFile, stat, open, unlink, rename } from "node:fs/promises";
|
|
15
13
|
import { join, resolve } from "node:path";
|
|
16
14
|
import { scopesToRoots } from "../types.js";
|
|
17
|
-
export const MANIFEST_VERSION =
|
|
15
|
+
export const MANIFEST_VERSION = 3;
|
|
18
16
|
export const EMBEDDING_MODEL_ID = "Xenova/all-MiniLM-L6-v2";
|
|
19
|
-
|
|
20
|
-
const xdg = process.env.XDG_CACHE_HOME;
|
|
21
|
-
const base = xdg && xdg.trim().length > 0 ? xdg : join(homedir(), ".cache");
|
|
22
|
-
return join(base, "enact-docs-search");
|
|
17
|
+
export class CachePermissionError extends Error {
|
|
23
18
|
}
|
|
24
|
-
/**
|
|
19
|
+
/** Fixed repo-local cache root. This is intentionally not configurable. */
|
|
20
|
+
export function repoCacheRoot(repoPath) {
|
|
21
|
+
return join(resolve(repoPath), ".cache", "docs");
|
|
22
|
+
}
|
|
23
|
+
/** Repo-local index cache directory. */
|
|
25
24
|
export function repoCacheDir(repoPath) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
return join(repoCacheRoot(repoPath), "index");
|
|
26
|
+
}
|
|
27
|
+
/** Repo-local Transformers.js model cache directory. */
|
|
28
|
+
export function repoModelCacheDir(repoPath) {
|
|
29
|
+
return join(repoCacheRoot(repoPath), "models");
|
|
30
|
+
}
|
|
31
|
+
/** Ensure both cache trees are available before a command starts work. */
|
|
32
|
+
export async function ensureRepoCache(repoPath) {
|
|
33
|
+
try {
|
|
34
|
+
const directories = [repoCacheDir(repoPath), repoModelCacheDir(repoPath)];
|
|
35
|
+
for (const directory of directories) {
|
|
36
|
+
await mkdir(directory, { recursive: true });
|
|
37
|
+
const probe = join(directory, `.write-probe-${process.pid}-${Date.now()}`);
|
|
38
|
+
const handle = await open(probe, "wx");
|
|
39
|
+
await handle.close();
|
|
40
|
+
await unlink(probe);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const code = error.code;
|
|
45
|
+
if (code === "EACCES" || code === "EPERM" || code === "EROFS") {
|
|
46
|
+
throw new CachePermissionError(`The repository-local search cache is not writable: ${repoCacheRoot(repoPath)}. ` +
|
|
47
|
+
"The target repository must allow writes under .cache/docs.");
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
30
51
|
}
|
|
31
52
|
const MANIFEST_FILE = "manifest.json";
|
|
32
53
|
const DOCUMENT_STORE_FILE = "document-store.json";
|
|
33
54
|
const VECTOR_INDEX_FILE = "vector-index.bin";
|
|
34
55
|
const VECTOR_SIDECAR_FILE = "vector-sidecar.json";
|
|
56
|
+
/**
|
|
57
|
+
* Write `data` to `destPath` without ever leaving a partially-written file
|
|
58
|
+
* at that path. A crash (OOM kill, SIGKILL, power loss) mid-`writeFile`
|
|
59
|
+
* would otherwise truncate the destination in place; the next run would
|
|
60
|
+
* then hit a corrupt manifest/sidecar/index and, for the binary vector
|
|
61
|
+
* index, fail hard on load with no path back to a working cache. Writing to
|
|
62
|
+
* a sibling temp file first and `rename`-ing over the destination is safe
|
|
63
|
+
* because POSIX rename within the same directory (same filesystem) is
|
|
64
|
+
* atomic: readers only ever observe the old complete file or the new
|
|
65
|
+
* complete file, never a partial one.
|
|
66
|
+
*/
|
|
67
|
+
export async function atomicWriteFile(destPath, data) {
|
|
68
|
+
const tmpPath = `${destPath}.tmp-${process.pid}-${Date.now()}`;
|
|
69
|
+
try {
|
|
70
|
+
await writeFile(tmpPath, data);
|
|
71
|
+
await rename(tmpPath, destPath);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
await unlink(tmpPath).catch(() => { });
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
35
78
|
export function paths(cacheDir) {
|
|
36
79
|
return {
|
|
37
80
|
manifest: join(cacheDir, MANIFEST_FILE),
|
|
@@ -56,7 +99,7 @@ export async function readManifest(cacheDir) {
|
|
|
56
99
|
}
|
|
57
100
|
}
|
|
58
101
|
export async function writeManifest(cacheDir, manifest) {
|
|
59
|
-
await
|
|
102
|
+
await atomicWriteFile(paths(cacheDir).manifest, JSON.stringify(manifest, null, 2));
|
|
60
103
|
}
|
|
61
104
|
export function emptyManifest() {
|
|
62
105
|
return {
|
|
@@ -77,7 +120,7 @@ export async function readDocumentStoreExport(cacheDir) {
|
|
|
77
120
|
}
|
|
78
121
|
}
|
|
79
122
|
export async function writeDocumentStoreExport(cacheDir, data) {
|
|
80
|
-
await
|
|
123
|
+
await atomicWriteFile(paths(cacheDir).documentStore, JSON.stringify(data));
|
|
81
124
|
}
|
|
82
125
|
export async function readVectorSidecar(cacheDir) {
|
|
83
126
|
try {
|
|
@@ -89,7 +132,14 @@ export async function readVectorSidecar(cacheDir) {
|
|
|
89
132
|
}
|
|
90
133
|
}
|
|
91
134
|
export async function writeVectorSidecar(cacheDir, data) {
|
|
92
|
-
await
|
|
135
|
+
await atomicWriteFile(paths(cacheDir).vectorSidecar, JSON.stringify(data));
|
|
136
|
+
}
|
|
137
|
+
/** Remove the disposable vector cache when an incompatible manifest is found. */
|
|
138
|
+
export async function removeVectorCache(cacheDir) {
|
|
139
|
+
await Promise.all([
|
|
140
|
+
unlink(paths(cacheDir).vectorIndex).catch(() => { }),
|
|
141
|
+
unlink(paths(cacheDir).vectorSidecar).catch(() => { }),
|
|
142
|
+
]);
|
|
93
143
|
}
|
|
94
144
|
export async function vectorIndexExists(cacheDir) {
|
|
95
145
|
return stat(paths(cacheDir).vectorIndex)
|
|
@@ -101,32 +151,46 @@ export async function vectorIndexExists(cacheDir) {
|
|
|
101
151
|
* caller) against the manifest, without mutating anything. Used by `query`
|
|
102
152
|
* to refresh a stale or nonexistent index before searching (I-08).
|
|
103
153
|
*/
|
|
104
|
-
export function checkFreshness(manifest, scope, currentFiles) {
|
|
154
|
+
export function checkFreshness(manifest, scope, currentFiles, requireVectors = false) {
|
|
105
155
|
// "Never indexed" is judged by overlap with the manifest, not by a scope
|
|
106
156
|
// label match: indexing with --scope all and then querying --scope docs
|
|
107
157
|
// (a subset) is a legitimate, fully-covered case. If there are files on
|
|
108
158
|
// disk in this scope but none of them appear in the manifest at all, no
|
|
109
159
|
// index run has ever covered this scope.
|
|
110
160
|
if (!manifest)
|
|
111
|
-
return { staleCount: 0, neverIndexed: true };
|
|
112
|
-
if (currentFiles.length > 0 && currentFiles.every((f) =>
|
|
113
|
-
|
|
161
|
+
return { staleCount: 0, vectorStaleCount: 0, neverIndexed: true };
|
|
162
|
+
if (currentFiles.length > 0 && currentFiles.every((f) => {
|
|
163
|
+
const entry = manifest.files[f.path];
|
|
164
|
+
return !entry || entry.textMtimeMs === null;
|
|
165
|
+
})) {
|
|
166
|
+
return { staleCount: 0, vectorStaleCount: 0, neverIndexed: true };
|
|
114
167
|
}
|
|
115
168
|
let staleCount = 0;
|
|
169
|
+
let vectorStaleCount = 0;
|
|
116
170
|
const seen = new Set();
|
|
117
171
|
for (const f of currentFiles) {
|
|
118
172
|
seen.add(f.path);
|
|
119
173
|
const entry = manifest.files[f.path];
|
|
120
|
-
if (!entry || entry.
|
|
174
|
+
if (!entry || entry.textMtimeMs !== f.mtimeMs)
|
|
121
175
|
staleCount++;
|
|
176
|
+
if (requireVectors &&
|
|
177
|
+
(!entry || entry.vectorStale || entry.vectorMtimeMs !== f.mtimeMs)) {
|
|
178
|
+
vectorStaleCount++;
|
|
179
|
+
}
|
|
122
180
|
}
|
|
123
181
|
// Files present in the manifest for this scope but deleted on disk also count as stale.
|
|
124
182
|
const roots = scopesToRoots(scope);
|
|
125
183
|
for (const path of Object.keys(manifest.files)) {
|
|
126
184
|
const inScope = roots.some((r) => path === r || path.startsWith(r + "/"));
|
|
127
|
-
if (inScope && !seen.has(path))
|
|
128
|
-
|
|
185
|
+
if (inScope && !seen.has(path)) {
|
|
186
|
+
const entry = manifest.files[path];
|
|
187
|
+
if (entry.textMtimeMs !== null)
|
|
188
|
+
staleCount++;
|
|
189
|
+
if (requireVectors && (entry.vectorStale || entry.vectorMtimeMs !== null)) {
|
|
190
|
+
vectorStaleCount++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
129
193
|
}
|
|
130
|
-
return { staleCount, neverIndexed: false };
|
|
194
|
+
return { staleCount, vectorStaleCount, neverIndexed: false };
|
|
131
195
|
}
|
|
132
196
|
//# sourceMappingURL=persistence.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/storage/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/storage/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ export interface VectorSearchResult {
|
|
|
16
16
|
}
|
|
17
17
|
export interface VectorStoreOptions {
|
|
18
18
|
dimensions: number;
|
|
19
|
+
/** Initial HNSW capacity. Grows automatically past this; override in tests only. */
|
|
20
|
+
initialMaxElements?: number;
|
|
19
21
|
}
|
|
20
22
|
interface VectorMetadata {
|
|
21
23
|
id: string;
|
|
@@ -40,9 +42,34 @@ export declare class VectorStore {
|
|
|
40
42
|
initialize(): Promise<void>;
|
|
41
43
|
/** Load a previously persisted index plus its label/metadata sidecar. */
|
|
42
44
|
loadFromDisk(indexPath: string, sidecar: SidecarData): Promise<void>;
|
|
43
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Persist the raw HNSW index plus the sidecar label/metadata mapping.
|
|
47
|
+
*
|
|
48
|
+
* Writes to a sibling temp path and renames over `indexPath` so a crash
|
|
49
|
+
* mid-write (this binary file is large and the native write isn't
|
|
50
|
+
* instantaneous) can never leave a truncated `indexPath` in place —
|
|
51
|
+
* `loadFromDisk`'s `readIndex` has no way to recover from a corrupt file,
|
|
52
|
+
* and that failure would otherwise repeat on every subsequent run.
|
|
53
|
+
*/
|
|
44
54
|
saveToDisk(indexPath: string): Promise<SidecarData>;
|
|
45
55
|
isReady(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* hnswlib's internal `cur_element_count` counts every label ever added,
|
|
58
|
+
* including ones later `markDelete`d — deletion only tombstones a slot, it
|
|
59
|
+
* never frees capacity (see hnswalg.h's addPoint: capacity is checked
|
|
60
|
+
* against `cur_element_count`, not the live point count). `add()` never
|
|
61
|
+
* reuses a deleted label (see the comment in `add()` below), so capacity
|
|
62
|
+
* is consumed monotonically by every add call, live or not.
|
|
63
|
+
*
|
|
64
|
+
* This must NOT be approximated with `this.idToLabel.size` (the live
|
|
65
|
+
* count): after any delete+re-add cycle — which is exactly what every
|
|
66
|
+
* incremental re-index does per changed file — live count stays flat
|
|
67
|
+
* while consumed capacity keeps climbing, so that check would never fire
|
|
68
|
+
* and `addPoint` would eventually throw "The number of elements exceeds
|
|
69
|
+
* the specified limit" past the initial capacity. `getCurrentCount()`
|
|
70
|
+
* reads the native counter directly, so it can't drift out of sync with
|
|
71
|
+
* our own bookkeeping.
|
|
72
|
+
*/
|
|
46
73
|
private resizeIfNeeded;
|
|
47
74
|
add(doc: VectorDocument): Promise<void>;
|
|
48
75
|
delete(id: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/storage/vector-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/storage/vector-store.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,qBAAa,eAAgB,SAAQ,KAAK;CAAG;AAyB7C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,QAAQ,CAA0C;IAE1D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAM;gBAEnB,OAAO,EAAE,kBAAkB;IAKvC,uCAAuC;IACjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC,yEAAyE;IACnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1E;;;;;;;;OAQG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBzD,OAAO,IAAI,OAAO;IAIlB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,cAAc;IAUhB,GAAG,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,+EAA+E;IACzE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,KAAa,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA2CvF,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAGxC;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { rename, unlink } from "node:fs/promises";
|
|
1
2
|
import { scopeOfPath } from "../types.js";
|
|
2
3
|
export class DependencyError extends Error {
|
|
3
4
|
}
|
|
@@ -25,12 +26,13 @@ export class VectorStore {
|
|
|
25
26
|
metadata = new Map();
|
|
26
27
|
nextLabel = 0;
|
|
27
28
|
deletedLabels = [];
|
|
28
|
-
maxElements
|
|
29
|
+
maxElements;
|
|
29
30
|
M = 16;
|
|
30
31
|
efConstruction = 200;
|
|
31
32
|
efSearch = 50;
|
|
32
33
|
constructor(options) {
|
|
33
34
|
this.dimensions = options.dimensions;
|
|
35
|
+
this.maxElements = options.initialMaxElements ?? 10000;
|
|
34
36
|
}
|
|
35
37
|
/** Initialize a fresh, empty index. */
|
|
36
38
|
async initialize() {
|
|
@@ -59,11 +61,27 @@ export class VectorStore {
|
|
|
59
61
|
this.deletedLabels = [...sidecar.deletedLabels];
|
|
60
62
|
this.ready = true;
|
|
61
63
|
}
|
|
62
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Persist the raw HNSW index plus the sidecar label/metadata mapping.
|
|
66
|
+
*
|
|
67
|
+
* Writes to a sibling temp path and renames over `indexPath` so a crash
|
|
68
|
+
* mid-write (this binary file is large and the native write isn't
|
|
69
|
+
* instantaneous) can never leave a truncated `indexPath` in place —
|
|
70
|
+
* `loadFromDisk`'s `readIndex` has no way to recover from a corrupt file,
|
|
71
|
+
* and that failure would otherwise repeat on every subsequent run.
|
|
72
|
+
*/
|
|
63
73
|
async saveToDisk(indexPath) {
|
|
64
74
|
if (!this.index)
|
|
65
75
|
throw new Error("Vector store not initialized");
|
|
66
|
-
|
|
76
|
+
const tmpPath = `${indexPath}.tmp-${process.pid}-${Date.now()}`;
|
|
77
|
+
try {
|
|
78
|
+
await this.index.writeIndex(tmpPath);
|
|
79
|
+
await rename(tmpPath, indexPath);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
await unlink(tmpPath).catch(() => { });
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
67
85
|
return {
|
|
68
86
|
idToLabel: Array.from(this.idToLabel.entries()),
|
|
69
87
|
metadata: Array.from(this.metadata.entries()),
|
|
@@ -75,13 +93,31 @@ export class VectorStore {
|
|
|
75
93
|
isReady() {
|
|
76
94
|
return this.ready;
|
|
77
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* hnswlib's internal `cur_element_count` counts every label ever added,
|
|
98
|
+
* including ones later `markDelete`d — deletion only tombstones a slot, it
|
|
99
|
+
* never frees capacity (see hnswalg.h's addPoint: capacity is checked
|
|
100
|
+
* against `cur_element_count`, not the live point count). `add()` never
|
|
101
|
+
* reuses a deleted label (see the comment in `add()` below), so capacity
|
|
102
|
+
* is consumed monotonically by every add call, live or not.
|
|
103
|
+
*
|
|
104
|
+
* This must NOT be approximated with `this.idToLabel.size` (the live
|
|
105
|
+
* count): after any delete+re-add cycle — which is exactly what every
|
|
106
|
+
* incremental re-index does per changed file — live count stays flat
|
|
107
|
+
* while consumed capacity keeps climbing, so that check would never fire
|
|
108
|
+
* and `addPoint` would eventually throw "The number of elements exceeds
|
|
109
|
+
* the specified limit" past the initial capacity. `getCurrentCount()`
|
|
110
|
+
* reads the native counter directly, so it can't drift out of sync with
|
|
111
|
+
* our own bookkeeping.
|
|
112
|
+
*/
|
|
78
113
|
resizeIfNeeded() {
|
|
79
114
|
if (!this.index)
|
|
80
115
|
return;
|
|
81
|
-
|
|
82
|
-
|
|
116
|
+
let consumedCount = this.index.getCurrentCount();
|
|
117
|
+
while (consumedCount >= this.maxElements - 1) {
|
|
83
118
|
this.maxElements *= 2;
|
|
84
119
|
this.index.resizeIndex(this.maxElements);
|
|
120
|
+
consumedCount = this.index.getCurrentCount();
|
|
85
121
|
}
|
|
86
122
|
}
|
|
87
123
|
async add(doc) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/storage/vector-store.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,OAAO,eAAgB,SAAQ,KAAK;CAAG;AAS7C,KAAK,UAAU,mBAAmB;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAe,CAAC;QACzD,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC;QAC5E,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3E,OAAO,eAAe,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CACvB,wEAAwE;YACtE,sDAAsD;YACtD,qEAAqE;YACrE,mBAAoB,KAAe,CAAC,OAAO,EAAE,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"vector-store.js","sourceRoot":"","sources":["../../src/storage/vector-store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amsterdamdatalabs/enact-docs-search",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Hybrid (BM25 + vector) semantic search CLI over a repo's docs/.plans/.specs knowledge trees.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -22,11 +22,12 @@
|
|
|
22
22
|
"scripts": {
|
|
23
23
|
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
24
24
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
25
|
+
"test": "npm run build && node --test",
|
|
25
26
|
"prepublishOnly": "npm run build",
|
|
26
27
|
"start": "node dist/cli.js"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@
|
|
30
|
+
"@huggingface/transformers": "3.4.2",
|
|
30
31
|
"hnswlib-node": "^3.0.0",
|
|
31
32
|
"minisearch": "^7.2.0"
|
|
32
33
|
},
|