深色模式
05 · pi-coding-agent — 交互式 Coding Agent CLI
包路径:
packages/coding-agent(registry 名@earendil-works/pi-coding-agent) 定位:把前面所有包组装成最终产品——一个可在终端交互、可脚本化(print/json)、可远程控制(RPC)、可被集成的 coding agent。源码 316 个文件,是体量最大、最该"先抓主干再展开"的包。 配套文档(45 篇,在docs/):how-pi-works.md(总览)、usage.md、cli.md、rpc.md、sdk.md、extensions.md、skills.md、prompt-templates.md、themes.md、packages.md、mcp.md、configuration.md等。
1. 目录结构与关键文件
| 目录 / 文件 | 作用 |
|---|---|
src/cli.ts src/main.ts src/config.ts src/index.ts src/migrations.ts src/rpc-entry.ts | 入口层:config.ts 解析包资源路径与安装方式;cli.ts/main.ts 是真正入口 |
src/cli/* | CLI 参数解析与启动:args.ts / auth-check.ts / auth-command.ts / project-trust.ts / session-picker.ts / setup.ts / startup-ui.ts / initial-message.ts / list-models.ts |
src/core/ | 核心编排(103 文件)——所有运行模式共享 |
src/modes/ | 运行模式(72 文件):interactive/(TUI 聊天 + components/*)、print-mode.ts、json-event.ts、rpc/* |
src/extensions/ | 内置扩展:codemode / llama / mcp / tool-search |
src/experimental/ | 实验特性(49 文件):durable / coordinator / services / vacation / plugins |
src/bun/* | Bun 运行时相关(sandbox env、quickjs wasm、runtime-setup) |
src/client/ | 客户端入口 |
src/utils/* | 工具函数(37 文件):git / image / clipboard / shell / syntax-highlight / version-check 等 |
2. 入口链路(先读这条)
(config.ts: 解析安装方式与资源路径)
→ cli/args.ts (解析 argv)
→ cli/setup.ts (首次设置 / 信任决策)
→ main.ts
→ core/index.ts (装配 AgentSession 等共享模块)
→ core/agent-session.ts (会话运行时核心)
→ modes/interactive/interactive-mode.ts (进入交互循环)1
2
3
4
5
6
7
2
3
4
5
6
7
src/config.ts(已读,重点)
不碰业务逻辑,只做"包资源路径解析"与"安装方式探测":
- 运行时探测:
isBunBinary/isBunRuntime/isBundledNode(区分 Bun 二进制、Bun、esbuild 打包的 Node、普通 Node)。 detectInstallMethod():从__dirname/execPath推断bun-binary/npm/pnpm/yarn/bun/unknown。getSelfUpdateCommand()/getUpdateInstruction():根据安装方式生成自更新命令(注意全局包管理检测isManagedByGlobalPackageManager)。- 资源路径:
getPackageDir/getThemesDir/getSessionsDir/getAuthPath/getSettingsPath/getDocsPath/getExamplesPath/getInteractiveAssetsDir/getQuickJSWasmPath(codemode 用的 QuickJS WASM)。 - 应用标识:
APP_NAME(默认pi)/CONFIG_DIR_NAME(默认.pi)/VERSION,以及PI_CODING_AGENT_DIR等环境变量。 - 重要约束(来自 AGENTS.md):
packages/coding-agent内解析包资源必须用config.ts的 helper,不要直接用__dirname——这些 helper 同时兼容源码 checkout、npm 安装、独立二进制三种形态。
3. src/core/ 主干(103 文件,挑重点)
| 文件 | 作用 |
|---|---|
core/index.ts | 跨模式共享模块导出(已读):AgentSession / AgentSessionRuntime / event-bus / extensions(defineTool / defineExtension / 各类 Extension* 类型)/ bash-executor / compaction / source-info |
core/agent-session.ts agent-session-runtime.ts agent-session-services.ts | 会话运行时核心(把 pi-agent-core 的 Agent 与 durable 的 Harness 接起来) |
core/settings-manager.ts settings-schema.ts settings-defaults.ts | 设置管理(JSON schema 驱动) |
core/model-registry.ts model-resolver.ts model-runtime.ts model-config.ts | 模型注册/解析/运行时/配置 |
core/skills.ts slash-commands.ts prompt-templates.ts resource-loader.ts | 技能 / 斜杠命令 / 提示词模板 / 资源加载 |
core/extensions/* | 扩展加载:loader.ts / runner.ts / jiti-loader.ts / types.ts / wrapper.ts / virtual-modules.ts |
core/tools/* | 内置工具:bash / edit / edit-diff / read / write / find / grep / ls + renderers/*(各工具的结果渲染) |
core/compaction/* | 压缩:compaction.ts / branch-summarization.ts / utils.ts |
core/trust-manager.ts project-trust.ts session-manager.ts | 信任 / 项目管理 / 会话管理 |
core/system-prompt.ts messages.ts mcp-servers.ts telemetry.ts event-bus.ts | 系统提示、消息、MCP 服务、遥测、事件总线 |
4. src/modes/ 模式
modes/interactive/:终端交互主模式。interactive-mode.ts是入口,tui-renderer.ts接pi-tui,components/*(60+ 文件)是各 UI 组件(消息、工具执行、模型选择器、会话选择器、主题等),theme/*是明暗主题。modes/print-mode.ts:跑一个 prompt,输出最终响应(脚本/CI 用)。modes/json-event.ts:把 agent 事件以 JSONL 写出(机器消费)。modes/rpc/*:rpc-mode.ts/rpc-client.ts/rpc-types.ts/jsonl.ts——从 stdin 收 JSONL 命令、向 stdout 写事件(远程控制 / SDK 后端)。
5. 内置扩展 src/extensions/
codemode/:用 QuickJS WASM 跑用户 codemode 脚本(worker.ts/execute.ts/tool.ts)。mcp/:接入 Model Context Protocol 服务器(runtime.ts/tools.ts/oauth.ts/cli.ts)。llama/:本地 llama.cpp 提供商与 UI。tool-search/:工具检索。
6. 实验特性 src/experimental/(49 文件)
durable/(基于 pi-durable 的持久化 agent)、coordinator/(多 agent 协调)、services/(服务化)、vacation/、plugins/。这些是前沿方向,理解主线后再看。
7. 阅读清单(建议顺序)
docs/how-pi-works.md+docs/usage.md—— 总览与日常用法。src/config.ts—— 资源/安装解析(已读)。src/cli/args.ts→src/main.ts→src/core/index.ts—— 启动装配。src/core/agent-session.ts+agent-session-runtime.ts—— 会话运行时(接pi-agent-core与pi-durable)。src/modes/interactive/interactive-mode.ts—— 交互主循环。- 横向:
core/tools/*(内置工具)、core/extensions/loader.ts(扩展加载)、core/compaction/compaction.ts(压缩)。 docs/sdk.md+docs/rpc.md—— 如何用 TS SDK / RPC 集成。 8.(实验)src/experimental/durable/*。
8. 自测
pi在终端输入一条消息,从main.ts到最终渲染,经过core/的哪些模块?config.ts为什么要区分 Bun 二进制 / npm / 源码 checkout?直接用__dirname会出什么问题?- 一个用户装的 Pi 扩展包,在
core/extensions/loader.ts眼里是什么?如何注册工具/命令/UI? - print / json / rpc 三种模式共用哪套 agent 机制?差异只在哪一层?