pi agent源码阅读之从前端入口分析AgentSession

发布时间:2026/10/3 7:38:30
pi agent源码阅读之从前端入口分析AgentSession 从“前端”角度看,这里的前端主要指interactive-mode、Print、RPC 等运行模式。它们本身不直接执行new AgentSession(),而是通过统一的AgentSessionRuntime创建和替换会话。一、用户启动程序后的创建链路1. CLI 入口识别运行模式文件:packages/coding-agent/src/cli.ts packages/coding-agent/src/main.ts:566CLI 启动后:cli.ts - main(process.argv.slice(2)) - parseArgs() - resolveAppMode()模式大致分为:--mode rpc - RPC 模式 --print / 非 TTY - Print 模式 其他 - Interactive 模式随后三种模式都进入统一的运行时创建流程:main() - createSessionManager() - 创建 createRuntime 工厂 - createAgentSessionRuntime() - 根据模式启动前端模式启动只是最后一步:InteractiveMode(runtime).run() runPrintMode(runtime) runRpcMode(runtime)因此,AgentSession在 UI 真正开始运行之前就已经创建完成。二、首先创建SessionManager文件:packages/coding-agent/src/main.ts:357-448main()先根据用户启动参数决定如何取得会话管理器:main() - createSessionManager() ├─ SessionManager.create() ├─ SessionManager.open() ├─ SessionManager.continueRecent() ├─ SessionManager.forkFrom() └─ SessionManager.inMemory()新建会话普通启动:pi通常执行:SessionManager.create(cwd, sessionDir)其内部创建一个新的SessionManager:SessionManager.create() - new SessionManager(...) - newSession()这里创建的是持久化会话记录对象,还不是AgentSession。无持久化启动pi --no-session使用:SessionManager.inMemory()它仍然有会话 ID、消息树和上下文,但不写入 JSONL 文件。恢复已有会话例如:pi --session path pi --resume pi --continue会调用:SessionManager.open() SessionManager.continueRecent()此时SessionManager会读取已有 JSONL 内容,并建立会话树和历史消息。三、创建AgentSessionServices文件:packages/coding-agent/src/core/agent-session-services.ts:135-193接下来,main()中的createRuntime工厂创建当前工作目录对应的服务集合:createAgentSessionServices() ├─ 确定 cwd ├─ 创建或复用 ModelRuntime ├─ 创建 SettingsManager ├─ 创建 DefaultResourceLoader ├─ 加载 extensions、skills、prompts ├─ 注册扩展 Provider ├─ 刷新模型状态 └─ 返回 AgentSessionServices返回对象大致包含:{cwd