ClawX桌面应用采用三层架构设计,将用户界面、应用管理与AI核心服务分离。Electron主进程负责窗口与系统管理,React渲染进程构建用户界面,两者通过安全通道通信。独立的OpenClawGateway进程运行于18789端口,处理AI编排、技能执行等核心逻辑,并通过WebSocket与其他进程交互。
ClawX桌面端体验评测
时间:2026-07-30
浏览:559
文章目录
ClawX 工程架构与工作原理详解
本文旨在清晰拆解 ClawX 桌面应用的内部架构。无论您希望深入理解其运行机制,还是准备进行二次开发,了解其进程划分、数据流转和核心组件,都是至关重要的第一步。

一、整体架构概览
ClawX 采用了“双进程 + 独立网关”的三层架构设计。这种设计将用户界面与AI运行时核心彻底隔离,确保了前端交互的流畅性,同时为后端复杂任务提供了稳定的执行环境。
具体来看,这三层分别是:
- Electron 主进程:基于 Node.js,负责应用窗口、生命周期、系统托盘等底层管理,并充当“总调度员”。
- React 渲染进程:承载所有用户界面,使用现代前端技术栈构建,通过安全通道与主进程通信。
- OpenClaw Gateway 进程:一个完全独立的进程,在端口18789上运行,是真正的AI大脑,负责编排、频道管理、技能执行等核心逻辑。
它们之间的协作关系,可以通过下面的架构图一目了然:
┌─────────────────────────────────────────────────────────────────────────────┐
│ClawX 桌面应用 (Electron) │
│ │
│┌──────────────────────────────────────────────────────────────────────┐ │
││Electron 主进程 (Node.js) │ │
││ 窗口/应用生命周期 (main/index.ts, window.ts) │ │
││ Gateway 进程管理 (gateway/manager.ts) — 启动/停止/重连 │ │
││ IPC 处理 (main/ipc-handlers.ts) — 转发渲染进程请求 │ │
││ 系统集成:托盘、通知、钥匙串、自动更新 │ │
││ ClawHub 服务 (gateway/clawhub.ts) — Skill 搜索/安装/卸载 (CLI) │ │
│└───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ │ IPC (invoke / on) │
│ │ 安全通道:preload 白名单 channel │
│ ▼ │
│┌──────────────────────────────────────────────────────────────────────┐ │
││React 渲染进程 (BrowserWindow) │ │
││ 技术栈:React 19 + Vite + TypeScript + Zustand + Tailwind/shadcn │ │
││ 页面:Setup / Dashboard / Chat / Channels / Skills / Cron / Settings │ │
││ 通过 window.electron.ipcRenderer.invoke/on 与主进程通信 │ │
││ 状态:gateway / chat / channels / cron / providers / settings 等 │ │
│└──────────────────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────┬───────────────────────────────────────┘
│
│ WebSocket (ws://localhost:18789/ws)
│ 协议:OpenClaw (req/res/event + connect 握手)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│OpenClaw Gateway 进程 (独立) │
│ 端口:18789 (PORTS.OPENCLAW_GATEWAY) │
│ 职责:AI 编排、频道管理、Skill 执行、Provider 抽象、Cron 调度 │
│ 由主进程 spawn(node/Electron 跑 entry + gateway 子命令) │
└─────────────────────────────────────────────────────────────────────────────┘
二、详细架构图与数据流
2.1 进程与通信关系图
为了更直观地理解各模块如何联动,下面这张流程图清晰地展示了进程间的通信路径:
flowchart TB
subgraph Renderer["React 渲染进程"]
UI[React 页面/组件]
Stores[Zustand Stores]
UI --> Stores
end
subgraph Main["Electron 主进程"]
IPC[IPC Handlers]
GW[GatewayManager]
ClawHub[ClawHubService]
IPC --> GW
IPC --> ClawHub
end
subgraph Preload["Preload 脚本"]
Bridge[contextBridge API]
end
subgraph Gateway["OpenClaw Gateway 进程"]
WS[WebSocket Server :18789]
Agent[Agent 运行时]
Channels[频道管理]
Skills[Skill 执行]
WS --> Agent
WS --> Channels
WS --> Skills
end
Renderer -->|invoke/on 白名单| Preload
Preload -->|ipcRenderer| Main
GW -->|WebSocket JSON-RPC| WS
GW -->|status/notification/chat:message 等| IPC
IPC -->|webContents.send| Renderer
2.2 应用启动与 Gateway 启动流程
应用启动时,Gateway 的启动是关键一环。这个过程是智能的:它会先尝试连接已有的 Gateway 进程,如果不存在则创建一个新的。下面的时序图描绘了这一过程:
sequenceDiagram
participant User
participant App as Electron App
participant Main as 主进程
participant GW as GatewayManager
participant OC as OpenClaw Gateway 进程
participant WS as WebSocket
User->>App: 启动 ClawX
App->>Main: app.whenReady()
Main->>Main: createWindow, createTray, registerIpcHandlers
Main->>GW: gatewayManager.start()
alt 已有 Gateway 在运行
GW->>WS: findExistingGateway() 探测 18789
WS-->>GW: 连接成功
GW->>GW: connect(port) 握手
else 无现有进程
GW->>OC: startProcess() spawn node/electron + gateway --port 18789 --token ...
OC->>OC: 启动 HTTP+WS 服务
GW->>GW: waitForReady() 轮询 ws 可连
GW->>WS: connect(18789) WebSocket
end
WS-->>GW: connect.challenge (nonce)
GW->>WS: connect (auth token + device 签名)
WS-->>GW: connect 成功 (res)
GW->>Main: emit('status', running)
Main->>Renderer: gateway:status-changed
Main->>Main: ensureClawXContext() 合并工作区配置
2.3 用户聊天消息数据流
一次简单的用户聊天背后,其实经历了一次跨越多层进程的“旅程”。从界面点击到AI响应返回,数据流是这样传递的:
sequenceDiagram
participant User
participant ChatUI as Chat 页面
participant GatewayStore as gateway store
participant Main as 主进程
participant GW as GatewayManager
participant OC as OpenClaw Gateway
User->>ChatUI: 输入并发送消息
ChatUI->>GatewayStore: rpc('chat.send', { content, sessionKey, ... })
GatewayStore->>Main: ipcRenderer.invoke('gateway:rpc', 'chat.send', params)
Main->>GW: gatewayManager.rpc('chat.send', params)
GW->>OC: WebSocket send { type:'req', id, method:'chat.send', params }
OC->>OC: 执行 Agent/模型调用
OC-->>GW: 流式/事件: event agent (state/message)
GW->>GW: handleMessage → emit('chat:message' / 'notification')
GW->>Main: (已在 IPC 里订阅) status/notification/chat:message
Main->>ChatUI: webContents.send('gateway:notification', { method:'agent', params })
ChatUI->>ChatUI: gateway store 中 on('gateway:notification') → chat store handleChatEvent
ChatUI->>User: 更新 UI(流式或最终消息)
2.4 Gateway 与主进程事件转发机制
Gateway 进程产生的各种状态和事件(如聊天消息、通知、频道状态变更),需要通过主进程可靠地转发给前端界面。这个转发机制是应用保持实时响应的核心,其路径如下:
flowchart LR
subgraph Gateway进程
A[OpenClaw Gateway]
end
subgraph 主进程
B[GatewayManager]
C[IPC Handlers]
end
subgraph 渲染进程
D[Gateway Store / Chat Store]
end
A -->|WebSocket message| B
B -->|emit status| C
B -->|emit notification| C
B -->|emit chat:message| C
B -->|emit channel:status| C
C -->|gateway:status-changed| D
C -->|gateway:notification| D
C -->|gateway:chat-message| D
C -->|gateway:channel-status| D
三、核心目录与文件职责
了解关键代码文件的职责,能帮助您在代码库中快速定位。下面这个表格汇总了核心目录和文件的作用:
| 路径 | 职责 |
|---|---|
electron/main/ |
应用入口、窗口、菜单、托盘;注册 IPC;启动/监听 Gateway |
electron/gateway/manager.ts |
Gateway 进程生命周期、WebSocket 连接、重连、RPC 与事件解析 |
electron/gateway/client.ts |
对外的类型化 RPC 封装(channels/skills/chat/cron/providers/system) |
electron/gateway/protocol.ts |
JSON-RPC 2.0 与 OpenClaw 协议类型、事件类型 |
electron/gateway/clawhub.ts |
ClawHub CLI 封装:Skill 搜索/安装/卸载/列表(独立于 Gateway 进程) |
electron/preload/index.ts |
contextBridge 暴露安全 API,IPC channel 白名单 |
electron/main/ipc-handlers.ts |
所有 IPC handle/on,包括 gateway:*、provider、cron、channel、clawhub 等 |
electron/utils/ |
存储(store)、安全存储(secure-storage)、路径(paths)、OpenClaw 配置与认证等 |
src/stores/gateway.ts |
前端 Gateway 状态、init、rpc、订阅 status/error/notification |
src/stores/chat.ts |
聊天历史、发送、接收流式/事件(由 gateway notification 驱动) |
vite.config.ts |
Vite + electron 主进程/预加载入口,渲染进程用 Vite 开发服务器 |
四、关键通信协议与端口
通信离不开协议和端口,这里是几个需要记住的关键数字和格式:
- Gateway 端口:固定为
18789(定义在electron/utils/config.ts的PORTS.OPENCLAW_GATEWAY中)。 - 开发端口:Vite 开发服务器通常运行在
5173端口。 - 与 Gateway 的通信协议:
- 连接地址:
ws://localhost:18789/ws。 - 握手流程:Gateway 先发送一个带随机数(nonce)的
connect.challenge事件,主进程需回应包含 token 和设备签名的connect请求。 - 请求/响应:遵循 JSON-RPC 2.0 风格,请求格式为
{ type: 'req', id, method, params },响应格式为{ type: 'res', id, ok, payload }。 - 服务端推送:通过
{ type: 'event', event, payload }格式主动推送事件,例如event: 'agent'就代表聊天过程中的流式更新或状态变更。
- 连接地址:
五、技能(Skill)管理路径
“技能”(Skill)是 ClawX 扩展能力的核心,但它的获取和执行走了两条不同的路径,理解这一点很重要:
- ClawHub(Skill 市场与安装):这部分由主进程的
ClawHubService直接调用 ClawHub 命令行工具(如clawhub search/install)完成,完全不经过 Gateway 进程。前端通过clawhub:*系列的 IPC 调用与之交互。 - Gateway 内 Skill 执行:已经安装好的 Skill,则由 OpenClaw Gateway 进程负责加载和运行。其配置可以通过 Gateway 的 RPC 接口(如
skills.list)管理,也可以通过主进程直接读写~/.openclaw目录下的配置文件(对应skill:getConfig等 IPC 调用)。
六、开发与构建指南
最后,如果您要上手开发或构建,有几个技术细节需要留意:
- 包管理器:项目使用 pnpm,版本在
package.json中指定。建议先运行corepack enable && corepack prepare来确保使用正确的版本。 - 开发命令:运行
pnpm dev会同时启动 Vite 开发服务器和 Electron 主进程。主进程会自动尝试启动 Gateway 进程,整个过程大约需要 10 到 30 秒准备就绪。 - 热重载:目前热重载仅对渲染进程(前端界面)有效。如果您修改了主进程或 Gateway 的代码,需要完全重启应用才能生效。
- 数据持久化:应用没有使用传统数据库。配置和状态管理依赖于
electron-store和系统的钥匙串(Keychain)服务。
以上就是对 ClawX 工程架构和工作原理的全面解析。结合项目中的 README 和 AGENTS.md 文档,您应该能够快速上手,开始您的开发或调试工作。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。