- Created a new test file `channels.test.ts` to cover utilities related to channel configurations and targets. - Implemented tests for normalizing and grouping selected channels by type, as well as building channel targets from account data and cron history. - Mocked necessary dependencies to isolate tests and ensure accurate results. - Updated `vite.config.ts` to set up the testing environment with jsdom and enable global variables for tests.
982 lines
28 KiB
Markdown
982 lines
28 KiB
Markdown
# ClawX 消息频道功能迁移到 zn-ai 的开发计划
|
||
|
||
## 1. 背景与目标
|
||
|
||
这次迁移的目标不是把 `zn-ai` 当前的 `/channels` 页面做得“更好看”,而是把它从“频道/账号归属管理页”升级成接近 `ClawX` 的完整消息频道控制台。
|
||
|
||
期望对齐的能力边界如下:
|
||
|
||
1. 渲染层页面结构对齐 `ClawX`
|
||
- 顶部标题区
|
||
- `Refresh`
|
||
- Gateway 健康横幅与 diagnostics
|
||
- 已配置频道列表
|
||
- 支持的频道列表
|
||
- 频道配置弹窗
|
||
- 删除确认与收敛刷新
|
||
2. 主进程 / Host API 对齐 `ClawX`
|
||
- `/api/channels/accounts`
|
||
- `/api/channels/targets`
|
||
- `/api/channels/config`
|
||
- `/api/channels/default-account`
|
||
- `/api/channels/binding`
|
||
- `/api/channels/config/enabled`
|
||
- `/api/channels/credentials/validate`
|
||
- QR 登录相关接口
|
||
3. 运行时链路对齐 `ClawX`
|
||
- 多账号配置
|
||
- 默认账号切换
|
||
- gateway reload / restart 策略
|
||
- runtime health summary
|
||
- diagnostics snapshot
|
||
4. 测试基线对齐 `ClawX`
|
||
- 单测覆盖配置、账号 ID、状态推断
|
||
- E2E 覆盖绑定、诊断、账号编辑与回归场景
|
||
|
||
一句话总结:
|
||
|
||
- `zn-ai` 需要从“只会改归属”升级为“可配置、可诊断、可验证、可收敛”的消息频道域。
|
||
|
||
## 2. ClawX 基线结论
|
||
|
||
## 2.1 页面职责不是“绑定页”,而是“频道控制台”
|
||
|
||
`ClawX/src/pages/Channels/index.tsx` 承担的不是单一绑定入口,而是完整控制台:
|
||
|
||
- 管理已配置频道与账号
|
||
- 展示支持的频道目录
|
||
- 打开配置弹窗
|
||
- 修改账号到 Agent 的绑定
|
||
- 删除账号或整条频道配置
|
||
- 展示 Gateway 健康状态
|
||
- 复制 / 展开 diagnostics
|
||
- 在 gateway 重启或 channel-status 事件后做收敛刷新
|
||
|
||
这决定了 `zn-ai` 不能继续停留在“表单 + 下拉框”的结构。
|
||
|
||
## 2.2 渲染层 IA
|
||
|
||
ClawX 的 UI 信息架构可以概括成三层:
|
||
|
||
1. 页面层
|
||
- 标题、副标题、刷新按钮
|
||
2. 运行态层
|
||
- gateway warning
|
||
- gateway degraded / unresponsive banner
|
||
- diagnostics 操作与展开区
|
||
3. 资源层
|
||
- `Configured Channels`
|
||
- `Supported Channels`
|
||
- `ChannelConfigModal`
|
||
|
||
其中两个关键特征必须保留:
|
||
|
||
- “已配置频道”和“支持的频道”是并列区块,不是同一张表的两种状态。
|
||
- `ChannelConfigModal` 是核心交互入口,不是可有可无的附属表单。
|
||
|
||
## 2.3 关键交互流程
|
||
|
||
ClawX 的前端交互主线如下:
|
||
|
||
1. 页面初次加载时并行拉取 `/api/channels/accounts` 与 `/api/agents`
|
||
2. `Refresh` 触发 `probe=true` 的强探测拉取
|
||
3. `gateway:channel-status` 事件到达后节流刷新
|
||
4. Gateway 状态从非 `running` 变为 `running` 后触发一轮收敛刷新
|
||
5. 点击“添加账号”后根据频道类型决定是否生成默认 `accountId`
|
||
6. 配置弹窗内根据 `connectionType` 分为:
|
||
- `token`
|
||
- `qr`
|
||
- `oauth/webhook` 扩展位
|
||
7. 保存配置后不是立即认为状态稳定,而是继续做延迟回拉
|
||
8. 删除配置后先本地移除,再补一次延迟拉取,避免旧状态回刷
|
||
|
||
这说明 `zn-ai` 迁移时不能只做 API 调用本身,还要迁移“刷新与收敛策略”。
|
||
|
||
## 2.4 前端状态模型
|
||
|
||
ClawX 页面目前虽然写在单文件里,但隐含了一套很清晰的状态模型:
|
||
|
||
- `channelGroups`
|
||
- `agents`
|
||
- `gatewayHealth`
|
||
- `diagnosticsSnapshot`
|
||
- `selectedChannelType`
|
||
- `selectedAccountId`
|
||
- `allowExistingConfig`
|
||
- `allowEditAccountId`
|
||
- `existingAccountIds`
|
||
- `initialConfigValues`
|
||
- `deleteTarget`
|
||
- `fetchInFlight`
|
||
- `queuedFetchOptions`
|
||
- `convergenceRefreshTimers`
|
||
|
||
迁移到 `zn-ai` 时,建议不要继续把这些状态直接堆在页面组件里,而要拆成:
|
||
|
||
- `channelsApi`
|
||
- `useChannelsPageController`
|
||
- `ChannelConfigModal`
|
||
- `ChannelDiagnosticsPanel`
|
||
- `ChannelGroupCard`
|
||
|
||
## 2.5 主进程 API 面
|
||
|
||
ClawX 的 `electron/api/routes/channels.ts` 是一个“厚路由”,负责:
|
||
|
||
- 构建频道账号视图
|
||
- accountId canonical 校验与 legacy 兼容
|
||
- 默认账号切换
|
||
- binding 写入与清理
|
||
- config 读写
|
||
- credentials validate
|
||
- channel enabled 切换
|
||
- WeChat / WhatsApp 登录流程
|
||
- target 目录发现
|
||
- gateway reload / restart 调度
|
||
|
||
也就是说,消息频道域在 ClawX 中是“本地 Host API 优先”的能力,而不是依赖远端 API 的薄代理。
|
||
|
||
## 2.6 配置持久化模型
|
||
|
||
ClawX 的配置核心语义不是“频道只有一条 token”,而是:
|
||
|
||
- 一个频道类型可有多个账号
|
||
- `defaultAccount` 是路由与展示的重要字段
|
||
- 普通频道使用 `accounts.<accountId>` 多账号结构
|
||
- 某些 strict-schema channel 仍需扁平写法
|
||
- 默认账号配置会镜像到 channel 顶层
|
||
- 旧 flat 结构仍然兼容
|
||
- 绑定关系与频道配置共享同一份配置语义
|
||
|
||
这对 `zn-ai` 的启示是:
|
||
|
||
- 需要先定义消息频道的持久化模型,再谈 UI。
|
||
- 如果只补页面而不补多账号配置模型,后面会反复返工。
|
||
|
||
## 2.7 Gateway 与 Diagnostics
|
||
|
||
ClawX 的运行态处理有三个关键点:
|
||
|
||
1. `channels.status` 不等于“纯连接态”
|
||
- 会结合 `running`
|
||
- `lastError`
|
||
- recent activity
|
||
- probe 结果
|
||
2. 并非所有 channel save 都能通过热 reload 收敛
|
||
- 很多频道命中 `FORCE_RESTART_CHANNELS`
|
||
3. degraded != stopped
|
||
- gateway 仍在运行时也可能因为 health timeout 被标成 degraded
|
||
|
||
迁移到 `zn-ai` 时,Gateway 状态与频道状态不要混为一谈。
|
||
|
||
## 2.8 测试基线
|
||
|
||
ClawX 的消息频道测试不是只测接口返回,而是测整条用户链路:
|
||
|
||
- unit
|
||
- channel routes
|
||
- channel config
|
||
- channel status
|
||
- channels page
|
||
- e2e
|
||
- binding regression
|
||
- account ID validation
|
||
- account persistence
|
||
- health diagnostics
|
||
|
||
这意味着 `zn-ai` 迁移计划必须从一开始就带测试分工,不能把测试留到最后补。
|
||
|
||
## 3. zn-ai 当前现状
|
||
|
||
## 3.1 已有能力
|
||
|
||
`zn-ai` 当前已经具备以下基础:
|
||
|
||
1. 独立 `/channels` 路由与侧边栏入口
|
||
2. 频道页可拉取 `/api/channels/accounts`
|
||
3. 频道页已支持:
|
||
- 频道级归属
|
||
- 账号级归属
|
||
4. 本地已有:
|
||
- `/api/channels/accounts`
|
||
- `/api/channels/targets`
|
||
- `/api/channels/binding`
|
||
5. `electron/utils/channels.ts` 已能做:
|
||
- selected channel 归一化
|
||
- channel/account 分组
|
||
- target 候选构建
|
||
- 与 Cron 历史目标复用
|
||
6. `agentsStore` 已保存:
|
||
- `channelOwners`
|
||
- `channelAccountOwners`
|
||
7. Agents 页已经把 Channels 视为归属写入口
|
||
|
||
## 3.2 当前最大缺口
|
||
|
||
相对于 ClawX,`zn-ai` 目前缺少的不是某一个按钮,而是整个消息频道域的“控制面”:
|
||
|
||
1. 没有 `supported channels` 目录区
|
||
2. 没有 `ChannelConfigModal`
|
||
3. 没有账号新增 / 编辑 / 删除链路
|
||
4. 没有默认账号切换
|
||
5. 没有 channel enabled / disabled 语义
|
||
6. 没有 credentials validate
|
||
7. 没有 plugin install / QR login 流程
|
||
8. 没有 Gateway 健康横幅与 diagnostics
|
||
9. 没有 ClawX 那套收敛刷新机制
|
||
10. `/api/channels/targets` 仍优先走 upstream,而不是本地闭环
|
||
|
||
因此当前 `zn-ai/src/pages/Channels/index.tsx` 更像“归属控制页”,而不是“消息频道控制台”。
|
||
|
||
## 3.3 可复用资产
|
||
|
||
迁移时不需要全部推倒重来,以下内容建议保留并扩展:
|
||
|
||
- `zn-ai/src/pages/Channels/index.tsx`
|
||
- 现有页面容器
|
||
- refresh / error / feedback 壳
|
||
- `zn-ai/electron/api/routes/channels.ts`
|
||
- 现有 binding 与 catalog 路由骨架
|
||
- `zn-ai/electron/utils/channels.ts`
|
||
- 目录归一化
|
||
- target 候选生成
|
||
- `zn-ai/electron/utils/agent-config.ts`
|
||
- `channelOwners`
|
||
- `channelAccountOwners`
|
||
- `zn-ai/src/stores/agents.ts`
|
||
- runtime changed 刷新链路
|
||
- `zn-ai` 现有 router / sidebar / i18n 基础
|
||
|
||
## 4. 迁移原则
|
||
|
||
## 4.1 功能对齐 ClawX,存储实现适配 zn-ai
|
||
|
||
不建议机械复制 ClawX 的 `~/.openclaw/openclaw.json` 存储方式。
|
||
|
||
更适合 `zn-ai` 的方式是:
|
||
|
||
1. 交互、API 语义、运行态策略对齐 ClawX
|
||
2. 底层存储适配 `zn-ai` 当前 `userData` 模式
|
||
3. 需要兼容 OpenClaw runtime 的字段时,优先采用兼容 schema
|
||
|
||
建议方案:
|
||
|
||
- 新增 `channels.json` 作为频道配置真相源
|
||
- `agents.json` 继续保存 Agent 域信息
|
||
- Phase 1 先保留 `channelOwners` / `channelAccountOwners` 在 `agents.json`
|
||
- Phase 3 再评估是否合并成统一 `runtime-config.json`
|
||
|
||
这样可以先拿到功能对齐,再决定是否做配置域收敛。
|
||
|
||
## 4.2 Host API 以本地优先为原则
|
||
|
||
消息频道迁移完成后,`zn-ai` 不应该继续把关键频道能力优先转发到 upstream。
|
||
|
||
最低要求:
|
||
|
||
- `/api/channels/accounts` 本地完成
|
||
- `/api/channels/targets` 本地完成
|
||
- `/api/channels/config*` 本地完成
|
||
- diagnostics 本地完成
|
||
|
||
否则 UI 与 runtime 的一致性会很差。
|
||
|
||
## 4.3 维持页面职责边界
|
||
|
||
迁移后依然保持:
|
||
|
||
- `Agents`
|
||
- 展示摘要
|
||
- 提供跳转入口
|
||
- `Channels`
|
||
- channel/account 配置与绑定唯一写入口
|
||
- `Cron`
|
||
- 消费 channel/account/target 目录
|
||
|
||
不要把 Channels 的写操作再反向塞回 Agents 页。
|
||
|
||
## 5. 推荐的目标文件映射
|
||
|
||
| ClawX 参考 | zn-ai 目标 |
|
||
| --- | --- |
|
||
| `src/pages/Channels/index.tsx` | `src/pages/Channels/index.tsx` 扩展为控制台 |
|
||
| `src/components/channels/ChannelConfigModal.tsx` | 新增 `src/components/channels/ChannelConfigModal.tsx` |
|
||
| `src/types/channel.ts` | 新增 `src/lib/channel-meta.ts` 或扩展 `src/lib/channel-types.ts` |
|
||
| `electron/api/routes/channels.ts` | 扩展 `electron/api/routes/channels.ts` |
|
||
| `electron/utils/channel-config.ts` | 新增 `electron/utils/channel-config.ts` |
|
||
| `electron/utils/channel-status.ts` | 新增 `electron/utils/channel-status.ts` |
|
||
| `electron/utils/wechat-login.ts` / `whatsapp-login.ts` | 新增 `electron/utils/channel-integrations/*` |
|
||
| `electron/utils/plugin-install.ts` | 新增 `electron/utils/channel-plugin-install.ts` |
|
||
| `tests/unit/channels-page.test.tsx` | 新增 `tests/unit/channels-page.test.tsx` |
|
||
| `tests/e2e/channels-*.spec.ts` | 新增 `tests/e2e/channels-*.spec.ts` |
|
||
|
||
## 6. 分阶段迁移计划
|
||
|
||
## Phase 0:模型冻结与接口清单
|
||
|
||
目标:
|
||
|
||
- 先冻结频道域模型,避免 UI 和后端分头实现后再返工。
|
||
|
||
交付:
|
||
|
||
1. 设计 `channels.json` 结构
|
||
- channel type
|
||
- accounts
|
||
- defaultAccountId
|
||
- enabled
|
||
- metadata
|
||
2. 明确 binding 真相源暂时仍在 `agents.json`
|
||
3. 明确 channel meta schema
|
||
- `name`
|
||
- `description`
|
||
- `connectionType`
|
||
- `configFields`
|
||
- `instructions`
|
||
- `docsUrl`
|
||
- `isPlugin`
|
||
4. 列出本地 Host API 终态清单
|
||
|
||
完成标准:
|
||
|
||
- 频道配置模型定稿
|
||
- route 清单定稿
|
||
- 前后端字段命名定稿
|
||
|
||
## Phase 1:后端基础设施对齐
|
||
|
||
目标:
|
||
|
||
- 先补齐本地配置读写与目录构建,让前端有可依赖的数据面。
|
||
|
||
交付:
|
||
|
||
1. 新增 `electron/utils/channel-config.ts`
|
||
2. 扩展 `electron/api/routes/channels.ts`
|
||
- `GET /api/channels/accounts`
|
||
- `GET /api/channels/config/:type`
|
||
- `POST /api/channels/config`
|
||
- `DELETE /api/channels/config/:type`
|
||
- `PUT /api/channels/default-account`
|
||
- `PUT /api/channels/config/enabled`
|
||
3. 将 `/api/channels/targets` 收回本地优先
|
||
4. 让 `accounts` 视图同时拼接:
|
||
- channel config
|
||
- agent binding
|
||
- runtime snapshot
|
||
|
||
完成标准:
|
||
|
||
- `zn-ai` 本地已能维护多账号频道配置
|
||
- 默认账号切换可用
|
||
- 无需 upstream 也能拿到 targets
|
||
|
||
## Phase 2:运行时与诊断链路对齐
|
||
|
||
目标:
|
||
|
||
- 把 ClawX 的 runtime 行为补进来,而不是只有配置文件。
|
||
|
||
交付:
|
||
|
||
1. 新增 `electron/utils/channel-status.ts`
|
||
2. 增加 credentials validate
|
||
3. 增加 diagnostics snapshot 与 gateway health summary
|
||
4. 增加 gateway reload / restart 策略
|
||
5. 引入 QR / plugin channel 的集成层
|
||
- WeChat
|
||
- WhatsApp
|
||
- 其他 plugin channel 预留
|
||
6. 在 runtime changed 里补齐:
|
||
- `channels`
|
||
- `channel-targets`
|
||
- `agents`
|
||
|
||
完成标准:
|
||
|
||
- 配置保存后能正确触发 reload / restart
|
||
- 页面可感知 degraded / unresponsive
|
||
- diagnostics 可复制 / 展开
|
||
|
||
## Phase 3:前端页面与弹窗对齐
|
||
|
||
目标:
|
||
|
||
- 把 `zn-ai` 的 `/channels` 从绑定页升级成控制台。
|
||
|
||
交付:
|
||
|
||
1. 重构 `src/pages/Channels/index.tsx`
|
||
- 标题区
|
||
- Refresh
|
||
- 健康横幅
|
||
- diagnostics 面板
|
||
- configured groups
|
||
- supported channels
|
||
2. 新增 `src/components/channels/ChannelConfigModal.tsx`
|
||
- 类型选择
|
||
- token 配置
|
||
- QR 流程
|
||
- accountId 编辑与校验
|
||
- 预加载已有配置
|
||
3. 引入前端 channel meta schema
|
||
4. 引入收敛刷新策略
|
||
- `gateway:channel-status`
|
||
- gateway running 过渡
|
||
- 删除后延迟刷新
|
||
5. 补消息频道相关 i18n 文案
|
||
|
||
完成标准:
|
||
|
||
- 视觉结构与 ClawX 接近
|
||
- 新增 / 编辑 / 删除 / 绑定 / 刷新 / 诊断链路闭环
|
||
|
||
## Phase 4:回归测试与联调收口
|
||
|
||
目标:
|
||
|
||
- 在 parity 接近完成后补齐防回归能力。
|
||
|
||
交付:
|
||
|
||
1. unit tests
|
||
- channel routes
|
||
- channel config
|
||
- channel status
|
||
- channels page
|
||
2. e2e tests
|
||
- 新增账号默认不自动绑定
|
||
- 非 canonical accountId 被拦截
|
||
- 编辑已有账号保持配置值
|
||
- diagnostics 复制 / 展开 / restart
|
||
3. 更新迁移文档与 smoke checklist
|
||
|
||
完成标准:
|
||
|
||
- 关键回归路径有自动化覆盖
|
||
- 频道页不再依赖人工回归
|
||
|
||
## 7. Sub-agent 数量估算与分工建议
|
||
|
||
## 7.1 分析阶段建议:3 个 sub-agent
|
||
|
||
分析阶段建议 3 个 sub-agent,正好对应这次拆法:
|
||
|
||
1. `Renderer Explorer`
|
||
- 负责 `ClawX` 页面 IA、弹窗、事件收敛与前端测试
|
||
2. `Main Process Explorer`
|
||
- 负责 `ClawX` routes、config、gateway、diagnostics、QR / plugin 流程
|
||
3. `Gap Explorer`
|
||
- 负责 `zn-ai` 现状、可复用模块与差距评估
|
||
|
||
这样能最快把“前端长什么样”“后端怎么跑”“zn-ai 现在到哪一步了”三件事拆开。
|
||
|
||
## 7.2 实施阶段建议:5 个 sub-agent(结构性对齐基线)
|
||
|
||
真正进入开发阶段,建议 5 个 sub-agent,已经接近并行上限,再多会明显增加冲突成本。
|
||
|
||
### Agent 1:Channels 页面壳与 Diagnostics UI
|
||
|
||
负责文件:
|
||
|
||
- `src/pages/Channels/index.tsx`
|
||
- `src/components/channels/ChannelDiagnosticsPanel.tsx`
|
||
- `src/components/channels/ChannelGroupCard.tsx`
|
||
|
||
职责:
|
||
|
||
- 页面 IA
|
||
- configured / supported 列表
|
||
- health banner
|
||
- diagnostics 展开与复制
|
||
- 页面级收敛刷新
|
||
|
||
### Agent 2:ChannelConfigModal 与前端 schema / i18n
|
||
|
||
负责文件:
|
||
|
||
- `src/components/channels/ChannelConfigModal.tsx`
|
||
- `src/components/channels/*`
|
||
- `src/lib/channel-meta.ts`
|
||
- `src/lib/channel-types.ts`
|
||
- `src/i18n/messages.ts` 或新增 locale 文件
|
||
|
||
职责:
|
||
|
||
- 类型选择
|
||
- token / QR 表单
|
||
- accountId 编辑校验
|
||
- docs / instructions / badge
|
||
- 文案与 schema 收敛
|
||
|
||
### Agent 3:配置持久化与 Host API 核心
|
||
|
||
负责文件:
|
||
|
||
- `electron/api/routes/channels.ts`
|
||
- `electron/utils/channel-config.ts`
|
||
- `electron/utils/agent-config.ts`
|
||
|
||
职责:
|
||
|
||
- config CRUD
|
||
- default account
|
||
- enabled / disabled
|
||
- binding 与视图拼装
|
||
- canonical / legacy accountId 处理
|
||
|
||
### Agent 4:Runtime / Gateway / Targets / Channel Integrations
|
||
|
||
负责文件:
|
||
|
||
- `electron/utils/channel-status.ts`
|
||
- `electron/utils/channels.ts`
|
||
- `electron/main.ts`
|
||
- `electron/gateway/**`
|
||
- `electron/utils/channel-integrations/*`
|
||
|
||
职责:
|
||
|
||
- local targets
|
||
- gateway health summary
|
||
- reload / restart 策略
|
||
- runtime 事件广播
|
||
- QR / plugin channel 集成
|
||
|
||
### Agent 5:测试与联调收口
|
||
|
||
负责文件:
|
||
|
||
- `tests/unit/**`
|
||
- `tests/e2e/**`
|
||
- `docs/**`
|
||
|
||
职责:
|
||
|
||
- 建单测 / E2E 基线
|
||
- 做回归矩阵
|
||
- 跟进 smoke checklist
|
||
- 收敛文档和验收口径
|
||
|
||
## 7.3 推荐执行顺序
|
||
|
||
建议顺序:
|
||
|
||
1. Agent 3 与 Agent 4 先行
|
||
2. Agent 2 在 schema 稳定后进入
|
||
3. Agent 1 在 API 能返回完整视图后进入
|
||
4. Agent 5 全程跟进,但在 Phase 3 后集中补全
|
||
|
||
原因:
|
||
|
||
- 消息频道功能是典型的“后端语义先行”场景。
|
||
- 如果没有 config 模型、runtime 状态和 targets 本地化,前端很容易做成半成品。
|
||
|
||
## 7.4 完全对齐 ClawX 的 sub-agent 数量估算
|
||
|
||
如果目标从“结构性对齐”提升到“功能与运行时行为尽量完全对齐 ClawX”,建议按“不包含主控 Codex”的口径重新估算 sub-agent 数量。
|
||
|
||
建议口径如下:
|
||
|
||
1. 最小编制:`5` 个 sub-agent
|
||
- 适合完成页面结构、核心 Host API、多账号配置、基础 diagnostics
|
||
- 风险是 QR / plugin channel、target 目录发现、自动化测试会相互挤压
|
||
2. 推荐编制:`7` 个 sub-agent
|
||
- 适合并行推进后端配置、Host API、runtime/gateway、频道集成、前端控制台、弹窗/i18n、测试收口
|
||
- 这是“期望完全对齐 ClawX”时最均衡的方案
|
||
3. 峰值编制:`8` 个 sub-agent
|
||
- 仅建议在 Phase 2 到 Phase 4 短时启用
|
||
- 用于把“核心 token 类 channel 集成”和“QR / plugin channel 集成”拆成两个独立实施包
|
||
|
||
结论:
|
||
|
||
- 如果只是完成可演示版本,`5` 个 sub-agent 足够。
|
||
- 如果目标是尽量完全对齐 `ClawX`,推荐采用 `7` 个 sub-agent。
|
||
- 如果要求在较短周期内把 connector 细节与测试一起收口,峰值可以提升到 `8` 个 sub-agent,但不建议长期保持。
|
||
|
||
## 7.5 完全对齐场景下的推荐分工
|
||
|
||
推荐编制:`7` 个 sub-agent + `1` 个主控 Codex。
|
||
|
||
主控 Codex 职责:
|
||
|
||
- 维护总计划
|
||
- 冻结接口契约
|
||
- 处理跨 agent 冲突
|
||
- 合并阶段成果
|
||
- 做最终验收与回归判断
|
||
|
||
### Agent A:配置模型与持久化 Owner
|
||
|
||
负责范围:
|
||
|
||
- `electron/utils/channel-config.ts`
|
||
- `electron/utils/agent-config.ts` 中与 `channelOwners` / `channelAccountOwners` 交界的部分
|
||
- `channels.json` 或等价配置模型定义
|
||
|
||
核心任务:
|
||
|
||
- 定义多账号配置模型
|
||
- 定义 `defaultAccountId`
|
||
- 定义 `enabled`
|
||
- 定义 legacy accountId / canonical accountId 兼容规则
|
||
- 定义配置读写与删除语义
|
||
|
||
交付件:
|
||
|
||
- 本地频道配置真相源
|
||
- config CRUD 基础能力
|
||
- 配置 schema 文档
|
||
|
||
### Agent B:Host API 与视图拼装 Owner
|
||
|
||
负责范围:
|
||
|
||
- `electron/api/routes/channels.ts`
|
||
- `electron/api/router.ts`
|
||
- `electron/main.ts` 中 Host API 优先级分流逻辑
|
||
|
||
核心任务:
|
||
|
||
- 扩展 `/api/channels/accounts`
|
||
- 扩展 `/api/channels/config/:type`
|
||
- 扩展 `/api/channels/config`
|
||
- 扩展 `/api/channels/default-account`
|
||
- 扩展 `/api/channels/config/enabled`
|
||
- 收回 `/api/channels/targets` 的本地优先权
|
||
|
||
交付件:
|
||
|
||
- 完整本地 channels Host API
|
||
- 视图层所需的统一返回结构
|
||
- upstream fallback 清理方案
|
||
|
||
### Agent C:Runtime / Gateway / Diagnostics Owner
|
||
|
||
负责范围:
|
||
|
||
- `electron/utils/channel-status.ts`
|
||
- `electron/gateway/**`
|
||
- `electron/main.ts`
|
||
- diagnostics 相关 route / util
|
||
|
||
核心任务:
|
||
|
||
- 构建 channel runtime status 推断逻辑
|
||
- 接入 gateway health summary
|
||
- 定义 reload / restart 策略
|
||
- 广播 `channels` / `channel-targets` / `agents` runtime event
|
||
- 提供 diagnostics snapshot
|
||
|
||
交付件:
|
||
|
||
- 页面可消费的 runtime health 数据
|
||
- 配置保存后的收敛刷新能力
|
||
- diagnostics / restart 链路
|
||
|
||
### Agent D:频道集成 Owner
|
||
|
||
负责范围:
|
||
|
||
- `electron/utils/channel-integrations/*`
|
||
- `electron/utils/wechat-login.ts`
|
||
- `electron/utils/whatsapp-login.ts`
|
||
- `electron/utils/channel-plugin-install.ts`
|
||
- `electron/utils/channels.ts` 中与远程目录发现相关的逻辑
|
||
|
||
核心任务:
|
||
|
||
- 对齐 WeChat / WhatsApp 登录流程
|
||
- 对齐 plugin install / detect 流程
|
||
- 对齐 credentials validate
|
||
- 对齐 target 目录发现
|
||
- 梳理各 channel 的 `connectionType` 与特殊字段规则
|
||
|
||
交付件:
|
||
|
||
- connector 能力矩阵
|
||
- QR / plugin channel 接入层
|
||
- channel-specific validate / target discovery
|
||
|
||
说明:
|
||
|
||
- 如果进入峰值 `8` 个 sub-agent 模式,优先把 Agent D 拆成两个:
|
||
- `D1` 负责 Telegram / Discord / Feishu / QQ Bot 等 token 类 channel
|
||
- `D2` 负责 WeChat / WhatsApp / DingTalk / WeCom 等 QR / plugin 类 channel
|
||
|
||
### Agent E:Channels 控制台页面 Owner
|
||
|
||
负责范围:
|
||
|
||
- `src/pages/Channels/index.tsx`
|
||
- `src/components/channels/ChannelDiagnosticsPanel.tsx`
|
||
- `src/components/channels/ChannelGroupCard.tsx`
|
||
|
||
核心任务:
|
||
|
||
- 对齐标题区与 refresh
|
||
- 对齐 configured / supported 双区块
|
||
- 对齐 health banner
|
||
- 对齐 diagnostics 展开 / 复制
|
||
- 对齐删除确认与收敛刷新体验
|
||
|
||
交付件:
|
||
|
||
- ClawX 风格的频道控制台页面壳
|
||
- 配置组卡片与账号行展示
|
||
- diagnostics UI
|
||
|
||
### Agent F:ChannelConfigModal / 前端 schema / i18n Owner
|
||
|
||
负责范围:
|
||
|
||
- `src/components/channels/ChannelConfigModal.tsx`
|
||
- `src/components/channels/*`
|
||
- `src/lib/channel-meta.ts`
|
||
- `src/lib/channel-types.ts`
|
||
- `src/i18n/messages.ts` 或拆分 locale 文件
|
||
|
||
核心任务:
|
||
|
||
- 对齐 channel meta schema
|
||
- 对齐 `ChannelConfigModal`
|
||
- 对齐 token / QR / docs / instructions
|
||
- 对齐 accountId 编辑与校验
|
||
- 对齐频道名称、badge、文案和提示语
|
||
|
||
交付件:
|
||
|
||
- 可复用的 channel meta schema
|
||
- 可测试的配置弹窗
|
||
- 对齐 ClawX 的文案与交互层
|
||
|
||
### Agent G:测试与联调收口 Owner
|
||
|
||
负责范围:
|
||
|
||
- `tests/unit/**`
|
||
- `tests/e2e/**`
|
||
- `docs/**`
|
||
|
||
核心任务:
|
||
|
||
- 为 route / config / status / page 建立单测
|
||
- 建立 binding / diagnostics / account validation / persistence 的 E2E
|
||
- 维护 smoke checklist
|
||
- 跟踪阶段性回归
|
||
|
||
交付件:
|
||
|
||
- 自动化回归基线
|
||
- 联调问题清单
|
||
- 阶段验收记录
|
||
|
||
## 7.6 按波次推进的开发安排
|
||
|
||
为了减少冲突,建议按 4 个波次推进,而不是 7 个 sub-agent 同时全量开工。
|
||
|
||
### Wave 0:契约冻结
|
||
|
||
参与:
|
||
|
||
- 主控 Codex
|
||
- Agent A
|
||
- Agent B
|
||
- Agent C
|
||
|
||
目标:
|
||
|
||
- 冻结 `channels.json` 模型
|
||
- 冻结 Host API 响应结构
|
||
- 冻结 runtime event topic
|
||
- 冻结前端 channel meta schema
|
||
|
||
产出:
|
||
|
||
- 字段命名表
|
||
- route contract
|
||
- runtime contract
|
||
|
||
### Wave 1:数据面与本地 Host API
|
||
|
||
参与:
|
||
|
||
- Agent A
|
||
- Agent B
|
||
- Agent C
|
||
|
||
目标:
|
||
|
||
- 让本地能完整提供 `accounts` / `config` / `default-account` / `enabled` / `targets`
|
||
- 去掉 `/api/channels/targets` 对 upstream 的优先依赖
|
||
|
||
进入下一波条件:
|
||
|
||
- 前端已能拿到稳定的 accounts view
|
||
- target 列表本地可用
|
||
- default account 读写闭环
|
||
|
||
### Wave 2:运行时与 channel 集成
|
||
|
||
参与:
|
||
|
||
- Agent C
|
||
- Agent D
|
||
|
||
目标:
|
||
|
||
- 接通 diagnostics
|
||
- 接通 reload / restart
|
||
- 接通 validate
|
||
- 接通 QR / plugin channel
|
||
|
||
进入下一波条件:
|
||
|
||
- 配置保存后能触发正确的 runtime 收敛
|
||
- 至少核心 channel 流程能跑通
|
||
|
||
### Wave 3:页面与弹窗对齐
|
||
|
||
参与:
|
||
|
||
- Agent E
|
||
- Agent F
|
||
|
||
目标:
|
||
|
||
- 对齐 ClawX 页面结构
|
||
- 对齐 `ChannelConfigModal`
|
||
- 对齐 supported channels 与 configured groups
|
||
- 对齐删除、刷新、诊断与弹窗交互
|
||
|
||
进入下一波条件:
|
||
|
||
- 消息频道控制台可端到端演示
|
||
- 页面层不再依赖临时 mock 字段
|
||
|
||
### Wave 4:测试收口与完全对齐验收
|
||
|
||
参与:
|
||
|
||
- Agent G
|
||
- 主控 Codex
|
||
- 视需要回拉 Agent C / D / E / F 修复回归
|
||
|
||
目标:
|
||
|
||
- 补齐 unit / e2e
|
||
- 做 channel parity checklist
|
||
- 收敛剩余差距
|
||
|
||
最终验收以两份清单为准:
|
||
|
||
1. 功能清单
|
||
- 是否完全覆盖 ClawX 页面、Host API、diagnostics、runtime、绑定、多账号、默认账号、modal、targets
|
||
2. channel 清单
|
||
- 是否覆盖 ClawX 当前支持的 channel 类型与对应连接方式
|
||
|
||
## 7.7 并行边界与冲突规避规则
|
||
|
||
为了让 sub-agent 真正能推进开发,而不是互相打架,建议明确以下边界:
|
||
|
||
1. Agent A 不直接改前端文件
|
||
2. Agent E / F 不直接改 `electron/api/routes/channels.ts`
|
||
3. Agent C 不直接改 `ChannelConfigModal`
|
||
4. Agent G 默认不改生产代码,除非明确接手缺陷修复
|
||
5. `electron/main.ts` 只允许 Agent B 与 Agent C 协调改动
|
||
6. `src/lib/channel-types.ts` 只允许 Agent F 主导,其他 agent 通过契约消费
|
||
7. 如果启用峰值 `8` 个 sub-agent,必须把 D1 / D2 的 channel 列表先写死,避免重复改同一 connector
|
||
|
||
## 7.8 当前推进状态(2026-04-18)
|
||
|
||
本轮已经按推荐编制的一部分开始落地,当前实际分工与产出如下。
|
||
|
||
### 已投入的 sub-agent
|
||
|
||
1. 主控 Codex
|
||
- 负责总装、接口收敛、页面整合、验证与文档回写
|
||
2. Agent B/C 合流实施
|
||
- 已完成 `channel-config.ts`、`channels.ts`、`agent-config.ts`、`routes/channels.ts`、`routes/gateway.ts`、`main.ts` 的首轮闭环
|
||
3. Agent F
|
||
- 已完成 `src/components/channels/*`、`src/lib/channel-types.ts`、`src/lib/channel-meta.ts`、`src/i18n/messages.ts` 的首轮 schema 与弹窗骨架
|
||
4. Agent E
|
||
- 已完成 `src/pages/Channels/index.tsx` 的控制台化改造首版
|
||
5. Agent G
|
||
- 已完成 `tests/channels.test.ts`、`vitest` 基础接线与首批 util 测试
|
||
|
||
当前等价于已经启用 `5` 个实施向 sub-agent / owner 角色;如果继续追求完全对齐 ClawX,下一轮建议补齐 Agent D,并在测试压力上升时扩展到推荐编制 `7` 个。
|
||
|
||
### 当前已完成事项
|
||
|
||
1. Wave 1 基本完成
|
||
- 本地 `channels.json` 配置真相源已经落地
|
||
- `config/default-account/enabled/delete/targets` 本地 Host API 已闭环
|
||
- `/api/channels/targets` 已切回本地优先
|
||
2. Wave 2 部分完成
|
||
- gateway health summary 已接入
|
||
- channel status 推断已接入
|
||
- runtime changed topic 已补到 `channels/channel-targets/agents`
|
||
3. Wave 3 已启动并形成首版可用页面
|
||
- `Channels` 页已升级为“支持的频道 + 已配置频道 + 默认账号 + Agent 绑定 + Gateway 健康”的控制台结构
|
||
- `ChannelConfigModal` 已能承接 channel schema、账号新增、账号编辑和保存
|
||
- 频道矩阵已从业务占位类型切换为 ClawX channel meta
|
||
|
||
### 当前仍未完成的差距
|
||
|
||
1. diagnostics snapshot 仍未补齐复制 / 展开面板
|
||
2. `credentials validate` 尚未补齐
|
||
3. WeChat / WhatsApp 的 QR 登录事件链路尚未接入
|
||
4. plugin install / detect 仍未接入
|
||
5. 页面级单测与 E2E 还缺失
|
||
6. 删除后的延迟收敛刷新、gateway 运行态过渡探测,仍弱于 ClawX
|
||
|
||
### 下一轮 sub-agent 投入建议
|
||
|
||
如果继续按“完全对齐 ClawX”推进,建议下一轮这样补齐:
|
||
|
||
1. Agent D
|
||
- 专注 QR / plugin / validate / target discovery
|
||
2. Agent G
|
||
- 补 channels page unit test 与 diagnostics / binding / account regression E2E
|
||
3. 主控 Codex
|
||
- 继续负责跨层集成,把 diagnostics 面板、延迟收敛刷新和 page controller 拆分补上
|
||
|
||
## 8. 关键风险与决策点
|
||
|
||
1. `zn-ai` 当前 `/api/channels/targets` 仍有 upstream 优先逻辑
|
||
- 这是本次迁移必须消除的分叉点
|
||
2. 是否立即统一 `agents.json` 与 `channels.json`
|
||
- 建议先分开,Phase 3 再评估是否合并
|
||
3. plugin / QR channel 是否首批全部上线
|
||
- 建议先完成架构支持,再按频道类型灰度
|
||
4. reload 与 restart 边界
|
||
- 建议一开始保守,优先正确性
|
||
5. canonical accountId 与 legacy 兼容
|
||
- 必须在 Phase 1 明确规则,否则 UI 与后端会反复打架
|
||
6. WeChat / WhatsApp 的状态目录清理
|
||
- 删除与取消登录要加保护,避免误删
|
||
|
||
## 9. 验收标准
|
||
|
||
迁移完成后,至少满足以下标准:
|
||
|
||
1. `zn-ai` 的 `/channels` 具备 ClawX 同级别页面结构
|
||
2. 能本地完成频道与账号配置,不依赖 upstream 才能工作
|
||
3. 支持 default account、多账号配置、binding、targets
|
||
4. 支持 gateway diagnostics 与 restart
|
||
5. 关键配置保存后能正确收敛到 runtime 状态
|
||
6. Agents 页继续只展示摘要,不回收写操作
|
||
7. 自动化测试覆盖新增账号、校验、诊断、绑定、编辑回归
|
||
|
||
## 10. 本轮建议结论
|
||
|
||
最合理的推进方式不是“一口气把 ClawX 代码整体搬过来”,而是:
|
||
|
||
1. 对齐 ClawX 的交互与 API 语义
|
||
2. 复用 `zn-ai` 已有的本地 route、agent store、channel utils
|
||
3. 在 `zn-ai` 内补一个真正的频道配置与运行时域
|
||
4. 以 `7` 个 sub-agent 作为完全对齐的推荐编制,按波次推进,先后端、再前端、最后测试收口
|
||
5. 若要压缩周期,可在 Phase 2 到 Phase 4 短时提升到峰值 `8` 个 sub-agent
|
||
|
||
这样既能尽量对齐 ClawX,又不会把 `zn-ai` 现有结构全部打散。
|