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

789 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 远程消息通道项目与微信 ClawBot 集成 PRD
## 文档信息
| 项目 | 内容 |
| --- | --- |
| 状态 | 已实施,待真实微信账号联调 |
| 版本 | 1.4 |
| 日期 | 2026-08-09 |
| 适用产品 | GoodBuddy 桌面端 |
| 首期范围 | 微信 ClawBot、企业微信、钉钉的通道项目;微信文字、图片和文件 Ask 与 Execute |
## 1. 背景
GoodBuddy 已将企业微信、钉钉和微信 ClawBot 远程消息通道纳入系统管理的通道项目。该信息架构解决了早期通道仅存在于设置页和后台服务中,远程消息进入任务系统后无法持续、明确识别以下信息的问题:
1. 消息来自哪个平台。
2. 当前正在与哪个发送者或群聊对话。
3. 远程执行任务使用哪个工作目录。
4. 执行请求、处理后端、工具调用和结果归属于哪个范围。
腾讯官方微信 ClawBot 使用扫码授权,不使用 App ID 或 Secret,并由本机独立 Sidecar 持续运行通信服务。文字、图片和文件收发、只读对话与受控执行已经实现;真实微信账号的认证媒体端到端联调仍作为发布前手动验收。
为避免把通道来源、发送者身份和执行范围混在一起,本功能使用“通道项目 + 远程会话”的两级结构:
- 通道项目标识平台并确定默认工作目录、处理后端和默认模式。
- 远程会话标识具体发送者或群聊。
- 消息记录具体发送者和本次实际使用的模式。
- 任务与活动记录执行、工具调用和结果。
## 2. 已确认的产品决策
1. 微信 ClawBot、企业微信、钉钉分别对应一个系统管理的通道项目。
2. 三个通道项目在通道设置服务初始化时幂等创建,不等待用户完成连接配置。
3. Renderer 不直接创建通道项目。Main 进程保证项目存在,设置卡片首次展示时即可引用对应项目。
4. 通道项目默认根目录为当前操作系统用户目录。
5. 同一通道中的不同私聊用户或群聊分别建立独立远程会话。
6. 微信 ClawBot 首期支持个人微信私聊中的文字、图片和文件;语音和视频后续支持。
7. 微信卡片可以配置默认“对话”或“执行”模式。
8. “对话”映射为 GoodBuddy `Ask`;“执行”映射为 `Execute`
9. 每个通道项目默认使用“模型连接”中的默认直连文本模型,也可以显式选择其他直连文本模型、OpenCode 或 Continue。选择 OpenCode/Continue 时,通道只保存 Runtime 类型,并在每次远程请求开始时动态跟随“Agent Runtime”中的对应全局配置,不维护第二套模型来源或 Runtime 配置。
10. 远程 Execute 不显示通道专属请求级或逐工具确认;收到合法消息后立即按所选后端运行。
11. 任务仍受工作目录、Runtime 能力、沙箱、能力开关、直连模型工具安全策略和活动审计约束。
12. 停用或断开通道不得删除通道项目、远程会话、任务、活动或成果历史。
13. 通道项目由系统管理,用户不能永久删除;用户可以修改其工作目录、处理后端和默认模式。
## 3. 目标
### 3.1 用户目标
- 在项目切换器中一眼识别微信、企业微信和钉钉来源。
- 在通道项目中区分不同发送者和群聊。
- 在设置卡片中完成连接、启停、处理后端、模式和工作目录配置。
- 通过微信进行只读问答或发起受控执行任务。
- 选择可信的执行后端,并查看完整执行记录。
- 保留通道关闭前后的历史上下文和审计记录。
### 3.2 产品目标
- 将远程通道纳入 GoodBuddy 现有 Project、Conversation、Task、Activity 和 Artifact 信息架构。
- 复用现有 ChannelService 的白名单、去重、并发、取消、输出限制和错误脱敏能力。
- 保持 Electron Main、Preload、Renderer 和不可信子进程之间的安全边界。
- 为后续语音、视频、多账号和更多通道提供稳定扩展点。
## 4. 非目标
首期不包含:
- 微信群聊。
- 微信语音和视频收发。
- 多个个人微信账号同时绑定。
- 通过微信临时扩大工具权限或安全策略。
- 主动群发、营销消息或任意联系人发现。
- 将微信会话自动合并进普通本地会话。
- 删除或迁移现有企业微信、钉钉历史数据。
- 把完整 OpenClaw Runtime 打包进 GoodBuddy。
## 5. 信息架构
### 5.1 项目分组
项目选择器增加“远程通道”分组:
```text
普通项目
├─ 默认项目
└─ 用户创建的其他项目
远程通道
├─ 微信 ClawBot
├─ 企业微信
└─ 钉钉
```
每个通道项目持续显示连接状态:
- 未配置
- 已停用
- 正在连接
- 等待扫码
- 已连接
- 连接失败
通道状态不得只通过颜色表达。
### 5.2 项目、会话和消息关系
```text
通道项目
└─ 远程会话
└─ 消息
└─ 可选任务 / 活动 / 成果
```
职责划分:
| 层级 | 负责内容 |
| --- | --- |
| 通道项目 | 平台、连接状态、默认根目录、处理后端、默认模式 |
| 远程会话 | 平台账号、私聊用户或群聊、连续上下文 |
| 消息 | 具体发送者、本次实际模式、正文、时间和处理状态 |
| 任务与活动 | Runtime、工具调用、执行结果和错误 |
### 5.3 会话命名
- 微信 ClawBot:优先使用已绑定用户昵称;不可用时显示“我的微信”。
- 企业微信私聊:优先使用平台显示名,否则显示脱敏发送者 ID。
- 钉钉私聊:优先使用平台显示名,否则显示脱敏发送者 ID。
- 群聊:使用群名称;每条消息仍显示具体发送者。
- 不得把原始 Token、上下文令牌或完整敏感标识作为会话标题。
## 6. 通道项目生命周期
### 6.1 自动创建
应用初始化通道设置服务时,Main 进程执行 `ensureChannelProjects()`
1. 按稳定通道标识查找 `weixin``wecom``dingtalk` 对应项目。
2. 缺失时创建系统管理项目。
3. 已存在时复用,不重复创建。
4. 如果存在同名普通项目,不得按名称占用或修改该项目。
5. 创建失败时保留其他通道可用,并在设置快照中返回有界错误。
默认值:
| 通道 | 项目名称 | 根目录 | 处理后端 | 默认模式 |
| --- | --- | --- | --- | --- |
| `weixin` | 微信 ClawBot | 用户目录 | 默认直连文本模型 | Ask |
| `wecom` | 企业微信 | 用户目录 | 默认直连文本模型 | Ask |
| `dingtalk` | 钉钉 | 用户目录 | 默认直连文本模型 | Ask |
### 6.2 系统管理约束
- 通道项目不能从普通项目危险区永久删除。
- 停用通道不归档项目。
- 断开微信不删除项目和历史。
- 数据迁移或异常导致项目缺失时,下次初始化自动修复。
- 用户可以修改项目根目录、描述、处理后端和默认模式。
- 项目名称首期由系统管理,避免来源名称被改到不可识别;后续如允许自定义,必须持续显示通道徽标。
### 6.3 默认用户目录
通道项目默认使用操作系统用户目录。设置卡片必须显示完整目录,并在首次启用 Execute 时明确说明该范围可能包含桌面、下载、文档和其他私人文件。
如果根目录不存在、不可访问或不是目录:
- Ask 仍可在不读取本地文件的边界内工作。
- Execute 不得启动。
- 设置卡片显示就近错误和“选择目录”操作。
## 7. 设置页产品需求
### 7.1 导航
设置页标签由“企业通信”改为:
- 标题:消息通道
- 说明:微信 ClawBot、企业微信与钉钉
### 7.2 卡片通用结构
三个通道使用与模型设置一致的分段外观页签,并保留
`tablist``tab``tabpanel`、游标焦点和方向键语义。每次只显示一个
通道面板,窄窗口下页签单行横向滚动。
每个通道面板包含:
1. 通道名称和连接状态。
2. 启用开关。
3. 默认工作目录。
4. 消息处理后端。
5. 默认处理模式。
6. 对应通道项目。
7. 平台特有的连接配置。
8. 最近错误或连接状态。
示意:
```text
微信 ClawBot 已连接
已绑定账号:微信用户 ****8a3f
最近收到消息:今天 14:32
启用微信通道 [开关]
默认处理模式
[ 对话 ] [ 执行 ]
默认工作目录
C:\Users\用户名 [选择目录]
消息处理后端
[默认模型 · sonnet-5 v]
通道项目
微信 ClawBot
[断开本机绑定(危险操作)]
```
“对话 / 执行”是互斥状态,应使用语义化分段控件,不使用两个独立复选框。
### 7.3 模式说明
- 对话:只读回答,不调用工具或修改内容。
- 执行:收到合法消息后立即交给所选后端,可在工作目录内调用已启用工具。
每个通道面板持续显示风险说明,不弹出一次性确认。默认 Ask 时也要说明白名单
发送者仍可通过 `/execute` 临时执行:
```text
远程消息可能要求 GoodBuddy 读取或修改默认工作目录中的内容。
执行消息会立即交给所选后端,不再逐次弹窗确认。
请只连接可信账号,并将工作目录限制在必要范围。
默认工作目录:
C:\Users\用户名
```
### 7.4 消息处理后端
每个通道项目提供相同的后端选择,不提供含义不明确的“自动”选项:
- 直连模型:默认选择“模型连接”中的默认文本连接;列出已配置的文本模型连接,不列出仅支持图像生成的连接。
- OpenCode:使用当前 OpenCode Runtime,并动态跟随“Agent Runtime”中的全局 OpenCode 模型来源、自有配置、程序路径和服务地址。
- Continue:使用当前 Continue Runtime,并动态跟随“Agent Runtime”中的全局 Continue 模型来源、自有配置和程序路径。
选择持久化在通道项目上。旧版本保存的 `auto` 选择在启动时迁移为当前默认
直连文本模型。模型连接删除、改为图片模型或凭据失效后,优先修复为默认或
首个可用文本模型;没有可用文本模型时,UI 明确提示用户完成模型配置或改选
Agent Runtime。OpenCode/Continue 的通道项目只持久化 `provider`,旧版残留的
通道级 `profileId` 在修复时移除;全局 Agent Runtime 配置变更从下一条远程
请求开始生效。远程会话记录通道项目的逻辑后端选择,不复制全局配置或凭据。
Execute 启动前检查解析后的后端是否支持工具执行,并返回可处理的配置错误。
通道面板的后端说明必须明确显示“跟随 Agent Runtime 全局配置”,不得在消息
通道设置中重复展示 OpenCode/Continue 的模型来源、自有配置文件或程序路径。
“Agent Runtime > 高级设置”中的来源选项、条件配置卡和后续路径字段保持
`12px` 区块间距,不能出现卡片边框贴合或内容归属不清。
### 7.5 通道项目会话界面
通道项目是系统管理的远程消息范围,不允许创建普通本地会话:
- 切换到通道项目时,只显示由对应客户端消息创建的远程会话。
- 隐藏“新建对话”和 `Ctrl+N` 提示;收到全局新建会话命令时不创建记录。
- 尚无远程会话时显示等待首条客户端消息的空状态和设置入口。
- 旧版本误建在通道项目中的普通本地会话不参与通道会话列表,但保留其数据。
- 远程会话底部说明客户端联动方式,只显示历史、任务和执行结果,不再提及已移除的审批流程。
- “任务与活动”页面按会话分组显示远程任务;所有分组首次进入时默认收起,包括进行中、失败和已完成状态,用户可通过原生展开控件查看明细。
### 7.6 微信扫码绑定
未绑定时显示“绑定个人微信”。扫码对话框包含:
- 本地渲染的二维码。
- 扫码和手机确认步骤。
- 二维码剩余有效时间。
- 刷新和取消操作。
- 等待扫码、已扫描、需要验证码、已连接、已过期和失败状态。
二维码过期时不得继续接受旧扫码结果。
需要配对数字时,在同一对话框中显示验证码输入。验证码不得写入日志或持久化。
绑定完成后显示“重新绑定”和“断开本机绑定”。“断开本机绑定”使用共享红色
危险操作样式,并持续说明该操作只清除本机凭据、不保证解除微信服务端授权,
也不删除通道项目、远程会话、任务、活动或成果历史。
### 7.7 企业微信和钉钉
企业微信和钉钉继续使用现有凭据表单、环境变量只读覆盖和连接测试,但增加:
- 通道项目显示。
- 消息处理后端。
- 默认处理模式。
- 默认工作目录。
- 打开通道项目。
现有发送者白名单和群聊提及设置继续有效。
## 8. 远程会话需求
### 8.1 会话创建与复用
收到合法消息后,根据以下稳定键查找会话:
```text
channel + accountId + externalConversationId
```
- 未找到时,在对应通道项目下创建远程会话。
- 已找到时继续使用现有会话。
- 微信私聊的 `externalConversationId` 首期可由绑定账号和发送者稳定标识组成。
- 不得仅按显示名称匹配会话。
- 消息重试不得创建重复会话或重复任务。
### 8.2 新建上下文
首期不提供手动“新建远程会话”入口,也不把通道项目中的全局“新建对话”
命令转为本地会话。客户端首条合法消息按稳定键自动创建远程会话,后续消息
继续复用该会话;未来如增加远程上下文重置命令,需要单独定义协议、去重和
历史保留语义。
### 8.3 展示
最近对话和聊天标题区显示:
- 通道图标和名称。
- 私聊用户或群聊名称。
- 当前连接状态。
- 默认模式。
- 未读状态。
每条远程消息记录实际模式:
- Ask
- Execute
- 执行中
- 已完成
- 失败
收到普通远程消息时不得强制切换当前页面。应增加未读标记和全局通知。
## 9. Ask 与 Execute
### 9.1 模式解析
每条消息的模式按以下优先级确定:
1. 显式 `/ask` 或“对话:”前缀使用 Ask。
2. 显式 `/execute``/exec` 或“执行:”前缀使用 Execute。
3. 没有前缀时使用通道项目的默认模式。
前缀仅用于选择模式,不进入发送给模型的正文。
### 9.2 Ask
- 在 Runtime 边界保持只读。
- 不提供工具授权回调,或所有工具请求返回拒绝。
- 不修改文件、数据库、系统状态或远程状态。
- 结果以有界文字返回原通道并写入远程会话。
### 9.3 Execute
Execute 消息通过身份、长度、去重和并发检查后:
1. 创建并立即启动远程执行任务。
2. 使用通道项目当前保存的逻辑处理后端;OpenCode/Continue 在此时解析“Agent Runtime”中的对应全局配置。
3. 将项目根目录作为本次 Runtime 工作目录。
4. 所选后端不支持工具执行时,不启动任务,并返回设置修复说明。
远程 Execute 不创建 GoodBuddy 通道专属请求确认或逐工具确认。安全边界由
发送者白名单、私聊限制、项目根目录、所选 Runtime、沙箱、能力开关和工具
安全策略共同提供。UI 必须持续说明该行为,不能让用户误以为仍会弹窗确认。
通道只回传最终结果或可操作的失败信息,不发送“执行已开始”等无操作价值的
中间状态消息。
### 9.4 工具控制
不同后端按现有行为运行:
- OpenCode 和 Continue 使用各自的工具系统、能力检查和沙箱配置。
- 直连模型只可调用已启用的内置工作区工具及已分配 MCP 工具。
- “Execute 自动授权已启用的工具”策略无需逐次确认;“禁止所有工具执行”策略拒绝所有直连模型工具调用。
- Runtime 沙箱模式继续有效。
- 任何工具结果都进入现有任务和活动审计。
### 9.5 结果回传
- 成功:回传有界文字结果。
- 当前任务生成的图片可以随最终结果回传;用户明确要求文件时,将当前任务的
有界文本结果生成为 Markdown 附件。
- 失败:回传经过脱敏、长度受限的用户可处理错误。
- 取消:回传“任务已取消”。
- 结果投递失败时保留发件箱记录并显示通道错误,不重复执行任务。
### 9.6 媒体与文件
- 单条微信消息最多接收或发送 4 个附件,解密后合计不超过 12MB。
- 入站仅处理官方图片和文件消息项。Sidecar 下载腾讯 CDN 内容并完成
AES-128-ECB 解密,Main 只接收有界字节、文件名、MIME 和大小。
- 图片进入现有视觉上下文;文本、代码、PDF 和 Office 文件进入现有不可信
文档上下文。不支持的类型显示可处理提示,不把原始 CDN 地址或密钥传给 Runtime。
- 入站附件元数据和有界预览写入远程会话,原始字节作为任务处理期间的临时上下文。
- 出站生成图片必须来自当前任务的 `generated-image` 事件。
- 出站文件只能由 Main 根据当前任务的最终文本结果生成,不接受 Runtime 路径,
不读取或发送任意现有工作区文件。
- 媒体发件箱在成功投递或达到重试上限后清除二进制负载。
## 10. 微信 ClawBot 通信架构
### 10.1 进程边界
微信通信运行在独立 Node Sidecar 中:
```text
微信
↕ 腾讯 iLink HTTPS / CDN
微信 Sidecar
↕ 严格、有界、可验证的进程协议
Main ChannelDriver
ChannelService
GoodBuddy Runtime 与工具安全策略
```
禁止:
- 在 Renderer 中加载微信通信代码。
- 向 Renderer 暴露 Token、上下文令牌或原始腾讯响应。
- 把腾讯插件直接加载进 Electron Main。
- 运行 `openclaw-weixin-cli` 安装器。
- 仅为微信通道打包完整 OpenClaw。
### 10.2 Sidecar 能力
- 获取和刷新二维码。
- 轮询扫码状态。
- 提交一次性验证码。
- 加载内存中的加密解封凭据。
- 长轮询文字、图片和文件消息。
- 从腾讯 CDN 有界下载并解密图片和文件。
- 调用 `getuploadurl`,加密上传当前任务图片和文件,并发送媒体回复。
- 保持会话 `context_token` 和同步游标。
- 有界重试、退避、停止和异常退出。
### 10.3 协议扩展
现有 `wechat-sidecar-protocol.ts` 需要拆分为两个方向:
Sidecar 到 Main
- `status`
- `qr`
- `verification_required`
- `connected`
- `inbound_message`,可包含有界图片或文件
- `reply_result`
- `fatal_error`
Main 到 Sidecar
- `start_login`
- `submit_verification`
- `start_account`
- `reply`,可包含有界图片或文件
- `cancel_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 和主机验证。
- Sidecar 使用独立环境允许列表并显式启用证书验证,不继承
`NODE_TLS_REJECT_UNAUTHORIZED=0`、代理变量、Node 加载钩子或提供商凭据。
- 日志中的 URL 移除查询字符串,响应体对 Token 和上下文令牌脱敏。
- 媒体下载和上传只允许腾讯微信 HTTPS 主机,所有重定向逐跳重新校验。
- CDN 响应按流读取并在解密前后分别执行硬字节限制,不信任 `Content-Length`
文件名、MIME、扩展名或服务端声明的原始大小。
### 11.3 断开与解绑
产品区分:
- 停用:停止收发,保留本地绑定凭据。
- 断开本机绑定:停止收发并清除本地凭据;入口使用红色危险操作样式。
- 微信端解除绑定:只有腾讯提供并验证服务端撤销能力后才可承诺。
当前不得把本地清除描述为“已在微信端彻底解绑”。断开后保留通道项目、
远程会话、任务、活动和成果历史。
## 12. 数据与契约建议
### 12.1 Project
为项目增加可向后兼容的来源字段:
```ts
type ProjectKind = 'user' | 'channel'
type ProjectChannel = 'weixin' | 'wecom' | 'dingtalk'
```
通道项目包含:
- `kind: 'channel'`
- `channel`
- `runtimeSelection`
- 稳定且唯一的通道绑定
现有项目迁移为 `kind: 'user'`。不得通过项目名称推断通道。
### 12.2 Conversation
增加远程会话映射,至少包含:
- `conversationId`
- `projectId`
- `channel`
- `accountId`
- `externalConversationId`
- `conversationType`
- 脱敏显示名
- 创建和最近消息时间
唯一约束:
```text
channel + accountId + externalConversationId
```
### 12.3 Channel Settings
通道公开设置增加:
- `projectId`
- `defaultWorkMode`
- `runtimeSelection`
- `rootPath`
- `status`
微信私有设置增加加密字段:
- bot token
- bot/account ID
- 绑定用户 ID
- 经验证的 API base URL
Renderer 快照只返回是否已配置和脱敏标识。
### 12.4 任务来源
远程任务保留:
- 通道项目 ID。
- 远程会话 ID。
- 通道。
- 脱敏发送者。
- 实际工作模式。
- 实际消息处理后端。
任务队列可以复用 delegation 调度分类,但 UI 和活动审计必须依据通道项目与
远程会话持续显示真实通道来源,不得呈现为普通本地任务。
## 13. IPC 与 Preload
建议增加窄接口:
- 获取通道设置快照。
- 保存通道项目配置。
- 开始微信扫码。
- 刷新微信扫码。
- 提交微信验证码。
- 断开微信本地连接。
- 订阅微信连接状态。
- 打开对应通道项目。
所有 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. 可访问性与响应式
- 通道状态同时使用文字和图标。
- 三个通道使用共享 `PageTabs``segmented` 外观,保留页签语义和方向键切换。
- 模式选择使用语义化单选/分段控件和方向键。
- 消息处理后端使用持久标签和分组选项,并说明当前选择的实际行为。
- 二维码提供状态文字和备用刷新操作,但不把敏感二维码链接作为可复制文本。
- 验证码错误与输入框建立 `aria-describedby` 关联。
- 关闭对话框后焦点返回触发按钮。
- 窄窗口下卡片单列,二维码对话框保留 16px 外边距。
- 浅色、深色和 200% 文字缩放下可完成绑定、后端选择和保存。
## 16. 验收标准
### 16.1 通道项目
- [ ] 新安装首次启动后存在微信 ClawBot、企业微信和钉钉三个通道项目。
- [ ] 重启应用不会重复创建通道项目。
- [ ] 同名普通项目不会被占用或修改。
- [ ] 通道项目默认根目录为当前用户目录,默认模式为 Ask。
- [ ] 通道项目在项目选择器的“远程通道”分组中显示。
- [ ] 停用或断开通道不会删除项目和历史。
- [ ] 普通项目删除流程不能永久删除通道项目。
### 16.2 设置卡片
- [ ] 设置标签显示为“消息通道”。
- [ ] 三个通道使用与模型设置一致的分段外观页签,并保留完整页签键盘语义。
- [ ] 三个面板均显示项目、根目录、消息处理后端、默认模式和连接状态。
- [ ] 微信卡片可以完成扫码、过期刷新、验证码和连接状态展示。
- [ ] “断开本机绑定”使用共享红色危险操作样式,并明确说明只清除本机凭据、不删除历史或承诺服务端解绑。
- [ ] 不显示“自动”后端;首次创建和旧版 `auto` 配置均落到默认直连文本模型。
- [ ] 直连模型只列出文本连接,OpenCode 与 Continue 可直接选择。
- [ ] 选择 OpenCode/Continue 时只保存 Runtime 类型,每次远程请求动态跟随“Agent Runtime”中的对应全局配置,通道页不出现第二套 Runtime 配置。
- [ ] Agent Runtime 高级设置的来源选项、条件配置卡和路径字段之间保持 `12px` 间距且无横向溢出。
- [ ] 默认 Execute 时持续显示目录范围和无逐次确认的风险说明。
- [ ] Renderer 无法读取任何微信 Token 或上下文令牌。
### 16.3 会话
- [ ] 不同通道的消息进入不同通道项目。
- [ ] 不同发送者或群聊进入独立远程会话。
- [ ] 重复平台事件不会创建重复会话、消息或任务。
- [ ] 最近对话、聊天标题和消息均能识别通道与发送者。
- [ ] 收到普通消息不会强制切换当前页面。
- [ ] 切换到通道项目不会创建普通本地会话。
- [ ] 通道项目隐藏“新建对话”和 `Ctrl+N`,全局快捷命令也不创建会话。
- [ ] 没有远程会话时显示等待客户端首条消息的空状态。
- [ ] “任务与活动”中的会话分组默认收起,进行中、失败和已完成状态行为一致。
- [ ] 微信图片和文件显示在对应远程消息中,附件消息无需附带文字。
- [ ] 支持的附件进入所选后端现有图片或文档上下文;不支持和超限附件返回明确提示。
### 16.4 Ask
- [ ] 普通消息默认按卡片配置进入 Ask。
- [ ] Ask 在 Runtime 边界拒绝所有工具。
- [ ] 有界结果回传原通道并写入远程会话。
### 16.5 Execute
- [ ] 默认 Execute 或显式执行前缀会立即使用通道项目所选后端。
- [ ] 不显示通道专属请求级或逐工具确认。
- [ ] 直连模型、OpenCode 和 Continue 均按各自能力正确路由。
- [ ] 通道不发送“执行已开始”等中间占位消息,只发送最终结果或可操作失败。
- [ ] 任务使用对应通道项目根目录。
- [ ] Runtime、沙箱、能力和直连模型工具安全策略继续生效。
- [ ] 任务、活动、工具、成果和最终结果关联到通道项目与远程会话。
### 16.6 生命周期与安全
- [ ] Sidecar 异常退出不会导致 Main 崩溃,并有有界重启限制。
- [ ] 应用退出会取消长轮询并停止 Sidecar。
- [ ] 微信凭据使用系统安全存储加密。
- [ ] 任何普通日志、IPC、错误和通知中不存在凭据。
- [ ] Token 只发送到已审核的腾讯 HTTPS 主机。
- [ ] CDN 下载、上传和每次重定向只访问腾讯微信 HTTPS 主机。
- [ ] 入站和出站媒体最多 4 个、合计不超过 12MB,AES 密钥和 CDN URL 不跨越 Sidecar 边界。
- [ ] 只有当前任务生成图片或 Main 从本次最终文本生成的文件可以作为出站附件。
## 17. 实施阶段
### 阶段一:通道项目基础
- Project 数据迁移与通道类型。
- 三个通道项目幂等创建。
- 项目选择器“远程通道”分组。
- 三张设置卡片接入项目、目录和模式配置。
- 企业微信、钉钉消息建立独立远程会话。
### 阶段二:微信文字通道
- 微信 iLink Sidecar。
- 扫码、验证码、加密凭据和生命周期。
- 微信文字收发与稳定去重。
- 微信远程会话。
- Ask 模式。
### 阶段三:受控 Execute
- 通道项目处理后端选择与失效修复。
- OpenCode/Continue 通道后端动态跟随全局 Agent Runtime 配置。
- Execute Runtime 接入。
- 直连模型工具安全策略和活动关联。
- 结果回传、取消、超时和失败恢复。
### 阶段四:微信媒体
- 图片和文件 CDN 下载、AES 解密与有界上下文。
- 生成图片和 Main 生成的任务结果文件加密上传与回复。
- 远程会话附件展示和媒体发件箱清理。
### 阶段五:后续扩展
- 有界语音和视频。
- 多微信账号。
- 更细的项目路由。
- 已验证的微信端解除绑定。
## 18. 测试要求
至少覆盖:
- 数据迁移和通道项目幂等创建。
- 同名普通项目隔离。
- 设置 Schema 与 Renderer 脱敏快照。
- QR 状态机、过期、验证码和非法转换。
- Sidecar 双向协议未知字段、超长字段和凭据泄漏拒绝。
- 腾讯主机允许列表和重定向校验。
- CDN 媒体 AES 加解密、流式大小限制、声明大小校验和恶意重定向拒绝。
- 附件持久化展示、现有上下文接入、生成图片回传和任务成果目录隔离。
- 消息去重、会话映射、并发和取消。
- Ask 工具拒绝。
- Execute 使用直连模型、OpenCode 和 Continue 的路由。
- OpenCode/Continue 通道只保存 Runtime 类型,并在 Ask 与 Execute 开始时解析当前全局 Agent Runtime 配置。
- Execute 不创建通道专属审批,直连模型禁止工具策略仍然生效。
- 模型连接删除后的通道后端选择修复。
- 发件箱投递失败不重复执行。
- 项目选择器、分段页签、后端选择、设置面板和扫码对话框的键盘与无障碍行为。
- Runtime 高级设置区块间距、微信断开危险按钮和任务活动默认折叠的 UI 回归。
- Windows、macOS、Linux 的默认用户目录和 Sidecar 关闭行为。
实现完成后运行:
```text
npm test
npm run typecheck
npm run lint
npm run build
```
## 19. 发布条件
满足以下条件后才可默认向用户提供微信 Execute:
1. 微信文字 Ask 全流程稳定。
2. UI 明确说明远程 Execute 会立即运行,且默认工作目录和处理后端始终可见。
3. 凭据不会进入 Renderer、日志或普通子进程参数。
4. Sidecar 网络目标和重定向已实施严格允许列表。
5. 通道项目和远程会话的来源标识在所有入口持续可见。
6. 任务重复投递不会导致重复执行。
7. 应用退出、断线和更新过程中不会留下失控执行,直连模型禁止工具策略不能被远程来源绕过。
8. 腾讯 iLink 独立宿主使用范围和本地断开语义已完成发布前确认。