Skip to content

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。

Powered by VitePress