Claude Code 泄露源码解读 从 Agent 循环到工具权限与上下文管理
让编程助手解释一段代码,和让它把一个问题修好,是两种很不一样的体验。前者把答案写在对话框里就够了;后者要碰到真实文件、真实命令,还得面对用户随时插进来的修改。
假设你给它这样一句话:“切换几次 3D 模型,页面就越来越卡。帮我找原因,修完跑一下项目现有的检查。”终端里开始搜索、读文件、改代码,看起来顺理成章。但这些动作靠什么衔接?读到一半文件变了怎么办?测试命令报错以后,是继续修,还是直接结束?
这几个问题,比找一段神奇的系统提示词更吸引我。它们决定一个助手能不能在真实项目里持续工作,也正好是这次源码阅读的主线。
2026 年 3 月 31 日,Claude Code 的一次 npm 发布意外暴露了内部源码。@anthropic-ai/claude-code 的 2.1.88 版本带上了不应公开的 source map,相关源码随后被保存和整理到多个仓库中。这次事件让开发者得以直接阅读一个实际编程代理的客户端实现。事件报道
本文使用的泄露源码整理仓库:hujinbin/claude-code。 想边读边对照,可以从这里打开目录;文中的源码引用另外固定到了具体提交,方便以后回看。
分析基线是提交 480314ded0d2f60bd854ff3e2661116d0f3a1b5e,整理提交日期为 2026 年 4 月 13 日。本文以静态阅读为主:副本缺少完整构建配置和部分模块,下面的修复场景用于解释代码,不是一份实际运行报告;讨论范围也限定在这份实现。
沿着代码走下去,会看到一套围绕模型组织起来的运行时:它维护消息,调度工具,检查权限,管理上下文,也负责把任务收住。这类系统在 Agent 工程里常被称为 Harness。这个词听起来抽象,放进上面的修复任务里就好理解了:模型决定下一步试什么,运行时把这个决定落到实际操作上,再把发生的事情告诉模型。
从 source map 泄露说起
Source map 用来关联构建后的代码与原始源码,方便调试。根据生成方式,它可能包含原始源码内容,也可能暴露指向源码的路径或位置。因此,拿到相应调试产物,有时就能看到远比压缩后 JavaScript 更完整的实现,而无需重新推导源程序。Source map 说明
这次泄露属于发布链路中的调试产物暴露。Anthropic 将事件归因于人为造成的发布打包失误。公司回应
这件事给开发者的提醒很具体:编译结果、调试产物和最终发布包,需要分别看待。调试文件对排查线上问题很有用,但“内部调试需要它”和“用户安装包应该带上它”是两回事。
至于“Bun 默认生成 .map,忘写 .npmignore 就会泄露”的说法,细节还要分开看。Bun 当前文档列出的 sourcemap 默认值是 none;实际生成方式和打包范围取决于项目自己的配置。这份副本没有原始发布配置,因此下面重点研究泄露出来的实现。Bun 构建文档
本文把它作为泄露源码来读,并不把它称作官方主动开源。阅读对象是编程代理的客户端工程,范围也不延伸到模型权重或全部云端服务。