Bug Report: WebSocket 频繁异常断开 (code=1006)
问题概述
Electron 前端渲染进程中的 WebSocket 连接 (createWebSocketStream.ts) 在长时间运行时会每隔 3-40 分钟异常断开,断开代码为 code=1006(Abnormal Closure)。断开后前端会自动重连,但问题反复发生,严重影响长任务体验。
环境信息
- 应用版本: AgnesCode
- 操作系统: macOS
- 后端进程: agnesd (从未崩溃,正常退出仅因 app 关闭/重启)
- 网络连接: 通过本地代理 (localhost:7897)
- 报告时间: 2026-07-13
复现步骤
- 启动 AgnesCode
- 进行对话/执行任务
- 等待 3-40 分钟
- 观察到 WebSocket 连接断开,前端自动重连
- 问题循环出现
日志证据
1. WebSocket 断连记录 (2026-07-13)
[2026-07-13 16:19:49.326] websocket closed (code=1006)
[2026-07-13 16:31:03.905] websocket closed (code=1006)
[2026-07-13 17:24:49.432] websocket closed (code=1006)
[2026-07-13 17:38:43.728] websocket closed (code=1006)
[2026-07-13 18:29:59.382] websocket closed (code=1006)
[2026-07-13 18:35:40.842] websocket closed (code=1006)
[2026-07-13 19:11:22.448] websocket closed (code=1006)
[2026-07-13 19:41:39.433] websocket closed (code=1006)
[2026-07-13 19:59:36.282] websocket closed (code=1006)
[2026-07-13 20:13:34.207] websocket closed (code=1006)
[2026-07-13 20:48:07.537] websocket closed (code=1006)
[2026-07-13 21:07:20.847] websocket closed (code=1006)
[2026-07-13 21:26:35.830] websocket closed (code=1006)
[2026-07-13 21:39:34.536] websocket closed (code=1006)
总计: 14 次断连,平均约 19 分钟一次。
2. agnesd 进程状态
[2026-07-13 15:41:31] Starting agnesd (port 50974)
[2026-07-13 15:56:17] agnesd process exited with code 0 (app 关闭)
[2026-07-13 16:06:18] Starting agnesd (port 54935)
[2026-07-13 20:38:04] agnesd process exited with code 0 (app 关闭)
[2026-07-13 20:38:06] Starting agnesd (port 64996)
关键: agnesd 进程从未崩溃或异常退出,所有断连均发生在 Electron 前端渲染进程。
3. 断连与 agnesd 重启无关
- 14 次 WebSocket 断连期间,agnesd 进程始终保持存活
- agnesd 仅在 app 关闭/重启时正常退出(code 0)
- 断连由前端
createWebSocketStream.ts 触发
技术分析
WebSocket Close Code 1006 含义
Abnormal Closure — 连接非正常关闭,不是通过标准的 close handshake 断开的。
通常原因:网络层丢连接、服务端/代理超时、或对方进程崩溃。
问题定位
- 后端 agnesd 正常 — 进程未崩溃,无 crash 记录
- 断开发生在前端 — 日志来自
from renderer,属于 Electron 渲染进程
- 经过本地代理 — 连接路径:前端 → localhost:54935 (agnesd) → localhost:7897 (代理) → 远程 API
- 缺少心跳保活 — 未见 WebSocket ping/pong 机制
代理连接状态
当前代理 (localhost:7897) 活跃连接数: 36 (均为 ESTABLISHED)
agnesd 到代理的连接: 2 个 ESTABLISHED
代理本身运行正常,但 WebSocket 长连接未被保活。
可能原因
| 原因 |
可能性 |
说明 |
| 前端 WebSocket 缺少心跳保活 |
⭐⭐⭐⭐⭐ |
代理或上游 API 有 idle timeout,连接空闲后被断开 |
| 代理超时设置 |
⭐⭐⭐ |
本地代理 (7897) 可能对 WebSocket 有超时限制 |
| macOS 网络策略 |
⭐⭐ |
macOS 对后台 socket 连接的空闲断开策略 |
| 网络波动 |
⭐⭐ |
部分短间隔断连 (3-5 分钟) 可能与网络有关 |
影响
- 长对话/长任务中用户体验差,频繁断连
- 每次断连后需要重新初始化 ACP 客户端
- 可能导致正在进行的任务中断或丢失状态
建议修复方向
-
在 createWebSocketStream.ts 中添加 WebSocket 心跳机制
- 定期发送 ping 帧 (建议每 30 秒)
- 处理 pong 帧,确保连接活跃
-
实现连接重试与状态恢复
- 断连后自动重连并恢复会话状态
- 增加指数退避重试策略
-
添加连接健康检查
- 监控 WebSocket 连接状态
- 记录断连原因和频率,便于调试
临时 workaround
- 关闭系统代理(如果不需代理上网)
- 缩短单次任务时长,每 20 分钟内完成
- 重启应用以重置连接
附件
- 完整日志:
~/Library/Application Support/AgnesCode/logs/main.log
- 诊断日期: 2026-07-13
Bug Report: WebSocket 频繁异常断开 (code=1006)
问题概述
Electron 前端渲染进程中的 WebSocket 连接 (
createWebSocketStream.ts) 在长时间运行时会每隔 3-40 分钟异常断开,断开代码为code=1006(Abnormal Closure)。断开后前端会自动重连,但问题反复发生,严重影响长任务体验。环境信息
复现步骤
日志证据
1. WebSocket 断连记录 (2026-07-13)
总计: 14 次断连,平均约 19 分钟一次。
2. agnesd 进程状态
关键: agnesd 进程从未崩溃或异常退出,所有断连均发生在 Electron 前端渲染进程。
3. 断连与 agnesd 重启无关
createWebSocketStream.ts触发技术分析
WebSocket Close Code 1006 含义
问题定位
from renderer,属于 Electron 渲染进程代理连接状态
代理本身运行正常,但 WebSocket 长连接未被保活。
可能原因
影响
建议修复方向
在
createWebSocketStream.ts中添加 WebSocket 心跳机制实现连接重试与状态恢复
添加连接健康检查
临时 workaround
附件
~/Library/Application Support/AgnesCode/logs/main.log