src/extraction/(約 40 檔)· codegraph-kernel/src/(Rust,~30 檔)抽取層把「原始碼 → AST → nodes/edges」。引擎有兩條:Rust kernel(codegraph-kernel/,20 語言原生編譯,逐位元組驗證對齊)與可攜引擎(純 TS,處理剩餘語言與 per-file fallback)。ExtractionOrchestrator 是 TS 側的調度器。parse-worker.ts 把重解析丟到主執行緒外。
職責:掃描工作樹 → 依語言分派 → 調用 kernel 或 TS extractor → 寫 nodes/edges 進 DB → 記錄變動。方法:indexAll(全量)、indexFiles(指定檔)、indexFile(單檔)、sync(增量)。它不管「解析出來的引用怎麼連起來」——那是 resolver 的事,orchestrator 只負責「解析並存」。changedFilePaths 提供 git fast path 給 sync 用。
大 repo 的解析與寫庫都搬到 worker thread,避免阻塞 event loop;fresh-DB 的 store-writer offload(store-writer.ts)是 fresh-DB only——有舊資料時 store 路徑要讀(existing-file checks、cross-file edge snapshots)與刪,必須留在單執行緒。
每個檔案定義該語言的節點/邊抽取規則。TS 側的 extractor 是可攜引擎(用 web-tree-sitter wasm)。Rust kernel 側的對應實作在 codegraph-kernel/src/*.rs——兩者產出的圖必須逐位元組一致(這是每個語言出貨前的驗證門檻)。
languages/xxx.ts + kernel 側 xxx.rs + grammars 註冊。這是「20 語言」與「30+ 語言」的差別由來。svelte-extractor.ts、vue-extractor.ts、astro-extractor.ts、liquid-extractor.ts、dfm-extractor.ts(Delphi form)。這些模板/格式不能用純 tree-sitter 直接抽,需要先拆出 script 區段或特殊節點。
kernel 是編譯進的 native code:tree-sitter grammar 編進 binary,一個檔案只跨界一次。透過 loader/decode/layout(src/extraction/kernel/)與 TS 側交換資料。逐位元組驗證:每個語言先在真實 repo(小函式庫到 Linux kernel)上證明與參考引擎產出一致才出貨。平台沒有 prebuilt binary 或語法錯誤時自動 per-file 回退到可攜引擎,圖一樣。
kernel-src/csharp.rs 的 Walker 結構)。generated-detection.ts:用 // Code generated by … DO NOT EDIT. 這類 banner(不限檔名)辨識 generated 檔,讓它不佔 explore 的答案空間。extraction-version.ts:stamp 引擎抽取版本,codegraph status / upgrade 用它建議「引擎更新後 re-index」。