跳转至

17 · 源码地图、研究证据与边界

17.1 研究基线

官方 v1.0.0 commit a13d35a742c6ef8462812a28fbe1d8c8b7431c32,1848 个 Git tracked files。完整清单保存每个文件的路径、字节数、文本行数和 SHA-256。生成清单不等于对每个文件进行语义审核。

下载:版本证据、全部文件 JSON 清单、CSV 清单、main 与 1.0 差异、公开符号定位。

17.2 核心阅读顺序

ai/types 与 utils/transcript
→ agent/types
→ agent/agent.ts
→ agent/agent-loop.ts
→ coding-agent/core/sdk.ts
→ coding-agent/core/agent-session.ts 主干
→ session-manager 与 compaction
→ tools 与 resource-loader
→ extensions/mcp、codemode
→ TUI、RPC
→ durable、Chord、protocol(实验方向)

先看输入输出类型,再追执行顺序。搜索函数名只是定位;需要看前后条件、调用者和消费者,才能理解不变量。

17.3 28 个核心文件的完整逐行原文

这些页面包含固定版本全部原文,支持跳到行号与 #L123 链接。文件收录只是阅读辅助;右侧说明实际讲解覆盖。原作者许可保存在 MIT LICENSE。

文件 行数 原文 讲解覆盖
packages/ai/src/types.ts 1168 逐行原文 04:消息与provider compat契约;非全部模型类型审计
packages/ai/src/api/anthropic-messages.ts 1646 逐行原文 04/20:中途工具声明适配与版本差异;非全部provider分支审计
packages/coding-agent/src/core/compaction/compaction.ts 1119 逐行原文 07:usage估算、合法切点、split turn与摘要失败
packages/coding-agent/src/core/settings-manager.ts 1533 逐行原文 08/14:inMemory的项目trust默认与设置;非全部迁移审计
packages/coding-agent/src/core/nested-tool-calls.ts 261 逐行原文 09:嵌套授权、父调用归属和结果包装
packages/coding-agent/src/core/extensions/types.ts 2245 逐行原文 08:事件边界与mutable input;非全部公开类型逐句分析
packages/mcp/src/oauth/flow.ts 437 逐行原文 09:issuer条件、scope与授权流程;未真实认证E2E
packages/coding-agent/src/modes/rpc/rpc-mode.ts 819 逐行原文 10:JSONL响应disposition、事件和错误边界
packages/agent/src/agent.ts 613 逐行原文 05:状态、队列、取消和事件屏障
packages/agent/src/agent-loop.ts 940 逐行原文 05:完整主循环和工具执行管线
packages/agent/src/types.ts 529 逐行原文 04–05:公开契约与边界
packages/ai/src/index.ts 48 逐行原文 04:入口职责与导出
packages/ai/src/utils/transcript.ts 234 逐行原文 04:system 与工具声明重放
packages/ai/src/models.ts 1256 逐行原文 04:Models 和 Provider 契约;未逐分支审核所有模型操作
packages/coding-agent/src/core/sdk.ts 462 逐行原文 06:SDK 组装工厂
packages/coding-agent/src/core/agent-session.ts 4348 逐行原文 06:请求、事件、恢复主干;非全文件逐行审计
packages/coding-agent/src/core/session-manager.ts 2013 逐行原文 07:树、投影和追加存储;非所有格式迁移路径审计
packages/coding-agent/src/core/system-prompt.ts 216 逐行原文 08:prompt sections 和 diff
packages/coding-agent/src/core/resource-loader.ts 1275 逐行原文 08:资源发现、reload、信任主干;非所有 package 解析分支审计
packages/coding-agent/src/core/tools/read.ts 203 逐行原文 08:分页、截断、图片和取消
packages/coding-agent/src/core/tools/edit.ts 220 逐行原文 08:批量替换、行尾和队列
packages/coding-agent/src/core/tools/file-mutation-queue.ts 61 逐行原文 08:同文件排序
packages/coding-agent/src/core/tools/bash.ts 442 逐行原文 08:工具包装、输出、操作适配主干
packages/codemode/src/runtime/host.ts 361 逐行原文 09:worker 和能力边界;非全 VM 实现审计
packages/mcp/src/client.ts 615 逐行原文 09:独立 MCP client 契约;非所有协议分支审计
packages/tui/src/tui.ts 1493 逐行原文 10:Component 和共享 UI 抽象;非全终端行为审计
packages/protocol/src/framing.ts 151 逐行原文 10:帧契约浏览;非全部 CBOR 编解码审计
packages/durable/src/harness/tool.ts 488 逐行原文 11:工具意图与 replay 恢复路径

17.4 Monorepo package 地图

下表从各 package.json 自动读取,列的是 dependencies 中内部运行时依赖,不包含 devDependencies 或全部外部依赖。实验状态以 package 文档声明为准,不能只看版本号。

npm 名称 目录 版本 内部运行时依赖
@earendil-works/pi-agent-core agent 1.0.0 @earendil-works/pi-ai
@earendil-works/pi-ai ai 1.0.0 @earendil-works/pi-telemetry
@earendil-works/chord chord 1.0.0 无 Pi 运行时依赖
@earendil-works/pi-client client 1.0.0 @earendil-works/chord, @earendil-works/pi-protocol
@earendil-works/pi-codemode codemode 1.0.0 无 Pi 运行时依赖
@earendil-works/pi-coding-agent coding-agent 1.0.0 @earendil-works/chord, @earendil-works/pi-agent-core, @earendil-works/pi-ai, @earendil-works/pi-codemode, @earendil-works/pi-mcp, @earendil-works/pi-tui
@earendil-works/pi-durable durable 1.0.0 @earendil-works/chord, @earendil-works/pi-ai
@earendil-works/pi-evals evals 1.0.0 无 Pi 运行时依赖
@earendil-works/pi-mcp mcp 1.0.0 无 Pi 运行时依赖
@earendil-works/pi-protocol protocol 1.0.0 @earendil-works/chord
@earendil-works/pi-server server 1.0.0 @earendil-works/chord, @earendil-works/pi-protocol
@earendil-works/pi-telemetry telemetry 1.0.0 无 Pi 运行时依赖
@earendil-works/pi-tui tui 1.0.0 无 Pi 运行时依赖

17.5 本课程重点核对的不变量

不变量 证据 验证方式
完整消息后才执行工具 agent-loop + Agent awaited emit 代码精读与离线事件
参数校验失败不执行工具 prepareToolCall 契约测试
parallel 结果历史保持源顺序 executeToolCallsParallel 契约测试
sequential 工具影响整个批次 executeToolCalls 契约测试
SDK canonical history 来自 SessionManager prepareRequest projection SDK + Faux 测试
分支不删除原始历史 SessionManager append / branch 文件恢复测试
低层 agent_end 后仍可能恢复 AgentSession post-run 代码精读,非真实 provider 重试压测
project trust 不等于沙箱 security + resource loader 文档和源码核对
Code Mode 调用不回滚外部副作用 VM host 与 extension contract 代码/文档核对
Durable 重放依赖安全策略 ToolTask phases 意图与恢复分支精读

17.6 哪些没有完成整仓库逐行审核

没有宣称已逐行审查所有 provider adapters、OAuth 全路径、native TUI、图片处理、所有历史版本迁移、CBOR、Chord bundler、Durable 全调度器、完整测试套件和依赖源码。

对这些内容,课程采用公开接口、文档、代表实现和使用边界研究。选定核心主干做了按连续逻辑段的详细解释;大型 AgentSession 文件讲解主要请求与状态路径,没有把它的每个分支都称为已测试。

你要求「最好逐行研究」,本交付把核心执行链逐段精读、逐行浏览原文、文件证据与测试结合,而不以机械复述 1848 个文件代替理解。这个边界比虚假的「整仓库每行都懂了」更方便继续深入。

17.7 三条值得进一步研究的路径

模型协议路径:Models.prepareRequest → provider stream → provider payload transform → assistant stream normalization。结合你的实际 provider,研究工具声明和跨模型历史转换。

扩展执行路径:resource-loader → extension runtime/runner → AgentSession hook → nested calls。增加插件冲突、reload 与恢复案例。

持久任务路径:Harness → Task scheduler → transaction → ToolTask checkpoint → storage。重点测试进程崩溃、外部动作未知状态和任务迁移。

17.8 自己逐行读时的笔记模板

## 文件 / 函数 / 行范围

版本:
输入:
输出:
状态写入:
外部副作用:
必须成立的不变量:
正常路径:
错误 / 取消路径:
调用者:
消费者:
测试证据:
未确认的问题:

每行都应归到契约、状态、控制或副作用中的一个方面。真正有价值的逐行研究是理解这些联系,而不是给每行写「声明变量」「返回结果」。