Skip to content

OpenClaw 源码学习路线规划

目标:从零基础到能够独立开发 OpenClaw 插件和核心功能
预估总时长:4-6 周(每天 2-3 小时)
前置要求:TypeScript 基础、Node.js 基础、async/await 理解


目录


学习方法论

核心原则:由外向内、由简到繁、先读后写

  1. 先跑起来再读代码 — 先让项目在本地运行,对系统行为建立直觉
  2. 从类型定义开始 — TypeScript 项目的类型文件就是最好的文档
  3. 跟着数据流走 — 一条消息从用户发送到 AI 回复的完整路径
  4. 写测试来验证理解 — 为你读过的模块写一个小测试,验证你的理解
  5. 画图总结 — 每个 Phase 结束后画一张模块关系图

![学习方法论:五步源码学习法](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/01-infographic-learning-methodology-1775150607387.png)

每日学习模板

📅 日期:____
📂 今日目标文件:____
⏱ 预计时长:____ 小时

[ ] 1. 先读文件的导出(exports)—— 了解"这个模块对外提供什么"
[ ] 2. 再读 import —— 了解"这个模块依赖什么"
[ ] 3. 从主导出函数/类开始,逐步深入
[ ] 4. 记录不理解的概念,查阅后补充笔记
[ ] 5. 尝试运行相关测试文件(*.test.ts)
[ ] 6. 用自己的话写一段总结

📝 今日收获:
❓ 遗留问题:

前置知识准备

在正式开始之前,确保你对以下知识有基本了解。如果某些点不熟悉,建议花 1-2 天补充。

TypeScript 进阶(必须)

知识点重要程度在项目中的应用
as const 断言⭐⭐⭐⭐⭐logging/levels.ts — 从常量数组提取联合类型
泛型 <T>⭐⭐⭐⭐⭐retry.tsChannelPlugin<A, P> 等到处都是
类型守卫 (is)⭐⭐⭐⭐errors.tsisErrno(err): err is NodeJS.ErrnoException
映射类型⭐⭐⭐⭐plugins/types.tsPluginHookHandlerMap
条件类型⭐⭐⭐插件类型系统中的类型推导
Symbol.for()⭐⭐⭐plugins/runtime.ts — 全局单例注册
索引访问类型 T[K]⭐⭐⭐(typeof ARRAY)[number] 模式
Discriminated Union⭐⭐⭐插件 Hook 结果类型 status: "ok" | "error"

Node.js 核心(必须)

知识点重要程度在项目中的应用
ESM 模块系统⭐⭐⭐⭐⭐整个项目使用 ESM (import.meta.url)
process.env⭐⭐⭐⭐⭐infra/env.ts — 环境变量管理
fs/promises⭐⭐⭐⭐infra/fs-safe.ts — 安全文件操作
child_process.spawn⭐⭐⭐⭐entry.ts — 进程 respawn 机制
AbortController / AbortSignal⭐⭐⭐⭐infra/fetch.ts — Fetch 包装
EventEmitter⭐⭐⭐事件系统基础
WebSocket (ws)⭐⭐⭐gateway/client.ts — Gateway 通信
Express.js 基础⭐⭐⭐gateway/server.impl.ts — HTTP 服务器

工具链(推荐)

工具用途学习程度
pnpm包管理器、monorepo了解 workspace 概念即可
Vitest测试框架会写基本测试即可
ZodSchema 验证理解基本用法
Commander.jsCLI 框架了解 Command/Option 概念
JSON5JSON 超集知道语法差异即可

![前置知识准备:三大技能矩阵](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/02-infographic-prerequisites-matrix-1775150608427.png)


Phase 1:环境搭建与项目全景(第 1-2 天)

🎯 目标:让项目跑起来,建立全局认知

Day 1:环境搭建

1.1 克隆并安装

bash
# 安装依赖
cd /Users/bytedance/Desktop/ai-study/openclaw-2026.3.2
pnpm install

# 验证安装
pnpm build
pnpm test:fast

1.2 阅读顶层文件

按以下顺序阅读:

序号文件阅读目标预计时间
1README.md了解项目是什么、怎么安装10 分钟
2VISION.md了解项目方向和优先级10 分钟
3SECURITY.md了解安全模型和信任边界15 分钟
4CONTRIBUTING.md了解贡献规范10 分钟
5package.json了解依赖、脚本、导出15 分钟
6pnpm-workspace.yaml了解 monorepo 结构5 分钟
7AGENTS.md了解项目编码规范(AI 编程规范也是好的代码规范)20 分钟

1.3 关注 package.json 中的关键字段

jsonc
{
  "exports": {
    ".": "./src/index.ts", // 库入口
    "./plugin-sdk": "./src/plugin-sdk/index.ts", // 插件 SDK 入口
  },
  "bin": {
    "openclaw": "openclaw.mjs", // CLI 入口
  },
  "scripts": {
    "build": "tsdown ...", // 构建
    "test": "vitest ...", // 测试
    "check": "oxlint && oxfmt ...", // 检查
    "tsgo": "tsgo --project ...", // 类型检查
  },
}

Day 2:建立全景认知

2.1 目录结构速览

打开终端,运行以下命令理解目录结构:

bash
# 查看顶层目录
ls -la

# 查看 src 目录结构(只看第一层)
ls src/

# 查看扩展目录
ls extensions/

# 查看应用目录
ls apps/

# 查看技能目录
ls skills/

2.2 画出你的第一张架构图

用纸笔或工具画出以下关系:

用户消息 → Channel(WhatsApp/Telegram/...) → Gateway → Agent(AI模型) → 回复

2.3 运行 CLI 感受系统

bash
# 查看帮助
pnpm openclaw --help

# 查看版本
pnpm openclaw --version

# 查看所有子命令
pnpm openclaw gateway --help
pnpm openclaw agent --help
pnpm openclaw config --help
pnpm openclaw status --help

![OpenClaw 项目全景:消息数据流与目录结构](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/03-infographic-project-panorama-1775150609368.png)

✅ Phase 1 检查点

  • [ ] 项目能成功安装和构建
  • [ ] 能用自己的话描述 OpenClaw 是什么
  • [ ] 知道 src/extensions/apps/skills/ 分别放什么
  • [ ] 画出了一张简单的架构图

Phase 2:基础设施层 — 项目的"地基"(第 3-6 天)

🎯 目标:理解项目的基础工具模块,这些是所有上层模块的依赖

为什么从这里开始?

基础设施层(src/infra/src/logging/)是零依赖的底层模块。所有上层模块(Config、Gateway、Channel、Agent)都依赖它们。先学会这些,后面遇到时就不会困惑。

![基础设施层:项目的"地基"](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/04-infographic-infrastructure-layer-1775150610325.png)

Day 3:日志与环境变量(难度 ★☆☆☆☆ ~ ★★☆☆☆)

3.1 src/logging/levels.ts — 日志级别定义

为什么先读这个? 只有 ~50 行,是全项目最简单的文件之一,但展示了 TypeScript 的核心技巧。

📂 文件:src/logging/levels.ts
📊 行数:~50
⭐ 难度:★☆☆☆☆
🔗 依赖:无

学习要点:

  • as const + typeof ARRAY[number] → 从常量数组提取联合类型
  • Record<string, number> → 映射日志级别到数字
  • 类型守卫式的安全解析函数

练习:

typescript
// 模仿 levels.ts 的模式,写一个 HTTP 方法的类型定义
const HTTP_METHODS = ["GET", "POST", "PUT", "DELETE"] as const;
type HttpMethod = (typeof HTTP_METHODS)[number]; // "GET" | "POST" | "PUT" | "DELETE"

3.2 src/infra/env.ts — 环境变量管理

📂 文件:src/infra/env.ts
📊 行数:~120
⭐ 难度:★★☆☆☆
🔗 依赖:无外部依赖

学习要点:

  • 环境变量别名规范化(历史更名:Clawdbot → Moldbot → OpenClaw)
  • 敏感值脱敏输出(<redacted>
  • 去重日志记录(Set<string>

阅读顺序:

  1. 先看 normalizeEnv() — 理解为什么需要规范化
  2. 再看 isTruthyEnvValue() — 理解布尔环境变量的多种写法
  3. 最后看 formatEnvValue() — 理解脱敏策略

3.3 src/runtime.ts — 运行时环境抽象

📂 文件:src/runtime.ts
📊 行数:~80
⭐ 难度:★★☆☆☆
🔗 依赖:logging/levels

学习要点:

  • 依赖注入(DI)入门RuntimeEnv 类型抽象了 logerrorexit 三个操作
  • 可测试性设计createNonExitingRuntime() — 测试中 exit 抛异常而非真退出
  • 这个文件展示了"为什么要做抽象"——因为测试需要

关键问题:

Q:为什么不直接调用 process.exit()
A:因为测试中调用 process.exit() 会直接终止测试进程。通过 RuntimeEnv 抽象,测试可以注入一个"假的" exit 函数。

Day 4:错误处理与重试(难度 ★★☆☆☆ ~ ★★★☆☆)

4.1 src/infra/errors.ts — 错误处理工具

📂 文件:src/infra/errors.ts
📊 行数:~200
⭐ 难度:★★☆☆☆
🔗 依赖:无

学习要点:

  • TypeScript 类型守卫:isErrno(err): err is NodeJS.ErrnoException
  • unknown 类型的安全处理(层层类型检查)
  • BFS 遍历错误链collectErrorGraphCandidates 用广度优先搜索遍历 cause 嵌套链
  • 错误消息脱敏:防止 token/密钥泄露到日志

阅读顺序:

  1. isErrno() → 类型守卫的最简示例
  2. extractErrorCode() → 处理 unknown 的标准模式
  3. formatErrorMessage() → 多态错误格式化
  4. collectErrorGraphCandidates() → BFS 遍历(最有趣的部分)

4.2 src/infra/retry.ts — 重试机制

📂 文件:src/infra/retry.ts
📊 行数:~150
⭐ 难度:★★★☆☆
🔗 依赖:无外部依赖

学习要点:

  • 指数退避算法delay = minDelay * 2^(attempt-1)
  • 抖动(Jitter):防止多个客户端同时重试(惊群效应)
  • 可插拔策略shouldRetryonRetry 回调
  • HTTP Retry-After 头支持

实验建议:

typescript
// 写一个小脚本测试重试行为
import { retryAsync } from "./src/infra/retry.js";

let attempt = 0;
const result = await retryAsync(3, async () => {
  attempt++;
  console.log(`Attempt ${attempt}`);
  if (attempt < 3) throw new Error("Not ready");
  return "success";
});
console.log(result); // "success"

Day 5:Fetch 包装与安全文件操作(难度 ★★★☆☆ ~ ★★★★★)

5.1 src/infra/fetch.ts — Fetch API 包装

📂 文件:src/infra/fetch.ts
📊 行数:~120
⭐ 难度:★★★☆☆
🔗 依赖:无

学习要点:

  • AbortSignal 兼容性:不同 JS 运行时的 AbortSignal 可能不兼容
  • duplex: "half" 注入:Node.js 的 streaming request body 需要此标志
  • Symbol 防重复包装Symbol.for("openclaw.fetch.abort-signal-wrapped")
  • 高阶函数装饰器模式wrapFetchWithAbortSignal 返回增强版 fetch

这个文件教你: 在实际项目中,简单的 fetch() 调用背后有多少兼容性坑。

5.2 src/infra/fs-safe.ts — 安全文件系统操作(⚠️ 高难度,可选精读)

📂 文件:src/infra/fs-safe.ts
📊 行数:~400
⭐ 难度:★★★★★
🔗 依赖:infra/errors

学习要点(这是整个项目安全设计的精华):

  • 路径遍历攻击防御isPathInside 防止 ../../../etc/passwd
  • 符号链接攻击防御O_NOFOLLOW 标志
  • 硬链接攻击防御stat.nlink > 1 检测
  • TOCTOU 竞态条件缓解:多次校验(lstat → open → stat → realpath → stat)
  • 原子写入:先写临时文件再 rename
  • 平台差异:Linux /proc/self/fd vs macOS /dev/fd

💡 建议:首次阅读可以跳过具体实现细节,重点理解安全策略的设计思路。这个文件值得反复阅读。

Day 6:日志系统完整实现(难度 ★★★★☆)

6.1 src/logging/logger.ts — 日志系统核心

📂 文件:src/logging/logger.ts
📊 行数:~300
⭐ 难度:★★★★☆
🔗 依赖:logging/levels, infra/env

学习要点:

  • 滚动日志:按日期命名文件(openclaw-YYYY-MM-DD.log),24 小时自动清理
  • 文件大小上限:500MB 后停止写入
  • 懒加载单例getLogger() 缓存实例
  • 外部传输机制registerLogTransport 支持日志输出到自定义目标
  • Pino 适配器toPinoLikeLogger 适配第三方库需要的 pino 接口

阅读顺序:

  1. getLogger() — 理解单例创建流程
  2. createFileTransport() — 理解日志文件写入
  3. registerLogTransport() — 理解可扩展的传输机制
  4. toPinoLikeLogger() — 理解适配器模式

✅ Phase 2 检查点

  • [ ] 能解释 as const + 索引类型的联合类型提取技巧
  • [ ] 理解为什么需要 RuntimeEnv 抽象(答案:可测试性)
  • [ ] 能画出错误链的 BFS 遍历过程
  • [ ] 理解指数退避 + 抖动的重试策略
  • [ ] 知道 fs-safe.ts 防御了哪些安全攻击
  • [ ] 理解日志系统的滚动和传输机制

Phase 3:配置系统 — 项目的"大脑"(第 7-10 天)

🎯 目标:理解配置如何被发现、加载、验证、应用和写回

为什么配置系统如此重要?

Gateway 的所有行为(绑定地址、认证模式、TLS、插件启用、渠道配置等)都由 OpenClawConfig 驱动。配置系统是连接用户意图和系统行为的桥梁。

Day 7:配置类型与路径(难度 ★★☆☆☆ ~ ★★★☆☆)

7.1 src/config/types.tstypes.openclaw.ts — 根配置类型

📂 文件:src/config/types.ts (桶文件) → types.openclaw.ts (核心)
📊 行数:桶文件 ~35 行 + 子文件 750+ 行
⭐ 难度:★★☆☆☆(作为参考索引)

学习方法:

  1. 打开 types.openclaw.ts,找到 OpenClawConfig 类型定义
  2. 浏览它的 ~30 个顶级字段,建立配置全景
  3. 挑 2-3 个你感兴趣的字段(比如 agentgateway),跳到对应的 types.*.ts 文件

重点关注:

  • OpenClawConfig — 根配置类型(~30 个顶级字段)
  • ConfigFileSnapshot — 配置快照(用于 diff 和 UI 展示)
  • ConfigValidationIssue — 验证问题类型

7.2 src/config/paths.ts — 配置路径解析

📂 文件:src/config/paths.ts
📊 行数:~284
⭐ 难度:★★★☆☆

学习要点:

  • 状态目录:~/.openclaw(支持历史遗留目录 .clawdbot.moldbot.moltbot
  • 配置文件:~/.openclaw/openclaw.json
  • 端口解析优先级:环境变量 > 配置文件 > 默认值 (18789)
  • Gateway 锁目录:/tmp/openclaw-<uid>

核心函数:

resolveStateDir()      → ~/.openclaw
resolveConfigPath()    → ~/.openclaw/openclaw.json
resolveGatewayPort()   → 18789 (默认)
resolveGatewayLockDir() → /tmp/openclaw-<uid>

Day 8:配置默认值管道(难度 ★★★★☆)

8.1 src/config/defaults.ts — 默认值应用层

📂 文件:src/config/defaults.ts
📊 行数:~535
⭐ 难度:★★★★☆
🔗 依赖:agents/defaults, config/types

学习要点:

  • 函数式管道:8 个 apply*Defaults 函数串联执行,每个返回新对象(不可变)
  • 模型别名系统opusanthropic/claude-opus-4-6gptopenai/gpt-5.2
  • 依赖顺序:某些默认值依赖其他默认值(如认证模式影响缓存策略)

管道执行顺序:

原始配置
  → applyMessageDefaults()       // 消息确认 Emoji
  → applySessionDefaults()       // session.mainKey = "main"
  → applyModelDefaults()         // 模型参数填充(最复杂)
  → applyAgentDefaults()         // 并发限制
  → applyLoggingDefaults()       // redactSensitive = "tools"
  → applyContextPruningDefaults() // 缓存 TTL
  → applyCompactionDefaults()    // compaction mode
  → applyTalkConfigNormalization() // Talk 配置标准化
→ 最终配置

重点精读 applyModelDefaults() 这是最复杂的默认值函数,涉及 provider API 推断、模型参数填充、缓存策略等。

![配置系统:读取管道 12 步流水线](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/05-infographic-config-pipeline-1775150611147.png)

Day 9:配置验证与 Schema(难度 ★★★★☆)

9.1 src/config/zod-schema.ts — Zod Schema 定义

📂 文件:src/config/zod-schema.ts
📊 行数:~大文件
⭐ 难度:★★★☆☆

学习要点:

  • 使用 Zod 定义严格的配置 schema(.strict() 模式)
  • 覆盖约 30+ 个顶层配置域
  • 是配置验证和 JSON Schema 生成的基础

9.2 src/config/schema.ts — JSON Schema 动态生成

📂 文件:src/config/schema.ts
📊 行数:~414
⭐ 难度:★★★★☆
🔗 依赖:zod-schema, channels/registry

学习要点:

  • Zod → JSON Schema 转换:从 Zod schema 生成 JSON Schema Draft-07
  • 插件 Schema 合并:运行时动态将插件的 configSchema 合并到主 schema
  • UI Hints:为 Control UI 表单渲染生成提示信息
  • LRU 缓存:避免重复计算(64 条上限)

Day 10:配置 I/O — 最复杂的配置模块(难度 ★★★★★)

10.1 src/config/io.ts — 配置读写核心

📂 文件:src/config/io.ts
📊 行数:~1399(全项目最大的单文件之一)
⭐ 难度:★★★★★
🔗 依赖:几乎所有 config 子模块

⚠️ 这是整个配置系统最核心、最复杂的文件。建议分三个阶段阅读。

阶段 A:理解加载管道(loadConfig

dotenv 加载
  → JSON5 解析
  → $include 引用解析
  → ${ENV_VAR} 环境变量替换
  → 重复 agent 目录检测
  → Zod 验证
  → 默认值管道(8 个 apply 函数)
  → 路径规范化
  → config.env 应用
  → shell env 回退
  → owner display secret 自动生成
  → 运行时覆盖

阶段 B:理解写入机制(writeConfigFile

Merge patch(只写差异)
  → 验证
  → ${VAR} 环境变量引用恢复(防止密钥写入磁盘)
  → unsetPaths 处理
  → 版本戳记
  → 原子写(tmp → rename)
  → 备份轮换
  → 审计日志

阶段 C:理解缓存和审计

  • 200ms TTL 缓存避免频繁读磁盘
  • 每次写入记录审计日志(pid、hash diff、异常检测)

关键设计亮点:

环境变量引用保护:写入时自动将已解析的密钥(如 "sk-ant-xxx")恢复为 "${ANTHROPIC_API_KEY}"防止将敏感值写入磁盘

✅ Phase 3 检查点

  • [ ] 能画出 OpenClawConfig 的关键字段结构
  • [ ] 理解配置路径解析的优先级链
  • [ ] 能描述默认值管道的执行顺序
  • [ ] 理解 loadConfig 的完整加载流水线
  • [ ] 知道写入时如何保护环境变量引用
  • [ ] 理解为什么需要原子写和备份轮换

Phase 4:CLI 入口系统 — 项目的"前门"(第 11-13 天)

🎯 目标:理解用户输入 openclaw 命令后发生了什么

Day 11:入口文件(难度 ★★★★☆)

11.1 src/entry.ts — CLI 主入口

📂 文件:src/entry.ts
📊 行数:~200
⭐ 难度:★★★★☆
🔗 依赖:infra/env, runtime, cli/run-main

完整启动流程:

openclaw.mjs (npm bin 入口脚本)


src/entry.ts

    ├─ 设置进程标题 "openclaw"
    ├─ normalizeEnv() — 环境变量规范化
    ├─ enableCompileCache() — 启用 Node.js 22+ 编译缓存
    ├─ 检查是否需要抑制实验性警告
    │   └─ 如果需要 → spawn 子进程 + --disable-warning=ExperimentalWarning
    ├─ 快路径:--version → 直接输出,不加载 CLI 框架
    ├─ 快路径:--help → 直接输出帮助
    ├─ 解析 --profile 参数

    └─ import("./cli/run-main.js") → runCli()

关键设计:

  • Respawn 机制:最有趣的设计。当前进程检测到未抑制实验性警告时,spawn 一个带正确标志的子进程,然后退出自己
  • 快路径优化--version--help 不需要加载完整 CLI 框架,毫秒级响应
  • isMainModule 守卫:防止被 import 时意外执行 CLI 逻辑

11.2 src/index.ts — 库/SDK 入口

📂 文件:src/index.ts
📊 行数:~100
⭐ 难度:★★★☆☆

学习要点:

  • 双模式入口:既是可执行脚本(isMain 守卫下 parseAsync),又是可导入的模块库
  • Barrel 导出:统一导出项目的公共 API
  • 启动序列编排loadDotEnv → normalizeEnv → ensureOpenClawCliOnPath → enableConsoleCapture → assertSupportedRuntime

区别 entry.ts 和 index.ts:

维度entry.tsindex.ts
用途CLI 入口(用户直接运行)SDK 入口(被其他代码 import)
特殊处理respawn、快路径、profiledotenv 加载、runtime 断言
导出无(纯 side-effect)大量类型和函数 re-export

![CLI 入口系统:启动路径与分叉逻辑](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/06-infographic-cli-entry-flow-1775150612218.png)

Day 12:CLI 框架(难度 ★★★☆☆)

12.1 src/cli/run-main.ts — CLI 主运行逻辑

📂 文件:src/cli/run-main.ts
📊 行数:~200
⭐ 难度:★★★☆☆
🔗 依赖:program.ts, route.ts

学习要点:

  • 命令路由快路径tryRouteCli 直接路由已知命令,避免完整 Commander 解析
  • 懒加载命令注册:只加载当前需要的命令模块
  • 插件命令:非内置命令时动态加载插件 CLI
  • 全局错误兜底uncaughtException 和 unhandled rejection 处理

12.2 src/cli/program/build-program.ts — 程序构建

📂 文件:src/cli/program/build-program.ts
📊 行数:~150
⭐ 难度:★★★☆☆

学习要点:

  • Commander.js 的 Command 构建模式
  • 上下文对象注入(createProgramContext
  • preAction 钩子(每个命令执行前的通用逻辑)

Day 13:跟踪一个命令的完整执行路径

练习:跟踪 openclaw status 命令

  1. entry.ts 开始
  2. run-main.tsrunCli()
  3. tryRouteCli() 尝试快路径
  4. buildProgram() 构建 Commander 程序
  5. → 注册 status 命令
  6. → 执行 status 命令处理函数

找到 src/commands/status.ts,阅读其实现。

✅ Phase 4 检查点

  • [ ] 能画出从 openclaw status 到实际执行的完整调用链
  • [ ] 理解 respawn 机制的目的和实现
  • [ ] 知道 entry.ts 和 index.ts 的区别
  • [ ] 理解命令懒加载的性能优化策略

Phase 5:Gateway 网关 — 项目的"心脏"(第 14-19 天)

🎯 目标:理解 Gateway 服务器的启动、认证、消息路由

Day 14-15:Gateway 服务器启动(难度 ★★★★☆)

15.1 src/gateway/server.impl.ts — 服务器核心实现

📂 文件:src/gateway/server.impl.ts
📊 行数:~994
⭐ 难度:★★★★☆
🔗 依赖:express, ws, auth, config, plugins, channels

这是整个 Gateway 的启动编排文件。 阅读建议:

第一遍:只读 startGatewayServer() 的骨架

创建 Express 应用
  → 配置 TLS/HTTPS
  → 初始化 WebSocket 服务器
  → 加载插件
  → 注册渠道
  → 启动认证中间件
  → 初始化节点注册表
  → 设置 Cron 任务
  → 启动健康监控
  → 绑定端口
  → 返回 GatewayServer 实例

第二遍:关注 WebSocket 握手流程

第三遍:关注插件和渠道的注册编排

Day 16:Gateway 认证(难度 ★★★★☆)

16.1 src/gateway/auth.ts — 认证系统

📂 文件:src/gateway/auth.ts
📊 行数:~487
⭐ 难度:★★★★☆
🔗 依赖:config, infra/tailscale, security/secret-equal

四种认证模式:

模式适用场景安全级别
none仅本地回环最低
tokenAPI 集成
passwordFunnel/远程访问中高
trusted-proxy反向代理后取决于代理配置

认证流程(按优先级):

请求到达
  → [trusted-proxy?] 验证来源 IP + 代理头部 + 用户头部
  → [none?] 直接放行
  → 速率限制检查(防暴力破解)
  → [Tailscale?] 验证 Tailscale whois 身份
  → [token?] safeEqualSecret 安全比较 token
  → [password?] safeEqualSecret 安全比较密码
  → 返回 GatewayAuthResult

学习要点:

  • 时序安全比较safeEqualSecret 防止时序攻击(timing attack)
  • 速率限制:防止暴力破解
  • 代理信任模型:为什么需要验证来源 IP

![Gateway 网关:启动编排与认证模式](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/07-infographic-gateway-architecture-1775150612926.png)

Day 17:Gateway 客户端(难度 ★★★★☆)

17.1 src/gateway/client.ts — WebSocket 客户端

📂 文件:src/gateway/client.ts
📊 行数:~526
⭐ 难度:★★★★☆
🔗 依赖:ws, device-identity, device-auth-store, protocol

学习要点:

  • Challenge-Response 握手:服务端发送 challenge nonce,客户端用设备密钥签名
  • TLS 指纹校验:防止中间人攻击
  • 心跳监控startTickWatch 定时检测连接活性
  • 指数退避重连:断线后 1s → 2s → 4s → ... → 30s 自动重连
  • 安全约束:禁止明文 ws:// 到非 loopback 地址(CWE-319, CVSS 9.8)

关键方法阅读顺序:

  1. start() → 理解安全检查
  2. sendConnect() → 理解握手流程
  3. handleMessage() → 理解消息分发
  4. scheduleReconnect() → 理解重连策略
  5. request() → 理解 RPC 请求/响应

Day 18:Gateway 协议与事件(难度 ★★★☆☆)

18.1 浏览 src/gateway/protocol/ 目录

理解 Gateway 的 RPC 协议设计:

  • 消息帧格式(请求帧、响应帧、事件帧)
  • 方法注册(server-methods-list.ts
  • 序列号和 gap 检测

18.2 src/gateway/boot.ts — 引导启动

📂 文件:src/gateway/boot.ts
📊 行数:~203
⭐ 难度:★★★☆☆

学习要点:

  • BOOT.md 机制:Gateway 启动时执行一次性引导指令
  • Session 快照/恢复:隔离引导 session,避免污染主会话

Day 19:动手实验 — 启动 Gateway

bash
# 在没有完整配置的情况下尝试启动(观察错误信息)
pnpm openclaw gateway run --verbose

# 查看 Gateway 相关测试
find src/gateway -name "*.test.ts" -type f

运行 Gateway 相关测试:

bash
pnpm test:gateway

✅ Phase 5 检查点

  • [ ] 能描述 Gateway 服务器的启动编排流程
  • [ ] 理解四种认证模式的区别和适用场景
  • [ ] 能解释 Challenge-Response 握手流程
  • [ ] 理解为什么禁止非 loopback 的明文 WebSocket
  • [ ] 知道 BOOT.md 的作用

Phase 6:Channel 渠道系统 — 项目的"手脚"(第 20-24 天)

🎯 目标:理解消息如何在各个聊天平台和 AI 之间流转

Day 20:渠道抽象层(难度 ★★☆☆☆ ~ ★★★★☆)

20.1 src/channels/typing.ts — 最简单的渠道组件

📂 文件:src/channels/typing.ts
📊 行数:~99
⭐ 难度:★★☆☆☆

这是入门渠道系统的最佳文件。 它管理"正在输入..."指示器的生命周期。

学习要点:

  • 状态机设计:closed / stopSent 布尔标志控制状态
  • 熔断器模式:连续失败 N 次后自动停止
  • 安全 TTL:60 秒后自动清理
  • 返回 { onReplyStart, onIdle, onCleanup } 生命周期接口

20.2 src/channels/dock.ts — 渠道元数据停泊层

📂 文件:src/channels/dock.ts
📊 行数:~620
⭐ 难度:★★★★☆

学习要点:

  • ChannelDock 类型:每个渠道的元数据容器(capabilities、config、groups、mentions、streaming 等)
  • 内建渠道注册表:8 个核心渠道的硬编码元数据
  • 插件渠道融合listChannelDocks() 将核心渠道与插件渠道合并
  • 适配器模式:每个渠道通过不同的 adapter 适配统一接口

Day 21-22:阅读一个具体渠道的实现

推荐从 Telegram 渠道开始(相对简单,API 设计清晰):

21.1 探索 Telegram 渠道相关文件

bash
# 查找 Telegram 相关文件
find src -name "*telegram*" -type f | head -20

阅读顺序建议:

  1. 配置类型:src/config/types.telegram.ts
  2. 渠道实现入口
  3. 消息处理逻辑
  4. 媒体处理

21.2 跟踪一条消息的完整路径

练习:画出一条 Telegram 消息的完整生命周期

Telegram 用户发送 "Hello"

Telegram Bot API 推送 webhook / 长轮询

Telegram 渠道适配器接收消息

标准化为内部消息格式

路由到 Gateway

Gateway 路由到正确的 Agent 会话

Agent 调用 AI 模型生成回复

回复发送到 Gateway

Gateway 路由到 Telegram 渠道

Telegram 渠道适配器格式化消息

调用 Telegram Bot API 发送回复

用户收到 AI 的回复

![Channel 渠道系统:消息完整生命周期](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/08-infographic-message-lifecycle-1775150613656.png)

Day 23-24:DM 配对与安全(难度 ★★★☆☆)

23.1 DM 安全策略

探索 DM 配对机制:

bash
grep -r "pairing" src/channels/ --include="*.ts" -l

学习要点:

  • 默认行为:未知发送者收到配对码
  • 配对审批:管理员通过 CLI 批准
  • 白名单:allowFrom 配置控制
  • 群组策略:groups.dmPolicy 控制群组消息处理

✅ Phase 6 检查点

  • [ ] 能解释 ChannelDock 的作用
  • [ ] 能画出一条消息从发送到回复的完整路径
  • [ ] 理解 DM 配对机制的安全设计
  • [ ] 知道内建渠道和插件渠道如何融合

Phase 7:插件系统 — 项目的"生态"(第 25-28 天)

🎯 目标:理解插件如何被发现、加载、注册,以及如何开发插件

Day 25:插件类型系统(难度 ★★★★★)

25.1 src/plugins/types.ts — 插件类型契约

📂 文件:src/plugins/types.ts
📊 行数:~786
⭐ 难度:★★★★★

这是理解整个插件系统的基石。 定义了所有插件可以注册的能力和事件。

重点阅读:

  1. OpenClawPluginApi — 插件与核心交互的 API
typescript
interface OpenClawPluginApi {
  registerTool(...)      // 注册 Agent 工具
  registerHook(...)      // 注册生命周期钩子
  registerChannel(...)   // 注册消息渠道
  registerProvider(...)  // 注册 AI 模型提供商
  registerCommand(...)   // 注册聊天命令
  registerService(...)   // 注册后台服务
  registerCli(...)       // 注册 CLI 子命令
  registerHttpRoute(...) // 注册 HTTP 路由
  registerGatewayMethod(...) // 注册 Gateway RPC 方法
  on(hookName, handler)  // 监听类型安全的钩子事件
}
  1. PluginHookName — 24 种生命周期钩子
钩子分类钩子名称说明
Agent 生命周期before_agent_startAgent 启动前
llm_inputLLM 输入前处理
llm_outputLLM 输出后处理
agent_endAgent 结束
消息生命周期message_received收到消息
message_sending发送消息前
message_sent消息已发送
工具调用before_tool_call工具调用前
after_tool_call工具调用后
会话管理session_start会话开始
session_end会话结束
子 Agentsubagent_spawning子 Agent 创建中
subagent_spawned子 Agent 已创建
subagent_ended子 Agent 结束
网关gateway_startGateway 启动
gateway_stopGateway 停止

Day 26:插件注册中心(难度 ★★★★☆)

26.1 src/plugins/registry.ts — 插件注册表

📂 文件:src/plugins/registry.ts
📊 行数:~547
⭐ 难度:★★★★☆

学习要点:

  • PluginRegistry 类型:聚合了 plugins、tools、hooks、channels、providers、httpRoutes 等所有已注册能力
  • createPluginRegistry() — 工厂函数,返回 registry 实例
  • createApi() — 为每个插件创建隔离的 API 对象(闭包绑定)
  • 冲突检测:gateway method、http route、provider 注册的重复检测

26.2 src/plugins/runtime.ts — 全局单例

📂 文件:src/plugins/runtime.ts
📊 行数:~48
⭐ 难度:★☆☆☆☆

学习要点:

  • Symbol.for("openclaw.pluginRegistryState") — 跨模块共享单例
  • 版本追踪:每次 set 时递增 state.version
  • 这是全局状态管理的极简范例

Day 27:插件加载引擎(难度 ★★★★★)

27.1 src/plugins/loader.ts — 发现、加载、注册

📂 文件:src/plugins/loader.ts
📊 行数:~703
⭐ 难度:★★★★★

完整加载流水线:

loadOpenClawPlugins()

    ├─ 1. 配置标准化(读取已启用的插件列表)
    ├─ 2. 缓存检查(避免重复加载)
    ├─ 3. 创建 PluginRegistry
    ├─ 4. 发现插件(扫描 extensions/ 目录 + npm 包)
    ├─ 5. 加载 openclaw.plugin.json(manifest)
    ├─ 6. 安全溯源(provenance tracking)
    ├─ 7. Jiti 动态加载 TypeScript 入口文件
    ├─ 8. 验证 configSchema
    ├─ 9. 调用 plugin.register(api) — 插件执行注册
    └─ 10. 激活注册表

关键设计:

  • Jiti 运行时:通过 jiti 动态加载未编译的 TypeScript 插件文件
  • 别名映射"openclaw/plugin-sdk" 映射到本地 SDK 路径
  • 安全溯源:追踪每个插件的来源,对未跟踪的插件发出警告
  • 边界检查:确保插件入口文件不逃逸出插件根目录

![插件系统:10 步加载流水线与 API 注册能力](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/09-infographic-plugin-system-1775150614614.png)

Day 28:学习一个真实插件 — IRC 扩展

28.1 extensions/irc/ — 完整的渠道插件示例

📂 目录:extensions/irc/
📊 关键文件:index.ts (~17行), src/channel.ts (~364行)
⭐ 难度:★★★☆☆

这是学习"如何开发 OpenClaw 插件"的最佳范例。

入口文件 index.ts

typescript
const plugin = {
  id: "irc",
  name: "IRC",
  description: "IRC channel plugin",
  configSchema: emptyPluginConfigSchema(),
  register(api: OpenClawPluginApi) {
    setIrcRuntime(api.runtime);
    api.registerChannel({ plugin: ircPlugin as ChannelPlugin });
  },
};
export default plugin;

渠道实现 src/channel.ts 实现了完整的 ChannelPlugin 接口:

适配器功能
config账号管理、allowFrom 解析
securityDM 策略、安全警告
groups群组 mention 和工具策略
messaging消息标准化和 ID 识别
resolver目标解析(peer/group)
directory列出 peers 和 groups
outbound发送文本/媒体,消息分块(350 字符限制)
status健康检查和 probe
gateway启动 IRC 连接监控
onboardingCLI 引导设置
pairing设备配对

练习:尝试创建一个最小插件

typescript
// my-plugin/index.ts
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";

const plugin = {
  id: "my-hello-plugin",
  name: "Hello Plugin",
  description: "A minimal example plugin",
  configSchema: emptyPluginConfigSchema(),
  register(api: OpenClawPluginApi) {
    api.registerHook("message_received", async (event) => {
      console.log(`Received message: ${event.text}`);
    });
  },
};

export default plugin;

✅ Phase 7 检查点

  • [ ] 能列出 OpenClawPluginApi 提供的主要注册方法
  • [ ] 能描述插件加载的 10 步流水线
  • [ ] 理解 Jiti 动态加载的目的
  • [ ] 读完了 IRC 插件的完整实现
  • [ ] 能写出一个最小的 Hello World 插件

Phase 8:Agent 智能体系统 — 项目的"灵魂"(第 29-33 天)

🎯 目标:理解 AI Agent 如何运行、如何管理会话、如何调用工具

Day 29:Agent 基础(难度 ★★☆☆☆ ~ ★★★☆☆)

29.1 src/agents/defaults.ts — Agent 默认值

📂 文件:src/agents/defaults.ts
📊 行数:~6
⭐ 难度:★☆☆☆☆
typescript
export const DEFAULT_PROVIDER = "anthropic";
export const DEFAULT_MODEL = "claude-opus-4-6";
export const DEFAULT_CONTEXT_TOKENS = 200_000;

29.2 src/agents/context.ts — 上下文窗口管理

📂 文件:src/agents/context.ts
📊 行数:~190
⭐ 难度:★★★☆☆

学习要点:

  • 三层解析:pi-agent 注册表 → 用户配置覆盖 → Anthropic 1M 特殊处理
  • 懒加载 + 预热:异步预热缓存 + 同步查询
  • 指数退避重试:配置加载失败时的重试策略

29.3 src/agents/skills.ts + src/agents/skills/ — 技能系统

📂 文件:src/agents/skills.ts (入口) + skills/types.ts + skills/config.ts
⭐ 难度:★★★☆☆

技能资格评估维度:

  • 操作系统兼容性
  • 二进制依赖是否存在
  • 环境变量是否设置
  • 配置路径是否存在

Day 30-31:Agent 命令与运行时

30.1 探索 src/commands/agent.ts

这是 openclaw agent 命令的实现,也是理解 Agent 运行流程的关键。

bash
# 查看 Agent 命令实现
cat src/commands/agent.ts | head -50

关注点:

  • Agent 会话创建流程
  • 系统提示词(system prompt)构建
  • 工具注册
  • 流式响应处理

30.2 理解 Pi Agent 运行时

OpenClaw 使用 @mariozechner/pi-agent-core 作为 Agent 运行时。

关键概念:

  • 会话 (Session):独立的对话上下文
  • 工具 (Tools):Agent 可以调用的能力
  • 流式传输 (Streaming):逐 token 返回响应
  • 思考级别 (Thinking):off/minimal/low/medium/high/xhigh

Day 32:工具系统

32.1 探索 Agent 可用的工具

bash
# 查找工具定义
find src -path "*/tools/*" -name "*.ts" | head -20

内置工具分类:

类别工具功能
Browserbrowse, screenshot网页浏览和截图
Canvascanvas可视化工作区
Croncron_create, cron_list定时任务
Sessionssessions_list, sessions_send跨会话通信
ExecexecShell 命令执行
Skillsskill_invoke技能调用
Nodescamera, screen_record设备操作

Day 33:会话管理与路由

33.1 多会话模型

Gateway
    ├── main session          ← 直接 DM 对话
    ├── group/discord-123     ← Discord 群组会话
    ├── group/tg-456          ← Telegram 群组会话
    └── boot session          ← BOOT.md 引导(临时)

学习要点:

  • 每个会话有独立的上下文和工具访问权限
  • main 会话拥有完整的主机访问权限
  • 群组会话可配置沙箱模式
  • Agent 路由可以将不同渠道路由到不同的 Agent 实例

![Agent 智能体系统:多会话模型与内置工具](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/10-infographic-agent-sessions-1775150615465.png)

✅ Phase 8 检查点

  • [ ] 知道默认的 AI 模型是什么
  • [ ] 理解上下文窗口的三层解析机制
  • [ ] 了解技能系统的资格评估维度
  • [ ] 知道 Agent 有哪些内置工具
  • [ ] 理解多会话模型和 main/group 的区别

Phase 9:进阶模块(第 34-38 天)

🎯 目标:深入辅助系统,建立完整认知

![进阶模块:五大辅助系统全景](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/11-infographic-advanced-modules-1775150616561.png)

Day 34:媒体处理管道 (src/media/)

bash
ls src/media/

学习要点:

  • sharp — 图片压缩、格式转换、裁剪
  • opusscript — Opus 音频编码
  • node-edge-tts — 文本转语音
  • file-type — MIME 类型检测
  • pdfjs-dist — PDF 解析

Day 35:记忆系统 (src/memory/)

学习要点:

  • better-sqlite3 — SQLite 数据库
  • sqlite-vec — 向量相似度搜索扩展
  • MMR (Maximal Marginal Relevance) 算法
  • 混合检索:关键词 + 向量

Day 36:浏览器控制 (src/browser/)

学习要点:

  • playwright-core — 浏览器自动化
  • Chrome DevTools Protocol (CDP)
  • 页面快照和 DOM 操作
  • 浏览器 Profile 隔离

Day 37:安全系统 (src/security/)

学习要点:

  • safeEqualSecret — 时序安全比较
  • SSRF 防护 (src/infra/net/ssrf.ts)
  • 设备身份和密钥管理
  • 凭证存储(~/.openclaw/credentials/

Day 38:Cron 定时任务 (src/cron/)

学习要点:

  • croner — cron 表达式解析
  • 任务持久化存储
  • 执行日志追踪
  • 错峰执行 (stagger)

Phase 10:实战项目(第 39-42 天)

🎯 目标:通过实际动手巩固所学

Project 1:为 IRC 插件添加一个新功能(Day 39)

任务: 为 IRC 插件添加"自动欢迎新用户"功能

  1. 阅读 extensions/irc/src/channel.tsgateway 适配器
  2. 理解 IRC 连接监控机制
  3. 添加 JOIN 事件监听
  4. 发送欢迎消息

Project 2:写一个自定义 Hook 插件(Day 40)

任务: 写一个插件,在每条消息发送前添加自定义签名

typescript
const plugin = {
  id: "signature-plugin",
  name: "Message Signature",
  register(api: OpenClawPluginApi) {
    api.registerHook("message_sending", async (event) => {
      event.text += "\n\n— Sent via OpenClaw";
      return event;
    });
  },
};

Project 3:为配置系统添加自定义验证规则(Day 41)

任务:config/validation.ts 中添加一条验证规则

Project 4:写一篇技术博客(Day 42)

任务: 将你的学习心得整理成一篇博客,包含:

  1. OpenClaw 架构总览
  2. 你最欣赏的设计决策
  3. 你认为可以改进的地方
  4. 写插件的教程

附录 A:核心文件难度速查表

难度文件行数建议用时
★☆☆☆☆logging/levels.ts~5015 分钟
★☆☆☆☆agents/defaults.ts~62 分钟
★☆☆☆☆plugins/runtime.ts~4815 分钟
★☆☆☆☆gateway/events.ts~75 分钟
★☆☆☆☆gateway/server.ts (桶文件)~32 分钟
★☆☆☆☆extensionAPI.ts~145 分钟
★★☆☆☆infra/env.ts~12030 分钟
★★☆☆☆runtime.ts~8030 分钟
★★☆☆☆channels/typing.ts~9930 分钟
★★☆☆☆config/types.ts (桶文件)~3520 分钟
★★☆☆☆config/config.ts (桶文件)~2210 分钟
★★☆☆☆plugin-sdk/index.ts~69045 分钟 (当目录)
★★★☆☆infra/errors.ts~20045 分钟
★★★☆☆infra/retry.ts~15045 分钟
★★★☆☆infra/fetch.ts~12045 分钟
★★★☆☆config/paths.ts~2841 小时
★★★☆☆gateway/boot.ts~20345 分钟
★★★☆☆cli/program/build-program.ts~15045 分钟
★★★☆☆cli/run-main.ts~2001 小时
★★★☆☆agents/context.ts~1901 小时
★★★☆☆agents/skills.ts~模块1 小时
★★★☆☆plugins/install.ts~5721.5 小时
★★★☆☆extensions/irc/~3811.5 小时
★★★★☆entry.ts~2001.5 小时
★★★★☆logging/logger.ts~3001.5 小时
★★★★☆config/defaults.ts~5352 小时
★★★★☆config/schema.ts~4142 小时
★★★★☆gateway/auth.ts~4872 小时
★★★★☆gateway/client.ts~5262 小时
★★★★☆channels/dock.ts~6202 小时
★★★★☆plugins/registry.ts~5472 小时
★★★★★infra/fs-safe.ts~4003 小时
★★★★★plugins/types.ts~7863 小时
★★★★★plugins/loader.ts~7033 小时
★★★★★gateway/server.impl.ts~9944 小时
★★★★★config/io.ts~13995 小时

附录 B:模块依赖关系图

![模块依赖关系:分层架构全景图](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/12-infographic-module-dependencies-1775150617513.png)

                    ┌─────────────────────────────────────────┐
                    │              entry.ts                     │
                    │         (CLI 主入口)                      │
                    └───────────────┬─────────────────────────┘

                    ┌───────────────▼─────────────────────────┐
                    │           cli/run-main.ts                 │
                    │    (CLI 路由 & 命令分发)                   │
                    └───────┬───────┬─────────────────────────┘
                            │       │
              ┌─────────────▼─┐   ┌─▼──────────────────────┐
              │ cli/program.ts │   │  commands/*             │
              │ (Commander.js) │   │  (各子命令实现)          │
              └───────────────┘   └────────┬───────────────┘

                    ┌───────────────────────▼──────────────────┐
                    │         gateway/server.impl.ts            │
                    │         (Gateway 网关核心)                 │
                    └──┬──────┬──────┬──────┬────────────────┘
                       │      │      │      │
          ┌────────────▼┐  ┌──▼──┐ ┌─▼──┐ ┌─▼──────────────┐
          │gateway/auth │  │ ws  │ │TLS │ │plugins/loader  │
          │  (认证)     │  │     │ │    │ │  (插件加载)    │
          └─────────────┘  └─────┘ └────┘ └──┬─────────────┘

                    ┌──────────────────────────▼───────────────┐
                    │          plugins/registry.ts              │
                    │          (插件注册中心)                    │
                    └──────┬──────┬──────┬────────────────────┘
                           │      │      │
              ┌────────────▼┐ ┌───▼──┐ ┌─▼──────────────────┐
              │  channels/  │ │hooks │ │  tools / providers │
              │  (渠道层)   │ │      │ │  (工具 / AI提供商) │
              └──────┬──────┘ └──────┘ └────────────────────┘

    ┌────────────────▼─────────────────────────────────────────┐
    │    WhatsApp │ Telegram │ Discord │ Slack │ Signal │ ...  │
    │                    (具体渠道实现)                         │
    └──────────────────────────────────────────────────────────┘

                    ═══════════════════════════════════════════
                              基础设施层(被所有上层依赖)
                    ═══════════════════════════════════════════

    ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐
    │config/*  │ │logging/* │ │ infra/*  │ │  runtime.ts  │
    │(配置系统)│ │(日志系统)│ │(基础工具)│ │ (运行时抽象) │
    └──────────┘ └──────────┘ └──────────┘ └──────────────┘

附录 C:推荐阅读顺序清单

按照从简到难、从底层到顶层的顺序排列:

第一梯队:热身(1-2 天可读完)

  1. src/agents/defaults.ts — 6 行常量
  2. src/logging/levels.ts — 日志级别(TypeScript 技巧)
  3. src/plugins/runtime.ts — 全局单例(48 行)
  4. src/gateway/events.ts — 事件常量(7 行)
  5. src/extensionAPI.ts — re-export(14 行)
  6. src/channels/typing.ts — 打字指示器(99 行)

第二梯队:基础设施(3-4 天)

  1. src/infra/env.ts — 环境变量
  2. src/runtime.ts — 运行时抽象
  3. src/infra/errors.ts — 错误处理
  4. src/infra/retry.ts — 重试策略
  5. src/infra/fetch.ts — Fetch 包装

第三梯队:配置与 CLI(3-4 天)

  1. src/config/types.openclaw.ts — 根配置类型
  2. src/config/paths.ts — 路径解析
  3. src/config/defaults.ts — 默认值管道
  4. src/cli/program/build-program.ts — CLI 构建
  5. src/cli/run-main.ts — CLI 主逻辑
  6. src/entry.ts — 应用入口

第四梯队:核心系统(5-6 天)

  1. src/logging/logger.ts — 日志系统
  2. src/config/schema.ts — JSON Schema 生成
  3. src/config/io.ts — 配置 I/O(最复杂)
  4. src/gateway/auth.ts — 认证
  5. src/gateway/client.ts — WS 客户端
  6. src/gateway/boot.ts — 引导启动

第五梯队:插件与渠道(5-6 天)

  1. src/plugin-sdk/index.ts — 插件 SDK 表面
  2. src/plugins/types.ts — 插件类型契约
  3. src/plugins/registry.ts — 注册中心
  4. src/plugins/loader.ts — 加载引擎
  5. src/plugins/install.ts — 安装系统
  6. src/channels/dock.ts — 渠道停泊层
  7. extensions/irc/ — IRC 插件实例

第六梯队:深度系统(按兴趣选读)

  1. src/infra/fs-safe.ts — 安全文件操作
  2. src/gateway/server.impl.ts — Gateway 完整实现
  3. src/agents/context.ts — 上下文窗口
  4. src/agents/skills.ts — 技能系统
  5. src/memory/ — 记忆系统
  6. src/browser/ — 浏览器控制
  7. src/media/ — 媒体处理

附录 D:关键设计模式索引

在阅读源码时,你会反复遇到以下设计模式。提前了解它们会大大加速理解。

设计模式出现位置说明
适配器 (Adapter)channels/dock.ts, logging/logger.ts统一不同渠道/库的接口
工厂 (Factory)plugins/registry.ts, config/io.tscreatePluginRegistry(), createConfigIO()
单例 (Singleton)plugins/runtime.ts, logging/logger.tsSymbol.for 全局注册, 懒加载缓存
策略 (Strategy)channels/dock.ts, gateway/auth.ts不同渠道/认证模式的不同实现
装饰器 (Decorator)infra/fetch.tswrapFetchWithAbortSignal 增强原始 fetch
管道 (Pipeline)config/defaults.ts, config/io.ts函数式管道串联处理
Barrel/Facadeconfig/config.ts, plugin-sdk/index.ts统一导出入口
依赖注入 (DI)runtime.ts, config/io.ts运行时抽象, ConfigIoDeps
熔断器 (Circuit Breaker)channels/typing.ts连续失败后自动停止
指数退避 (Exp. Backoff)infra/retry.ts, gateway/client.ts重试和重连策略
观察者/事件总线plugins/types.ts (Hooks)24 种类型安全的生命周期钩子
注册表 (Registry)plugins/registry.ts, channels/dock.ts动态注册能力
原子操作infra/fs-safe.ts, config/io.ts文件写入的原子性保证
深度防御infra/fs-safe.ts, gateway/auth.ts多层安全检查

![关键设计模式索引:14 种模式分类总览](https://qn.huat.xyz/blog/article-Illustration/OpenClaw 源码学习路线规划/13-infographic-design-patterns-1775150618711.png)


📌 最后的建议:不要试图一次读完所有代码。按照这份路线图,每天专注 1-2 个文件,用"先读导出、再读依赖、最后深入实现"的方法稳步推进。遇到不理解的地方是正常的——标记下来,继续前进,回头再看往往会豁然开朗。

祝学习愉快!🚀

读文档、看源码、写代码,理解 AI Agent 本质 🤖