Skip to content

Latest commit

 

History

History
542 lines (430 loc) · 24 KB

File metadata and controls

542 lines (430 loc) · 24 KB

Claude Code 服务层架构分析

基于 src/services/ 目录下的实际源码分析。共 21 个服务子目录 + 11 个独立服务文件


1. 服务总览

服务 类型 核心职责
api/ 核心基础设施 API 客户端、bootstrap、usage tracking、重试逻辑
mcp/ 核心协议 MCP (Model Context Protocol) 协议实现与连接管理
oauth/ 核心认证 OAuth 2.0 + PKCE 认证流程
lsp/ 核心IDE集成 LSP 语言服务器管理与诊断
analytics/ 核心可观测性 事件日志、Datadog、GrowthBook 特性开关
compact/ 核心上下文管理 上下文压缩(自动/微压缩/会话记忆)
plugins/ 核心扩展性 插件安装、市场管理、CLI 命令
tools/ 核心执行层 工具编排、执行、hook、流式执行
oauth/ 核心认证 OAuth 2.0 + PKCE 授权码流
settingsSync/ 基础设施 跨环境设置同步
remoteManagedSettings/ 企业管理 远程托管配置拉取与缓存
policyLimits/ 企业管理 组织级策略限制
teamMemorySync/ 协作 团队记忆文件同步
SessionMemory/ AI记忆 会话级持久化记忆
extractMemories/ AI记忆 从会话中提取持久化记忆
autoDream/ AI记忆 后台记忆整合(/dream)
AgentSummary/ 协调器 子代理进度摘要
PromptSuggestion/ UX增强 智能提示建议
MagicDocs/ UX增强 自动文档更新
tips/ UX增强 Spinner 期间的提示展示
toolUseSummary/ SDK 工具调用批次的可读摘要

独立服务文件

文件 职责
voice.ts 音频录制(push-to-talk),原生 cpal/SoX 回退
voiceStreamSTT.ts 流式语音转文字
voiceKeyterms.ts 语音关键词处理
notifier.ts 系统通知(macOS/Linux/Windows)
preventSleep.ts 阻止系统休眠
diagnosticTracking.ts 诊断跟踪状态管理
tokenEstimation.ts Token 用量估算
internalLogging.ts 内部日志
vcr.ts 录制/回放功能
claudeAiLimits.ts Claude.ai 速率限制处理
rateLimitMocking.ts 速率限制模拟(测试用)
mockRateLimits.ts 速率限制 mock
awaySummary.ts 离开时的会话摘要

2. 核心服务详细分析

2.1 api/ — API 客户端层

职责: 与 Anthropic API 的所有通信。支持 Direct API、AWS Bedrock、Google Vertex AI、Azure Foundry 四种后端。

关键文件与接口:

文件 功能 对外接口
client.ts Anthropic SDK 客户端工厂 createAnthropicClient(), 多 provider 配置
claude.ts 消息发送核心 query(), streamClaudeResponse(), getMaxOutputTokensForModel()
bootstrap.ts 启动时获取客户端配置 fetchBootstrap(), 返回 client_data + additional_model_options
usage.ts 用量/速率追踪 fetchUtilization(), Utilization (5h/7d 限制)
withRetry.ts 智能重试 withRetry(), 指数退避, 529 熔断, 前台/后台区分
errors.ts 错误处理 formatAPIError(), 速率限制消息, 订阅检测
filesApi.ts 文件 API 文件上传/下载,beta header files-api-2025-04-14
grove.ts Grove (组织功能) fetchGroveConfig(), 24h 缓存
logging.ts API 请求日志 请求/响应记录
sessionIngress.ts 会话入口 会话注册
referral.ts 推荐系统 推荐链接管理
adminRequests.ts 管理请求 管理员 API 调用

多 Provider 支持:

  • Direct API: ANTHROPIC_API_KEY
  • AWS Bedrock: AWS credentials + region 配置
  • Vertex AI: ANTHROPIC_VERTEX_PROJECT_ID + model-specific region
  • Azure Foundry: ANTHROPIC_FOUNDRY_RESOURCE + Azure AD / API key

重试策略:

  • 默认最大重试 10 次,指数退避(500ms 基础延迟)
  • 529 错误:前台查询重试最多 3 次,后台查询立即放弃
  • OAuth 401 自动刷新重试(withOAuth401Retry
  • AWS/GCP 凭证自动刷新

2.2 mcp/ — MCP 协议实现

职责: Model Context Protocol 的完整实现,管理 MCP 服务器连接、工具发现、资源读取。

关键文件与接口:

文件 功能 对外接口
client.ts MCP 客户端核心 MCPClient 类, 工具/资源/提示发现与调用
config.ts MCP 配置管理 getClaudeCodeMcpConfigs(), 配置合并(local/user/project/enterprise)
types.ts 类型定义 McpServerConfig, MCPServerConnection, 7 种配置作用域
useManageMCPConnections.ts 连接管理 React Hook 连接/断开/重连,工具列表刷新
auth.ts MCP OAuth 认证 discoverAuthorizationServerMetadata(), PKCE, token 刷新
normalization.ts 工具/资源归一化 名称规范化,冲突解决
InProcessTransport.ts 进程内传输 内存中 MCP 服务器
SdkControlTransport.ts SDK 控制传输 SDK 控制的 MCP 传输
channelAllowlist.ts 通道白名单 通道级 MCP 访问控制
channelPermissions.ts 通道权限 工具级细粒度权限
officialRegistry.ts 官方注册表 MCP 服务器注册表查询
envExpansion.ts 环境变量展开 ${VAR} 语法支持
headersHelper.ts HTTP Headers 自定义 header 处理
elicitationHandler.ts 引出处理 MCP elicitation 协议
oauthPort.ts OAuth 端口 MCP OAuth 回调端口管理
xaa.ts 跨应用访问 (XAA) IdP 联合认证
claudeai.ts Claude.ai 集成 Claude.ai MCP 配置获取

配置作用域(ConfigScope):

  1. local — 本地项目配置
  2. user — 用户全局配置
  3. project — 项目共享配置
  4. dynamic — 动态添加
  5. enterprise — 企业管理配置
  6. claudeai — Claude.ai 配置
  7. managed — 托管配置

传输协议支持:

  • stdio — 标准输入/输出
  • sse — Server-Sent Events
  • http — Streamable HTTP
  • ws — WebSocket
  • sdk — SDK 内部

2.3 oauth/ — OAuth 认证服务

职责: OAuth 2.0 + PKCE 授权码流的完整实现。

关键文件与接口:

文件 功能 对外接口
index.ts OAuthService startOAuthFlow(), 支持自动/手动两种授权码获取方式
client.ts OAuth API 客户端 buildAuthUrl(), exchangeCodeForTokens(), refreshTokens(), 用户信息获取
crypto.ts PKCE 加密 generateCodeVerifier(), generateCodeChallenge(), generateState()
auth-code-listener.ts 回调监听器 AuthCodeListener, localhost 回调服务器
getOauthProfile.ts 用户画像 OAuth profile 获取

OAuth 流程:

  1. 生成 PKCE code_verifier + code_challenge
  2. 构建授权 URL(支持 Claude.ai 和 Console 两种入口)
  3. 自动模式:打开浏览器 → localhost 回调捕获授权码
  4. 手动模式:用户手动复制粘贴授权码
  5. 交换 token → 存储 OAuth tokens
  6. token 过期自动刷新

支持的登录方式:

  • loginWithClaudeAi — Claude.ai 订阅者
  • inferenceOnly — 仅推理权限
  • 自定义 orgUUID — 组织级登录
  • loginHint — 登录提示

2.4 lsp/ — LSP 语言服务器

职责: 管理多个 LSP 语言服务器实例,按文件扩展名路由请求。

关键文件与接口:

文件 功能 对外接口
manager.ts 全局单例管理 getLspServerManager(), initializeLspServerManager(), shutdownLspServerManager()
LSPServerManager.ts 服务器管理器 initialize(), shutdown(), getServerForFile(), sendRequest(), openFile()/changeFile()/saveFile()/closeFile()
LSPClient.ts LSP 客户端 createLSPClient(), 基于 vscode-jsonrpc, stdio 通信
LSPServerInstance.ts 服务器实例 单个 LSP 服务器的生命周期管理
config.ts 配置加载 getAllLspServers(), 从 settings 读取 LSP 配置
passiveFeedback.ts 被动反馈 LSP 诊断 → Claude 诊断格式转换
LSPDiagnosticRegistry.ts 诊断注册 LSP 诊断事件注册与追踪

管理器接口(LSPServerManager):

interface LSPServerManager {
  initialize(): Promise<void>
  shutdown(): Promise<void>
  getServerForFile(filePath: string): LSPServerInstance | undefined
  ensureServerStarted(filePath: string): Promise<LSPServerInstance | undefined>
  sendRequest<T>(filePath: string, method: string, params: unknown): Promise<T | undefined>
  openFile(filePath: string, content: string): Promise<void>
  changeFile(filePath: string, content: string): Promise<void>
  saveFile(filePath: string): Promise<void>
  closeFile(filePath: string): Promise<void>
  isFileOpen(filePath: string): boolean
}

2.5 analytics/ — 分析与特性开关

职责: 事件日志路由(Datadog + 一阶方事件)、GrowthBook 特性开关。

关键文件与接口:

文件 功能 对外接口
index.ts 公共 API logEvent(), logEventAsync(), 事件队列, AnalyticsSink 接口
sink.ts 路由实现 initializeAnalyticsSink(), Datadog + 1P 双路路由
datadog.ts Datadog 集成 trackDatadogEvent(), 批量发送(100条/15s), 允许事件白名单
growthbook.ts GrowthBook getFeatureValue_CACHED_MAY_BE_STALE(), checkStatsigFeatureGate_CACHED_MAY_BE_STALE(), A/B 测试
firstPartyEventLogger.ts 一阶方事件 logEventTo1P(), shouldSampleEvent(), 实验曝光日志
firstPartyEventLoggingExporter.ts 事件导出 一阶方事件导出器
metadata.ts 事件元数据 getEventMetadata(), 平台/模型/版本信息
config.ts 配置 isAnalyticsDisabled(), 分析开关
sinkKillswitch.ts 杀开关 isSinkKilled(), 紧急关闭特定 sink

设计特点:

  • 零依赖设计index.ts 无任何外部依赖,避免循环引用
  • 事件排队:sink 未初始化前事件入队,attach 后批量消费
  • PII 保护_PROTO_* 前缀字段仅 1P exporter 可见,Datadog 自动过滤
  • GrowthBook 集成:远程特性评估,支持 targeting(用户属性/订阅类型/平台)

2.6 compact/ — 上下文压缩

职责: 当上下文窗口接近上限时自动压缩对话历史。

关键文件与接口:

文件 功能 对外接口
compact.ts 核心压缩 compactConversation(), 将对话历史压缩为摘要
autoCompact.ts 自动压缩 isAutoCompactEnabled(), 基于 token 阈值触发
microCompact.ts 微压缩 时间基微压缩,清理旧工具结果,保留最近内容
apiMicrocompact.ts API 微压缩 基于 API 的微压缩策略
sessionMemoryCompact.ts 会话记忆压缩 压缩时更新会话记忆
grouping.ts 消息分组 将消息按主题分组以优化压缩
compactWarningHook.ts 压缩警告 接近上限时的用户警告 hook
compactWarningState.ts 警告状态 警告抑制/清除状态管理
postCompactCleanup.ts 压缩后清理 压缩后的资源清理
prompt.ts 压缩提示 压缩摘要的 prompt 构建
timeBasedMCConfig.ts 时间配置 微压缩的时间阈值配置

压缩策略层次:

  1. 微压缩 (Micro-compact):清理旧工具结果内容,替换为 stub
  2. API 微压缩:通过 API 端点执行微压缩
  3. 自动压缩 (Auto-compact):当 token 用量超过阈值时触发完整压缩
  4. 会话记忆压缩:压缩时同步更新会话记忆文件

关键常量:

  • MAX_OUTPUT_TOKENS_FOR_SUMMARY = 20,000
  • CAPPED_DEFAULT_MAX_TOKENS — 模型最大输出
  • 上下文窗口 = 模型窗口 - 预留压缩输出空间

2.7 plugins/ — 插件系统

职责: 后台插件安装、市场管理、CLI 命令处理。

关键文件与接口:

文件 功能 对外接口
PluginInstallationManager.ts 后台安装管理 performBackgroundPluginInstallations(), 市场 reconciliation
pluginOperations.ts 插件操作 插件安装/卸载/更新操作
pluginCliCommands.ts CLI 命令 /plugin 相关命令处理

安装流程:

  1. 加载已知市场配置 (loadKnownMarketplacesConfig)
  2. Diff 新旧市场 (diffMarketplaces)
  3. Reconcile 市场 (reconcileMarketplaces)
  4. 刷新活跃插件 (refreshActivePlugins)
  5. 更新 AppState 安装状态

依赖的工具层:

  • utils/plugins/marketplaceManager.ts — 市场管理
  • utils/plugins/pluginLoader.ts — 插件加载
  • utils/plugins/reconciler.ts — 市场协调
  • utils/plugins/refresh.ts — 插件刷新
  • utils/plugins/mcpPluginIntegration.ts — MCP 插件集成

3. 辅助服务分析

3.1 tools/ — 工具执行层

文件 功能
toolExecution.ts 单工具执行,权限检查,hook 执行
toolOrchestration.ts 并发安全工具编排(read-only 并发,write 串行)
StreamingToolExecutor.ts 流式工具执行器,实时处理到达的工具调用
toolHooks.ts Pre/post tool hook 执行,规则权限检查

并发策略:

  • isConcurrencySafe 标记的工具(read-only)可并行执行
  • 最大并发数由 CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY 控制(默认 10)
  • 写操作必须串行执行

3.2 settingsSync/ — 设置同步

  • 方向:交互式 CLI 上传 → 远程;CCR 下载 → 本地
  • 增量同步:只同步变更的条目
  • 文件大小限制:500KB/文件
  • 重试:最多 3 次,带退避

3.3 remoteManagedSettings/ — 远程托管配置

  • 目标用户:Enterprise/C4E 和 Team 订阅者
  • 设计:Fail-open(失败不阻塞),ETag 缓存,后台轮询(1 小时间隔)
  • 安全:配置签名验证

3.4 policyLimits/ — 策略限制

  • 来源:组织级 API 策略
  • 行为:禁用特定 CLI 功能
  • 设计:与 remoteManagedSettings 相同的 fail-open + ETag + 轮询模式

3.5 teamMemorySync/ — 团队记忆同步

  • 作用域:per-repo(基于 git remote hash)
  • 同步语义:Server wins per-key;delta upload(只上传内容变更的 key)
  • 安全:secret scanner 扫描敏感信息

3.6 SessionMemory/ — 会话记忆

  • 机制:forked subagent 后台运行,从对话中提取关键信息
  • 输出:Markdown 文件,持久化到项目记忆目录
  • 触发:注册到 post-sampling hook

3.7 extractMemories/ — 记忆提取

  • 时机:每个完整 query loop 结束时(stop hook)
  • 机制:forked agent 共享父 prompt cache
  • 输出~/.claude/projects/<path>/memory/ 下的记忆文件

3.8 autoDream/ — 记忆整合

  • 触发条件:时间门(小时)+ 会话积累数
  • 机制:forked subagent 执行 /dream prompt
  • 锁机制consolidationLock 防止并发整合

3.9 AgentSummary/ — 子代理摘要

  • 频率:每 ~30 秒
  • 方式:forked subagent 生成 3-5 词进度描述
  • 用途:协调器模式的 UI 展示

3.10 PromptSuggestion/ — 提示建议

  • 特性:智能意图预测、推测执行(speculation)
  • 控制:GrowthBook feature gate + 环境变量覆盖

3.11 MagicDocs/ — 自动文档

  • 触发:读取包含 # MAGIC DOC: [title] header 的文件
  • 机制:post-sampling hook 驱动后台更新

3.12 tips/ — Spinner 提示

  • 展示时机:Spinner 等待期间
  • 选择策略:优先展示最久未展示的 tip

3.13 toolUseSummary/ — 工具摘要

  • 方式:调用 Haiku 模型生成单行摘要
  • 限制:~30 字符截断(移动应用适配)

4. 服务间依赖关系

┌─────────────────────────────────────────────────────────────────┐
│                        用户界面层 (REPL/CLI)                       │
└───────────────────────────────┬─────────────────────────────────┘
                                │
        ┌───────────────────────┼───────────────────────┐
        │                       │                       │
        ▼                       ▼                       ▼
┌───────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   tools/      │     │    compact/     │     │    plugins/     │
│ (工具执行层)   │     │ (上下文压缩)     │     │   (插件系统)     │
└───────┬───────┘     └────────┬────────┘     └────────┬────────┘
        │                      │                       │
        │    ┌─────────────────┼───────────────────────┘
        │    │                 │
        ▼    ▼                 ▼
┌──────────────────────────────────────────────────────────────────┐
│                          api/ (API 客户端层)                        │
│  client.ts → claude.ts → withRetry.ts → bootstrap.ts → usage.ts │
└──────────────────────────┬───────────────────────────────────────┘
                           │
        ┌──────────────────┼──────────────────┐
        │                  │                  │
        ▼                  ▼                  ▼
┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│   oauth/     │   │    mcp/      │   │    lsp/      │
│ (OAuth认证)   │   │ (MCP协议)     │   │ (语言服务器)  │
└──────────────┘   └──────────────┘   └──────────────┘
        │                  │
        └──────────┬───────┘
                   │
                   ▼
        ┌──────────────────┐
        │   analytics/     │
        │ (分析 & 特性开关) │
        └──────────────────┘

核心依赖矩阵

下游服务 ↑ \ 下游依赖 → api/ oauth/ analytics/ mcp/ lsp/ compact/ tools/
tools/
compact/
plugins/
mcp/
oauth/
lsp/
analytics/
SessionMemory/
extractMemories/
autoDream/
settingsSync/
teamMemorySync/
remoteManagedSettings/
policyLimits/
PromptSuggestion/

关键依赖链

  1. api/ ← oauth/: client.ts 调用 checkAndRefreshOAuthTokenIfNeeded(), getClaudeAIOAuthTokens()
  2. api/ ← analytics/: errors.ts 调用 logEvent() 记录 API 错误
  3. mcp/ ← oauth/: auth.ts 实现 MCP 服务器的独立 OAuth 流
  4. mcp/ ← analytics/: 连接事件、工具调用事件日志
  5. compact/ ← api/: autoCompact.ts 调用 getMaxOutputTokensForModel()
  6. compact/ ← analytics/: microCompact.ts 记录压缩事件
  7. tools/ ← analytics/: toolExecution.ts 记录工具执行元数据
  8. tools/ ← mcp/: toolExecution.ts 调用 isMcpTool() 判断 MCP 工具
  9. settingsSync/ ← api/: 使用 withRetry 和 OAuth 认证
  10. SessionMemory/ ← compact/: sessionMemory.ts 检查 isAutoCompactEnabled()

analytics/ 是全系统的横切关注点

analytics/index.tslogEvent() 几乎被所有服务调用。它被设计为零依赖(无外部 import),通过事件队列 + sink 注入模式避免循环引用。


5. 架构设计模式

5.1 工厂函数 + 闭包(非类)

LSP、MCP 客户端等核心组件均使用工厂函数模式(createLSPClient(), createLSPServerManager()),通过闭包封装私有状态,避免 class 的 this 绑定问题。

5.2 Forked Agent 模式

多个服务(SessionMemory, extractMemories, autoDream, AgentSummary, PromptSuggestion)使用 runForkedAgent() 模式:

  • 创建主对话的完美 fork
  • 共享父级 prompt cache(CacheSafeParams)
  • 通过 canUseTool 回调限制工具使用
  • 在后台运行,不阻塞主对话

5.3 Hook 系统

服务间通过 hook 解耦:

  • postSamplingHooks — 采样后 hook(SessionMemory, MagicDocs)
  • preCompactHooks / postCompactHooks — 压缩前后 hook
  • preToolHooks / postToolHooks — 工具调用前后 hook
  • stopHooks — 停止时 hook(extractMemories)

5.4 Fail-Open 设计

企业级服务(remoteManagedSettings, policyLimits)均采用 fail-open 设计:

  • API 失败不阻塞启动
  • ETag 缓存减少网络请求
  • 后台轮询更新(1 小时间隔)
  • 最多 5 次重试 + 指数退避

5.5 Feature Gate 分层

环境变量 > GrowthBook feature gate > 默认值
  • 环境变量覆盖一切(测试用)
  • GrowthBook 远程评估(生产)
  • 安全默认值

6. 数据流总结

启动流程

bootstrap.ts (获取客户端配置)
    ↓
remoteManagedSettings (拉取远程配置)
    ↓
policyLimits (拉取策略限制)
    ↓
oauth (验证/刷新 token)
    ↓
mcp/config (加载 MCP 服务器配置)
    ↓
lsp/manager (初始化语言服务器)
    ↓
analytics/sink (初始化事件路由)
    ↓
plugins/PluginInstallationManager (后台安装插件)

请求流程

用户输入
    ↓
compact/autoCompact (检查是否需要压缩)
    ↓
api/claude.ts (发送 API 请求, withRetry)
    ↓
tools/toolOrchestration (编排工具调用)
    ↓
  ┌─────────┴──────────┐
  │                    │
  ▼                    ▼
mcp/client.ts      tools/toolExecution.ts
(远程工具)          (本地工具)
  │                    │
  └─────────┬──────────┘
            │
            ▼
  analytics/logEvent (记录事件)
            │
            ▼
  SessionMemory / extractMemories (后台记忆更新)

生成时间: 2026-03-31 | 基于 claude-code 源码分析