Skip to content

ebSocket 频繁异常断开 (code=1006) #5

Description

@Wei-sheng19

Bug Report: WebSocket 频繁异常断开 (code=1006)

问题概述

Electron 前端渲染进程中的 WebSocket 连接 (createWebSocketStream.ts) 在长时间运行时会每隔 3-40 分钟异常断开,断开代码为 code=1006(Abnormal Closure)。断开后前端会自动重连,但问题反复发生,严重影响长任务体验。

环境信息

  • 应用版本: AgnesCode
  • 操作系统: macOS
  • 后端进程: agnesd (从未崩溃,正常退出仅因 app 关闭/重启)
  • 网络连接: 通过本地代理 (localhost:7897)
  • 报告时间: 2026-07-13

复现步骤

  1. 启动 AgnesCode
  2. 进行对话/执行任务
  3. 等待 3-40 分钟
  4. 观察到 WebSocket 连接断开,前端自动重连
  5. 问题循环出现

日志证据

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 断开的。
通常原因:网络层丢连接、服务端/代理超时、或对方进程崩溃。

问题定位

  1. 后端 agnesd 正常 — 进程未崩溃,无 crash 记录
  2. 断开发生在前端 — 日志来自 from renderer,属于 Electron 渲染进程
  3. 经过本地代理 — 连接路径:前端 → localhost:54935 (agnesd) → localhost:7897 (代理) → 远程 API
  4. 缺少心跳保活 — 未见 WebSocket ping/pong 机制

代理连接状态

当前代理 (localhost:7897) 活跃连接数: 36 (均为 ESTABLISHED)
agnesd 到代理的连接: 2 个 ESTABLISHED

代理本身运行正常,但 WebSocket 长连接未被保活。

可能原因

原因 可能性 说明
前端 WebSocket 缺少心跳保活 ⭐⭐⭐⭐⭐ 代理或上游 API 有 idle timeout,连接空闲后被断开
代理超时设置 ⭐⭐⭐ 本地代理 (7897) 可能对 WebSocket 有超时限制
macOS 网络策略 ⭐⭐ macOS 对后台 socket 连接的空闲断开策略
网络波动 ⭐⭐ 部分短间隔断连 (3-5 分钟) 可能与网络有关

影响

  • 长对话/长任务中用户体验差,频繁断连
  • 每次断连后需要重新初始化 ACP 客户端
  • 可能导致正在进行的任务中断或丢失状态

建议修复方向

  1. createWebSocketStream.ts 中添加 WebSocket 心跳机制

    • 定期发送 ping 帧 (建议每 30 秒)
    • 处理 pong 帧,确保连接活跃
  2. 实现连接重试与状态恢复

    • 断连后自动重连并恢复会话状态
    • 增加指数退避重试策略
  3. 添加连接健康检查

    • 监控 WebSocket 连接状态
    • 记录断连原因和频率,便于调试

临时 workaround

  1. 关闭系统代理(如果不需代理上网)
  2. 缩短单次任务时长,每 20 分钟内完成
  3. 重启应用以重置连接

附件

  • 完整日志: ~/Library/Application Support/AgnesCode/logs/main.log
  • 诊断日期: 2026-07-13

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions