# 远程消息通道项目与微信 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 独立宿主使用范围和本地断开语义已完成发布前确认。
