Bug: deferred Codex restart can leave a queued prompt permanently undelivered
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 40m
- Merged PRs (30d)
- 805
Description
**提交人**: liuaiqing
**客户端版本**: 0.1.44
---
## 现象
已有会话中的后续消息被写入输入队列,但没有发送给 Codex,界面一直无响应。第一条消息正常完成;新建会话后可以继续使用。
## 复现步骤
1. 另一个本地 Codex 会话正在运行时,发生全局 Codex 凭据或运行时配置变更。
2. Cindy 因 Codex 忙而延期当前会话重启。
3. 在之前一轮已经完成的已有会话中发送后续消息。
4. 等待延期重启完成以及受影响会话被唤醒。
## 期望行为
重启 gate 清除后,后续消息应自动发送;如果暂时不能发送,应显示明确的等待/重试状态,而不是静默滞留。
## 实际行为
后续消息被写入持久化输入队列快照,但:
- 没有出现在会话的 `messages` 表中;
- 没有创建第二个 Codex submission;
- 没有观察到第二次上游模型请求;
- 延期重启报告唤醒 4 个会话后,消息仍未被消费。
## 复现频率
目前仅观察到一次。
## 已尝试
新建会话后可以恢复继续使用,但原会话中的排队消息没有恢复处理。
## 脱敏诊断摘要
观察时间为 2026-08-12:
- 上一轮约在 14:04 正常完成;
- 后续消息在约 14:04:40 发送;
- 早先日志出现:`codex busy during memory change; deferring live-session restart`;
- 约 14:11:32 日志显示延期重启完成:`wokenSessions: 4`;
- 此后仍没有对应的 Codex submission。
疑似链路:
```
延期的全局 Codex 重启
-> credential/restart gate 阻止输入派发
-> 消息被持久化但没有发送
-> 唤醒/恢复路径没有可靠 drain 恢复队列
```
## 可能相关代码路径
- `AgentInputCoordinator` 对 deferred credential/restart gate 的处理;
- `getDrainableHead` 在 gate pending 时返回不可派发;
- gate 清除后缺少可靠的 per-session retry;
- `wakeSession()` 可能早于 queue snapshot 恢复或状态/generation 对账而调度 drain;
- `onExternalTurnSettled(sessionId)` 可能没有消费当前会话自己的排队输入。
## 建议修复方向
- deferred restart gate 清除时为每个受影响会话增加可靠的重试;
- 确保 queue snapshot 恢复完成后再调度 drain;
- 重试前对账 turn state、generation 和 lease;
- 当前会话有排队输入时,让 external-turn-settled 路径也触发 wake/drain;
- 无法派发时显示明确的 pending/retry 状态。
以上仅为用户同意公开的脱敏摘要,不包含凭据、个人路径或原始数据库内容。
---
**版本区域**: CN
**OS**: darwin x64 (24.6.0)
**界面语言**: zh-CN
Contributor guide
Research direction
Start by tracing AgentInputCoordinator through getDrainableHead and the deferred credential/restart gate. Then inspect wakeSession and onExternalTurnSettled(sessionId), paying attention to queue snapshot restoration, turn state, generation, and lease handling. Done means a queued prompt is reliably drained after the gate clears, or the UI exposes a clear pending/retry state.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100