openclaw/docs/zh-CN/refactor/clawnet.md

425 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
read_when:
- 规划节点 + 操作者客户端的统一网络协议
- 重新设计跨设备的审批、配对、TLS 和在线状态
summary: Clawnet 重构:统一网络协议、角色、认证、审批、身份
title: Clawnet 重构
x-i18n:
generated_at: "2026-02-01T21:37:22Z"
model: claude-opus-4-5
provider: pi
source_hash: 719b219c3b326479658fe6101c80d5273fc56eb3baf50be8535e0d1d2bb7987f
source_path: refactor/clawnet.md
workflow: 15
---
# Clawnet 重构(协议 + 认证统一)
## 你好
你好 Peter — 方向很棒;这将带来更简洁的用户体验和更强的安全性。
## 目的
一份严谨的统一文档,涵盖:
- 现状:协议、流程、信任边界。
- 痛点审批、多跳路由、UI 重复。
- 新方案:单一协议、作用域角色、统一认证/配对、TLS 固定。
- 身份模型:稳定 ID + 可爱别名。
- 迁移计划、风险、待解决问题。
## 目标(来自讨论)
- 所有客户端mac 应用、CLI、iOS、Android、无头节点使用同一协议。
- 每个网络参与者均经过认证和配对。
- 角色清晰:节点 vs 操作者。
- 集中审批,路由到用户所在位置。
- 所有远程流量使用 TLS 加密 + 可选固定。
- 最小化代码重复。
- 单台机器只显示一次(不出现 UI/节点重复条目)。
## 非目标(明确声明)
- 移除能力隔离(仍需最小权限)。
- 在无作用域检查的情况下暴露完整 Gateway网关控制平面。
- 让认证依赖人类标签(别名仍为非安全性要素)。
---
# 现状(当前状态)
## 两套协议
### 1) Gateway网关 WebSocket控制平面
- 完整 API 接口:配置、渠道、模型、会话、智能体运行、日志、节点等。
- 默认绑定local loopback。远程访问通过 SSH/Tailscale。
- 认证:通过 `connect` 使用令牌/密码。
- 无 TLS 固定(依赖 local loopback/隧道)。
- 代码:
- `src/gateway/server/ws-connection/message-handler.ts`
- `src/gateway/client.ts`
- `docs/gateway/protocol.md`
### 2) Bridge节点传输
- 窄白名单接口,节点身份 + 配对。
- 基于 TCP 的 JSONL可选 TLS + 证书指纹固定。
- TLS 在发现 TXT 记录中广播指纹。
- 代码:
- `src/infra/bridge/server/connection.ts`
- `src/gateway/server-bridge.ts`
- `src/node-host/bridge-client.ts`
- `docs/gateway/bridge-protocol.md`
## 当前控制平面客户端
- CLI → 通过 `callGateway网关` 连接 Gateway网关 WS`src/gateway/call.ts`)。
- macOS 应用 UI → Gateway网关 WS`Gateway网关Connection`)。
- Web 控制 UI → Gateway网关 WS。
- ACP → Gateway网关 WS。
- 浏览器控制使用独立的 HTTP 控制服务器。
## 当前节点
- macOS 应用在节点模式下连接 Gateway网关 bridge`MacNodeBridgeSession`)。
- iOS/Android 应用连接 Gateway网关 bridge。
- 配对 + 每节点令牌存储在 Gateway网关。
## 当前审批流程(执行)
- 智能体通过 Gateway网关使用 `system.run`
- Gateway网关通过 bridge 调用节点。
- 节点运行时决定审批。
- UI 提示在 mac 应用上显示(当节点 == mac 应用时)。
- 节点向 Gateway网关返回 `invoke-res`
- 多跳UI 绑定在节点主机上。
## 当前在线状态 + 身份
- Gateway网关在线状态条目来自 WS 客户端。
- 节点在线状态条目来自 bridge。
- mac 应用可能为同一台机器显示两个条目UI + 节点)。
- 节点身份存储在配对存储中UI 身份独立存储。
---
# 问题 / 痛点
- 需要维护两套协议栈WS + Bridge
- 远程节点的审批:提示出现在节点主机上,而非用户所在位置。
- TLS 固定仅存在于 bridgeWS 依赖 SSH/Tailscale。
- 身份重复:同一台机器显示为多个实例。
- 角色模糊UI + 节点 + CLI 的能力未清晰分离。
---
# 新方案Clawnet
## 单一协议,两种角色
带角色 + 作用域的单一 WS 协议。
- **角色node**(能力宿主)
- **角色operator**(控制平面)
- 操作者可选**作用域**
- `operator.read`(状态 + 查看)
- `operator.write`(智能体运行、发送)
- `operator.admin`(配置、渠道、模型)
### 角色行为
**节点**
- 可注册能力(`caps`、`commands`、权限)。
- 可接收 `invoke` 命令(`system.run`、`camera.*`、`canvas.*`、`screen.record` 等)。
- 可发送事件:`voice.transcript`、`agent.request`、`chat.subscribe`。
- 不能调用配置/模型/渠道/会话/智能体控制平面 API。
**操作者**
- 完整控制平面 API受作用域限制。
- 接收所有审批请求。
- 不直接执行 OS 操作;路由到节点执行。
### 关键规则
角色按连接划分,而非按设备划分。一个设备可以分别打开两种角色。
---
# 统一认证 + 配对
## 客户端身份
每个客户端提供:
- `deviceId`(稳定,从设备密钥派生)。
- `displayName`(人类可读名称)。
- `role` + `scope` + `caps` + `commands`
## 配对流程(统一)
- 客户端未认证连接。
- Gateway网关为该 `deviceId` 创建**配对请求**。
- 操作者收到提示;批准/拒绝。
- Gateway网关签发绑定以下信息的凭据
- 设备公钥
- 角色
- 作用域
- 能力/命令
- 客户端持久化令牌,重新认证连接。
## 设备绑定认证(防止持有者令牌重放)
推荐方案:设备密钥对。
- 设备一次性生成密钥对。
- `deviceId = fingerprint(publicKey)`
- Gateway网关发送 nonce设备签名Gateway网关验证。
- 令牌签发给公钥(持有证明),而非字符串。
替代方案:
- mTLS客户端证书最强运维复杂度更高。
- 短期持有者令牌仅作为临时过渡(尽早轮换 + 撤销)。
## 静默审批SSH 启发式)
需精确定义以避免薄弱环节。推荐以下方案之一:
- **仅限本地**:客户端通过 local loopback/Unix socket 连接时自动配对。
- **SSH 验证**Gateway网关签发 nonce客户端通过获取 nonce 证明 SSH 访问。
- **物理存在窗口**:在 Gateway网关主机 UI 上进行本地审批后,在短时间窗口内(如 10 分钟)允许自动配对。
始终记录自动审批日志。
---
# 全面启用 TLS开发 + 生产)
## 复用现有 bridge TLS
使用当前 TLS 运行时 + 指纹固定:
- `src/infra/bridge/server/tls.ts`
- `src/node-host/bridge-client.ts` 中的指纹验证逻辑
## 应用到 WS
- WS 服务器使用相同证书/密钥 + 指纹支持 TLS。
- WS 客户端可固定指纹(可选)。
- 发现服务为所有端点广播 TLS + 指纹。
- 发现服务仅作为定位提示;绝不作为信任锚点。
## 原因
- 减少对 SSH/Tailscale 的机密性依赖。
- 使远程移动端连接默认安全。
---
# 审批重新设计(集中化)
## 现状
审批发生在节点主机上mac 应用节点运行时)。提示出现在节点运行的位置。
## 新方案
审批由 **Gateway网关托管**UI 推送到操作者客户端。
### 新流程
1. Gateway网关收到 `system.run` 意图(智能体)。
2. Gateway网关创建审批记录`approval.requested`。
3. 操作者 UI 显示提示。
4. 审批决定发送到 Gateway网关`approval.resolve`。
5. 如果批准Gateway网关调用节点命令。
6. 节点执行,返回 `invoke-res`
### 审批语义(加固)
- 广播给所有操作者;仅活跃 UI 显示模态框(其他显示通知提示)。
- 首个决定生效Gateway网关拒绝后续的重复决定。
- 默认超时N 秒后拒绝(如 60 秒),记录原因。
- 决定需要 `operator.approvals` 作用域。
## 优势
- 提示出现在用户所在位置mac/手机)。
- 远程节点的审批行为一致。
- 节点运行时保持无头;无 UI 依赖。
---
# 角色清晰示例
## iPhone 应用
- **节点角色**用于:麦克风、摄像头、语音聊天、位置、按键通话。
- 可选 **operator.read** 用于状态和聊天查看。
- 仅在明确启用时才有可选 **operator.write/admin**
## macOS 应用
- 默认为操作者角色(控制 UI
- 启用"Mac 节点"时为节点角色system.run、屏幕、摄像头
- 两个连接使用相同 deviceId → 合并为一个 UI 条目。
## CLI
- 始终为操作者角色。
- 作用域由子命令决定:
- `status`、`logs` → read
- `agent`、`message` → write
- `config`、`channels` → admin
- 审批 + 配对 → `operator.approvals` / `operator.pairing`
---
# 身份 + 别名
## 稳定 ID
认证必需;永不更改。
推荐方案:
- 密钥对指纹(公钥哈希)。
## 可爱别名(龙虾主题)
仅作为人类标签。
- 示例:`scarlet-claw`、`saltwave`、`mantis-pinch`。
- 存储在 Gateway网关注册表中可编辑。
- 冲突处理:`-2`、`-3`。
## UI 分组
相同 `deviceId` 跨角色 → 单个"实例"行:
- 标记:`operator`、`node`。
- 显示能力 + 最后在线时间。
---
# 迁移策略
## 阶段 0文档 + 对齐
- 发布本文档。
- 盘点所有协议调用 + 审批流程。
## 阶段 1在 WS 中添加角色/作用域
- 扩展 `connect` 参数,增加 `role`、`scope`、`deviceId`。
- 为节点角色添加白名单控制。
## 阶段 2Bridge 兼容
- 保持 bridge 运行。
- 并行添加 WS 节点支持。
- 通过配置开关控制功能。
## 阶段 3集中审批
- 在 WS 中添加审批请求 + 决定事件。
- 更新 mac 应用 UI 以显示提示和响应。
- 节点运行时停止 UI 提示。
## 阶段 4TLS 统一
- 使用 bridge TLS 运行时为 WS 添加 TLS 配置。
- 为客户端添加固定。
## 阶段 5弃用 bridge
- 将 iOS/Android/mac 节点迁移到 WS。
- 保留 bridge 作为回退;稳定后移除。
## 阶段 6设备绑定认证
- 所有非本地连接要求基于密钥的身份认证。
- 添加撤销 + 轮换 UI。
---
# 安全说明
- 角色/白名单在 Gateway网关边界强制执行。
- 无操作者作用域的客户端无法获得"完整"API。
- 所有连接均需配对。
- TLS + 固定降低移动端中间人攻击风险。
- SSH 静默审批是便利功能;仍被记录且可撤销。
- 发现服务绝不作为信任锚点。
- 能力声明由服务器按平台/类型的白名单验证。
# 流式传输 + 大负载(节点媒体)
WS 控制平面适合小消息,但节点还需要处理:
- 摄像头片段
- 屏幕录制
- 音频流
方案:
1. WS 二进制帧 + 分块 + 背压规则。
2. 独立流式端点(仍使用 TLS + 认证)。
3. 对媒体密集型命令保留 bridge 更久,最后迁移。
实现前选定一个方案,避免分歧。
# 能力 + 命令策略
- 节点报告的 caps/commands 视为**声明**。
- Gateway网关执行按平台的白名单。
- 任何新命令需要操作者审批或显式白名单变更。
- 带时间戳审计变更。
# 审计 + 速率限制
- 记录:配对请求、批准/拒绝、令牌签发/轮换/撤销。
- 对配对请求和审批提示进行速率限制。
# 协议规范
- 显式协议版本 + 错误码。
- 重连规则 + 心跳策略。
- 在线状态 TTL 和最后在线语义。
---
# 待解决问题
1. 单设备运行两种角色:令牌模型
- 建议每个角色使用独立令牌(节点 vs 操作者)。
- 相同 deviceId不同作用域更清晰的撤销。
2. 操作者作用域粒度
- read/write/admin + 审批 + 配对(最小可行方案)。
- 后续考虑按功能划分作用域。
3. 令牌轮换 + 撤销用户体验
- 角色变更时自动轮换。
- 按 deviceId + 角色撤销的 UI。
4. 发现服务
- 扩展当前 Bonjour TXT 以包含 WS TLS 指纹 + 角色提示。
- 仅作为定位提示。
5. 跨网络审批
- 广播给所有操作者客户端;活跃 UI 显示模态框。
- 首个响应生效Gateway网关保证原子性。
---
# 摘要(简述)
- 现状WS 控制平面 + Bridge 节点传输。
- 痛点:审批 + 重复 + 两套协议栈。
- 方案:带显式角色 + 作用域的单一 WS 协议,统一配对 + TLS 固定Gateway网关托管审批稳定设备 ID + 可爱别名。
- 成果:更简洁的用户体验、更强的安全性、更少的重复、更好的移动端路由。