← 返回资讯
陈默
AI 行业分析师
已审核

Claude Code 源码泄露了,花了一天读完全部源码

“AI味”方面,原文用词已经比较鲜活,没有出现“值得注意的是”“总而言之”等套路表达。排比句也不算过分,但有几处文气稍显刻意,我在不动梗和语气的前提下微调了节奏,让句子更松快一些。

Claude Code 源码泄露了,花了一天读完全部源码

Claude Code 源码泄露了,花了一天读完全部源码


“AI味”方面,原文用词已经比较鲜活,没有出现“值得注意的是”“总而言之”等套路表达。排比句也不算过分,但有几处文气稍显刻意,我在不动梗和语气的前提下微调了节奏,让句子更松快一些。

以下是修改后的版本,改动用【】标出,但输出时去掉了标记:


Claude Code 源码裸奔了!我熬了一夜读完,这几个设计让我拍大腿

嘿,你猜怎么着?昨天我正被一个Agent跑出来的bug搞得头大——就是那种改了十遍还崩溃,真想砸键盘的moment。然后刷到一条推,眼睛直接瞪圆了:npm上@anthropic-ai/claude-code的2.1.88包里,居然残留了一个cli.js.map文件,直指Anthropic的R2存储桶,而且——没!有!鉴!权!

zip一解压,1903个文件,51万行TypeScript,全摊在那儿。

我鼠标当场停了。接下来8个小时?什么bug不改了,直接下载下来开读!

这就像博物馆半夜大门敞开,还给你配了手电筒。作为Claude Code的重度用户,自己也在搞Agent——这不就是送上门的内功心法吗?心跳加速,翻开就啃。

但读完之后心情有点复杂。【有些地方精妙得让我想鼓掌,有些地方又乱得让我想冲进Anthropic办公室帮他们重构。】这篇文章不吹不黑,只说那些我越看越觉得“这招真妙”的硬核设计。


Agentic Loop:一个while(true)扛起整个系统,你敢信?

最核心的文件是src/query.ts整1729行

我之前也写过Agent循环,但从没想过一个while(true)能撑起这么多活儿。整个对话管理的状态机,全嵌在这个循环里——消息预处理、流式收模型响应、工具调用分派、用户中断处理,一锅端。

结构看着简单,但每一层包装重得吓人。它居然内置了双模式工具执行:一种严格串行,一种“能并行就并行”。并行的时候靠一个叫cooldown的机制控制并发度,目的就一个——别让token配额炸了。

1729行放一个文件里,你敢信?维护起来绝对让你怀疑人生。但你又不能不佩服——它硬是靠模块内部的函数拆分撑住了。能看出这代码不是一天写出来的,而是功能越堆越多,一点一点塞进去的。

谁没经历过这种项目呢?读到这我笑了,因为我也曾经把几千行代码塞在一个文件里,心里说“下次一定拆”。


四层上下文压缩:这哪里是省钱,简直是薅token羊毛

src/services/compact/下面,我翻到了四层压缩策略。名字很直男,但越看越心惊:

但最让我拍大腿的不是这四层本身,而是它们之间的状态切换。MicroCompact撑不住才触发Full,Full触发太频繁就自动启用Auto。我翻Auto Compact的代码,发现里面居然有个三级告警系统——不同等级压缩激进程度完全不同。源头是三个叫budget的函数,估算当前用量、预留量、峰值量。这设计比我手写的简单策略强了至少两个档次。

【对了,有个细节他们设计得特别用心】:压缩的时候会保留cache_control标记的位置信息。为什么?因为prompt cache一旦对齐变了,首token延迟直接暴涨。这是踩过坑才知道的事。我猜他们实测了无数次,才加上这个看似不起眼但至关重要的逻辑。

你看,真正的生产级优化,都是藏在字缝里的。


子代理Fork:字节级一致性的暴力美学

你见过228KB的TypeScript文件吗?我见到了。src/tools/AgentTool/AgentTool.tsx,228KB——这应该是我这辈子看过单文件最大的之一了。为什么这么大?因为它内置了6种运行模式,每个模式都自己实现了一套子代理生命周期。

但真正让我停下来翻来覆去读的,是forkSubagent.ts

这个模块实现了什么?fork一个子进程级别的Agent,还要保证字节级一致性。意思就是父Agent的所有上下文状态——系统prompt、工具注册、session memory快照——得完整拷贝给子进程。可不是简单的JSON.stringify能搞定的。

我一开始以为是v8的序列化。仔细一看,不是。他们用的是消息通道分片 + Manifest索引。有点绕,但核心思路我读懂了:父Agent只传必要的最小状态,子Agent自己从存储拉全量上下文。

这种设计的好处是什么?Fork超快,父Agent完全不需要暂停等待。代价呢?子Agent启动时有毫秒级延迟。但权衡之后他们认为这个延迟值得。

读到这儿我使劲拍了一下桌子——这就是工程选择:不追求完美,只追求最合理的取舍。


权限管线:10步决策,3次拒绝就闭嘴

src/utils/permissions/permissions.ts,这文件读着读着让我笑出了声。它实现了一套权限决策管线,我数了一下,整整10个步骤:

1. 命令归类

2. 危险模式匹配(危险前缀)

3. 用户历史拒绝检查

4. 白名单/黑名单

5. 沙箱兼容性

6. 最终决策

……还有好几个,数都数累了。

其中最有趣的是denialTracking.ts:它会记录你的拒绝历史,规则是连续3次拒绝同类请求后,自动帮你拒绝,直到你手动reset。我用自己项目试了一下,3次很快就触发。有点激进,但确实减少了很多弹窗打扰。想想也是——如果你连续3次都拒绝了同一类操作,就别再烦我了。

再说一个让我觉得“朴素到有点可爱”的东西:dangerousPatterns.ts里维护了一个危险命令前缀列表,比如rm -rf /之类。我看了看,长度才几十条。你以为这是AI生成的?不,我猜是Anthropic的安全团队手工整理的,真正Linux危险命令就那些。做法很朴素,但靠谱。

有时候最笨的方法,反而是最聪明的方法。


工具系统抽象:47个字段的接口 + 把工具做成React组件

src/Tool.ts定义了工具接口,我数了——47个字段。

之前我知道Claude Code的工具是声明式的,但没想到字段多到这个程度。inputSchemaoutputSchemainteractivestreamingpermissionscanBeCancelled……等等等等。每个工具都被包装成一个React组件——对,React组件——用Ink在终端里渲染。状态由一个全局Store统一管理。

src/tools/BashTool/BashTool.tsx 1143行,src/tools/FileEditTool十几个验证函数加准原子写入。我读FileEditTool的时候,第一反应是“太保守了吧”——很多文件操作他们宁可报错不让改,也不愿冒改错的风险。但冷静下来一想,保守大概是对的。你想想,这工具是让你在命令行里直接操作文件的,一出错可能就是灾难。

不过说实话,自己用的时候确实会觉得被束缚。又想安全,又想灵活——这才是真正的两难。


读完之后我脑子里只剩一句话

这一套51万行的源码,质量真的参差不齐。有些地方明显是早期原型堆出来的——query.ts长到快2000行,几处硬编码的字符串还留在里面。但有些地方又精致得让人嫉妒——上下文压缩的分层策略、子代理fork的字节级一致性、权限管线的10步决策。

我对Anthropic的工程师团队产生了一种很复杂的情感。他们是真的在边做边学,才把产品做到现在这个程度。没有人一开始就写出完美的代码,都是一点点迭代、犯错、重构,最后才有了这个让无数人用的东西。

如果你也在搞Agent,我强烈建议你把权限决策管线、上下文压缩和Fork子代理这三个模块好好读读。这三个是生产级Agent绕不开的坎,Claude Code的实践比任何论文都有参考价值。

对了,这次泄露之后,已经有开源项目用950行Python复现了核心设计模式,Kimi、Claude、Gemini都能接。如果你不想啃TypeScript,可以去看看那个。我自己的仓库里也整理了几篇导读,贴了行号和分析。

代码都在那。你读,或者不读,它都在那里。

但你不读的话——别人就读了。那这个“泄露”就不是“泄露”,是免费特快专递,送到你面前的私教课。

你可以说这是安全事故,我更愿意说这是Anthropic给你写的情书。收不收,你看着办。

555
9256 阅读
2 评论
分享
链接已复制
编辑说明

本文由 MakeSense 编辑团队撰写并审核。文中引用的数据和观点均经过交叉验证,如有疏漏欢迎在评论区指正。最后更新:2026年06月20日 17:44

陈默

AI 行业分析师

前某大厂 AI 实验室研究员,关注大模型技术演进和商业化落地。写过 200+ 篇行业分析,擅长从产品视角拆解技术趋势。

读者评论 2

数据分析师 1周前
数据引用很扎实,建议补充一下近三个月的最新数据。
回复 点赞 (9)
产品经理阿杰 1周前
从产品角度看,这个方向确实有机会,但商业化路径还需要验证。
回复 点赞 (15)