Pi 核心入口 & 启动流程
CLI 入口
Pi 的 CLI 在 packages/coding-agent/src/cli.ts,使用 Yargs 构建命令行。
typescript
// 简化的入口结构
yargs(hideBin(process.argv))
.command('chat', '交互式聊天模式', chatCommand)
.command('prompt', '单次 prompt 模式', promptCommand)
.command('rpc', 'RPC 服务模式', rpcCommand)
.command('orchestrate', '多 agent 编排', orchestrateCommand)
.parse()核心启动流程
cli.ts
↓
main.ts::main()
↓
1. SettingsManager.init() — 加载 .pirc / 环境变量
2. ModelRegistry.init() — 注册可用的 AI provider
3. ResourceLoader.init() — 加载 skills/resources/extensions
4. SessionManager.init() — 恢复/创建 session
5. createAgentSessionRuntime() — 构建 agent runtime
├─ AI.create(provider)
├─ createCodingAgent(systemPrompt)
├─ AgentSession.create(sessionDir)
└─ AgentSessionRuntime(agent, session, extensions)
↓
6. 进入 CLI 模式
├─ InteractiveMode (TUI)
├─ PrintMode (STDOUT 输出)
├─ JsonMode (JSON 输出)
└─ RpcMode (JSON-RPC)AgentSessionRuntime
typescript
class AgentSessionRuntime {
constructor(
public agent: CodingAgent,
public session: AgentSession,
public extensions: Extension[],
public ui: UIInterface,
public mode: OutputMode
) {}
async run(userInput: string): Promise<void> {
// 1. 恢复 session 历史
// 2. 构建 message context
// 3. 调用 agent.loop()
// 4. 持久化 session
}
}核心对象关系
CLI
↓ 创建
AgentSessionRuntime
├─ agent: CodingAgent
│ ├─ agentCore: Agent (from packages/agent)
│ │ └─ loop()
│ └─ tools: Tool[]
│
├─ session: AgentSession
│ └─ {current, children}[]
│ (JSONL tree)
│
└─ extensions: Extension[]
└─ onPreToolCall / onPostToolCall / ...关键设计:AgentSessionRuntime 是 CLI 层的胶水,它不深入 agent loop,只负责编排 resource → session → agent → UI。