篇章一 · 1.3
51 万行全景图
把 1902 个文件缩成一张图:先建立「这个系统由哪几块组成」的空间感,后面每一站深入一个模块,都能在这张图上找到位置。
不是 demo,是 工业级 Agent 系统
47 个字段的工具接口、10 个检查点的权限管线、15 步的初始化序列——每个数字都在说:这是一个为生产环境深思熟虑过的系统。先看规模,再看地图。
代码规模 · 1902 个 TypeScript 源文件
| 指标 | 数值 | 参照物 |
|---|---|---|
| 源码总量 | 33 MB约 51 万行 | 一本 500 页的书 ≈ 0.5MB,这是 60 本 |
| 最大文件 REPL.tsx | 875 KB | 主交互界面,一个文件顶一个小项目 |
| 第二 main.tsx | 785 KB | 命令解析枢纽(1.4 站拆它) |
| 第三 AgentTool.tsx | 228 KB | 子代理工具,6 种运行模式 |
| 目录数 | 约 200 个 | tools/ services/ utils/ skills/ … |
| 内置工具 | 30+ 种 | Bash/Edit/Grep/Agent/Skill/…(篇章三) |
| 内置 Agent | 6 种 | Explore/Plan/GP/…(篇章五) |
🎮 上手猜:三个巨型文件里,哪个最大?
反直觉吧——最大的不是逻辑中枢 main.tsx(785KB),而是界面 REPL.tsx(875KB)。终端 UI 要处理消息渲染、滚动、选中、折叠、进度……状态最密集的地方是「脸」,不是「脑」。AgentTool 228KB 只排第三。
技术栈 · 每一项都是「有理由的选型」
| 层级 | 选型 | 为什么值得注意 |
|---|---|---|
| 终端 UI | 自 fork 的 InkReact for CLI | React 组件模型跑在终端里,还改了源码 |
| 构建 | Bun bundler+ feature() 开关 | 编译期死代码消除,同一代码库出内外两版 |
| API 流式 | 手动 SSE放弃 BetaMessageStream | 避免 O(n²) 部分解析,自己攒增量 |
| 搜索 | 自带 ripgrep | 二进制随包分发,不依赖系统安装 |
| 沙箱 | sandbox-runtime | macOS sandbox-exec / Linux bubblewrap |
| 进程 | child_process + tmux | tmux 做多窗口分屏(Teammate 模式) |
| 协议 | MCP · JSON-over-stdio | 外接一切工具生态 |
| 校验 | Zod v4 | 贯穿全系统的运行时类型安全 |
记住这张图的阅读方式:竖着的是一次对话的数据流(你的输入从 REPL 一路流到 Anthropic API),横着的四大系统随时被管道调用。后面每一站都是在放大这张图的某一块。
👆 图上任何一个色块都能点——点了看它的职责和对应章节
本站要点:React 跑在终端里、一切皆是 AsyncGenerator、单一代码库六种形态——这三个决定塑造了后面的一切。下一站先进启动链路,看它如何把「51 万行的程序」压到毫秒级启动。