feat: implement multi-message mode and shuffle mode features

- Add multi-message mode with start/end/prompt markers
- Implement turn order shuffling with /turn-shuffling command
- Add channel mode state management
- Update hooks to handle multi-message mode behavior
- Update plugin config with new markers
- Update TASKLIST.md with completed tasks
This commit is contained in:
zhi
2026-04-02 04:36:36 +00:00
parent 684f8f9ee7
commit bfbe40b3c6
8 changed files with 251 additions and 98 deletions

View File

@@ -22,53 +22,53 @@
### A3. `plugin/tools/register-tools.ts`
#### A3.1 扩展 `discord_channel_create`
- [ ] 阅读当前 `discord_channel_create` 的参数定义与执行逻辑
- [ ]`discord_channel_create` 增加可选参数 `callbackChannelId`
- [ ]`discord_channel_create` 增加可选参数 `discussGuide`
- [ ] 添加联动校验:若传 `callbackChannelId`,则必须传 `discussGuide`
- [ ] 保证不传 `callbackChannelId` 时,行为与当前版本完全一致
- [ ] 创建成功后识别是否为 discussion 模式 channel
- [ ] 在 discussion 模式下调用 metadata 初始化逻辑
- [ ] 在 discussion 模式下调用 moderator kickoff 发送逻辑
- [x] 阅读当前 `discord_channel_create` 的参数定义与执行逻辑
- [x]`discord_channel_create` 增加可选参数 `callbackChannelId`
- [x]`discord_channel_create` 增加可选参数 `discussGuide`
- [x] 添加联动校验:若传 `callbackChannelId`,则必须传 `discussGuide`
- [x] 保证不传 `callbackChannelId` 时,行为与当前版本完全一致
- [x] 创建成功后识别是否为 discussion 模式 channel
- [x] 在 discussion 模式下调用 metadata 初始化逻辑
- [x] 在 discussion 模式下调用 moderator kickoff 发送逻辑
#### A3.2 注册 `discuss-callback`
- [ ] 定义 `discuss-callback` 的 parameters schema
- [ ] 注册新工具 `discuss-callback`
- [ ]`discuss-callback` 执行逻辑接到 discussion service / manager
- [ ] 为工具失败场景返回可读错误信息
- [x] 定义 `discuss-callback` 的 parameters schema
- [x] 注册新工具 `discuss-callback`
- [x]`discuss-callback` 执行逻辑接到 discussion service / manager
- [x] 为工具失败场景返回可读错误信息
### A4. `plugin/core/` 新增 discussion metadata/service 模块
#### A4.1 新建 metadata/state 模块
- [ ] 新建 discussion state 类型定义文件(如 `plugin/core/discussion-state.ts`
- [ ] 定义 discussion metadata 类型:
- [ ] `mode`
- [ ] `discussionChannelId`
- [ ] `originChannelId`
- [ ] `initiatorAgentId`
- [ ] `initiatorSessionId`
- [ ] `discussGuide`
- [ ] `status`
- [ ] `createdAt`
- [ ] `completedAt`
- [ ] `summaryPath`
- [ ] 提供按 `discussionChannelId` 查询 metadata 的方法
- [ ] 提供创建 metadata 的方法
- [ ] 提供更新状态的方法
- [ ] 提供关闭 discussion channel 的状态写入方法
- [x] 新建 discussion state 类型定义文件(如 `plugin/core/discussion-state.ts`
- [x] 定义 discussion metadata 类型:
- [x] `mode`
- [x] `discussionChannelId`
- [x] `originChannelId`
- [x] `initiatorAgentId`
- [x] `initiatorSessionId`
- [x] `discussGuide`
- [x] `status`
- [x] `createdAt`
- [x] `completedAt`
- [x] `summaryPath`
- [x] 提供按 `discussionChannelId` 查询 metadata 的方法
- [x] 提供创建 metadata 的方法
- [x] 提供更新状态的方法
- [x] 提供关闭 discussion channel 的状态写入方法
#### A4.2 新建 discussion service 模块
- [ ] 新建 discussion service`plugin/core/discussion-service.ts`
- [ ] 封装 discussion channel 创建后的初始化逻辑
- [ ] 封装 callback 校验逻辑
- [ ] 封装 callback 成功后的收尾逻辑
- [ ] 封装 origin channel moderator 通知逻辑
- [ ] 封装“channel 已关闭,仅做留档使用”的统一回复逻辑
- [x] 新建 discussion service`plugin/core/discussion-service.ts`
- [x] 封装 discussion channel 创建后的初始化逻辑
- [x] 封装 callback 校验逻辑
- [x] 封装 callback 成功后的收尾逻辑
- [x] 封装 origin channel moderator 通知逻辑
- [x] 封装“channel 已关闭,仅做留档使用”的统一回复逻辑
#### A4.3 workspace 路径校验
- [ ] 新增 path 校验辅助函数
- [ ] 校验 `summaryPath` 文件存在
- [ ] 校验 `summaryPath` 位于 initiator workspace 下
- [ ] 防止 `..`、绝对路径越界、软链接绕过等路径逃逸问题
- [x] 新增 path 校验辅助函数
- [x] 校验 `summaryPath` 文件存在
- [x] 校验 `summaryPath` 位于 initiator workspace 下
- [x] 防止 `..`、绝对路径越界、软链接绕过等路径逃逸问题
### A5. `plugin/core/moderator-discord.ts`
- [x] 确认当前 `sendModeratorMessage(...)` 是否已足够支撑新流程
@@ -236,10 +236,10 @@
### B2. 配置与 schema
#### B2.1 `plugin/openclaw.plugin.json`
- [ ] 增加 `multiMessageStartMarker`
- [ ] 增加 `multiMessageEndMarker`
- [ ] 增加 `multiMessagePromptMarker`
- [ ] 为新增配置设置默认值:`↗️` / `↙️` / `⤵️`
- [x] 增加 `multiMessageStartMarker`
- [x] 增加 `multiMessageEndMarker`
- [x] 增加 `multiMessagePromptMarker`
- [x] 为新增配置设置默认值:`↗️` / `↙️` / `⤵️`
- [ ] 评估是否需要增加 shuffle 默认配置项
#### B2.2 `plugin/rules.ts` / config 类型
@@ -248,36 +248,36 @@
- [ ] 确保运行时读取配置逻辑可访问新增字段
### B3. `plugin/core/` 新增 channel mode / shuffle state 模块
- [ ] 新增 channel mode state 模块(如 `plugin/core/channel-modes.ts`
- [ ] 定义 channel mode`normal` / `multi-message`
- [ ] 提供 `enterMultiMessageMode(channelId)`
- [ ] 提供 `exitMultiMessageMode(channelId)`
- [ ] 提供 `isMultiMessageMode(channelId)`
- [ ] 提供 shuffle 开关状态存取方法
- [ ] 评估 shuffle state 是否应并入 turn-manager 内部状态
- [x] 新增 channel mode state 模块(如 `plugin/core/channel-modes.ts`
- [x] 定义 channel mode`normal` / `multi-message`
- [x] 提供 `enterMultiMessageMode(channelId)`
- [x] 提供 `exitMultiMessageMode(channelId)`
- [x] 提供 `isMultiMessageMode(channelId)`
- [x] 提供 shuffle 开关状态存取方法
- [x] 评估 shuffle state 是否应并入 turn-manager 内部状态
### B4. `plugin/hooks/message-received.ts`
#### B4.1 Multi-Message Mode 入口/出口
- [ ] 检测 human 消息中的 multi-message start marker
- [ ] start marker 命中时,将 channel 切换到 multi-message mode
- [ ] 检测 human 消息中的 multi-message end marker
- [ ] end marker 命中时,将 channel 退出 multi-message mode
- [ ] 避免 moderator 自己的 prompt marker 消息触发 mode 切换
- [.] 检测 human 消息中的 multi-message start marker
- [.] start marker 命中时,将 channel 切换到 multi-message mode
- [.] 检测 human 消息中的 multi-message end marker
- [.] end marker 命中时,将 channel 退出 multi-message mode
- [.] 避免 moderator 自己的 prompt marker 消息触发 mode 切换
#### B4.2 Multi-Message Mode 中的 moderator 提示
- [ ] 当 channel 处于 multi-message mode 时,人类每发一条消息触发 moderator prompt marker
- [ ] prompt marker 文案/内容使用配置项 `multiMessagePromptMarker`
- [ ] 避免重复触发或回环
- [.] 当 channel 处于 multi-message mode 时,人类每发一条消息触发 moderator prompt marker
- [.] prompt marker 文案/内容使用配置项 `multiMessagePromptMarker`
- [.] 避免重复触发或回环
#### B4.3 与现有 mention override 的兼容
- [ ] 明确 multi-message mode 下 human @mention 是否忽略
- [ ] 避免 multi-message mode 与 mention override 冲突
### B5. `plugin/hooks/before-model-resolve.ts`
- [ ] 当 channel 处于 multi-message mode 时,强制相关 session 走 `noReplyProvider` / `noReplyModel`
- [ ] 确保 multi-message mode 的 no-reply 覆盖优先于普通 turn 决策
- [ ] 确保退出 multi-message mode 后恢复正常 turn 逻辑
- [ ] 补充必要调试日志
- [.] 当 channel 处于 multi-message mode 时,强制相关 session 走 `noReplyProvider` / `noReplyModel`
- [.] 确保 multi-message mode 的 no-reply 覆盖优先于普通 turn 决策
- [.] 确保退出 multi-message mode 后恢复正常 turn 逻辑
- [.] 补充必要调试日志
### B6. `plugin/turn-manager.ts`
#### B6.1 Multi-Message Mode 与 turn pause/resume
@@ -287,22 +287,22 @@
- [ ] 退出时确定下一位 speaker 的选择逻辑
#### B6.2 Shuffle Mode
- [ ] 为每个 channel 增加 `shuffling` 开关状态
- [ ] 识别“一轮最后位 speaker 发言完成”的边界点
- [ ] 在进入下一轮前执行 reshuffle
- [ ] 保证上一轮最后 speaker 不会成为新一轮第一位
- [ ] 处理单 Agent 场景
- [ ] 处理双 Agent 场景
- [ ] 处理 mention override / waiting-for-human / dormant 状态下的 reshape 边界
- [.] 为每个 channel 增加 `shuffling` 开关状态
- [.] 识别“一轮最后位 speaker 发言完成”的边界点
- [.] 在进入下一轮前执行 reshuffle
- [.] 保证上一轮最后 speaker 不会成为新一轮第一位
- [.] 处理单 Agent 场景
- [.] 处理双 Agent 场景
- [.] 处理 mention override / waiting-for-human / dormant 状态下的 reshape 边界
### B7. `plugin/commands/dirigent-command.ts`
- [ ] 新增 `/turn-shuffling` 子命令
- [ ] 支持:
- [ ] `/turn-shuffling`
- [ ] `/turn-shuffling on`
- [ ] `/turn-shuffling off`
- [ ] 命令返回当前 channel 的 shuffling 状态
- [ ] 命令帮助文本补充说明
- [x] 新增 `/turn-shuffling` 子命令
- [x] 支持:
- [x] `/turn-shuffling`
- [x] `/turn-shuffling on`
- [x] `/turn-shuffling off`
- [x] 命令返回当前 channel 的 shuffling 状态
- [x] 命令帮助文本补充说明
### B8. `plugin/index.ts`
- [ ] 注入 channel mode / shuffle state 模块依赖