fix(cli): ls 自动恢复休眠会话 - #912
Conversation
deepcoldy
left a comment
There was a problem hiding this comment.
结论:请求修改,发现 1 个阻断问题。
[P2] 为 wake 请求和 backing 轮询使用同一个有界 deadline,并保留退出能力。
当前 wakeDormantBackendForAttach() 的 15 秒预算只覆盖 await options.wake() 返回后的 probe 循环;requestDormantSessionWake() 调用 fetchDaemonIpc() 时没有 AbortSignal/超时。服务端 /wake 又会在 bot 级 withBotTurnMutation() 中等待已有 admission 排空,因此 daemon 即使已接受连接,也可能长期不返回。与此同时 picker 在 raw mode 下先用 if (deleteInFlight || wakeInFlight) return 丢弃所有按键,Ctrl-C/q/Esc 都到不了 cleanup。结果不是“最多 15 秒无法取消”,而是一次恢复可能把当前终端无限卡死。
建议用一个覆盖 wake HTTP + probe 的绝对 deadline(并将 AbortSignal 传进 IPC fetch),同时让 Ctrl-C/q/Esc 在 in-flight guard 之前生效并中止等待;补一个 wake 永不 resolve/慢 gate 时仍能按 deadline 结束或取消的测试。
其余重点复核结论:
- wake 与飞书 turn 分别经过 mutation/admission gate;任一方先到,另一方都会在状态稳定后重新检查,因此已有活 worker 时不会被 restart。
forkWorker()从入口检查到ds.worker = worker没有await,且 mutation gate 覆盖该调用;Node 单线程下这里不存在两个事件各自穿过 worker-null 检查后双 fork 的窗口。- 本地验证:
pnpm build通过;pnpm vitest run test/dashboard-ipc.test.ts test/session-list-wake.test.ts test/session-picker-responsive.test.ts test/session-list-liveness.test.ts为 163 passed / 1 skipped。
|
感谢这个 PR,把「主机重启后本地 自动评审发现 1 个建议在合入前修复的问题(liveness / 可取消性): picker 在
建议:
(这是自动评审的初步意见,最终以维护者审阅为准。) |
e42305e to
98333cc
Compare
|
已按建议修复并推送(98333cc):
已在最新 master 上 rebase 后复验:pnpm build 通过,相关 4 个测试文件共 167 项全部通过。 |
改动内容
问题原因
主机重启会清空 tmux/ZMX backing,但活跃会话记录和 transcript 仍然保留,可由 daemon 冷恢复。此前 list 会保留这些会话行,Enter 却只连接已经存在的 backing,因此本地入口不可用,而飞书新消息仍能触发恢复。
影响范围
验证