Repository navigation
[Bug] ask_user_question 提问卡片不展示、会话永久卡住(mux WebSocket 僵尸连接无心跳) #3020
momothewolf
started this conversation in
General
Replies: 1 comment
桌面端复现数据点(佐证本文根因 + 补充一次对照样本)环境:Windows 11 25H2 / Node.js 24.14.0 / dsh 0.1.0-rc.7(npm 全局安装,2026-08-19 升级)/ 桌面 Chrome 浏览器(非手机/远程)。 三次失败样本(backround tab 长时间后台):提问卡发出后,浏览器 tab 后台停留约 1.5 小时(未操作),期间 WebSocket 静默断连(无心跳探测,与本文根因一致)。切回页面时界面显示「提问 等待回答 / Deep diving...」但提问卡片(composer 接管区)为空白,必须先刷新页面(触发重连 + mux 重放 pending 提问)卡片才出现并可正常作答。会话日志核对(decode-session.mjs 解码 session.jsonl.zstd):
三次 tool/call → tool/result 全程 对照样本(短时后台):第四张提问卡发出后仅数分钟切回页面,卡片已正常渲染——说明「后端挂起/静默断连」是必要条件而非每次必现,与 #3102 的重连竞态(重放先于 onConnected 到达却被 结论:桌面端再次确认该问题族,支持本文的服务端心跳方案(30s ping + 死 socket 终止)及 #3102 的 resync 竞态修复,请求上游评估采纳。当前用户侧唯一恢复路径仍是刷新/重连。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
问题现象
智能体调用
ask_user_question后,Web GUI 不显示提问卡片(composer 未接管),会话永久卡在等待状态无法继续;只能手动停止该 turn 并让 agent 重新提问才恢复。根因分析
question/requested帧只在 ask 时推给"当时在线"的 mux 队列,并在每次 mux-open 时重放仍未决的提问——两条路径都要求有已连接的客户端。packages/client/connection/src/websocket-downlink.ts未启用 ws ping/pong);浏览器端要等系统级 TCP 超时(可达数十分钟)才感知断连。窗口期内 UI 显示"已连接"、没有新的 mux 连接代次、mux-open 重放永不发生——提问卡片永不渲染,turn 无限期停滞。packages/host/apiproxy/src/api-proxy.ts的 pendingQuestions 注册表没有超时或客户端活性检测,即使确认无客户端应答,提问也会永久挂起。参考实现(fork 分支)
已按上述根因完成修复并通过全部验证:服务端心跳——
WebSocketDownlinks按可配置的heartbeatIntervalMs(默认 30s)ping 每个已接受 socket,漏一次 pong 的 socket 在下一拍被终止(新连接 2 拍宽限);浏览器按 RFC 6455 协议层自动回 pong,客户端零改动;terminate()触发浏览器close→ 既有重连循环 → 既有 mux-open 重放把 pending 提问送达。packages/client/connection定向测试 25/25;pnpm run test:gui3759 通过;typecheck / lint 通过;README 与 Agent Note 按仓库惯例同步(双语 + i18n 记录)上游当前不接受外部 PR(见 CONTRIBUTING.zh.md),故以本讨论 + fork 分支形式提供,供团队评估或直接合入。
All reactions