我把 Claude Code 源码扒了个底朝天,发现了一些不该公开的东西
深入分析 Claude Code 内部架构,权限系统、子代理机制、上下文压缩策略,以及那些官方从未公开的功能。
我把 Claude Code 源码扒了个底朝天,发现了一些不该公开的东西
你以为它只是个 AI 聊天工具?Too young。
前两天把 Claude Code 的源码翻了个遍。
说实话,之前我也觉得这就是个”能聊天的终端工具”,装完能用就行。但看完之后我的感受就一个:这玩意儿比想象中复杂得多。
不卖关子,直接上干货。
权限系统:三层防护
Claude Code 的权限系统不是我之前想的”问一下->同意/拒绝”这么单薄。它是三层嵌套的:
第一层 denyRules(直接拒绝):危险操作直接拦截,连弹窗都没有。比如删库、格式化磁盘这类操作,配置里直接写死,碰到就死。
第二层 allowRules(直接放行):安全操作直接通过。比如读取文件、执行测试这类操作,设置白名单,命中就放行,不再问你。
第三层 alwaysAskRules(每次都要问):既没被禁止也没被允许的操作,弹出确认框让你决定。
每层规则还带来源标记,区分这条规则是来自配置文件、工作目录的 settings.json,还是 SDK 调用方设置的。调试的时候能看清楚规则从哪来的。
还有一个字段值得注意:shouldAvoidPermissionPrompts。这个字段标记为”在后台 agent 上使用,不能弹 UI”。
这就解释了为什么 Claude Code 开启子代理时,你不会收到一堆权限弹窗。
子代理在后台运行,弹窗无处显示,它要么自动放行要么自动拒绝,不会等你操作。
Hooks:可编程的基础
很多人把 Hooks 当成边缘功能,但我看完源码觉得这就是 Claude Code 可编程性的基础。
Hooks 允许你在特定事件发生时自动触发 shell 命令或脚本。事件包括:工具执行前、工具执行后、Claude 打算停止时、API 返回之后。
关键是:用户在 settings.json 里配置的 shell hooks,和内部的 function hooks 走完全相同的触发机制。
不存在内置行为优先、用户 hook 降级的情况。
这意味着你能用 hooks 实现的事情,理论上和 Anthropic 工程师能实现的一样多。
子代理:不是简单的”再开一个对话”
Claude Code 有个子代理功能,可以让主实例启动几个子代理并行处理不同子任务。
但它不是简单的”再开一个对话”。子代理有独立权限上下文、隔离文件状态、可并发执行。
几个关键点:
-
内置 agent 是可配置的。Explore、Plan 等 agent 定义是动态的,不是写死的。 -
Fork 模式下子代理有隔离的文件状态。两个子代理并行运行时,它们看到的”哪些文件被修改过”是相互隔离的。 -
Coordinator 模式还在开发中,是一套为多代理协作设计的架构,目前还没对外开放。
子代理的权限继承父代理设置,但有一个重要限制:shouldAvoidPermissionPrompts 自动为 true。
所以子代理遇到权限问题时不会停下来等你确认,会直接按规则自动处理。
上下文压缩:对话太长怎么办
Claude 的上下文窗口是有限制的。一次复杂编程任务可能涉及大量文件读取、代码修改、命令执行,对话会越来越长。
Claude Code 有三套压缩策略:
Auto Compac(自动摘要):快达到上限时,调用 Claude 对历史对话做一次摘要,把摘要插入对话作为新的起点,然后丢弃原始历史。
Reactive Compact(被动摘要):不预防性触发,等 API 真的返回”上下文太长”错误之后才触发摘要。更激进,但能保留更多历史。
Snip Compact(精准截断):不做整体摘要,而是精确截掉对话中某些指定的消息片段。比如一个巨大的工具调用结果,截掉它但保留前后上下文。
这几种策略并存,说明 Anthropic 在上下文管理上还在持续摸索,没有找到”一劳永逸”的方案。
几个藏在代码里的未公开功能
constants/betas.ts 里定义了所有发往 API 的 beta header,有几个值得单独提:
Fast Mode:官方解释语焉不详,源码说清楚了——它是通过请求头告诉服务端切换到不同的采样参数(更低温度、更快输出),不是换了另一个模型,就是采样策略不同。
AFK Mode(挂机模式):公开文档里从来没见过。代码里有 getAfkModeHeaderLatched()/setAfkModeHeaderLatched(),”Latched”意思是一旦激活就保持。从名字猜,应该是”我要离开电脑一段时间,你自主处理完”的模式。
任务预算和 Effort 控制:TASK_BUDGETS_BETA_HEADER 给单次 agentic turn 设置 token 上限,EFFORT_BETA_HEADER 控制推理深度。这两个近期已经开始出现在 API 文档里了。
1M 上下文实验:CONTEXT_1M_BETA_HEADER 控制是否启用 100 万 token 的超长上下文,目前还是实验状态。
这些 beta header 加起来,是观察 Anthropic 产品路线图最直接的窗口。
官方文档永远比实际进展落后半个身位,但代码不会骗人。
我的感受
读这份代码,最让我意外的是它的工程成熟度。
很多人觉得 Claude Code 就是个”AI 聊天 + 工具调用”的简单组合,但源码里能看到大量针对工程现实的细节处理:
-
为了 resume 在 API 调用之前就写日志 -
为了降低 API 成本精心设计提示词的缓存边界 -
为了处理超长输出专门做自动重试恢复
这些都是实际跑起来之后遇到问题磨出来的东西。
另一个让我觉得有意思的是 feature flag 体系的彻底性。你安装的 Claude Code 和 Anthropic 内部跑的那个,在代码路径上差异相当大。
Coordinator 模式、Context Collapse、AFK Mode……这些东西现在对普通用户完全不可见,但代码里已经存在,等着某一天正式开放。
夜雨聆风