@fodx/codelens 2.0.0 → 2.0.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/README.md +14 -10
- package/adapters/pi/codelens.extension.ts +4 -1
- package/build/src/index/indexer.js +2 -0
- package/build/src/index/indexer.js.map +1 -1
- package/build/src/index/reindex.js +6 -2
- package/build/src/index/reindex.js.map +1 -1
- package/build/src/index/staleness.js +16 -0
- package/build/src/index/staleness.js.map +1 -0
- package/build/src/tools/explore.js +110 -0
- package/build/src/tools/explore.js.map +1 -0
- package/build/src/tools/impact.js +159 -0
- package/build/src/tools/impact.js.map +1 -0
- package/build/src/tools/map.js +12 -2
- package/build/src/tools/map.js.map +1 -1
- package/build/src/tools/registry.js +48 -3
- package/build/src/tools/registry.js.map +1 -1
- package/build/src/tools/related.js +30 -10
- package/build/src/tools/related.js.map +1 -1
- package/build/src/tools/search.js +20 -3
- package/build/src/tools/search.js.map +1 -1
- package/docs/agent-guide.md +23 -1
- package/docs/routing.md +12 -6
- package/docs/tools.md +17 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,8 +17,8 @@ Cursor, Gemini CLI, opencode, Codex CLI) or directly from the terminal.
|
|
|
17
17
|
leak across branches.
|
|
18
18
|
- **Relations, not just text** — graph edges (imports / tests / callers / …)
|
|
19
19
|
ranked alongside FTS5 + symbol-name matches.
|
|
20
|
-
- **Fresh** — auto-
|
|
21
|
-
reads from disk.
|
|
20
|
+
- **Fresh** — query tools auto-refresh changed files before answering, flag
|
|
21
|
+
budget-limited stale results, and `cl_expand` always reads from disk.
|
|
22
22
|
- **Compact** — returns ranked handles; expand only what you need.
|
|
23
23
|
- **Durable** — saved contexts live in a separate DB and survive index rebuilds.
|
|
24
24
|
- **Self-cleaning** — automatic TTL prunes inactive indexes.
|
|
@@ -149,10 +149,12 @@ node build/src/server.js
|
|
|
149
149
|
|
|
150
150
|
1. In your repo, the agent calls `cl_current` (builds index if missing) or
|
|
151
151
|
`cl_refresh` explicitly.
|
|
152
|
-
2. `
|
|
153
|
-
3. `
|
|
154
|
-
4. `
|
|
155
|
-
5. `
|
|
152
|
+
2. `cl_explore(query: "session validation flow")` → grouped previews + relationship map in one call.
|
|
153
|
+
3. `cl_search(query: "session validation")` → lean ranked handles when you only need locations.
|
|
154
|
+
4. `cl_impact(symbol: "validateSession", path: "src/auth/session.ts")` → callers/callees/affected tests before edits.
|
|
155
|
+
5. `cl_related(path: "src/auth/session.ts", types: ["tests"])` → targeted graph expansion.
|
|
156
|
+
6. `cl_map(path: "src/auth")` → per-file symbol outline for orientation.
|
|
157
|
+
7. `cl_expand(path: "src/auth/session.ts", startLine: 12, endLine: 58)` → exact code.
|
|
156
158
|
|
|
157
159
|
See [`docs/agent-guide.md`](docs/agent-guide.md) for a full walkthrough,
|
|
158
160
|
[`docs/tools.md`](docs/tools.md) for the tool reference, and
|
|
@@ -192,15 +194,17 @@ npm run quality # retrieval-quality fixture (recall@5/MRR/top-1/latency)
|
|
|
192
194
|
|
|
193
195
|
- [How CodeLens works](docs/how-it-works.md) — architecture, index layers, branch isolation, freshness, ranking, TTL, saved contexts, usage.
|
|
194
196
|
- [Usage metrics & how "saved" is calculated](docs/usage-metrics.md) — the formula, assumptions, and limits.
|
|
195
|
-
- [CodeLens vs CodeGraph](docs/vs-codegraph.md) — feature comparison.
|
|
196
197
|
|
|
197
198
|
## Limitations
|
|
198
199
|
|
|
199
|
-
- **No semantic
|
|
200
|
-
FTS5 + symbol-name + graph proximity
|
|
200
|
+
- **No vector/semantic search** — there is no embedding model; ranking fuses
|
|
201
|
+
FTS5 BM25 + symbol-name + graph proximity + path + code/prose + exact-match
|
|
202
|
+
signals. Code identifiers are matched via bounded subtoken expansion
|
|
203
|
+
(e.g. `session` finds `validateSession`); a true semantic/vector layer is
|
|
204
|
+
still out of scope.
|
|
201
205
|
- **Lazy on-demand indexing for very large repos** is future work — `cl_refresh`
|
|
202
206
|
is eager. The recommended pattern for large repos is one `cl_refresh` then
|
|
203
|
-
incremental + the file watcher thereafter (cold index ~
|
|
207
|
+
incremental + the file watcher thereafter (cold index ~3.5s for 2000 files).
|
|
204
208
|
- **Routing hooks are advisory** (soft nudges, not hard blocks) per the no-
|
|
205
209
|
throttling design decision — raw reads remain allowed for editing/verification.
|
|
206
210
|
- **npm package** — published automatically from `v*` git tags via the
|
|
@@ -151,13 +151,15 @@ const ROUTING = `
|
|
|
151
151
|
A local branch-scoped code index is available via these tools:
|
|
152
152
|
- cl_current — repo/branch/index status (call if unsure whether the index is ready)
|
|
153
153
|
- cl_search — ranked semantic+lexical search → compact handles (path + line range + score)
|
|
154
|
+
- cl_explore — one-call grouped search + previews + relationship map for broad orientation
|
|
154
155
|
- cl_related — graph neighbors of a file/symbol (imports/importers/tests/callers)
|
|
156
|
+
- cl_impact — callers/callees/affected files/tests before edits
|
|
155
157
|
- cl_map — per-file symbol outline (repo map) for quick orientation
|
|
156
158
|
- cl_expand — exact current file content by path/range (reads disk, never stale)
|
|
157
159
|
|
|
158
160
|
Prefer cl_* for discovery when:
|
|
159
161
|
- you don't know the exact name/string (semantic or conceptual search)
|
|
160
|
-
- you need relationships (importers, tests, callers) or a quick outline
|
|
162
|
+
- you need broad orientation, relationships (importers, tests, callers), blast radius, or a quick outline
|
|
161
163
|
- the repo is large or unfamiliar, or you'd otherwise grep + read many files
|
|
162
164
|
- branch-scoped correctness matters (results won't leak across branches)
|
|
163
165
|
|
|
@@ -166,6 +168,7 @@ Raw grep/find/read is fine (or better) when:
|
|
|
166
168
|
- you're reading or editing a single known file
|
|
167
169
|
- the repo is tiny or familiar
|
|
168
170
|
|
|
171
|
+
If a result has stale:true or freshness:"partial", read that file directly before relying on indexed snippets/edges.
|
|
169
172
|
Always use cl_expand or a raw read for the exact file you're about to edit.
|
|
170
173
|
After \`git checkout\`, results auto-scope to the new branch; call cl_current to
|
|
171
174
|
confirm. You do NOT need the user's permission to use these tools.`;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getOrCreateIndex, getActiveIndexId } from "./manager.js";
|
|
2
2
|
import { scanFiles } from "./scanner.js";
|
|
3
3
|
import { indexFile, deleteFileFromIndex } from "./fts.js";
|
|
4
|
+
import { setPendingPaths } from "./staleness.js";
|
|
4
5
|
export function buildIndex(db, scope) {
|
|
5
6
|
const row = getOrCreateIndex(db, scope);
|
|
6
7
|
const indexId = row.id;
|
|
@@ -26,6 +27,7 @@ export function buildIndex(db, scope) {
|
|
|
26
27
|
skipped++;
|
|
27
28
|
}
|
|
28
29
|
}
|
|
30
|
+
setPendingPaths(indexId, []);
|
|
29
31
|
return { indexId, indexedFiles, totalChunks, skipped };
|
|
30
32
|
}
|
|
31
33
|
/** Convenience: ensure active index id is set after build. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/index/indexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/index/indexer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiBjD,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,KAAe;IAC/D,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CAAC,2DAA2D,CAAC;SACpE,GAAG,CAAC,OAAO,CAAuB,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,mBAAmB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;YAChE,YAAY,EAAE,CAAC;YACf,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,WAAW,CAAC,EAAqB;IAC/C,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACxF,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { diffFiles } from "./freshness.js";
|
|
|
3
3
|
import { indexFile, deleteFileFromIndex } from "./fts.js";
|
|
4
4
|
import { getOrCreateIndex } from "./manager.js";
|
|
5
5
|
import { acquireWriteLease, releaseWriteLease, newOwnerId } from "./queue.js";
|
|
6
|
+
import { getPendingPaths, setPendingPaths } from "./staleness.js";
|
|
6
7
|
const DEFAULT_BUDGET_MS = 500;
|
|
7
8
|
const FULL_SCAN_INTERVAL_MS = 5000;
|
|
8
9
|
let lastFullScanAt = 0;
|
|
@@ -19,7 +20,7 @@ export function ensureFreshIndex(db, scope, opts) {
|
|
|
19
20
|
// since the last full scan, and we scanned recently, skip the re-scan
|
|
20
21
|
// entirely (the quiet-period optimization). A periodic full scan
|
|
21
22
|
// (FULL_SCAN_INTERVAL_MS) catches anything the watcher missed.
|
|
22
|
-
if (watcher?.active && watcher.dirty.size === 0 && (Date.now() - lastFullScanAt) < FULL_SCAN_INTERVAL_MS) {
|
|
23
|
+
if (watcher?.active && watcher.dirty.size === 0 && getPendingPaths(indexId).size === 0 && (Date.now() - lastFullScanAt) < FULL_SCAN_INTERVAL_MS) {
|
|
23
24
|
return { refreshed: 0, deleted: 0, pending: 0, durationMs: 0 };
|
|
24
25
|
}
|
|
25
26
|
// Cross-process write lease: skip if another process is mid-reindex.
|
|
@@ -43,9 +44,11 @@ export function ensureFreshIndex(db, scope, opts) {
|
|
|
43
44
|
const toProcess = [...diff.changed, ...diff.newFiles];
|
|
44
45
|
let refreshed = 0;
|
|
45
46
|
let pending = 0;
|
|
47
|
+
let pendingPaths = [];
|
|
46
48
|
for (const f of toProcess) {
|
|
47
49
|
if (Date.now() - start > budget) {
|
|
48
|
-
|
|
50
|
+
pendingPaths = toProcess.slice(refreshed).map((p) => p.path);
|
|
51
|
+
pending = pendingPaths.length;
|
|
49
52
|
break;
|
|
50
53
|
}
|
|
51
54
|
try {
|
|
@@ -56,6 +59,7 @@ export function ensureFreshIndex(db, scope, opts) {
|
|
|
56
59
|
// skip unreadable
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
setPendingPaths(indexId, pendingPaths);
|
|
59
63
|
let deleted = 0;
|
|
60
64
|
for (const d of diff.deleted) {
|
|
61
65
|
deleteFileFromIndex(db, indexId, d.path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/index/reindex.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../../src/index/reindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const pendingByIndex = new Map();
|
|
2
|
+
/** Remember files that were known stale but not refreshed within the budget. */
|
|
3
|
+
export function setPendingPaths(indexId, paths) {
|
|
4
|
+
if (paths.length === 0) {
|
|
5
|
+
pendingByIndex.delete(indexId);
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
pendingByIndex.set(indexId, new Set(paths));
|
|
9
|
+
}
|
|
10
|
+
export function getPendingPaths(indexId) {
|
|
11
|
+
return pendingByIndex.get(indexId) ?? new Set();
|
|
12
|
+
}
|
|
13
|
+
export function isPendingPath(indexId, path) {
|
|
14
|
+
return pendingByIndex.get(indexId)?.has(path) ?? false;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=staleness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.js","sourceRoot":"","sources":["../../../src/index/staleness.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEtD,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAe;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAY;IACzD,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { getActiveIndexId, getIndex } from "../index/manager.js";
|
|
2
|
+
import { getPendingPaths } from "../index/staleness.js";
|
|
3
|
+
import { neighbors } from "../graph/query.js";
|
|
4
|
+
import { ctxSearch } from "./search.js";
|
|
5
|
+
const DEFAULT_LIMIT = 8;
|
|
6
|
+
const DEFAULT_RELATED_DEPTH = 1;
|
|
7
|
+
const MAX_RELATED_DEPTH = 3;
|
|
8
|
+
const RELATED_SOURCE_LIMIT = 3;
|
|
9
|
+
function signatureFor(db, indexId, handle) {
|
|
10
|
+
if (!handle)
|
|
11
|
+
return undefined;
|
|
12
|
+
const row = db.prepare(`SELECT s.signature AS signature, s.name AS name, s.kind AS kind
|
|
13
|
+
FROM chunks c
|
|
14
|
+
LEFT JOIN symbols s ON s.id = c.symbol_id AND s.index_id = c.index_id
|
|
15
|
+
WHERE c.index_id = ? AND c.id = ?
|
|
16
|
+
LIMIT 1`).get(indexId, handle);
|
|
17
|
+
if (!row)
|
|
18
|
+
return undefined;
|
|
19
|
+
return row.signature ?? (row.kind && row.name ? `${row.kind} ${row.name}` : undefined);
|
|
20
|
+
}
|
|
21
|
+
function toExploreItem(hit, signature) {
|
|
22
|
+
const item = {
|
|
23
|
+
handle: hit.handle,
|
|
24
|
+
lines: hit.lines,
|
|
25
|
+
score: hit.score,
|
|
26
|
+
why: hit.why,
|
|
27
|
+
preview: hit.preview,
|
|
28
|
+
};
|
|
29
|
+
if (signature)
|
|
30
|
+
item.signature = signature;
|
|
31
|
+
if (hit.stale)
|
|
32
|
+
item.stale = true;
|
|
33
|
+
return item;
|
|
34
|
+
}
|
|
35
|
+
export function ctxExplore(db, query, opts) {
|
|
36
|
+
const indexId = getActiveIndexId();
|
|
37
|
+
if (!indexId || !getIndex(db, indexId))
|
|
38
|
+
throw new Error("no active index — call cl_refresh first");
|
|
39
|
+
const search = ctxSearch(db, query, {
|
|
40
|
+
limit: opts?.limit ?? DEFAULT_LIMIT,
|
|
41
|
+
cursor: opts?.cursor,
|
|
42
|
+
contentType: opts?.contentType,
|
|
43
|
+
snippet: opts?.snippet ?? "compact",
|
|
44
|
+
});
|
|
45
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
46
|
+
const byFile = new Map();
|
|
47
|
+
const seenSignatureByFile = new Map();
|
|
48
|
+
for (const hit of search.results) {
|
|
49
|
+
let file = byFile.get(hit.path);
|
|
50
|
+
if (!file) {
|
|
51
|
+
file = { path: hit.path, results: [] };
|
|
52
|
+
if (pendingPaths.has(hit.path))
|
|
53
|
+
file.stale = true;
|
|
54
|
+
byFile.set(hit.path, file);
|
|
55
|
+
}
|
|
56
|
+
const signature = signatureFor(db, indexId, hit.handle);
|
|
57
|
+
if (signature) {
|
|
58
|
+
let seenForFile = seenSignatureByFile.get(hit.path);
|
|
59
|
+
if (!seenForFile) {
|
|
60
|
+
seenForFile = new Map();
|
|
61
|
+
seenSignatureByFile.set(hit.path, seenForFile);
|
|
62
|
+
}
|
|
63
|
+
const existing = seenForFile.get(signature);
|
|
64
|
+
if (existing) {
|
|
65
|
+
existing.collapsed = (existing.collapsed ?? 1) + 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const item = toExploreItem(hit, signature);
|
|
69
|
+
seenForFile.set(signature, item);
|
|
70
|
+
file.results.push(item);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
file.results.push(toExploreItem(hit));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const relatedDepth = Math.min(Math.max(1, opts?.relatedDepth ?? DEFAULT_RELATED_DEPTH), MAX_RELATED_DEPTH);
|
|
77
|
+
const related = [];
|
|
78
|
+
const seenRelated = new Set();
|
|
79
|
+
for (const sourcePath of [...byFile.keys()].slice(0, RELATED_SOURCE_LIMIT)) {
|
|
80
|
+
try {
|
|
81
|
+
for (const n of neighbors(db, indexId, sourcePath, { types: ["imports", "imported_by", "tests", "calls", "references"], depth: relatedDepth })) {
|
|
82
|
+
const key = `${sourcePath}\0${n.path}\0${n.edgeType}\0${n.hops}`;
|
|
83
|
+
if (seenRelated.has(key))
|
|
84
|
+
continue;
|
|
85
|
+
seenRelated.add(key);
|
|
86
|
+
const item = { sourcePath, ...n };
|
|
87
|
+
if (pendingPaths.has(n.path))
|
|
88
|
+
item.stale = true;
|
|
89
|
+
related.push(item);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Graph is best-effort; search results remain useful without it.
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const out = {
|
|
97
|
+
indexId,
|
|
98
|
+
query: search.query,
|
|
99
|
+
count: search.count,
|
|
100
|
+
files: [...byFile.values()],
|
|
101
|
+
related,
|
|
102
|
+
freshness: search.freshness,
|
|
103
|
+
};
|
|
104
|
+
if (search.pendingFiles !== undefined)
|
|
105
|
+
out.pendingFiles = search.pendingFiles;
|
|
106
|
+
if (search.nextCursor)
|
|
107
|
+
out.nextCursor = search.nextCursor;
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=explore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.js","sourceRoot":"","sources":["../../../src/tools/explore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { getActiveIndexId, getIndex } from "../index/manager.js";
|
|
2
|
+
import { getPendingPaths } from "../index/staleness.js";
|
|
3
|
+
import { neighbors, testsFor } from "../graph/query.js";
|
|
4
|
+
const DEFAULT_DEPTH = 2;
|
|
5
|
+
const MAX_DEPTH = 3;
|
|
6
|
+
function clampDepth(depth) {
|
|
7
|
+
return Math.min(Math.max(1, depth ?? DEFAULT_DEPTH), MAX_DEPTH);
|
|
8
|
+
}
|
|
9
|
+
function staleAware(indexId, n) {
|
|
10
|
+
const item = {
|
|
11
|
+
handle: `rel:${n.path}`,
|
|
12
|
+
path: n.path,
|
|
13
|
+
edgeType: n.edgeType,
|
|
14
|
+
hops: n.hops,
|
|
15
|
+
confidence: n.confidence,
|
|
16
|
+
};
|
|
17
|
+
if (getPendingPaths(indexId).has(n.path))
|
|
18
|
+
item.stale = true;
|
|
19
|
+
return item;
|
|
20
|
+
}
|
|
21
|
+
function isTestPath(path) {
|
|
22
|
+
return /(^|\/)(__tests__|tests?)\//.test(path) || /\.(test|spec)\.[cm]?[jt]sx?$/.test(path);
|
|
23
|
+
}
|
|
24
|
+
function uniq(handles) {
|
|
25
|
+
const byKey = new Map();
|
|
26
|
+
for (const h of handles) {
|
|
27
|
+
const key = `${h.path}\0${h.edgeType}`;
|
|
28
|
+
const existing = byKey.get(key);
|
|
29
|
+
if (!existing || h.hops < existing.hops || (h.hops === existing.hops && h.confidence > existing.confidence)) {
|
|
30
|
+
byKey.set(key, h);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return [...byKey.values()].sort((a, b) => a.hops - b.hops || b.confidence - a.confidence || a.path.localeCompare(b.path));
|
|
34
|
+
}
|
|
35
|
+
function resolveSymbol(db, indexId, symbol, path) {
|
|
36
|
+
const pathClause = path ? " AND path = ?" : "";
|
|
37
|
+
const params = path ? [indexId, symbol, path] : [indexId, symbol];
|
|
38
|
+
const exact = db.prepare(`SELECT id, path, name, kind, signature, start_line, end_line
|
|
39
|
+
FROM symbols WHERE index_id = ? AND name = ?${pathClause}
|
|
40
|
+
ORDER BY path ASC, start_line ASC LIMIT 20`).all(...params);
|
|
41
|
+
if (exact.length > 0)
|
|
42
|
+
return exact;
|
|
43
|
+
const likeParams = path ? [indexId, `%${symbol}%`, path] : [indexId, `%${symbol}%`];
|
|
44
|
+
return db.prepare(`SELECT id, path, name, kind, signature, start_line, end_line
|
|
45
|
+
FROM symbols WHERE index_id = ? AND name LIKE ?${pathClause}
|
|
46
|
+
ORDER BY path ASC, start_line ASC LIMIT 20`).all(...likeParams);
|
|
47
|
+
}
|
|
48
|
+
function candidateFrom(row, stale) {
|
|
49
|
+
const c = {
|
|
50
|
+
id: row.id,
|
|
51
|
+
path: row.path,
|
|
52
|
+
symbol: row.name,
|
|
53
|
+
kind: row.kind,
|
|
54
|
+
signature: row.signature,
|
|
55
|
+
lines: `${row.start_line}-${row.end_line}`,
|
|
56
|
+
};
|
|
57
|
+
if (stale)
|
|
58
|
+
c.stale = true;
|
|
59
|
+
return c;
|
|
60
|
+
}
|
|
61
|
+
function targetFrom(row, path, stale) {
|
|
62
|
+
if (!row) {
|
|
63
|
+
const target = { path };
|
|
64
|
+
if (stale)
|
|
65
|
+
target.stale = true;
|
|
66
|
+
return target;
|
|
67
|
+
}
|
|
68
|
+
const target = {
|
|
69
|
+
path: row.path,
|
|
70
|
+
symbol: row.name,
|
|
71
|
+
kind: row.kind,
|
|
72
|
+
signature: row.signature,
|
|
73
|
+
lines: `${row.start_line}-${row.end_line}`,
|
|
74
|
+
};
|
|
75
|
+
if (stale)
|
|
76
|
+
target.stale = true;
|
|
77
|
+
return target;
|
|
78
|
+
}
|
|
79
|
+
export function ctxImpact(db, opts) {
|
|
80
|
+
const indexId = getActiveIndexId();
|
|
81
|
+
if (!indexId || !getIndex(db, indexId))
|
|
82
|
+
throw new Error("no active index — call cl_refresh first");
|
|
83
|
+
if (!opts.symbol && !opts.path)
|
|
84
|
+
throw new Error("cl_impact requires symbol or path");
|
|
85
|
+
const depth = clampDepth(opts.depth);
|
|
86
|
+
const includeTests = opts.includeTests ?? true;
|
|
87
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
88
|
+
let targetPath = opts.path?.replace(/^\.?\//, "");
|
|
89
|
+
let targetSymbol;
|
|
90
|
+
if (opts.symbol) {
|
|
91
|
+
const matches = resolveSymbol(db, indexId, opts.symbol, targetPath);
|
|
92
|
+
if (matches.length > 1 && !targetPath) {
|
|
93
|
+
const candidates = matches.map((m) => candidateFrom(m, pendingPaths.has(m.path)));
|
|
94
|
+
const out = {
|
|
95
|
+
indexId,
|
|
96
|
+
candidates,
|
|
97
|
+
callers: [],
|
|
98
|
+
callees: [],
|
|
99
|
+
affectedFiles: [],
|
|
100
|
+
affectedTests: [],
|
|
101
|
+
depth,
|
|
102
|
+
confidenceNote: "Multiple symbols matched; pass both symbol and path to disambiguate before trusting impact results.",
|
|
103
|
+
freshness: pendingPaths.size > 0 ? "partial" : "fresh",
|
|
104
|
+
};
|
|
105
|
+
if (pendingPaths.size > 0)
|
|
106
|
+
out.pendingFiles = pendingPaths.size;
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
targetSymbol = matches[0];
|
|
110
|
+
if (!targetSymbol) {
|
|
111
|
+
const out = {
|
|
112
|
+
indexId,
|
|
113
|
+
candidates: [],
|
|
114
|
+
callers: [],
|
|
115
|
+
callees: [],
|
|
116
|
+
affectedFiles: [],
|
|
117
|
+
affectedTests: [],
|
|
118
|
+
depth,
|
|
119
|
+
confidenceNote: "No indexed symbol matched; try cl_search or pass a repo-relative path.",
|
|
120
|
+
freshness: pendingPaths.size > 0 ? "partial" : "fresh",
|
|
121
|
+
};
|
|
122
|
+
if (pendingPaths.size > 0)
|
|
123
|
+
out.pendingFiles = pendingPaths.size;
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
targetPath = targetSymbol.path;
|
|
127
|
+
}
|
|
128
|
+
if (!targetPath)
|
|
129
|
+
throw new Error("cl_impact could not resolve a target path");
|
|
130
|
+
const callers = uniq(neighbors(db, indexId, targetPath, { types: ["calls", "references", "imports", "imported_by"], depth, direction: "in" }).map((n) => staleAware(indexId, n)));
|
|
131
|
+
const callees = uniq(neighbors(db, indexId, targetPath, { types: ["calls", "references", "imports"], depth, direction: "out" }).map((n) => staleAware(indexId, n)));
|
|
132
|
+
const affectedFiles = uniq([
|
|
133
|
+
...callers,
|
|
134
|
+
...neighbors(db, indexId, targetPath, { types: ["imported_by", "references", "calls"], depth, direction: "in" }).map((n) => staleAware(indexId, n)),
|
|
135
|
+
]);
|
|
136
|
+
const affectedTests = includeTests
|
|
137
|
+
? uniq([
|
|
138
|
+
...testsFor(db, indexId, targetPath).map((n) => staleAware(indexId, n)),
|
|
139
|
+
...affectedFiles.flatMap((f) => testsFor(db, indexId, f.path).map((n) => staleAware(indexId, n))),
|
|
140
|
+
...affectedFiles.filter((f) => isTestPath(f.path)).map((f) => ({ ...f, edgeType: "tests" })),
|
|
141
|
+
...callers.filter((f) => isTestPath(f.path)).map((f) => ({ ...f, edgeType: "tests" })),
|
|
142
|
+
])
|
|
143
|
+
: [];
|
|
144
|
+
const out = {
|
|
145
|
+
indexId,
|
|
146
|
+
target: targetFrom(targetSymbol, targetPath, pendingPaths.has(targetPath)),
|
|
147
|
+
callers,
|
|
148
|
+
callees,
|
|
149
|
+
affectedFiles,
|
|
150
|
+
affectedTests,
|
|
151
|
+
depth,
|
|
152
|
+
confidenceNote: "Impact is derived from indexed file/symbol edges. calls/references are currently strongest for TS/JS; lower-confidence or sparse languages may need cl_search/cl_expand follow-up.",
|
|
153
|
+
freshness: pendingPaths.size > 0 ? "partial" : "fresh",
|
|
154
|
+
};
|
|
155
|
+
if (pendingPaths.size > 0)
|
|
156
|
+
out.pendingFiles = pendingPaths.size;
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=impact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../../src/tools/impact.ts"],"names":[],"mappings":"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"}
|
package/build/src/tools/map.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getActiveIndexId, getIndex } from "../index/manager.js";
|
|
2
|
+
import { getPendingPaths } from "../index/staleness.js";
|
|
2
3
|
const DEFAULT_FILE_LIMIT = 50;
|
|
3
4
|
const MAX_FILE_LIMIT = 200;
|
|
4
5
|
/**
|
|
@@ -44,7 +45,16 @@ export function ctxMap(db, opts) {
|
|
|
44
45
|
// Were there more files than the cap allowed?
|
|
45
46
|
const distinctPaths = new Set(rows.map((r) => r.path));
|
|
46
47
|
const truncated = distinctPaths.size > byFile.size;
|
|
47
|
-
const
|
|
48
|
-
|
|
48
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
49
|
+
const files = [...byFile.entries()].map(([path, symbols]) => {
|
|
50
|
+
const item = { path, symbols };
|
|
51
|
+
if (pendingPaths.has(path))
|
|
52
|
+
item.stale = true;
|
|
53
|
+
return item;
|
|
54
|
+
});
|
|
55
|
+
const out = { indexId, files, fileCount: files.length, truncated, freshness: pendingPaths.size > 0 ? "partial" : "fresh" };
|
|
56
|
+
if (pendingPaths.size > 0)
|
|
57
|
+
out.pendingFiles = pendingPaths.size;
|
|
58
|
+
return out;
|
|
49
59
|
}
|
|
50
60
|
//# sourceMappingURL=map.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../../src/tools/map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../../src/tools/map.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@ import { z } from "zod";
|
|
|
2
2
|
import { ctxCurrent } from "./current.js";
|
|
3
3
|
import { ctxRefresh } from "./refresh.js";
|
|
4
4
|
import { ctxSearch } from "./search.js";
|
|
5
|
+
import { ctxExplore } from "./explore.js";
|
|
5
6
|
import { ctxRelated } from "./related.js";
|
|
7
|
+
import { ctxImpact } from "./impact.js";
|
|
6
8
|
import { ctxExpand } from "./expand.js";
|
|
7
9
|
import { ctxMap } from "./map.js";
|
|
8
10
|
import { ctxSave, ctxLoad } from "./save.js";
|
|
@@ -13,6 +15,7 @@ import { UsageTracker, openGlobalUsageDb } from "../obs/usage.js";
|
|
|
13
15
|
import { detectScope } from "../git/scope.js";
|
|
14
16
|
import { getOrCreateIndex, getActiveIndexId } from "../index/manager.js";
|
|
15
17
|
import { buildIndex } from "../index/indexer.js";
|
|
18
|
+
import { ensureFreshIndex } from "../index/reindex.js";
|
|
16
19
|
function withScope(ctx) {
|
|
17
20
|
return detectScope(ctx.repoRoot);
|
|
18
21
|
}
|
|
@@ -21,12 +24,14 @@ function ensureActive(ctx) {
|
|
|
21
24
|
const scope = withScope(ctx);
|
|
22
25
|
if (!scope)
|
|
23
26
|
throw new Error("not inside a git repo (or plain dir support not enabled)");
|
|
24
|
-
//
|
|
27
|
+
// Build the first index eagerly, then use budget-bounded reconciliation on
|
|
28
|
+
// subsequent query tools so out-of-band edits are not silently missed.
|
|
25
29
|
if (!getActiveIndexId()) {
|
|
26
30
|
buildIndex(ctx.coreDb, scope);
|
|
27
31
|
}
|
|
28
32
|
else {
|
|
29
33
|
getOrCreateIndex(ctx.coreDb, scope);
|
|
34
|
+
ensureFreshIndex(ctx.coreDb, scope);
|
|
30
35
|
}
|
|
31
36
|
return getActiveIndexId();
|
|
32
37
|
}
|
|
@@ -50,7 +55,7 @@ export const TOOLS = [
|
|
|
50
55
|
},
|
|
51
56
|
{
|
|
52
57
|
name: "cl_search",
|
|
53
|
-
description: "Hybrid search over the current branch index: FTS5 BM25 + symbol-name match + graph proximity, fused via weighted ranking. Compact ranked handles, cursor pagination. Use BEFORE grep/find/read for code discovery. Pass related:true to also get graph neighbors of the top result in one call.\n\nRETURNS: {indexId, results:[{handle,path,
|
|
58
|
+
description: "Hybrid search over the current branch index: FTS5 BM25 + symbol-name match + graph proximity, fused via weighted ranking. Compact ranked handles, cursor pagination. Use BEFORE grep/find/read for code discovery. Pass related:true to also get graph neighbors of the top result in one call.\n\nRETURNS: {indexId, query, count, results:[{handle,path,lines,score,why,preview,stale?}], nextCursor, freshness, pendingFiles}\n\nWHEN NOT: editing exact files (use cl_expand or read instead).\n\nEXAMPLE: cl_search(query: \"session validation\", limit: 5)",
|
|
54
59
|
schema: {
|
|
55
60
|
query: z.string().describe("Search query (2-4 specific technical terms recommended)."),
|
|
56
61
|
limit: z.coerce.number().optional().default(5).describe("Results per page (default 5)."),
|
|
@@ -64,13 +69,34 @@ export const TOOLS = [
|
|
|
64
69
|
return ctxSearch(ctx.coreDb, args.query, {
|
|
65
70
|
limit: args.limit,
|
|
66
71
|
cursor: args.cursor,
|
|
67
|
-
scope: withScope(ctx) ?? undefined,
|
|
68
72
|
contentType: args.contentType,
|
|
69
73
|
related: args.related,
|
|
70
74
|
snippet: args.snippet,
|
|
71
75
|
});
|
|
72
76
|
},
|
|
73
77
|
},
|
|
78
|
+
{
|
|
79
|
+
name: "cl_explore",
|
|
80
|
+
description: "One-call code exploration over the current branch index: hybrid search grouped by file, compact source previews, signature-collapse, and a relationship/blast map. Use for broad questions like 'how does X work?' before falling back to separate search/expand/related calls.\n\nRETURNS: {indexId, query, count, files:[{path, stale?, results:[{handle,lines,score,why,preview,signature?,collapsed?,stale?}]}], related:[{sourcePath,path,edgeType,hops,confidence,stale?}], freshness, pendingFiles?, nextCursor?}\n\nEXAMPLE: cl_explore(query: \"session validation flow\", limit: 8)",
|
|
81
|
+
schema: {
|
|
82
|
+
query: z.string().describe("Exploration query (2-6 specific technical terms recommended)."),
|
|
83
|
+
limit: z.coerce.number().optional().default(8).describe("Maximum ranked chunks to group into files (default 8)."),
|
|
84
|
+
cursor: z.string().optional().describe("Pagination cursor from a prior result's nextCursor."),
|
|
85
|
+
contentType: z.enum(["code", "prose"]).optional().describe("Filter by chunk type: 'code' or 'prose'."),
|
|
86
|
+
snippet: z.enum(["none", "headline", "compact", "full"]).optional().describe("Preview verbosity. Default compact."),
|
|
87
|
+
relatedDepth: z.coerce.number().optional().default(1).describe("Relationship map depth (default 1, capped at 3)."),
|
|
88
|
+
},
|
|
89
|
+
handler: (ctx, args) => {
|
|
90
|
+
ensureActive(ctx);
|
|
91
|
+
return ctxExplore(ctx.coreDb, args.query, {
|
|
92
|
+
limit: args.limit,
|
|
93
|
+
cursor: args.cursor,
|
|
94
|
+
contentType: args.contentType,
|
|
95
|
+
snippet: args.snippet,
|
|
96
|
+
relatedDepth: args.relatedDepth,
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
},
|
|
74
100
|
{
|
|
75
101
|
name: "cl_related",
|
|
76
102
|
description: "Graph expansion: neighbors of a file (imports/imported_by/tests/callers) within the current index, bounded by depth. Compact handles.\n\nRETURNS: {indexId, results:[{handle,path,edgeType,hops,confidence}]}\n\nEXAMPLE: cl_related(path: \"src/auth/auth.ts\", types: [\"imports\"], depth: 2)",
|
|
@@ -89,6 +115,25 @@ export const TOOLS = [
|
|
|
89
115
|
});
|
|
90
116
|
},
|
|
91
117
|
},
|
|
118
|
+
{
|
|
119
|
+
name: "cl_impact",
|
|
120
|
+
description: "Blast-radius analysis for a symbol or file in the current branch index. Returns callers, callees, affected files, and affected tests with hops/confidence. Use before changing shared code.\n\nRETURNS: {indexId, target?, candidates?, callers, callees, affectedFiles, affectedTests, depth, confidenceNote, freshness?, pendingFiles?}\n\nEXAMPLE: cl_impact(symbol: \"validateSession\", path: \"src/auth/session.ts\", depth: 2)",
|
|
121
|
+
schema: {
|
|
122
|
+
symbol: z.string().optional().describe("Symbol name to analyze. If ambiguous, candidates are returned."),
|
|
123
|
+
path: z.string().optional().describe("Repo-relative path to analyze or to disambiguate a symbol."),
|
|
124
|
+
depth: z.coerce.number().optional().default(2).describe("Traversal depth (default 2, capped at 3)."),
|
|
125
|
+
includeTests: z.boolean().optional().default(true).describe("Include affected test files (default true)."),
|
|
126
|
+
},
|
|
127
|
+
handler: (ctx, args) => {
|
|
128
|
+
ensureActive(ctx);
|
|
129
|
+
return ctxImpact(ctx.coreDb, {
|
|
130
|
+
symbol: args.symbol,
|
|
131
|
+
path: args.path,
|
|
132
|
+
depth: args.depth,
|
|
133
|
+
includeTests: args.includeTests,
|
|
134
|
+
});
|
|
135
|
+
},
|
|
136
|
+
},
|
|
92
137
|
{
|
|
93
138
|
name: "cl_expand",
|
|
94
139
|
description: "Return exact current local file content by path/range. Reads from disk — never stale stored text. Use after cl_search/cl_related to read target snippets before editing.\n\nRETURNS: {path, startLine, endLine, content, truncated, chars}\n\nEXAMPLE: cl_expand(path: \"src/auth/session.ts\", startLine: 12, endLine: 58, budget: 1200)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
import { getActiveIndexId, getIndex } from "../index/manager.js";
|
|
2
|
+
import { getPendingPaths } from "../index/staleness.js";
|
|
2
3
|
import { neighbors as graphNeighbors, testsFor } from "../graph/query.js";
|
|
3
4
|
export function ctxRelated(db, path, opts) {
|
|
4
5
|
const indexId = getActiveIndexId();
|
|
5
6
|
if (!indexId || !getIndex(db, indexId))
|
|
6
7
|
throw new Error("no active index — call cl_refresh first");
|
|
7
8
|
const ns = graphNeighbors(db, indexId, path, opts ?? {});
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
10
|
+
const results = ns.map((n) => {
|
|
11
|
+
const item = {
|
|
12
|
+
handle: `rel:${n.path}`,
|
|
13
|
+
path: n.path,
|
|
14
|
+
edgeType: n.edgeType,
|
|
15
|
+
hops: n.hops,
|
|
16
|
+
confidence: n.confidence,
|
|
17
|
+
};
|
|
18
|
+
if (pendingPaths.has(n.path))
|
|
19
|
+
item.stale = true;
|
|
20
|
+
return item;
|
|
21
|
+
});
|
|
22
|
+
const out = { indexId, results, freshness: pendingPaths.size > 0 ? "partial" : "fresh" };
|
|
23
|
+
if (pendingPaths.size > 0)
|
|
24
|
+
out.pendingFiles = pendingPaths.size;
|
|
25
|
+
return out;
|
|
16
26
|
}
|
|
17
27
|
/** cl_related variant: tests for a given source path. */
|
|
18
28
|
export function ctxRelatedTests(db, sourcePath) {
|
|
@@ -20,9 +30,19 @@ export function ctxRelatedTests(db, sourcePath) {
|
|
|
20
30
|
if (!indexId || !getIndex(db, indexId))
|
|
21
31
|
throw new Error("no active index — call cl_refresh first");
|
|
22
32
|
const ns = testsFor(db, indexId, sourcePath);
|
|
23
|
-
|
|
33
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
34
|
+
const out = {
|
|
24
35
|
indexId,
|
|
25
|
-
results: ns.map((n) =>
|
|
36
|
+
results: ns.map((n) => {
|
|
37
|
+
const item = { handle: `rel:${n.path}`, path: n.path, edgeType: n.edgeType, hops: n.hops, confidence: n.confidence };
|
|
38
|
+
if (pendingPaths.has(n.path))
|
|
39
|
+
item.stale = true;
|
|
40
|
+
return item;
|
|
41
|
+
}),
|
|
42
|
+
freshness: pendingPaths.size > 0 ? "partial" : "fresh",
|
|
26
43
|
};
|
|
44
|
+
if (pendingPaths.size > 0)
|
|
45
|
+
out.pendingFiles = pendingPaths.size;
|
|
46
|
+
return out;
|
|
27
47
|
}
|
|
28
48
|
//# sourceMappingURL=related.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"related.js","sourceRoot":"","sources":["../../../src/tools/related.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,QAAQ,EAAsB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"related.js","sourceRoot":"","sources":["../../../src/tools/related.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { extractSnippet, headlineSnippet } from "../search/snippet.js";
|
|
|
3
3
|
import { rank, normalize } from "../search/rank.js";
|
|
4
4
|
import { neighbors } from "../graph/query.js";
|
|
5
5
|
import { ensureFreshIndex } from "../index/reindex.js";
|
|
6
|
+
import { getPendingPaths } from "../index/staleness.js";
|
|
6
7
|
import { splitIdentifiers } from "../search/identifiers.js";
|
|
7
8
|
import { queryTokens, quoteFtsTerm } from "../search/query.js";
|
|
8
9
|
const DEFAULT_LIMIT = 5;
|
|
@@ -119,6 +120,14 @@ function prelude(db, opts) {
|
|
|
119
120
|
pendingFiles = r.pending;
|
|
120
121
|
}
|
|
121
122
|
}
|
|
123
|
+
const indexId = getActiveIndexId();
|
|
124
|
+
if (indexId) {
|
|
125
|
+
const pending = getPendingPaths(indexId).size;
|
|
126
|
+
if (pending > 0) {
|
|
127
|
+
freshness = "partial";
|
|
128
|
+
pendingFiles = pending;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
122
131
|
return { freshness, pendingFiles };
|
|
123
132
|
}
|
|
124
133
|
export function ctxSearch(db, query, opts) {
|
|
@@ -130,8 +139,12 @@ export function ctxSearch(db, query, opts) {
|
|
|
130
139
|
const limit = opts?.limit ?? DEFAULT_LIMIT;
|
|
131
140
|
const offset = decodeCursor(opts?.cursor);
|
|
132
141
|
const fts = ftsQuery(query);
|
|
133
|
-
if (fts.length === 0)
|
|
134
|
-
|
|
142
|
+
if (fts.length === 0) {
|
|
143
|
+
const out = { indexId, query, count: 0, results: [], freshness };
|
|
144
|
+
if (pendingFiles !== undefined)
|
|
145
|
+
out.pendingFiles = pendingFiles;
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
135
148
|
const ftsRows = gatherFts(db, indexId, fts, limit * 4, opts?.contentType);
|
|
136
149
|
const signals = buildSignals(db, indexId, query, ftsRows);
|
|
137
150
|
const ranked = rank(signals);
|
|
@@ -165,10 +178,11 @@ export function ctxSearch(db, query, opts) {
|
|
|
165
178
|
case "full": return extractSnippet(src.content, query, 1500);
|
|
166
179
|
}
|
|
167
180
|
};
|
|
181
|
+
const pendingPaths = getPendingPaths(indexId);
|
|
168
182
|
const results = page.map((r, i) => {
|
|
169
183
|
const src = r.chunkId ? byChunk.get(r.chunkId) : undefined;
|
|
170
184
|
const rankOffset = offset + i;
|
|
171
|
-
|
|
185
|
+
const item = {
|
|
172
186
|
handle: r.chunkId ?? "",
|
|
173
187
|
path: r.path,
|
|
174
188
|
lines: `${r.startLine}-${r.endLine}`,
|
|
@@ -176,6 +190,9 @@ export function ctxSearch(db, query, opts) {
|
|
|
176
190
|
why: r.why.join(","),
|
|
177
191
|
preview: src ? renderPreview(src, rankOffset) : "",
|
|
178
192
|
};
|
|
193
|
+
if (pendingPaths.has(r.path))
|
|
194
|
+
item.stale = true;
|
|
195
|
+
return item;
|
|
179
196
|
});
|
|
180
197
|
const nextCursor = hasMore && results.length > 0 ? encodeCursor(offset + results.length, results[results.length - 1].handle || `${offset}`) : null;
|
|
181
198
|
const out = { indexId, query, count: results.length, results, freshness };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAoB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAsB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkC/D,MAAM,aAAa,GAAG,CAAC,CAAC;AAGxB,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC5B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAID,SAAS,SAAS,CAAC,EAAqB,EAAE,OAAe,EAAE,GAAW,EAAE,KAAa,EAAE,WAA8B;IACnH,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAc,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACnG,OAAO,EAAE;SACN,OAAO,CACN;;;;;6DAKuD,UAAU;iCACtC,CAC5B;SACA,GAAG,CAAC,GAAG,MAAM,CAAa,CAAC;AAChC,CAAC;AAED,mDAAmD;AACnD,SAAS,YAAY,CAAC,EAAqB,EAAE,OAAe,EAAE,KAAa,EAAE,OAAiB;IAC5F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,sFAAsF,CACvF,CAAC;IACF,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,mFAAmF,CACpF,CAAC;IACF,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAChC,+EAA+E,CAChF,CAAC;IACF,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,KAAK,MAAM,CAAC,IAAI,EAAE;gBAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAiC,CAAC;gBACrF,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC;YACpD,CAAC;YACD,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;QAC3D,CAAC;QACD,MAAM,aAAa,GAAG,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,eAAe,GAAG,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,KAAK,CAAC,CAAC,CAAC;QACtF,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,EAAE,CAAC,CAAC,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,OAAO,CAAC,EAAqB,EAAE,IAAqD;IAC3F,IAAI,SAAS,GAAwB,OAAO,CAAC;IAC7C,IAAI,YAAgC,CAAC;IACrC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC;YAAC,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC;QAAC,CAAC;IACzE,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;QAC9C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC;YAAC,YAAY,GAAG,OAAO,CAAC;QAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAAqB,EACrB,KAAa,EACb,IAAgK;IAEhK,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnG,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,aAAa,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,GAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;QAC/E,IAAI,YAAY,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;QAChE,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,EAAE,OAAO,CAAC;IACnC,qEAAqE;IACrE,oCAAoC;IACpC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;;0CAEsC,CACvC,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;QAC1C,IAAI,GAAG,GAAkB,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,CAA+D,CAAC;YACtI,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACrG,IAAI,MAAM;gBAAE,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;QACrC,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,UAAkB,EAAU,EAAE;QAChE,MAAM,IAAI,GAAgB,YAAY,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACrG,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,UAAU,CAAC,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;YACzC,KAAK,SAAS,CAAC,CAAC,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,CAAC,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAiB;YACzB,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI;YACxC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;YACpB,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;SACnD,CAAC;QACF,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpJ,MAAM,GAAG,GAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACxF,IAAI,YAAY,KAAK,SAAS;QAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;IAChE,IAAI,UAAU;QAAE,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5C,IAAI,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnH,CAAC;QAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,UAAkB;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,MAAe;IACnC,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
package/docs/agent-guide.md
CHANGED
|
@@ -11,7 +11,13 @@ End-to-end workflow for a coding agent using codelens.
|
|
|
11
11
|
2. cl_refresh
|
|
12
12
|
→ { indexedFiles: 812, totalChunks: 2400, status: "ready" }
|
|
13
13
|
|
|
14
|
-
3.
|
|
14
|
+
3. cl_explore(query: "session validation flow")
|
|
15
|
+
→ { query: "session validation flow", count: 3,
|
|
16
|
+
files: [{ path: "src/auth/session.ts", results: [{ handle: "chk_…", lines: "12-58", preview: "export function validateSession…" }] }],
|
|
17
|
+
related: [{ sourcePath: "src/auth/session.ts", path: "src/routes/login.ts", edgeType: "imported_by", hops: 1 }] }
|
|
18
|
+
|
|
19
|
+
# If you only need to locate a handle, use the leaner search tool:
|
|
20
|
+
cl_search(query: "session validation")
|
|
15
21
|
→ { query: "session validation", count: 1, results: [
|
|
16
22
|
{ handle: "chk_…", path: "src/auth/session.ts", lines: "12-58",
|
|
17
23
|
score: 0.92, why: "fts,symbol,graph", preview: "export function validateSession(token: string): boolean" }
|
|
@@ -24,6 +30,10 @@ End-to-end workflow for a coding agent using codelens.
|
|
|
24
30
|
]
|
|
25
31
|
# TS/JS also populate `calls`/`references` and resolve dynamic import().
|
|
26
32
|
|
|
33
|
+
# Before changing shared code, ask for the blast radius.
|
|
34
|
+
cl_impact(symbol: "validateSession", path: "src/auth/session.ts")
|
|
35
|
+
→ { callers: [...], callees: [...], affectedFiles: [...], affectedTests: [...], confidenceNote: "…" }
|
|
36
|
+
|
|
27
37
|
# Orientation (optional): outline a file or directory without reading it.
|
|
28
38
|
cl_map(path: "src/auth")
|
|
29
39
|
→ files: [{ path: "src/auth/session.ts", symbols: [{ name: "validateSession", kind: "function", signature: "export function validateSession(token: string): boolean" }] }]
|
|
@@ -37,6 +47,14 @@ End-to-end workflow for a coding agent using codelens.
|
|
|
37
47
|
8. cl_load(name: "auth-investigation") # after compaction
|
|
38
48
|
```
|
|
39
49
|
|
|
50
|
+
## Tool choice
|
|
51
|
+
|
|
52
|
+
- Use `cl_explore` for broad questions: "how does X work?", "show the flow around Y", or surveying an unfamiliar area. It combines search, compact source previews, and relationships in one call.
|
|
53
|
+
- Use `cl_search` when you only need ranked handles/locations.
|
|
54
|
+
- Use `cl_related` to expand from a known file.
|
|
55
|
+
- Use `cl_impact` before editing shared code to see callers/callees/affected tests.
|
|
56
|
+
- Use `cl_expand` (or raw read) for exact current file content before editing.
|
|
57
|
+
|
|
40
58
|
## Branch switch
|
|
41
59
|
|
|
42
60
|
```
|
|
@@ -46,6 +64,10 @@ cl_refresh → builds feature-b index; main's results no longer leak in
|
|
|
46
64
|
```
|
|
47
65
|
|
|
48
66
|
|
|
67
|
+
## Freshness and stale results
|
|
68
|
+
|
|
69
|
+
Query tools reconcile changed files before answering. If a response includes `freshness: "partial"`, `pendingFiles`, or per-result `stale:true`, read those stale files directly (`cl_expand` or raw read) before relying on indexed previews/edges.
|
|
70
|
+
|
|
49
71
|
## Saving context across compaction
|
|
50
72
|
|
|
51
73
|
`cl_save` / `cl_load` persist named handle sets in a **separate** DB that
|
package/docs/routing.md
CHANGED
|
@@ -14,14 +14,16 @@ right tool for the job.
|
|
|
14
14
|
|
|
15
15
|
Prefer codelens when:
|
|
16
16
|
- you don't know the exact name/string (semantic or conceptual search via `cl_search`)
|
|
17
|
-
- you need
|
|
18
|
-
|
|
17
|
+
- you need broad orientation in one call (`cl_explore`) — "how does X work?", flows, or unfamiliar areas
|
|
18
|
+
- you need relationships — importers, tests, callers (`cl_related`) — or blast radius before edits (`cl_impact`)
|
|
19
|
+
- you need a per-file outline / repo map (`cl_map`)
|
|
19
20
|
- the repo is large or unfamiliar, or you'd otherwise grep + read many files
|
|
20
21
|
- branch-scoped correctness matters (results won't leak across branches)
|
|
21
22
|
|
|
22
23
|
Then use `cl_expand` to read the exact current content of a chosen target (it
|
|
23
24
|
reads from disk — never stale), and `cl_save`/`cl_load` to persist working
|
|
24
|
-
context across compaction.
|
|
25
|
+
context across compaction. If a query result has `stale:true`, read that file
|
|
26
|
+
from disk before relying on indexed snippets/edges.
|
|
25
27
|
|
|
26
28
|
## When raw grep/find/read is fine (or better)
|
|
27
29
|
|
|
@@ -44,9 +46,11 @@ branch's index automatically.
|
|
|
44
46
|
|
|
45
47
|
## Freshness
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
the response carries `freshness: "partial"
|
|
49
|
-
recent edits
|
|
49
|
+
Query tools auto-refresh changed files before returning (budget-bounded). If
|
|
50
|
+
the response carries `freshness: "partial"`, `pendingFiles > 0`, or per-result
|
|
51
|
+
`stale:true`, some recent edits were not reindexed within the budget. Read those
|
|
52
|
+
files directly with `cl_expand`/raw read, then call `cl_refresh` or re-query when
|
|
53
|
+
you need indexed relationships to catch up.
|
|
50
54
|
|
|
51
55
|
## Tool quick reference
|
|
52
56
|
|
|
@@ -55,7 +59,9 @@ recent edits may not yet be reflected — call `cl_refresh` or re-query.
|
|
|
55
59
|
| `cl_current` | repo/branch/index status + freshness |
|
|
56
60
|
| `cl_refresh` | build/update the current branch index |
|
|
57
61
|
| `cl_search` | hybrid ranked search → compact handles |
|
|
62
|
+
| `cl_explore` | one-call grouped search + previews + relationship map |
|
|
58
63
|
| `cl_related` | graph neighbors (imports/tests/callers) |
|
|
64
|
+
| `cl_impact` | callers/callees/affected files/tests before edits |
|
|
59
65
|
| `cl_map` | per-file symbol outline (repo map) |
|
|
60
66
|
| `cl_expand` | exact current file content by path/range |
|
|
61
67
|
| `cl_save` / `cl_load` | persist + reload working context |
|
package/docs/tools.md
CHANGED
|
@@ -15,24 +15,37 @@ JSON-serialized text content.
|
|
|
15
15
|
|
|
16
16
|
## cl_search
|
|
17
17
|
- **Input**: `{ query: string, limit?: number=5, cursor?: string, contentType?: "code"|"prose", related?: boolean, snippet?: "none"|"headline"|"compact"|"full" }`
|
|
18
|
-
- **Returns**: `{ indexId, query, count, results:[{handle,path,lines,score,why,preview}], freshness, nextCursor?, pendingFiles?, related? }`
|
|
19
|
-
- `lines` is `"start-end"`; `why` is a comma-joined signal string; `preview` is a short highlighted snippet (empty when `snippet:"none"`). Use `handle` with `cl_expand`/`cl_save`. Pagination uses the top-level `nextCursor` (no per-result cursor).
|
|
18
|
+
- **Returns**: `{ indexId, query, count, results:[{handle,path,lines,score,why,preview,stale?}], freshness, nextCursor?, pendingFiles?, related? }`
|
|
19
|
+
- `lines` is `"start-end"`; `why` is a comma-joined signal string; `preview` is a short highlighted snippet (empty when `snippet:"none"`). Use `handle` with `cl_expand`/`cl_save`. Pagination uses the top-level `nextCursor` (no per-result cursor). If `stale:true`, read that file from disk (`cl_expand`/raw read) before relying on indexed content.
|
|
20
20
|
- **Use**: intent-level code discovery.
|
|
21
21
|
- **Identifier matching**: code identifiers are indexed with bounded subtokens (`validateSession` also matches `session`) in the match-only FTS text. Query expansion uses the same bounded splitter and preserves snippets/handles from stored chunk content.
|
|
22
22
|
- **`snippet` (preview verbosity)**: default is signature-first `headline` (richer `compact` for the top ~3 results), which keeps payloads small. `none` returns path+lines only (fetch with `cl_expand`); `compact`/`full` return larger code windows. Explicitly setting `snippet` applies that mode to all results.
|
|
23
23
|
- **`why` signals**: `fts|symbol|exact|graph|path|code` (exact = exact symbol-name match; path = query term in the file path). Ranking is deterministic with a stable tie-break.
|
|
24
24
|
- **Line-range format**: `cl_search` reports `lines` as a `"start-end"` string for compact display; `cl_map` and `cl_expand` use numeric `startLine`/`endLine` for programmatic use. This difference is intentional.
|
|
25
25
|
|
|
26
|
+
## cl_explore
|
|
27
|
+
- **Input**: `{ query: string, limit?: number=8, cursor?: string, contentType?: "code"|"prose", snippet?: "none"|"headline"|"compact"|"full", relatedDepth?: number=1 }`
|
|
28
|
+
- **Returns**: `{ indexId, query, count, files:[{path, stale?, results:[{handle,lines,score,why,preview,signature?,collapsed?,stale?}]}], related:[{sourcePath,path,edgeType,hops,confidence,stale?}], freshness, pendingFiles?, nextCursor? }`
|
|
29
|
+
- **Use**: broad orientation in one call — "how does X work?", "show the flow around Y", or surveying an unfamiliar area. It fuses `cl_search` + grouped previews + graph relationships; use `cl_search` when you only need to locate handles.
|
|
30
|
+
|
|
26
31
|
## cl_related
|
|
27
32
|
- **Input**: `{ path: string, types?: string[], depth?: number=2, direction?: "out"|"in"|"both" }`
|
|
28
|
-
- **Returns**: `{ indexId, results:[{handle,path,edgeType,hops,confidence}] }`
|
|
33
|
+
- **Returns**: `{ indexId, results:[{handle,path,edgeType,hops,confidence,stale?}], freshness?, pendingFiles? }`
|
|
29
34
|
- **Edge types**: `imports|imported_by|tests|calls|references|defines|exports|belongs_to` (TS/JS populate `calls`/`references` and resolve dynamic `import()`).
|
|
30
35
|
|
|
36
|
+
## cl_impact
|
|
37
|
+
- **Input**: `{ symbol?: string, path?: string, depth?: number=2, includeTests?: boolean=true }`
|
|
38
|
+
- **Returns**: `{ indexId, target?, candidates?, callers, callees, affectedFiles, affectedTests, depth, confidenceNote, freshness?, pendingFiles? }`
|
|
39
|
+
- **Use**: before changing shared code. Pass `symbol` plus `path` when possible; if a symbol is ambiguous, CodeLens returns `candidates` instead of guessing. Impact is edge-derived and includes confidence/hop counts; use `cl_expand` to inspect exact current code before editing.
|
|
40
|
+
|
|
31
41
|
## cl_map
|
|
32
42
|
- **Input**: `{ path?: string, limit?: number=50, all?: boolean }`
|
|
33
|
-
- **Returns**: `{ indexId, files:[{path, symbols:[{name,kind,signature,startLine,endLine,exported}]}], fileCount, truncated }`
|
|
43
|
+
- **Returns**: `{ indexId, files:[{path, stale?, symbols:[{name,kind,signature,startLine,endLine,exported}]}], fileCount, truncated, freshness?, pendingFiles? }`
|
|
34
44
|
- **Use**: outline / repo-map for orientation — per-file symbol signatures from the index (no file re-read). Defaults to exported symbols; pass `all:true` for everything. File-capped (default 50, max 200) with a `truncated` flag.
|
|
35
45
|
|
|
46
|
+
## Freshness and stale flags
|
|
47
|
+
Query tools perform a budget-bounded reconciliation before answering. If the response has `freshness:"partial"` and `pendingFiles > 0`, some changed files were not reindexed within the budget. Results/files with `stale:true` point at those known-stale paths; read them directly with `cl_expand` or a raw read before depending on indexed previews/edges.
|
|
48
|
+
|
|
36
49
|
## cl_expand
|
|
37
50
|
- **Input**: `{ path?: string, handle?: string, startLine?: number, endLine?: number, budget?: number=4000 }`
|
|
38
51
|
- **Returns**: `{ path, startLine, endLine, content, truncated, chars }`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fodx/codelens",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Local, branch-aware code search & relation graph. SQLite FTS5 + tree-sitter symbols + source-graph edges, exposed as an MCP server and CLI. No chat LLM required.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|