子代理让渡交接¶
子代理注册表在 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 的现有回退策略在不重试该投递的情况下解析计划结果。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw