CHAPTER 12 · CALL PATH

從真實 main() 到第一輪採樣

實際入口位於 xai-grok-pager-bin/src/main.rs。同一個組合入口解析命令與交互模式,再把工作交給 TUI 或 Shell Agent 宿主。

課程目標
能準確説出四種運行分支,並沿 connect_or_spawnMvpAgentspawn_session_on_threadSessionActorSamplerActor 定位第一輪對話。
核心視覺 · 教學化調用圖
main()PagerArgs run_headlessagent headless run_stdio_agentACP stdio run_leaderleader 宿主 xai_grok_pager::app::run交互 TUI connect_or_spawn連接或啓動 leaderACP channels MvpAgent會話宿主 SessionActorturn loop ChatStateActorhistory SamplerActorstreaming
run_headless

Agent 無頭模式

grok agent headless 進入 Shell 提供的無頭宿主。

run_stdio_agent

Stdio Agent

通過 ACP stdio 收發請求,適合外部客户端驅動。

run_leader

Leader 進程

承載長生命週期 Agent,並通過連接通道服務客户端。

app::run

交互 TUI

預設交互分支進入 pager 應用,TUI 可經 leader 建立連接。

主軸交接
connect_or_spawn建立 leader 連接或按需啓動進程。
MvpAgent響應 ACP 請求並管理會話句柄。
spawn_session_on_thread為 Session 創建 OS 綫程。
SessionActor推進 turn loop,協調狀態和工具。
SamplerActor為請求創建流式採樣任務。
真實源碼證據
crates/codegen/xai-grok-pager-bin/src/main.rs
use xai_grok_shell::agent::app::{
  run_headless, run_leader, run_stdio_agent
};

let runtime = tokio::runtime::Builder
  ::new_multi_thread()
  .enable_all()
  .build()?;
crates/codegen/xai-grok-shell/src/session/acp_session_impl/spawn.rs
/// Spawn a session actor on a dedicated thread
/// with its own tokio runtime and `LocalSet`.
pub(crate) async fn spawn_session_on_thread(...) {
  let rt = tokio::runtime::Builder
    ::new_current_thread()
    .enable_all().build()?;
  let local = tokio::task::LocalSet::new();
}
源碼快照説明:本頁依據本地同步副本核對。該副本沒有 .git 元數據,因此不聲稱對應某個 commit 版本。
課堂練習

畫出一次交互請求的邊界

標註哪些節點屬於 xai-grok-pager-binxai-grok-pagerxai-grok-shellxai-grok-sampler。説明 TUI 和 Agent 宿主為何是兩個 crate。

Takeaway:真實入口是 xai-grok-pager-bin/src/main.rs。它負責分發模式,隨後由 pager 承擔介面、Shell 承擔 Agent 與 Session 宿主、Sampler 承擔模型請求。