@fodx/codelens 1.2.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 +15 -10
- package/adapters/pi/codelens.extension.ts +6 -3
- package/build/src/cli.js +7 -4
- package/build/src/cli.js.map +1 -1
- package/build/src/db/migrations.js +8 -0
- package/build/src/db/migrations.js.map +1 -1
- package/build/src/graph/edges.js +4 -11
- package/build/src/graph/edges.js.map +1 -1
- package/build/src/graph/grammars.js +12 -0
- package/build/src/graph/grammars.js.map +1 -1
- package/build/src/graph/symbols.js +4 -11
- package/build/src/graph/symbols.js.map +1 -1
- package/build/src/index/freshness.js +13 -0
- package/build/src/index/freshness.js.map +1 -1
- package/build/src/index/fts.js +205 -21
- package/build/src/index/fts.js.map +1 -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/search/identifiers.js +52 -0
- package/build/src/search/identifiers.js.map +1 -0
- package/build/src/search/query.js +13 -0
- package/build/src/search/query.js.map +1 -0
- package/build/src/search/snippet.js +2 -1
- package/build/src/search/snippet.js.map +1 -1
- package/build/src/server.js +1 -1
- package/build/src/server.js.map +1 -1
- 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 +86 -19
- package/build/src/tools/search.js.map +1 -1
- package/docs/agent-guide.md +27 -5
- package/docs/routing.md +12 -6
- package/docs/tools.md +19 -3
- package/package.json +3 -2
|
@@ -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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"}
|