T3 Code 源码拆解
远程与平台能力

17 · 执行环境、配对与远程访问

Direct、Relay、Tailscale、SSH 如何落到同一环境模型,token、DPoP 与 WS ticket 又如何分工。

先分清 Identity、Launch 与 Access

“远程服务器”常被写成一个 URL,但 T3 Code 将它拆成三件事:

  • ExecutionEnvironment identity:这是哪一个 T3 Server/工作环境;
  • Launch method:谁负责启动它,例如本机 Electron、SSH、WSL、已有 daemon;
  • Access method:客户端怎样到达它,例如 direct URL、managed relay tunnel、Tailscale。

同一环境可以更换 IP、从局域网切到 Tailscale,或由桌面 SSH 重新启动。只要 identity 稳定,项目/thread 不应被复制成“新服务器”。

环境身份与多种访问路径
Execution Environment ID Direct HTTPS / LAN Managed Relay Endpoint Tailscale Endpoint Desktop-managed SSH Desktop-managed WSL T3 Server Provisioned Tunnel

client-runtime/environment 描述 identity/endpoint,connection/resolver 根据已知环境与当前平台能力解析可用路径。

本地认证也不能省

Server 拥有终端、Git 与 Agent 权限。即使只监听 localhost,也不能默认所有网页脚本都可信;Electron 未来还可能暴露局域网/Tailscale。 EnvironmentAuth 因此统一处理 session、pairing、scope 和 WebSocket upgrade。

Server 侧关键持久对象包括:

  • Server secret / identity;
  • auth session 与 last connected metadata;
  • pairing grant/link;
  • authorization scopes;
  • DPoP proof key thumbprint。

迁移 020、031、032 显示权限从简单 session 逐步演化为 access management、方法 scope 和 proof-of-possession。

配对流程

配对解决“新手机怎样得到访问某执行环境的授权”。典型流程:

  1. 已有管理员/本机界面请求一次性 pairing grant;
  2. 生成带短期材料的链接/二维码;
  3. 新设备打开链接,验证环境身份与 grant;
  4. 新设备提交自己的 proof key / metadata;
  5. Server 原子消费 grant,创建有 scopes 的 session;
  6. 客户端把 session/私钥存进 secure storage;
  7. 后续连接只使用常规授权,不重复携带 pairing secret。

Hosted pairing link 将敏感 token 放在 URL fragment (#...),而非 query。Fragment 默认不随 HTTP request 发给承载页面的 server, 前端脚本再读取并兑换,降低 CDN/access log 泄漏。

Fragment 不是完整安全方案

它只减少传输到页面服务器的机会。浏览器扩展、恶意脚本和截图仍可能读取,因此 grant 还必须短期、单次消费、绑定环境并在兑换后清理 URL。

Bearer、DPoP 与 WS ticket 的分工

Bearer / session token

证明客户端拥有一个已授权 session,适合放在 HTTPS Authorization header。若单独泄漏,持有者可能重放。

DPoP

客户端为请求签名,Server 验证 proof、时间、目标、nonce/jti 等,并将 session 绑定到公钥 thumbprint。窃取 token 而没有私钥时难以使用。 Server 与 relay 都有 DPoP 验证/消费测试,重放 proof 必须被拒绝。

WebSocket ticket

浏览器建立 WS 时难以设置自定义 header,于是先用 bearer/DPoP 的 HTTPS 请求兑换短期、单用途 ticket,再把 ticket 放 WS URL。 Ticket 过期/消费后不可作为长期 API 凭据。

RPC scopes

握手成功只建立 principal;每个方法仍通过 requiredScopeForRpcMethod 授权。即使某条 transport 被错误复用,低权限 session 也不能调用管理/写入方法。

T3 Connect 控制面

infra/relay 包含边缘 Worker/API、环境链接、managed endpoint allocation、token/DPoP、数据库、队列和移动 activity/push 设施。 Server 侧 cloud/ 管理登录、环境 key、managed endpoint runtime、boot/pinned service 与 tracing。

一个重要边界是:Relay/Connect 负责发现、配对、路由和控制元数据;正常 Agent RPC 热路径经分配的 tunnel/endpoint 到 Server, 不是让所有消息内容先进入中心 Worker 再转发。

Managed endpoint 的控制面与数据面
publish signed environment discover authorized env authenticated RPC data plane activity metadata wakeup T3 Server T3 Connect API Mobile / Web Managed endpoint allocation Provisioned tunnel Optional activity / APNs pipeline

签名环境发布用于防止 Relay 将错误 endpoint 绑定到环境;managed tunnel limits 防止滥用/资源无限分配。

Agent activity 与推送

Relay 的 agentActivity/ 包含 device registration、live activities、APNs token、delivery queue/attempt。合理原则是只发送唤醒和最小状态, 客户端随后从 Server 获取权威 thread projection;不要把完整提示、代码 diff 或凭据放进 push payload。

Delivery 是至少一次、可能延迟的外部系统,因此 UI 不应把“收到 push”当 turn 完成事实。它只触发连接 runtime wakeup。

Tailscale

Tailscale endpoint provider 发现 tailnet 可达地址。它提供网络层私有可达性,但不替代 T3 auth:tailnet 成员不一定都应拥有终端写权限, 浏览器来源和 session 撤销仍需应用层控制。

Desktop-managed SSH

SSH 模式由 Desktop 启动/连接远端 T3 Server,处理密码/host-key prompt,再把环境 descriptor 交给 renderer。 SSH transport 的认证只证明桌面能登录远端机器;T3 Server RPC 仍建立自己的 environment session,以保持 Web/Mobile/Direct 行为一致。

威胁与控制对照

威胁控制
URL 日志泄漏长期 tokenHTTPS header + 短期 WS ticket;pair token 放 fragment
token 被复制重放DPoP proof key、jti/时间验证与消费
低权限设备调用终端写入方法级 scope 授权
恶意 pairing link 重复使用短期、单次原子消费、环境绑定
Relay 篡改环境 endpoint环境发布签名/身份校验
隧道资源滥用managed allocation 与 limits
Push 泄漏代码只发送最小活动/wakeup metadata
endpoint 变化产生重复环境identity 与 access method 分离

源码锚点

可迁移经验

  • 环境身份、启动方式、访问路径分开建模,网络切换才不会复制业务对象。
  • 浏览器 WS 使用短期 ticket;握手之后仍做方法级授权。
  • Pairing 是授权委派协议,不只是二维码字符串。
  • 网络私有层(Tailscale/SSH)不替代应用授权。
  • 云控制面只保留发现和路由所需数据,业务热路径尽量端到端到执行环境。

On this page