CLI:终端只是一个宿主
从参数解析、运行模式、TUI streaming 到 project trust,理解 Pi 的 CLI-native 体验如何建立。
5bc1c2c0CLI-native 不等于只有命令行参数
Pi 把终端当作持续工作的操作台:一边显示模型增量,一边接受快捷键、命令、打断与补充消息。
main() 先根据参数与 TTY 状态选择 interactive/print/json/rpc,再共享创建 session runtime。不同 mode 消费相同事件,但输出契约不同。
resolveAppMode() 结合 --mode、stdinIsTTY、stdoutIsTTY;main() 处理 trust、session、resources、model,然后分派 mode。
四种宿主模式
| 模式 | 输入/输出 | 适合 |
|---|---|---|
| interactive | TUI + 键盘 | 人与 Agent 协作 |
| 一次 prompt + 文本 | shell 管道 | |
| json | JSONL event stream | 日志与轻量集成 |
| rpc | 双向 JSONL protocol | IDE/应用嵌入 |
关键不是提供四套 Agent,而是四种 adapter 共享 AgentSession。
packages/coding-agent/src/main.ts:100-120resolveAppMode()
Streaming UI
pi-tui 使用差分渲染:组件产生终端行,renderer 只更新变化区域。coding-agent 把 message_update、tool execution 和 session events 转换为消息块、spinner、status、overlay 等可见状态。
这种设计让 thinking delta、text delta 和 tool progress 能在同一交互中更新,而不必不断清屏打印完整历史。
输入也是运行时信号
- 普通输入:成为下一条 user message。
- 运行中输入:根据模式进入 steering 或 follow-up queue。
Esc/ abort:触发 abort signal。/command:由内建命令或 extension command 处理。!command:直接执行 shell,并可决定是否把结果送入 context。
Project Trust 的位置
Trust 判断发生在加载项目 resources 之前。交互模式默认可以询问;print/json/rpc 没有 UI,不会弹窗,而是根据 global default 或 --approve / --no-approve 决定。
这说明 trust 是 startup loading policy,不是 tool permission prompt。
packages/coding-agent/docs/security.md:5-35project trust + no sandbox
Trade-off
CLI 带来低延迟、可组合管道与开发环境亲和力,但终端宽度、键盘差异、颜色能力和非交互模式都会扩大测试矩阵。Pi 通过共享 session/runtime、分离 mode adapter 来控制复杂度。