Skip to content

架构设计

本文介绍 ClawCenter 的内部设计,面向需要理解或扩展代码库的开发者。

代码结构

src/
├── index.ts              CLI 入口(commander)
├── server.ts             主服务启动(center/worker 模式)

├── core/                 Center 和 Worker 共用
│   ├── db/               SQLite schema 和数据访问
│   ├── agents/           Agent 适配器接口和实现
│   └── api/              REST API 路由

├── center/               仅 Center 模式
│   ├── wechat/           iLink Bot API、登录、CDN、连接器
│   ├── router/           话题标签解析、路由引擎
│   ├── commands/         系统命令处理器
│   ├── dispatcher.ts     消息调度编排器
│   └── hub.ts            WebSocket 服务端(接受 Worker)

├── worker/
│   └── client.ts         WebSocket 客户端(连接 Center)

└── tui/                  终端 UI(ink + React)

数据流

入站消息

微信用户发送消息
  → iLink API(长轮询 getUpdates)
  → WechatConnector.pollLoop()
  → Dispatcher.handleMessage()
  → 是系统命令?→ 处理并回复
  → Router.route()
    → parseHashtag()
    → 检查引用回复 → messages 表查找
    → 粘性路由 → sticky_routes 表
    → 默认 Agent → access_rules 表
    → 权限检查
  → AgentManager.sendToAgent()
  → AgentAdapter.send()
    → Claude CLI / SDK / OpenCode / OpenClaw / Codex / CodeBuddy / Cursor / HTTP / Worker
  → 格式化回复,添加前缀
  → WechatConnector.sendText()
  → iLink API sendMessage

Worker 任务流

Center 收到路由到 Worker Agent 的消息
  → WorkerAgentAdapter.send()
  → WorkerHub → WebSocket → Worker
  → WorkerClient.handleMessage(task)
  → 本地 AgentManager.sendToAgent()
  → AgentAdapter.send()(本地 CLI/SDK)
  → 结果通过 WebSocket 返回
  → Center 继续处理回复

数据库 Schema

用途
wechat_accounts微信登录凭证、连接状态、同步位置
agentsAgent 定义:类型、配置、状态、所在节点
access_rules(微信账号, 用户匹配)→ 可用 Agent
sessions(微信账号, 用户, Agent)→ 对话状态
messages所有收发消息,用于引用回复追踪
sticky_routes每个用户每个微信账号上次使用的 Agent
settings键值配置存储
worker_nodes已连接的 Worker 节点

添加新 Agent 类型

  1. src/core/agents/ 中创建实现 AgentAdapter 接口的新类
  2. adapter.tsAgentType 联合类型中添加新类型字符串
  3. AgentManager.createAdapter() 中添加对应的 case
  4. 在 Web 管理面板的 Agent 创建表单中添加该类型选项

AgentAdapter 接口:

typescript
interface AgentAdapter {
  readonly id: string;
  readonly type: AgentType;
  readonly displayName: string;
  status: "running" | "stopped" | "error";

  start(config: AgentConfig): Promise<void>;
  stop(): Promise<void>;
  send(params: SendParams): Promise<SendResult>;
}

WebSocket 协议(Center ↔ Worker)

方向消息类型用途
W → CregisterWorker 用 node ID 宣告自己
W → CsyncWorker 所有 Agent 的完整列表
W → Cagent-added/updated/removedAgent 增量变更
C → Wtask发送用户消息到 Worker Agent
W → Cstream流式响应分片
W → Cresult最终响应
W → Ctask-error任务失败

Released under the Apache 2.0 License.