Claude Code 源码深度剖析:Agent 架构、安全模型与上下文压缩机制
2026/6/30 1:31:03 网站建设 项目流程

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 源码分析,所有结论均来自对源代码的逆向研究。文中涉及的架构设计、安全模型等分析仅供技术学习参考。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询