@intentic/iq-engine 1.159.0 → 1.160.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 +14 -4
- package/dist/engines/git.d.ts +11 -0
- package/dist/engines/git.d.ts.map +1 -1
- package/dist/engines/git.js +28 -11
- package/dist/engines/git.js.map +1 -1
- package/dist/engines/health.d.ts +32 -0
- package/dist/engines/health.d.ts.map +1 -0
- package/dist/engines/health.js +29 -0
- package/dist/engines/health.js.map +1 -0
- package/dist/engines/hotspots.d.ts +18 -0
- package/dist/engines/hotspots.d.ts.map +1 -0
- package/dist/engines/hotspots.js +31 -0
- package/dist/engines/hotspots.js.map +1 -0
- package/dist/engines/lexical.d.ts.map +1 -1
- package/dist/engines/lexical.js +4 -4
- package/dist/engines/lexical.js.map +1 -1
- package/dist/engines/map.d.ts +4 -0
- package/dist/engines/map.d.ts.map +1 -0
- package/dist/engines/map.js +161 -0
- package/dist/engines/map.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +105 -85
- package/dist/index.js.map +1 -1
- package/dist/indexer/complexity.d.ts +2 -0
- package/dist/indexer/complexity.d.ts.map +1 -0
- package/dist/indexer/complexity.js +49 -0
- package/dist/indexer/complexity.js.map +1 -0
- package/dist/indexer/imports.d.ts +2 -0
- package/dist/indexer/imports.d.ts.map +1 -0
- package/dist/indexer/imports.js +31 -0
- package/dist/indexer/imports.js.map +1 -0
- package/dist/indexer/index-worker.d.ts +26 -0
- package/dist/indexer/index-worker.d.ts.map +1 -0
- package/dist/indexer/index-worker.js +66 -0
- package/dist/indexer/index-worker.js.map +1 -0
- package/dist/indexer/indexer.d.ts +4 -0
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/indexer.js +34 -6
- package/dist/indexer/indexer.js.map +1 -1
- package/dist/indexer/languages.d.ts +1 -0
- package/dist/indexer/languages.d.ts.map +1 -1
- package/dist/indexer/languages.js +1 -0
- package/dist/indexer/languages.js.map +1 -1
- package/dist/indexer/parse-entry.d.ts +3 -0
- package/dist/indexer/parse-entry.d.ts.map +1 -0
- package/dist/indexer/parse-entry.js +14 -0
- package/dist/indexer/parse-entry.js.map +1 -0
- package/dist/indexer/sfc.d.ts +7 -0
- package/dist/indexer/sfc.d.ts.map +1 -0
- package/dist/indexer/sfc.js +19 -0
- package/dist/indexer/sfc.js.map +1 -0
- package/dist/indexer/symbols.d.ts.map +1 -1
- package/dist/indexer/symbols.js +14 -2
- package/dist/indexer/symbols.js.map +1 -1
- package/dist/plan/fuse.d.ts.map +1 -1
- package/dist/plan/fuse.js +1 -1
- package/dist/plan/fuse.js.map +1 -1
- package/dist/store/db.d.ts +3 -1
- package/dist/store/db.d.ts.map +1 -1
- package/dist/store/db.js +45 -27
- package/dist/store/db.js.map +1 -1
- package/dist/store/index-store.d.ts +4 -2
- package/dist/store/index-store.d.ts.map +1 -1
- package/dist/store/index-store.js +16 -2
- package/dist/store/index-store.js.map +1 -1
- package/dist/store/indexer-lock.d.ts +4 -0
- package/dist/store/indexer-lock.d.ts.map +1 -0
- package/dist/store/indexer-lock.js +30 -0
- package/dist/store/indexer-lock.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/verbs/dispatch.d.ts +1 -0
- package/dist/verbs/dispatch.d.ts.map +1 -1
- package/dist/verbs/dispatch.js +65 -10
- package/dist/verbs/dispatch.js.map +1 -1
- package/dist/workspace/floor.d.ts +1 -0
- package/dist/workspace/floor.d.ts.map +1 -1
- package/dist/workspace/floor.js +3 -1
- package/dist/workspace/floor.js.map +1 -1
- package/dist/workspace/scan.d.ts.map +1 -1
- package/dist/workspace/scan.js +10 -9
- package/dist/workspace/scan.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { rmSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { Worker } from "node:worker_threads";
|
|
4
|
+
import { loadEmbedder } from "./embed/embedder.js";
|
|
4
5
|
import { loadReranker } from "./embed/reranker.js";
|
|
6
|
+
import { codebaseHealth } from "./engines/health.js";
|
|
5
7
|
import { embedPending } from "./engines/semantic.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
8
|
+
import { indexLag, revalidate, syncModel } from "./indexer/indexer.js";
|
|
9
|
+
import { parseEntry } from "./indexer/parse-entry.js";
|
|
10
|
+
import { isIndexBusy, openIndex } from "./store/db.js";
|
|
11
|
+
import { generationOf, readIndexStatus } from "./store/index-store.js";
|
|
12
|
+
import { claimIndexer, indexerAlive, releaseIndexer } from "./store/indexer-lock.js";
|
|
11
13
|
import { FEATURES } from "./features.js";
|
|
12
14
|
import { dispatch } from "./verbs/dispatch.js";
|
|
13
15
|
import { IQ_DIR } from "./workspace/floor.js";
|
|
@@ -16,29 +18,13 @@ export { disabledOf, FEATURES, parseFeatures } from "./features.js";
|
|
|
16
18
|
export { estimateTokens } from "./render/budget.js";
|
|
17
19
|
export { isIqDenied, IQ_DIR } from "./workspace/floor.js";
|
|
18
20
|
export { canonicalLang } from "./workspace/scan.js";
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
};
|
|
23
|
-
const syncModel = (db, modelDir) => {
|
|
24
|
-
if (modelDir === undefined) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
if (getMeta(db, "model_id") !== MODEL_ID) {
|
|
28
|
-
db.run("UPDATE chunks SET embedding = NULL");
|
|
29
|
-
setMeta(db, "model_id", MODEL_ID);
|
|
21
|
+
const freshnessOf = (db, entries, sweepStart, wrote) => {
|
|
22
|
+
const ageMs = Date.now() - sweepStart;
|
|
23
|
+
if (wrote) {
|
|
24
|
+
return { state: "fresh", ageMs };
|
|
30
25
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const count = (sql) => Number(db.get(sql)?.["n"] ?? 0);
|
|
34
|
-
return {
|
|
35
|
-
files: count("SELECT COUNT(*) AS n FROM files"),
|
|
36
|
-
symbols: count("SELECT COUNT(*) AS n FROM symbols"),
|
|
37
|
-
chunks: count("SELECT COUNT(*) AS n FROM chunks"),
|
|
38
|
-
embedded: count("SELECT COUNT(*) AS n FROM chunks WHERE embedding IS NOT NULL"),
|
|
39
|
-
generation,
|
|
40
|
-
freshness: { state: "fresh", ageMs: 0 },
|
|
41
|
-
};
|
|
26
|
+
const lag = indexLag(db, entries);
|
|
27
|
+
return lag === 0 ? { state: "fresh", ageMs } : { state: "stale", ageMs, progress: 1 - lag / Math.max(entries.length, 1) };
|
|
42
28
|
};
|
|
43
29
|
export const createEngine = (options) => {
|
|
44
30
|
const indexDir = options.indexDir ?? join(options.root, IQ_DIR);
|
|
@@ -46,26 +32,42 @@ export const createEngine = (options) => {
|
|
|
46
32
|
const getEmbedder = () => (embedderPromise ??= loadEmbedder(options.modelDir));
|
|
47
33
|
let rerankerPromise;
|
|
48
34
|
const getReranker = () => (rerankerPromise ??= loadReranker(options.modelDir));
|
|
49
|
-
const
|
|
35
|
+
const opened = async () => {
|
|
50
36
|
const sweepStart = Date.now();
|
|
51
37
|
const entries = await sweep(options.root, false);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
38
|
+
if (indexerAlive(indexDir)) {
|
|
39
|
+
const db = openIndex(indexDir, "read");
|
|
40
|
+
return { db, generation: generationOf(db), sweepStart, entries, indexed: false };
|
|
41
|
+
}
|
|
42
|
+
let db;
|
|
43
|
+
try {
|
|
44
|
+
db = openIndex(indexDir, "write");
|
|
45
|
+
const { generation } = await revalidate(db, entries, parseEntry);
|
|
46
|
+
syncModel(db, options.modelDir);
|
|
47
|
+
return { db, generation, sweepStart, entries, indexed: true };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (!isIndexBusy(error)) {
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
db?.close();
|
|
54
|
+
const reader = openIndex(indexDir, "read");
|
|
55
|
+
return { db: reader, generation: generationOf(reader), sweepStart, entries, indexed: false };
|
|
56
|
+
}
|
|
56
57
|
};
|
|
57
58
|
return {
|
|
58
59
|
async run(request) {
|
|
59
|
-
const { db, generation, sweepStart, entries } = await
|
|
60
|
+
const { db, generation, sweepStart, entries, indexed } = await opened();
|
|
60
61
|
try {
|
|
61
62
|
return await dispatch({
|
|
62
63
|
root: options.root,
|
|
63
64
|
indexDir,
|
|
64
65
|
db,
|
|
65
66
|
generation,
|
|
66
|
-
freshness:
|
|
67
|
+
freshness: freshnessOf(db, entries, sweepStart, indexed),
|
|
67
68
|
getEmbedder,
|
|
68
69
|
getReranker,
|
|
70
|
+
topUpEmbeddings: indexed,
|
|
69
71
|
features: options.features ?? new Set(FEATURES),
|
|
70
72
|
...(options.rgPath !== undefined ? { rgPath: options.rgPath } : {}),
|
|
71
73
|
}, request, entries);
|
|
@@ -75,18 +77,21 @@ export const createEngine = (options) => {
|
|
|
75
77
|
}
|
|
76
78
|
},
|
|
77
79
|
async indexStatus() {
|
|
78
|
-
const { db, generation } = await
|
|
80
|
+
const { db, generation } = await opened();
|
|
79
81
|
try {
|
|
80
|
-
return
|
|
82
|
+
return readIndexStatus(db, generation);
|
|
81
83
|
}
|
|
82
84
|
finally {
|
|
83
85
|
db.close();
|
|
84
86
|
}
|
|
85
87
|
},
|
|
86
88
|
async indexRebuild(onProgress) {
|
|
89
|
+
if (indexerAlive(indexDir)) {
|
|
90
|
+
throw new Error("another process owns this index (the sandbox daemon keeps it current) — it cannot be rebuilt from here");
|
|
91
|
+
}
|
|
87
92
|
this.indexDrop();
|
|
88
93
|
onProgress?.("rebuilding index from scratch");
|
|
89
|
-
const { db, generation, entries } = await
|
|
94
|
+
const { db, generation, entries } = await opened();
|
|
90
95
|
try {
|
|
91
96
|
onProgress?.(`indexed ${entries.length} files`);
|
|
92
97
|
const embedder = await getEmbedder();
|
|
@@ -94,7 +99,7 @@ export const createEngine = (options) => {
|
|
|
94
99
|
const remaining = await embedPending(db, embedder, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
|
|
95
100
|
onProgress?.(remaining === 0 ? "embeddings complete" : `embeddings incomplete: ${remaining} chunks pending`);
|
|
96
101
|
}
|
|
97
|
-
return
|
|
102
|
+
return readIndexStatus(db, generation);
|
|
98
103
|
}
|
|
99
104
|
finally {
|
|
100
105
|
db.close();
|
|
@@ -105,11 +110,11 @@ export const createEngine = (options) => {
|
|
|
105
110
|
},
|
|
106
111
|
};
|
|
107
112
|
};
|
|
108
|
-
const
|
|
113
|
+
const WORKER_URL = new URL("../dist/indexer/index-worker.js", import.meta.url);
|
|
109
114
|
export const createResidentEngine = (options) => {
|
|
110
115
|
const indexDir = options.indexDir ?? join(options.root, IQ_DIR);
|
|
111
|
-
const db = openIndex(indexDir);
|
|
112
|
-
|
|
116
|
+
const db = openIndex(indexDir, "write");
|
|
117
|
+
claimIndexer(indexDir);
|
|
113
118
|
let embedderPromise;
|
|
114
119
|
const getEmbedder = () => (embedderPromise ??= loadEmbedder(options.modelDir));
|
|
115
120
|
let rerankerPromise;
|
|
@@ -118,44 +123,67 @@ export const createResidentEngine = (options) => {
|
|
|
118
123
|
let sweepStart = 0;
|
|
119
124
|
let generation = 0;
|
|
120
125
|
let revalidatedOnce = false;
|
|
121
|
-
let
|
|
122
|
-
let
|
|
123
|
-
let timer;
|
|
126
|
+
let dirtySeq = 0;
|
|
127
|
+
let appliedSeq = 0;
|
|
124
128
|
let publishFirstSweep;
|
|
125
|
-
|
|
129
|
+
let failFirstSweep;
|
|
130
|
+
const firstSweep = new Promise((resolve, reject) => {
|
|
126
131
|
publishFirstSweep = resolve;
|
|
132
|
+
failFirstSweep = reject;
|
|
127
133
|
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
let publishWarm;
|
|
135
|
+
let failWarm;
|
|
136
|
+
const warmed = new Promise((resolve, reject) => {
|
|
137
|
+
publishWarm = resolve;
|
|
138
|
+
failWarm = reject;
|
|
139
|
+
});
|
|
140
|
+
void firstSweep.catch(() => undefined);
|
|
141
|
+
void warmed.catch(() => undefined);
|
|
142
|
+
const worker = new Worker(WORKER_URL, {
|
|
143
|
+
workerData: { root: options.root, indexDir, modelDir: options.modelDir },
|
|
144
|
+
});
|
|
145
|
+
let warmSettled = false;
|
|
146
|
+
const fail = (error) => {
|
|
147
|
+
if (warmSettled) {
|
|
148
|
+
options.onIndexError?.(error);
|
|
149
|
+
}
|
|
150
|
+
warmSettled = true;
|
|
151
|
+
failFirstSweep(error);
|
|
152
|
+
failWarm(error);
|
|
153
|
+
};
|
|
154
|
+
worker.on("message", (event) => {
|
|
155
|
+
if (event.type === "swept") {
|
|
156
|
+
entries = event.entries;
|
|
157
|
+
sweepStart = event.sweepStart;
|
|
158
|
+
publishFirstSweep();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (event.type === "indexed") {
|
|
162
|
+
generation = event.generation;
|
|
163
|
+
appliedSeq = event.seq;
|
|
164
|
+
revalidatedOnce = true;
|
|
165
|
+
return;
|
|
139
166
|
}
|
|
140
|
-
|
|
141
|
-
|
|
167
|
+
if (event.type === "warmed") {
|
|
168
|
+
warmSettled = true;
|
|
169
|
+
publishWarm(event.status);
|
|
170
|
+
return;
|
|
142
171
|
}
|
|
143
|
-
|
|
172
|
+
fail(event.error);
|
|
173
|
+
});
|
|
174
|
+
worker.on("error", fail);
|
|
144
175
|
const freshness = () => {
|
|
145
176
|
const ageMs = Date.now() - sweepStart;
|
|
146
177
|
if (!revalidatedOnce) {
|
|
147
178
|
return { state: "building", ageMs };
|
|
148
179
|
}
|
|
149
|
-
if (
|
|
180
|
+
if (appliedSeq < dirtySeq) {
|
|
150
181
|
return { state: "stale", ageMs };
|
|
151
182
|
}
|
|
152
183
|
return { state: "fresh", ageMs };
|
|
153
184
|
};
|
|
154
|
-
|
|
185
|
+
const engine = {
|
|
155
186
|
async run(request, signal) {
|
|
156
|
-
if (dirty && refreshing === undefined) {
|
|
157
|
-
void refresh();
|
|
158
|
-
}
|
|
159
187
|
await firstSweep;
|
|
160
188
|
return dispatch({
|
|
161
189
|
root: options.root,
|
|
@@ -165,36 +193,28 @@ export const createResidentEngine = (options) => {
|
|
|
165
193
|
freshness: freshness(),
|
|
166
194
|
getEmbedder,
|
|
167
195
|
getReranker,
|
|
196
|
+
topUpEmbeddings: false,
|
|
168
197
|
features: options.features ?? new Set(FEATURES),
|
|
169
198
|
...(options.rgPath !== undefined ? { rgPath: options.rgPath } : {}),
|
|
170
199
|
...(signal !== undefined ? { signal } : {}),
|
|
171
200
|
}, request, entries);
|
|
172
201
|
},
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
timer ??= setTimeout(() => {
|
|
179
|
-
timer = undefined;
|
|
180
|
-
if (dirty) {
|
|
181
|
-
void refresh();
|
|
182
|
-
}
|
|
183
|
-
}, REFRESH_DEBOUNCE_MS);
|
|
202
|
+
async health(request) {
|
|
203
|
+
await firstSweep;
|
|
204
|
+
return codebaseHealth({ db, root: options.root, freshness: freshness() }, request, entries);
|
|
184
205
|
},
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (embedder !== undefined) {
|
|
189
|
-
await embedPending(db, embedder, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
|
|
190
|
-
}
|
|
191
|
-
return status(db, generation);
|
|
206
|
+
markDirty() {
|
|
207
|
+
dirtySeq += 1;
|
|
208
|
+
worker.postMessage({ type: "dirty", seq: dirtySeq });
|
|
192
209
|
},
|
|
210
|
+
warm: () => warmed,
|
|
193
211
|
async close() {
|
|
194
|
-
|
|
195
|
-
await refreshing;
|
|
212
|
+
await worker.terminate();
|
|
196
213
|
db.close();
|
|
214
|
+
releaseIndexer(indexDir);
|
|
197
215
|
},
|
|
198
216
|
};
|
|
217
|
+
engine.markDirty();
|
|
218
|
+
return engine;
|
|
199
219
|
};
|
|
200
220
|
//# sourceMappingURL=index.js.map
|
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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.d.ts","sourceRoot":"","sources":["../../src/indexer/complexity.ts"],"names":[],"mappings":"AAoEA,eAAO,MAAM,cAAc,SAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,WAAW,MAAM,KAAG,MAWxF,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { NON_CODE, parseLang } from "./languages.js";
|
|
2
|
+
import { scriptBlocksOf } from "./sfc.js";
|
|
3
|
+
const BRANCH_KINDS = new Set([
|
|
4
|
+
"if_statement",
|
|
5
|
+
"if_expression",
|
|
6
|
+
"elif_clause",
|
|
7
|
+
"conditional_expression",
|
|
8
|
+
"ternary_expression",
|
|
9
|
+
"for_statement",
|
|
10
|
+
"for_in_statement",
|
|
11
|
+
"enhanced_for_statement",
|
|
12
|
+
"for_expression",
|
|
13
|
+
"while_statement",
|
|
14
|
+
"while_expression",
|
|
15
|
+
"do_statement",
|
|
16
|
+
"loop_expression",
|
|
17
|
+
"switch_case",
|
|
18
|
+
"switch_label",
|
|
19
|
+
"expression_case",
|
|
20
|
+
"type_case",
|
|
21
|
+
"case_clause",
|
|
22
|
+
"match_arm",
|
|
23
|
+
"catch_clause",
|
|
24
|
+
"except_clause",
|
|
25
|
+
]);
|
|
26
|
+
const LOGICAL_OPERATORS = new Set(["&&", "||", "??", "and", "or"]);
|
|
27
|
+
const walk = (node) => {
|
|
28
|
+
let count = BRANCH_KINDS.has(node.kind()) ? 1 : 0;
|
|
29
|
+
if (LOGICAL_OPERATORS.has(node.field("operator")?.text() ?? "")) {
|
|
30
|
+
count++;
|
|
31
|
+
}
|
|
32
|
+
for (const child of node.children()) {
|
|
33
|
+
count += walk(child);
|
|
34
|
+
}
|
|
35
|
+
return count;
|
|
36
|
+
};
|
|
37
|
+
const LEXICAL_BRANCHES = /\b(?:if|elif|for|while|case|when|catch|except|rescue)\b|&&|\|\||\?\?/g;
|
|
38
|
+
const lexicalComplexity = (content) => content.match(LEXICAL_BRANCHES)?.length ?? 0;
|
|
39
|
+
export const fileComplexity = (path, lang, content) => {
|
|
40
|
+
if (NON_CODE.test(path)) {
|
|
41
|
+
return 0;
|
|
42
|
+
}
|
|
43
|
+
if (lang === "vue") {
|
|
44
|
+
return scriptBlocksOf(content).reduce((total, block) => total + fileComplexity(path, block.lang, block.content), 0);
|
|
45
|
+
}
|
|
46
|
+
const root = lang === undefined ? undefined : parseLang(lang, content)?.root();
|
|
47
|
+
return root === undefined ? lexicalComplexity(content) : walk(root);
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=complexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complexity.js","sourceRoot":"","sources":["../../src/indexer/complexity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAc1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAEzB,cAAc;IACd,eAAe;IACf,aAAa;IACb,wBAAwB;IACxB,oBAAoB;IAEpB,eAAe;IACf,kBAAkB;IAClB,wBAAwB;IACxB,gBAAgB;IAChB,iBAAiB;IACjB,kBAAkB;IAClB,cAAc;IACd,iBAAiB;IAIjB,aAAa;IACb,cAAc;IACd,iBAAiB;IACjB,WAAW;IACX,aAAa;IACb,WAAW;IAEX,cAAc;IACd,eAAe;CAClB,CAAC,CAAC;AAIH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE;IAElC,IAAI,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,KAAK,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAIF,MAAM,gBAAgB,GAAG,uEAAuE,CAAC;AAEjG,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAEpG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,IAAwB,EAAE,OAAe,EAAU,EAAE;IAC9F,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACb,CAAC;IAGD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACxH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IAC/E,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/indexer/imports.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,cAAc,SAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,WAAW,MAAM,KAAG,MAAM,EAkB9F,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { NON_CODE } from "./languages.js";
|
|
2
|
+
import { scriptBlocksOf } from "./sfc.js";
|
|
3
|
+
const PATTERNS = [
|
|
4
|
+
/\b(?:import|export)\b[^;\n]*?\bfrom\s*["']([^"'\n]+)["']/g,
|
|
5
|
+
/\bimport\s*["']([^"'\n]+)["']/g,
|
|
6
|
+
/\b(?:require|import)\s*\(\s*["']([^"'\n]+)["']\s*\)/g,
|
|
7
|
+
/^\s*from\s+([\w.]+)\s+import\b/gm,
|
|
8
|
+
/^\s*import\s+([\w.]+)\s*$/gm,
|
|
9
|
+
/^\s*use\s+([\w:]+)/gm,
|
|
10
|
+
/^\s*import\s+([\w.]+);/gm,
|
|
11
|
+
];
|
|
12
|
+
export const extractImports = (path, lang, content) => {
|
|
13
|
+
if (NON_CODE.test(path)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
if (lang === "vue") {
|
|
17
|
+
return scriptBlocksOf(content).flatMap((block) => extractImports(path, block.lang, block.content));
|
|
18
|
+
}
|
|
19
|
+
const specifiers = new Set();
|
|
20
|
+
for (const pattern of PATTERNS) {
|
|
21
|
+
pattern.lastIndex = 0;
|
|
22
|
+
for (let match = pattern.exec(content); match !== null; match = pattern.exec(content)) {
|
|
23
|
+
const specifier = match[1].trim();
|
|
24
|
+
if (specifier !== "") {
|
|
25
|
+
specifiers.add(specifier);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [...specifiers];
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/indexer/imports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAW1C,MAAM,QAAQ,GAAsB;IAEhC,2DAA2D;IAE3D,gCAAgC;IAEhC,sDAAsD;IAEtD,kCAAkC;IAClC,6BAA6B;IAE7B,sBAAsB;IACtB,0BAA0B;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,IAAwB,EAAE,OAAe,EAAY,EAAE;IAChG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACpF,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;gBACnB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { FileEntry, IndexStatus } from "../types.js";
|
|
2
|
+
export interface IndexWorkerData {
|
|
3
|
+
readonly root: string;
|
|
4
|
+
readonly indexDir: string;
|
|
5
|
+
readonly modelDir: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export interface IndexWorkerRequest {
|
|
8
|
+
readonly type: "dirty";
|
|
9
|
+
readonly seq: number;
|
|
10
|
+
}
|
|
11
|
+
export type IndexWorkerEvent = {
|
|
12
|
+
readonly type: "swept";
|
|
13
|
+
readonly entries: FileEntry[];
|
|
14
|
+
readonly sweepStart: number;
|
|
15
|
+
} | {
|
|
16
|
+
readonly type: "indexed";
|
|
17
|
+
readonly generation: number;
|
|
18
|
+
readonly seq: number;
|
|
19
|
+
} | {
|
|
20
|
+
readonly type: "warmed";
|
|
21
|
+
readonly status: IndexStatus;
|
|
22
|
+
} | {
|
|
23
|
+
readonly type: "failed";
|
|
24
|
+
readonly error: Error;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=index-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-worker.d.ts","sourceRoot":"","sources":["../../src/indexer/index-worker.ts"],"names":[],"mappings":"AAMA,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,GAC/E;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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
2
|
+
import { loadEmbedder } from "../embed/embedder.js";
|
|
3
|
+
import { embedPending } from "../engines/semantic.js";
|
|
4
|
+
import { openIndex } from "../store/db.js";
|
|
5
|
+
import { readIndexStatus } from "../store/index-store.js";
|
|
6
|
+
import { sweep } from "../workspace/scan.js";
|
|
7
|
+
import { revalidate, syncModel } from "./indexer.js";
|
|
8
|
+
import { parseEntry } from "./parse-entry.js";
|
|
9
|
+
const port = parentPort;
|
|
10
|
+
if (port === null) {
|
|
11
|
+
throw new Error("iq index worker: not started as a worker thread");
|
|
12
|
+
}
|
|
13
|
+
const { root, indexDir, modelDir } = workerData;
|
|
14
|
+
const post = (event) => {
|
|
15
|
+
port.postMessage(event);
|
|
16
|
+
};
|
|
17
|
+
const db = openIndex(indexDir, "write");
|
|
18
|
+
syncModel(db, modelDir);
|
|
19
|
+
let embedderPromise;
|
|
20
|
+
const getEmbedder = () => (embedderPromise ??= loadEmbedder(modelDir));
|
|
21
|
+
let requested = 0;
|
|
22
|
+
let applied = 0;
|
|
23
|
+
let draining = false;
|
|
24
|
+
let warmed = false;
|
|
25
|
+
const pass = async (target) => {
|
|
26
|
+
const sweepStart = Date.now();
|
|
27
|
+
const entries = await sweep(root, false);
|
|
28
|
+
post({ type: "swept", entries, sweepStart });
|
|
29
|
+
const { generation } = await revalidate(db, entries, parseEntry);
|
|
30
|
+
applied = target;
|
|
31
|
+
post({ type: "indexed", generation, seq: applied });
|
|
32
|
+
const embedder = await getEmbedder();
|
|
33
|
+
if (embedder !== undefined) {
|
|
34
|
+
await embedPending(db, embedder, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER);
|
|
35
|
+
}
|
|
36
|
+
if (!warmed) {
|
|
37
|
+
warmed = true;
|
|
38
|
+
post({ type: "warmed", status: readIndexStatus(db, generation) });
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const drain = async () => {
|
|
42
|
+
if (draining) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
draining = true;
|
|
46
|
+
try {
|
|
47
|
+
for (;;) {
|
|
48
|
+
const target = requested;
|
|
49
|
+
if (applied >= target) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await pass(target);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
post({ type: "failed", error: error instanceof Error ? error : new Error(String(error)) });
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
draining = false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
port.on("message", (request) => {
|
|
63
|
+
requested = Math.max(requested, request.seq);
|
|
64
|
+
void drain();
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=index-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-worker.js","sourceRoot":"","sources":["../../src/indexer/index-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,15 @@ import type { ChunkRow, FileEntry, SymbolRow } from "../types.js";
|
|
|
3
3
|
export type ParseFile = (path: string, lang: string | undefined, content: string) => {
|
|
4
4
|
symbols: SymbolRow[];
|
|
5
5
|
chunks: ChunkRow[];
|
|
6
|
+
complexity: number;
|
|
7
|
+
imports: string[];
|
|
6
8
|
};
|
|
7
9
|
export interface RevalidateResult {
|
|
8
10
|
readonly generation: number;
|
|
9
11
|
readonly fileCount: number;
|
|
10
12
|
readonly changed: number;
|
|
11
13
|
}
|
|
14
|
+
export declare const syncModel: (db: IndexDb, modelDir: string | undefined) => void;
|
|
15
|
+
export declare const indexLag: (db: IndexDb, entries: readonly FileEntry[]) => number;
|
|
12
16
|
export declare const revalidate: (db: IndexDb, entries: readonly FileEntry[], parse?: ParseFile) => Promise<RevalidateResult>;
|
|
13
17
|
//# sourceMappingURL=indexer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/indexer/indexer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/indexer/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAY9C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAYlE,MAAM,MAAM,SAAS,GAAG,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,EAAE,MAAM,KACd;IAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAMD,eAAO,MAAM,SAAS,OAAQ,OAAO,YAAY,MAAM,GAAG,SAAS,KAAG,IAQrE,CAAC;AAYF,eAAO,MAAM,QAAQ,OAAQ,OAAO,WAAW,SAAS,SAAS,EAAE,KAAG,MAgBrE,CAAC;AAIF,eAAO,MAAM,UAAU,OAAc,OAAO,WAAW,SAAS,SAAS,EAAE,UAAU,SAAS,KAAG,OAAO,CAAC,gBAAgB,CAqFxH,CAAC"}
|