Files
goodbuddy/docs/features/wechat-clawbot-channel-project-prd.md
T

22 KiB
Raw Blame History

远程消息通道项目与微信 ClawBot 集成 PRD

文档信息

项目 内容
状态 已实施,待真实微信账号联调
版本 1.0
日期 2026-08-09
适用产品 GoodBuddy 桌面端
首期范围 微信 ClawBot、企业微信、钉钉的通道项目;微信文字 Ask 与 Execute

1. 背景

GoodBuddy 已支持企业微信和钉钉远程消息通道,但目前通道仅存在于设置页和后台服务中。远程消息进入任务系统后,用户无法在项目与会话导航中持续、明确地识别:

  1. 消息来自哪个平台。
  2. 当前正在与哪个发送者或群聊对话。
  3. 远程执行任务使用哪个工作目录。
  4. 执行请求、审批、工具调用和结果归属于哪个范围。

GoodBuddy 同时计划接入腾讯官方微信 ClawBot。微信 ClawBot 使用扫码授权,不使用 App ID 或 Secret,并需要在本机持续运行通信服务。微信消息既要支持只读对话,也要支持受控执行。

为避免把通道来源、发送者身份和执行范围混在一起,本功能使用“通道项目 + 远程会话”的两级结构:

  • 通道项目标识平台并确定默认工作目录和默认模式。
  • 远程会话标识具体发送者或群聊。
  • 消息记录具体发送者和本次实际使用的模式。
  • 任务与活动记录执行、审批、工具调用和结果。

2. 已确认的产品决策

  1. 微信 ClawBot、企业微信、钉钉分别对应一个系统管理的通道项目。
  2. 三个通道项目在通道设置服务初始化时幂等创建,不等待用户完成连接配置。
  3. Renderer 不直接创建通道项目。Main 进程保证项目存在,设置卡片首次展示时即可引用对应项目。
  4. 通道项目默认根目录为当前操作系统用户目录。
  5. 同一通道中的不同私聊用户或群聊分别建立独立远程会话。
  6. 微信 ClawBot 首期只支持个人微信私聊和文字消息。
  7. 微信卡片可以配置默认“对话”或“执行”模式。
  8. “对话”映射为 GoodBuddy Ask;“执行”映射为 Execute
  9. 微信 Execute 请求必须先在本机进行请求级确认,不能通过同一个微信通道批准自身。
  10. 请求级确认通过后,任务仍受现有 Runtime、沙箱、能力开关、工具审批和活动审计约束。
  11. 停用或断开通道不得删除通道项目、远程会话、任务、活动或成果历史。
  12. 通道项目由系统管理,用户不能永久删除;用户可以修改其工作目录和默认模式。

3. 目标

3.1 用户目标

  • 在项目切换器中一眼识别微信、企业微信和钉钉来源。
  • 在通道项目中区分不同发送者和群聊。
  • 在设置卡片中完成连接、启停、模式和工作目录配置。
  • 通过微信进行只读问答或发起受控执行任务。
  • 在本机明确确认远程 Execute 请求,并查看完整执行记录。
  • 保留通道关闭前后的历史上下文和审计记录。

3.2 产品目标

  • 将远程通道纳入 GoodBuddy 现有 Project、Conversation、Task、Activity 和 Artifact 信息架构。
  • 复用现有 ChannelService 的白名单、去重、并发、取消、输出限制和错误脱敏能力。
  • 保持 Electron Main、Preload、Renderer 和不可信子进程之间的安全边界。
  • 为后续图片、语音、文件、多账号和更多通道提供稳定扩展点。

4. 非目标

首期不包含:

  • 微信群聊。
  • 微信图片、语音、视频和文件收发。
  • 多个个人微信账号同时绑定。
  • 通过微信批准 Execute 请求或工具调用。
  • 无需本机确认的远程自主执行。
  • 主动群发、营销消息或任意联系人发现。
  • 将微信会话自动合并进普通本地会话。
  • 删除或迁移现有企业微信、钉钉历史数据。
  • 把完整 OpenClaw Runtime 打包进 GoodBuddy。

5. 信息架构

5.1 项目分组

项目选择器增加“远程通道”分组:

普通项目
├─ 默认项目
└─ 用户创建的其他项目

远程通道
├─ 微信 ClawBot
├─ 企业微信
└─ 钉钉

每个通道项目持续显示连接状态:

  • 未配置
  • 已停用
  • 正在连接
  • 等待扫码
  • 已连接
  • 连接失败

通道状态不得只通过颜色表达。

5.2 项目、会话和消息关系

通道项目
  └─ 远程会话
       └─ 消息
            └─ 可选任务 / 活动 / 成果

职责划分:

层级 负责内容
通道项目 平台、连接状态、默认根目录、默认模式
远程会话 平台账号、私聊用户或群聊、连续上下文
消息 具体发送者、本次实际模式、正文、时间和处理状态
任务与活动 请求级确认、Runtime、工具审批、执行结果和错误

5.3 会话命名

  • 微信 ClawBot:优先使用已绑定用户昵称;不可用时显示“我的微信”。
  • 企业微信私聊:优先使用平台显示名,否则显示脱敏发送者 ID。
  • 钉钉私聊:优先使用平台显示名,否则显示脱敏发送者 ID。
  • 群聊:使用群名称;每条消息仍显示具体发送者。
  • 不得把原始 Token、上下文令牌或完整敏感标识作为会话标题。

6. 通道项目生命周期

6.1 自动创建

应用初始化通道设置服务时,Main 进程执行 ensureChannelProjects()

  1. 按稳定通道标识查找 weixinwecomdingtalk 对应项目。
  2. 缺失时创建系统管理项目。
  3. 已存在时复用,不重复创建。
  4. 如果存在同名普通项目,不得按名称占用或修改该项目。
  5. 创建失败时保留其他通道可用,并在设置快照中返回有界错误。

默认值:

通道 项目名称 根目录 默认模式
weixin 微信 ClawBot 用户目录 Ask
wecom 企业微信 用户目录 Ask
dingtalk 钉钉 用户目录 Ask

6.2 系统管理约束

  • 通道项目不能从普通项目危险区永久删除。
  • 停用通道不归档项目。
  • 断开微信不删除项目和历史。
  • 数据迁移或异常导致项目缺失时,下次初始化自动修复。
  • 用户可以修改项目根目录、描述和默认模式。
  • 项目名称首期由系统管理,避免来源名称被改到不可识别;后续如允许自定义,必须持续显示通道徽标。

6.3 默认用户目录

通道项目默认使用操作系统用户目录。设置卡片必须显示完整目录,并在首次启用 Execute 时明确说明该范围可能包含桌面、下载、文档和其他私人文件。

如果根目录不存在、不可访问或不是目录:

  • Ask 仍可在不读取本地文件的边界内工作。
  • Execute 不得启动。
  • 设置卡片显示就近错误和“选择目录”操作。

7. 设置页产品需求

7.1 导航

设置页标签由“企业通信”改为:

  • 标题:消息通道
  • 说明:微信 ClawBot、企业微信与钉钉

7.2 卡片通用结构

每个通道卡片包含:

  1. 通道名称和连接状态。
  2. 启用开关。
  3. 默认处理模式。
  4. 默认工作目录。
  5. 对应通道项目及“打开”操作。
  6. 平台特有的连接配置。
  7. 最近错误或最近连接时间。

示意:

微信 ClawBot                              已连接

已绑定账号:微信用户 ****8a3f
最近收到消息:今天 14:32

启用微信通道                              [开关]

默认处理模式
[ 对话 ] [ 执行 ]

默认工作目录
C:\Users\用户名                           [选择目录]

通道项目
微信 ClawBot                              [打开]

[断开连接]

“对话 / 执行”是互斥状态,应使用语义化分段控件,不使用两个独立复选框。

7.3 模式说明

  • 对话:只读回答,不调用工具或修改内容。
  • 执行:允许发起工具任务,但需要本机请求级确认,并继续遵守现有审批规则。

默认模式从 Ask 切换到 Execute 时显示风险确认:

允许此通道默认发起执行任务?

远程消息可能要求 GoodBuddy 读取或修改默认工作目录中的内容。
每个执行请求仍需要在这台电脑上确认。

默认工作目录:
C:\Users\用户名

[取消] [确认启用]

7.4 微信扫码绑定

未绑定时显示“绑定个人微信”。扫码对话框包含:

  • 本地渲染的二维码。
  • 扫码和手机确认步骤。
  • 二维码剩余有效时间。
  • 刷新和取消操作。
  • 等待扫码、已扫描、需要验证码、已连接、已过期和失败状态。

二维码过期时不得继续接受旧扫码结果。

需要配对数字时,在同一对话框中显示验证码输入。验证码不得写入日志或持久化。

7.5 企业微信和钉钉

企业微信和钉钉继续使用现有凭据表单、环境变量只读覆盖和连接测试,但增加:

  • 通道项目显示。
  • 默认处理模式。
  • 默认工作目录。
  • 打开通道项目。

现有发送者白名单和群聊提及设置继续有效。

8. 远程会话需求

8.1 会话创建与复用

收到合法消息后,根据以下稳定键查找会话:

channel + accountId + externalConversationId
  • 未找到时,在对应通道项目下创建远程会话。
  • 已找到时继续使用现有会话。
  • 微信私聊的 externalConversationId 首期可由绑定账号和发送者稳定标识组成。
  • 不得仅按显示名称匹配会话。
  • 消息重试不得创建重复会话或重复任务。

8.2 新建上下文

首期支持以下方式创建新上下文:

  • 微信发送 /new
  • GoodBuddy 会话页面点击“新建远程会话”。

新会话仍属于相同通道项目。旧会话保留并可搜索。

8.3 展示

最近对话和聊天标题区显示:

  • 通道图标和名称。
  • 私聊用户或群聊名称。
  • 当前连接状态。
  • 默认模式。
  • 未读状态。

每条远程消息记录实际模式:

  • Ask
  • Execute
  • 等待本机确认
  • 已拒绝
  • 执行中
  • 等待工具审批
  • 已完成
  • 失败

收到普通远程消息时不得强制切换当前页面。应增加未读标记和全局通知。Execute 请求等待确认时显示高优先级全局入口。

9. Ask 与 Execute

9.1 模式解析

每条消息的模式按以下优先级确定:

  1. 显式 /ask 或“对话:”前缀使用 Ask。
  2. 显式 /execute/exec 或“执行:”前缀使用 Execute。
  3. 没有前缀时使用通道项目的默认模式。

前缀仅用于选择模式,不进入发送给模型的正文。

9.2 Ask

  • 在 Runtime 边界保持只读。
  • 不提供工具授权回调,或所有工具请求返回拒绝。
  • 不修改文件、数据库、系统状态或远程状态。
  • 结果以有界文字返回原通道并写入远程会话。

9.3 Execute 请求级确认

Execute 消息通过身份、长度、去重和并发检查后:

  1. 创建状态为“等待远程执行确认”的任务。
  2. 向微信回复“执行请求已发送到电脑,等待确认”。
  3. 显示桌面通知和 GoodBuddy 全局确认对话框。
  4. 用户在 120 秒内选择“拒绝”或“仅允许此任务”。
  5. 超时、应用退出、通道停用或会话失效均自动拒绝。
  6. 确认通过后才调用 Execute Runtime。

请求级确认不得提供:

  • 此会话永久允许。
  • 此发送者永久允许。
  • 微信内确认。
  • 自动确认。

确认内容必须显示:

  • 通道。
  • 发送者。
  • 完整有界任务正文。
  • 通道项目。
  • 默认工作目录。
  • 超时时间。
  • “具体工具仍受现有控制”的说明。

9.4 工具控制

请求级确认不是工具授权替代品:

  • OpenCode、Continue 和直连模型仍执行各自现有能力检查。
  • Runtime 沙箱模式继续有效。
  • 禁止策略继续拒绝工具。
  • 需要逐工具审批的 Runtime 继续发送本机审批事件。
  • 远程来源不得扩大 sessionpermanent 授权范围。
  • 任何工具结果都进入现有任务和活动审计。

9.5 结果回传

  • 成功:回传有界文字结果。
  • 失败:回传经过脱敏、长度受限的用户可处理错误。
  • 取消:回传“任务已取消”。
  • 拒绝或超时:回传“电脑端未允许此次执行”。
  • 结果投递失败时保留发件箱记录并显示通道错误,不重复执行任务。

10. 微信 ClawBot 通信架构

10.1 进程边界

微信通信运行在独立 Node Sidecar 中:

微信
  ↕ 腾讯 iLink HTTPS / CDN
微信 Sidecar
  ↕ 严格、有界、可验证的进程协议
Main ChannelDriver
  ↕
ChannelService
  ↕
GoodBuddy Runtime 与审批

禁止:

  • 在 Renderer 中加载微信通信代码。
  • 向 Renderer 暴露 Token、上下文令牌或原始腾讯响应。
  • 把腾讯插件直接加载进 Electron Main。
  • 运行 openclaw-weixin-cli 安装器。
  • 仅为微信通道打包完整 OpenClaw。

10.2 首期 Sidecar 能力

  • 获取和刷新二维码。
  • 轮询扫码状态。
  • 提交一次性验证码。
  • 加载内存中的加密解封凭据。
  • 长轮询文字消息。
  • 发送文字回复。
  • 保持会话 context_token 和同步游标。
  • 有界重试、退避、停止和异常退出。

10.3 协议扩展

现有 wechat-sidecar-protocol.ts 需要拆分为两个方向:

Sidecar 到 Main

  • status
  • qr
  • verification_required
  • connected
  • inbound_text
  • reply_result
  • fatal_error

Main 到 Sidecar

  • start_login
  • submit_verification
  • start_account
  • send_reply
  • disconnect
  • shutdown

所有消息使用严格 Zod Schema、版本号、最大长度和关联 ID。协议拒绝未知字段。Token、Cookie、Session 和上下文令牌不得出现在普通状态或消息事件中。

11. 凭据与网络安全

11.1 凭据

  • 微信 bot token 使用 Electron safeStorage 加密后保存在 Main 管理的设置文件。
  • 上下文令牌由 Sidecar 运行时持有;如需跨重启保存,必须由 Main 加密持久化。
  • 凭据不得出现在命令行参数、普通环境变量、stdout、Renderer IPC、通知或错误消息中。
  • Sidecar 通过私有继承管道接收本次运行所需凭据。
  • 安全存储不可用时不能完成微信绑定或启用通道。

11.2 网络

  • 扫码入口固定为已审核的腾讯 HTTPS 主机。
  • 服务端返回的 API 主机和重定向主机必须通过腾讯主机允许列表验证后才能携带 Token 请求。
  • 不允许明文 HTTP 发送微信凭据。
  • 全局“内网兼容模式”不得放宽微信凭据端点的 HTTPS 和主机验证。
  • 日志中的 URL 移除查询字符串,响应体对 Token 和上下文令牌脱敏。

11.3 断开与解绑

产品区分:

  • 停用:停止收发,保留本地绑定凭据。
  • 断开本地连接:停止收发并清除本地凭据。
  • 微信端解除绑定:只有腾讯提供并验证服务端撤销能力后才可承诺。

当前不得把本地清除描述为“已在微信端彻底解绑”。

12. 数据与契约建议

12.1 Project

为项目增加可向后兼容的来源字段:

type ProjectKind = 'user' | 'channel'
type ProjectChannel = 'weixin' | 'wecom' | 'dingtalk'

通道项目包含:

  • kind: 'channel'
  • channel
  • 稳定且唯一的通道绑定

现有项目迁移为 kind: 'user'。不得通过项目名称推断通道。

12.2 Conversation

增加远程会话映射,至少包含:

  • conversationId
  • projectId
  • channel
  • accountId
  • externalConversationId
  • conversationType
  • 脱敏显示名
  • 创建和最近消息时间

唯一约束:

channel + accountId + externalConversationId

12.3 Channel Settings

通道公开设置增加:

  • projectId
  • defaultWorkMode
  • rootPath
  • status

微信私有设置增加加密字段:

  • bot token
  • bot/account ID
  • 绑定用户 ID
  • 经验证的 API base URL

Renderer 快照只返回是否已配置和脱敏标识。

12.4 任务来源

远程任务保留:

  • 通道项目 ID。
  • 远程会话 ID。
  • 通道。
  • 脱敏发送者。
  • 实际工作模式。
  • 请求级确认结果。

不得把 Execute 任务伪装成普通本地任务或只读 delegation。

13. IPC 与 Preload

建议增加窄接口:

  • 获取通道设置快照。
  • 保存通道项目配置。
  • 开始微信扫码。
  • 刷新微信扫码。
  • 提交微信验证码。
  • 断开微信本地连接。
  • 订阅微信连接状态。
  • 响应远程 Execute 请求级确认。
  • 打开对应通道项目。

所有 IPC

  • 使用共享 Zod Schema 验证。
  • 验证可信 Renderer sender。
  • 不接收 Renderer 提供的项目类型或通道身份作为可信事实。
  • 不返回凭据。

14. 关键异常流程

14.1 项目重名

存在名为“微信 ClawBot”的普通项目时,仍创建独立通道项目,并通过通道类型而非名称识别。UI 可以显示同名,但必须有“远程通道”分组和微信徽标。

14.2 通道项目缺失

如果数据库异常或旧版本操作导致绑定项目缺失,Main 初始化时重新创建并修复设置引用。历史会话无法安全迁移时保留原归属并给出诊断,不静默丢弃。

14.3 连接中退出

  • 取消二维码轮询。
  • 清除内存验证码。
  • 停止 Sidecar。
  • 不保存未确认凭据。

14.4 执行确认期间断线

本机确认仍可拒绝,但不得在通道已断开后启动新的 Execute。已开始的任务按用户明确选择和现有取消策略处理,结果进入本地审计;恢复连接后不得自动重复执行。

14.5 重复消息

使用稳定平台消息 ID 去重。平台消息 ID 缺失时,使用账号、会话、发送者、时间和内容摘要构造有界稳定键。确认、任务创建和回复必须共用同一个去重声明。

15. 可访问性与响应式

  • 通道状态同时使用文字和图标。
  • 模式选择使用语义化单选/分段控件和方向键。
  • 二维码提供状态文字和备用刷新操作,但不把敏感二维码链接作为可复制文本。
  • 验证码错误与输入框建立 aria-describedby 关联。
  • Execute 风险确认初始焦点位于“取消”。
  • 关闭对话框后焦点返回触发按钮。
  • 窄窗口下卡片单列,二维码对话框保留 16px 外边距。
  • 浅色、深色和 200% 文字缩放下可完成绑定和确认。

16. 验收标准

16.1 通道项目

  • 新安装首次启动后存在微信 ClawBot、企业微信和钉钉三个通道项目。
  • 重启应用不会重复创建通道项目。
  • 同名普通项目不会被占用或修改。
  • 通道项目默认根目录为当前用户目录,默认模式为 Ask。
  • 通道项目在项目选择器的“远程通道”分组中显示。
  • 停用或断开通道不会删除项目和历史。
  • 普通项目删除流程不能永久删除通道项目。

16.2 设置卡片

  • 设置标签显示为“消息通道”。
  • 三张卡片均显示项目、根目录、默认模式和连接状态。
  • 微信卡片可以完成扫码、过期刷新、验证码和连接状态展示。
  • 切换默认 Execute 前显示目录范围和风险确认。
  • Renderer 无法读取任何微信 Token 或上下文令牌。

16.3 会话

  • 不同通道的消息进入不同通道项目。
  • 不同发送者或群聊进入独立远程会话。
  • 重复平台事件不会创建重复会话、消息或任务。
  • 最近对话、聊天标题和消息均能识别通道与发送者。
  • 收到普通消息不会强制切换当前页面。

16.4 Ask

  • 普通消息默认按卡片配置进入 Ask。
  • Ask 在 Runtime 边界拒绝所有工具。
  • 有界结果回传原通道并写入远程会话。

16.5 Execute

  • 默认 Execute 或显式执行前缀会创建本机请求级确认。
  • 未确认、拒绝、超时、退出和停用均不会执行。
  • 微信消息不能批准自身的 Execute 请求。
  • 确认后任务使用对应通道项目根目录。
  • Runtime、沙箱、能力和工具审批规则继续生效。
  • 任务、活动、工具、成果和最终结果关联到通道项目与远程会话。

16.6 生命周期与安全

  • Sidecar 异常退出不会导致 Main 崩溃,并有有界重启限制。
  • 应用退出会取消长轮询并停止 Sidecar。
  • 微信凭据使用系统安全存储加密。
  • 任何普通日志、IPC、错误和通知中不存在凭据。
  • Token 只发送到已审核的腾讯 HTTPS 主机。

17. 实施阶段

阶段一:通道项目基础

  • Project 数据迁移与通道类型。
  • 三个通道项目幂等创建。
  • 项目选择器“远程通道”分组。
  • 三张设置卡片接入项目、目录和模式配置。
  • 企业微信、钉钉消息建立独立远程会话。

阶段二:微信文字通道

  • 微信 iLink Sidecar。
  • 扫码、验证码、加密凭据和生命周期。
  • 微信文字收发与稳定去重。
  • 微信远程会话。
  • Ask 模式。

阶段三:受控 Execute

  • 本机请求级确认。
  • Execute Runtime 接入。
  • 工具审批和活动关联。
  • 结果回传、取消、超时和失败恢复。

阶段四:后续扩展

  • 有界图片、语音、文件和视频。
  • 多微信账号。
  • 更细的项目路由。
  • 已验证的微信端解除绑定。

18. 测试要求

至少覆盖:

  • 数据迁移和通道项目幂等创建。
  • 同名普通项目隔离。
  • 设置 Schema 与 Renderer 脱敏快照。
  • QR 状态机、过期、验证码和非法转换。
  • Sidecar 双向协议未知字段、超长字段和凭据泄漏拒绝。
  • 腾讯主机允许列表和重定向校验。
  • 消息去重、会话映射、并发和取消。
  • Ask 工具拒绝。
  • Execute 请求级确认通过、拒绝、超时、退出和断线。
  • 工具审批不被远程来源绕过。
  • 发件箱投递失败不重复执行。
  • 项目选择器、设置卡片、扫码对话框和确认对话框的键盘与无障碍行为。
  • Windows、macOS、Linux 的默认用户目录和 Sidecar 关闭行为。

实现完成后运行:

npm test
npm run typecheck
npm run lint
npm run build

19. 发布条件

满足以下条件后才可默认向用户提供微信 Execute:

  1. 微信文字 Ask 全流程稳定。
  2. 请求级确认不能从远程通道绕过。
  3. 凭据不会进入 Renderer、日志或普通子进程参数。
  4. Sidecar 网络目标和重定向已实施严格允许列表。
  5. 通道项目和远程会话的来源标识在所有入口持续可见。
  6. 任务重复投递不会导致重复执行。
  7. 应用退出、断线和更新过程中不会留下失控执行。
  8. 腾讯 iLink 独立宿主使用范围和本地断开语义已完成发布前确认。