一台服务器集中运行 Web(15300)与 Hermes(9119),其他 Mac 安装夭夭 App 后作为“桌面主机”出站连接服务器,向服务器上的 Bot 提供自己的真实桌面(截图、键鼠、独立浏览器)。服务器自己机器上的 App 继续走本机回环通道,等同一台编号为 local 的主机。
192.168.1.10:15300)、用户名和密码。登录成功后窗口直接使用远程服务器的夭夭界面(本机不运行 Web 服务);用管理员账号登录时,App 会自动把这台 Mac 注册为远程桌面主机(令牌经系统钥匙串加密保存在数据目录 desktop-host.enc,0600),无需任何配置文件。非管理员账号只登录界面,并提示需要管理员账号才能注册本机控制。startupChoice);也可在菜单「桌面主机 → 启动时询问使用方式」恢复每次询问。desktop-host.json 仍可用于不便登录的机器(菜单「桌面主机 → 导入主机配置…」),但常规流程不再需要。agent.desktopHost);未绑定时自动解析:优先本机回环,其次唯一在线的远程主机,多台在线必须显式选择。computer-permissions.json,各机独立;菜单「撤销本机控制授权」同时作用于本机与远程通道。屏幕授权之外是独立的第二档授权「文件与命令」:电脑面板完成屏幕授权后出现「授权文件与命令」按钮,Mac 端弹窗单独确认。授权后该账号绑定这台机器的机器人获得四个工具:
desktop_file_list / desktop_file_read / desktop_file_write:在这台 Mac 的用户主目录范围内列目录、读文件(≤12MB)和写文件(≤10MB);..、绝对路径越界和符号链接逃逸都会被拒绝,TCC 保护目录仍按系统权限处理。desktop_shell:在主目录执行一条 zsh 命令(最长 120 秒,stdout/stderr 各截断 512KB,超时终止并如实报告)。两档授权分别记录(approved 与 approvedFull),「撤销本机控制授权」同时清除;工具只注入给已获授权的机器人,且每次调用在服务端二次校验。
POST /api/desktop-host/v1/<hostId>/exchange:Bearer 令牌(sha256 后 timingSafeEqual)+ x-desktop-host-protocol: 1;拒绝任何携带 Origin 的请求,不进入用户会话、CSRF 或 CORS 体系;Host 白名单照常生效。{host, results} → {commands} 格式:每轮最多 8 条命令、20 条结果,请求体上限 24MB。App 成功后 400ms 轮询,网络错误指数退避至 5s;令牌失效(401/403)即停止并提示重新导入。desktop:<hostKey>:<resource> 区分。http:// 登录)时,App 保存的主机配置自动带 allowInsecureLan: true,与 Runner 规则一致;公网部署应使用 HTTPS 并把域名加入外网访问地址。登录凭据只走该服务器地址,密码不落盘。tests/server/desktopHosts.test.ts(注册令牌一次性、准入与协议头、撤销围栏)、tests/server/desktopEnvironments.test.ts(多主机隔离、绑定解析、按机围栏、接管按机独立)。desktop/remote-login.test.mjs(地址归一化、账号密码登录的 CSRF/Origin 往返、管理员注册桌面主机、错误路径)、desktop/host-files.test.mjs(目录内列/读/写、路径与符号链接逃逸拒绝、命令退出码/超时/工作目录)、desktop/host-manager.test.mjs(配置校验、加密导入、交换往返、403 停止、退避重试)、desktop/preferences.test.mjs(启动选择与远程地址偏好持久化)。启动选择/登录窗口需按上述流程手工验收(自动化桌面测试通过 fixture 环境固定走本地路径)。tests/e2e/desktop-hosts.spec.ts(注册/下载/停用;模拟远程主机连接后从电脑面板绑定机器人)。真实多机链路需按上述流程手工验收。