Claudecode源码
Claude Code的源码意外泄露了好几天了。五十多万行TypeScript代码一下子就摊开在眼前。我作为搞AI开发的忍不住花时间翻了翻那些文件。看完之后心里感慨很多。不是那种简单好奇而是真正从工程角度去品味里面的设计。
这次泄露其实源于Anthropic发布npm包的时候不小心把source map文件打包进去了。那个cli.js.map足足六十兆大小。里面不仅存着所有文件路径还直接带着完整的源码内容。这事儿让我想起来我们平时打包发布的时候检查配置有多关键。一个小疏忽就把整个代码库暴露了。
进入源码本身聊聊。Claude Code作为一个终端里的agentic coding工具。它的核心竞争力全在那个精细的Agent Loop上。query.ts这个文件有一千七百多行。简直就是整个系统的大脑。它没有用递归调用而是采用while true的无限循环来构建状态机。状态通过QueryState接口统一管理。里面包含messages历史。turnCount轮次。depth嵌套深度。还有toolUseContext这些字段。每次循环都根据模型返回更新状态直到shouldTerminate条件满足才退出。这种设计让内存占用保持恒定。而且状态随时可以序列化暂停或者恢复。特别适合多轮交互的复杂场景。避免了递归栈溢出的风险。这点在实际工程里太实用了。
工具系统也做得特别扎实。tools.ts文件有八百多行专门负责工具注册和管理。每个工具比如BashTool都通过JSON Schema来定义。包括name。description。parameters这些字段。还额外加了dangerousPatterns来标记风险命令。执行流程先是意图分类。然后路由到对应工具生成参数。接着走权限检查。最后才是沙箱执行。BashTool支持跨平台。它会根据环境变量和父进程自动检测当前shell。把命令做相应转换。比如Windows下把路径符号和操作符换成兼容的格式。这些细节让工具在不同系统上都能稳稳运行。
安全机制是源码里最亮眼的部分之一。权限系统用了四层渐进披露的策略。第一层做能力检查看工具本身需不需要权限。第二层查缓存有没有之前用户授权过。第三层走策略黑名单直接拦截像rm -rf这样的危险操作。第四层才是用户确认而且支持始终允许的缓存。canUseTool函数就是按这个顺序逐级校验的。这样既保证了安全又不会每次都烦用户。工具描述本身就当接口用。模型生成参数后系统再校验一遍。整个流程层层把关。让我觉得Anthropic在安全上真的花了大力气。
上下文管理和token预算也很有讲究。源码里设计了五层压缩策略来应对超限情况。每轮先检查预算超没超。如果超了就轻推模型尽快完成任务。再往下是激进压缩保留关键消息。然后基于时间衰减裁剪历史。自动生成摘要替代原始内容。最后如果遇到413错误还会触发响应式压缩。query.ts里大概八百到八百五十行左右就是处理这些逻辑的。这套分层防御让长会话不会轻易崩掉。同时又尽量保留有价值的信息。工程化水平可见一斑。
系统提示词的组装方式也值得一提。源码里有专门的prompts模块。它会根据当前会话动态拼接内容。边界前面的部分尽量保持cache友好方便复用。后面的才是用户特定信息不能随意改动。这种设计既高效又稳定。Anthropic在prompt engineering上的积累从源码里就能看出来。
总体来说这次源码泄露让我们看到一个成熟agent产品的真实面貌。不是单纯靠模型聪明而是百分之六十模型加百分之四十工程。Agent循环。工具链。权限体系。内存优化。安全沙箱。这些模块环环相扣才让终端里的体验那么丝滑。翻完代码我更觉得Vibe Coding的尽头还是得靠扎实的工程实践。
当然作为开发者我还是希望更多工具能公开源码让大家一起学习。不过这次意外也给所有团队提了个醒。打包流程和发布检查永远不能掉以轻心。以后遇到类似产品的时候我大概率会多想想源码背后的这些决策。
写的较粗,借助了下Ai,有需要深入了解的可留言。
夜雨聆风