🚀 Gateway 启动流程

entry.ts 是 CLI 入口,依次完成 Compile Cache 预热、respawn 检查、插件加载、WebSocket 服务启动,最后激活所有已配置渠道的监听器。

flowchart TD A([🦞 openclaw onboard --install-daemon]) --> B[entry.ts: process.title = openclaw] B --> C[enableOpenClawCompileCache\n编译缓存预热] C --> D{buildCliRespawnPlan\n需要 Respawn?} D -->|是| E[重新启动进程\n应用环境变量] D -->|否| F[runCli: 解析 argv] E --> F F --> G[加载 ~/.openclaw/openclaw.json\n解析配置] G --> H[初始化 Plugin Registry\n加载 extensions/ 插件] H --> I[启动 WebSocket Server\nlocalhost:18789] I --> J[加载工作区文件\nSOUL.md / MEMORY.md / AGENTS.md] J --> K[激活渠道监听器\nSlack / Telegram / Discord…] K --> L[启动 Cron 任务调度器\n定时/主动执行] L --> M[启动性能追踪\nOPENCLAW_GATEWAY_STARTUP_TRACE] M --> N([✅ Gateway Ready — 等待消息]) style A fill:#1a0a0a,stroke:#dc2626,color:#f87171 style N fill:#0d1a0d,stroke:#22c55e,color:#86efac style D fill:#1a1030,stroke:#a855f7,color:#d8b4fe

💬 消息处理全链路流程

消息从任一渠道进入 Gateway,经过 Auth 验证、Allowlist 检查、路由决策,最终到达对应 Agent 的推理循环,回复通过原渠道发回。

flowchart TD IN([📨 消息抵达\nSlack / Telegram / WhatsApp / …]) --> TRANSPORT[渠道 Transport 接收\nPlugin 解析消息格式] TRANSPORT --> INBOUND[Inbound Event 处理\n统一消息结构] INBOUND --> AUTH{Auth 检查\n发送者已知?} AUTH -->|未知发送者| PAIR[发送配对码\n等待审批] PAIR -->|审批通过| ALLOW PAIR -->|拒绝/超时| DROP[丢弃消息] AUTH -->|已知/已配对| ALLOW[Allowlist 检查\n是否有权发消息?] ALLOW -->|拒绝| DENY[忽略消息] ALLOW -->|通过| ROUTE[Routing: resolve-route\n确定目标 Agent] ROUTE --> SESSION{Session Key\n会话存在?} SESSION -->|新会话| SPAWN[Spawn Agent\n加载 Workspace Context] SESSION -->|已有会话| EXISTING[复用现有 Agent Session] SPAWN & EXISTING --> AGENT_LOOP[进入 Agent 推理循环] AGENT_LOOP --> RESPONSE[生成回复] RESPONSE --> SEND[通过原渠道发回\nTransport.send] SEND --> MEMORY_WRITE[追加到今日日志\nYYYY-MM-DD.md] MEMORY_WRITE --> DONE([✅ 消息处理完成]) style IN fill:#0d1220,stroke:#3b82f6,color:#93c5fd style DONE fill:#0d1a0d,stroke:#22c55e,color:#86efac style AUTH fill:#1a1030,stroke:#a855f7,color:#d8b4fe style SESSION fill:#1a1030,stroke:#a855f7,color:#d8b4fe style DROP fill:#1a0808,stroke:#6b7280,color:#9ca3af style DENY fill:#1a0808,stroke:#6b7280,color:#9ca3af

🤖 Agent 推理循环(ReAct Loop)

OpenClaw 的 Agent 实现标准的 ReAct 模式:读取记忆上下文 → 调用 LLM(流式)→ 解析工具调用 → 执行 → 结果回传,直到 LLM 输出最终答案。

flowchart TD START([收到用户消息]) --> CONTEXT[构建上下文\n加载 SOUL.md + MEMORY.md\n昨日 + 今日日志] CONTEXT --> SKILL_INJ[注入 Skills\nSKILL.md 文件描述可用能力] SKILL_INJ --> PROMPT[构建 System Prompt\n人格 + 记忆 + 工具列表] PROMPT --> LLM[调用 LLM Provider\n流式输出] LLM --> PARSE{解析 LLM 输出} PARSE -->|text delta| STREAM[流式推送\n实时回复用户] STREAM --> PARSE PARSE -->|tool_use| TOOL_REQ[工具调用请求\n解析 tool_name + args] TOOL_REQ --> APPROVAL{需要用户审批?} APPROVAL -->|危险操作\n/ 群组沙箱| ASK_USER[向用户请求审批\n等待确认] ASK_USER -->|批准| EXEC ASK_USER -->|拒绝| CANCEL[取消工具调用\n告知 LLM] CANCEL --> LLM APPROVAL -->|主会话\n低风险| EXEC[执行工具\n见工具执行流程] EXEC --> RESULT[工具结果\n追加到上下文] RESULT --> LLM PARSE -->|thinking| THINK[内部推理\n/think level 控制深度] THINK --> PARSE PARSE -->|end_turn| FINAL[最终回复\n完整 response] FINAL --> APPEND[追加到日志文件\nappend-only YYYY-MM-DD.md] APPEND --> DONE([✅ 回复用户]) style START fill:#1a0a0a,stroke:#dc2626,color:#f87171 style DONE fill:#0d1a0d,stroke:#22c55e,color:#86efac style PARSE fill:#1a1030,stroke:#a855f7,color:#d8b4fe style APPROVAL fill:#1a1030,stroke:#a855f7,color:#d8b4fe

🔧 工具执行流程(三层扩展体系)

OpenClaw 的工具体系分三层:Tools(原子操作)→ Skills(Markdown 能力描述)→ Plugins(完整 npm 包)。执行时根据 Session 类型选择沙箱后端。

flowchart TD REQ([LLM 发出 tool_use 请求]) --> LOOKUP[Tool Registry 查找\ntool_name → 实现] LOOKUP --> SANDBOX{Session 类型\n/ 沙箱策略} SANDBOX -->|主会话 Host| HOST[直接在宿主机执行\n完全访问权限] SANDBOX -->|群组 / 多用户| DOCKER[Docker 沙箱\n隔离容器执行] SANDBOX -->|远程 SSH| SSH[SSH 沙箱\n远程服务器执行] SANDBOX -->|OpenShell| SHELL[OpenShell 沙箱\n受限 Shell] subgraph TOOL_TYPES[工具类型] T1[🖥️ Bash 执行\nbash-executor.ts\n支持审批工作流] T2[📁 文件操作\n读写/列举/搜索] T3[🌐 Web 工具\n搜索 + 抓取 + 浏览器] T4[📅 Schedule/Cron\n定时 / 主动执行] T5[🔌 MCP 工具\nModel Context Protocol] T6[🎬 媒体生成\n图像/视频/音乐] T7[💬 Channel 操作\n发送消息 / 管理会话] end HOST & DOCKER & SSH & SHELL --> TOOL_TYPES T1 & T2 & T3 & T4 & T5 & T6 & T7 --> RESULT[工具执行结果] RESULT --> SAFETY[安全检查\n输出过滤] SAFETY --> RETURN([返回结果给 LLM]) style REQ fill:#1a1030,stroke:#a855f7,color:#d8b4fe style RETURN fill:#0d1a0d,stroke:#22c55e,color:#86efac style SANDBOX fill:#1a1030,stroke:#a855f7,color:#d8b4fe
🦞
三层扩展体系:
Tools — 带类型的 TypeScript 函数,代表原子操作(文件 / API)
Skills — Markdown 文件描述能力和触发条件(~/.openclaw/workspace/skills/<skill>/SKILL.md
Plugins — 完整 npm 包,支持复杂逻辑和外部依赖

🧠 记忆读写流程

OpenClaw 使用极简的纯 Markdown 记忆系统,无向量数据库,无嵌入。所有记忆可 grep 审计,完全透明可读。

flowchart LR subgraph READ[读取阶段(构建上下文)] direction TB SOUL[SOUL.md\n人格 + 行为边界] AGENTS_MD[AGENTS.md\nAgent 配置说明] TOOLS_MD[TOOLS.md\n工具使用规则] MEMORY_MD[MEMORY.md\n精选长期记忆] YESTERDAY[昨日日志\nYYYY-MM-DD.md] TODAY[今日日志\nYYYY-MM-DD.md\n实时追加] end subgraph INJECT[注入到 System Prompt] CTX[完整上下文\n人格 + 记忆 + 今日历史] end subgraph WRITE[写入阶段(对话后)] direction TB APPEND[追加到今日日志\nappend-only] COMPACT[/compact 命令\n压缩历史] CURATE[用户/Agent 编辑\nMEMORY.md 精选内容] end READ --> INJECT --> LLM[LLM 推理] LLM --> WRITE COMPACT --> MEMORY_MD2[更新 MEMORY.md\n长期记忆] style LLM fill:#1a0a0a,stroke:#dc2626,color:#f87171
📖
设计哲学:「没有向量数据库,没有 Embeddings,纯 Markdown 文件。」工程师可以用 grep 直接审计记忆,理解 Agent 如何召回信息。
文件位置:~/.openclaw/workspace/

🔐 Auth 鉴权 & 设备配对流程

Gateway 实现两层鉴权:WebSocket 连接层(Token)和消息层(发送者配对)。群组场景下新成员需通过配对码审批。

sequenceDiagram participant Device as 新设备 / App participant GW as Gateway (WS :18789) participant Owner as 机器拥有者 Device->>GW: WebSocket connect GW->>GW: auth-token-resolution\n验证连接 Token alt Token 有效 GW-->>Device: ✅ 连接建立 else 无 Token / 无效 GW-->>Device: ❌ 拒绝连接 end Note over Device,GW: 消息层鉴权(auth_mode=pairing) Device->>GW: 发送消息(首次) GW->>GW: auth-resolve: 发送者未知 GW-->>Device: 发送配对码(6位) GW-->>Owner: 通知:有新设备请求配对 Owner->>GW: /approve 或 /deny alt 批准 GW->>GW: 将设备加入 Allowlist GW-->>Device: ✅ 配对成功,可以使用 else 拒绝 GW-->>Device: ❌ 配对被拒绝 end Note over Device,GW: auth_mode=open 时跳过配对直接通过

🔌 Plugin 生命周期状态机

所有扩展插件(extensions/ 目录)遵循相同的生命周期:Discover → Register → Activate → Running,支持热重载和健康监控。

stateDiagram-v2 [*] --> Discovered : Gateway 启动\n扫描 extensions/ Discovered --> Registered : 验证 plugin-package-contract\nManifest 格式合法 Registered --> Activating : Gateway 调用 activate()\n注入 plugin-sdk API Activating --> Active : activate() 成功\n能力注册到 Registry Activating --> Failed : activate() 抛出异常\n或超时 Active --> Running : 首次调用\n(渠道/工具/LLM) Running --> Active : 调用完成\n返回 Idle Active --> Deactivating : Config 热重载\n或 shutdown Deactivating --> [*] : cleanup() 完成\n资源释放 Failed --> Registered : 重试\n/doctor repair-flow note right of Active 能力已注册: - LLM Provider - 渠道 Transport - 工具函数 - 记忆后端 end note note right of Running 热路径传递: provider_id model_ref channel_id capability_family end note

🔄 Config 热重载流程

修改 openclaw.json 后,Gateway 无需重启即可应用新配置。通过 Diff + Plan + Apply 三步确保安全切换,最小化服务中断。

flowchart TD CHANGE([📝 openclaw.json 文件变更]) --> DETECT[config-reload.ts\n文件监听器触发] DETECT --> DIFF[config-diff.ts\n计算新旧配置差异] DIFF --> PLAN[config-reload-plan.ts\n生成重载计划\n确定影响范围] PLAN --> SETTINGS[config-reload-settings.ts\n验证新配置合法性\nJSON Schema 校验] SETTINGS --> VALID{配置有效?} VALID -->|无效| ERROR[记录错误\n保留旧配置\n告知用户] VALID -->|有效| APPLY[执行重载计划] APPLY --> CHAN_RELOAD{渠道配置变更?} CHAN_RELOAD -->|是| CHAN_RESTART[重启受影响渠道\nTransport 重连] CHAN_RELOAD -->|否| SKIP_CHAN[跳过渠道重载] APPLY --> MODEL_RELOAD{模型配置变更?} MODEL_RELOAD -->|是| MODEL_SWITCH[切换 LLM Provider\n下次调用生效] MODEL_RELOAD -->|否| SKIP_MODEL[跳过] APPLY --> PLUGIN_RELOAD{插件变更?} PLUGIN_RELOAD -->|是| PLUGIN_CYCLE[Plugin Deactivate → Activate\n热重载插件] PLUGIN_RELOAD -->|否| SKIP_PLUGIN[跳过] CHAN_RESTART & SKIP_CHAN & MODEL_SWITCH & SKIP_MODEL & PLUGIN_CYCLE & SKIP_PLUGIN --> DONE([✅ 重载完成\n无需重启 Gateway]) style CHANGE fill:#0d1a20,stroke:#14b8a6,color:#5eead4 style DONE fill:#0d1a0d,stroke:#22c55e,color:#86efac style VALID fill:#1a1030,stroke:#a855f7,color:#d8b4fe style ERROR fill:#1a0808,stroke:#ef4444,color:#fca5a5
并发运行时结构:Gateway 进程内同时运行:渠道监听器(50+ 渠道)、Agent Session(按需创建)、Cron 调度器、健康检查 Doctor、Config 文件监听器——所有任务共享同一 Node.js 事件循环,通过 async/await 协作调度。