<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>架构 on SkySeraph</title><link>https://skyseraph.github.io/tags/%E6%9E%B6%E6%9E%84/</link><description>Recent content in 架构 on SkySeraph</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 01 May 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://skyseraph.github.io/tags/%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>CC源码剖析 #01 · 整体架构概览：目录结构与模块划分</title><link>https://skyseraph.github.io/series/cc-source-code/2026/01-architecture-overview/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/01-architecture-overview/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一项目背景"&gt;一、项目背景&lt;/h2&gt;
&lt;p&gt;Claude Code 源码于 2026 年 3 月 31 日通过 npm 包中的 &lt;code&gt;.map&lt;/code&gt; 文件意外暴露，指向 Anthropic R2 存储桶中未经混淆的 TypeScript 源码。此镜像仅用于&lt;strong&gt;教育、安全研究和软件供应链分析&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言&lt;/strong&gt;：TypeScript（strict 模式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行时&lt;/strong&gt;：Bun&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终端 UI&lt;/strong&gt;：React + &lt;a href="https://github.com/vadimdemedes/ink"&gt;Ink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规模&lt;/strong&gt;：约 1,900 个文件，512,000+ 行代码&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二顶层目录结构"&gt;二、顶层目录结构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\dev\claude\claude-code\
├── src/ # 全部业务逻辑
├── .vscode/ # VSCode 调试配置
├── README.md # 研究背景文档（非官方）
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="三src-模块全景图"&gt;三、&lt;code&gt;src/&lt;/code&gt; 模块全景图&lt;/h2&gt;
&lt;h3 id="31-核心运行模块"&gt;3.1 核心运行模块&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;文件数(估)&lt;/th&gt;
					&lt;th style="text-align: left"&gt;核心职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;tools/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~40&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Tool 定义、注册、执行（FileEdit/Bash/Grep 等）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;commands/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~50&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Slash Commands 实现（/commit /review /diff 等）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;coordinator/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-&lt;/td&gt;
					&lt;td style="text-align: left"&gt;多 Agent 任务编排与协调&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;assistant/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话历史、Session 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;buddy/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Companion 对话伙伴（sprite/prompt）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="32-通信层"&gt;3.2 通信层&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;核心职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;bridge/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;最重要&lt;/strong&gt;：IDE（VSCode/JetBrains）与 CLI 之间的双向通信&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;remote/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;远程会话管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;server/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;服务端模式&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="33-任务与状态"&gt;3.3 任务与状态&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;核心职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;tasks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Task 的创建、执行、状态追踪&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;state/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;状态管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memdir/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;内存目录与会话持久化（~Memory 功能核心）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Skill 加载与执行系统&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-ui-与交互"&gt;3.4 UI 与交互&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;核心职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;ink/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Ink（React for CLI）渲染封装&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;components/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~140 个 Ink UI 组件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;screens/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;全屏 UI（Doctor/REPL/Resume）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;entrypoints/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;各端点初始化（CLI/VSCode/Remote）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="35-生态扩展"&gt;3.5 生态扩展&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;核心职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;plugins/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;mcp/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Model Context Protocol 服务连接&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;services/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;API/OAuth/LSP/Analytics 等外部集成&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="36-其他"&gt;3.6 其他&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;hooks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;React 生命周期钩子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;types/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;核心 TypeScript 类型定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;schemas/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Zod 配置模式验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;migrations/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置迁移&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;keybindings/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;快捷键配置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;vim/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Vim 模式支持&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;voice/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;语音输入&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;upstreamproxy/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;代理配置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;native-ts/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;原生 TS 工具函数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;outputStyles/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;输出样式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;bootstrap/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;启动初始化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四最关键模块详解"&gt;四、最关键模块详解&lt;/h2&gt;
&lt;h3 id="41-tools--工具系统agent-的手"&gt;4.1 &lt;code&gt;tools/&lt;/code&gt; — 工具系统（Agent 的&amp;quot;手&amp;quot;）&lt;/h3&gt;
&lt;p&gt;Claude Code 的 Agent 通过 Tool 与外界交互。每个 Tool 都是一个自包含模块：&lt;/p&gt;</description></item><item><title>CC源码剖析 #02 · 入口点解析：从 CLI 到 REPL</title><link>https://skyseraph.github.io/series/cc-source-code/2026/02-entrypoint-repl/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/02-entrypoint-repl/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一整体启动流程"&gt;一、整体启动流程&lt;/h2&gt;
&lt;p&gt;Claude Code 的启动链路非常清晰：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;main.tsx（入口）
 ├── Commander.js CLI 解析
 ├── 并行预加载（MDM配置/Keychain/API预连接/GrowthBook）
 ├── Ink React 渲染
 │ ├── commands.ts 注册 Slash Commands
 │ ├── tools.ts 注册 Tool
 │ ├── QueryEngine 初始化
 │ └── REPL.tsx 主交互界面
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二maintsx--入口编排"&gt;二、&lt;code&gt;main.tsx&lt;/code&gt; — 入口编排&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/main.tsx&lt;/code&gt;，约 4,000 行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-启动顺序"&gt;2.1 启动顺序&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;第一步：模块加载前的副作用（必须先执行）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 这些副作用必须在所有 import 之前执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;profileCheckpoint(&lt;span style="color:#f1fa8c"&gt;&amp;#39;main_tsx_entry&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;startMdmRawRead(); &lt;span style="color:#6272a4"&gt;// 并行读取 MDM 配置（macOS 企业配置）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;startKeychainPrefetch(); &lt;span style="color:#6272a4"&gt;// 并行读取 Keychain（OAuth + API Key）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这三个调用 firing 了三个独立子进程并行获取配置数据，为后续初始化节省 ~65ms。&lt;/p&gt;</description></item><item><title>CC源码剖析 #03 · Bridge 模块：主进程与渲染进程的通信机制</title><link>https://skyseraph.github.io/series/cc-source-code/2026/03-bridge-arch/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/03-bridge-arch/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一bridge-在整个架构中的位置"&gt;一、Bridge 在整个架构中的位置&lt;/h2&gt;
&lt;p&gt;Bridge 是 Claude Code 最复杂的模块，负责 &lt;strong&gt;IDE 扩展（VSCode/JetBrains）与 CLI 进程之间的双向通信&lt;/strong&gt;。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Claude.ai Web │
│ (Remote Control UI) │
└──────────────────────────┬──────────────────────────────────┘
 │ WebSocket / HTTPS
┌──────────────────────────▼──────────────────────────────────┐
│ Bridge Module │
│ src/bridge/ │
│ ├── bridgeMain.ts # 主循环：轮询 + 会话管理 │
│ ├── bridgeApi.ts # REST API 客户端 │
│ ├── replBridge.ts # REPL ↔ Bridge 桥接核心 │
│ ├── replBridgeTransport.ts # WebSocket 传输层 │
│ ├── bridgeMessaging.ts # 消息协议 + 类型守卫 │
│ ├── sessionRunner.ts # 子进程 Spawn 管理 │
│ └── jwtUtils.ts # JWT 刷新 + 心跳 │
└────┬────────────────────┬──────────────────────────────────┘
 │ │
┌────▼────────┐ ┌─────▼────────┐
│ VSCode 扩展 │ │ JetBrains 扩展│
│ (TypeScript)│ │ (Kotlin) │
└────┬────────┘ └─────┬────────┘
 │ IPC(UDS) │ IPC(UDS)
┌────▼────────────────────▼────┐
│ CLI 主进程 (claude) │
│ src/main.tsx │
│ ├── launchRepl() │
│ └── REPL.tsx │
└─────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二三种-spawn-mode会话隔离策略"&gt;二、三种 Spawn Mode（会话隔离策略）&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Mode&lt;/th&gt;
					&lt;th style="text-align: left"&gt;行为&lt;/th&gt;
					&lt;th style="text-align: left"&gt;适用场景&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;single-session&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;每个工作请求独占 cwd，结束后销毁&lt;/td&gt;
					&lt;td style="text-align: left"&gt;临时任务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;worktree&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;每个会话分配独立 git worktree&lt;/td&gt;
					&lt;td style="text-align: left"&gt;持久服务器，多会话并行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;same-dir&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;多会话共享同一目录（可互相覆盖）&lt;/td&gt;
					&lt;td style="text-align: left"&gt;轻量多会话&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关键文件：&lt;code&gt;src/bridge/types.ts:69&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #04 · 多阶段任务编排器</title><link>https://skyseraph.github.io/series/cc-source-code/2026/04-coordinator/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/04-coordinator/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一coordinator-模式定位"&gt;一、Coordinator 模式定位&lt;/h2&gt;
&lt;p&gt;Coordinator 是 Claude Code 的&lt;strong&gt;多 Agent 并行编排模式&lt;/strong&gt;，通过 &lt;code&gt;COORDINATOR_MODE&lt;/code&gt; Feature Flag 激活。&lt;/p&gt;
&lt;p&gt;当用户任务需要多路并行研究、验证时，Coordinator 派生出多个 Worker Agent，各自独立工作，结果汇总到 Coordinator。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户输入
 │
 ▼
┌─────────────┐
│ Coordinator │ ←── Feature Flag: COORDINATOR_MODE
│ (主 Agent) │
└──────┬──────┘
 │ parallel launch
 ├──────────────┐
 │ │
 ▼ ▼
┌──────────┐ ┌──────────┐
│ Worker A │ │ Worker B │
│ Research │ │ Research │
└────┬─────┘ └────┬─────┘
 │ │
 │ task-notification (结果)
 ▼ ▼
┌──────────────┐
│ Coordinator │ ←── 合成结果，发给用户
│ (汇总统筹) │
└──────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二核心工具集"&gt;二、核心工具集&lt;/h2&gt;
&lt;p&gt;Coordinator 通过四个核心 Tool 管理 Worker 生命周期：&lt;/p&gt;</description></item><item><title>CC源码剖析 #05 · Tools 系统：工具定义、注册与执行</title><link>https://skyseraph.github.io/series/cc-source-code/2026/05-tools-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/05-tools-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一tool-在-agent-架构中的位置"&gt;一、Tool 在 Agent 架构中的位置&lt;/h2&gt;
&lt;p&gt;Tool 是 Agent 与外界交互的接口。每个 Tool 是一个自包含模块，包含输入 Schema、权限模型和执行逻辑。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;LLM 决定调用 Tool
 │
 ▼
 Tool.call(args, context, canUseTool, parentMessage, onProgress)
 │
 ├─ Zod Schema 验证输入
 ├─ Permission 检查
 ├─ 执行逻辑
 └─ 返回 ToolResult + 新消息
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二tool-基类定义"&gt;二、Tool 基类定义&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/Tool.ts&lt;/code&gt;，约 1,500 行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-核心类型签名"&gt;2.1 核心类型签名&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;49
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;50
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;51
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;52
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;53
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;54
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;55
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;56
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;57
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;58
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;59
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;60
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;61
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; Tool&lt;span style="color:#ff79c6"&gt;&amp;lt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Input &lt;span style="color:#ff79c6"&gt;extends&lt;/span&gt; AnyObject &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; AnyObject, &lt;span style="color:#6272a4"&gt;// Zod 输入 Schema
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Output &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;unknown&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; P &lt;span style="color:#ff79c6"&gt;extends&lt;/span&gt; ToolProgressData &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; ToolProgressData,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 可选别名（用于工具重命名后的向后兼容）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; aliases?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 工具调用入口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; call(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; args: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: &lt;span style="color:#8be9fd"&gt;ToolUseContext&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; canUseTool: &lt;span style="color:#8be9fd"&gt;CanUseToolFn&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parentMessage: &lt;span style="color:#8be9fd"&gt;AssistantMessage&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onProgress?: &lt;span style="color:#8be9fd"&gt;ToolCallProgress&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;P&lt;/span&gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;ToolResult&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Output&lt;/span&gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 生成工具描述（用于 prompt）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isNonInteractiveSession: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolPermissionContext: &lt;span style="color:#8be9fd"&gt;ToolPermissionContext&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tools: &lt;span style="color:#8be9fd"&gt;Tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;string&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// Zod 输入 Schema
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;readonly&lt;/span&gt; inputSchema: &lt;span style="color:#8be9fd"&gt;Input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 可选 JSON Schema（用于 MCP 工具）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;readonly&lt;/span&gt; inputJSONSchema?: &lt;span style="color:#8be9fd"&gt;ToolInputJSONSchema&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 并发安全性
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isConcurrencySafe(input: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否启用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isEnabled()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否只读
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isReadOnly(input: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否破坏性（删除/覆盖）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isDestructive&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;(input: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 用户提交新消息时的行为
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; interruptBehavior&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;cancel&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否为搜索/读取操作（决定 UI 折叠显示）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isSearchOrReadCommand&lt;span style="color:#ff79c6"&gt;?&lt;/span&gt;(input: &lt;span style="color:#8be9fd"&gt;z.infer&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;Input&lt;/span&gt;&amp;gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isSearch: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isRead: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isList?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否延迟加载（需要 ToolSearch 预热）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;readonly&lt;/span&gt; shouldDefer?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 是否始终加载（turn 1 就出现）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;readonly&lt;/span&gt; alwaysLoad?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-toolresult-结构"&gt;2.2 ToolResult 结构&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ToolResult&amp;lt;&lt;span style="color:#ff79c6"&gt;T&lt;/span&gt;&amp;gt; &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data: &lt;span style="color:#8be9fd"&gt;T&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 可选：工具执行过程中产生的新消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newMessages&lt;span style="color:#ff79c6"&gt;?:&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; UserMessage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; AssistantMessage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; AttachmentMessage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemMessage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 内容替换状态（用于工具结果预算）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; contextModifier&lt;span style="color:#ff79c6"&gt;?:&lt;/span&gt; (context: &lt;span style="color:#8be9fd"&gt;ToolUseContext&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; ToolUseContext
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// MCP 协议元数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcpMeta&lt;span style="color:#ff79c6"&gt;?:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _meta?: &lt;span style="color:#8be9fd"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;string&lt;/span&gt;, &lt;span style="color:#50fa7b"&gt;unknown&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; structuredContent?: &lt;span style="color:#8be9fd"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;string&lt;/span&gt;, &lt;span style="color:#50fa7b"&gt;unknown&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-toolusecontext--执行上下文"&gt;2.3 ToolUseContext — 执行上下文&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ToolUseContext &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commands: &lt;span style="color:#8be9fd"&gt;Command&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; debug: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mainLoopModel: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tools: &lt;span style="color:#8be9fd"&gt;Tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; verbose: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; thinkingConfig: &lt;span style="color:#8be9fd"&gt;ThinkingConfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcpClients: &lt;span style="color:#8be9fd"&gt;MCPServerConnection&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcpResources: &lt;span style="color:#8be9fd"&gt;Record&lt;/span&gt;&amp;lt;&lt;span style="color:#ff79c6"&gt;string&lt;/span&gt;, &lt;span style="color:#50fa7b"&gt;ServerResource&lt;/span&gt;[]&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isNonInteractiveSession: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; agentDefinitions: &lt;span style="color:#8be9fd"&gt;AgentDefinitionsResult&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxBudgetUsd?: &lt;span style="color:#8be9fd"&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; customSystemPrompt?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; appendSystemPrompt?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; querySource?: &lt;span style="color:#8be9fd"&gt;QuerySource&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; refreshTools&lt;span style="color:#ff79c6"&gt;?:&lt;/span&gt; () &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; Tools
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; abortController: &lt;span style="color:#8be9fd"&gt;AbortController&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; readFileState: &lt;span style="color:#8be9fd"&gt;FileStateCache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; getAppState()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; AppState
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; setAppState(f&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; (prev: &lt;span style="color:#8be9fd"&gt;AppState&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; AppState)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// ... 50+ 字段
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messages: &lt;span style="color:#8be9fd"&gt;Message&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三tool-注册中心"&gt;三、Tool 注册中心&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/tools.ts&lt;/code&gt;，约 800 行&lt;/p&gt;</description></item><item><title>CC源码剖析 #06 · Skills 加载与执行机制</title><link>https://skyseraph.github.io/series/cc-source-code/2026/06-skills-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/06-skills-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一skill-定位用户自定义-agent-能力扩展"&gt;一、Skill 定位：用户自定义 Agent 能力扩展&lt;/h2&gt;
&lt;p&gt;Skill 是用户通过 Markdown 文件定义的命令，本质是一个&lt;strong&gt;带 frontmatter 的 prompt 模板&lt;/strong&gt;。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户执行 /my-skill arg1 arg2
 │
 ▼
Skill 定义文件（Markdown + frontmatter）
 │
 ├─ name: &amp;#34;my-skill&amp;#34;
 ├─ description: &amp;#34;...&amp;#34;
 ├─ arguments: [...]
 ├─ prompt: &amp;#34;模板内容 + {{arg1}} {{arg2}}&amp;#34;
 └─ tools?: [...] ← 可选：允许使用的工具列表
 │
 ▼
LLM 处理 prompt → 返回结果
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Skills 与 Tools 的区别&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;特性&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Skill&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Tool&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;定义方式&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Markdown 文件&lt;/td&gt;
					&lt;td style="text-align: left"&gt;TypeScript 代码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;编写门槛&lt;/td&gt;
					&lt;td style="text-align: left"&gt;低（无需编程）&lt;/td&gt;
					&lt;td style="text-align: left"&gt;高（需要编码）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;执行方式&lt;/td&gt;
					&lt;td style="text-align: left"&gt;LLM 处理 prompt&lt;/td&gt;
					&lt;td style="text-align: left"&gt;直接执行逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;灵活性&lt;/td&gt;
					&lt;td style="text-align: left"&gt;受 prompt 限制&lt;/td&gt;
					&lt;td style="text-align: left"&gt;可实现任意逻辑&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二skill-文件格式"&gt;二、Skill 文件格式&lt;/h2&gt;
&lt;h3 id="21-frontmatter-结构"&gt;2.1 Frontmatter 结构&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;name&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;skill-name&amp;#34;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;# Skill 标识符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;description&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;What this skill does and when to use it&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# 触发短语：用户可用这些短语激活 skill&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;whenToUse&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;When the user asks about X or wants to Y&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;arguments&lt;/span&gt;: &lt;span style="color:#6272a4"&gt;# 可选：参数定义&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ff79c6"&gt;name&lt;/span&gt;: arg1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;description&lt;/span&gt;: Description
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;required&lt;/span&gt;: &lt;span style="color:#ff79c6"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ff79c6"&gt;name&lt;/span&gt;: arg2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;description&lt;/span&gt;: Description
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;default&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;default value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;tools&lt;/span&gt;: &lt;span style="color:#6272a4"&gt;# 可选：允许使用的工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Read
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Edit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-prompt-模板"&gt;2.2 Prompt 模板&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name: &amp;#34;code-review&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description: &amp;#34;Review code for bugs and style issues&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;whenToUse: &amp;#34;User asks for a review or wants to check code quality&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="font-weight:bold"&gt;# Code Review Skill
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Review the following code for:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;1.&lt;/span&gt; Security vulnerabilities
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;2.&lt;/span&gt; Performance issues
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;3.&lt;/span&gt; Style consistency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Code to review:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{code}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-参数替换"&gt;2.3 参数替换&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// {{arg}} 替换为用户输入的参数值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// {{arg|default}} 提供默认值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;substituteArguments(prompt, args)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// &amp;#34;Fix the bug in {{file}}&amp;#34; + { file: &amp;#34;auth.ts&amp;#34; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// → &amp;#34;Fix the bug in auth.ts&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三加载体系"&gt;三、加载体系&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/skills/loadSkillsDir.ts&lt;/code&gt;，约 600 行&lt;/p&gt;</description></item><item><title>CC源码剖析 #07 · MCP 协议：多工具协调</title><link>https://skyseraph.github.io/series/cc-source-code/2026/07-mcp-protocol/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/07-mcp-protocol/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一mcp-在架构中的位置"&gt;一、MCP 在架构中的位置&lt;/h2&gt;
&lt;p&gt;MCP（Model Context Protocol）是 Claude Code 连接外部工具服务的协议，类似于 Language Server Protocol（LSP），但用于 AI 工具调用。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Claude Code (Client)
 │
 ├─ MCP 协议（HTTPS/WebSocket/stdio）
 │
 ▼
┌─────────────────────────┐
│ MCP Servers │
│ • 文件系统服务器 │
│ • Git 服务器 │
│ • 数据库服务器 │
│ • 搜索服务器 │
│ • 自定义服务器 │
└─────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二mcp-配置格式"&gt;二、MCP 配置格式&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/services/mcp/types.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-配置作用域configscope"&gt;2.1 配置作用域（ConfigScope）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; ConfigScopeSchema &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; z.&lt;span style="color:#ff79c6"&gt;enum&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;local&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 本地项目 .mcp.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 用户全局 ~/.claude/mcp.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;project&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 项目配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;dynamic&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 动态配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;enterprise&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 企业托管
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;claudeai&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// Claude.ai 内置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;managed&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 企业托管
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-传输类型transport"&gt;2.2 传输类型（Transport）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;const&lt;/span&gt; TransportSchema &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; z.&lt;span style="color:#ff79c6"&gt;enum&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;stdio&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// 标准输入输出（本地进程）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;sse&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// Server-Sent Events（HTTPS）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;sse-ide&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// IDE 专用 SSE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;http&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// HTTP
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ws&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// WebSocket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;sdk&amp;#39;&lt;/span&gt;, &lt;span style="color:#6272a4"&gt;// SDK 内部传输
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-服务器配置类型"&gt;2.3 服务器配置类型&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Stdio 配置（本地进程）&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>CC源码剖析 #08 · 消息传递：inbound/outbound 架构</title><link>https://skyseraph.github.io/series/cc-source-code/2026/08-messaging/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/08-messaging/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一消息系统概述"&gt;一、消息系统概述&lt;/h2&gt;
&lt;p&gt;Claude Code 的消息系统是其核心——负责用户输入、LLM 输出、工具调用结果之间的流转。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户输入
 │
 ▼
┌─────────┐
│ Message │ ← discriminated union: user/assistant/system
└────┬────┘
 │
 ├─→ normalizeMessagesForAPI() → Anthropic API
 │ │
 │ ▼
 │ API Response
 │ │
 ├─→ Tool Call 循环
 │ │
 │ ▼
 │ Tool 执行
 │ │
 └─→ 渲染到 REPL UI
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二消息类型体系"&gt;二、消息类型体系&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/utils/messages.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-核心消息类型"&gt;2.1 核心消息类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// UserMessage — 用户输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; UserMessage &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content: &lt;span style="color:#8be9fd"&gt;ContentBlock&lt;/span&gt;[] &lt;span style="color:#6272a4"&gt;// text/image/tool_use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; origin?: &lt;span style="color:#8be9fd"&gt;MessageOrigin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isMeta?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolUseResult?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 工具执行结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isCompactSummary?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// AssistantMessage — LLM 输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; AssistantMessage &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;assistant&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content: &lt;span style="color:#8be9fd"&gt;ContentBlock&lt;/span&gt;[] &lt;span style="color:#6272a4"&gt;// text/thinking/tool_use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isVirtual?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 虚拟消息（REPL 内部调用）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stopReason?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; usage?: &lt;span style="color:#8be9fd"&gt;Usage&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// SystemMessage — 系统消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; SystemMessage &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemLocalCommandMessage &lt;span style="color:#6272a4"&gt;// /命令输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemApiErrorMessage &lt;span style="color:#6272a4"&gt;// API 错误
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemBridgeStatusMessage &lt;span style="color:#6272a4"&gt;// Bridge 状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemPermissionRetryMessage &lt;span style="color:#6272a4"&gt;// 权限重试
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; SystemInformationalMessage &lt;span style="color:#6272a4"&gt;// 信息提示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-特殊消息类型"&gt;2.2 特殊消息类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// ProgressMessage — 长时间运行工具的进度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ProgressMessage &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;progress&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data: &lt;span style="color:#8be9fd"&gt;ToolProgressData&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; HookProgress
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// AttachmentMessage — 附件（图片/文件）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; AttachmentMessage &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;attachment&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; attachment: &lt;span style="color:#8be9fd"&gt;Attachment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-contentblock-类型"&gt;2.3 ContentBlock 类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ContentBlock &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; TextBlock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; ThinkingBlock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; ToolUseBlock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; RedactedThinkingBlock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// ToolUseBlock — 工具调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ToolUseBlock &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;tool_use&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// Bash/FileEdit/Grep...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 工具参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;input JSON&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// ToolResultBlock — 工具结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ToolResultBlock &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;tool_result&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolUseId: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; content: &lt;span style="color:#8be9fd"&gt;ContentBlock&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; isError?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三消息规范化normalization"&gt;三、消息规范化（Normalization）&lt;/h2&gt;
&lt;h3 id="31-normalizemessagesforapi"&gt;3.1 &lt;code&gt;normalizeMessagesForAPI&lt;/code&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 将内部 Message[] 转换为 Anthropic API 格式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;normalizeMessagesForAPI(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messages: &lt;span style="color:#8be9fd"&gt;Message&lt;/span&gt;[],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemPrompt: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tools: &lt;span style="color:#8be9fd"&gt;Tool&lt;/span&gt;[],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolChoice?: &lt;span style="color:#8be9fd"&gt;ToolChoice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;APIMessage&lt;/span&gt;[]&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="32-规范化规则"&gt;3.2 规范化规则&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 1. 虚拟消息（isVirtual）过滤掉
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 2. 工具调用合并到 tool_use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 3. 结果转为 tool_result
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 4. thinking block 处理（保留/删除）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 5. Token 计数更新
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="33-消息裁剪"&gt;3.3 消息裁剪&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 当消息过长时触发 compact
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;partialCompactConversation(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messages: &lt;span style="color:#8be9fd"&gt;Message&lt;/span&gt;[],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; direction&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;pre&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;post&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;Message&lt;/span&gt;[]&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="四inboundoutbound-架构"&gt;四、inbound/outbound 架构&lt;/h2&gt;
&lt;h3 id="41-inbound入站消息"&gt;4.1 inbound（入站消息）&lt;/h3&gt;
&lt;p&gt;来自用户、工具执行、系统事件的消息：&lt;/p&gt;</description></item><item><title>CC源码剖析 #09 · 权限系统：PermissionCallbacks 与安全边界</title><link>https://skyseraph.github.io/series/cc-source-code/2026/09-permission-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/09-permission-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一权限系统定位"&gt;一、权限系统定位&lt;/h2&gt;
&lt;p&gt;权限系统是 Claude Code 的安全保障层——决定 Agent 在执行敏感操作前是否需要用户确认。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Tool.call()
 │
 ├─→ canUseTool(toolName, input) ─→ Permission 检查
 │ │
 │ ├─ alwaysAllow → 直接执行
 │ ├─ alwaysDeny → 拒绝
 │ ├─ auto 模式 → 检查历史决策
 │ └─ ask 模式 → 弹出确认对话框
 │
 └─→ 执行 Tool Logic
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二权限模式"&gt;二、权限模式&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/types/permissions.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-模式类型"&gt;2.1 模式类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; PermissionMode &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;default&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 使用用户配置的默认模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;auto&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 自动批准已知安全操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ask&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 每次都询问用户
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;reject&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 拒绝所有危险操作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;bypass&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 绕过（需要特殊标志）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-cli-参数"&gt;2.2 CLI 参数&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude --permission-mode&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;auto &lt;span style="color:#6272a4"&gt;# 自动模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude --permission-mode&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;ask &lt;span style="color:#6272a4"&gt;# 每次询问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;claude --AllowedTools&lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;Read,Bash &lt;span style="color:#6272a4"&gt;# 白名单工具&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-权限模式来源"&gt;2.3 权限模式来源&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 优先级（从高到低）：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 1. CLI 参数 --permission-mode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 2. 会话缓存的 auto 模式状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 3. 全局配置默认值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;initialPermissionModeFromCLI()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;??&lt;/span&gt; checkAutoModeEnabledStateIfCached()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;??&lt;/span&gt; getDefaultPermissionMode()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三权限规则permission-rules"&gt;三、权限规则（Permission Rules）&lt;/h2&gt;
&lt;h3 id="31-规则类型"&gt;3.1 规则类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; ToolPermissionRulesBySource {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [source: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;]&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tool: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; allow?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deny?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 规则来源：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - alwaysAllowRules: 始终允许
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - alwaysDenyRules: 始终拒绝
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - alwaysAskRules: 始终询问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="32-规则示例"&gt;3.2 规则示例&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;# 用户配置 (.claude/permissions.yml)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;always_allow&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ff79c6"&gt;tool&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Read&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;paths&lt;/span&gt;: [&lt;span style="color:#f1fa8c"&gt;&amp;#34;src/**&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;always_deny&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ff79c6"&gt;tool&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Bash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;commands&lt;/span&gt;: [&lt;span style="color:#f1fa8c"&gt;&amp;#34;rm -rf /&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;always_ask&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ff79c6"&gt;tool&lt;/span&gt;: &lt;span style="color:#f1fa8c"&gt;&amp;#34;Bash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;commands&lt;/span&gt;: [&lt;span style="color:#f1fa8c"&gt;&amp;#34;rm *&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="33-规则匹配"&gt;3.3 规则匹配&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 规则匹配逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;getPermissionDecision(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolName: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: &lt;span style="color:#8be9fd"&gt;ToolPermissionContext&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;allow&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;deny&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ask&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 匹配顺序：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 1. alwaysDenyRules → deny
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 2. alwaysAllowRules → allow
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 3. alwaysAskRules → ask
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 4. 权限模式决定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="四canusetool-检查"&gt;四、canUseTool 检查&lt;/h2&gt;
&lt;h3 id="41-接口签名"&gt;4.1 接口签名&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; CanUseToolFn &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolName: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: &lt;span style="color:#8be9fd"&gt;ToolPermissionContext&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;PermissionResult&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="42-检查流程"&gt;4.2 检查流程&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;async&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; canUseTool(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolName: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: &lt;span style="color:#8be9fd"&gt;ToolPermissionContext&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;PermissionResult&lt;/span&gt;&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 1. 检查 bypass 模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (context.mode &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;bypass&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; { granted: &lt;span style="color:#8be9fd"&gt;true&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 2. 检查 alwaysAllow
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (matchesAlwaysAllow(toolName, input, context)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; { granted: &lt;span style="color:#8be9fd"&gt;true&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 3. 检查 alwaysDeny
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (matchesAlwaysDeny(toolName, input, context)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; { granted: &lt;span style="color:#8be9fd"&gt;false&lt;/span&gt;, reason&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;blocked&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 4. 检查权限模式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (context.mode &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;auto&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 查历史决策
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; checkAutoHistory(toolName, input)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (context.mode &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ask&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 弹出 UI 对话框
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; showPermissionDialog(toolName, input)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; { granted: &lt;span style="color:#8be9fd"&gt;false&lt;/span&gt;, reason&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;default_deny&amp;#39;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="五自动模式auto-mode"&gt;五、自动模式（Auto Mode）&lt;/h2&gt;
&lt;h3 id="51-历史决策"&gt;5.1 历史决策&lt;/h3&gt;
&lt;p&gt;Auto 模式维护一个本地决策缓存：&lt;/p&gt;</description></item><item><title>CC源码剖析 #10 · 状态管理：memdir 与会话持久化</title><link>https://skyseraph.github.io/series/cc-source-code/2026/10-memdir-state/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/10-memdir-state/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一memdir-定位"&gt;一、memdir 定位&lt;/h2&gt;
&lt;p&gt;memdir（Memory Directory）是 Claude Code 的&lt;strong&gt;会话持久化与记忆系统&lt;/strong&gt;——负责在会话之间保存上下文，让 Agent 能够&amp;quot;记住&amp;quot;之前的对话内容。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;会话开始
 │
 ├─→ 读取 MEMORY.md
 │ │
 │ ▼
 │ 系统提示 + 记忆内容
 │
 ├─→ 会话进行中...
 │
 └─→ 会话结束
 │
 ├─→ 更新 MEMORY.md（新增记忆）
 ├─→ 保存会话记录
 └─→ 保存会话元数据
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二目录结构"&gt;二、目录结构&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/memdir/paths.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-路径解析"&gt;2.1 路径解析&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; getMemoryBaseDir()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 优先级：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 1. CLAUDE_CODE_REMOTE_MEMORY_DIR 环境变量（CCR 远程模式）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 2. ~/.claude（默认配置目录）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 内存目录布局
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;~&lt;/span&gt;&lt;span style="color:#f1fa8c"&gt;/.claude/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── memory&lt;span style="color:#ff79c6"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── projects&lt;span style="color:#ff79c6"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── {sanitized&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;cwd}&lt;span style="color:#ff79c6"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── memory&lt;span style="color:#ff79c6"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── MEMORY.md # 主入口
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── {topic}.md # 主题记忆文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── {session}&lt;span style="color:#ff79c6"&gt;/&lt;/span&gt; # 按会话的记录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-路径安全验证"&gt;2.2 路径安全验证&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// SECURITY: 验证内存路径，防止路径遍历攻击
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; validateMemoryPath(raw: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;undefined&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;undefined&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 拒绝：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// - 相对路径（可能被解释为 CWD 相对）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// - 根目录（&amp;#34;/&amp;#34;, &amp;#34;C:&amp;#34;）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// - UNC 路径（\\server\share）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// - 含 null 字节
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-开关控制"&gt;2.3 开关控制&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; isAutoMemoryEnabled()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 1. CLAUDE_CODE_DISABLE_AUTO_MEMORY = 1 → 关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 2. CLAUDE_CODE_SIMPLE (--bare) → 关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 3. CCR 无持久化 → 关闭
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 4. settings.json autoMemoryEnabled
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 5. 默认：开启
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三memorymd-入口"&gt;三、MEMORY.md 入口&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/memdir/memdir.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #11 · 插件系统：Plugin 架构与生命周期</title><link>https://skyseraph.github.io/series/cc-source-code/2026/11-plugin-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/11-plugin-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一插件系统定位"&gt;一、插件系统定位&lt;/h2&gt;
&lt;p&gt;插件系统是 Claude Code 的&lt;strong&gt;扩展生态层&lt;/strong&gt;——允许第三方通过 Markdown 文件和配置文件提供 Skills、Hooks、MCP 服务器等能力。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户安装插件
 │
 ▼
┌─────────────────────────────────────┐
│ Plugin Manager │
│ ├── loadPluginCommands() │
│ ├── loadPluginHooks() │
│ ├── loadPluginMcpServers() │
│ └── loadPluginAgents() │
└─────────────────────────────────────┘
 │
 ├─→ Skill Commands（/plugin-name）
 ├─→ Hooks（sessionStart/turnEnd...）
 ├─→ MCP Servers
 └─→ Agent Definitions
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二插件类型"&gt;二、插件类型&lt;/h2&gt;
&lt;h3 id="21-内置插件built-in"&gt;2.1 内置插件（Built-in）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/plugins/builtinPlugins.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 内置插件 vs Skills：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - Skills: 单个 Markdown 文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - 内置插件: 多组件（skills + hooks + MCP servers）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 插件 ID 格式：{name}@builtin
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; isBuiltinPluginId(pluginId: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; pluginId.endsWith(&lt;span style="color:#f1fa8c"&gt;&amp;#39;@builtin&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 注册内置插件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; registerBuiltinPlugin(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; definition: &lt;span style="color:#8be9fd"&gt;BuiltinPluginDefinition&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BUILTIN_PLUGINS.&lt;span style="color:#ff79c6"&gt;set&lt;/span&gt;(definition.name, definition)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-市场插件marketplace"&gt;2.2 市场插件（Marketplace）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 从插件市场安装
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 插件市场：plugins.claude.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; MarketplacePlugin {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// name@marketplace
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; skills: &lt;span style="color:#8be9fd"&gt;SkillDefinition&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hooks: &lt;span style="color:#8be9fd"&gt;HookDefinition&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcpServers?: &lt;span style="color:#8be9fd"&gt;McpServerConfig&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-项目插件"&gt;2.3 项目插件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 项目本地的 .claude/plugins/ 目录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 对项目成员可见
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三插件生命周期"&gt;三、插件生命周期&lt;/h2&gt;
&lt;h3 id="31-加载流程"&gt;3.1 加载流程&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;启动时
 │
 ├─→ initBuiltinPlugins() // 初始化内置插件
 ├─→ loadAllPluginsCacheOnly() // 加载已安装插件（缓存）
 ├─→ initializeVersionedPlugins() // 版本管理
 │
 └─→ cleanupOrphanedPluginVersionsInBackground() // 清理旧版本

运行时
 │
 ├─→ 动态加载新插件
 ├─→ 插件更新检查
 └─→ 插件卸载处理
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="32-生命周期阶段"&gt;3.2 生命周期阶段&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;阶段&lt;/th&gt;
					&lt;th style="text-align: left"&gt;函数&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Init&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;initBuiltinPlugins()&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;注册内置插件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Load&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;loadAllPluginsCacheOnly()&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;加载插件列表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Enable&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;enablePlugin(id)&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;启用插件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Disable&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;disablePlugin(id)&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;禁用插件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Uninstall&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;uninstallPlugin(id)&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;卸载插件&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四插件加载器"&gt;四、插件加载器&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/utils/plugins/pluginLoader.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #12 · 跨进程通信：RemoteBridge 与远程模式</title><link>https://skyseraph.github.io/series/cc-source-code/2026/12-remote-bridge/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/12-remote-bridge/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一远程模式定位"&gt;一、远程模式定位&lt;/h2&gt;
&lt;p&gt;远程模式允许 Claude Code 通过 Bridge 与远程运行的 CLI 实例通信，使得 IDE 可以在本地但 Agent 执行在远程。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;本地 IDE (VSCode)
 │
 │ UDS IPC
 │
┌───▼──────────┐
│ Bridge Main │ ← 本地桥接进程
└───┬──────────┘
 │ WebSocket / HTTPS
 │
┌───▼──────────┐
│ Remote CLI │ ← 远程机器上运行
│ (REPL) │
└───────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二remotebridge-架构"&gt;二、RemoteBridge 架构&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/bridge/remoteBridgeCore.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-核心组件"&gt;2.1 核心组件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; RemoteBridgeCore {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 连接管理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; connect(sessionId: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; disconnect()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 消息传递
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sendMessage(msg: &lt;span style="color:#8be9fd"&gt;SDKMessage&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onMessage(handler&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; (msg: &lt;span style="color:#8be9fd"&gt;SDKMessage&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 状态同步
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; syncState()&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;State&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; onStateChange(handler&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; (state: &lt;span style="color:#8be9fd"&gt;State&lt;/span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;void&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-传输协议"&gt;2.2 传输协议&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 支持多种传输方式
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; Transport &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;websocket&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// WebSocket 连接
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;ssh&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// SSH 隧道
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;http&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// HTTP 流（stream-json）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 传输选择逻辑：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 1. 优先 WebSocket（低延迟）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 2. SSH（企业防火墙环境）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 3. HTTP（最后兜底）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三ssh-会话"&gt;三、SSH 会话&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/ssh/createSSHSession.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #13 · Task 执行引擎：从创建到完成的完整流程</title><link>https://skyseraph.github.io/series/cc-source-code/2026/13-task-engine/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/13-task-engine/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一task-系统定位"&gt;一、Task 系统定位&lt;/h2&gt;
&lt;p&gt;Task 是 Claude Code 的&lt;strong&gt;后台任务执行单元&lt;/strong&gt;——允许 Agent 派生子任务并行工作，结果汇总到主会话。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;主会话（Main REPL）
 │
 ├─→ TaskCreateTool → 创建后台任务
 │ │
 │ ▼
 │ ┌──────────┐
 │ │ Task │ ← 后台运行
 │ └────┬─────┘
 │ │
 │ │ task-notification
 │ ▼
 └────── Agent 结果汇总
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二task-类型体系"&gt;二、Task 类型体系&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/tasks/types.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-task-类型列表"&gt;2.1 Task 类型列表&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; TaskState &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; LocalShellTaskState &lt;span style="color:#6272a4"&gt;// 本地 Shell 任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; LocalAgentTaskState &lt;span style="color:#6272a4"&gt;// 本地 Agent 任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; RemoteAgentTaskState &lt;span style="color:#6272a4"&gt;// 远程 Agent 任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; InProcessTeammateTaskState &lt;span style="color:#6272a4"&gt;// 进程内队友任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; LocalWorkflowTaskState &lt;span style="color:#6272a4"&gt;// 本地工作流任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; MonitorMcpTaskState &lt;span style="color:#6272a4"&gt;// MCP 监控任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; DreamTaskState &lt;span style="color:#6272a4"&gt;// 背景做梦任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-task-状态"&gt;2.2 Task 状态&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; TaskStatus &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;pending&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 等待执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;running&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 执行中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;completed&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 完成
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;failed&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;killed&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 被停止
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;paused&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 暂停
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-后台任务判断"&gt;2.3 后台任务判断&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 判断任务是否显示在后台任务指示器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#8be9fd;font-style:italic"&gt;function&lt;/span&gt; isBackgroundTask(task: &lt;span style="color:#8be9fd"&gt;TaskState&lt;/span&gt;)&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (task.status &lt;span style="color:#ff79c6"&gt;!==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;running&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; task.status &lt;span style="color:#ff79c6"&gt;!==&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;pending&amp;#39;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 前台任务（isBackgrounded === false）不显示
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;if&lt;/span&gt; (&lt;span style="color:#f1fa8c"&gt;&amp;#39;isBackgrounded&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;in&lt;/span&gt; task &lt;span style="color:#ff79c6"&gt;&amp;amp;&amp;amp;&lt;/span&gt; task.isBackgrounded &lt;span style="color:#ff79c6"&gt;===&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;false&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;return&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三task-创建"&gt;三、Task 创建&lt;/h2&gt;
&lt;h3 id="31-taskcreatetool"&gt;3.1 TaskCreateTool&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/tools/TaskCreateTool/TaskCreateTool.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #14 · Hook 系统：生命周期拦截点</title><link>https://skyseraph.github.io/series/cc-source-code/2026/14-hooks/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/14-hooks/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一hook-系统定位"&gt;一、Hook 系统定位&lt;/h2&gt;
&lt;p&gt;Hook 系统是 Claude Code 的&lt;strong&gt;生命周期拦截点&lt;/strong&gt;——允许外部代码（插件、本地脚本）在特定事件发生时介入并修改行为。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户输入
 │
 ▼
┌─────────────────────────────────┐
│ Hook System │
│ processSessionStartHooks() │
│ processSetupHooks() │
└─────────────────────────────────┘
 │
 ▼
┌─────────────────────────────────┐
│ QueryEngine │
│ preToolCall Hook │
└─────────────────────────────────┘
 │
 ▼
┌─────────────────────────────────┐
│ Tool.call() │
│ postToolCall Hook │
└─────────────────────────────────┘
 │
 ▼
结果
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二hook-类型定义"&gt;二、Hook 类型定义&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/types/hooks.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-支持的事件类型"&gt;2.1 支持的事件类型&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// HOOK_EVENTS 列表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; HookEvent &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PreToolUse&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 工具调用前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PostToolUse&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 工具调用后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;UserPromptSubmit&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 用户提交输入前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;UserPromptEdit&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 用户编辑输入时
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;RoundStart&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 回合开始
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;RoundEnd&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 回合结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;SessionStart&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 会话开始
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;SessionEnd&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 会话结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PreAgentCall&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// Agent 调用前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PostAgentCall&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// Agent 调用后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PreProcessModel&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 模型处理前
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;PostProcessModel&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 模型处理后
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-hook-接口"&gt;2.2 Hook 接口&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; HookDefinition {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; event: &lt;span style="color:#8be9fd"&gt;HookEvent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;plugin&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;builtin&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; handler: &lt;span style="color:#8be9fd"&gt;HookHandler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config?: &lt;span style="color:#8be9fd"&gt;HookConfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; HookHandler &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context: &lt;span style="color:#8be9fd"&gt;HookContext&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input: &lt;span style="color:#8be9fd"&gt;HookInput&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#ff79c6"&gt;=&amp;gt;&lt;/span&gt; Promise&amp;lt;&lt;span style="color:#ff79c6"&gt;HookResult&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="23-hook-输入输出"&gt;2.3 Hook 输入/输出&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// Hook 输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; HookInput {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; event: &lt;span style="color:#8be9fd"&gt;HookEvent&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sessionId: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; messages: &lt;span style="color:#8be9fd"&gt;Message&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#6272a4"&gt;// 事件特定的输入数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// Hook 输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;interface&lt;/span&gt; HookResult {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff79c6"&gt;continue&lt;/span&gt;&lt;span style="color:#ff79c6"&gt;:&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;boolean&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 是否继续执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; suppressOutput?: &lt;span style="color:#8be9fd"&gt;boolean&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 是否隐藏输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stopReason?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 停止原因
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; decision&lt;span style="color:#ff79c6"&gt;?:&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;approve&amp;#39;&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;|&lt;/span&gt; &lt;span style="color:#f1fa8c"&gt;&amp;#39;block&amp;#39;&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 决策
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reason?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 决策原因
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systemMessage?: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 系统消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; updatedInput?: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// 修改后的输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hookSpecificOutput?: &lt;span style="color:#8be9fd"&gt;object&lt;/span&gt; &lt;span style="color:#6272a4"&gt;// Hook 特定输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三hook-生命周期"&gt;三、Hook 生命周期&lt;/h2&gt;
&lt;h3 id="31-会话启动-hook"&gt;3.1 会话启动 Hook&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/utils/sessionStart.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CC源码剖析 #15 · 安全审查：Security Review 命令实现</title><link>https://skyseraph.github.io/series/cc-source-code/2026/15-security-review/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/cc-source-code/2026/15-security-review/</guid><description>&lt;blockquote&gt;
&lt;p&gt;基于 2026-03-31 公开的源码快照，~512,000 行代码&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一security-review-命令定位"&gt;一、Security Review 命令定位&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/security-review&lt;/code&gt; 是 Claude Code 内置的&lt;strong&gt;安全审查命令&lt;/strong&gt;，通过解析 git diff 分析 PR 中的代码变更，识别高置信度的安全漏洞。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户执行 /security-review
 │
 ▼
┌────────────────────────────────────────┐
│ Security Review Command │
│ 1. 获取 git diff │
│ 2. 获取修改文件列表 │
│ 3. 构建安全审查 prompt │
└────────────────────────────────────────┘
 │
 ▼
┌────────────────────────────────────────┐
│ Agent 处理 │
│ 分析 diff → 识别漏洞 → 输出报告 │
└────────────────────────────────────────┘
 │
 ▼
结构化安全报告（Markdown 格式）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二命令实现"&gt;二、命令实现&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/commands/security-review.ts&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="21-命令定义"&gt;2.1 命令定义&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 允许的工具（白名单）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;allowed&lt;span style="color:#ff79c6"&gt;-&lt;/span&gt;tools: &lt;span style="color:#8be9fd"&gt;Bash&lt;/span&gt;(git diff&lt;span style="color:#ff79c6"&gt;:*&lt;/span&gt;), Bash(git status&lt;span style="color:#ff79c6"&gt;:*&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Bash(git log&lt;span style="color:#ff79c6"&gt;:*&lt;/span&gt;), Bash(git show&lt;span style="color:#ff79c6"&gt;:*&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Bash(git remote show&lt;span style="color:#ff79c6"&gt;:*&lt;/span&gt;), Read, Glob, Grep, LS, Task
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 描述
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description: &lt;span style="color:#8be9fd"&gt;Complete&lt;/span&gt; a security review &lt;span style="color:#ff79c6"&gt;of&lt;/span&gt; the pending changes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; on the current branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-工具白名单策略"&gt;2.2 工具白名单策略&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 限制只能使用：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 1. Git 读取命令（diff, status, log, show, remote show）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 2. 文件读取（Read, Glob, Grep, LS）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 3. Task（用于并行分析）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// 禁止：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - Bash（其他命令）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - FileWrite / FileEdit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// - Network tools
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="三安全审查-prompt"&gt;三、安全审查 Prompt&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/commands/security-review.ts:6-179&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #00 · 开篇</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/00-intro/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/00-intro/</guid><description>&lt;blockquote&gt;
&lt;p&gt;从源码层面深入理解 OpenClaw 的设计思想与实现细节。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="系列介绍"&gt;系列介绍&lt;/h2&gt;
&lt;p&gt;OpenClaw 是一个面向 AI Agent 的开发框架，本系列从源码出发，拆解其核心模块的设计理念与实现机制。&lt;/p&gt;
&lt;p&gt;适合对象：对 Agent 架构、工具调用链、任务规划感兴趣，想深入理解 OpenClaw 内部原理的开发者。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;核心参考资料&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分析方法论：&lt;a href="./ANALYSIS_APPROACH.md"&gt;ANALYSIS_APPROACH.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;官方文档：https://docs.openclaw.ai&lt;/li&gt;
&lt;li&gt;DeepWiki：https://deepwiki.com/openclaw/openclaw&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="目录规划"&gt;目录规划&lt;/h2&gt;
&lt;h3 id="part-1架构层"&gt;Part 1：架构层&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;#&lt;/th&gt;
					&lt;th style="text-align: left"&gt;文章&lt;/th&gt;
					&lt;th style="text-align: left"&gt;状态&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;01&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/01-architecture-overview"&gt;整体架构概览：目录结构与模块划分&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;src/ 核心目录 + extensions/&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;02&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/02-gateway-arch"&gt;Gateway 控制平面：API 路由与协议&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Gateway 控制平面&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;03&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/03-plugin-sdk"&gt;Plugin SDK：扩展机制与公开 API&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件 SDK 架构&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;04&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/04-agent-runtime"&gt;Agent Runtime：任务编排与执行&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent 运行时&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="part-2核心机制"&gt;Part 2：核心机制&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;#&lt;/th&gt;
					&lt;th style="text-align: left"&gt;文章&lt;/th&gt;
					&lt;th style="text-align: left"&gt;状态&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;05&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/05-provider-system"&gt;Provider 系统：多模型统一接口&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;40+ 模型厂商抽象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;06&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/06-channel-system"&gt;Channel 系统：多渠道消息接入&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;消息渠道抽象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;07&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/07-session-state"&gt;会话与状态管理&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话生命周期&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;08&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/08-memory-system"&gt;记忆系统：Memory Architecture&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;长期记忆&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="part-3扩展系统"&gt;Part 3：扩展系统&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;#&lt;/th&gt;
					&lt;th style="text-align: left"&gt;文章&lt;/th&gt;
					&lt;th style="text-align: left"&gt;状态&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;09&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/09-extension-provider"&gt;Extension 开发：Provider 篇&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;开发新模型 Provider&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;10&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/10-extension-channel"&gt;Extension 开发：Channel 篇&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;开发新消息渠道&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;11&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/11-extension-skill"&gt;Extension 开发：Skill 篇&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;开发新 Skill&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="part-4工程实践"&gt;Part 4：工程实践&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;#&lt;/th&gt;
					&lt;th style="text-align: left"&gt;文章&lt;/th&gt;
					&lt;th style="text-align: left"&gt;状态&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;12&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/12-testing-strategy"&gt;测试策略：单元/集成/E2E&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Vitest + E2E&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;13&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/13-config-system"&gt;配置系统：Schema 与验证&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;14&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/14-security-auth"&gt;安全机制：Auth 与权限&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;认证授权&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;15&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;a href="https://skyseraph.github.io/series/openclaw-source-code/2026/15-deployment-docker"&gt;部署与运维：Docker 与容器化&lt;/a&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;✅ 完成&lt;/td&gt;
					&lt;td style="text-align: left"&gt;生产部署&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="模块速查"&gt;模块速查&lt;/h2&gt;
&lt;h3 id="核心模块src"&gt;核心模块（src/）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;功能&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent 定义、运行时、prompt 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugins/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件加载、激活、生命周期&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/gateway/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;控制平面 API、路由、协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;渠道抽象层&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-sdk/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件 SDK（公开 API）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/context-engine/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;上下文管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/memory/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;记忆系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/sessions/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/tasks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;任务系统&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="扩展extensions"&gt;扩展（extensions/）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;类型&lt;/th&gt;
					&lt;th style="text-align: left"&gt;数量&lt;/th&gt;
					&lt;th style="text-align: left"&gt;示例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Provider&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~40&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;openai/&lt;/code&gt;, &lt;code&gt;anthropic/&lt;/code&gt;, &lt;code&gt;ollama/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Channel&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~30&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;telegram/&lt;/code&gt;, &lt;code&gt;discord/&lt;/code&gt;, &lt;code&gt;whatsapp/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Skill&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~5&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;skill-workshop/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;Tool&lt;/td&gt;
					&lt;td style="text-align: left"&gt;~10&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memory-core/&lt;/code&gt;, &lt;code&gt;image-generation-core/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="源码结构概览"&gt;源码结构概览&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\dev\claude\openclaw\
├── src/
│ ├── agents/ # Agent 运行时
│ ├── gateway/ # 控制平面
│ ├── plugins/ # 插件系统
│ ├── plugin-sdk/ # SDK 公开 API
│ ├── channels/ # 渠道抽象
│ ├── context-engine/ # 上下文
│ ├── memory/ # 记忆
│ ├── sessions/ # 会话
│ ├── config/ # 配置
│ └── ...
├── extensions/
│ ├── providers/ # 模型提供商
│ │ ├── openai/
│ │ ├── anthropic/
│ │ └── ollama/
│ ├── channels/ # 消息渠道
│ │ ├── telegram/
│ │ ├── discord/
│ │ └── whatsapp/
│ └── skills/ # 技能
├── packages/ # 独立包
├── apps/ # 应用程序
└── ui/ # UI 组件
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="关键设计原则"&gt;关键设计原则&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;来自 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #01 · 整体架构概览：目录结构与模块划分</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/01-architecture-overview/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/01-architecture-overview/</guid><description>&lt;h2 id="一项目定位"&gt;一、项目定位&lt;/h2&gt;
&lt;p&gt;OpenClaw 是一个&lt;strong&gt;个人 AI 助手平台&lt;/strong&gt;，运行在用户自有设备上，通过用户已有的消息渠道进行交互。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;用户 ──► OpenClaw ──► 30+ 消息渠道
 │ (Telegram/Discord/WhatsApp...)
 │
 ▼
 模型提供商
 (OpenAI/Anthropic/Google...)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;核心特性&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;个人化、单用户、本地优先&lt;/li&gt;
&lt;li&gt;多渠道接入（30+ 消息平台）&lt;/li&gt;
&lt;li&gt;多模型支持（40+ 厂商）&lt;/li&gt;
&lt;li&gt;可扩展插件系统&lt;/li&gt;
&lt;li&gt;支持语音和 Canvas&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="二顶层目录结构"&gt;二、顶层目录结构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;openclaw/
├── src/ # 核心业务逻辑
├── extensions/ # 扩展：Provider/Channel/Skill (~100 个)
├── packages/ # 独立 npm 包
├── apps/ # 应用程序
├── ui/ # UI 组件
├── test/ # E2E 测试
├── docs/ # 文档
├── scripts/ # 构建/工具脚本
├── skills/ # 内置 Skills
├── security/ # 安全相关
├── vendor/ # 第三方依赖
└── [配置文件]
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="三核心模块src"&gt;三、核心模块（src/）&lt;/h2&gt;
&lt;h3 id="31-agent-系统"&gt;3.1 Agent 系统&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent 定义、运行时、prompt 管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agent-sdk/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent SDK&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent 相关类型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="32-控制平面"&gt;3.2 控制平面&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/gateway/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;Gateway 控制平面&lt;/strong&gt;：API、路由、协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/gateway/protocol/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;协议定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/api/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;API 相关&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="33-插件系统"&gt;3.3 插件系统&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugins/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件加载、激活、生命周期管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-sdk/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;Plugin SDK&lt;/strong&gt;（公开 API，供扩展使用）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-state/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件状态管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-activation-boundary.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件激活边界&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="34-渠道抽象"&gt;3.4 渠道抽象&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;渠道抽象层&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/session.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;渠道会话&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="35-上下文与记忆"&gt;3.5 上下文与记忆&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/context-engine/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;上下文引擎&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/memory/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;记忆系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/memory-host-sdk/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;记忆 Host SDK&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="36-会话与任务"&gt;3.6 会话与任务&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/sessions/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/tasks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;任务系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/trajectory/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;轨迹记录&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="37-配置与安全"&gt;3.7 配置与安全&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/secrets/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;密钥管理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/security/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;安全机制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/auth/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;认证授权&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="38-运行时能力"&gt;3.8 运行时能力&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/hooks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Hook 系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/flows/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Flow 工作流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/commands/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;命令系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/tui/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;TUI 界面&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="39-媒体与生成"&gt;3.9 媒体与生成&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/media/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;媒体处理&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/media-generation/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;媒体生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/media-understanding/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;媒体理解&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/image-generation/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;图片生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/video-generation/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;视频生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/music-generation/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;音乐生成&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/tts/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;文本转语音&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/realtime-voice/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;实时语音&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/realtime-transcription/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;实时转录&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="310-其他支持模块"&gt;3.10 其他支持模块&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/i18n/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;国际化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/mcp/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;MCP 协议&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/bootstrap/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;启动初始化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/daemon/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;后台守护进程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/logger/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;日志&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/logging/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;日志系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/crone/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;定时任务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/poll-params.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;轮询参数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/polls.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;轮询系统&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="四扩展系统extensions"&gt;四、扩展系统（extensions/）&lt;/h2&gt;
&lt;h3 id="41-provider模型提供商"&gt;4.1 Provider（模型提供商）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Provider&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;anthropic/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Anthropic API（Claude）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;openai/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;OpenAI API（GPT）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;ollama/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Ollama（本地模型）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;google/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Google AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;azure/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Azure OpenAI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;amazon-bedrock/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;AWS Bedrock&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;deepseek/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;DeepSeek&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;mistral/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Mistral AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;groq/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Groq&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;openrouter/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;OpenRouter&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;together/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Together AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;xai/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;xAI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;nvidia/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;NVIDIA NIM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;cerebras/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Cerebras&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt; Voyage/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Voyage AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;fireworks/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Fireworks AI&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;deepinfra/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;DeepInfra&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;vllm/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;vLLM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;sglang/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;SGLang&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;lmstudio/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;LM Studio&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;kimi-coding/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Kimi Coding&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;moonshot/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Moonshot&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;qwen/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Qwen&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;wenxin/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;百度文心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;minimax/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;MiniMax&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;volcengine/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;火山引擎&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;baichuan/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;百川&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;tencent/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;腾讯混元&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;zalo/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Zalo&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-channel消息渠道"&gt;4.2 Channel（消息渠道）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Channel&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;telegram/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Telegram&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;discord/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Discord&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;whatsapp/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;WhatsApp&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;slack/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Slack&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;microsoft/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Microsoft Teams&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;googlechat/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Google Chat&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;msteams/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Microsoft Teams（原生）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;matrix/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Matrix&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;irc/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;IRC&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;signal/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Signal&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;feishu/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;飞书&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;line/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;LINE&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;mattermost/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Mattermost&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;nextcloud-talk/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Nextcloud Talk&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;synology-chat/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;群晖 Chat&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;tlon/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Tlon&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;nostr/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Nostr&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;twitch/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Twitch&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;bluebubbles/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;BlueBubbles（iMessage）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;imessage/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;iMessage&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="43-skill技能"&gt;4.3 Skill（技能）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Skill&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;skill-workshop/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;技能工作流&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="44-tool工具能力"&gt;4.4 Tool（工具能力）&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Tool&lt;/th&gt;
					&lt;th style="text-align: left"&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memory-core/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;记忆核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memory-lancedb/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;LanceDB 记忆存储&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memory-wiki/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Wiki 记忆&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;image-generation-core/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;图片生成核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;video-generation-core/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;视频生成核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;media-understanding-core/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;媒体理解核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;speech-core/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;语音核心&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="五架构设计原则"&gt;五、架构设计原则&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;来自 &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #02 · Gateway 控制平面：API 路由与协议</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/02-gateway-arch/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/02-gateway-arch/</guid><description>&lt;h2 id="一gateway-定位"&gt;一、Gateway 定位&lt;/h2&gt;
&lt;p&gt;Gateway 是 OpenClaw 的&lt;strong&gt;控制平面&lt;/strong&gt;——负责接收来自渠道的消息、管理会话、协调 Agent 执行。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────┐
│ OpenClaw Gateway │
│ 控制平面 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 渠道接入 │ │ 会话 │ │ 凭证 │ │
│ │ │ │ 管理 │ │ 管理 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 协议 │ │ API │ │ 运行时 │ │
│ │ 处理器 │ │ 路由 │ │ 协调 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
 │ │ │
 ▼ ▼ ▼
┌──────────────────────────────────────────────────┐
│ Extensions / Plugins │
│ Channel (Telegram/Discord) │ Provider (OpenAI) │
└──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/gateway/&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #03 · Plugin SDK：扩展机制与公开 API</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/03-plugin-sdk/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/03-plugin-sdk/</guid><description>&lt;h2 id="一plugin-sdk-定位"&gt;一、Plugin SDK 定位&lt;/h2&gt;
&lt;p&gt;Plugin SDK 是 OpenClaw 的&lt;strong&gt;扩展接入层&lt;/strong&gt;——定义扩展如何与核心交互、如何注册能力、如何参与生命周期。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Gateway │ │ Agent │ │ Config │ │
│ │ │ │ Runtime │ │ │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ ▲ │
│ │ plugin-sdk/* │
│ │ (公开 API) │
└─────────────────────────┼───────────────────────────────────┘
 │
┌─────────────────────────┼───────────────────────────────────┐
│ Plugin SDK 公开接口 (src/plugin-sdk/) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ OpenClawPluginApi │ │
│ │ registerProvider() · registerChannel() │ │
│ │ registerTool() · registerHook() · registerCommand() │ │
│ │ registerHttpRoute() · registerService() │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Plugin Manifest (openclaw.plugin.json) │ │
│ │ id · configSchema · kind · providers · channels │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────────┘
 │
┌─────────────────────────┼───────────────────────────────────┐
│ Extensions │
│ extensions/providers/ extensions/channels/ extensions/ │
│ openai/ telegram/ skill-workshop/│
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;核心原则&lt;/strong&gt;（来自 &lt;code&gt;AGENTS.md&lt;/code&gt;）：&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #04 · Agent Runtime：任务编排与执行</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/04-agent-runtime/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/04-agent-runtime/</guid><description>&lt;h2 id="一agent-runtime-定位"&gt;一、Agent Runtime 定位&lt;/h2&gt;
&lt;p&gt;Agent Runtime 是 OpenClaw 的&lt;strong&gt;任务执行引擎&lt;/strong&gt;——负责接收消息、选择模型、调度工具、生成回复。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│ Agent Runtime │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ agent-command.ts │ │
│ │ 入口：解析参数 → 解析会话 → 路由到 Harness │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────┼─────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ ACP Harness │ │ PI Harness │ │ CLI Harness │ │
│ │ (外部 Agent)│ │ (内置模型) │ │ (Claude CLI)│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ attempt-execution.ts │ │
│ │ 认证计划 · 模型选择 · Fallback · 生命周期 │ │
│ └─────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agent-command.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;命令入口，解析参数，协调执行流程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;command/attempt-execution.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;核心执行引擎，运行单次 Agent Attempt&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;command/delivery.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;结果投递到渠道&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;command/session.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话解析与创建&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;command/run-context.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;运行上下文构建&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;harness/types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Harness 接口定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;harness/registry.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Harness 注册表&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;harness/selection.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Harness 选择策略&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;acp-spawn.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ACP 子 Agent 孵化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三agent-命令入口"&gt;三、Agent 命令入口&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;agent-command.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #05 · Provider 系统：多模型统一接口</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/05-provider-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/05-provider-system/</guid><description>&lt;h2 id="一provider-系统定位"&gt;一、Provider 系统定位&lt;/h2&gt;
&lt;p&gt;Provider 系统是 OpenClaw 的&lt;strong&gt;模型抽象层&lt;/strong&gt;——通过统一接口接入 40+ 模型厂商，对上屏蔽厂商差异。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Agent RT │ │ Channel │ │ Skills │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Model Selection (model-selection.ts) │ │
│ │ resolveDefaultModelForAgent() │ │
│ │ buildAllowedModelSet() │ │
│ │ resolveConfiguredModelRef() │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────┬─────────────────────────────────┘
 │
┌─────────────────────────┼─────────────────────────────────┐
│ Provider 插件层 (extensions/providers/) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ openai/ │ │anthropic/│ │ ollama/ │ │ gemini/ │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/model-selection.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;模型选择、解析、规范化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/model-selection-normalize.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ModelRef 规范化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/model-selection-shared.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;模型列表/别名共享逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/model-catalog.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;模型目录加载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/defaults.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;默认 Provider/Model&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/provider-id.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Provider ID 规范化&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/providers/*/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;40+ Provider 插件&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三核心类型"&gt;三、核心类型&lt;/h2&gt;
&lt;h3 id="31-modelref"&gt;3.1 ModelRef&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6272a4"&gt;// agents/model-selection-normalize.ts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff79c6"&gt;export&lt;/span&gt; &lt;span style="color:#ff79c6"&gt;type&lt;/span&gt; ModelRef &lt;span style="color:#ff79c6"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; provider: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;; &lt;span style="color:#6272a4"&gt;// e.g. &amp;#34;openai&amp;#34;, &amp;#34;anthropic&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model: &lt;span style="color:#8be9fd"&gt;string&lt;/span&gt;; &lt;span style="color:#6272a4"&gt;// e.g. &amp;#34;gpt-4o&amp;#34;, &amp;#34;claude-sonnet-4&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="32-modelkey"&gt;3.2 ModelKey&lt;/h3&gt;
&lt;p&gt;模型唯一标识：&lt;code&gt;provider/model&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #06 · Channel 系统：多渠道消息接入</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/06-channel-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/06-channel-system/</guid><description>&lt;h2 id="一channel-系统定位"&gt;一、Channel 系统定位&lt;/h2&gt;
&lt;p&gt;Channel 系统是 OpenClaw 的&lt;strong&gt;消息渠道抽象层&lt;/strong&gt;——通过统一接口接入 30+ 消息平台，对上屏蔽平台差异。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Gateway │ │ Agent RT │ │ Memory │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Channel 抽象层 (src/channels/) │ │
│ │ inbound → session → outbound │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────┬─────────────────────────────────┘
 │
┌─────────────────────────┼─────────────────────────────────┐
│ Channel 插件层 (extensions/channels/) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │telegram/│ │discord/ │ │whatsapp/│ │ slack/ │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/types.plugin.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ChannelPlugin 接口定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/types.core.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;核心类型（ChannelId、ChannelCapabilities）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/types.adapters.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;各 Adapter 接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/config-schema.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置 Schema&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/config-writes.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置写入逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/plugins/config-helpers.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置辅助函数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/inbound-debounce-policy.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;入站消息去抖&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/conversation-resolution.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;会话解析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/allow-from.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;AllowFrom 逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;channels/mention-gating.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;提及过滤&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/channels/*/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;30+ Channel 插件&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三channelplugin-接口"&gt;三、ChannelPlugin 接口&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;channels/plugins/types.plugin.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #07 · 会话与状态管理</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/07-session-state/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/07-session-state/</guid><description>&lt;h2 id="一会话系统定位"&gt;一、会话系统定位&lt;/h2&gt;
&lt;p&gt;会话系统是 OpenClaw 的&lt;strong&gt;状态管理核心&lt;/strong&gt;——管理会话生命周期、持久化、解析与投递。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Session System │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ SessionEntry │ │
│ │ sessionId · model · tokenCount · skillsSnapshot │ │
│ │ acp meta · pluginExtensions · compactionState │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Session Key │ │ Session │ │ Transcript │ │
│ │ 解析 │ │ Store │ │ 管理 │ │
│ └────────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二核心类型"&gt;二、核心类型&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;config/sessions/types.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #08 · 记忆系统：Memory Architecture</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/08-memory-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/08-memory-system/</guid><description>&lt;h2 id="一记忆系统定位"&gt;一、记忆系统定位&lt;/h2&gt;
&lt;p&gt;记忆系统是 OpenClaw 的&lt;strong&gt;长期知识管理模块&lt;/strong&gt;——通过搜索、注入、压缩机制扩展 Agent 的上下文能力。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Memory System │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ MemoryPluginCapability │ │
│ │ promptBuilder · flushPlanResolver · runtime │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Prompt Builder │ │ Search Manager │ │
│ │ 向 System Prompt │ │ 向量/全文搜索 │ │
│ │ 注入记忆段落 │ │ RAG 检索 │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Flush Plan (Compaction) │ │
│ │ 会话过长时触发记忆压缩，释放上下文窗口 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;plugins/memory-state.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Memory 插件状态与注册&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;plugin-sdk/memory-host-core.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Memory Host 核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;plugin-sdk/memory-host-search.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;搜索接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;plugin-sdk/memory-core-host-runtime-*.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;各后端运行时&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;agents/memory-search.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Agent 记忆搜索&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;auto-reply/reply/memory-flush.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;记忆刷新&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;memory-host-sdk/host/types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;SearchManager 类型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三核心类型"&gt;三、核心类型&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;plugins/memory-state.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #09 · Extension 开发：Provider 篇</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/09-extension-provider/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/09-extension-provider/</guid><description>&lt;h2 id="一provider-扩展定位"&gt;一、Provider 扩展定位&lt;/h2&gt;
&lt;p&gt;Provider 扩展是 OpenClaw 的&lt;strong&gt;模型接入层&lt;/strong&gt;——通过插件机制接入 40+ 模型厂商，对上提供统一的 &lt;code&gt;ProviderPlugin&lt;/code&gt; 接口。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Agent RT │ │ Channel │ │ Skills │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ProviderPlugin Interface │ │
│ │ id · label · auth · catalog · resolveDynamicModel │ │
│ └──────────────────────────────────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
 │
┌───────────────────────────┼─────────────────────────────────┐
│ extensions/providers/ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ openai/ │ │anthropic/│ │ ollama/ │ │ gemini/ │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugins/types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ProviderPlugin 类型定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/providers/&amp;lt;name&amp;gt;/index.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Provider 插件入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/providers/&amp;lt;name&amp;gt;/api.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;运行时 API 实现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/providers/&amp;lt;name&amp;gt;/provider-discovery.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;独立发现插件&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/providers/&amp;lt;name&amp;gt;/openclaw.plugin.json&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Manifest 元数据&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/model-catalog.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;模型目录加载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/model-catalog.types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ModelCatalogEntry 类型&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三providerplugin-接口"&gt;三、ProviderPlugin 接口&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/plugins/types.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #10 · Extension 开发：Channel 篇</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/10-extension-channel/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/10-extension-channel/</guid><description>&lt;h2 id="一channel-扩展定位"&gt;一、Channel 扩展定位&lt;/h2&gt;
&lt;p&gt;Channel 扩展是 OpenClaw 的&lt;strong&gt;消息渠道接入层&lt;/strong&gt;——通过插件机制接入 30+ 消息平台，对上提供统一的 &lt;code&gt;ChannelPlugin&lt;/code&gt; 接口。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Gateway │ │ Agent RT │ │ Memory │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ChannelPlugin Interface │ │
│ │ id · meta · capabilities · config · setup │ │
│ │ outbound · gateway · lifecycle │ │
│ └──────────────────────────────────────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
 │
┌───────────────────────────┼─────────────────────────────────┐
│ extensions/channels/ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │telegram/│ │discord/ │ │whatsapp/│ │ slack/ │ ... │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/types.plugin.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;ChannelPlugin 接口定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/types.core.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;核心类型（Capabilities、Meta）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/types.adapters.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;各 Adapter 接口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/config-schema.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置 Schema 构建器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/setup-wizard-types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Setup Wizard 类型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-sdk/core.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;createChatChannelPlugin()&lt;/code&gt; 辅助函数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/channels/&amp;lt;name&amp;gt;/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;各 Channel 插件实现&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三channelplugin-接口"&gt;三、ChannelPlugin 接口&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/channels/plugins/types.plugin.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #11 · Extension 开发：Skill 篇</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/11-extension-skill/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/11-extension-skill/</guid><description>&lt;h2 id="一skill-扩展定位"&gt;一、Skill 扩展定位&lt;/h2&gt;
&lt;p&gt;Skill 扩展是 OpenClaw 的&lt;strong&gt;技能模块&lt;/strong&gt;——通过描述匹配触发，为 Agent 提供专用工具和知识。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ OpenClaw Core │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Agent RT │ │ Skills │ │ Memory │ │
│ └──────────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Skill System │ │
│ │ SKILL.md · scripts/ · references/ │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件/目录&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/skills/types.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Skill 类型定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/skills/workspace.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Skill 加载、过滤、Prompt 构建&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/skills/frontmatter.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Frontmatter 解析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/skills/local-loader.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;文件系统加载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/agents/skills/plugin-skills.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件内嵌 Skill 加载&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;内置 Skill 目录&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;extensions/*/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件内嵌 Skill&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三两种-skill-类型"&gt;三、两种 Skill 类型&lt;/h2&gt;
&lt;h3 id="31-独立-skill"&gt;3.1 独立 Skill&lt;/h3&gt;
&lt;p&gt;存储在 &lt;code&gt;skills/&lt;/code&gt; 目录：&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #12 · 测试策略：单元/集成/E2E</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/12-testing-strategy/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/12-testing-strategy/</guid><description>&lt;h2 id="一测试系统定位"&gt;一、测试系统定位&lt;/h2&gt;
&lt;p&gt;OpenClaw 采用 &lt;strong&gt;Vitest&lt;/strong&gt; 作为主要测试框架，配合 Playwright 进行浏览器测试，构建了多层次的测试体系。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Testing Infrastructure │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Vitest │ │ Playwright │ │ V8 │ │
│ │ 单元/集成 │ │ 浏览器测试 │ │ 覆盖率 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二测试框架"&gt;二、测试框架&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;工具&lt;/th&gt;
					&lt;th style="text-align: left"&gt;版本&lt;/th&gt;
					&lt;th style="text-align: left"&gt;用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;vitest&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;^4.1.5&lt;/td&gt;
					&lt;td style="text-align: left"&gt;单元/集成测试框架&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;@vitest/coverage-v8&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;^4.1.5&lt;/td&gt;
					&lt;td style="text-align: left"&gt;V8 引擎代码覆盖率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;@vitest/browser-playwright&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-&lt;/td&gt;
					&lt;td style="text-align: left"&gt;浏览器 E2E 测试&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;jsdom&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;^29.1.0&lt;/td&gt;
					&lt;td style="text-align: left"&gt;DOM 模拟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;playwright&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-&lt;/td&gt;
					&lt;td style="text-align: left"&gt;浏览器自动化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三目录结构"&gt;三、目录结构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;C:\dev\claude\openclaw\
├── test/
│ ├── vitest/ # Vitest 配置文件（70+）
│ │ ├── vitest.config.ts # 根配置
│ │ ├── vitest.unit.config.ts # 单元测试
│ │ ├── vitest.unit-fast.config.ts # 快速单元
│ │ ├── vitest.e2e.config.ts # E2E 测试
│ │ ├── vitest.gateway.config.ts
│ │ ├── vitest.channels.config.ts
│ │ └── vitest.contracts-*.config.ts # 契约测试
│ │
│ ├── helpers/ # 测试工具
│ │ ├── openclaw-test-instance.ts # Gateway 实例启动器
│ │ ├── gateway-e2e-harness.ts # E2E 测试 harness
│ │ └── ...
│ │
│ ├── mocks/ # Mock 定义
│ ├── fixtures/ # 测试夹具
│ ├── setup.ts # 全局 Setup
│ ├── setup.shared.ts # 共享 Setup
│ └── setup-openclaw-runtime.ts # 运行时环境
│
├── src/
│ └── **/*.test.ts # 单元测试分散在 src/
│
└── ui/
 └── src/**/*.test.ts # UI 组件测试（~100 文件）
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="四配置文件"&gt;四、配置文件&lt;/h2&gt;
&lt;h3 id="41-根配置"&gt;4.1 根配置&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;test/vitest/vitest.config.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #13 · 配置系统：Schema 与验证</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/13-config-system/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/13-config-system/</guid><description>&lt;h2 id="一配置系统定位"&gt;一、配置系统定位&lt;/h2&gt;
&lt;p&gt;OpenClaw 采用 &lt;strong&gt;Zod&lt;/strong&gt; 作为配置 Schema 定义和验证的核心，提供类型安全的配置加载、验证和环境变量替换。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Config System │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ OpenClawSchema │ │
│ │ env · auth · models · agents · channels · plugins │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ │
│ │ Zod Schema │ │ Env Vars │ │ Includes │ │
│ │ validation │ │ ${VAR} 替换 │ │ $include │ │
│ └────────────────┘ └────────────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二模块结构"&gt;二、模块结构&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;文件&lt;/th&gt;
					&lt;th style="text-align: left"&gt;职责&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/zod-schema.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;主 Zod Schema 定义&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/validation.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置验证入口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/io.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;配置加载、写入&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/types.openclaw.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;TypeScript 类型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/env-vars.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;环境变量收集&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/env-substitution.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;${VAR}&lt;/code&gt; 替换&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/config/includes.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;$include&lt;/code&gt; 指令&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugin-sdk/config-schema.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;插件 Config Schema 构建器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/channels/plugins/config-schema.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Channel Config Schema&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;src/plugins/schema-validator.ts&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;AJV JSON Schema 验证&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="三openclawschema"&gt;三、OpenClawSchema&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;文件：&lt;code&gt;src/config/zod-schema.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #14 · 安全机制：Auth 与权限</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/14-security-auth/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/14-security-auth/</guid><description>&lt;h2 id="一安全系统定位"&gt;一、安全系统定位&lt;/h2&gt;
&lt;p&gt;OpenClaw 安全系统采用分层设计，区分认证（Authentication）与授权（Authorization），覆盖 Gateway、Provider、Channel 三大维度。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Security Architecture │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Gateway Auth │ │
│ │ token · password · trusted-proxy · device-token │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Auth Profiles │ │
│ │ api_key · token · oauth · SecretRef │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Channel Security │ │
│ │ dm-policy · allowlist · pairing │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二gateway-认证"&gt;二、Gateway 认证&lt;/h2&gt;
&lt;h3 id="21-认证模式"&gt;2.1 认证模式&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;src/gateway/auth-resolve.ts&lt;/code&gt;&lt;/p&gt;</description></item><item><title>OpenClaw源码剖析 #15 · 部署与运维：Docker 与容器化</title><link>https://skyseraph.github.io/series/openclaw-source-code/2026/15-deployment-docker/</link><pubDate>Fri, 01 May 2026 08:00:00 +0800</pubDate><guid>https://skyseraph.github.io/series/openclaw-source-code/2026/15-deployment-docker/</guid><description>&lt;h2 id="一部署系统定位"&gt;一、部署系统定位&lt;/h2&gt;
&lt;p&gt;OpenClaw 支持多种部署方式，其中 &lt;strong&gt;Docker 容器化部署&lt;/strong&gt;是生产环境的推荐方案。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│ Docker Deployment │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Multi-Stage Build │ │
│ │ ext-deps → build → runtime-assets → base → runtime │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────┐ │
│ │ Docker Compose │ │ Gateway │ │ Sandbox │ │
│ │ Gateway + CLI │ │ 容器运行 │ │ 隔离代理 │ │
│ └────────────────┘ └────────────────┘ └────────────┘ │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="二dockerfile-结构"&gt;二、Dockerfile 结构&lt;/h2&gt;
&lt;h3 id="21-多阶段构建"&gt;2.1 多阶段构建&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>