跨主机会话
跨主机会话是显式启用的路由契约:一台主机上的 Agent 可以创建、发送、检查或取消另一台主机上的会话。它复用已有远程 RPC 连接,不会迁移运行中的 Agent,也不把共享存储变成双活执行。
启用接收主机
Section titled “启用接收主机”在接收主机的用户配置中添加以下配置;项目配置不能启用或扩大此权限上限。provider 和 model 必须替换为该主机已有的真实配置名称:
{ "session_federation": { "enabled": true, "host_id": "my-laptop", "models": { "my-provider": ["my-model"] }, "permission_modes": ["read_only"], "tool_allow": ["read_file"], "tool_deny": [] }}这只是执行能力上限,不是访问授权。选中的 resource.authorization 提供者仍须显式允许已验证身份的 session/federation.create、.send、.inspect、.cancel 或 .list 操作。create/list 使用接收主机的工作区资源,其余操作使用精确会话资源;列表还会逐条检查 inspect 权限。配对设备的 owner 标记不授予此权限,因此默认的 owner-only 策略拒绝跨主机会话请求。
上限约束 provider/model、权限模式和工具,默认只读。模型或工具白名单为空时不能创建或发送。调用者只能进一步收窄工具。发送到已有会话时,该会话持久保存的执行权限和工具策略也必须满足上限;读取、取消与发送权限独立。
接收方每次操作读取所选配置。禁用能力或撤销资源授权后,后续请求和回执读取被拒绝;已经完成的工作不会撤回,已接收的 turn 也不会自动停止。停止工作需使用单独授权的精确 turn 取消操作。
使用 wuu remote host --pair --delegate-only 为云端代理配对。该设备会持久保存
受限角色;没有明确策略授权时,不能调用普通所有者 RPC。同一密钥重新配对
不能隐式升级为所有者。已有普通所有者配对行为保持不变。
受限配对单独保存在 remote.json 的 delegated_devices 中,绝不写入旧版用于
所有者的 devices 集合。旧版软件无法使用这些受限配对,也不会自动把它们
提升为所有者。旧版写入程序可能丢弃不认识的集合,因此再次升级后可能需要
重新登记受限设备。
本版本打开较早实验格式时,会先迁移 devices 中标记为
delegated_only: true 的条目;发现重复设备权限记录则拒绝打开,且不改写文件。
这类实验数据必须先用修正版打开,再考虑降级:旧版无法安全解释原来的
逐条角色标记,即使增加 v 版本号也无效。普通所有者配对及账户凭据保持不变。
公共 SDK 的会话传输辅助函数定义 SessionLocatorV1 和 session.transport 提供者描述。声明消费 host.session.route 和 session.transport;远程请求调用所选传输提供者的 dispatch。提供者缺失或禁用时直接失败,不回退到本地会话。execution_host: "local" 显式使用已有本地处理器;原有 host.session.* 调用仍保持本地行为。
远程适配器接受已经认证的 RPC 客户端,例如已有远程客户端,再发送 session/federation。凭据和身份验证属于连接,不能由请求载荷声明。不要把凭据放入模型输入;每个主机标识应绑定固定主机身份的连接。locator 本身不是授权证明。
{ "version": 1, "operation": "create", "operation_id": "my-stable-create-id", "locator": { "version": 1, "execution_host": "my-laptop" }, "params": { "visibility": "user", "context_source": "fresh", "provider": "my-provider", "model": "my-model" }}创建返回含 session ID 的 locator。send/inspect/cancel 的 params.session_id 必须与 locator 相同;create/send 如提供 request_id,必须等于 operation_id。inspect 可用 send 的 operation ID 作为 request_id,配合已有终态等待参数获取进度和结果。cancel 必须指定精确 turn_id 或 queue_id。
execution_host 选择执行主机。storage_host 是接收方配置的描述(默认与主机 ID 相同),不是调用者选择存储或发起迁移的指令;display_host 仅描述展示位置。会话身份是 (execution_host, session_id),不能只用 session ID。
跨连接重试应保留同一 operation ID。接收方通过选中的 state.documents,先持久保存 create/send/cancel 的接收回执,再执行副作用。相同请求重试返回原回执;同一 ID 换成不同请求会失败。响应 completed 表示 RPC 操作完成,不表示 Agent turn 已完成。
pending:共享接收方中的已接收操作仍在进行。unknown:操作已接收,但最终回执不可用,例如执行后、写入最终回执前崩溃;不会自动重复执行。- 发送前已知离线返回离线错误;发送后断线表示结果未知,不表示执行失败。
重连已有远程传输后,以同一请求查询回执,再检查精确会话/turn。不能仅因为响应丢失就换 operation ID。当前不提供持久离线投递队列、自动故障转移或模糊结果自动重跑。
第一版仅在接收方配置的工作区创建 fresh 会话;不跨主机传递父会话历史、fork、选择 worktree、迁移正在执行的会话或覆盖 engine。上述功能需要额外的显式能力。原生 GUI 的主机选择复用同一主机限定路由,与 Agent 委派授权分开。
无外部推理验证
Section titled “无外部推理验证”go build -o .tmp/bin/wuu ./cmd/wuuWUU_E2E_CORE=.tmp/bin/wuu node scripts/session-federation-e2e.mjsgo test ./internal/remote/host -run '^TestSessionFederationTwoHostsEndToEnd$' -count=1 -v测试使用隔离的云端/本地 app-server 与存储、真实 TCP 云端入口、已有加密 relay 连接和合成模型,覆盖默认本地行为、远程创建、权限收窄、幂等重试、断线重连、最终结果、精确取消和撤权。它不代替真实机器联网、已安装引擎或 GUI 渲染验收。
脚本通过 npm 打包公开 SDK 及远程客户端的导出源码包
@wuu/remote-core(当前为 private、版本 0.0.0,不是 npm 已发布包),在独立目录启动真实云端、接收端与
中继进程,使用全新身份及本地模拟模型。JSON 验收记录保存在
.tmp/e2e/session-federation/,不记录设备私钥。
验收产物只上传 results.json 和 commands.json,不要包含独立的模拟凭据文件。
使用仓库要求的 Node/Go 工具链,先安装 packages/plugin-sdk 依赖;npm pack
会自动构建 SDK。
Personal 在已有会话中执行任务
Section titled “Personal 在已有会话中执行任务”主机授权入口通过 executionGrants(host).describe() 返回 host_features: ["session-route.v1"]。缺少该能力表示旧主机不支持此路由操作;普通 Personal 任务不受影响,也不会因此创建替代工作会话。
Personal 的 list_sessions 工具通过所选传输提供方查询可用的已登记会话及不可用主机。
发现会话不等于获准控制;名称有歧义时,应确定包含主机身份的精确会话目标。
create_task 可携带 existing_session 定位信息;resume_task 和 update_task
保留这个目标,并排入新的请求。它们不会向无关的当前轮次插话、派生会话,
也不会在目标主机消失时创建替代工作会话。
来源授权仍绑定 Personal 自己的控制会话。所选任务权威提供方返回已有目标及允许操作,
主机把这些信息绑定到授权摘要和精确的 session-route 资源。
executionGrants(host).route(reference, request) 仅允许该执行请求的发送、检查与精确取消。
定位信息或正文中声称“已批准”都不是授权。接收端独立认证调用方,并检查资源策略及执行上限。
会话所有者和父子关系不会改变;此操作不配置提供方或模型。
此能力需要可用的所选传输提供方。已有本地会话可使用下文的所有者路径,无需开启联邦; 联邦目标仍需独立接收端授权。源任务的精确目标授权在两条路径都保留。 Personal 不会自动启用联邦、取得凭据,或把调用方声称的所有者权限提升为真实权限。
Personal 在既有任务记录中保存目标及请求身份。回复丢失时检查原请求, 而不是再创建工作会话。取消只针对匹配的队列项或轮次,不停止整个会话。 等待超时或显示端断开不会取消工作。工作会话的终态输出以工作会话回复回到 Personal, 不代表其说法已被独立核验;事项仍等待复核,包括回复只是一个问题的情况。详细历史仍留在原会话。已停止或被新版本取代的执行迟到回复 不会重新激活任务。
主助手可在复核精确工作请求和当前事项版本后调用 accept_task_result,记录判断与依据,
不改写原始回复,也不授予额外执行权限。接受结果是主助手的决定,不代表独立核验。
普通反馈通知禁用工具;支持隔离复核的主机另走下文的受限控制器回合,通知送达本身不代表任务完成。来源授权过期或被撤销时,
系统会明确要求重新授权,不会悄悄借用所有者权限。没有有效委派清理授权时,
仍可在原目标会话界面停止工作。
已有目标委派目前仅支持文本。控制器任务目标与绑定的真实用户原始消息分开标注;例行任务或控制器发起的任务不会伪造人类原话。原始请求包含附件时,会保留可修改的任务并明确提示不可传输,在此之前不向工作会话发送内容。不跨主机复制文件,也不将源路径冒充为目标本地路径;请先在目标会话处理所需文件,再修改任务继续执行纯文本委派。
已注册桌面传输
Section titled “已注册桌面传输”桌面 Personal 配置选择 wuu.desktop-session-transport,使用已经注册的活动接收端连接及其公开的非秘密传输身份,不创建替代会话,也不将跨运行时目标伪装为 local。发现结果由接收端资源策略过滤;传输携带实时源授权校验,不采用调用方声称的所有者权限;联邦路径仍为非所有者,本地所有者路径检查真实接收连接。不支持、身份歧义或未配置的接收端保持不可用。首个适配器支持已注册的桌面本地核心连接,不会悄悄提升未委派远程连接的权限。
使用仓库 Go/Node 工具链并安装桌面依赖后,运行 node scripts/registered-session-transport-e2e.mjs。它构建真实源端与接收端 app-server 测试进程,通过实际桌面连接池验证已有会话发送、同请求重放、终态结果及接收策略撤销。另一条链路在实际受信任本地 UserHost 中加载生成的 Personal 插件,由主模型回合调用 list_sessions,按唯一名称选择目录目标,再使用返回的 locator 调用 create_task。owner-local 和 federation 两条链路都将目标回复保持到源主回合完成之后,再验证任务 lineage、授权签发与恢复、结果对账、原始用户来源及稳定重试。该 Coding 接收端使用默认 owner-only 策略,完全关闭 federation,不需要自定义接收授权配置。独立联邦测试仍采用显式接收策略 fixture。两者使用合成模型,不代表外部账号、物理多机部署或对工作声明的独立核验已经完成。 控制器链路随后由真实后台恢复周期驱动,不注入对账或决策调用:owner-local 在同一任务根授权及版本下继续一次,再接受下一条回复;federation 接受回复。两者均验证主会话最终通知及随后用户回合的普通工具恢复。独立的启动即启用 Code Mode 用例通过真实所有者客户端 API 创建事项,验证实际复核模型只看到已解析的直接决策工具,随后恢复普通 Code Mode 工具范围;该用例不执行 Code Mode 子进程,也不声称通过对话创建事项。忙碌主会话用例会保持原主回合,直到复核请求已持久入队,再结束原回合,验证已保留的调用上下文能接纳排队复核;已有但失败的上下文捕获不会被替换。既有公开提供方 CI 作业强制运行该 fixture 并上传报告。
等待超时或仅断开显示界面不等同于取消工作。但关闭受信任的源桌面管道或进程会撤销该接收端 peer;持久任务和请求记录仍保留用于如实对账,不会将原执行静默改绑到另一个桌面连接。
本地所有者路径与 federation 路径
Section titled “本地所有者路径与 federation 路径”发现目录的可选 route_kind 标注两条明确分离的路径;旧响应省略该字段时仍表示 federation。
owner-local:通过真实受信任桌面所有者连接控制已经注册的本地 Coding 运行时,无需开启 federation 或另建接收端授权存储。源任务仍须具有精确目标授权;接收端使用固定的非人类 actor,保留原所有者和父会话,并在实际执行时重新校验源授权有效性。federation:使用单独公布的 federation 身份及接收端资源策略。注册连接本身不授予委派访问权限。
两条路径拥有不同且稳定的不透明主机身份。应原样使用目录返回的 locator,不向发送请求添加 route_kind,也不把已保存的 federation locator 改作所有者路径。拒绝、超时或连接不可用时均不自动切换;重名目标须明确选择,不能猜测。Personal 不自动开启 federation、不获取凭据,也不采用调用方报文声称的 owner 位。远程或不受信任连接不会因此取得本地所有者路径。
隔离的控制器复核
Section titled “隔离的控制器复核”主机公布 session-turn-tool-policy.v1,且所选 agent.tools/resolve-own 提供方能确认当前直接决策工具绑定时,Personal 通过既有任务 outbox 唤醒隔离的主助手复核回合。实际模型请求必须只包含该决策工具,不能包含 Code Mode 执行包装器或其他工具。真实主机提供的会话、回合、请求身份必须匹配已保存的任务版本和工作请求;工作输出不能指定其他任务或授予权限。
决策工具只记录意图。复核回合成功结束后,对账才一次性应用:接受回复、询问用户,或在同一任务版本和既有根授权下向同一目标发出新的继续请求。原始工作回复及继续决策保留在对应执行记录中。接受是控制器判断,不是独立核验。
普通用户输入排队,不混入隔离复核;所有者仍能中断。中断、停止、撤权或过期的复核不能靠迟到回调重新应用意图。回合结束后恢复普通工具策略。缺少主机支持或所选绑定时仍使用禁用工具的只读通知;实际决策工具不可用时保留待复核状态,不启用更广工具或无限重试。