Land the #1624 approach by @danusha2345: re-serve source by default so subagents and compacted contexts never inherit stale already-sent pointers. Keep cross-call dedup available through explicit truthy CODEGRAPH_EXPLORE_DEDUP values for durable contexts. Preserve current Unreleased entries, credit the contribution, and align the MCP server guidance with the safe default. Validation on Linux / Node 22.23.2: - Reproduced default-on failure before the fix; default-off now passes. - Focused explore-cross-call-dedup suite: 26 passed. - TypeScript: npx tsc -p tsconfig.json --noEmit passed. Fixes #1620. (cherry picked from commit 63992facabbbcef2797167dcdd90695d3802b533) Co-authored-by: danusha2345 <ewidusoc498@gmail.com>
This commit is contained in:
co-authored by
danusha2345
parent
7be699cd91
commit
b8d46d13c7
@@ -68,16 +68,19 @@ export const EXPLORE_DEDUP = {
|
||||
MAX_SYMBOLS_IN_POINTER: 5,
|
||||
} as const;
|
||||
|
||||
const OFF = new Set(['0', 'false', 'off', 'no']);
|
||||
const ON = new Set(['1', 'true', 'on', 'yes']);
|
||||
|
||||
/**
|
||||
* Kill switch: `CODEGRAPH_EXPLORE_DEDUP=0` renders every call as if the session
|
||||
* had no history. Read per call (not memoized) so a test can toggle it.
|
||||
* Cross-call source suppression is opt-in. An MCP connection is not a reliable
|
||||
* conversation boundary: some hosts reuse it for subagents, and compaction can
|
||||
* discard source while keeping the connection alive (#1620). Without a host-
|
||||
* supplied context lifecycle, re-serving source is the only always-correct
|
||||
* default. Read per call (not memoized) so tests and launchers can toggle it.
|
||||
*/
|
||||
export function exploreDedupEnabled(): boolean {
|
||||
const raw = process.env.CODEGRAPH_EXPLORE_DEDUP;
|
||||
if (raw === undefined) return true;
|
||||
return !OFF.has(raw.trim().toLowerCase());
|
||||
if (raw === undefined) return false;
|
||||
return ON.has(raw.trim().toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -64,7 +64,7 @@ calls; a grep/read exploration is dozens.
|
||||
- **After editing, check the staleness banner.** When a tool response starts with "⚠️ Some files referenced below were edited since the last index sync…", the listed files are pending re-index — Read those specific files for accurate content. Every file NOT in that banner is fresh, so still trust codegraph. A different, rarer banner — "⚠️ CodeGraph auto-sync is DISABLED…" — means live watching stopped entirely (the whole index is frozen, not just a few files); until it's resolved, Read files directly to confirm anything that may have changed.
|
||||
- **A file flagged "⚠ changed on disk after the last index sync" drifted from its index** (most common on projects queried via \`projectPath\`, which have no live watcher). Codegraph never serves a possibly-mis-sliced body from such a file — it either shows the file's full CURRENT source (trust it as a Read) or omits the source with this flag. When the source was omitted, Read that specific file; line numbers referencing it elsewhere in the response may be shifted until that project's next sync. All unflagged files remain trustworthy.
|
||||
|
||||
- **"Already sent earlier in this conversation" is a pointer, not a gap.** When a file's section carries that line instead of (or above) its source, an earlier \`codegraph_explore\` in THIS conversation already returned those exact lines and the file has not changed since — so the copy already in your context is current and exact. Scroll back to it; don't re-fetch it and don't Read the file. The bytes it freed went into source you have not seen yet, elsewhere in the same response.
|
||||
- **Source is re-served on every call by default**, including for fresh subagents and after context compaction. Cross-call dedup requires \`CODEGRAPH_EXPLORE_DEDUP=1\` and is only suitable for hosts that guarantee one durable context per connection. With that opt-in, **"Already sent earlier in this conversation"** points to exact, unchanged source returned by an earlier \`codegraph_explore\` in that context. Use that copy; don't re-fetch it and don't Read the file. The bytes it freed went into source you have not seen yet, elsewhere in the same response.
|
||||
|
||||
## Limitations
|
||||
|
||||
|
||||
Reference in New Issue
Block a user