# 更新说明 ## 0.2.0(2026-08-24) ### 新增:中继管理面板 dsh web 侧栏新增 **⚙ 中继管理** 入口,本机与任何经中继配对的远程浏览器都可使用,无需 SSH 到服务器: - **设备管理**:查看每台已配对设备(备注/配对时间/最后活跃),逐台剔除或一键全部剔除——剔除立即吊销其 Cookie **并断开其活动 WebSocket**。 - **多配对码**:可创建多枚带备注的配对码,支持显示码值、启用/停用、换值、删除(已配对设备不受删码影响)。 - **云端状态**:干线在线、桥接下行数、缓存条目、运行时长实时可查。 - **审计视图**:尾部审计记录(配对成败、剔除、码管理等)。 - 管理动作经家端插件转发至云端执行(`admin-request`/`admin-response` 管理帧)。 ### 安全 - 管理路由 `POST /__dsh-relay/admin/api` 采用 **dsh-fence 语义**:回环 Host 绑定 + 同 authority Origin 校验(+ `Sec-Fetch-Site` 放行 `same-origin`/`none`),防路过式跨站 POST;经中继的远程请求构造上天然通过。 - 管理权跟随 dsh web 可达性:能打开你的 dsh web 即可管理;手机丢失场景由所有者在其他设备剔除该设备兜底。 ### 状态文件 v2(自动迁移) - 状态文件升级为 v2 格式:配对码表(带 label)+ 设备令牌对象 + 审计尾部;v1 旧文件启动时自动迁移,原有令牌继续有效。 ### 修复 - 客户端面板脚本改为以 classic-script 的 `__ModuleLoader__.load({id, factory})` 契约注册(此前按浏览器 ESM 加载会失败)。 - `install.mjs`(方式 B)改为平铺复制插件全部三个文件(`index`/`admin`/`client`)——此前只复制 `index.mjs`,其 `./admin.mjs` 相对导入无法解析,插件加载失败导致干线断连;卸载时同步清理三个文件。 ### 升级方式 **云端与家端需同时更新**。云端:`cd /opt/dsh-relay && git pull && systemctl restart dsh-relay`;家端:重跑 `dsh plugin --profile web add "github:SunNull/dsh-relay"` 或 `node install.mjs`,随后重启一次 dsh web。注意:**侧栏「中继管理」入口仅方式 A(bundle 的 `dsh.client` 发现)提供**——方式 B 下中继与管理路由照常工作,但无面板 UI。 心跳与半开连接清理行为与 0.1.1 一致,无变化。 ## 0.1.1(2026-08-24) ### 修复:远程端偶发"数据不同步,刷新才恢复"(重要) **症状**:远程设备(手机/外网浏览器)用着用着不再收到新消息与会话更新,HTTP 请求仍正常,云端健康检查也显示在线;手动刷新页面后恢复。 **根因**:云端到浏览器的下行 WebSocket 没有任何心跳与存活检测。公网/移动网络下,空闲的 TCP 连接会被 NAT 静默回收(常见几分钟),之后所有事件帧都发进了死连接的缓冲区——双方都要等 TCP 重传超时(可达十几分钟)才能察觉。刷新之所以有效,是因为它重建了两条下行连接并重放了基线。 **修复后的行为**(只改云端,不改 dsh、不改家端插件): - 云端每个心跳周期(默认 20 秒)向每条浏览器下行连接发协议层 ping;错过一个完整周期未回 pong 的连接判定为死连接,立即断开并回收家端回环。 - dsh 原生前端收到断开后会自动重连并重放基线——等于把你手动做的刷新变成自动的。锁屏/切后台再回来,几秒内应自动恢复同步。 - 心跳流量同时防止 NAT 空闲超时,从源头减少半开连接的产生。 - 附带修复:家端干线抖动重连时,旧连接迟到的关闭事件不再错误清空新连接的状态与全部浏览器连接。 **升级方式**:在云端服务器执行 `cd /opt/dsh-relay && git pull && systemctl restart dsh-relay`。家端无需任何操作。 **验证**:`probe/ws-halfopen-probe.mjs`(新增)证明死连接在数个心跳周期内被清理且不误杀健康连接;`probe/e2e-probe.mjs` 通过本地 dsh 0.1.1-rc.2 完成静态/RPC/WS 全链路回归。 ### 新增:标准插件安装方式 仓库根现声明 `dsh.bundle` manifest,支持官方插件机制一键挂载: ```sh dsh plugin --profile web add "github:SunNull/dsh-relay" ``` 装完后在 `~/.dsh/profiles/web/cordis.patch.yml` 追加干线凭据(见 README 第 3 步方式 A)。原有 `install.mjs` 一条龙安装方式继续可用,两者可任选。 ### 其他变化 - 云端新增环境变量 `DSH_RELAY_HEARTBEAT_MS`(默认 20000):干线与浏览器下行连接的心跳周期。 - `probe/e2e-probe.mjs` 修复两个既有问题:探测前自动配对(云端强制浏览器认证);兼容 dsh 0.1.1 的 `globalThis["__DSH_BOOT__"]` 写法。支持 `DSH_RELAY_BASE` / `DSH_RELAY_PAIRING_CODE` 环境变量,不再需要手改脚本。 - 仓库已添加 `dsh-plugin` / `dsh` topic,便于社区插件目录发现。 ## 0.1.0(2026-08-16) 首个版本:云端中继(`cloud/server.mjs`)+ 树外家端插件(`host-plugin/index.mjs`)+ 安装器与验收探针。Wire-Trunk 架构、配对认证、静态资源缓存,详见 [README](README.md)。