self-media-james/articles/008/claude-arch-by-claude.md
邓文兵 0686f1969c docs(article): 添加 Claude Code 源码分析文章及相关架构图
- 新增 008 号文章《51 万行源码意外曝光!我扒完了 Claude Code 的全部家底》
- 添加 8 个 Mermaid 架构图文件,涵盖整体架构、启动流程、查询循环等
- 新增项目配置文件 CLAUDE.md,定义自媒体写作规范
- 创建详细的架构分析文档 claude-arch-by-claude.md
- 包含权限系统、工具调度、多智能体等核心技术解析
- 记录反蒸馏机制、KAIROS 守护进程等隐藏功能发现
- 提供完整的工具清单及安全防护措施说明
2026-04-01 10:38:57 +08:00

797 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Claude Code 源码泄漏深度架构分析
> 2026年3月31日Anthropic 在 npm 发布 `@anthropic-ai/claude-code@2.1.88` 时,意外将一个 59.8MB 的 JavaScript Source Map 文件打包在内。这个 `.map` 文件指向了 Anthropic 自家 Cloudflare R2 存储桶上的完整 TypeScript 源码压缩包。安全研究员 Chaofan Shou 率先发现并公开了这个链接数小时内1,900 个 TypeScript 文件、512,664 行代码被完整镜像到了 GitHub 上。
>
> 本文将从架构层面,深入拆解这个"可能是当前最复杂的 AI 编程智能体"的内部实现。
---
## 一、技术栈总览
| 维度 | 技术选型 |
|------|---------|
| 语言 | TypeScript1,884 个 `.ts/.tsx` 文件) |
| 运行时 | Bun非 Node.js |
| 终端 UI | 自研 Ink 分支 + React + Yoga Layout |
| Schema 校验 | Zod v4 |
| API 通信 | Anthropic SDK + SSE 流式传输 |
| 构建系统 | Bun Bundler`bun:bundle` 特性开关) |
| 实验平台 | GrowthBook`tengu_*` 前缀) |
| 可观测性 | OpenTelemetry + Datadog + Perfetto |
---
## 二、整体架构
```mermaid
graph TB
subgraph Entry["入口层"]
CLI["cli.tsx<br/>CLI 入口"]
MCP_ENTRY["mcp.ts<br/>MCP Server 入口"]
SDK["agentSdkTypes.ts<br/>SDK 入口"]
end
subgraph Core["核心引擎"]
MAIN["main.tsx<br/>4,683 行<br/>REPL 编排器"]
QE["QueryEngine.ts<br/>1,295 行<br/>会话管理器"]
QUERY["query.ts<br/>1,729 行<br/>流式查询循环"]
API["claude.ts<br/>3,419 行<br/>Anthropic API 客户端"]
end
subgraph Tools["工具系统"]
TOOL_DEF["Tool.ts<br/>792 行<br/>工具接口定义"]
TOOL_REG["tools.ts<br/>389 行<br/>工具注册表"]
TOOL_ORCH["toolOrchestration.ts<br/>并发调度"]
TOOL_EXEC["toolExecution.ts<br/>1,745 行<br/>执行引擎"]
end
subgraph Agent["多智能体"]
COORD["coordinatorMode.ts<br/>协调器"]
AGENT_RUN["runAgent.ts<br/>973 行<br/>子智能体启动器"]
TASKS["tasks/<br/>任务状态机"]
end
subgraph Infra["基础设施"]
PERM["permissions/<br/>24 个文件<br/>权限系统"]
MCP_CLIENT["mcp/client.ts<br/>3,348 行<br/>MCP 客户端"]
BRIDGE["bridge/<br/>27 个文件<br/>IDE 桥接"]
MEMDIR["memdir/<br/>9 个文件<br/>记忆系统"]
INK["ink/<br/>终端渲染引擎"]
end
CLI --> MAIN
MCP_ENTRY --> MAIN
SDK --> QE
MAIN --> QE
QE --> QUERY
QUERY --> API
QUERY --> TOOL_ORCH
TOOL_ORCH --> TOOL_EXEC
TOOL_EXEC --> TOOL_DEF
TOOL_REG --> TOOL_DEF
TOOL_EXEC --> AGENT_RUN
COORD --> AGENT_RUN
AGENT_RUN --> TASKS
AGENT_RUN --> QUERY
TOOL_EXEC --> PERM
MAIN --> MCP_CLIENT
MAIN --> BRIDGE
QE --> MEMDIR
MAIN --> INK
```
---
## 三、启动流程
```mermaid
sequenceDiagram
participant User as 用户终端
participant CLI as cli.tsx
participant Main as main.tsx
participant GB as GrowthBook
participant MCP as MCP Servers
participant REPL as REPL 循环
User->>CLI: claude 命令
CLI->>CLI: 快速路径检查<br/>(--version, --dump-system-prompt)
CLI->>Main: 动态 import main.tsx
par 并行初始化
Main->>GB: 加载特性开关
Main->>Main: 读取 settings / MDM / keychain
Main->>MCP: 连接 MCP 服务器
Main->>Main: 加载工具 & 命令
end
Main->>Main: 构建系统提示词
Main->>REPL: launchRepl()
REPL->>User: 就绪,等待输入
```
**关键设计**`cli.tsx` 仅 302 行,通过动态 `import()` 延迟加载 `main.tsx`4,683 行),确保 `--version` 等快速路径毫秒级响应。所有重量级依赖MCP、GrowthBook、keychain都通过并行初始化加载。
---
## 四、核心查询循环
### 4.1 QueryEngine — 会话管理器
`QueryEngine` 是 SDK/headless 模式下的会话管理器,一个实例管理一次完整对话:
```
QueryEngine
├── mutableMessages: Message[] // 消息历史(随对话增长)
├── abortController: AbortController // 会话级中止控制
├── permissionDenials: SDKPermissionDenial[] // 权限拒绝记录
├── totalUsage: NonNullableUsage // Token 用量聚合
├── discoveredSkillNames: Set<string> // 每轮发现的技能
└── loadedNestedMemoryPaths: Set<string> // 已加载的 CLAUDE.md 路径
```
核心方法 `submitMessage()` 是一个 `AsyncGenerator<SDKMessage>`,每次调用经历:
1. 构建系统提示词(`fetchSystemPromptParts()`
2. 处理斜杠命令(`processUserInput()`
3. 持久化用户消息到 transcript
4. 进入流式查询循环(`query()`yield 出 `SDKMessage`
5. 处理上下文压缩、权限、最大轮次限制
### 4.2 query.ts — 流式查询循环
```mermaid
flowchart TD
START["用户消息"] --> BUILD["构建查询配置"]
BUILD --> CALL["queryModelWithStreaming()<br/>调用 Anthropic API"]
CALL --> STREAM["流式接收响应"]
STREAM --> CHECK{是否有工具调用?}
CHECK -->|有| RUN_TOOLS["runTools()<br/>执行工具"]
RUN_TOOLS --> BUDGET["applyToolResultBudget()<br/>结果预算控制"]
BUDGET --> HOOKS["executePostSamplingHooks()"]
HOOKS --> COMPACT{"需要压缩?"}
COMPACT -->|是| AUTO_COMPACT["autoCompactIfNeeded()"]
AUTO_COMPACT --> CALL
COMPACT -->|否| CALL
CHECK -->|无| RECOVERY{max_output_tokens<br/>恢复?}
RECOVERY -->|是,≤3次| CALL
RECOVERY -->|否| STOP_HOOKS["handleStopHooks()"]
STOP_HOOKS --> END["返回结果"]
```
**关键机制**
- **Output Recovery**:当模型因 `max_output_tokens` 截断时,自动重试最多 3 次
- **工具结果预算**:大结果持久化到磁盘,用文件路径 + 预览替代,防止上下文窗口膨胀
- **自动压缩**:接近上下文窗口限制时触发对话摘要压缩
- **依赖注入**`QueryDeps` 接口注入 `callModel`、`microcompact`、`autocompact`、`uuid`,方便单元测试
---
## 五、工具系统
### 5.1 Tool 接口
`Tool<Input, Output, P>` 是一个功能丰富的接口,定义了工具的完整生命周期:
```mermaid
classDiagram
class Tool {
+name: string
+description(input, options): string
+inputSchema: ZodSchema
+call(args, context, canUseTool, parentMessage, onProgress?)
+checkPermissions(input, context): PermissionResult
+validateInput(input, context): ValidationResult
+isReadOnly(input): boolean
+isConcurrencySafe(input): boolean
+isDestructive(input): boolean
+maxResultSizeChars: number
+shouldDefer: boolean
+renderToolUseMessage(input, options): ReactNode
+renderToolResultMessage(...): ReactNode
+toAutoClassifierInput(input): string
}
class ToolUseContext {
+options: Options
+abortController: AbortController
+appState: AppState
+permissionContext: PermissionContext
+fileStateCache: FileStateCache
+sessionMetadata: SessionMetadata
}
Tool --> ToolUseContext : 接收
```
### 5.2 完整工具清单
源码中注册了 **40+ 个工具**,按功能分类:
| 分类 | 工具名 | 说明 |
|------|--------|------|
| **文件操作** | FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, NotebookEditTool | 文件读写、搜索、编辑 |
| **系统执行** | BashTool, PowerShellTool | Shell 命令执行 |
| **网络访问** | WebFetchTool, WebSearchTool | 网页抓取、搜索 |
| **智能体** | AgentTool, SendMessageTool, TeamCreateTool, TeamDeleteTool | 多智能体生成与协调 |
| **任务管理** | TaskCreateTool, TaskGetTool, TaskUpdateTool, TaskListTool, TaskStopTool, TaskOutputTool | 后台任务管理 |
| **规划模式** | EnterPlanModeTool, ExitPlanModeTool | 只读规划模式切换 |
| **Worktree** | EnterWorktreeTool, ExitWorktreeTool | Git Worktree 隔离 |
| **MCP** | MCPTool, ListMcpResourcesTool, ReadMcpResourceTool | MCP 协议交互 |
| **其他** | ToolSearchTool, SkillTool, AskUserQuestionTool, ConfigTool, BriefTool, LSPTool, TodoWriteTool | 工具搜索、技能、配置等 |
| **KAIROS 专属** | SleepTool, CronCreateTool, CronDeleteTool, CronListTool, MonitorTool, PushNotificationTool | 自主守护模式工具 |
### 5.3 工具执行调度
```mermaid
flowchart LR
subgraph Parallel["并发批次"]
direction TB
G1["GlobTool ✓"]
G2["GrepTool ✓"]
G3["FileReadTool ✓"]
end
subgraph Serial["串行执行"]
direction TB
S1["FileEditTool"]
S2["BashTool"]
end
INPUT["工具调用列表"] --> PARTITION{"isConcurrencySafe?"}
PARTITION -->|true| Parallel
PARTITION -->|false| Serial
Parallel --> MERGE["合并结果"]
Serial --> MERGE
```
`toolOrchestration.ts` 将工具调用分为两类:
- **只读工具**`isConcurrencySafe=true``GlobTool`、`GrepTool`、`FileReadTool` 等,最多 10 个并发执行
- **写入工具**`isConcurrencySafe=false``FileEditTool`、`BashTool` 等,严格串行执行
---
## 六、权限系统
权限系统由 24 个文件组成,是 Claude Code 安全模型的核心。
### 6.1 权限模式
| 模式 | 说明 |
|------|------|
| `default` | 每次新操作提示用户确认 |
| `plan` | 只读规划模式,禁止写操作 |
| `acceptEdits` | 自动接受文件编辑 |
| `bypassPermissions` | 绕过所有权限检查 |
| `dontAsk` | 从不询问(自动拒绝未允许的操作) |
| `auto` | AI 驱动的自动审批Anthropic 内部专用) |
### 6.2 权限决策流程
```mermaid
flowchart TD
REQ["工具调用请求"] --> DENY{"在 alwaysDeny 规则中?"}
DENY -->|是| BLOCKED["❌ 拒绝"]
DENY -->|否| ALLOW{"在 alwaysAllow 规则中?"}
ALLOW -->|是| PASS["✅ 允许"]
ALLOW -->|否| TOOL_CHECK{"工具自身<br/>checkPermissions()"}
TOOL_CHECK -->|拒绝| BLOCKED
TOOL_CHECK -->|允许| CLASSIFIER{"AI 分类器<br/>(auto 模式)"}
CLASSIFIER -->|安全| PASS
CLASSIFIER -->|危险| DIALOG{"shouldAvoidPermissionPrompts?"}
DIALOG -->|是| BLOCKED
DIALOG -->|否| USER["🔔 提示用户确认"]
USER -->|允许| PASS
USER -->|拒绝| BLOCKED
```
权限规则支持 glob 模式匹配,例如 `Bash(git *)` 允许所有 `git` 开头的 bash 命令。`denialTracking.ts` 追踪连续拒绝次数,超过阈值后触发降级到手动确认模式。
---
## 七、多智能体架构
### 7.1 协调器模式
```mermaid
graph TB
subgraph Coordinator["协调器 (Coordinator)"]
C["协调器智能体<br/>全局视角 + 任务分配"]
end
subgraph Workers["工作智能体 (Workers)"]
W1["Worker 1<br/>文件探索"]
W2["Worker 2<br/>代码修改"]
W3["Worker 3<br/>测试验证"]
end
C -->|"AgentTool<br/>生成"| W1
C -->|"AgentTool<br/>生成"| W2
C -->|"SendMessageTool<br/>追加指令"| W1
W1 -->|"task-notification<br/>XML 回报"| C
W2 -->|"task-notification<br/>XML 回报"| C
C -->|"AgentTool<br/>生成"| W3
W3 -->|"task-notification<br/>XML 回报"| C
C -->|"TaskStopTool<br/>终止"| W1
```
协调器系统提示词300+ 行)定义了 **四阶段工作流**
1. **Research** — 探索代码库,理解上下文
2. **Synthesis** — 综合发现,制定方案
3. **Implementation** — 并行执行代码修改
4. **Verification** — 验证结果,运行测试
关键原则写在 prompt 里而非代码里:
- *"Do not rubber-stamp weak work"*(不要草率通过低质量工作)
- *"You must understand findings before directing follow-up work"*(在指导后续工作前必须理解发现)
### 7.2 子智能体启动流程
`runAgent.ts`973 行)是子智能体的核心启动器:
1. 生成唯一 `AgentId`
2. 创建独立的 `FileStateCache`
3. 通过 `createSubagentContext()` fork 父级的 `ToolUseContext`
4. 初始化智能体专属 MCP 服务器(来自 frontmatter
5. 运行独立的 `query()` 流式循环
6. 注册 Perfetto tracing性能追踪
7. 写入智能体元数据和 sidechain transcript
### 7.3 任务类型
```mermaid
classDiagram
class TaskType {
<<enumeration>>
local_bash
local_agent
remote_agent
in_process_teammate
local_workflow
monitor_mcp
dream
}
class TaskStatus {
<<enumeration>>
pending
running
completed
failed
killed
}
class LocalAgentTask
class InProcessTeammateTask
class RemoteAgentTask
class LocalShellTask
class DreamTask
TaskType <-- LocalAgentTask
TaskType <-- InProcessTeammateTask
TaskType <-- RemoteAgentTask
TaskType <-- LocalShellTask
TaskType <-- DreamTask
```
---
## 八、MCPModel Context Protocol集成
Claude Code 既是 MCP **客户端**(连接外部 MCP 服务器),也可以作为 MCP **服务器**运行。
### 8.1 支持的传输类型
| 传输方式 | 配置类型 | 说明 |
|----------|---------|------|
| `stdio` | `McpStdioServerConfig` | 标准进程通信 |
| `sse` | `McpSSEServerConfig` | Server-Sent Events |
| `sse-ide` | — | IDE 专用 SSE |
| `http` | `McpHTTPServerConfig` | HTTP 直连 |
| `ws` | `McpWebSocketServerConfig` | WebSocket |
| `sdk` | `McpSdkServerConfig` | SDK 内嵌 |
### 8.2 MCP 连接状态机
```mermaid
stateDiagram-v2
[*] --> Pending: 初始化
Pending --> Connected: 连接成功
Pending --> Failed: 连接失败
Pending --> NeedsAuth: 需要认证
NeedsAuth --> Connected: OAuth 完成
Connected --> Failed: 断开连接
Connected --> Disabled: 用户禁用
Failed --> Pending: 重连
```
`mcp/client.ts`3,348 行)是最大的 MCP 相关文件,负责连接管理、工具发现、资源预取和认证流程(支持 OAuth 和 XAA 跨应用访问)。
---
## 九、记忆系统
```mermaid
graph LR
MEMORY_MD["MEMORY.md<br/>记忆索引<br/>(≤200 行 / 25KB)"] --> NOTE1["user_role.md"]
MEMORY_MD --> NOTE2["feedback_testing.md"]
MEMORY_MD --> NOTE3["project_auth.md"]
SYSTEM_PROMPT["系统提示词"] --> MEMORY_MD
SYSTEM_PROMPT --> TYPES["记忆类型指令"]
SYSTEM_PROMPT --> RULES["存取规则"]
NOTE1 --> SEMANTIC["语义搜索<br/>findRelevantMemories()"]
NOTE2 --> SEMANTIC
NOTE3 --> SEMANTIC
SEMANTIC --> INJECT["注入上下文"]
```
记忆系统(`memdir/`9 个文件)采用**文件驱动**的设计:
- `MEMORY.md` 作为入口索引文件,限制 200 行 / 25KB注入到系统提示词中
- 每条记忆是独立的 Markdown 文件,带有 frontmattername、description、type
- 支持语义搜索(`findRelevantMemories()`
- 记忆老化/淘汰机制(`memoryAge.ts`
- 团队共享记忆支持(`teamMemPaths.ts`TEAMMEM 特性开关后)
---
## 十、终端渲染引擎
Claude Code 使用**自研的 Ink 分支**(非 npm 上的 Ink 库),基于 React + Yoga Layout 实现终端 UI。
```
ink/
├── root.ts — render() / createRoot() 入口
├── dom.ts — 虚拟 DOM 实现
├── frame.ts — 渲染帧管理,防闪烁
├── focus.ts — 键盘焦点管理
├── components/
│ ├── App.tsx — 根组件
│ ├── Box.tsx — 布局容器
│ ├── Text.tsx — 文本组件
│ ├── ScrollBox.tsx — 滚动区域
│ └── AlternateScreen.tsx — 全屏覆盖
├── events/ — 自定义事件系统
├── hooks/ — use-input, use-app, use-animation-frame 等
├── termio/ — 原始终端 I/O
└── Ansi.tsx — ANSI 转义码渲染组件
```
据泄漏分析文章指出,其终端渲染使用了 `Int32Array` 支持的 ASCII 字符池和位掩码编码的样式元数据,声称"在 token 流式传输期间将 `stringWidth` 调用减少约 50 倍"。
---
## 十一、系统提示词构建
系统提示词是分段动态组装的,带有缓存边界标记:
```mermaid
graph TB
subgraph Static["静态段(全局可缓存 scope='global'"]
INTRO["getSimpleIntroSection()<br/>智能体身份 + 安全指令"]
SYSTEM["getSimpleSystemSection()<br/>工具使用 + 权限模式"]
TASKS_SEC["getSimpleDoingTasksSection()<br/>软件工程行为规范"]
ACTIONS["getActionsSection()<br/>操作可逆性策略"]
TOOL_GUIDE["getUsingYourToolsSection()<br/>工具使用指南"]
end
BOUNDARY["═══ SYSTEM_PROMPT_DYNAMIC_BOUNDARY ═══"]
subgraph Dynamic["动态段(用户/会话级,不跨组织缓存)"]
HOOKS_SEC["getHooksSection()<br/>用户钩子指令"]
UNDERCOVER["Undercover 指令<br/>(ant-only)"]
MEMORY["loadMemoryPrompt()<br/>记忆内容"]
LANG["语言偏好"]
CONTEXT["getUserContext()<br/>Git 状态 / CLAUDE.md / 平台信息"]
MCP_INST["MCP 指令"]
end
Static --> BOUNDARY
BOUNDARY --> Dynamic
```
这种设计让静态段可以跨会话缓存(通过 Anthropic API 的 `cache_control` 参数),而动态段每次重新构建。
---
## 十二、隐藏特性与彩蛋
### 12.1 反蒸馏机制Anti-Distillation
```typescript
// services/api/claude.ts (301-313)
if (
feature('ANTI_DISTILLATION_CC')
? process.env.CLAUDE_CODE_ENTRYPOINT === 'cli' &&
shouldIncludeFirstPartyOnlyBetas() &&
getFeatureValue_CACHED_MAY_BE_STALE(
'tengu_anti_distill_fake_tool_injection', false)
: false
) {
result.anti_distillation = ['fake_tools']
}
```
当启用时,向 API 请求注入 `anti_distillation: ['fake_tools']`,服务端会在工具调用中混入虚假工具响应。目的:如果竞争对手录制 Claude Code 的 API 流量来训练模型,虚假工具数据会污染训练集。
**绕过分析**MITM 代理可在请求到达 API 前剥离该字段;设置 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS` 环境变量可禁用;第三方 SDK 入口完全绕过。正如分析者所言:"真正的保护可能是法律而非技术"。
### 12.2 伪装模式Undercover Mode
`utils/undercover.ts` — Anthropic 内部员工在外部开源仓库工作时自动启用:
- 禁止提及内部代码名Capybara、Tengu 等)
- 隐藏内部 Slack 频道和仓库名称
- 删除所有 "Co-Authored-By" 标识
- 不暴露未发布的模型版本号
**关键限制****没有强制关闭开关**。注释明确写道:*"There is NO force-OFF. This guards against model codename leaks."* 这是一扇单向门。
### 12.3 挫折感检测
```typescript
// utils/userPromptKeywords.ts
const negativePattern =
/\b(wtf|wth|ffs|omfg|shit(ty|tiest)?|dumbass|horrible|awful|
piss(ed|ing)? off|piece of (shit|crap|junk)|what the (fuck|hell)|
fucking? (broken|useless|terrible|awful|horrible)|fuck you|
screw (this|you)|so frustrating|this sucks|damn it)\b/
```
仅在 Anthropic 内部版本中启用(外部构建通过死代码消除移除)。当检测到用户情绪消极时,弹出 transcript 分享提示,方便内部员工快速提交反馈。选用正则而非 LLM 的原因:比模型推理调用更快更便宜。
### 12.4 KAIROS — 自主守护智能体
**KAIROS**(古希腊语"恰当的时机")是一个被提及 150+ 次的特性开关,代表着一个全新的交互范式——**始终在线的后台智能体**。
核心能力:
- `/dream` 技能 — "夜间记忆蒸馏"
- `autoDream` 守护进程 — 用户空闲时自动进行记忆整合
- GitHub webhook 订阅 — 监听仓库事件
- Cron 定时任务 — 每 5 分钟计划刷新
- 推送通知 — 主动通知用户
**autoDream 触发条件**
1. 距离上次整合 ≥ 24 小时
2. 至少 5 个新会话
3. 进程锁(同一时间只有一个进程执行整合)
### 12.5 Buddy 伴侣系统(愚人节彩蛋)
```
buddy/
├── companion.ts — Mulberry32 PRNG 确定性生成
├── types.ts — 物种、稀有度、属性定义
├── CompanionSprite.tsx — 500ms 刷新的终端动画精灵
├── sprites.ts — ASCII 艺术帧
├── prompt.ts — 系统提示词注入
└── useBuddyNotification.tsx — 预告逻辑
```
一个 Tamagotchi 风格的虚拟宠物系统:
- **18 种物种**鸭子、鹅、blob、猫、龙、章鱼、猫头鹰、企鹅、海龟、蜗牛、幽灵、美西螈、水豚、仙人掌、机器人、兔子、蘑菇、胖墩。物种名用十六进制字符数组编码避免触发内部代码名扫描器
- **稀有度**:普通(60%)、非凡(25%)、稀有(10%)、史诗(4%)、传说(1%)
- **RPG 属性**DEBUGGING、PATIENCE、CHAOS、WISDOM、SNARK
- **防篡改**:骨骼数据(物种、稀有度、闪光)从 `hash(userId)` 确定性生成,不存储在配置中,无法伪造传说级
- **活跃窗口**2026 年 4 月 1-7 日(跨时区滚动上线)
---
## 十三、Bash 安全检查
`tools/BashTool/bashSecurity.ts` 实现了 **23 项编号安全检查**
| 检查项 | 防御内容 |
|--------|---------|
| 命令替换 | `$()`、`${}`、进程替换 `<()`、`>()` |
| Zsh 危险内置 | `zmodload`、`emulate`、`sysopen`、`ztcp`、`zsocket`、`zf_rm` 等 18 个 |
| Zsh 等号展开 | `=curl` 绕过 curl 权限检查 |
| Unicode 攻击 | 零宽空格注入、Unicode 空白字符 |
| IFS 注入 | 空字节 IFS 注入 |
| Shell 元字符 | 混淆标志、花括号展开、中间单词哈希 |
| 控制字符 | 不可见控制字符注入 |
| 注释/引号错位 | 注释与引号边界不对齐攻击 |
| PowerShell | PowerShell 语法检测 |
| HackerOne 发现 | 格式错误 token 绕过(安全审计中发现) |
每次触发的检查都会记录 `tengu_bash_security_check_triggered` 事件(带数字 ID用于安全监控和统计。
---
## 十四、Prompt 缓存经济学
`services/api/promptCacheBreakDetection.ts` 追踪 **12+ 个缓存破坏维度**
```
系统提示词哈希 | 工具 Schema 哈希 | cache_control 哈希
单工具 Schema 变更 | 模型切换 | 快速模式
全局缓存策略 | Beta 头部 | effort 值
Auto 模式状态 | 超限状态 | 微压缩状态
```
当检测到缓存破坏(>5% 缓存读取 token 下降 且 >2,000 绝对 token 下降)时:
- 触发 `tengu_prompt_cache_break` 分析事件
- 写入 diff 文件到 `~/.claude/tmp/cache-break-*.diff`
- 区分服务端破坏 vs TTL 过期
正如源码注释所言:*"在按 token 付费时,缓存失效不再是计算机科学笑话,而是会计问题。"*
---
## 十五、自动压缩与 250K API 调用浪费
`services/compact/autoCompact.ts` 中有一段引人注目的注释:
> 2026-03-10BQ 分析显示 1,279 个会话在单次会话中有 50+ 连续自动压缩失败(最高达 3,272 次),全球每日浪费约 250,000 次 API 调用。
修复方案:**三行代码**。
```typescript
const MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3
```
添加一个断路器,连续失败 3 次后停止重试。
自动压缩参数:
- 缓冲区13,000 tokens`AUTOCOMPACT_BUFFER_TOKENS`
- 警告阈值:上下文窗口 - 20,000 tokens
- 摘要输出预留20,000 tokens基于 p99.99 实际摘要为 17,387 tokens
---
## 十六、IDE 桥接Bridge
```mermaid
graph LR
subgraph IDE["IDE 端"]
VSCODE["VS Code 扩展"]
JETBRAINS["JetBrains 插件"]
end
subgraph Bridge["桥接层 (27 个文件)"]
BRIDGE_MAIN["bridgeMain.ts<br/>2,999 行<br/>CCR WebSocket 服务器"]
REPL_BRIDGE["replBridge.ts<br/>2,406 行<br/>REPL 远程模式"]
end
subgraph Cloud["claude.ai"]
CCR["Claude Code Remote"]
end
subgraph Local["本地 CLI"]
CLAUDE["claude 进程"]
end
VSCODE <-->|JWT 认证| BRIDGE_MAIN
JETBRAINS <-->|JWT 认证| BRIDGE_MAIN
BRIDGE_MAIN <-->|WebSocket| CCR
REPL_BRIDGE <-->|WebSocket| CCR
BRIDGE_MAIN --> CLAUDE
REPL_BRIDGE --> CLAUDE
```
桥接系统支持:
- WebSocket 双向通信
- JWT 认证 + Token 刷新调度
- 指数退避重连
- 可信设备 Token 管理
- 容量感知唤醒(`capacityWake.ts`
- 消息流控门(`flushGate.ts`
---
## 十七、构建时特性开关系统
Claude Code 最精妙的设计之一是其构建时特性开关系统:
```typescript
// 使用 bun:bundle 的 feature() 函数
if (feature('KAIROS')) {
// 此代码在外部构建中被完整删除
loadKairosModule()
}
// 用户类型检查也会被常量折叠
if ("external" === 'ant') {
// 外部构建:编译为 if (false) → 死代码消除
loadInternalOnlyFeature()
}
```
**已知特性开关**44 个,部分列表):
| 开关名 | 功能 |
|--------|------|
| `KAIROS` / `PROACTIVE` | 自主守护智能体 |
| `ANTI_DISTILLATION_CC` | 反蒸馏保护 |
| `COORDINATOR_MODE` | 多智能体协调 |
| `BRIDGE_MODE` | IDE 桥接 |
| `DAEMON` | 后台守护进程 |
| `VOICE_MODE` | 语音输入 |
| `BUDDY` | 伴侣系统 |
| `HISTORY_SNIP` | 历史裁剪 |
| `WORKFLOW_SCRIPTS` | 工作流脚本 |
| `AGENT_TRIGGERS` | 智能体触发器 |
| `FORK_SUBAGENT` | 分叉子智能体 |
| `REACTIVE_COMPACT` | 响应式压缩 |
| `CONTEXT_COLLAPSE` | 上下文折叠 |
| `TRANSCRIPT_CLASSIFIER` | 转录分类器 |
| `NATIVE_CLIENT_ATTESTATION` | 原生客户端证明 |
| `TEMPLATES` | 模板系统 |
| `TORCH` / `ULTRAPLAN` / `UDS_INBOX` | 未知内部功能 |
---
## 十八、语音输入
`hooks/useVoice.ts` 实现了**按住说话**的语音输入:
- 使用 Anthropic 的 `voice_stream` STT 端点Deepgram 后端)
- macOS 原生音频或 SoX 录制
- WebSocket 连接到 `conversation_engine` 端点
- 支持多语言BCP-47 编码,从系统 locale 自动检测)
- "Keyterms" 注入提升识别准确度
- 5 次快速按键激活阈值(防止正常打字误触发)
- 通过 `VOICE_MODE` 构建开关完整移除
---
## 十九、关键架构模式总结
### 19.1 流式优先Streaming-First
`submitMessage()``query()``queryModelWithStreaming()`,整个链路都是 `AsyncGenerator<SDKMessage>`。工具执行期间通过 `onProgress` 回调发出进度消息。
### 19.2 依赖注入测试
`QueryDeps` 接口注入 `callModel`、`microcompact`、`autocompact`、`uuid`,避免测试中使用 `spyOn`
### 19.3 上下文穿透
`ToolUseContext` 是贯穿整个工具执行链路的"胖上下文"对象。子智能体通过 `createSubagentContext()` 获得 fork 的副本。
### 19.4 双层特性门控
- **构建时**`feature()` 从 `bun:bundle` 常量折叠,死代码消除
- **运行时**GrowthBook 远程开关(`tengu_*`),支持灰度发布和 A/B 测试
### 19.5 分叉子智能体
后台任务autoDream、压缩、会话记忆、推测执行都通过 `runForkedAgent()` 运行——隔离的子智能体,有自己的查询来源,防止递归并共享父级的缓存安全参数。
---
## 二十、代码质量观察
| 指标 | 数据 |
|------|------|
| 总代码量 | 512,664 行 TypeScript |
| 文件数 | 1,884 个 `.ts/.tsx` |
| 最大文件 | `cli/print.ts`5,594 行,单函数 3,167 行12 层嵌套) |
| 第二大文件 | `main.tsx`4,683 行) |
| API 客户端 | `claude.ts`3,419 行) |
| MCP 客户端 | `mcp/client.ts`3,348 行) |
| 桥接主模块 | `bridgeMain.ts`2,999 行) |
一些值得注意的代码风格:
- 偏好单文件大函数而非过度抽象(`print.ts` 是极端案例)
- 大量使用 `feature()` 门控保持外部构建精简
- 独创的 analytics 安全类型:`AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS`——防止开发者意外将文件路径或代码片段发送到分析系统
- `tengu_` 前缀统一所有实验名和事件名Tengu 是内部代号,讽刺的是在 Undercover Mode 的注释中被列为"不应暴露的代码名"示例)
---
## 结语
Claude Code 的 512,664 行源码揭示了一个工程复杂度远超预期的系统。它不仅仅是一个"LLM 套壳"——从自研终端渲染引擎到 23 项 Bash 安全检查,从多智能体协调到 prompt 缓存经济学,每一个模块都体现了在真实生产环境中打磨 AI 编程工具的深度工程投入。
最具战略意义的发现不是源码本身(它可以被重构),而是那 44 个特性开关背后的产品路线图KAIROS 自主守护智能体、语音输入、团队协作记忆……这些代表着 Anthropic 对 AI 编程工具未来形态的判断。而这种战略意外,无法被 DMCA 撤回。