# 21. 二十个知识维度的源码索引
| 维度 | Claude Code 主入口 | Codex 主入口 | 面试抓手 |
|---|---|---|---|
| Harness | query.ts、toolOrchestration.ts | session/turn.rs、tools/router.rs | 六个平面与治理闭环 |
| Runtime | StreamingToolExecutor.ts | tasks/regular.rs、session/turn.rs | 状态机、取消、并发 |
| Multi-Agent | AgentTool/*、teammateMailbox.ts | agent/control/*、agent_communication.rs | 路由、Mailbox、任务所有权 |
| Agent Loop | query.ts | session/turn.rs | sample-act-observe-stop |
| Skill | SkillTool.ts、skills/* | ext/skills、skills.rs | 发现、加载、权限、版本 |
| MCP | services/mcp/client.ts | mcp_tool_call.rs、session/mcp.rs | 协议、路由、审批、边界 |
| 长期记忆 | extractMemories.ts | memories/* | 抽取、验证、索引、使用反馈 |
| 短期记忆 | Session Memory、Compact | ContextManager、TurnState | Working Memory 与证据窗口 |
| 上下文压缩 | services/compact/* | compact.rs | 触发、摘要、重注入、验证 |
| 上下文窗口 | token 预算与 Compact | session/context_window.rs | 预算、保留策略、缓存稳定性 |
| Prompt Engineering | Prompt 常量与 Tool prompt | prompt templates/spec | 指令层级、结构化输出 |
| Context Engineering | attachments、fork context | context_manager/*、WorldState | 来源、排序、去重、预算 |
| 交互体验 | Streaming executor、审批 UI | Protocol Event、TUI/App Server | 可见、可控、断线恢复 |
| Tool Use | toolExecution.ts | tools/* | 校验、Hook、权限、执行、结果 |
| Memory | Memory + Skill + Transcript | Memories + Rollout | 五类 Memory 与生命周期 |
| Planning | PlanMode、Task tools | Plan mode、update_plan | 执行产物、任务依赖图、审批、重新规划 |
| Session | sessionStorage.ts | session/*、rollout/* | Thread/Turn/Step、恢复、幂等 |
| 可观测 | utils/telemetry/* | otel/*、turn_timing.rs | Trace+Metric+Rollout+Eval |
| 权限 | utils/permissions/* | PermissionProfile、Approval | 委托、交集、Deny、可解释性 |
| 沙箱 | sandbox-adapter.ts | sandboxing/*、linux-sandbox/* | Policy 编译、OS enforcement |
# 21.1 如何用索引追踪端到端原理
索引不是“建议阅读的文件列表”,而是调用链起点。选择一个真实问题,例如“用户批准 Bash 后命令怎样执行并恢复”,先从 Loop 找到 ToolCall 创建点,再追 Router、参数规范化、Permission Decision、Sandbox backend、ToolResult、Rollout 和 UI Event;每跳记录输入类型、输出类型、稳定 ID、失败分支和所有者。若只读 permissions 目录,就无法验证批准的参数是否与沙箱执行参数相同。
推荐为每个维度画一张五列证据表:领域对象 | 创建/迁移点 | 持久化事实 | 强制边界 | 用户可见事件。例如 MCP Tool 的领域对象由连接快照创建,迁移点在 Tool Handler,持久化事实是调用及结果,强制边界是权限与远端认证,用户事件是进度/审批/终态。两套源码若对象名称不同,就比较不变量而不是强行一一对应。
源码演进后先用 rg 搜索类型和事件名,再重新确认相邻调用。文档中的行号只用于当前快照定位;面试真正应记住的是“哪一层拥有状态、哪一层实施约束、失败后从哪条持久化记录恢复”。
# 21.2 Claude Code:从产品入口到持久化与安全边界
阅读这张图时不要把箭头理解成唯一函数调用;它表示稳定职责链。最值得追踪的三个闭环是:ToolUse → ToolResult → 下一次 query、Session JSONL → Recovery → query、Permission Decision → Sandbox Execution → Audit Event。若某个实现改名,只要这三个闭环仍存在,整体原理就没有改变。
# 21.3 Codex:从 RegularTask 到 Tool Handler 与 Rollout
Codex 需要重点区分 History 与 Rollout:History 服务当前模型采样,可以裁剪和压缩;Rollout 服务恢复与回放,不能因为 Context 窗口不足而删除关键事件。源码追踪时可从 run_turn 分别沿“模型输入链、工具执行链、持久化链”向下阅读,再用相同的 turn_id/step_id/call_id 把三条链重新连接。