# dsh-auto-reconnect [English](README.md) | 中文 DSH 网页客户端的自动重连插件。官方连接控制器自带退避重连,但有两种场景会睡死,本插件负责唤醒。纯客户端插件,零构建,不改任何官方包。 ## 安装 / 卸载 ```sh dsh plugin --profile web add github:tqcq/dsh-auto-reconnect ``` 然后重启 dsh-web——增删插件必须重启,只刷新浏览器不够。 升级(重跑 `add` 不会移动已解析的 commit,用 `update` 重新解析): ```sh dsh plugin --profile web update dsh-auto-reconnect ``` 卸载: ```sh dsh plugin --profile web remove dsh-auto-reconnect ``` 运行时调整,无需重装(改完刷新页面): ```js localStorage["dsh-auto-reconnect"] = JSON.stringify({ minIntervalMs: 3000, retryDelayMs: 3000, maxAutoRetries: 20, log: true }); ``` ## 官方控制器的两个盲区(源码取证) 对照实际加载的 `@deepseek-ai/dsh-client-connection` 0.1.2-rc.1: 1. 终态 `disconnected` 永久休眠。官方退避(500ms→10s)打满后进入终态,只等浏览器 `online` 事件或手动点重连。手机休眠唤醒全程 `navigator.onLine === true`,`online` 永不触发,所以每次唤醒都得手动点。 2. 僵死 `connected`。官方客户端没有 visibilitychange / focus 监听,也没有心跳。TCP 被静默掐断后 WebSocket 停在 OPEN,状态仍报 `connected`。 ## 本插件做什么 监听 `visibilitychange(→visible)`、`focus`、`pointerdown`、`keydown`、`pageshow(persisted)`,并订阅连接状态流: - 事件唤醒:状态 ≠ `connected` 时才调 `connection.reconnect()`(重置退避、立即重试),绝不打断健康连接。 - bfcache 恢复(`persisted`):套接字必死,无条件重连。 - 状态滑入终态 `disconnected`:延迟自动重试(默认 3s),连续预算 20 次,回到 `connected` 即复位。覆盖"页面已可见已聚焦、之后再也没有浏览器事件"的场景(2026-09-11 实报:宿主重启后硬刷新落终态,仍需手动点)。 每次触发都打 `[dsh-auto-reconnect]` 前缀日志(DevTools console 可取证),默认 3s 节流。 ## 兼容性 - 宿主 `@deepseek-ai/dsh` 0.1.5-rc.2 实机运行(boot 激活断言全绿)。 - 客户端契约对照 `dsh-client-connection` 0.1.2-rc.1 源码取证。 - `ctx.connection` 形状不符时只警告并闲置,不炸页面:API 漂移时优雅降级。 ## 局限(挂账) 僵死 `connected` 的一般形态(后台标签被 NAT 掐断、无 OS 休眠)客户端探测不了:RPC 单播走独立 HTTP 通道,探测成功不代表 WebSocket 活着。根治需要宿主侧心跳 + 死连接清扫(思路参考已废弃的 enterhalf/dsh-web-network-optimizer),需要时另立插件。 ## 测试 ```bash node tests/client_test.js # 14 组,vm 沙箱模拟 DOM/连接句柄,无需浏览器 ``` ## 二次开发注记 - 包内 `cordis.patch.yml` 恒为 `[]`:只写注释会解析成 null,直接炸 profile 启动。 - 只改客户端代码则浏览器硬刷新即可,无需重启 dsh-web。 License: MIT(见 LICENSE)。