@vizalice/codegraph 1.5.0 → 1.6.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 +25 -1
- package/dist/bin/codegraph.js +126 -24
- package/dist/bin/codegraph.js.map +1 -1
- package/dist/context/index.d.ts +12 -0
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +47 -8
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +23 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/queries.d.ts +39 -2
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +104 -19
- package/dist/db/queries.js.map +1 -1
- package/dist/directory.d.ts +29 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +52 -0
- package/dist/directory.js.map +1 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +38 -2
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +59 -0
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +175 -53
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/erlang.d.ts.map +1 -1
- package/dist/extraction/languages/erlang.js +58 -22
- package/dist/extraction/languages/erlang.js.map +1 -1
- package/dist/extraction/languages/rust.d.ts +20 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -1
- package/dist/extraction/languages/rust.js +44 -20
- package/dist/extraction/languages/rust.js.map +1 -1
- package/dist/extraction/parse-pool.d.ts +7 -0
- package/dist/extraction/parse-pool.d.ts.map +1 -1
- package/dist/extraction/parse-pool.js +20 -1
- package/dist/extraction/parse-pool.js.map +1 -1
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +66 -35
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +68 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +2 -2
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +4 -3
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/targets/codex.d.ts +22 -8
- package/dist/installer/targets/codex.d.ts.map +1 -1
- package/dist/installer/targets/codex.js +65 -48
- package/dist/installer/targets/codex.js.map +1 -1
- package/dist/installer/targets/types.d.ts +4 -4
- package/dist/mcp/daemon-manager.d.ts +1 -1
- package/dist/mcp/daemon-manager.d.ts.map +1 -1
- package/dist/mcp/daemon-manager.js +1 -1
- package/dist/mcp/daemon-manager.js.map +1 -1
- package/dist/mcp/daemon-paths.d.ts +6 -0
- package/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/dist/mcp/daemon-paths.js +54 -0
- package/dist/mcp/daemon-paths.js.map +1 -1
- package/dist/mcp/daemon-registry.d.ts +10 -0
- package/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/dist/mcp/daemon-registry.js +51 -3
- package/dist/mcp/daemon-registry.js.map +1 -1
- package/dist/mcp/daemon.d.ts +9 -6
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +10 -8
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/engine.d.ts +3 -0
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +45 -3
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/explore-diagnostics.d.ts +2 -0
- package/dist/mcp/explore-diagnostics.d.ts.map +1 -1
- package/dist/mcp/explore-diagnostics.js +3 -0
- package/dist/mcp/explore-diagnostics.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +17 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +17 -12
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +17 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +164 -25
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-config.d.ts +23 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +39 -2
- package/dist/project-config.js.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +2 -2
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +38 -10
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/swift.d.ts.map +1 -1
- package/dist/resolution/frameworks/swift.js +11 -1
- package/dist/resolution/frameworks/swift.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +16 -1
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +5 -1
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/name-matcher.d.ts +30 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +278 -0
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/path-aliases.d.ts +6 -4
- package/dist/resolution/path-aliases.d.ts.map +1 -1
- package/dist/resolution/path-aliases.js +125 -17
- package/dist/resolution/path-aliases.js.map +1 -1
- package/dist/search/identifier-segments.d.ts +10 -0
- package/dist/search/identifier-segments.d.ts.map +1 -1
- package/dist/search/identifier-segments.js +29 -0
- package/dist/search/identifier-segments.js.map +1 -1
- package/dist/search/query-paths.d.ts +57 -0
- package/dist/search/query-paths.d.ts.map +1 -0
- package/dist/search/query-paths.js +298 -0
- package/dist/search/query-paths.js.map +1 -0
- package/dist/search/query-utils.d.ts +1 -1
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +12 -3
- package/dist/search/query-utils.js.map +1 -1
- package/dist/sync/watcher.d.ts +22 -0
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +51 -5
- package/dist/sync/watcher.js.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/mcp/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCH,wDAMC;AAzCD,2CAA6B;AAC7B,2CAAgG;AAEhG,mCAAgC;AAChC,+DAA+F;AAC/F,uCAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts
CHANGED
|
@@ -236,6 +236,13 @@ export interface ExploreAllocationCandidate {
|
|
|
236
236
|
worth: number;
|
|
237
237
|
/** Carries a symbol on the rendered flow spine. */
|
|
238
238
|
spine: boolean;
|
|
239
|
+
/**
|
|
240
|
+
* The query named this file by PATH (see query-paths.ts). Pinned files are
|
|
241
|
+
* never cliffed or trimmed, and weigh at least as much as the strongest
|
|
242
|
+
* candidate — the agent asked for the file itself, so starving it on text/
|
|
243
|
+
* graph scores (which a pure-path query doesn't produce) defeats the ask.
|
|
244
|
+
*/
|
|
245
|
+
pinned?: boolean;
|
|
239
246
|
}
|
|
240
247
|
export interface ExploreAllocation {
|
|
241
248
|
/** path → chars of source it may render. Only holds admitted files. */
|
|
@@ -375,6 +382,8 @@ export declare class ToolHandler {
|
|
|
375
382
|
private cg;
|
|
376
383
|
private projectCache;
|
|
377
384
|
private defaultProjectHint;
|
|
385
|
+
private knownSubprojects;
|
|
386
|
+
private knownSubprojectsBase;
|
|
378
387
|
private worktreeMismatchCache;
|
|
379
388
|
private catchUpGate;
|
|
380
389
|
private queryPool;
|
|
@@ -413,6 +422,14 @@ export declare class ToolHandler {
|
|
|
413
422
|
* Used only to make the "no default project" error actionable.
|
|
414
423
|
*/
|
|
415
424
|
setDefaultProjectHint(searchedPath: string): void;
|
|
425
|
+
/**
|
|
426
|
+
* Engine-only: record the indexed sub-projects the workspace down-scan saw
|
|
427
|
+
* when it could not adopt a default project (#1606/#1607). An empty list
|
|
428
|
+
* clears any previous note.
|
|
429
|
+
*/
|
|
430
|
+
setKnownSubprojects(roots: string[], base: string): void;
|
|
431
|
+
/** One message line naming the indexed sub-projects, or '' when none known. */
|
|
432
|
+
private formatKnownSubprojects;
|
|
416
433
|
/**
|
|
417
434
|
* Whether a default CodeGraph instance is available
|
|
418
435
|
*/
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,SAAS,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAe9C,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,cAAc,UAAU,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAE9F;AAOD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -33,6 +33,7 @@ function __setLoadCodeGraphForTests(cls) {
|
|
|
33
33
|
}
|
|
34
34
|
const worktree_1 = require("../sync/worktree");
|
|
35
35
|
const query_utils_1 = require("../search/query-utils");
|
|
36
|
+
const query_paths_1 = require("../search/query-paths");
|
|
36
37
|
const fs_1 = require("fs");
|
|
37
38
|
const crypto_1 = require("crypto");
|
|
38
39
|
const utils_1 = require("../utils");
|
|
@@ -96,9 +97,14 @@ const RUST_PATH_PREFIXES = new Set(['crate', 'super', 'self']);
|
|
|
96
97
|
const CONTAINER_NODE_KINDS = new Set([
|
|
97
98
|
'class', 'struct', 'union', 'interface', 'trait', 'protocol', 'enum', 'namespace', 'module',
|
|
98
99
|
]);
|
|
99
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Last `::` / `.` / `/`-separated segment of a qualified symbol. An Erlang
|
|
102
|
+
* arity tail (`mod::fn/3`, `fn/3`) is stripped first — the useful last segment
|
|
103
|
+
* is the function name, never the digits (#1610).
|
|
104
|
+
*/
|
|
100
105
|
function lastQualifierPart(symbol) {
|
|
101
|
-
const
|
|
106
|
+
const noArity = symbol.replace(/\/\d{1,3}$/, '') || symbol;
|
|
107
|
+
const parts = noArity.split(/::|[./]/).filter((p) => p.length > 0);
|
|
102
108
|
return parts[parts.length - 1] ?? symbol;
|
|
103
109
|
}
|
|
104
110
|
/**
|
|
@@ -561,7 +567,16 @@ function allocateExploreBudget(candidates, budget, maxFiles) {
|
|
|
561
567
|
const w = Math.max(0, c.score) * Math.max(0, Math.min(1, c.worth)) * (c.spine ? A.SPINE_WEIGHT_BOOST : 1);
|
|
562
568
|
return Number.isFinite(w) ? w : 0;
|
|
563
569
|
};
|
|
564
|
-
|
|
570
|
+
// Pinned files weigh at least as much as the strongest raw candidate: their
|
|
571
|
+
// score is whatever the stripped query happened to match (for a pure-path
|
|
572
|
+
// query, nearly nothing), and a proportional split on that would fund the
|
|
573
|
+
// named file worst of all. Floor of 1 covers the all-pinned/zero-score case.
|
|
574
|
+
const rawWeights = new Map(candidates.map((c) => [c.path, weightOf(c)]));
|
|
575
|
+
const topRaw = Math.max(...rawWeights.values());
|
|
576
|
+
const weights = new Map(candidates.map((c) => [
|
|
577
|
+
c.path,
|
|
578
|
+
c.pinned ? Math.max(rawWeights.get(c.path) ?? 0, topRaw, 1) : (rawWeights.get(c.path) ?? 0),
|
|
579
|
+
]));
|
|
565
580
|
const topWeight = Math.max(...weights.values());
|
|
566
581
|
if (!(topWeight > 0))
|
|
567
582
|
return empty;
|
|
@@ -571,7 +586,7 @@ function allocateExploreBudget(candidates, budget, maxFiles) {
|
|
|
571
586
|
const cliffed = [];
|
|
572
587
|
let admitted = [];
|
|
573
588
|
for (const c of candidates) {
|
|
574
|
-
if (!c.spine && (weights.get(c.path) ?? 0) < cliffAt)
|
|
589
|
+
if (!c.spine && !c.pinned && (weights.get(c.path) ?? 0) < cliffAt)
|
|
575
590
|
cliffed.push(c.path);
|
|
576
591
|
else
|
|
577
592
|
admitted.push(c);
|
|
@@ -593,7 +608,7 @@ function allocateExploreBudget(candidates, budget, maxFiles) {
|
|
|
593
608
|
const byWeight = [...admitted].sort((a, b) => (weights.get(b.path) ?? 0) - (weights.get(a.path) ?? 0));
|
|
594
609
|
const keep = new Set(byWeight.slice(0, affordable).map((c) => c.path));
|
|
595
610
|
for (const c of admitted)
|
|
596
|
-
if (c.spine)
|
|
611
|
+
if (c.spine || c.pinned)
|
|
597
612
|
keep.add(c.path);
|
|
598
613
|
for (const c of admitted)
|
|
599
614
|
if (!keep.has(c.path))
|
|
@@ -1103,6 +1118,13 @@ class ToolHandler {
|
|
|
1103
1118
|
// The directory the server last searched for a default project. Surfaced in
|
|
1104
1119
|
// the "not initialized" error so users can see why detection missed.
|
|
1105
1120
|
defaultProjectHint = null;
|
|
1121
|
+
// Indexed sub-projects the engine's bounded down-scan saw below the search
|
|
1122
|
+
// base when no default project resolved (#1607). Listed in the "not
|
|
1123
|
+
// initialized" error so the fact is reachable through the protocol, not just
|
|
1124
|
+
// the host's stderr capture. Engine-maintained (initial resolve + throttled
|
|
1125
|
+
// retry) — tool calls themselves never scan.
|
|
1126
|
+
knownSubprojects = [];
|
|
1127
|
+
knownSubprojectsBase = null;
|
|
1106
1128
|
// Per-start-path cache of the git worktree/index mismatch (issue #155). The
|
|
1107
1129
|
// mismatch is a fixed property of (where the request came from → which
|
|
1108
1130
|
// .codegraph/ it resolves to), so the up-to-two `git rev-parse` spawns run
|
|
@@ -1198,6 +1220,24 @@ class ToolHandler {
|
|
|
1198
1220
|
setDefaultProjectHint(searchedPath) {
|
|
1199
1221
|
this.defaultProjectHint = searchedPath;
|
|
1200
1222
|
}
|
|
1223
|
+
/**
|
|
1224
|
+
* Engine-only: record the indexed sub-projects the workspace down-scan saw
|
|
1225
|
+
* when it could not adopt a default project (#1606/#1607). An empty list
|
|
1226
|
+
* clears any previous note.
|
|
1227
|
+
*/
|
|
1228
|
+
setKnownSubprojects(roots, base) {
|
|
1229
|
+
this.knownSubprojects = roots;
|
|
1230
|
+
this.knownSubprojectsBase = base;
|
|
1231
|
+
}
|
|
1232
|
+
/** One message line naming the indexed sub-projects, or '' when none known. */
|
|
1233
|
+
formatKnownSubprojects() {
|
|
1234
|
+
if (this.knownSubprojects.length === 0)
|
|
1235
|
+
return '';
|
|
1236
|
+
const base = this.knownSubprojectsBase;
|
|
1237
|
+
const rels = this.knownSubprojects.map((r) => (base ? (0, path_1.relative)(base, r) || '.' : r));
|
|
1238
|
+
return (`Indexed sub-projects were found below it: ${rels.join(', ')} — ` +
|
|
1239
|
+
'pass one of them (absolute, or resolved against that directory) as projectPath.\n');
|
|
1240
|
+
}
|
|
1201
1241
|
/**
|
|
1202
1242
|
* Whether a default CodeGraph instance is available
|
|
1203
1243
|
*/
|
|
@@ -1315,6 +1355,7 @@ class ToolHandler {
|
|
|
1315
1355
|
const searched = this.defaultProjectHint ?? process.cwd();
|
|
1316
1356
|
throw new NotIndexedError('No CodeGraph project is loaded for this session.\n' +
|
|
1317
1357
|
`Searched for a .codegraph/ directory starting from: ${searched}\n` +
|
|
1358
|
+
this.formatKnownSubprojects() +
|
|
1318
1359
|
'Either the server root has no index of its own (e.g. a monorepo where only ' +
|
|
1319
1360
|
"sub-projects are indexed), or the MCP client launched the server outside your " +
|
|
1320
1361
|
'project without reporting the workspace root. Either way, target the project ' +
|
|
@@ -3059,6 +3100,30 @@ class ToolHandler {
|
|
|
3059
3100
|
budget = getExploreOutputBudget(Infinity);
|
|
3060
3101
|
}
|
|
3061
3102
|
const maxFiles = (0, utils_1.clamp)(args.maxFiles || budget.defaultMaxFiles, 1, 20);
|
|
3103
|
+
// File paths named in the query become PINNED files: guaranteed admission,
|
|
3104
|
+
// top of the rank order, funded first — and their span is REMOVED from the
|
|
3105
|
+
// matching query. Runs on the RAW query (normalizeQuerySpelling strips
|
|
3106
|
+
// `/digits` tails, which would mangle numeric path segments). Without this,
|
|
3107
|
+
// a SvelteKit path like `runs/[runId]/+page.svelte` was shredded by the
|
|
3108
|
+
// seeding tokenizer (splits on brackets → `runId` seeded as a "named
|
|
3109
|
+
// symbol") and by FTS (`page`/`runs` fragments admitted every sibling
|
|
3110
|
+
// `+page.svelte`), starving the very files the agent asked for.
|
|
3111
|
+
let pinnedFiles = [];
|
|
3112
|
+
let unresolvedPathSpans = [];
|
|
3113
|
+
let matchQuery = query;
|
|
3114
|
+
if ((0, query_paths_1.queryMightContainPaths)(rawQuery)) {
|
|
3115
|
+
try {
|
|
3116
|
+
const extraction = (0, query_paths_1.extractQueryPaths)(rawQuery, cg.getFiles().map((f) => f.path), { maxPins: maxFiles });
|
|
3117
|
+
if (extraction.pinnedFiles.length > 0 || extraction.unresolvedPathSpans.length > 0) {
|
|
3118
|
+
pinnedFiles = extraction.pinnedFiles;
|
|
3119
|
+
unresolvedPathSpans = extraction.unresolvedPathSpans;
|
|
3120
|
+
matchQuery = normalizeQuerySpelling(extraction.strippedQuery);
|
|
3121
|
+
}
|
|
3122
|
+
}
|
|
3123
|
+
catch { /* path pinning must never fail an explore call */ }
|
|
3124
|
+
}
|
|
3125
|
+
const pinnedSet = new Set(pinnedFiles);
|
|
3126
|
+
const pinnedOrder = new Map(pinnedFiles.map((p, i) => [p, i]));
|
|
3062
3127
|
// Per-file allocation diagnostic (CG-4). `null` unless CODEGRAPH_EXPLORE_DEBUG
|
|
3063
3128
|
// is set — every `diag?.` below is then a no-op and the response is
|
|
3064
3129
|
// byte-identical. It only OBSERVES: it must never feed back into rendering.
|
|
@@ -3105,15 +3170,38 @@ class ToolHandler {
|
|
|
3105
3170
|
// Use a large maxNodes budget — explore has its own 35k char output limit
|
|
3106
3171
|
// that prevents context bloat, so more nodes just means better coverage
|
|
3107
3172
|
// across entry points (especially for large files like Svelte components).
|
|
3108
|
-
|
|
3173
|
+
// Matching runs on the path-stripped query; `query` stays for display.
|
|
3174
|
+
const subgraph = await cg.findRelevantContext(matchQuery, {
|
|
3109
3175
|
searchLimit: 8,
|
|
3110
3176
|
traversalDepth: 3,
|
|
3111
3177
|
maxNodes: 200,
|
|
3112
3178
|
minScore: 0.2,
|
|
3113
3179
|
});
|
|
3180
|
+
// Pinned files' symbols enter the gather unconditionally — the agent named
|
|
3181
|
+
// the file itself, so its contents ARE the answer regardless of what the
|
|
3182
|
+
// stripped query text matched (which, for a pure-path query, is nothing).
|
|
3183
|
+
const PINNED_FILE_NODE_CAP = 300;
|
|
3184
|
+
for (const fp of pinnedFiles) {
|
|
3185
|
+
let fileNodes = [];
|
|
3186
|
+
try {
|
|
3187
|
+
fileNodes = cg.getNodesInFile(fp);
|
|
3188
|
+
}
|
|
3189
|
+
catch {
|
|
3190
|
+
continue;
|
|
3191
|
+
}
|
|
3192
|
+
fileNodes
|
|
3193
|
+
.filter((n) => n.kind !== 'file' && n.kind !== 'import' && n.kind !== 'export')
|
|
3194
|
+
.sort((a, b) => a.startLine - b.startLine)
|
|
3195
|
+
.slice(0, PINNED_FILE_NODE_CAP)
|
|
3196
|
+
.forEach((n) => { if (!subgraph.nodes.has(n.id))
|
|
3197
|
+
subgraph.nodes.set(n.id, n); });
|
|
3198
|
+
}
|
|
3114
3199
|
if (subgraph.nodes.size === 0) {
|
|
3115
3200
|
diag?.finishEmpty('no relevant code found — empty subgraph');
|
|
3116
|
-
const
|
|
3201
|
+
const missNote = unresolvedPathSpans.length > 0
|
|
3202
|
+
? ` (no indexed file uniquely matches ${unresolvedPathSpans.map((s) => `\`${s}\``).join(', ')})`
|
|
3203
|
+
: '';
|
|
3204
|
+
const empty = `No relevant code found for "${query}"${missNote}`;
|
|
3117
3205
|
// Still an explore call, so it is still recorded: an empty answer spends a
|
|
3118
3206
|
// call against the tier budget even though it emits no source.
|
|
3119
3207
|
return this.exploreResult(empty, {
|
|
@@ -3180,6 +3268,13 @@ class ToolHandler {
|
|
|
3180
3268
|
{
|
|
3181
3269
|
const FILE_EXT = /\.(?:java|kt|kts|ts|tsx|js|jsx|mjs|cjs|cs|py|go|rb|php|swift|rs|cpp|cc|cxx|c|h|hpp|scala|lua|dart|vue|svelte|astro|erl|hrl)$/i;
|
|
3182
3270
|
const CALLABLE = new Set(['method', 'function', 'component', 'constructor']);
|
|
3271
|
+
// Variables/constants seed too: in Svelte/React a `$state` variable
|
|
3272
|
+
// (`chatAtBottom`, `feedAtBottom`) is exactly the kind of symbol an agent
|
|
3273
|
+
// names in a query, and the exact-name search channel already returns
|
|
3274
|
+
// them — only this seeding tier was callable-only. The NL-stopword guard
|
|
3275
|
+
// below applies unchanged, so bare English words still can't seed a
|
|
3276
|
+
// same-named local. Callables keep priority via the body-size sort.
|
|
3277
|
+
const SEEDABLE = new Set([...CALLABLE, 'variable', 'constant']);
|
|
3183
3278
|
const isTestPath = (p) => /(^|\/)(tests?|specs?|__tests__|testdata|mocks?|fixtures?)\//i.test(p) || /\.(test|spec)\.[a-z]+$/i.test(p);
|
|
3184
3279
|
const bodyLines = (n) => Math.max(0, (n.endLine ?? n.startLine) - n.startLine);
|
|
3185
3280
|
const callerCount = (n) => { try {
|
|
@@ -3188,7 +3283,7 @@ class ToolHandler {
|
|
|
3188
3283
|
catch {
|
|
3189
3284
|
return 0;
|
|
3190
3285
|
} };
|
|
3191
|
-
const tokens = [...new Set(
|
|
3286
|
+
const tokens = [...new Set(matchQuery.split(/[\s,()[\]]+/)
|
|
3192
3287
|
.map((t) => t.replace(FILE_EXT, '').trim())
|
|
3193
3288
|
.filter((t) => t.length >= 3 && /^[A-Za-z_$][\w$]*(?:(?:::|\.)[\w$]+)*$/.test(t)))].slice(0, 16);
|
|
3194
3289
|
// PascalCase tokens in the query are type/file disambiguators — when the
|
|
@@ -3261,24 +3356,26 @@ class ToolHandler {
|
|
|
3261
3356
|
}
|
|
3262
3357
|
}
|
|
3263
3358
|
let cands = raw
|
|
3264
|
-
.filter((n) =>
|
|
3359
|
+
.filter((n) => SEEDABLE.has(n.kind) && !isTestPath(n.filePath))
|
|
3265
3360
|
.sort((a, b) => (bodyLines(b) > 1 ? 1 : 0) - (bodyLines(a) > 1 ? 1 : 0) || bodyLines(b) - bodyLines(a));
|
|
3266
3361
|
// Field-name seeding fallback (#1196): a camelCase token that names NO
|
|
3267
3362
|
// definition of its own is usually an object-literal key / API field
|
|
3268
3363
|
// (`profileInfo`) — no node exists, so it contributed zero seeds and
|
|
3269
3364
|
// the files that DEFINE it (`getProfileInfoV2` in profileController)
|
|
3270
|
-
// never surfaced. Seed its camel-infix definers instead:
|
|
3271
|
-
//
|
|
3365
|
+
// never surfaced. Seed its camel-infix definers instead: seedable
|
|
3366
|
+
// symbols (callables + variables — `atBottom` must reach the `$state`
|
|
3367
|
+
// variables `feedAtBottom`/`chatAtBottom`) whose name contains the
|
|
3368
|
+
// token at a hump boundary or as a prefix.
|
|
3272
3369
|
// Exact-empty + camel-shaped only (bare words keep the NL-stopword
|
|
3273
3370
|
// guard below), shortest-first, capped so a hot infix can't flood.
|
|
3274
3371
|
if (cands.length === 0 && !isQual && /[a-z][A-Z]/.test(t)) {
|
|
3275
3372
|
const lcToken = t.toLowerCase();
|
|
3276
3373
|
cands = cg
|
|
3277
3374
|
.getNodesByNameSubstring(t, {
|
|
3278
|
-
kinds: ['function', 'method', 'component'],
|
|
3375
|
+
kinds: ['function', 'method', 'component', 'variable', 'constant'],
|
|
3279
3376
|
limit: 60,
|
|
3280
3377
|
})
|
|
3281
|
-
.filter((n) =>
|
|
3378
|
+
.filter((n) => SEEDABLE.has(n.kind) && !isTestPath(n.filePath))
|
|
3282
3379
|
.filter((n) => {
|
|
3283
3380
|
const idx = n.name.toLowerCase().indexOf(lcToken);
|
|
3284
3381
|
if (idx < 0)
|
|
@@ -3473,8 +3570,9 @@ class ToolHandler {
|
|
|
3473
3570
|
}
|
|
3474
3571
|
fileGroups.set(node.filePath, group);
|
|
3475
3572
|
}
|
|
3476
|
-
// Extract query terms for relevance checking
|
|
3477
|
-
|
|
3573
|
+
// Extract query terms for relevance checking (path-stripped: a pinned
|
|
3574
|
+
// file's own path fragments must not count as "term hits" everywhere)
|
|
3575
|
+
const queryTerms = matchQuery.toLowerCase().split(/\s+/).filter(t => t.length >= 3);
|
|
3478
3576
|
// Test/spec/icon/i18n file detector — used by the pre-floor hard filter, the
|
|
3479
3577
|
// rank penalty, and the comparator deprioritization.
|
|
3480
3578
|
//
|
|
@@ -3552,9 +3650,10 @@ class ToolHandler {
|
|
|
3552
3650
|
// keep-minimum then pulled two test files back in as the "spread".
|
|
3553
3651
|
let candidateFiles = [...fileGroups.entries()];
|
|
3554
3652
|
{
|
|
3555
|
-
const queryMentionsTests = /\b(test|tests|testing|spec|verify|verifies)\b/i.test(
|
|
3653
|
+
const queryMentionsTests = /\b(test|tests|testing|spec|verify|verifies)\b/i.test(matchQuery);
|
|
3556
3654
|
if (!queryMentionsTests) {
|
|
3557
|
-
|
|
3655
|
+
// A pinned file is exempt: naming a test file by path IS asking for it.
|
|
3656
|
+
const nonLow = candidateFiles.filter(([p]) => !isLowValue(p) || pinnedSet.has(p));
|
|
3558
3657
|
if (nonLow.length >= 2) {
|
|
3559
3658
|
candidateFiles = nonLow;
|
|
3560
3659
|
}
|
|
@@ -3565,7 +3664,7 @@ class ToolHandler {
|
|
|
3565
3664
|
// best file's score and why that fraction is clamped at both ends.
|
|
3566
3665
|
const topScore = Math.max(0, ...candidateFiles.map(([, g]) => g.score));
|
|
3567
3666
|
const scoreFloor = Math.max(SCORE_FLOOR_ABSOLUTE, Math.min(SCORE_FLOOR_MAX, topScore * SCORE_FLOOR_FRACTION_OF_TOP));
|
|
3568
|
-
let relevantFiles = candidateFiles.filter(([, group]) => group.score >= scoreFloor);
|
|
3667
|
+
let relevantFiles = candidateFiles.filter(([fp, group]) => group.score >= scoreFloor || pinnedSet.has(fp));
|
|
3569
3668
|
if (relevantFiles.length < SCORE_FLOOR_KEEP_MIN) {
|
|
3570
3669
|
// Backfill from what the RELATIVE floor cut, best first, at two strengths:
|
|
3571
3670
|
//
|
|
@@ -3580,8 +3679,10 @@ class ToolHandler {
|
|
|
3580
3679
|
// worst outcome on the board — the agent falls straight back to grep.
|
|
3581
3680
|
const minEvidence = relevantFiles.length === 0 ? Number.EPSILON : SCORE_FLOOR_ABSOLUTE;
|
|
3582
3681
|
relevantFiles = candidateFiles
|
|
3583
|
-
.filter(([, group]) => group.score >= minEvidence)
|
|
3584
|
-
.sort((a, b) => b[
|
|
3682
|
+
.filter(([fp, group]) => group.score >= minEvidence || pinnedSet.has(fp))
|
|
3683
|
+
.sort((a, b) => (pinnedSet.has(b[0]) ? 1 : 0) - (pinnedSet.has(a[0]) ? 1 : 0)
|
|
3684
|
+
|| b[1].score - a[1].score
|
|
3685
|
+
|| b[1].nodes.length - a[1].nodes.length)
|
|
3585
3686
|
.slice(0, Math.max(SCORE_FLOOR_KEEP_MIN, relevantFiles.length));
|
|
3586
3687
|
}
|
|
3587
3688
|
diag?.setScoreFloor(scoreFloor, relevantFiles.length);
|
|
@@ -3683,7 +3784,8 @@ class ToolHandler {
|
|
|
3683
3784
|
// dropped, so the budget never fills with incidental files. Guarded so it
|
|
3684
3785
|
// never prunes below 2.
|
|
3685
3786
|
if (maxGraph > 0) {
|
|
3686
|
-
const gated = relevantFiles.filter(([fp]) =>
|
|
3787
|
+
const gated = relevantFiles.filter(([fp]) => pinnedSet.has(fp)
|
|
3788
|
+
|| (fileGraphScore.get(fp) ?? 0) >= maxGraph * 0.06
|
|
3687
3789
|
|| centralFiles.has(fp)
|
|
3688
3790
|
|| entryFiles.has(fp)
|
|
3689
3791
|
|| changeSurfaceFiles.has(fp)
|
|
@@ -3737,7 +3839,16 @@ class ToolHandler {
|
|
|
3737
3839
|
const sortedFiles = relevantFiles.sort((a, b) => {
|
|
3738
3840
|
const aPath = a[0].toLowerCase();
|
|
3739
3841
|
const bPath = b[0].toLowerCase();
|
|
3740
|
-
//
|
|
3842
|
+
// Pinned files first of all — the agent named the FILE by path, which is
|
|
3843
|
+
// even more explicit than naming a symbol in it. Among pins, keep the
|
|
3844
|
+
// order they appeared in the query.
|
|
3845
|
+
const aPin = pinnedSet.has(a[0]) ? 1 : 0;
|
|
3846
|
+
const bPin = pinnedSet.has(b[0]) ? 1 : 0;
|
|
3847
|
+
if (aPin !== bPin)
|
|
3848
|
+
return bPin - aPin;
|
|
3849
|
+
if (aPin && bPin)
|
|
3850
|
+
return (pinnedOrder.get(a[0]) ?? 0) - (pinnedOrder.get(b[0]) ?? 0);
|
|
3851
|
+
// Agent-named files next (it asked for a symbol defined here by name).
|
|
3741
3852
|
const aNamed = namedSeedFiles.has(a[0]) ? 1 : 0;
|
|
3742
3853
|
const bNamed = namedSeedFiles.has(b[0]) ? 1 : 0;
|
|
3743
3854
|
if (aNamed !== bNamed)
|
|
@@ -3833,7 +3944,7 @@ class ToolHandler {
|
|
|
3833
3944
|
// Compute the flow spine once — used both to prepend the Flow section (below)
|
|
3834
3945
|
// and to gate adaptive source sizing: files on the spine get full source,
|
|
3835
3946
|
// off-spine peers skeletonize.
|
|
3836
|
-
const flow = this.buildFlowFromNamedSymbols(cg,
|
|
3947
|
+
const flow = this.buildFlowFromNamedSymbols(cg, matchQuery);
|
|
3837
3948
|
// Snapshot every ranked candidate's scoring inputs, in final sort order, so
|
|
3838
3949
|
// the diagnostic can show what each file's share of the envelope was BOUGHT
|
|
3839
3950
|
// with (score, graph mass, term hits, flags) — not just what it cost.
|
|
@@ -3854,6 +3965,7 @@ class ToolHandler {
|
|
|
3854
3965
|
graphScore: fileGraphScore.get(fp) ?? 0,
|
|
3855
3966
|
termHits: fileTermHits.get(fp) ?? 0,
|
|
3856
3967
|
nodes: group.nodes.length,
|
|
3968
|
+
pinned: pinnedSet.has(fp),
|
|
3857
3969
|
named: namedSeedFiles.has(fp),
|
|
3858
3970
|
central: centralFiles.has(fp),
|
|
3859
3971
|
entry: entryFiles.has(fp),
|
|
@@ -3872,8 +3984,11 @@ class ToolHandler {
|
|
|
3872
3984
|
const allocation = allocateExploreBudget(sortedFiles.map(([fp, group]) => ({
|
|
3873
3985
|
path: fp,
|
|
3874
3986
|
score: group.score,
|
|
3875
|
-
worth
|
|
3987
|
+
// A pinned file's bytes are worth full price by definition — the agent
|
|
3988
|
+
// asked for the file itself, generated/test or not.
|
|
3989
|
+
worth: pinnedSet.has(fp) ? 1 : rankPenalty(fp),
|
|
3876
3990
|
spine: group.nodes.some((n) => flow.pathNodeIds.has(n.id)),
|
|
3991
|
+
pinned: pinnedSet.has(fp),
|
|
3877
3992
|
})), budget, maxFiles);
|
|
3878
3993
|
diag?.setAllocation(allocation.allowances, allocation.cliffed, allocation.cliffAt, allocation.pool);
|
|
3879
3994
|
// Cliffed files ship as pointers — path, symbols, line numbers — so the agent
|
|
@@ -5548,9 +5663,19 @@ class ToolHandler {
|
|
|
5548
5663
|
return sum;
|
|
5549
5664
|
return sum + new Set(g.nodes.filter((n) => n.kind !== 'import' && n.kind !== 'export').map((n) => n.id)).size;
|
|
5550
5665
|
}, 0);
|
|
5551
|
-
|
|
5666
|
+
let summaryLine = survivors.length > 0
|
|
5552
5667
|
? `Found ${shownSymbols} symbol${shownSymbols === 1 ? '' : 's'} across ${survivors.length} file${survivors.length === 1 ? '' : 's'}.`
|
|
5553
5668
|
: `Found ${subgraph.nodes.size} symbol${subgraph.nodes.size === 1 ? '' : 's'} across ${fileGroups.size} file${fileGroups.size === 1 ? '' : 's'}.`;
|
|
5669
|
+
// Path pinning is visible, not silent: say which query-named files were
|
|
5670
|
+
// honored, and which path spans matched nothing so the agent can correct
|
|
5671
|
+
// them instead of trusting a response that quietly ignored the path.
|
|
5672
|
+
const pinnedShown = pinnedFiles.filter((fp) => survivors.includes(fp)).length;
|
|
5673
|
+
if (pinnedShown > 0) {
|
|
5674
|
+
summaryLine += ` ${pinnedShown} file${pinnedShown === 1 ? '' : 's'} pinned from the query.`;
|
|
5675
|
+
}
|
|
5676
|
+
if (unresolvedPathSpans.length > 0) {
|
|
5677
|
+
summaryLine += ` No indexed file uniquely matches ${unresolvedPathSpans.map((s) => `\`${s}\``).join(', ')}.`;
|
|
5678
|
+
}
|
|
5554
5679
|
finalText = finalText.replace(SUMMARY_SENTINEL, summaryLine);
|
|
5555
5680
|
// Emit the allocation diagnostic from the FINAL text, so per-file bytes and
|
|
5556
5681
|
// shares account for the hard-ceiling truncation above (CG-4).
|
|
@@ -6240,6 +6365,20 @@ class ToolHandler {
|
|
|
6240
6365
|
* Python — `stage_apply::run` matches a `run` in `stage_apply.rs`)
|
|
6241
6366
|
*/
|
|
6242
6367
|
matchesSymbol(node, symbol) {
|
|
6368
|
+
// Erlang arity spelling (`fn/3`, `mod:fn/3` → normalized `mod.fn/3`): when
|
|
6369
|
+
// the node's qualifiedName carries an arity (`mod::fn/3`, #1610), the
|
|
6370
|
+
// written arity must match it exactly; the remaining comparison then runs
|
|
6371
|
+
// on the arity-less spelling. A node with no arity in its qualifiedName
|
|
6372
|
+
// keeps the original symbol (a `/` there means a path-ish name instead).
|
|
6373
|
+
const aritySpelling = /^(.+)\/(\d{1,3})$/.exec(symbol);
|
|
6374
|
+
if (aritySpelling) {
|
|
6375
|
+
const nodeArity = /\/(\d{1,3})$/.exec(node.qualifiedName ?? '')?.[1];
|
|
6376
|
+
if (nodeArity !== undefined) {
|
|
6377
|
+
if (nodeArity !== aritySpelling[2])
|
|
6378
|
+
return false;
|
|
6379
|
+
symbol = aritySpelling[1];
|
|
6380
|
+
}
|
|
6381
|
+
}
|
|
6243
6382
|
// Simple name match
|
|
6244
6383
|
if (node.name === symbol)
|
|
6245
6384
|
return true;
|