Claude Code 源码分析Claude Code 源码分析
首页
源码统计
系统架构
UML 图表
工具系统
CodeGraph
首页
源码统计
系统架构
UML 图表
工具系统
CodeGraph
  • 概览

    • Claude Code 源码分析
    • 源码统计
    • CodeGraph 图谱
  • 架构

    • 系统架构
    • UML 图表索引
    • 查询引擎
    • 核心流程
    • 消息系统
    • 状态管理
  • 功能模块

    • 工具系统
    • 斜杠命令
    • 服务层
    • MCP 协议
    • Skills 技能
    • 子代理系统
  • 分层深度

    • 入口层
    • UI / Ink 层
    • utils 基础设施
    • 桥接 / 远程
    • 上下文压缩
  • 原理与安全

    • 底层原理
    • 技术难点
    • 权限与安全
    • 内部机制
    • 遥测与分析
  • 深度专题

    • Hooks 系统
    • 插件系统
    • 记忆系统
    • API 通信层
    • Ink 终端 UI
    • 认证系统
    • 构建与发布
    • 术语表
  • 调用分析

    • 调用链分析
    • 核心文件索引
  • 模块详解

    • utils

      • 模块: utils
      • messages · 消息工厂与规范化
      • session-storage · JSONL 会话持久化
      • permissions · 工具权限决策
      • shell-hooks · 用户 Shell Hook 系统
    • components

      • 模块: components
      • REPL · 主屏编排
      • messages · 消息行渲染
      • PermissionRequest · 权限弹窗
      • PromptInput · 底部输入
    • services

      • 模块: services
      • api-claude · Anthropic API 流式与重试
      • mcp-client · MCP 连接与工具调用
      • compact · 上下文压缩与自动触发
      • analytics · GrowthBook、Datadog 与 1P 事件
    • tools

      • 模块: tools
      • tool-interface · Tool 契约与注册表
      • bash-tool · Shell 执行与权限
      • streaming-executor · 流式工具并发调度
      • agent-tool · 子 Agent 委派
    • commands

      • 模块: commands
      • command-registry · commands.ts 注册与分派
      • model-command · /model 模型选择
      • mcp-commands · /mcp 服务器管理
      • compact-memory-commands · /compact 与 /memory
    • ink

      • 模块: ink
      • Ink 渲染管线 · Screen 与终端输出
      • 终端事件 · resize、paste、stdin
      • Ink Hooks · 输入、搜索、终端状态
      • Ink 组件 · Box、Text、ScrollBox 原语
    • hooks

      • 模块: hooks
      • useCanUseTool · 权限 UI 接缝
      • 输入与快捷键 Hook
      • 合并态 Hook(MCP + 本地)
      • notifs 通知 Hook
    • bridge

      • 模块: bridge
      • repl-bridge · REPL 桥初始化与传输
      • bridge-messaging · 桥消息路由与入站处理
      • remote-bridge-core · env-less 核心与守护主循环
      • bridge-permissions-ui · 权限、API 与 TUI
    • cli

      • 模块: cli
      • Structured IO · NDJSON SDK 协议
      • CLI Transports · Session Ingress 传输层
      • CLI Handlers · 子命令懒加载实现
      • Update & Upload · 自更新与串行上传原语
    • screens

      • 模块: screens
      • REPL 屏 · Screen 类型与顶层路由
      • ResumeConversation · 会话恢复选择器
      • Doctor · 安装诊断全屏
    • entrypoints

      • 模块: entrypoints
      • cli-entrypoint · Bootstrap 与快路径
      • sdk-types · core / control / runtime 类型体系
      • mcp-entrypoint · MCP stdio 服务器
      • sandbox-types · 沙箱配置单一真相源
    • skills

      • 模块: skills
      • skills-loading · 磁盘加载与 bundled 注册表
      • bundled-skills · 内置 skill 与 initBundledSkills
      • mcp-skills · MCP prompt 转 skill
      • skill-tool-integration · SkillTool 与命令注册
    • types

      • 模块: types
      • message-types · Message 联合与 content blocks
      • tool-permission-types · Tool、Permission、Command 类型
      • api-sdk-types · API 与 Hooks 协议类型
      • misc-types · ids、plugin、generated 与其余类型
    • tasks

      • 模块: tasks
      • local-agent-task · 本地 Agent 与主会话后台化
      • remote-agent-task · 远程 CCR 与 In-Process Teammate
      • shell-workflow-tasks · Bash 后台、Workflow 与 stopTask
      • dream-monitor-tasks · Dream、Monitor MCP 与 pill 文案
    • keybindings

      • 模块: keybindings
      • keybinding-registry · 注册、Provider 与 useKeybinding
      • default-bindings · 默认键位表与平台差异
      • command-bindings · command:* 动态斜杠命令绑定
      • vim-bindings · Vim 模式与 keybindings 边界
    • memdir

      • 模块: memdir
      • memdir-core · 路径、加载与 MEMORY.md
      • memory-extraction · extractMemories 与 SessionMemory
      • memdir-commands · /memory、/remember 与命令集成
    • state

      • 模块: state
      • app-state-core · store、AppState 类型与 Provider
      • app-state-selectors · selectors 与 onChangeAppState
      • teammate-state · 队友视图与 swarm 状态
      • state-boundaries · bootstrap、sessionStorage、FileStateCache
    • query

      • 模块: query
      • query config 与 deps · 配置快照与依赖注入
      • query tokenBudget · +500k 自动续跑
      • query transitions · Continue / Terminal 状态机
      • query stopHooks · Stop 事件与 turn 结束编排
  • 模块详解(扩展)

    • messages · 消息工厂与规范化
    • session-storage · JSONL 会话持久化
    • permissions · 工具权限决策
    • shell-hooks · 用户 Shell Hook 系统
    • REPL · 主屏编排
    • messages · 消息行渲染
    • PermissionRequest · 权限弹窗
    • PromptInput · 底部输入
    • api-claude · Anthropic API 流式与重试
    • mcp-client · MCP 连接与工具调用
    • compact · 上下文压缩与自动触发
    • analytics · GrowthBook、Datadog 与 1P 事件
    • tool-interface · Tool 契约与注册表
    • bash-tool · Shell 执行与权限
    • streaming-executor · 流式工具并发调度
    • agent-tool · 子 Agent 委派
    • command-registry · commands.ts 注册与分派
    • model-command · /model 模型选择
    • mcp-commands · /mcp 服务器管理
    • compact-memory-commands · /compact 与 /memory
    • Ink 渲染管线 · Screen 与终端输出
    • 终端事件 · resize、paste、stdin
    • Ink Hooks · 输入、搜索、终端状态
    • Ink 组件 · Box、Text、ScrollBox 原语
    • useCanUseTool · 权限 UI 接缝
    • 输入与快捷键 Hook
    • 合并态 Hook(MCP + 本地)
    • notifs 通知 Hook
    • repl-bridge · REPL 桥初始化与传输
    • bridge-messaging · 桥消息路由与入站处理
    • remote-bridge-core · env-less 核心与守护主循环
    • bridge-permissions-ui · 权限、API 与 TUI
    • Structured IO · NDJSON SDK 协议
    • CLI Transports · Session Ingress 传输层
    • CLI Handlers · 子命令懒加载实现
    • Update & Upload · 自更新与串行上传原语
    • REPL 屏 · Screen 类型与顶层路由
    • ResumeConversation · 会话恢复选择器
    • Doctor · 安装诊断全屏
    • cli-entrypoint · Bootstrap 与快路径
    • sdk-types · core / control / runtime 类型体系
    • mcp-entrypoint · MCP stdio 服务器
    • sandbox-types · 沙箱配置单一真相源
    • skills-loading · 磁盘加载与 bundled 注册表
    • bundled-skills · 内置 skill 与 initBundledSkills
    • mcp-skills · MCP prompt 转 skill
    • skill-tool-integration · SkillTool 与命令注册
    • message-types · Message 联合与 content blocks
    • tool-permission-types · Tool、Permission、Command 类型
    • api-sdk-types · API 与 Hooks 协议类型
    • misc-types · ids、plugin、generated 与其余类型
    • local-agent-task · 本地 Agent 与主会话后台化
    • remote-agent-task · 远程 CCR 与 In-Process Teammate
    • shell-workflow-tasks · Bash 后台、Workflow 与 stopTask
    • dream-monitor-tasks · Dream、Monitor MCP 与 pill 文案
    • keybinding-registry · 注册、Provider 与 useKeybinding
    • default-bindings · 默认键位表与平台差异
    • command-bindings · command:* 动态斜杠命令绑定
    • vim-bindings · Vim 模式与 keybindings 边界
    • memdir-core · 路径、加载与 MEMORY.md
    • memory-extraction · extractMemories 与 SessionMemory
    • memdir-commands · /memory、/remember 与命令集成
    • app-state-core · store、AppState 类型与 Provider
    • app-state-selectors · selectors 与 onChangeAppState
    • teammate-state · 队友视图与 swarm 状态
    • state-boundaries · bootstrap、sessionStorage、FileStateCache
    • query config 与 deps · 配置快照与依赖注入
    • query tokenBudget · +500k 自动续跑
    • query transitions · Continue / Terminal 状态机
    • query stopHooks · Stop 事件与 turn 结束编排
  • 工具详解

    • tool-interface · Tool 契约与注册表
    • tool-permission-types · Tool、Permission、Command 类型
    • 工具: Bash
    • 工具: PowerShell
    • 工具: Agent
    • 工具: LSP
    • 工具: FileEdit
    • 工具: FileRead
    • 工具: Skill
    • 工具: WebFetch
    • 工具: MCP
    • 工具: SendMessage
    • 工具: FileWrite
    • 工具: Config
    • 工具: Grep
    • 工具: Brief
    • 工具: ExitPlanMode
    • 工具: ToolSearch
    • 工具: NotebookEdit
    • 工具: TaskOutput
    • 工具: WebSearch
    • 工具: ScheduleCron

本章总览

Message 是 Agent 的血液:API 只认 messages[],UI 也只渲染 messages。本章教你五种消息类型各自含义、何时产生、如何被 normalize 后发给 Claude。

总览图

渲染图表中…

学完本章你应该能

  • 区分 User / Assistant / ToolResult / System / CompactBoundary
  • 理解 messages.ts 为何是 5500+ 行的核心
  • 知道 tool_result 必须紧跟 tool_use 的 API 约束

核心概念(先读懂这些)

为什么需要多种 Message

UserMessage 承载人类输入;AssistantMessage 存模型输出(含 tool_use blocks);ToolResultMessage 把执行结果喂回模型;SystemMessage 做本地通知;CompactBoundaryMessage 标记压缩边界,防止旧历史干扰新上下文。

normalizeMessagesForAPI 的意义

内存里的 Message 结构为了 UI 便利可能更富;发给 API 前必须 strip 多余字段、合并 block、修复顺序。这是 Agent 稳定性的关键一步,很多 bug 出在这里。

渲染与存储是同一份数据吗

基本是:components/messages/* 按类型渲染。会话持久化到 ~/.claude/projects/ 的也是 Message 序列。改 Message 形状会影响 UI、API、磁盘三处。

建议学习步骤

  1. 对照表格理解每种类型
  2. 在源码中搜索 createUserMessage
  3. 思考:一次 Bash 工具调用产生几条 Message

常见误区

注意

ToolResult 不是 AssistantMessage——角色不同,API 会拒收混排错误

Message 类型关系(类图)

渲染图表中…

一次 Bash 调用的消息流

渲染图表中…

messages.ts 数据管道

渲染图表中…

Message 类型一览

下表是 Claude Code 内部对话消息的五种核心类型。读源码时看到 Message 相关类型,先回来对照此表,判断它在「对话生命周期」的哪一环。

类型说明渲染组件
UserMessage用户输入UserMessage.tsx
AssistantMessageClaude 回复AssistantMessage.tsx
ToolResultMessage工具执行结果ToolResultMessage.tsx
SystemMessage系统通知SystemMessage.tsx
CompactBoundaryMessage压缩边界标记CompactBoundaryMessage.tsx

逐类型详解

UserMessage — 用户的意图入口

无论是键盘输入、粘贴的图片、还是 SDK 传入的 prompt,最终都封装为 UserMessage。它可能包含纯文本,也可能含 content blocks(如图片)。教学要点:UserMessage 进入 messages[] 后不会直接发给 API,往往还要经过 slash 命令拦截、附件处理等预处理。

AssistantMessage — 模型的结构化回复

不仅包含可见文字,还可能含 tool_use content blocks。UI 层拆 block 渲染:文字走 Markdown,tool_use 走工具卡片。教学要点:一次 Assistant turn 可能同时有解释文字和多个 tool call。

ToolResultMessage — 把「行动结果」喂回模型

每个 tool_use 必须对应 tool_result(同 tool_use_id)。Bash 输出、文件内容、错误栈都在这里。教学要点:结果过长会触发截断或摘要,影响下一轮模型判断。

SystemMessage — 仅本地可见的通知

例如权限提示、配置变更,不一定进入 API messages。用于 REPL 内系统级反馈。

CompactBoundaryMessage — 压缩后的「分界线」

autoCompact 后,边界前的历史被摘要替代。此标记告诉 normalize 逻辑:边界前/后的消息处理规则不同。

一次 Bash 调用的消息流(示例)

1. UserMessage: "帮我跑 npm test"
2. AssistantMessage: text + tool_use(Bash, { command: "npm test" })
3. [StreamingToolExecutor 执行 Bash]
4. ToolResultMessage: { tool_use_id, content: "stdout..." }
5. AssistantMessage: "测试通过了,因为..."
→ 以上 1-5 全部 append 到 messages[],下一轮 API 请求带上完整序列

messages.ts (5513行)

为何这么大

Message 同时服务 UI 渲染、API 序列化、会话持久化、压缩边界四种场景。createUserMessage / normalizeMessagesForAPI / getMessagesAfterCompactBoundary 是三个必记入口函数。

normalizeMessagesForAPI

发送前最后一道关卡:删 UI 字段、合并 block、修复 tool_use/tool_result 配对、处理 CompactBoundary。读码建议:debug API 400 错误时第一个打开此函数。

getMessagesAfterCompactBoundary

压缩后只取「有效上下文」:边界之后的消息 + 摘要块。理解它才能理解长会话为何还能继续工作。

本章小结与延伸

Message 管道:创建 → 展示 → 规范化 → API。messages.ts 是必读文件。 继续学习:

  • 状态管理
  • API 通信层
Prev
核心流程
Next
状态管理