fix(telegram): 修复问答误报过期、文字作答与等待中断 - #1156
Conversation
e29ae69 to
9a14236
Compare
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ec274d9f79
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if !allowed { | ||
| return nil |
There was a problem hiding this comment.
Preserve manager access when stopping durable runs
When an owner or manager has Manage permission but the source-scoped chat ACL denies Chat, the earlier CommandAccess gate explicitly permits /stop, but this second raw ACL check returns without invoking either StopTurn or the active-stream cancellation fallback. Such managers therefore cannot stop a running or parked agent from that channel; reuse the command-access decision or avoid applying the chat-only ACL a second time.
Useful? React with 👍 / 👎.
修复 Telegram 原生 ask_user 的三个问题:等待期间普通文字误走新 turn 而触发 Internal RPC error;按钮读取 fenced 请求时误报过期;选项外文字被校验拒绝,无法作为当前问题的答案交给模型。
现在私聊下一条文字参与当前问题作答,无法完整匹配选项时原文作为 custom_text 提交;群聊文字要求明确回复或提及 Bot。原生 ask_user 新旧请求统一允许自由回答,外部 ACP/Codex 结构化表单保留自身约束。多选无法完整解析时保留整条原文。
按钮及 Other 路径在修改草稿前检查身份和 ACL;卡片复用持久化交互状态,正式提交仍校验运行时归属。文字推进后同步原卡片,提交失败保留可重试状态。另修复 gRPC 的 ErrSessionBusy 映射,并新增 StopTurn RPC,使 /stop 能取消等待中的持久运行;Server 与 Channel 需一起更新。
Fixes #1153. Fixes #1154. Fixes #1155.
既有恢复机制的来源与本 PR 范围
本修复复用已经合入 main 的 Session Runtime 基础设施。以下为 Git 提交及对应 PR 记录的来源:
47fd904d4(2026-07-17)207844099(2026-07-28)finishing终态提案、有限 finish retry 与 Reaper 接管a23d24a1f(2026-08-31)本 PR 新增的是 Telegram 问答接入修复,以及在既有 owner-side finish 流程中清理当前 run 的持久决策。它复用现有 Cancel/Reject、fence 校验、终态投影及失败重试,不新增恢复状态机。直接 Reaper 终态化与历史遗留 pending 的清理仍是原文列明的边界。
共享 Backend 的全量快照读写、序列化、锁竞争及通用 TTL 优化属于底层机制的后续工作,不纳入本次 Telegram 故障修复。当前 PR 的审查范围是接入正确性及其新增行为,不以改造整套恢复机制为目标。
共享停止路径
Telegram StopTurn 现在调用与网页 Stop 相同的 AbortRuntimeRun。运行正常结束、出错或停止时,在释放运行归属前按 run_id 关闭剩余 user input / tool approval;复用已有 Cancel/Reject、fence 校验及事件投影,不恢复模型。清理失败保留运行归属并通过现有 finish retry 重试,不把失败当成功。正常 ask_user 停等仍保留 pending。
网页问题卡片上的 Cancel 语义保持不变:取消问题后把结果交给 LLM,继续当前运行。Stop 则终止运行;二者共享取消持久状态的底层能力,但不混淆续跑行为。
与 #1159 的关系
两个 PR 均以 main 为目标,diff 不互相包含。本 PR 负责答案接收和停止时清理;#1159 负责后台续跑输出送达。只部署本 PR,仍可能出现答案提交后后续回复未送达 Telegram。Server 与 Channel 需一起更新。
本地组合版本包含两份修复及本次停止修复,运行标识 qa-after-1156-stop / 07d0f2f。之后的 9215d69 仅 gofumpt 格式调整;本次 8dfd9de 还修正了输出失败时的卡片状态同步。最新源码尚未重新部署。
代码量与自审
核对远端 main 为 5cf6ded,按共同祖先 67fe0e6 到当前 head ec274d9 统计(base...head)。共同祖先之后 main 的独立修改不计入 PR。
本次停止修复相对原 head 9a14236:生产文件 +105/-2,有效生产代码 +94/-1,净增 93;测试 +167/-1。无独立机械性批量修改、数据库迁移或新依赖。有效生产行统计排除空行和纯注释,含代码的行仍计入;局部 gofumpt 换行计入生产文件 diff。
93 行有效净增的用途:74 行复用 Cancel/Reject 并逐请求校验所属运行和 fence、发布终态;18 行把清理接到运行终止与已有重试路径;1 行注册回调。Telegram 改为调用网页同一入口,调用行替换净增 0。没有另外实现问答状态机。
自审修复:权限检查前置、未匹配文字原样返回模型、文字更新原卡片,以及 /stop 遗留 pending 导致下一条消息再次被截获。重点 review:取消问题与停止运行的语义、只清理当前 run 的原 fence、失败不能提前释放运行、正常停等不能误取消。
明确边界:本次处理正常 owner finish/Stop 路径;不修复旧版本已产生的终态 run + pending 历史数据,未覆盖进程崩溃后 Reaper 直接终态化的遗留清理。Telegram Stop 后旧卡片尚未主动移除按钮。群聊与跨实例故障恢复仍需单独 QA。
本次与续跑恢复配套的修正
不再因 handler 返回输出错误而跳过持久提交状态读取:答案已经 submitted 时仍更新原卡片,并保留输出错误。避免把“答案接受”和“回复送达”混为一谈。该修正生产文件净减 2 行、测试净增 4 行;新增 submitted + handler error 用例已通过。最终组合提交 7ef647e3e 的全仓库 Go 测试及 lint 均通过。#1159 的接受回执负责及时更新,本处负责错误返回后的兜底。
验证与 QA 范围
本次更新已通过 application、runtime/session、decision/input、channel/inbound、turn/grpctransport 五个包的完整 Go 测试;相关 application race 与 application/runtime-session lint 通过。回归覆盖网页与渠道 Stop 共用入口、不续跑模型、后续运行可启动、清理失败后重试、拒绝后继 fence,以及普通停等保留问题。
AI 实机 QA(2026-09-05,隔离组合版本):
用户此前人工确认的是旧组合版本的文字 1111 happy path,不代表本次新 head 已完成人工 QA。仍保持 Draft。全仓库 integration tag 检查此前受基线 settings 测试调用参数不足阻断,本次未修改该基线问题。
本次来源标注提交
ec274d9f7仅新增 4 行源码注释并更新 PR 描述,未修改可执行代码;已检查 comment-only diff 与git diff --check。有效生产代码统计不变,既有 QA 状态保持。最新真人 QA 确认
2026-09-06,用户在 @Memoh_test_bot 验证组合版本后明确确认通过,并提供截图。组合来源:#1156
ec274d9f7+ #11591150071ca,部署标识qa-1156-1159-latest,源码 treed1269ab。确认范围:自由文字“0 点”提交后原样回复、原问题显示答案,以及再次提问后的选项答案与续跑回复送达。本次确认不覆盖 Other、多题、/stop、工具审批、群聊权限或跨实例故障恢复的完整人工验证。