跳转至

子代理让渡交接

子代理注册表在 sessions_yield 过程中拥有完成所有权。让渡后的执行即告结束;委派的任务及其完成受众仍然保留。注册表的请求者结算批次在子项结算完毕后启动继任回合。必要时,Gateway 准入会将继任者附加到已暂停的子代理上,同时保留其原始请求者。

该设计同样适用于从交互式会话派生的编排器,以及从隔离的 cron 运行中派生的编排器。cron 负责定时结果的投递,而注册表负责嵌套编排器的延续。

交接过程中的所有权

阶段 所有者 必需交接
执行中的请求者 已准入的代理回合 子项通过 requesterTurnRunId 识别其生成回合。进度回调使用该回合的有效权限。
显式让渡 注册表请求者让渡结算 持久化让渡意图,冻结子项运行 ID,推进批次世代,并清除旧的请求者回合绑定。
等待子项 注册表生命周期与 requesterSettleWake 保留已捕获的完成结果,并安排应交付的批次。单个公告不得启动与之竞争的延续。
结算分发 请求者结算唤醒投递 验证当前批次与 Gateway 所有者,为嵌套请求者分发幂等的内部延续,并记录其结果。
继任者准入 Gateway 任务跟踪与暂停运行接管 在新准入的运行 ID 下继续已暂停的任务,保留请求者谱系及其未完成的结算义务。
继任者完成 注册表完成投递 将编排器的结果投递给其原始请求者。cron 现有的延续与投递策略掌管定时输出。

实现所有者是 subagent-registry-requester-yield.ts、subagent-announce.requester-settle-wake.ts 和 agent-task-tracking.ts。adoptPausedSubagentRunForFollowUp 使用现有的注册表替换操作;它不会创建第二个委派任务。

在注册表接受等待后,显式的 waitFor: "message" 计为延续证据。该尝试会将这一事实纳入终态回复呈现,因此已注册的消息等待不会产生缺失延续警告。被拒绝或未注册的等待不提供该证据。

私有子项结果会等待其生成回合结算完毕后,方可进行单个公告准入。常规结算会恢复每个已完成的私有子项,即使其兄弟子项仍在运行。显式让渡先分配冻结的批次,然后在该所有者之下恢复子项清理。迟到的公告失败无法取代批次的投递状态;已提交的投递证据仍然有效。重启激活会在恢复子项完成之前,先核对保留的请求者回合绑定。

对于嵌套请求者,结算会在安排延续之前,将其暂停的运行与子项唤醒批次一并持久化。这也涵盖了在请求者让渡之前就已完成的子项:继任者准入不得依赖后续的生命周期结束通知。继任者保留同一任务,且来自前驱的延迟通知无法重新开启该任务。

当请求者执行结算唤醒延续时,其自身的完成批次仍可标记为分发中。让渡工具会将那一确切批次从较早的待处理子项中排除:它不得为已在处理中的结果再次承诺唤醒。无关的待处理批次和新派生的任务保留其现有的完成所有权。

结算分发使用 subagent_settle 输入来源(provenance)。单个公告和较旧的后代唤醒路径保留 subagent_announce:后者在分发后已拥有其运行替换,不得在准入时触发暂停运行接管。来源信息对交接进行分类;有效的 Gateway 准入与注册表所有权仍然为其授权。

显式让渡批次必须在任何请求者深度上均符合资格。普通的嵌套波次排除仍适用:没有让渡批次的嵌套运行使用现有的后代结算路径。顶层 cron 排除也仍适用;为 cron 会话启动独立的请求者结算回合,会与其调度器拥有的延续形成竞争。

不变量

  • 单一完成所有者。 让渡在关闭旧执行之前转移所有权。对于确切回合和子项批次,若已存在可见的最终回执,则可防止重新触发已履行的义务。成功的批次结算会使该世代退役;重复的回调无法再次将其终结。
  • 无可恢复的权限。 存储的运行 ID 或来源信息均不能恢复已关闭的执行。继任者通过正常的 Gateway 准入,并获取全新的执行权限。接管保留的是任务谱系,而非旧的工具、审批、渠道或工作线程回调。取消、重置和所有者替换保留其现有的准入与清理门槛。
  • 作用域限定的自动化管理。 经认证的 Control UI 管理员显式让渡,可将自动化管理转移给其已验证的请求者延续。注册表在让渡之前捕获有效权限,在整个批次持久化之后提升该权限,并将新的管理授权绑定到已准入的继任者。它绝不会转移自动化创建能力、旧授权或直接用户身份。交接仅限进程内,并可通过新的直接用户回合、取消、会话重置或归档以及 Gateway 重启来撤销。继任者绑定其运行作用域后,该作用域将持有该权利直至关闭。退役已投递的子项批次不会撤销仍在运行的请求者。
  • 完成来源托管。 注册表将有效操作者来源与执行分开保留。单个投递和请求者结算使用该已捕获的权限上限,而非后续安排清理的异步调用方。已提交的结算、退役或来源/Gateway 撤销会释放该权限;临时写入和同任务替换不能丢弃该权限。释放后,保留的结果不再包含可用的权限,且批次不能合并不兼容的操作者来源。仅含取消的批次保留现有取消调用方的准入,而非使用已被撤销的目标来授权新回合。混合结果/取消批次要求每个原始来源保持有效且兼容。显式投递重试在有效状态下捕获其新准入的调用方,并仅在新投递世代提交后才转移托管;它不会重新开启已过期的来源。重启仍然准入新的恢复所有者,而不是恢复先前的进程能力。
  • 稳定的受众。 嵌套唤醒使用内部投递。针对活跃的 sessions_yield 暂停行的结算延续会接管该行;无关的会话间消息不会接管该行。控制父代理向其暂停的原生子项发送的普通 sessions_send,会通过与显式 mode: "resume" 相同的精确世代准入所有者来恢复现有任务。任务拥有的完成仍是唯一的结果投递路径。显式的 mode: "followup" 保持独立的活动跟踪,并保留子项的原始结果或待处理的让渡不变。指定新请求者的显式插件后续操作会继续创建其自身的投递义务。
  • 确定性批次。 冻结的运行 ID 已排序。发现结果使用创建时间、完成时间和子会话身份作为并列决胜条件。已取代的子项行会被排除。批次身份包括请求者身份、子项 ID 和让渡世代。
  • 有界投递。 现有限制保持不变:三次尝试、三次不明确传输重放和十次过期延期。活跃后代不会消耗过期延期预算。在当前批次最早子项创建之前就已结束的执行,其投递簿记不得阻塞该批次的延续。与该批次重叠的活跃后代和投递结算仍然持有唤醒;历史失败记录仍然可用。私有让渡的观察超时不会取消底层的 Gateway 回合。当 Gateway 将该回合报告为进行中时,结算会观察同一请求,而不会消耗失败尝试或丢弃子项结果。Gateway 准入和执行保留各自的超时;显式取消仍然会停止该回合。单个私有公告保留其现有的投递截止时间。发现结果上限为 4,096 字符,单个结果上限为 512 字符,路由通知上限为 1,024 字符。不明确重放复用其尝试键;它不会在 Gateway 重启之间断言全局精确一次投递。

进度在 yield 之后

yield 关闭旧的执行,而不是委托的工作。当回合否则将保持静默时,共享回复管道可以发送等待确认。原生 subagent 注册表保留完成义务,并通过其已接受的完成路径唤醒请求方;进度文本并不是子代理已完成或其结果已送达的证明。

当结算恢复一个具有自动通道投递的顶层父级时,OpenClaw 会在该延续执行期间保持通道的正在输入指示器处于活动状态。指示器在执行开始后启动,而不是在准入排队期间启动,并在调用结算、被取消或失去其所有者时停止。它遵循 typingMode: "never",使用 agents.defaults.typingIntervalSeconds 刷新节奏,并要求通道支持正在输入功能。私有和嵌套延续不会向外部通道发送活动。此活动信号不会更改已配置的消息队列模式,也不会恢复单个工具进度消息。

基于 Tasks 的分离式展示器及其通知策略不再可用。已 yield 的回合不会启动单独的任务或流投影来持续编辑通道进度消息。普通通道流式传输在其回合活动期间仍遵循通道的设置。

进度卡片 仍然是持久的会话状态。父级在工作推进时以及子结果返回时更新自己的卡片。通过 子代理命令 和会话历史检查原生子状态或保留的消息。已保存的卡片或存储的消息 ID 均不会授权新的执行或投递。

Cron 在开始其有界的综合宽限期之前,会观察注册表的后代结算边界。已 yield 的任务在最后一个工作者结束与后继者准入之间保持待定;后继者及其完成投递必须先结算,然后 cron 才能选择最终结果。执行等待、结算观察和综合共享现有的后续截止时间,并在 cron 取消时停止。暂停或永久失败的子投递保留注册表的终止语义,允许 cron 的现有回退策略在不重试该投递的情况下解析计划结果。

有关工具行为,请参阅 Subagents;有关通道展示,请参阅 进度草稿。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw