src/context — 上下文層

把圖變成「給 AI 讀的上下文」——markdown / JSON
檔案:src/context/ · buildContext 的資料來源

大方向

圖查完之後,要把「相關符號的原始碼 + 關係」組裝成 agent 直接能用的格式。ContextBuilder 負責這件事:buildContext(task, { maxNodes, includeCode, format }) 用任務描述挑相關節點、抓逐位元組原始碼、附上關係說明,輸出 markdown 或 JSON。這是 codegraph explore 的核心——「一次呼叫,surgical context」的組裝點。


ContextBuilder.buildContext src/context/任務 → 相關節點 → 原始碼 + 關係 → markdown/JSON。

流程:1) 用 GraphQueryManager 找相關候選(依關鍵字/檔案/符號);2) 用 GraphTraverser 帶出之間的呼叫路徑與 blast radius;3) 抓原始碼(從磁碟重讀、逐行編號、逐位元組對齊——不是摘要);4) 依 format 組出 markdown 或 JSON。組完的「相關符號原始碼依檔案分組 + call path + blast-radius 摘要」就是 explore 回傳的形狀。

教學重點:「verbatim, current on-disk source」不是行銷話——它真的在每次呼叫時重讀磁碟,並在檔案變過時切到「整檔顯示」或「拒絕切片」模式(見 changelog #1474),確保不會回傳錯誤切片。
ranking / ranking 修正 src/context/ + search/決定「哪些符號算相關」——專案名降權、generated/ambient 檔降權。

ranking 決定 explore 品質。幾個刻意修正:專案名 token 降權(它命名整個 repo 不是符號);generated 檔、ambient .d.ts(declares Body/Message 這類常見名)在「行為問題」時排名降低——避免只宣告常見名、沒有 handler 的檔霸佔答案。實作分佈在 src/context/rankingsrc/search/query-utils.ts

explore dedup src/mcp/(explore 側)同一對話已回過的原始碼,改回傳 pointer 不重送。

Unreleased:codegraph_explore 不再重送本對話已給過的原始碼——已顯示的檔案回傳 path + symbols + 行範圍 pointer(附「檔案沒變」確認),省下的空間給沒看過的程式;若檔案在期間被編輯過則永遠整檔重顯。用 CODEGRAPH_EXPLORE_DEDUP=0 可關。這是「一坨 dense payload 留在窗口」vs「逐個小結果被逐出」取捨的調校(見 benchmarks)。

看完這頁你應該能說出:buildContext 的三段流程、為什麼輸出是「verbatim 重讀磁碟」而非摘要、ranking 的兩個刻意修正、以及 explore dedup 背後的 token 取捨。