src/extraction — 抽取層

ExtractionOrchestrator + per-language extractors + Rust kernel 對照
檔案:src/extraction/(約 40 檔)· codegraph-kernel/src/(Rust,~30 檔)

大方向

抽取層把「原始碼 → AST → nodes/edges」。引擎有兩條:Rust kernelcodegraph-kernel/,20 語言原生編譯,逐位元組驗證對齊)與可攜引擎(純 TS,處理剩餘語言與 per-file fallback)。ExtractionOrchestrator 是 TS 側的調度器。parse-worker.ts 把重解析丟到主執行緒外。


1. 調度器

ExtractionOrchestrator src/extraction/index.tsindexAll / indexFiles / indexFile / sync 的抽取側主幹。

職責:掃描工作樹 → 依語言分派 → 調用 kernel 或 TS extractor → 寫 nodes/edges 進 DB → 記錄變動。方法:indexAll(全量)、indexFiles(指定檔)、indexFile(單檔)、sync(增量)。它不管「解析出來的引用怎麼連起來」——那是 resolver 的事,orchestrator 只負責「解析並存」。changedFilePaths 提供 git fast path 給 sync 用。

parse-worker / store-worker src/extraction/重解析與儲存 offload 到 worker。

大 repo 的解析與寫庫都搬到 worker thread,避免阻塞 event loop;fresh-DB 的 store-writer offload(store-writer.ts)是 fresh-DB only——有舊資料時 store 路徑要讀(existing-file checks、cross-file edge snapshots)與刪,必須留在單執行緒。

2. 語言 extractors

languages/*.ts src/extraction/languages/一語言一檔:typescript.ts、python.ts、go.ts、rust.ts、c-cpp.ts…(約 27 檔)。

每個檔案定義該語言的節點/邊抽取規則。TS 側的 extractor 是可攜引擎(用 web-tree-sitter wasm)。Rust kernel 側的對應實作在 codegraph-kernel/src/*.rs——兩者產出的圖必須逐位元組一致(這是每個語言出貨前的驗證門檻)。

教學重點:新增語言 = 加一個 languages/xxx.ts + kernel 側 xxx.rs + grammars 註冊。這是「20 語言」與「30+ 語言」的差別由來。
獨立 extractor src/extraction/非 tree-sitter 格式:Svelte / Vue / Astro / Liquid / DFM。

svelte-extractor.tsvue-extractor.tsastro-extractor.tsliquid-extractor.tsdfm-extractor.ts(Delphi form)。這些模板/格式不能用純 tree-sitter 直接抽,需要先拆出 script 區段或特殊節點。

3. Rust kernel(codegraph-kernel/)

kernel/src/*.rs codegraph-kernel/src/原生解析引擎:一個語言一檔(python.rs、go.rs、rustlang.rs、csharp.rs…)。

kernel 是編譯進的 native code:tree-sitter grammar 編進 binary,一個檔案只跨界一次。透過 loader/decode/layout(src/extraction/kernel/)與 TS 側交換資料。逐位元組驗證:每個語言先在真實 repo(小函式庫到 Linux kernel)上證明與參考引擎產出一致才出貨。平台沒有 prebuilt binary 或語法錯誤時自動 per-file 回退到可攜引擎,圖一樣。

教學重點:Rust 不參與「解析成什麼」,只負責「快」;「解析成什麼」的規格同時存在 TS 與 Rust 兩邊,靠驗證保證一致。查 graphify 掃描結果時能看到 kernel-src/ 的 Rust 檔也在圖裡(例如 kernel-src/csharp.rs 的 Walker 結構)。

4. 相關工具

generated-detection / extraction-version src/extraction/generated 檔偵測 + 引擎版本戳記。

generated-detection.ts:用 // Code generated by … DO NOT EDIT. 這類 banner(不限檔名)辨識 generated 檔,讓它不佔 explore 的答案空間。extraction-version.ts:stamp 引擎抽取版本,codegraph status / upgrade 用它建議「引擎更新後 re-index」。

看完這頁你應該能說出:雙引擎架構(Rust kernel + 可攜)與「逐位元組驗證」的出貨門檻、orchestrator 與 resolver 的職責切分、新增語言的檔案對應、以及 generated 偵測對 explore 答案品質的影響。