# dsh-mobile 多网关支持待办

## 目标与范围

一个 dsh-mobile 客户端可以添加、保存并连接部署在云服务器或不同 PC 上的多个独立 Gateway。各网关拥有独立的凭证、连接状态和业务数据。

第一阶段支持多网关管理与切换连接；第二阶段支持前台同时连接多个网关；第三阶段按需增加局域网自动发现。第一阶段无需中心服务器。

2026-09-09：第一阶段 Gateway 插件 G1–G4 已实现并通过自动化回归，以下已完成项打勾。App 未修改，后续阶段及人工多机验收尚未完成。详见 [App 对接说明](multi-gateway-app-integration.md) 与 [验收报告及人工步骤](multi-gateway-phase1-acceptance.md)。

## 实施前基础

- 启动配置 `gatewayEnabled: true` 已支持常驻，不会启动无人连接自动关闭计时器。
- 管理界面手动开启后，默认 5 分钟无人连接才自动关闭；成功连接后会清除计时器，后续断线不会重新计时。
- 已有一次性配对码、长期设备 token、设备撤销和独立局域网 WebSocket 监听。
- 已有 `control` / `conversation` 通道拆分，适合后续多网关并行连接。
- 当前 `hello` 和配对载荷没有稳定的网关身份字段，局域网监听也不等于自动发现。

## 第一阶段：网关插件待办

### G1. 明确并持久化常驻模式

- [x] 将运行模式明确为关闭、临时开启、常驻开启；管理界面显示当前模式。
- [x] 常驻开启不启动无人连接关闭计时器；临时开启保留当前等待首次连接的超时行为。
- [x] 持久化用户选择；优先级为已保存模式 > `gatewayMode` > 旧 `gatewayEnabled`。临时模式重启重新计时，自动关闭后保存关闭状态。
- [x] 管理界面切换到常驻后，重启仍保持常驻；主动关闭后按约定保持关闭。
- [x] 保留配对码有效期、请求超时和文件传输空闲超时，避免与网关运行模式混淆。
- [x] 更新管理接口、界面文案、配置说明与部署说明，注明常驻依赖 DSH 进程运行及机器网络可达。

### G2. 增加稳定网关身份

- [x] 首次启动生成随机 `gatewayId` 并持久化，重启、升级、地址变化时保持不变。
- [x] 支持可配置的 `gatewayName`，用于展示机器名称；App 可单独保存本地别名。
- [x] 明确身份文件的保存位置（默认 `<deviceFile>.gateway.json`）、原子写入与损坏处理，避免损坏后静默生成新身份。
- [x] 说明克隆部署时必须生成新的网关身份，避免多台机器复用同一 `gatewayId`。
- [x] 在 `hello`、首次配对成功帧和本机管理状态中增加网关身份信息。
- [x] 配对载荷携带 `gatewayId`、`gatewayName`，协议字段命名在实现前与 App 对齐。

### G3. 支持同一网关的多个访问地址

- [x] 定义可选的 `endpoints: string[]` 字段，在配对载荷及本机管理状态返回候选地址，并保留现有 `publicUrl` 兼容字段。
- [x] 允许管理员配置并在配对时提供多个候选地址，不把监听地址 `0.0.0.0` 当作可连接地址。
- [x] 多个地址指向同一网关时返回相同身份，控制和会话通道返回相同身份。
- [x] 候选地址仅作为连接提示，不作为身份认证依据；地址变化不自动建立信任。

### G4. 协议与兼容性

- [x] 更新 `PROTOCOL.md`，给出网关身份、地址列表、常驻模式和配对示例。
- [x] 优先采用可选字段扩展，保持已有请求与响应含义不变；验证旧 App 的解码行为后再决定是否升级配对载荷版本。
- [x] 保持每个网关独立签发和撤销设备 token，禁止引入跨网关通用 token。
- [x] 增加验证：身份持久化、常驻无客户端、临时模式超时、模式切换与重启、旧客户端兼容、双通道身份一致。

## 第一阶段：App 待办

### A1. 多网关资料与迁移

- [ ] 建立 `GatewayProfile`：本地记录 ID、远端 `gatewayId`（旧网关允许缺失）、名称、本地别名、候选地址、凭证引用、最近连接时间。
- [ ] 将现有单网关配置迁移为默认网关，保留原凭证与用户数据；迁移可重复执行且不产生重复记录。
- [ ] 按网关隔离安全存储中的 token 和服务端返回的 device ID；客户端安装级设备 ID 可继续复用，不能代替鉴权凭证。
- [ ] 支持添加、重命名、排序、删除网关和选择默认网关。
- [ ] 再次扫描同一网关时更新已有记录；若重新配对导致 token 轮换，替换凭证并重建该网关连接。
- [ ] 区分本地删除与服务端撤销授权；本地删除不宣称已撤销服务端设备权限。

### A2. 连接管理与恢复

- [ ] 将单一连接管理改为按网关创建连接上下文，包含控制通道、会话通道、请求等待队列和重连任务。
- [ ] 第一阶段只保持当前网关的业务连接；切换时取消旧订阅与等待请求，并阻止旧回调污染新页面。
- [ ] 每个网关独立维护未连接、连接中、在线、离线、需要重新配对等状态。
- [ ] 连接后核对已保存的网关身份；身份不匹配时停止业务操作并提示重新确认，不能自动覆盖原记录。
- [ ] 新发现或未经确认的地址不直接携带已有 token 探测；制定候选地址信任规则，保留 TLS 校验。
- [ ] 支持网络恢复后的退避重连与候选地址切换；鉴权失败进入重新配对流程，避免无限重试。
- [ ] 定义旧网关兼容行为：缺少 `gatewayId` 时使用本地记录 ID 隔离，升级后经可信连接绑定远端身份，不能仅凭名称合并。

### A3. 业务数据隔离

- [ ] 会话、工作区、任务、Goal、文件缓存等使用 `(本地网关记录 ID, resourceId)` 作为客户端存储与索引范围。
- [ ] 所有发送、审批、停止、重命名、归档和文件操作显式携带所属网关上下文。
- [ ] 页面、订阅、异步回调和待处理请求绑定网关及连接代次，丢弃过期连接的响应。
- [ ] 切换网关后加载对应配置、模型与能力列表，不复用其他网关的能力判断。
- [ ] 连接中断后不自动重发发送消息、审批等写操作；结果不确定时先查询状态，避免重复执行。
- [ ] 明确删除网关时本地缓存、下载文件与会话草稿的处理规则，并在界面说明。

### A4. 界面与验证

- [ ] 增加网关列表或切换入口，展示名称、连接状态、当前网关及重新配对入口。
- [ ] 扫码添加新网关不覆盖已有网关；已存在时明确提示更新。
- [ ] 会话和审批页面显示所属网关，避免用户向错误机器发送操作。
- [ ] 增加验证：旧配置迁移、重复配对、切换期间事件到达、跨网关同名同 ID 资源、凭证隔离、撤销后重连、地址与身份不匹配。

## 第二阶段：前台同时连接多个网关

### 网关插件

- [ ] 验证仅连接控制通道时的状态同步，以及对审批/提问认领和释放行为的影响。
- [ ] 验证会话通道按需建立、断开及重建不会影响其他设备或控制通道。
- [ ] 明确重连后的状态快照与待处理交互恢复约定，有缺口时补充协议或实现。

### App

- [ ] 前台为用户启用的多个网关维护控制通道，进入会话时按需连接对应会话通道。
- [ ] 单个网关连接失败不阻塞其他网关初始化、列表加载或操作。
- [ ] 如增加聚合任务/会话页面，每项保留来源标识，点击后路由至所属网关。
- [ ] 限制并发连接与重连频率，处理进入后台、返回前台和网络切换后的状态恢复。
- [ ] 不将后台常驻 WebSocket 作为可靠通知方案；若需要后台审批通知，另立推送方案待办。

## 第三阶段：局域网自动发现（可选）

### 网关插件

- [ ] 增加可选的 mDNS / DNS-SD 广播，约定服务类型、网关 ID、名称、端口、路径与协议版本。
- [ ] 广播中不包含 token 或配对码；服务关闭时停止广播。
- [ ] 处理多网卡、地址变化与广播生命周期。

### App

- [ ] 实现局域网服务浏览及相应平台权限流程，提供拒绝权限后的扫码/手动添加入口。
- [ ] 展示“发现但未配对”的网关，发现结果仍需完成配对才能访问业务数据。
- [ ] 对发现结果去重；广播身份仅用于提示，不据此自动更新可信地址或发送凭证。

跨互联网自动发现不属于本阶段。如果后续需要登录账号后自动列出所有机器，再设计设备目录、登记鉴权、心跳和访问网络方案；目录服务本身不能解决网络不可达问题。

## 实施顺序与验收

1. 先对齐身份字段、地址信任规则与兼容策略，再并行开展网关和 App 实现。
2. 完成 G1–G4 与 A1–A4，交付可保存多个网关并可靠切换的版本。
3. 再实施前台并行连接，最后按需求增加自动发现。

第一阶段验收清单：

- [ ] 同一 App 添加一台服务器和两台 PC，资料及凭证在重启后保留。
- [ ] 三个网关均可常驻，长时间无客户端后仍能连接；网关重启后身份不变。
- [ ] 任意切换网关，会话、工作区、模型配置、审批及文件不会串用。
- [ ] 两个网关返回相同资源 ID 时，缓存和操作仍正确隔离。
- [ ] 一台机器离线或凭证被撤销，不影响其他网关。
- [ ] 同一网关更换已确认的访问地址后可恢复连接；不同身份的端点不会被误绑定。
- [ ] 旧 App 连接新插件、旧单网关配置迁移到新 App 均通过兼容性验证。
- [ ] 网关插件现有测试与新增行为测试通过，App 完成对应自动化验证及多机联调。
