机器人私聊提供固定菜单入口「Codex 对话」。点击后发送独立控制面板,选择当前可操作的 Codex 对话、填写指令,再明确提交;无需寻找该对话的旧通知。
「任务总览」提供看板可见会话的状态统计和最近输出摘要,并在同一张卡片中选择本页可控 Codex 继续执行。
「快捷回复」菜单使用事件 Key kanban_quick_replies,选择 Codex 目标后发送本机个人模板;两个已有面板也提供按钮进入。完成通知上的同名按钮固定原会话。配置文件、编辑流程与底部菜单发布步骤见 个人快捷回复。
两个菜单现在均可选择会话并点击「查看所选会话 / 记录 / 文件」,打开状态、公开对话记录和本机项目文件读写面板。无需填写指令、无需新增菜单。操作方式与安全限制见 飞书会话工作区。
其中「任务总览」是默认可用的只读入口:只要本地已配置私聊接收者并开启飞书通知,即可查看全部未隐藏 session 的状态、最近摘要、分页和刷新,不会因此获得向 Codex 发送指令的权限。完成通知底部的「查看完整记录」同样按只读入口处理。「Codex 对话」、通知回复续跑和文件工作区仍需要在 Kanban 中显式开启「飞书回复控制」。
- 直接回复完成通知:仍走原有
message_id → Kanban 会话绑定,继续原会话。 - 控制面板:目标与文字在同一次表单提交中回传,不保存全局默认目标,不影响通知绑定。
- 普通私聊文字不会因为选择过目标就自动执行。
- 通知回复、Codex 对话和可编辑会话工作区共用设置中的「飞书回复继续执行」开关和本地
FEISHU_NOTIFY_USER_ID白名单;只读任务总览只要求已配置私聊接收者并保持飞书能力开启。所有入口仅支持私聊本人操作。
在当前 Kanban 机器人所属应用中增量配置,不删除已有菜单、事件或切换其他机器人的接收方式:
- 在机器人能力的自定义菜单中新增「Codex 对话」,动作选「推送事件」,事件 key 填
kanban_codex_sessions。 - 在事件配置中保留
im.message.receive_v1,新增application.bot.menu_v6。 - 在回调配置中启用
card.action.trigger,采用现有长连接接收方式。 - 按应用后台要求保存、发布生效。重新打开机器人私聊验证菜单。
在同一应用的「应用能力 → 机器人 → 自定义菜单」中新增一项,保留原来的 Codex 菜单:
| 配置项 | 内容 |
|---|---|
| 菜单名称 | 任务总览 |
| 点击动作 | 推送事件 |
| 事件 Key | kanban_task_overview |
保存并按后台要求发布版本,重新进入机器人私聊,点击「任务总览」。它复用已经订阅的 application.bot.menu_v6 和 card.action.trigger,无需新增事件类型、权限或 .env 配置。注意菜单 Key 不是订阅事件名。
菜单外观与所在位置由飞书客户端控制。本仓库不自动修改应用后台菜单或权限;仅启动这两个新增事件的消费者,复用 CLI 事件总线,不停止全局 daemon。任务总览消费者在回复控制关闭时仍提供只读列表;不需要改动 Codex、Hermes 或开放公网 webhook。
后端日志会记录 Feishu Codex control panel listener failed 及具体原因:
application.bot.menu_v6 requires event types not subscribed in console:在当前飞书应用的事件订阅中增加并发布application.bot.menu_v6,再重新打开机器人私聊。lark-cli event consume application.bot.menu_v6 --as bot也会返回官方配置引导链接。another consumer ... is already running for this subscription:同一lark-cliprofile 的一个事件订阅只能有一个消费者。先用lark-cli event status --current --json确认占用者,停止或迁移不再使用的其他项目消费者,或者为 Kanban 配置独立的飞书应用/profile;不要让多个项目共享同一订阅并互相抢占。- 菜单入口还需要在机器人自定义菜单中发布事件 Key
kanban_codex_sessions或kanban_task_overview;事件订阅成功不等于菜单已经创建。
- Card 2.0 使用
select_static、input和form提交,目标不默认选中。卡片输入框限制 1000 字;长指令可继续回复原通知卡片。 - 指令下拉框仅显示在线、可控制且可解析实际 Codex 对话身份的会话。选择值使用服务端面板快照映射,不信任客户端提供的主机、目录或命令参数。
- 「Codex 对话」每页最多探测 50 个候选会话,超过时提供翻页入口;菜单或刷新时重新读取列表,不永久截断到前 50 个。
- 每张面板短期有效,绑定允许的用户、原始卡片和私聊。服务重启后旧面板失效,重新点击菜单即可,不持久化指令正文。
- 提交前复核会话可用性及实际 Codex 对话 ID。目标已退出、已切换或不能确定时拒绝执行,不回退其他会话。
- 每张面板仅发送一次;重复回调/点击不能重复执行。队列调用异常时不自动重试,以免首次已经送达后再次执行。
- 成功提示只表示 Codex 队列接受,不表示任务完成。任务完成后仍走原有通知链路。
- 「刷新对话列表 / 打开新面板」获取新列表,不批量刷新历史通知。
- 已提交面板保留原用户/卡片/私聊来源校验,允许刷新打开新面板,但不能再次发送原指令。超时或服务重启后请重新点击机器人固定菜单。
- 统计覆盖全部未隐藏的看板会话,每页显示 10 个,包含非 Codex、只读和离线会话;这些会话不因此获得指令执行权限。
- 状态直接来自注册表:运行中、等待输入、空闲、不可用(连接非在线、已退出或已脱离)。低置信度状态标记待确认,不把空闲推断为完成。
- 卡片注明生成快照时间,点击刷新或翻页重新读取注册表;不是持续自动刷新的实时看板。
- 最近输出优先使用
lastAgentMessageSummary,否则使用outputPreview,清理终端控制字符并限制为 300 个 Unicode 字符。它可能滞后,不是完整最终回复;完整结果仍通过完成通知查看。 - 会话名称与摘要以纯文本展示,避免内容中的飞书标签触发意外提醒。总览会把上述会话信息发送给本地配置的私聊接收者,请确认接收范围。
- 下拉框只列出当前页可控且身份明确的 Codex 会话;某个会话身份解析失败不会阻止其他会话展示。刷新、翻页保留服务端绑定的总览模式,不信任回调中指定的模式。
菜单事件与卡片表单回调独立于 FeishuReplyCommandService。复用现有 CLI 消费器生命周期和 Codex 原生 sendText 队列,而不模拟终端粘贴/Enter。通知消息绑定保持不可变,避免跨事件保存「下一条文字发给谁」带来的乱序与误发风险。
任务总览仅为现有面板增加一种服务端模式,复用卡片绑定、过期检查、去重和发送前对话身份核验;不增加独立后台轮询或状态推断器,不改动 Codex 或 Hermes。
最小验收包括:菜单白名单、表单原子提交、空列表、过期面板、目标切换、跨用户/跨卡片伪造、重复提交、发送失败不重试,以及原卡片回复回归。真实飞书联调必须另行检查后台事件已生效;CLI ready 只能证明本地消费者就绪,不能证明飞书后台已启用订阅。