出大事了!!
安全研究员 Chaofan Shou 的 X 账号发帖称,「Claude Code 的源代码通过其 npm 注册表中的一个映射文件泄露了!」

query.ts(约 785KB,包含主 Agent 循环逻辑)
本次泄露的 npm 包为 @anthropic-ai/claude-code 的 2.1.88 版本。
可以从泄露包提取、反编译出 TypeScript 源代码。
对源代码的分析,可以总结出 claude code 这款业内最先进的 AI 编程工具的 Agent 模式如何运行,整体架构,目录结构,以及五个关键主题。
Agent 循环:

目录结构:
src/
├── main.tsx # REPL 引导程序,4,683 行
├── QueryEngine.ts # SDK/headless 查询生命周期引擎
├── query.ts # 主Agent循环 (785KB,最大文件)
├── Tool.ts # 工具接口 + buildTool 工厂
├── Task.ts # 任务类型、ID、状态基类
├── tools.ts # 工具注册、预设、过滤
├── commands.ts # 斜杠命令定义
├── context.ts # 用户输入上下文
├── cost-tracker.ts # API 成本累积
├── setup.ts # 首次运行设置流程
│
├── bridge/ # Claude Desktop / 远程桥接
│ ├── bridgeMain.ts # 会话生命周期管理器
│ ├── bridgeApi.ts # HTTP 客户端
│ ├── bridgeConfig.ts # 连接配置
│ ├── bridgeMessaging.ts # 消息中继
│ ├── sessionRunner.ts # 进程生成
│ ├── jwtUtils.ts # JWT 刷新
│ ├── workSecret.ts # 认证令牌
│ └── capacityWake.ts # 基于容量的唤醒
│
├── cli/ # CLI 基础设施
│ ├── handlers/ # 命令处理器
│ └── transports/ # I/O 传输 (stdio, structured)
│
├── commands/ # ~80 个斜杠命令
├── components/ # React/Ink 终端 UI
├── entrypoints/ # 应用入口点
├── hooks/ # React hooks
├── services/ # 业务逻辑层
├── state/ # 应用状态
├── tasks/ # 任务实现
├── tools/ # 40+ 工具实现
├── types/ # 类型定义
├── utils/ # 工具函数(最大目录)
└── vendor/ # 原生模块源码存根整体架构:

五个关键主题:
下面来逐个看这些发现的具体内容。
Claude Code 会收集很多环境和使用数据。
虽然没发现键盘记录或源代码窃取的证据,但收集范围之广、无法完全退出的事实,确实让人对隐私有些担忧。
远程监控有两条数据传输的实现方式:
一条发给 Anthropic 自己,一条发给第三方 Datadog。
https://api.anthropic.com/api/event_logging/batch
~/.claude/telemetry/
https://http-intake.logs.us5.datadoghq.com/api/v2/logs
Datadog 是第三方监控服务商。
每个事件都会带上如下信息:
- 操作系统类型、架构、Node.js 版本
- 终端类型(比如 iTerm2、VS Code 终端)
- 安装了哪些包管理器和运行时
- 是否在 CI/CD 环境中运行,GitHub Actions 相关信息
- WSL 版本、Linux 发行版、内核版本
- 使用的版本控制系统
- Claude Code 版本和构建时间
- 部署环境标识相当于每次交互,都会把你的”电脑画像”发出去。
- 运行时间
- 内存占用(rss、heapTotal、heapUsed)
- CPU 使用率
- 内存占用详情就像手机 App 会统计崩溃、卡顿一样,Claude Code 也会监控自己的运行状态。
- 正在使用的模型(比如 claude-3-opus)
- 会话 ID、用户 ID、设备 ID
- 账户 UUID、组织 UUID
- 订阅等级(max、pro、enterprise、team)
- 仓库远程 URL 的哈希值(SHA256 前 16 位)
- Agent 类型、团队名、父会话 ID”仓库远程 URL 的哈希值”这个设计应该是避免直接发送 GitHub 地址,而是发一段哈希。
服务端可以用这段哈希做关联分析,但不知道你的具体仓库地址。
当你在 Claude Code 里执行命令时,工具的输入内容也会被记录。默认会截断:
- 字符串:超过 512 字符截断,只显示前 128 字符 + 省略号
- JSON:限制在 4,096 字符
- 数组:最多记录 20 项
- 嵌套对象:最多 2 层但有个后门:如果你设置了环境变量 OTEL_LOG_TOOL_DETAILS=1,完整的工具输入会被记录下来。
这个变量通常是开发者调试用的,普通用户可能不知道它的存在。
涉及这些 Bash 命令时,Claude Code 会提取你操作的文件扩展名:
rm, mv, cp, touch, mkdir, chmod, chown, cat, head, tail, sort, stat, diff, wc, grep, rg, sed
比如你执行 cat config.json,它会记录你操作了 .json 文件。
第一条日志管道(发给 Anthropic 的那条)无法被关闭。
isAnalyticsDisabled() 这个函数只在以下情况返回 true:
也就是说,用户不能自行设置禁用第一种事件日志。
用 Claude Code,就得接受数据被收集。
用户会被分配到实验组,但自己并不知道。
系统会发送这些属性:
- id、sessionId、deviceID
- platform、organizationUUID、subscriptionType这叫 GrowthBook A/B 测试,用来验证新功能的效果。
Anthropic 内部用动物名称作为模型代号。
这些代号被严格保护,防止泄露到外部构建中。
代号 | 角色 | 证据 |
|---|---|---|
Tengu(天狗) | 产品/监控前缀,也可能是模型 | 所有 250+ 分析事件和 feature flag 都用 tengu_* 前缀 |
Capybara(水豚) | Sonnet 系列模型,当前版本 v8 | 代码里有 capybara-v2-fast[1m],还有针对 v8 行为问题的补丁 |
Fennec(耳廓狐) | Opus 4.6 的前代 | 迁移逻辑:fennec-latest → opus |
Numbat(袋食蚁兽) | 下一代模型 | 注释写道:“Remove this section when we launch numbat” |
有个叫”Undercover 模式”的功能,明确列出了受保护的代号:
// src/utils/undercover.ts:48-49
NEVER include in commit messages or PR descriptions:
- Internal model codenames (animal names like Capybara, Tengu, etc.)
- Unreleased model version numbers (e.g., opus--, sonnet--)绝不要在 commit 信息或 PR 描述里包含内部模型代号(如 Capybara、Tengu 等动物名称)和未发布的模型版本号(如 opus-4-7、sonnet-4-8)。
构建系统会用扫描是否有代号泄露。
源码揭示了 Capybara v8(即 Sonnet v8)的一些行为问题:
<functions> 标签时触发这些都是工程团队在模型部署后,通过 prompt 工程来弥补模型行为的例子。
所有 feature flag 都用 tengu_ 前缀 + 随机词对,让人看不出具体用途:
Auto Dream(后台记忆整理)这种命名方式既保护了内部信息,又方便开发人员识别。
Anthropic 员工(代码里 USER_TYPE === 'ant')使用时,功能更好更全:
维度 | 外部用户 | 内部用户(ant) |
|---|---|---|
输出风格 | “尽量简洁” | “倾向于更多解释” |
虚假声明缓解 | 无 | 有专门的 Capybara v8 补丁 |
数值长度锚定 | 无 | “工具间 ≤25 词,最终回复 ≤100 词” |
验证 Agent | 无 | 非简单改动必须启用 |
主动性 | 无 | “发现用户误解要指出” |
简单说,内部用户享受的是”Pro 版中的 Pro 版”。
代码里还藏着一些隐藏命令:
命令 | 状态 | 描述 |
|---|---|---|
/btw | 活跃 | 顺带提问,不打断主对话 |
/stickers | 活跃 | 订购 Claude Code 贴纸 |
/thinkback | 活跃 | 2025 年度回顾 |
/good-claude | 占位 | 隐藏的 stub 命令 |
/bughunter | 占位 | 隐藏的 stub 命令 |
卧底模式(Undercover Mode)是 Anthropic 员工在公开或开源仓库贡献时的安全系统。
激活后,它会删除所有 AI 特征,指示模型把贡献伪装成人类开发者写的。
// src/utils/undercover.ts:28-37
export functionisUndercover():boolean {
if (process.env.USER_TYPE==='ant') {
if (isEnvTruthy(process.env.CLAUDE_CODE_UNDERCOVER)) return true
// 自动模式:除非确认在白名单内部仓库,否则默认激活
return getRepoClassCached() !=='internal'
}
return false
}关键特性:
USER_TYPE === 'ant')才会触发
当卧底模式激活时,模型会收到这样的指令:
## UNDERCOVER MODE — CRITICAL
You are operating UNDERCOVER in a PUBLIC/OPEN-SOURCE repository.
Do not blow your cover.
NEVER include in commit messages or PR descriptions:
- 内部模型代号(如 Capybara、Tengu 等动物名称)
- 未发布的模型版本号(如 opus-4-7、sonnet-4-8)
- 内部仓库或项目名(如 claude-cli-internal)
- 内部工具、Slack 频道或短链接
- "Claude Code" 这个词或任何你是 AI 的暗示
- 任何关于你是什么模型或版本的提示
- Co-Authored-By 行或任何其他归属
像人类开发者一样写 commit message。
好:
- "Fix race condition in file watcher initialization"
坏:
- "Fix bug found while testing with Claude Capybara"
- "Generated with Claude Code"
- "Co-Authored-By: Claude Opus 4.6 <…>"关键词:“Do not blow your cover”(不要暴露你的掩护身份)。
这相当于在告诉模型:你现在是个卧底特工,别露馅了。
归属系统补充了卧底模式,会把模型代号打码:
// src/utils/model/model.ts:386-392
functionmaskModelCodename(baseName:string):string {
// capybara-v2-fast → cap*****-v2-fast
const [codename ='',...rest] = baseName.split('-')
const masked = codename.slice(,) +'*'.repeat(Math.max(, codename.length-))
return [masked,...rest].join('-')
}比如 capybara-v2-fast 会变成 cap*****-v2-fast。
当 Anthropic 员工用 Claude Code 参与开源项目时:
1. 代码由 AI 编写,但 commit 看起来像是人类提交的
2. 没有 “Co-Authored-By: Claude” 署名
3. 没有 “Generated with Claude Code” 标记
4. 项目维护者和社区无法识别 AI 生成的贡献
5. 这可能违反开源社区关于 AI 贡献的透明度规范
实现了多种远程控制机制,允许 Anthropic(和企业管理员)在无需用户明确同意的情况下修改行为。
每个符合条件的会话都会从这个 API 端点获取设置:
GET /api/claude_code/settings代码位置:src/services/remoteManagedSettings/index.ts
const POLLING_INTERVAL_MS =**// 每小时
const DEFAULT_MAX_RETRIES =每小时静默轮询一次,最多重试 5 次。
当远程设置包含”危险”变更时,会弹出一个阻塞对话框:
// src/services/remoteManagedSettings/securityCheck.tsx:67-73
export functionhandleSecurityCheckResult(result: SecurityCheckResult):boolean {
if (result ==='rejected') {
gracefulShutdownSync() // 退出码 1,直接终止
return false
}
return true
}拒绝远程设置的用户,程序直接退出。
用户只有两个选择:接受远程设置,或者 Claude Code 关掉。
远程服务器不可达时,会使用缓存的旧设置。
一旦设置过,就永远无法完全摆脱远程控制。
多种功能可以通过 GrowthBook feature flag 远程禁用:
// src/utils/permissions/bypassPermissionsKillswitch.ts
// 通过 Statsig gate 禁用绕过权限功能// src/utils/permissions/autoModeState.ts
// autoModeCircuitBroken 状态阻止重新进入自动模式// src/utils/fastMode.ts
// 从 /api/claude_code_penguin_mode 获取状态
// 可以永久禁用用户的快速模式// src/services/analytics/sinkKillswitch.ts:4
const SINK_KILLSWITCH_CONFIG_NAME ='tengu_frond_boric'// src/voice/voiceModeEnabled.ts:21
// 'tengu_amber_quartz_disabled' — 语音模式紧急关闭Anthropic 可以远程覆盖内部员工使用的模型:
// src/utils/model/antModels.ts:32-33
// @[MODEL LAUNCH]: Update tengu_ant_model_override with new ant-only modelstengu_ant_model_override 这个 GrowthBook flag 可以:
机制 | 范围 | 用户同意 |
|---|---|---|
远程托管设置 | Enterprise/Team | 接受或退出 |
GrowthBook feature flags | 所有用户 | 无 |
Kill switches | 所有用户 | 无 |
模型覆盖 | 内部(ant) | 无 |
快速模式控制 | 所有用户 | 无 |
远程控制极其广泛,且在很大程度上没有用户可见性或同意机制。
企业管理员可以强制执行用户无法覆盖的策略,Anthropic 可以通过 feature flag 远程更改任何用户的行为。
下一代模型最具体的证据:
// src/constants/prompts.ts:402
// @[MODEL LAUNCH]: Remove this section when we launch numbat.Numbat(袋食蚁兽) 是即将发布的模型代号。
注释表明 Numbat 发布时将移除当前的 output efficiency 段落,暗示新模型可能有更好的原生输出控制能力。
// src/utils/undercover.ts:49
- Unreleased model version numbers (e.g., opus--, sonnet--)Opus 4.7 和 Sonnet 4.8 正在开发中。
Fennec(耳廓狐)→ Opus 4.6 → [Numbat?]
Capybara(水豚)→ Sonnet v8 → [?]
Tengu(天狗)→ 产品/监控前缀代码中有 20+ 处 @[MODEL LAUNCH] 标记,列出了新模型发布时需要更新的所有位置:
默认模型名称、知识截止日期、定价表、上下文窗口配置、Thinking 模式支持、迁移脚本。
这是最大的未发布特性。
KAIROS 将 Claude Code 从被动助手转变为主动自主值守。
// src/constants/prompts.ts:860-913
你正在自主运行。
你会收到 <tick> 提示让你保持活跃。
如果没有有用的事可做,调用 SleepTool。
倾向行动 — 读取文件、做修改、提交,无需询问。
## 终端焦点
- 未聚焦:用户离开了。大幅倾向自主行动。
- 聚焦:用户在看。更协作。工具 | Feature Flag | 用途 |
|---|---|---|
SleepTool | KAIROS / PROACTIVE | 控制自主操作间的节奏 |
SendUserFileTool | KAIROS | 主动向用户发送文件 |
PushNotificationTool | KAIROS / KAIROS_PUSH_NOTIFICATION | 推送通知到用户设备 |
SubscribePRTool | KAIROS_GITHUB_WEBHOOKS | 订阅 GitHub PR webhook 事件 |
BriefTool | KAIROS_BRIEF | 主动状态更新 |
<tick> 心跳提示保持活跃简单说,这是一个”你下班了它还在干活”的模式。
Push-to-talk 语音输入已完全实现,但通过 VOICE_MODE feature flag 门控。
// src/voice/voiceModeEnabled.ts
// 连接 Anthropic 的 voice_stream WebSocket 端点
// 使用 conversation_engine 模型做语音转文字
// 按住快捷键录音,松开提交语言模式限制:
工具 | Feature Flag | 描述 |
|---|---|---|
WebBrowserTool | WEB_BROWSER_TOOL | 内置浏览器自动化(代号:bagel) |
TerminalCaptureTool | TERMINAL_PANEL | 终端面板捕获和监控 |
WorkflowTool | WORKFLOW_SCRIPTS | 执行预定义工作流脚本 |
MonitorTool | MONITOR_TOOL | 系统/进程监控 |
SnipTool | HISTORY_SNIP | 对话历史裁剪 |
ListPeersTool | UDS_INBOX | Unix 域套接字对等发现 |
RemoteTriggerTool | AGENT_TRIGGERS_REMOTE | 远程触发Agent |
SubscribePRTool | KAIROS_GITHUB_WEBHOOKS | GitHub PR webhook 订阅 |
多 Agent 协调系统:
// src/coordinator/coordinatorMode.ts
// Feature flag: COORDINATOR_MODE支持多个 Agent 之间的协调任务执行,具有共享状态和消息传递。
完整的宠物伙伴系统已实现但尚未上线:
这是一个类似游戏宠物系统的功能,每个用户会随机分配一个虚拟宠物陪伴使用。
后台记忆整理固化子Agent:
// src/tasks/DreamTask/
// 后台自动"做梦"功能
// 由 'tengu_onyx_plover' feature flag 控制使 AI 能在空闲时间自主处理和将记忆固化。
就像人类睡觉时会整理白天的记忆一样。
Claude Code 正在从一个编程助手进化为一个全天候自主开发Agent。
-END-