# 客户端自动更新

6.0.1 起，中心模式的新安装默认开启自动更新，客户端名单沿用本次安装选择。共享后台运行时每 60 秒检查中心发布清单；后台未运行时，下次启动客户端会再检查。`ssh_connection_status` 返回实际 `companionVersion` 和更新状态。`ssh_node_manage` 的 `{"server":"@local","action":"upgrade"}` 可请求立即检查。

更新器从已配置中心的 HTTPS 源下载，逐文件检查大小和 SHA-256，拒绝跳转、路径越界和旧发布序号。启用自动更新表示信任该中心管理员发布的程序；清单摘要用于校验内容，不是独立发行者签名。本地模式需明确设置可信发布源：安装参数 `--update-source https://your-host/current.json --auto-update on`；不设置时保持关闭。`--auto-update off` 关闭自动更新。

下载完成后，更新器等待 MCP 操作、已建立的业务会话/隧道、集群任务和原生数据流空闲，再安装到新版本目录。新后台实际通过 MCP 验证后才切换活动版本；6.0.1 及后续的连接桥保持同一个 STDIO 进程，重新连接已验证的新后台，并通知工具目录变化。正在使用的会话会让更新保持 `deferred`，关闭相应会话后继续。安装失败尝试恢复旧程序配置，结果见 `rollbackSucceeded` 和私密日志。

此前的 5.1.x 和早期 6.0 包没有更新器，必须先运行一次新版完整安装器，并让对应客户端加载新的 MCP 连接桥。普通升级复用本机 `.sshmcp/connection.json`，无需重新发送私有 Key。原私有 ZIP 不会随中心变化；新电脑可使用新版公开包配合自己的 profile，或重新制作私有包。

更新状态和日志位于 `.sshmcp/updates/`；`active.json` 记录已验证程序，`accepted.json` 记录已接受的发布序号。不要删除活动版本、修改摘要或用降低发布序号的方式回滚。需要回滚时，先关闭自动更新，再显式运行保留的旧版完整安装器并完成实际验证。

## 中心发布

仅替换中心可执行文件不会产生客户端发布。中心管理员必须将已验证的 Linux/Windows 平台包作为一个发布单元，生成清单与固定路径的文件：

```bash
python3 tools/publish-update.py --linux-package /absolute/linux.tar.gz --windows-package /absolute/windows.zip --version 6.0.3 --release-id release-20260911-1 --sequence 2026091101 --output /absolute/published
```

示例版本、发布 ID 和 sequence 必须换成本次真实包与大于当前已发布序号的值，不能照抄历史序号。发布 ID 不可复用；`sequence` 对同一发布源严格递增。工具拒绝含 `API_KEY` 的私有包，验证平台包全部摘要和对应源码版本。先同步输出中的 `downloads/updates/` 到同域 HTTPS 静态目录，确认全部文件可下载且摘要一致，再原子发布 `current.json`。

中心服务环境设置 `MCP_UPDATE_MANIFEST=/absolute/published/current.json`，公开 `/v1/releases/current` 到中心后端；它继承 API Key 鉴权。反向代理需将同源 `/downloads/*` 映射到发布目录的 `downloads/`，全部保持 `Cache-Control: no-store`。未设置清单时返回 204。只有清单无需鉴权的独立静态发布源才使用 `--update-source`；不同源不会收到中心的 API Key。

每次发布保留旧文件和备份。用一台已启用更新器的真实电脑验证：中心清单与文件可达、客户端自行下载、新安装摘要一致、同一客户端连接切到新后台、一个真实目标操作成功。中心健康检查或安装文件写入均不能替代这些结果。
