Claude Code 源码深度剖析:Agent 架构、安全模型与上下文压缩机制
前言
Claude Code 是 Anthropic 推出的 AI 编程助手 CLI 工具。本文基于对其 v2.1.88+ 版本 sourcemap 源码的研究,从 **Agent 架构设计**、**BashTool 安全模型**、**上下文压缩策略** 和 **任务进度优化** 四个维度,深入剖析其核心设计哲学与实现细节。
---
一、Agent Tool:多层子代理架构
1.1 核心定位
Agent Tool 解决了 AI 编程助手中一个关键问题:**如何将复杂任务分解给专业子 Agent 处理,同时保持主会话上下文的复用?**
核心需求包括:
- **任务分解**:将复杂任务分派给 Explore、Plan 等专业子 Agent
- **资源隔离**:子 Agent 的工具权限、文件系统修改不干扰主 Agent
- **上下文复用**:子 Agent 复用主会话的对话历史和系统提示,避免重复 Token 消耗
- **生命周期管理**:支持同步(阻塞等待)和异步(后台运行)两种模式
1.2 五层分层架构
Agent Tool 采用清晰的分层设计:
| 层级 | 组件 | 职责 |
|------|------|------|
| **接口层** |
AgentTool.tsx| Zod Schema 定义、路由分发、UI 渲染 || **执行层** |
runAgent.ts| Agent 生命周期管理、Query 调用、上下文构建 || **资源层** |
loadAgentsDir.ts| Agent 定义解析、Frontmatter 验证、插件加载 || **工具层** |
agentToolUtils.ts| 工具过滤、结果格式化、异步进度追踪 || **配置层** |
builtInAgents.ts| 内置 Agent 注册表 |1.3 三种执行路径
Agent Tool 支持三条执行路径:
1. **Fork 路径**(无
subagent_type):克隆当前上下文,使用占位符工具结果,轻量快速2. **Subagent 路径**(显式指定类型):完整生命周期,MCP 初始化,支持所有 Agent 类型(Explore、Plan、code-reviewer 等)
3. **Teammate 路径**(
team_name + name):tmux/进程隔离,终端共享,适用于协作场景1.4 解耦策略
通过三种方式实现解耦:
- **类型驱动**:`AgentDefinition` 联合类型统一接口
- **上下文解耦**:父子 Agent 通过 `toolUseContext` 传递状态,子 Agent 拥有独立的 `getAppState`
- **清理解耦**:资源清理在 `finally` 块执行,不依赖调用方主动释放
---
二、BashTool:纵深防御的安全模型
2.1 核心挑战
BashTool 是 Claude Code 执行 Shell 命令的唯一通道,它解决的核心问题是:**如何在给予 AI 强大 Shell 执行能力的同时,保障用户系统的安全性和隐私性?**
这是一个多维度的安全博弈:
| 维度 | 需求 | 矛盾 |
|------|------|------|
| 功能性 | AI 需要能执行任意命令 | 任意命令 = 任意破坏 |
| 安全性 | 防止恶意执行和数据泄露 | 限制太多 → AI 无法工作 |
| 可用性 | 不能每次都弹窗确认 | 不确认 → 风险敞口 |
| 可审计性 | 用户需要知道发生了什么 | 透明 vs 复杂安全机制 |
2.2 六层纵深防御
BashTool 的设计哲学是 **"纵深防御"**,而非依赖单一银弹:
接入层 → 权限层 → 安全层 → 执行层 → 隔离层 → OS 层#### 权限层(Permission Resolution)
- 用户授权检查
- 规则匹配(精确/前缀/通配符三级匹配)
- 分类器判断(AI 分类危险命令)
#### 安全层(Security Validation)
使用 **Tree-sitter AST 解析** 对命令进行语义分析:
- `parseCommandRaw()` → 解析为 AST
- `parseForSecurityFromAst()` → 语义分析
- `checkSemantics()` → 危险模式检测
检测范围包括:路径约束、sed 安全检测、cd + git 组合检测、复合命令分段检测、命令注入检测。
#### 隔离层(Sandbox)
- Linux:bwrap(Bubblewrap)沙箱
- Namespace 隔离
- Syscall 过滤
2.3 完整请求流程
一个典型 Bash 命令的执行经历六个阶段:
1. **请求入口**:工具查找 → Zod 验证 → 业务规则验证 → 预测性分类
2. **Pre-Tool Hooks**:收集日志、权限决策、可修改输入或终止执行
3. **权限决策**:Tree-sitter 解析 → 规则匹配 → 分类器 → 路径约束 → 特殊检测 → 产出 PermissionResult
4. **权限分发**:
deny(返回错误)→ask(弹窗确认)→allow(继续执行)→passthrough(需要更多上下文)5. **工具执行**:沙箱判断 → LocalShellTask 执行(进程创建、流处理、超时控制、后台任务支持)
6. **Post-Tool Hooks**:通知、审计、遥测事件记录、OTel span 结束
---
三、上下文压缩:四层流水线
3.1 整体架构
Claude Code 的上下文管理系统由四层压缩流水线构成,按以下顺序执行:
SnipCompact(快速截断)→ MicroCompact(消息分组)→ Context Collapse(上下文折叠)→ AutoCompact(自动摘要)3.2 SnipCompact(快速截断)
**特点**:无 API 调用,即时本地执行。
- 移除完全重复的用户/助手消息
- 截断超长工具输出(>100 字符保留前 100)
- 删除空消息
- 合并连续相似的助手消息
3.3 MicroCompact(消息分组)
两种触发模式:
**时间衰减触发**:当距离上次 Assistant 消息超过阈值(默认 60 分钟),清除旧工具结果,保留最近 N 条。
**缓存编辑触发**:使用 Claude API 的
cache_edits功能,对可压缩的工具类型(文件读取、Shell、Grep、Glob 等)进行智能清理。3.4 AutoCompact(自动摘要)
当 Token 计数超过阈值时:
1. 创建摘要请求
2. 调用 Claude API 生成摘要
3. 如果遇到 PTL 错误,截断头部重试
4. 产出带边界标记的摘要消息
3.5 Context Collapse(上下文折叠)
将多轮对话消息折叠为更紧凑的表示,减少 Token 占用,同时保留关键信息。
3.6 电路断路器机制
当上下文压缩出现问题时,电路断路器会自动切断压缩流程,防止过度压缩导致信息丢失。配合 GrowthBook 配置系统,可以动态调整各层参数。
---
四、TaskProgressAdvisor:从轮次驱动到事件驱动
4.1 原有问题分析
在分析 TaskProgressAdvisor(任务进度提醒系统)时,发现了以下关键问题:
| 问题 | 严重程度 | 原因 |
|------|----------|------|
| exec_rounds 是累计值 | 🔴 高 | 计算的是"对话轮次"而非"未推进任务的轮数" |
| 提醒重复注入 | 🔴 高 | 无冷却机制,每轮对话都注入 |
| 注入位置错误 | 🟡 中 | 注入到系统 Prompt 而非对话历史 |
| 缺少任务活性检测 | 🟡 中 | 产生大量噪声提醒 |
4.2 优化方案(事件驱动模式)
推荐方案是从 **"基于轮次触发"** 改为 **"基于状态变化检测"**:
**原设计(轮次驱动)**:
messages.size() / 2 >= 3 → 触发提醒**新设计(事件驱动)**:
task.updatedAt() 未变 && messagesSinceUpdate >= 3 → 触发提醒关键改进点:
1. **基于任务更新时间**:只统计"任务更新之后"的消息轮次
2. **引入冷却机制**:5 分钟冷却窗口,避免重复提醒
3. **任务活性检测**:5 分钟内有更新的任务认为是活跃的,不触发提醒
4. **硬性上限**:50 轮对话上限,防止无限循环
---
五、总结与思考
设计哲学
Claude Code 的架构设计体现了几个核心原则:
1. **纵深防御**:不依赖单一安全机制,多层防护形成合力
2. **渐进式降级**:权限决策从自动允许到询问用户到直接拒绝,逐步降级
3. **事件驱动优于轮询**:上下文压缩和任务进度提醒都体现了从轮询到事件驱动的转变
4. **解耦优先**:通过类型系统、上下文传递、策略模式实现高度解耦
值得学习的模式
- **Agent Tool 的分层架构**:接口/执行/资源/工具/配置五层分离
- **BashTool 的权限系统**:AST 语义分析 + 规则匹配 + AI 分类的三重检测
- **上下文压缩的四层流水线**:不同粒度的压缩策略形成互补
- **Spring AI Advisor 的链式处理**:可插拔的请求拦截模式
---
> 本文基于 Claude Code v2.1.88+ sourcemap 源码分析,所有结论均来自对源代码的逆向研究。文中涉及的架构设计、安全模型等分析仅供技术学习参考。