server-name.md 3.1 KB

服务器统一名称

2026-09-07。服务器名称由 Web 服务端统一保存,同一服务上的 Agent 共用。Web、iOS 和安卓均可读取;管理员可以修改,普通账号只读。名称留空时统一显示服务端主机名。

入口与同步

  • Web:设置 → 登录与安全 → 服务器名称;侧栏账号说明同步显示名称。
  • iOS:设置 → 服务器与账号 → 服务器统一名称;同一地址的已保存账号名称随之更新。原本的手机备注作为旧服务的备用备注保留。
  • 安卓:设置 → 服务器统一名称;服务器账号列表缓存同步更新。

首次登录、账号切换、返回前台和打开设置时读取最新配置。Bot 模式复用现有事件响应中的名称快照,普通聊天复用 HTTP/SSE 的 server.identity.changed 通知。已有编辑草稿保留;如其他端先保存,当前编辑页提示冲突并提供重新载入。

协议与存储

GET /api/app/server-identity 返回 serverId、name、displayName、revision。PUT 接收 name、expectedRevision、expectedServerId,沿用身份认证、管理员权限、Origin 和 CSRF 校验。

名称去掉首尾空白,最多 100 个 UTF-16 单元,拒绝内部控制字符。客户端提交编辑开始时的版本和服务器 ID;过期版本或更换连接目标返回 409,不覆盖已有值。服务端兼容明确指定当前目标的简单调用,因此两个 expected 字段可省略;三端界面始终发送这两个字段。

数据保存在现有 workspace.sqlite3 的独立 server_identity 表中。首次初始化生成稳定 ID;名称更新在事务中完成,重启后保留。Agent 名称、服务器连接地址和远程节点配对备注沿用原配置。

验证

  • 16 项服务端与客户端专项测试通过:持久化、恢复主机名、非法输入、过期版本、目标服务器校验、普通账号只读、编辑草稿及设置回归。
  • 认证与工作区回归测试另外 56 项通过。
  • Web 双窗口测试通过:一端保存,另一端无需刷新即可收到名称。
  • iOS AppModel 账号隔离测试及真实设置页面测试通过:读取 Web 名称、保存 iOS 名称、重启应用后保留。
  • 安卓真实设置组件、服务端读写和 Room 缓存验证通过:读取 iOS 名称、保存“家里的 Mac”、账号列表缓存更新,错误账号、地址和旧版本被忽略,普通用户组件只读。
  • Web 最终读回安卓保存的“家里的 Mac”。三端构建及 Android Lint 通过。

联动验收顺序:启动 tests/fixtures/workspace-server.ts(18804/19124),运行 playwright.server-name.config.ts 的 two clients 用例,再运行 iOS testUnifiedServerNamePersistsThroughSettings、安卓 ServerIdentitySyncTest,最后运行 SERVER_NAME_NATIVE_ROUNDTRIP=1 npx playwright test -c playwright.server-name.config.ts -g 'saved by Android'。

Web 设置截图。iOS、安卓截图在各自仓库的服务器名称验收目录。均使用隔离服务及模拟器,未进行生产发布或真机安装。