找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5236

积分

0

好友

713

主题
发表于 昨天 21:06 | 查看: 4| 回复: 0

拆解 Claude Code 从 npm source map 泄漏中暴露出的智能体主循环、上下文压缩、工具系统、安全模型与未来平台化方向。

Claude Code系统架构流程图

1 泄漏始末

1.1 事件本质

Source Map 暴露

npm 发布包中保留了 .map source map 文件。source map 本来用于把压缩或打包后的产物映射回原始 TypeScript/React 源文件,方便调试;但在生产 npm 包中保留它,就等于把内部目录结构、提示词组织、智能体循环、工具调用、权限流程和桥接系统暴露给外界。

泄漏规模

官方仓库看起来像插件壳,主要包含插件系统、Hook 示例、配置模板和示例插件;source map 暴露的内容则是完整厨房:4600+ 源文件、55+ 目录、TypeScript/React 实现、商业许可下的专有核心引擎。

工程判断

这类事故本质是构建链安全问题。核心风险不是运行时代码分支能否被绕过,而是调试制品是否被纳入发布产物。即使二进制已经正确裁剪,source map 也可能泄漏被裁剪前的源代码结构。

发布前检查与清理建议的Shell命令截图

1.2 开源差距

官方开放内容更接近插件接口层:插件系统、Hook 示例、配置模板、示例插件。真正决定产品能力的主循环、工具实现、权限判断、API 通信、上下文压缩、MCP 客户端与远程桥接,并不包含在官方仓库中。

官方仓库与Source Map暴露代码对比表格

2 总体架构

2.1 技术栈

Claude Code 技术栈说明它更像一个完整 TUI 应用。React 18 与 Ink 负责终端 UI 渲染,支撑权限对话框、进度条、多面板布局、Worker Badge 和实时流式输出。

技术选型对比表格

2.2 架构分层

Claude Code系统架构流程图

核心引擎

架构中心是 Core Engine:query.ts 智能体循环、权限系统、配置解析、上下文压缩和工具调度都在这里。CLI 层负责终端输入输出和交互控件;Claude API 层负责流式模型响应、工具调用协议和 fallback。

外围系统

工具系统提供 Bash、Read、Write、Edit、Glob、Grep、WebSearch、Agent 等能力;MCP 负责外部工具接入;安全层提供 8 层防护;配置系统合并用户、项目、本地、组织和服务端等规则;Bridge 则指向远程控制能力。

设计重点

这套架构真正解决的是:如何把 LLM API 调用变成可控、可恢复、可审计、可压缩、可并发、可远程扩展的软件工程循环。

3 智能体循环

3.1 生成器流

Claude Code智能体循环query.ts流程图

异步生成器

query.ts 的核心是一个异步生成器式主循环。普通函数只能返回一次结果;异步生成器可以一边等待 API、文件读取或工具执行,一边逐个产出事件。消费侧用 for await 接收流式事件,结束时得到终止原因,异常则自然走 try-catch。

统一三类通道

传统 EventEmitter 或回调模型会把事件、完成、错误拆成不同通道,复杂状态机里很容易漏处理。异步生成器把流式事件、正常结束、异常传播放进同一个函数语义里,非常适合 agentic loop。

3.2 状态迁移

TypeScript QueryParams类型定义代码截图

参数不变

QueryParams 表示一轮请求的稳定输入:初始消息、系统提示、工具权限回调、工具上下文、任务预算、最大轮次、fallback 模型和请求来源等。它们不应在循环中被随意改写。

状态可变

State 表示每轮都会变化的运行态:消息列表、工具上下文、自动压缩跟踪、最大输出恢复次数、是否尝试过 reactive compact、待处理工具摘要、stop hook 状态、turnCounttransition

Continue Site

循环中不是逐字段修改状态,而是一次性构造新 state:保留旧字段,替换 messagesturnCounttransition 等关键字段。这类似 React setState 思路,避免改到一半出错的半更新状态。transition 还记录为何进入下一轮,例如 next turn、错误恢复、fallback 模型切换。

3.3 六步管线

请求前压缩

调用模型前先处理上下文,顺序遵循便宜优先:Tool Result Budget、Snip Compact、Microcompact、Context Collapse、Auto Compact。Context Collapse 放在 Auto Compact 前,是为了先用低成本折叠保留细粒度上下文,只有仍超阈值才触发昂贵总结。

流式调用

模型流式生成时,StreamingToolExecutor 可以提前执行并发安全的工具。例如只读文件、Glob、Grep 可以并行;写文件或 Bash 这类会改变环境的工具必须独占。这样能降低用户感知延迟,但不会让互相冲突的工具同时运行。

错误恢复

Prompt Too Long 先尝试 Context Collapse drain,再做 reactive compact,最后才把错误暴露给用户。输出 token 超限则先提升输出上限,再注入继续上次输出的恢复消息,最多重试数次。核心原则是:免费的恢复路径先走,昂贵 API 调用后置。

停止钩子

Stop Hook 用于 Claude 想结束时先验证。例如用户设定测试通过才能停,则 hook 失败信息会被注入上下文,让模型继续修复。Token budget 不只是硬限制,还会检测收益递减:连续多次继续但新增 token 很少,就认为继续无意义并停止。

工具执行

第 2 阶段已开始的流式工具在第 5 阶段收集结果;未流式执行的工具再按批处理执行。UI 通过进度信号刷新 spinner,让用户看到工具正在运行。

下一轮准备

工具结束后,会消费前面预取的技能列表、记忆附件,处理排队命令,并刷新 MCP 工具列表。随后通过 Continue Site 把 assistant 消息和 tool result 追加进历史,回到 while true 顶部。

3.4 退出原因

九类终止原因

终止原因表格

3.5 会话主管

QueryEngine

query.ts 管一轮用户输入到工具反馈的闭环;QueryEngine.ts 管整个会话。它维护完整消息历史、权限拒绝记录、累计 token 使用量、文件状态缓存、已发现技能和已加载记忆路径。

不对称持久化

用户消息必须阻塞写入,因为 resume 恢复依赖它;助手消息可以 fire-and-forget,因为即使写入失败也不应阻塞主循环。这是在可靠性和磁盘 I/O 延迟之间做取舍。

4 上下文压缩

4.1 四层压缩

4层消息压缩体系信息图

Snip Compact

Snip 是最便宜也最激进的方式:直接剪掉较早消息块,只保留最近上下文。没有模型总结,没有语义理解,因此信息损失高,但不产生 API 成本。它更适合 headless 后台会话,因为用户不直接看完整对话。

Microcompact

Microcompact 针对单个工具结果做选择性清理。例如十轮前读过的大文件内容,模型已吸收其关键信息,可替换为旧工具结果已清理之类的占位。它的难点是不能破坏 prompt cache:如果清理发生在缓存前缀中间,会导致后续缓存全部失效,反而更贵。

Context Collapse

Context Collapse 采用预览/提交两阶段:先标记可折叠块,再在需要时提交折叠。原始消息不被改写,折叠摘要存到单独 store,发送模型时通过 projectView 叠加成读取视图。这很像数据库 view 或 Git 快照。

Auto Compact

Auto Compact 会让模型总结整段会话。它信息保留最好,但要多一次 API 调用,因此是最昂贵的常规手段。阈值逻辑会为系统提示、工具定义和下一轮输出预留约 13K token 缓冲。

4.2 最后手段

断路器

如果自动压缩连续失败,系统不再无限重试,而是把控制权交给后续错误恢复流程。

Full Compaction

Full Compaction 是 Auto Compact 前的预处理:

Full Compaction处理步骤表格

4.3 告警机制

状态机

Token 告警分为 Normal、Warning、Error、AutoCompact、BlockingLimit。随着剩余窗口从 20K、13K 到 3K 逐步逼近,UI 提示会升级。BlockingLimit 表示自动压缩也不够,只能提示用户手动 /compact

缓存取舍

四层压缩不是线性越压越强,而是在成本、信息损失和缓存影响之间找平衡。

压缩层对比表格

5 工具体系

5.1 工具接口

TypeScript ToolUseContext类型定义代码截图

统一上下文

所有工具都通过 ToolUseContext 获取运行世界:工具列表、主循环模型、MCP 客户端、预算上限、AbortController、文件读取缓存、AppState 访问器、权限跟踪、内容替换状态、agent ID 等。工具不是孤立函数,而是在可取消、可审计、可计费、可权限控制的环境里运行。

权限上下文

ToolPermissionContext 使用深度不可变类型。普通 Readonly 只能保护对象顶层,深度不可变会连嵌套数组和对象一起锁住。权限规则是安全边界,不允许运行中被任意模块误改。

5.2 注册分层

工具层级与代表工具表格

常驻工具

基础工具约 20 个,包括 Bash、Read、Write、Edit、WebSearch、Agent 等,构成 Claude Code 的核心行动能力。

条件工具

某些工具按环境启用。例如 Windows 下启用 PowerShell;LSP 需要环境变量;内部构建可能使用内置高性能搜索能力,从而替代 JS 实现的 Glob/Grep。

特性门控

WebBrowser、Workflow、Sleep、PushNotification 等未发布工具被 feature() 门控。构建期裁剪、条件激活和服务端 feature flag 一起组成工具能力伸缩机制。

5.3 工具缓存

assembleToolPool函数代码截图

稳定排序

工具池装配时,内置工具和 MCP 工具分别排序后拼接,而不是全量一起排序。原因是系统提示里的工具定义会进入 prompt cache;若新增 MCP 工具插入内置工具中间,会破坏内置工具区域的稳定前缀,让缓存失效。

动态搜索

Dynamic Tool Search 通过一个搜索工具的工具减少提示词膨胀。模型先看到 ToolSearchTool,需要某类能力时再加载具体工具定义。对拥有几十个 MCP 工具的场景,这能显著降低每轮固定 token 成本。

6 安全防线

6.1 八层模型

安全处理流程图

构建门

feature() 在构建期求值。未启用分支会被 bundler 删除,外部构建中内部工具代码物理不存在。安全性来自代码根本不在产物里。这次事故的讽刺点是:二进制可被裁剪,但 source map 里仍暴露了源代码映射。

特性开关

GrowthBook 的 tengu_* 开关提供服务端 kill switch。安全事件发生时,不需要客户端升级即可关闭相关功能,例如语音、绕过权限、自动模式、远程桥接或设备认证策略。

配置规则

权限规则来自 8 类来源:用户全局设置、项目设置、本地设置、服务端 flag、组织策略、命令行参数、运行时命令和会话内规则。规则需要合并优先级,但危险模式检测和 kill switch 仍可越过普通 allow 规则。

6.2 分类检测

工具使用请求与分类器规则说明

AI 看 AI

Auto mode 下,Claude 可以不逐次询问用户就执行工具,因此需要额外分类器判断工具使用是否安全。只读工具可走白名单直接放行,危险或不明确操作要由分类器返回 allow 或 deny。

拒绝回退

如果分类器过度保守,连续拒绝 3 次或累计拒绝 20 次后,系统会回退到提示模式,让用户直接决策。若分类器 API 自己失败,也不是自动执行,而是回到询问用户。

危险模式

硬编码危险 Bash 模式会阻止解释器、exec/eval/source、curl/wget/nc、openssl、ssh/scp、sudo/docker、chmod/chown/mount 等高风险入口。尤其是解释器通配符危险,因为 python -cnode -e 可以绕过 Bash 字符串级检查执行任意系统命令。

6.3 路径校验

文件系统校验点表格

文件系统边界

路径校验文件很大,说明文件访问是核心风险点。系统会做绝对路径归一化、符号链接逃逸防护、安全 glob 展开、CWD-only 与 full access 模式区分、Coordinator scratchpad 支持,以及 Windows/POSIX 双平台处理。

信任对话框

新项目首次运行时,如果 .claude/ 中含设置,Trust Dialog 会展示项目级 MCP、Hook、Bash 权限、API key helper、云命令和 OTEL header 等潜在风险配置,要求用户显式同意。它防止恶意仓库通过项目设置自动放行危险工具。

绕过开关

Bypass permissions 是便利但危险的模式。服务端 kill switch 可阻止进入 bypass,也可把已处于 bypass 的用户强制拉回原模式,并显示诊断信息。

7 未发布功能

7.1 语音浏览

语音模式

Voice mode 依赖 OAuth 鉴权和专用 voice_stream 端点,不适用于 API Key、Bedrock 或 Vertex 路径。它受 GrowthBook kill switch 控制,并使用可能陈旧的缓存开关值,说明不是每次调用都实时查服务端。

浏览器工具

WebFetch 只能取静态 HTML,无法理解依赖 JavaScript 渲染的 SPA。WebBrowserTool 指向真实浏览器自动化能力,可能类似面向终端的 Computer Use:能看到渲染结果并交互,而不是只 fetch 文本。

7.2 多智能体

Coordinator

Coordinator Mode 是元编排器,不直接写代码,而是创建 worker agent、分发任务、接收 task notification、给 worker 追加指令或终止任务。它只允许 AgentTool、TaskStop、SendMessage、SyntheticOutput,不能直接 Bash 或读文件。

最小权限

Coordinator 只管协调,不碰实际文件系统,能降低单点失控风险。worker 在独立上下文里工作,把结果交回 Coordinator,形态接近 AI 微服务编排

共享草稿区

tengu_scratch 提供 worker 共享目录,允许跨 CWD 交换信息。它需要绕过普通文件权限,因此必须由 feature gate 控制。

7.3 主动代理

Kairos

Kairos 代表从被动问答转向主动行动。相关工具包括发送用户文件、推送通知、订阅 GitHub PR webhook、Sleep 定时等待、多频道集成和状态简报。

触发监控

Agent Triggers 支持 cron 创建、删除和列表;RemoteTrigger 与 Monitor 说明长期 agent 可以有自己的计划任务和消息队列。例如每天检查 CI,或 PR 有新 review 时主动通知用户。

7.4 远程桥接

UDS Inbox

UDS 可能指统一设备栈。Agent 可以发现同账号下的其他设备或 Claude Code 实例,并通过 bridge://other:// 路由消息。这为让笔记本上的 Claude Code 请求台式机跑测试铺设通信管道。

Workflow

WorkflowTool 指向预置自动化脚本体系。为了避免递归爆炸,子 agent 中禁止递归执行 workflow,防止 workflow 调 workflow 的无限链条。

Bridge

Bridge 是远程控制系统,支持从 Claude.ai Web 控制本地 Claude Code。连接流程包括 OAuth 登录、CCR API 做订阅与 feature gate 校验、本地获取 environment_id 和 secret、建立认证 WebSocket 隧道,再由浏览器经 Bridge API 触发本地工具执行。

隔离认证

Bridge 有标准与增强两档认证:标准使用 OAuth,增强还要求绑定物理设备的 Trusted Device Token。远程会话用 Git worktree 隔离,即使同一项目开多个远程会话,也各自拥有独立工作目录。

8 设计结论

8.1 成本优先

便宜优先

Claude Code 的核心原则是成本感知。压缩先走免费剪裁,再走选择性清理,再折叠,最后才让模型总结;错误恢复先用已有候选或提升 token cap,再重新调用模型;工具定义通过动态搜索延迟加载。每一次 API 调用都被当作成本中心。

缓存优先

Prompt cache 是降低成本和延迟的关键资源。Microcompact 的 pinning、工具池稳定排序、内置工具前缀保护,都说明工程实践中少发 token 和保持缓存命中经常冲突,系统会选择总体更便宜的路径。

8.2 平台演进

技术演进方向与含义表格

最复杂的系统仍可能被最简单的发布配置错误击穿。Claude Code 在用户侧设计了多层安全防线,却因 source map 发布失误暴露了内部结构。对任何 AI 工程团队,这都是构建链安全、产物审计和发布前检查的强警示。这种从源码分析中汲取的教训,也值得所有开发者在云栈社区深入探讨。

参考资料 https://bits-bytes-nn.github.io/insights/agentic-ai/2026/03/31/claude-code-architecture-analysis.html




上一篇:DeepSeek V4发布即适配华为昇腾950,1.6万亿参数国产方案如何破局
下一篇:GPT-5.5与Opus 4.7折戟ARC-AGI-3:抽象推理得分不足1%的三大翻车模式
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-5-3 00:09 , Processed in 1.197972 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表