bug: 协同 worker 视图在任务正常运行时误显示「任务执行到一半时应用退出,已被中断」
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 401
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
## 问题描述
Windows 桌面端,协同模式下打开 worker 会话视图:worker 的 turn **正在正常执行、输出持续产生**时,输入框上方出现「任务执行到一半时应用退出,已被中断」横幅(InterruptedTurnBanner)。不做任何操作,等该轮 turn 正常收尾后横幅自动消失;worker 实际未受影响(正常把报告交回 Lead)。
期望:turn 正在跑时不应显示「已被中断」;该提示只应对真正被中断、且当前没有新 turn 在跑的情况出现。
## 环境
- Cindy 版本或 commit:0.1.84(本机自构建 = main@40162c508 + #4496 cherry-pick,因本机急用打的热更包)。**涉及横幅判定的文件在 0.1.83 与该构建之间无差异**(#4496 只改 Pi set-model 的 runtime 退役路径,与本问题无交集)。
- 平台与版本:Windows 11(桌面端)
- 安装方式:本地热更覆盖
## 复现步骤
1. 协同模式派发 worker 任务(本机 worker 会话 `db6c6b10-9a88-4346-abe3-d90c099f3e40`,Pi + glm-5.3-flash)。
2. 让该 worker 的某一轮被中断:本例 10:17:02 为安装热更退出 App(`before-quit`,首轮确实被打断);10:24:01 又手动 stop 一次(日志 `worker manual interrupt: suppressed auto-bridge { reason: 'input_stop', status: 'done' }`)。
3. 紧接着重新派发下一轮(10:24:58 派发,10:25:03 新 turn 开始)。
4. 打开该 worker 会话视图观察:新 turn 正常跑、输出持续产生,「已被中断」横幅同时显示。
5. 不做任何操作,等该轮正常结束后横幅自动消失。
## 日志与证据
- 横幅出现期间该会话 DB 行:`active_turn_started_at = 10:25:03 > last_turn_ended_at = 10:24:01`(新 turn 的 started 已写、ended 未写,即"在飞")。
- 该轮正常收尾后:`started = 10:42:06 < ended = 10:48:14`,双时间戳条件不再成立,横幅消失。
- 该会话**没有** `role='error'` 的持久化中断行 —— 因此不是 error-tail(`app-exit-interrupted` 历史行)语义,而是 `sessionActiveTurn.ts` 的 session 双时间戳语义。
- 真正由「应用退出」造成的中断发生在更早那一轮(10:17:02 为装热更退出 App);提示文案对那一轮是准确的,但被显示到了之后**正在运行**的新 turn 上。
## 分析(推测,供维护者参考)
桌面端判定在 `CCAgentSessionView.tsx`:
```
interruptedFromSession = !sessionInterruptAcked && !remoteTurnActive && started > max(ended, clearedAt)
横幅渲染门控:!readOnly && !errorTailMsg && interruptedFromSession && !syntheticContinuationPending
&& !error && !credentialSwitchWait && !isStreaming && !agentStatus.isRunning
```
`started > ended` 对任何「在飞的 turn」都成立(ended 要等 turn 收尾才写);抑制依赖两点:视图观察到 running(`agentStatus.isRunning || remoteTurnActive` 置一次性 ack)或 `isStreaming`。本次 turn 确实在跑、输出也在产生却没被抑制,怀疑 worker 视图(由 lead 派发的 turn)的 live running/streaming 信号未及时落到该会话视图,或视图打开时 session 快照与 live 状态不同步。
问题:
1. 这是已知现象吗?是否已有采集/计划?
2. 是否可以把「已被中断」绑定到具体被中断的那个 turn(而不是会话级不等式),或在 turn 真正开始(started 落库 / 视图观察到 running)时就清掉旧的中断标记,避免"旧账"被显示到新 turn 上?
## 关联
#3015(Windows shutdown 保留 interrupted turns)、#4454(orca reviewer 完成回报积压)属于相邻区域,但不是同一问题。
Contributor guide
Research direction
Start in CCAgentSessionView.tsx and trace interruptedFromSession, sessionActiveTurn.ts, and the running or streaming signals used by the banner. Reproduce a worker turn after an interruption and verify that the banner stays hidden while the new turn runs, then appears only for a genuinely interrupted turn with no active replacement.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- electron, typescript
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100