@intentic/iq-engine 1.176.3 → 1.209.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -3
- package/dist/embed/vector-cache.d.ts +9 -0
- package/dist/embed/vector-cache.d.ts.map +1 -0
- package/dist/embed/vector-cache.js +103 -0
- package/dist/embed/vector-cache.js.map +1 -0
- package/dist/engines/semantic.d.ts +2 -1
- package/dist/engines/semantic.d.ts.map +1 -1
- package/dist/engines/semantic.js +51 -24
- package/dist/engines/semantic.js.map +1 -1
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -16
- package/dist/index.js.map +1 -1
- package/dist/indexer/index-worker.d.ts +3 -0
- package/dist/indexer/index-worker.d.ts.map +1 -1
- package/dist/indexer/index-worker.js +26 -10
- package/dist/indexer/index-worker.js.map +1 -1
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/indexer.js +2 -1
- package/dist/indexer/indexer.js.map +1 -1
- package/dist/query/query-worker.d.ts +34 -0
- package/dist/query/query-worker.d.ts.map +1 -0
- package/dist/query/query-worker.js +38 -0
- package/dist/query/query-worker.js.map +1 -0
- package/dist/query/scorer.d.ts +22 -0
- package/dist/query/scorer.d.ts.map +1 -0
- package/dist/query/scorer.js +18 -0
- package/dist/query/scorer.js.map +1 -0
- package/dist/query/worker-scorer.d.ts +15 -0
- package/dist/query/worker-scorer.d.ts.map +1 -0
- package/dist/query/worker-scorer.js +85 -0
- package/dist/query/worker-scorer.js.map +1 -0
- package/dist/store/db.d.ts +1 -0
- package/dist/store/db.d.ts.map +1 -1
- package/dist/store/db.js +51 -5
- package/dist/store/db.js.map +1 -1
- package/dist/store/index-store.d.ts.map +1 -1
- package/dist/store/index-store.js +8 -6
- package/dist/store/index-store.js.map +1 -1
- package/dist/store/vectors.d.ts +11 -0
- package/dist/store/vectors.d.ts.map +1 -0
- package/dist/store/vectors.js +42 -0
- package/dist/store/vectors.js.map +1 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +6 -5
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/verbs/dispatch.d.ts +2 -5
- package/dist/verbs/dispatch.d.ts.map +1 -1
- package/dist/verbs/dispatch.js +30 -18
- package/dist/verbs/dispatch.js.map +1 -1
- package/dist/workspace/floor.d.ts +1 -1
- package/dist/workspace/floor.d.ts.map +1 -1
- package/dist/workspace/floor.js +18 -4
- package/dist/workspace/floor.js.map +1 -1
- package/dist/workspace/glob.d.ts.map +1 -1
- package/dist/workspace/glob.js +3 -1
- package/dist/workspace/glob.js.map +1 -1
- package/dist/workspace/scan.d.ts.map +1 -1
- package/dist/workspace/scan.js +2 -1
- package/dist/workspace/scan.js.map +1 -1
- package/package.json +9 -8
package/README.md
CHANGED
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
# @intentic/iq-engine
|
|
2
2
|
|
|
3
|
-
The search engine behind the [`iq`](../../
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The search engine behind the [`iq`](../../_search/iq) CLI, and the heavy lib of the iq cluster.
|
|
4
|
+
|
|
5
|
+
A disk index (`node:sqlite`) fused across **lexical** (ripgrep), **structural** (ast-grep), **semantic** (local
|
|
6
|
+
embed + rerank) and **git** engines, with rank fusion and a token-budget renderer.
|
|
7
|
+
|
|
8
|
+
The rebuildable index lives at `.intentic/cache/iq/`. Fresh databases use SQLite incremental auto-vacuum; a
|
|
9
|
+
completed writer pass compacts when at least 25% of the file is freelist pages, so delete-heavy reindexes do not
|
|
10
|
+
leave a gigabyte-scale sparse cache behind.
|
|
11
|
+
|
|
12
|
+
The agent plane is out of search scope BY DEFAULT: [workspace/floor.ts](src/workspace/floor.ts) allows only the
|
|
13
|
+
state table's own authored slice of `.intentic` (`SEARCHABLE_STATE_PATHS` from `@intentic/sandbox-contract` —
|
|
14
|
+
reviewable config plus drafts, staged docs, workspace extensions) and denies every ledger, cache, profile and
|
|
15
|
+
checkout, including ones added later, without this package changing.
|
|
16
|
+
|
|
17
|
+
Chunk embeddings live in a `sqlite-vec` table beside the chunks, one signed byte per dimension, and the nearest
|
|
18
|
+
ones to a query are found inside SQLite rather than by handing every vector to JavaScript. On this workspace —
|
|
19
|
+
4,039 files, 67k embedded chunks — that is the difference between 286ms and 31ms a query, 451MB and 79MB of peak
|
|
20
|
+
memory, and a 212MB index and an 85MB one. What the quantizing costs is measured rather than assumed: against
|
|
21
|
+
the float scorer over 30 natural-language queries, the top hit is identical every time, 97.4% of the top 24 are,
|
|
22
|
+
and no displayed score moves by more than the 0.01 it is rounded to. A vector is also a pure function of chunk
|
|
23
|
+
text, so nothing here is precious — [embed/vector-cache.ts](src/embed/vector-cache.ts) keeps full-precision
|
|
24
|
+
copies in a sidecar the index dir's own deletion never touches.
|
|
6
25
|
|
|
7
26
|
Two engines answer "orient me" rather than "find X", and read the index rather than searching it:
|
|
8
27
|
[engines/map.ts](src/engines/map.ts) PageRanks files over the import graph — specifiers captured by
|
|
@@ -18,3 +37,42 @@ codebase-health panel from it. One ranking, two presentations — the verbs keep
|
|
|
18
37
|
`composition.ts`) and calls `run` / `health` in-process for `/workspace/search` and `/workspace/health`, which
|
|
19
38
|
is the only reason app code imports this package at all. Nothing else should: every other path to these
|
|
20
39
|
results is the `sandbox-contract` wire shape (`WorkspaceSearch*`, `WorkspaceHealth*`), never an import.
|
|
40
|
+
|
|
41
|
+
## Two engines, and why the resident one has threads
|
|
42
|
+
|
|
43
|
+
`createEngine` is one query and exit — the CLI. It does everything on its own thread because nothing else is
|
|
44
|
+
there to disturb.
|
|
45
|
+
|
|
46
|
+
`createResidentEngine` is the daemon's, and the daemon's thread is also serving every agent stream, the routes
|
|
47
|
+
and the browser. Both of the expensive halves of search are moved off it. Keeping the index current is one
|
|
48
|
+
thread ([indexer/index-worker.ts](src/indexer/index-worker.ts)); answering the model stages of a query is the
|
|
49
|
+
other ([query/query-worker.ts](src/query/query-worker.ts)). The cross-encoder is what still earns that thread —
|
|
50
|
+
a few hundred milliseconds per query, tokenized in JS, yielding at no point. Scoring used to cost about as much
|
|
51
|
+
again and no longer does: since the vector table took over the ranking it is tens of milliseconds, and it is the
|
|
52
|
+
reranker alone that would otherwise stall every agent stream the daemon is serving.
|
|
53
|
+
|
|
54
|
+
```dag
|
|
55
|
+
{ "title": "One index, three threads", "direction": "LR",
|
|
56
|
+
"nodes": [{ "id": "host", "label": "Host thread", "note": "BM25, rg, fusion, render", "accent": "4" },
|
|
57
|
+
{ "id": "index", "label": "Index worker", "note": "the only writer", "accent": "4" },
|
|
58
|
+
{ "id": "query", "label": "Query worker", "note": "vectors + cross-encoder", "accent": "4" },
|
|
59
|
+
{ "id": "db", "label": "index.db", "note": "SQLite, WAL", "accent": "neutral" }],
|
|
60
|
+
"edges": [{ "from": "host", "to": "db" }, { "from": "query", "to": "db" }, { "from": "index", "to": "db" },
|
|
61
|
+
{ "from": "host", "to": "index", "dashed": true }, { "from": "host", "to": "query", "dashed": true }] }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Write-ahead logging is what makes that safe: one writer, two readers, no waiting. The dashed edges are
|
|
65
|
+
messages — a change notification out to the indexer, a query out to the scorer and its ranked answer back.
|
|
66
|
+
The resident engine's `metrics()` reports its cached file count, dirty/applied sequence lag, generation, and
|
|
67
|
+
query-worker liveness/backlog without walking the sweep; the sandbox folds those numbers into its durable
|
|
68
|
+
resource time series so a growing host heap can be compared with the state this engine actually retains.
|
|
69
|
+
|
|
70
|
+
## Key files
|
|
71
|
+
|
|
72
|
+
- [src/verbs](src/verbs) — one file per search verb; the surface `iq` dispatches into.
|
|
73
|
+
- [src/engines](src/engines) — the four searches: lexical, structural, semantic, git.
|
|
74
|
+
- [src/plan](src/plan) — intent detection and rank fusion; how four answers become one.
|
|
75
|
+
- [src/query](src/query) — the two model stages behind an interface, and the thread the daemon runs them on.
|
|
76
|
+
- [src/indexer](src/indexer) — building and updating the disk index.
|
|
77
|
+
- [src/render](src/render) — fitting results into a token budget.
|
|
78
|
+
- [src/store](src/store) — the `node:sqlite` index itself.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface VectorCache {
|
|
2
|
+
get(hashes: readonly string[]): Map<string, Uint8Array>;
|
|
3
|
+
put(entries: ReadonlyMap<string, Uint8Array>): void;
|
|
4
|
+
compact(): void;
|
|
5
|
+
close(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const vectorCachePath: (indexDir: string) => string;
|
|
8
|
+
export declare const openVectorCache: (path: string, modelId: string, maxRows?: number) => VectorCache | undefined;
|
|
9
|
+
//# sourceMappingURL=vector-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-cache.d.ts","sourceRoot":"","sources":["../../src/embed/vector-cache.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,WAAW;IAExB,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAExD,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAEpD,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;CACjB;AAGD,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,MAAkC,CAAC;AAkFtF,eAAO,MAAM,eAAe,SAAU,MAAM,WAAW,MAAM,uBAAuB,WAAW,GAAG,SAejG,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { DatabaseSync } from "node:sqlite";
|
|
4
|
+
const CACHE_SCHEMA = "1";
|
|
5
|
+
const MAX_ROWS = 200_000;
|
|
6
|
+
const DDL = `
|
|
7
|
+
CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
|
|
8
|
+
CREATE TABLE IF NOT EXISTS vectors (
|
|
9
|
+
hash TEXT PRIMARY KEY,
|
|
10
|
+
embedding BLOB NOT NULL,
|
|
11
|
+
used_at INTEGER NOT NULL
|
|
12
|
+
);
|
|
13
|
+
CREATE INDEX IF NOT EXISTS vectors_used ON vectors(used_at);
|
|
14
|
+
`;
|
|
15
|
+
export const vectorCachePath = (indexDir) => `${indexDir}-vectors.db`;
|
|
16
|
+
const open = (path, modelId, maxRows) => {
|
|
17
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
18
|
+
const db = new DatabaseSync(path);
|
|
19
|
+
db.exec("PRAGMA busy_timeout = 5000;");
|
|
20
|
+
const pageCount = Number(db.prepare("PRAGMA page_count").get()?.page_count ?? 0);
|
|
21
|
+
if (pageCount === 0) {
|
|
22
|
+
db.exec("PRAGMA auto_vacuum = INCREMENTAL;");
|
|
23
|
+
}
|
|
24
|
+
db.exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;");
|
|
25
|
+
db.exec(DDL);
|
|
26
|
+
const meta = (key) => db.prepare("SELECT value FROM meta WHERE key = ?").get(key)?.value;
|
|
27
|
+
const setMeta = (key, value) => {
|
|
28
|
+
db.prepare("INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, value);
|
|
29
|
+
};
|
|
30
|
+
const version = meta("cache_version");
|
|
31
|
+
if (version !== undefined && version !== CACHE_SCHEMA) {
|
|
32
|
+
db.close();
|
|
33
|
+
throw new Error(`iq vector cache schema ${version} != ${CACHE_SCHEMA}`);
|
|
34
|
+
}
|
|
35
|
+
setMeta("cache_version", CACHE_SCHEMA);
|
|
36
|
+
if (meta("model_id") !== modelId) {
|
|
37
|
+
db.exec("DELETE FROM vectors");
|
|
38
|
+
setMeta("model_id", modelId);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
get(hashes) {
|
|
42
|
+
const found = new Map();
|
|
43
|
+
if (hashes.length === 0) {
|
|
44
|
+
return found;
|
|
45
|
+
}
|
|
46
|
+
const distinct = [...new Set(hashes)];
|
|
47
|
+
const marks = distinct.map(() => "?").join(", ");
|
|
48
|
+
for (const row of db.prepare(`SELECT hash, embedding FROM vectors WHERE hash IN (${marks})`).all(...distinct)) {
|
|
49
|
+
found.set(row.hash, row.embedding);
|
|
50
|
+
}
|
|
51
|
+
if (found.size > 0) {
|
|
52
|
+
const hitMarks = [...found.keys()].map(() => "?").join(", ");
|
|
53
|
+
db.prepare(`UPDATE vectors SET used_at = ? WHERE hash IN (${hitMarks})`).run(Date.now(), ...found.keys());
|
|
54
|
+
}
|
|
55
|
+
return found;
|
|
56
|
+
},
|
|
57
|
+
put(entries) {
|
|
58
|
+
if (entries.size === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const insert = db.prepare("INSERT INTO vectors (hash, embedding, used_at) VALUES (?, ?, ?) ON CONFLICT(hash) DO UPDATE SET embedding = excluded.embedding, used_at = excluded.used_at");
|
|
62
|
+
db.exec("BEGIN");
|
|
63
|
+
try {
|
|
64
|
+
for (const [hash, embedding] of entries) {
|
|
65
|
+
insert.run(hash, embedding, Date.now());
|
|
66
|
+
}
|
|
67
|
+
db.exec("COMMIT");
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
db.exec("ROLLBACK");
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
compact() {
|
|
75
|
+
const rows = Number(db.prepare("SELECT COUNT(*) AS n FROM vectors").get().n);
|
|
76
|
+
if (rows <= maxRows) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
db.prepare("DELETE FROM vectors WHERE hash IN (SELECT hash FROM vectors ORDER BY used_at ASC LIMIT ?)").run(rows - maxRows);
|
|
80
|
+
db.exec("PRAGMA incremental_vacuum");
|
|
81
|
+
},
|
|
82
|
+
close: () => db.close(),
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export const openVectorCache = (path, modelId, maxRows = MAX_ROWS) => {
|
|
86
|
+
try {
|
|
87
|
+
return open(path, modelId, maxRows);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
for (const suffix of ["", "-wal", "-shm"]) {
|
|
91
|
+
if (existsSync(`${path}${suffix}`)) {
|
|
92
|
+
rmSync(`${path}${suffix}`, { force: true });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
return open(path, modelId, maxRows);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=vector-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-cache.js","sourceRoot":"","sources":["../../src/embed/vector-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Embedder } from "../embed/embedder.js";
|
|
2
|
+
import type { VectorCache } from "../embed/vector-cache.js";
|
|
2
3
|
import type { IndexDb } from "../store/db.js";
|
|
3
4
|
import type { EngineHit } from "../types.js";
|
|
4
|
-
export declare const embedPending: (db: IndexDb, embedder: Embedder, cap?: number, timeBudgetMs?: number) => Promise<number>;
|
|
5
|
+
export declare const embedPending: (db: IndexDb, embedder: Embedder, cache?: VectorCache, cap?: number, timeBudgetMs?: number) => Promise<number>;
|
|
5
6
|
export declare const semanticSearch: (db: IndexDb, queryVec: Float32Array, allowed: ReadonlySet<string>) => EngineHit[];
|
|
6
7
|
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/engines/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../src/engines/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAa7C,eAAO,MAAM,YAAY,OACjB,OAAO,YACD,QAAQ,UACV,WAAW,0CAGpB,OAAO,CAAC,MAAM,CAqChB,CAAC;AAcF,eAAO,MAAM,cAAc,OAAQ,OAAO,YAAY,YAAY,WAAW,WAAW,CAAC,MAAM,CAAC,KAAG,SAAS,EAuC3G,CAAC"}
|
package/dist/engines/semantic.js
CHANGED
|
@@ -1,44 +1,71 @@
|
|
|
1
|
+
import { nearestChunks, putVector } from "../store/vectors.js";
|
|
1
2
|
const TOP_K = 24;
|
|
2
3
|
const TOPUP_CAP = 256;
|
|
3
4
|
const TOPUP_TIME_MS = 2000;
|
|
4
5
|
const BATCH = 16;
|
|
5
|
-
export const embedPending = async (db, embedder, cap = TOPUP_CAP, timeBudgetMs = TOPUP_TIME_MS) => {
|
|
6
|
+
export const embedPending = async (db, embedder, cache, cap = TOPUP_CAP, timeBudgetMs = TOPUP_TIME_MS) => {
|
|
6
7
|
const started = Date.now();
|
|
7
8
|
let done = 0;
|
|
8
9
|
while (done < cap && Date.now() - started < timeBudgetMs) {
|
|
9
|
-
const rows = db.all("SELECT id, text FROM chunks WHERE
|
|
10
|
+
const rows = db.all("SELECT id, file_id, hash, text FROM chunks WHERE embedded = 0 LIMIT ?", Math.min(BATCH, cap - done));
|
|
10
11
|
if (rows.length === 0) {
|
|
11
12
|
break;
|
|
12
13
|
}
|
|
13
|
-
const
|
|
14
|
+
const cached = cache?.get(rows.map((row) => row["hash"])) ?? new Map();
|
|
15
|
+
const missing = new Map();
|
|
16
|
+
for (const row of rows) {
|
|
17
|
+
const hash = row["hash"];
|
|
18
|
+
if (!cached.has(hash)) {
|
|
19
|
+
missing.set(hash, row["text"]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const misses = [...missing.entries()];
|
|
23
|
+
const vectors = misses.length > 0 ? await embedder.embedBatch(misses.map(([, text]) => text)) : [];
|
|
24
|
+
const fresh = new Map();
|
|
25
|
+
misses.forEach(([hash], i) => {
|
|
26
|
+
const vec = vectors[i];
|
|
27
|
+
fresh.set(hash, new Uint8Array(vec.buffer.slice(vec.byteOffset, vec.byteOffset + vec.byteLength)));
|
|
28
|
+
});
|
|
29
|
+
cache?.put(fresh);
|
|
14
30
|
db.transaction(() => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
31
|
+
for (const row of rows) {
|
|
32
|
+
const hash = row["hash"];
|
|
33
|
+
const blob = cached.get(hash) ?? fresh.get(hash);
|
|
34
|
+
putVector(db, Number(row["id"]), Number(row["file_id"]), new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4));
|
|
35
|
+
}
|
|
18
36
|
});
|
|
19
37
|
done += rows.length;
|
|
20
38
|
}
|
|
21
|
-
return Number(db.get("SELECT COUNT(*) AS n FROM chunks WHERE
|
|
39
|
+
return Number(db.get("SELECT COUNT(*) AS n FROM chunks WHERE embedded = 0")?.["n"] ?? 0);
|
|
22
40
|
};
|
|
23
41
|
export const semanticSearch = (db, queryVec, allowed) => {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const blob = row["embedding"];
|
|
31
|
-
const vec = new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4);
|
|
32
|
-
let dot = 0;
|
|
33
|
-
for (let i = 0; i < queryVec.length; i++) {
|
|
34
|
-
dot += queryVec[i] * vec[i];
|
|
35
|
-
}
|
|
36
|
-
const text = row["text"].split("\n")[1]?.trim() ?? row["text"].split(" § ")[1] ?? "";
|
|
37
|
-
scored.push({ path, line: Number(row["start_line"]), text, score: dot });
|
|
42
|
+
const files = db.all("SELECT id, path FROM files");
|
|
43
|
+
const allowedIds = files.filter((file) => allowed.has(file["path"])).map((file) => Number(file["id"]));
|
|
44
|
+
const nearest = nearestChunks(db, queryVec, TOP_K, allowedIds.length === files.length ? undefined : allowedIds);
|
|
45
|
+
if (nearest.length === 0) {
|
|
46
|
+
return [];
|
|
38
47
|
}
|
|
39
|
-
|
|
48
|
+
const marks = nearest.map(() => "?").join(",");
|
|
49
|
+
const rows = new Map(db
|
|
50
|
+
.all(`SELECT c.id, c.start_line, c.text, f.path FROM chunks c JOIN files f ON f.id = c.file_id WHERE c.id IN (${marks})`, ...nearest.map((hit) => hit.chunkId))
|
|
51
|
+
.map((row) => [Number(row["id"]), row]));
|
|
52
|
+
return (nearest
|
|
53
|
+
.flatMap((hit) => {
|
|
54
|
+
const row = rows.get(hit.chunkId);
|
|
55
|
+
if (row === undefined) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
const text = row["text"];
|
|
59
|
+
return [
|
|
60
|
+
{
|
|
61
|
+
path: row["path"],
|
|
62
|
+
line: Number(row["start_line"]),
|
|
63
|
+
text: text.split("\n")[1]?.trim() ?? text.split(" § ")[1] ?? "",
|
|
64
|
+
score: hit.score,
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
})
|
|
40
68
|
.toSorted((a, b) => b.score - a.score || (a.path < b.path ? -1 : 1) || a.line - b.line)
|
|
41
|
-
.
|
|
42
|
-
.map(({ path, line, text, score }) => ({ path, line, text, tags: [{ kind: "sem", score: Math.round(score * 100) / 100 }] }));
|
|
69
|
+
.map(({ path, line, text, score }) => ({ path, line, text, tags: [{ kind: "sem", score: Math.round(score * 100) / 100 }] })));
|
|
43
70
|
};
|
|
44
71
|
//# sourceMappingURL=semantic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/engines/semantic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/engines/semantic.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export type { HotspotFile } from "./engines/hotspots.js";
|
|
|
7
7
|
export { disabledOf, type Feature, FEATURES, parseFeatures } from "./features.js";
|
|
8
8
|
export { estimateTokens } from "./render/budget.js";
|
|
9
9
|
export { isIqDenied, IQ_DIR } from "./workspace/floor.js";
|
|
10
|
+
export { globToRegExp } from "./workspace/glob.js";
|
|
10
11
|
export { canonicalLang } from "./workspace/scan.js";
|
|
11
12
|
export interface EngineOptions {
|
|
12
13
|
readonly root: string;
|
|
@@ -23,12 +24,28 @@ export interface Engine {
|
|
|
23
24
|
}
|
|
24
25
|
export interface ResidentEngineOptions extends EngineOptions {
|
|
25
26
|
readonly onIndexError?: (error: Error) => void;
|
|
27
|
+
readonly onQueryError?: (error: Error) => void;
|
|
28
|
+
readonly onIndexProgress?: (remaining: number) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface ResidentEngineMetrics {
|
|
31
|
+
readonly files: number;
|
|
32
|
+
readonly generation: number;
|
|
33
|
+
readonly dirtySequence: number;
|
|
34
|
+
readonly appliedSequence: number;
|
|
35
|
+
readonly revalidated: boolean;
|
|
36
|
+
readonly sweepAgeMs: number | undefined;
|
|
37
|
+
readonly embedBacklog: number;
|
|
38
|
+
readonly queryWorker: {
|
|
39
|
+
readonly live: boolean;
|
|
40
|
+
readonly pendingRequests: number;
|
|
41
|
+
};
|
|
26
42
|
}
|
|
27
43
|
export interface ResidentEngine {
|
|
28
44
|
run(request: QueryRequest, signal?: AbortSignal): Promise<QueryOutcome>;
|
|
29
45
|
health(request: HealthRequest): Promise<CodebaseHealth>;
|
|
30
46
|
markDirty(): void;
|
|
31
47
|
warm(): Promise<IndexStatus>;
|
|
48
|
+
metrics(): ResidentEngineMetrics;
|
|
32
49
|
close(): Promise<void>;
|
|
33
50
|
}
|
|
34
51
|
export declare const createEngine: (options: EngineOptions) => Engine;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { rmSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { Worker } from "node:worker_threads";
|
|
4
|
-
import { loadEmbedder } from "./embed/embedder.js";
|
|
4
|
+
import { loadEmbedder, MODEL_ID } from "./embed/embedder.js";
|
|
5
5
|
import { loadReranker } from "./embed/reranker.js";
|
|
6
|
+
import { openVectorCache, vectorCachePath } from "./embed/vector-cache.js";
|
|
6
7
|
import { codebaseHealth } from "./engines/health.js";
|
|
7
8
|
import { embedPending } from "./engines/semantic.js";
|
|
8
9
|
import { indexLag, revalidate, syncModel } from "./indexer/indexer.js";
|
|
9
10
|
import { parseEntry } from "./indexer/parse-entry.js";
|
|
10
|
-
import {
|
|
11
|
+
import { inThreadScorer } from "./query/scorer.js";
|
|
12
|
+
import { workerScorer } from "./query/worker-scorer.js";
|
|
13
|
+
import { compactIndex, isIndexBusy, openIndex } from "./store/db.js";
|
|
11
14
|
import { generationOf, readIndexStatus } from "./store/index-store.js";
|
|
12
15
|
import { claimIndexer, indexerAlive, releaseIndexer } from "./store/indexer-lock.js";
|
|
13
16
|
import { FEATURES } from "./features.js";
|
|
@@ -17,6 +20,7 @@ import { sweep } from "./workspace/scan.js";
|
|
|
17
20
|
export { disabledOf, FEATURES, parseFeatures } from "./features.js";
|
|
18
21
|
export { estimateTokens } from "./render/budget.js";
|
|
19
22
|
export { isIqDenied, IQ_DIR } from "./workspace/floor.js";
|
|
23
|
+
export { globToRegExp } from "./workspace/glob.js";
|
|
20
24
|
export { canonicalLang } from "./workspace/scan.js";
|
|
21
25
|
const freshnessOf = (db, entries, sweepStart, wrote) => {
|
|
22
26
|
const ageMs = Date.now() - sweepStart;
|
|
@@ -32,6 +36,15 @@ export const createEngine = (options) => {
|
|
|
32
36
|
const getEmbedder = () => (embedderPromise ??= loadEmbedder(options.modelDir));
|
|
33
37
|
let rerankerPromise;
|
|
34
38
|
const getReranker = () => (rerankerPromise ??= loadReranker(options.modelDir));
|
|
39
|
+
let cacheOpened = false;
|
|
40
|
+
let cacheHandle;
|
|
41
|
+
const getCache = () => {
|
|
42
|
+
if (!cacheOpened) {
|
|
43
|
+
cacheOpened = true;
|
|
44
|
+
cacheHandle = openVectorCache(vectorCachePath(indexDir), MODEL_ID);
|
|
45
|
+
}
|
|
46
|
+
return cacheHandle;
|
|
47
|
+
};
|
|
35
48
|
const opened = async () => {
|
|
36
49
|
const sweepStart = Date.now();
|
|
37
50
|
const entries = await sweep(options.root, false);
|
|
@@ -44,6 +57,7 @@ export const createEngine = (options) => {
|
|
|
44
57
|
db = openIndex(indexDir, "write");
|
|
45
58
|
const { generation } = await revalidate(db, entries, parseEntry);
|
|
46
59
|
syncModel(db, options.modelDir);
|
|
60
|
+
compactIndex(db);
|
|
47
61
|
return { db, generation, sweepStart, entries, indexed: true };
|
|
48
62
|
}
|
|
49
63
|
catch (error) {
|
|
@@ -65,10 +79,14 @@ export const createEngine = (options) => {
|
|
|
65
79
|
db,
|
|
66
80
|
generation,
|
|
67
81
|
freshness: freshnessOf(db, entries, sweepStart, indexed),
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
82
|
+
scorer: inThreadScorer({
|
|
83
|
+
db,
|
|
84
|
+
embedder: getEmbedder,
|
|
85
|
+
reranker: getReranker,
|
|
86
|
+
cache: getCache,
|
|
87
|
+
topUpEmbeddings: indexed,
|
|
88
|
+
}),
|
|
89
|
+
features: request.features ?? options.features ?? new Set(FEATURES),
|
|
72
90
|
...(options.rgPath !== undefined ? { rgPath: options.rgPath } : {}),
|
|
73
91
|
}, request, entries);
|
|
74
92
|
}
|
|
@@ -96,7 +114,7 @@ export const createEngine = (options) => {
|
|
|
96
114
|
onProgress?.(`indexed ${entries.length} files`);
|
|
97
115
|
const embedder = await getEmbedder();
|
|
98
116
|
if (embedder !== undefined) {
|
|
99
|
-
const remaining = await embedPending(db, embedder, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
|
|
117
|
+
const remaining = await embedPending(db, embedder, getCache(), Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
|
|
100
118
|
onProgress?.(remaining === 0 ? "embeddings complete" : `embeddings incomplete: ${remaining} chunks pending`);
|
|
101
119
|
}
|
|
102
120
|
return readIndexStatus(db, generation);
|
|
@@ -115,16 +133,18 @@ export const createResidentEngine = (options) => {
|
|
|
115
133
|
const indexDir = options.indexDir ?? join(options.root, IQ_DIR);
|
|
116
134
|
const db = openIndex(indexDir, "write");
|
|
117
135
|
claimIndexer(indexDir);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
136
|
+
const scorer = workerScorer({
|
|
137
|
+
indexDir,
|
|
138
|
+
modelDir: options.modelDir,
|
|
139
|
+
...(options.onQueryError !== undefined ? { onError: options.onQueryError } : {}),
|
|
140
|
+
});
|
|
122
141
|
let entries = [];
|
|
123
142
|
let sweepStart = 0;
|
|
124
143
|
let generation = 0;
|
|
125
144
|
let revalidatedOnce = false;
|
|
126
145
|
let dirtySeq = 0;
|
|
127
146
|
let appliedSeq = 0;
|
|
147
|
+
let embedBacklog = 0;
|
|
128
148
|
let publishFirstSweep;
|
|
129
149
|
let failFirstSweep;
|
|
130
150
|
const firstSweep = new Promise((resolve, reject) => {
|
|
@@ -164,6 +184,11 @@ export const createResidentEngine = (options) => {
|
|
|
164
184
|
revalidatedOnce = true;
|
|
165
185
|
return;
|
|
166
186
|
}
|
|
187
|
+
if (event.type === "embedding") {
|
|
188
|
+
embedBacklog = event.remaining;
|
|
189
|
+
options.onIndexProgress?.(event.remaining);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
167
192
|
if (event.type === "warmed") {
|
|
168
193
|
warmSettled = true;
|
|
169
194
|
publishWarm(event.status);
|
|
@@ -183,6 +208,16 @@ export const createResidentEngine = (options) => {
|
|
|
183
208
|
return { state: "fresh", ageMs };
|
|
184
209
|
};
|
|
185
210
|
const engine = {
|
|
211
|
+
metrics: () => ({
|
|
212
|
+
files: entries.length,
|
|
213
|
+
generation,
|
|
214
|
+
dirtySequence: dirtySeq,
|
|
215
|
+
appliedSequence: appliedSeq,
|
|
216
|
+
revalidated: revalidatedOnce,
|
|
217
|
+
sweepAgeMs: sweepStart === 0 ? undefined : Date.now() - sweepStart,
|
|
218
|
+
embedBacklog,
|
|
219
|
+
queryWorker: scorer.metrics(),
|
|
220
|
+
}),
|
|
186
221
|
async run(request, signal) {
|
|
187
222
|
await firstSweep;
|
|
188
223
|
return dispatch({
|
|
@@ -191,10 +226,8 @@ export const createResidentEngine = (options) => {
|
|
|
191
226
|
db,
|
|
192
227
|
generation,
|
|
193
228
|
freshness: freshness(),
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
topUpEmbeddings: false,
|
|
197
|
-
features: options.features ?? new Set(FEATURES),
|
|
229
|
+
scorer,
|
|
230
|
+
features: request.features ?? options.features ?? new Set(FEATURES),
|
|
198
231
|
...(options.rgPath !== undefined ? { rgPath: options.rgPath } : {}),
|
|
199
232
|
...(signal !== undefined ? { signal } : {}),
|
|
200
233
|
}, request, entries);
|
|
@@ -209,7 +242,7 @@ export const createResidentEngine = (options) => {
|
|
|
209
242
|
},
|
|
210
243
|
warm: () => warmed,
|
|
211
244
|
async close() {
|
|
212
|
-
await worker.terminate();
|
|
245
|
+
await Promise.all([worker.terminate(), scorer.close()]);
|
|
213
246
|
db.close();
|
|
214
247
|
releaseIndexer(indexDir);
|
|
215
248
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAiB,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ export type IndexWorkerEvent = {
|
|
|
16
16
|
readonly type: "indexed";
|
|
17
17
|
readonly generation: number;
|
|
18
18
|
readonly seq: number;
|
|
19
|
+
} | {
|
|
20
|
+
readonly type: "embedding";
|
|
21
|
+
readonly remaining: number;
|
|
19
22
|
} | {
|
|
20
23
|
readonly type: "warmed";
|
|
21
24
|
readonly status: IndexStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-worker.d.ts","sourceRoot":"","sources":["../../src/indexer/index-worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index-worker.d.ts","sourceRoot":"","sources":["../../src/indexer/index-worker.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA0B1D,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAID,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACxB;AAKD,MAAM,MAAM,gBAAgB,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAG/E;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC"}
|