10A AGENT / OWNERSHIP

谁负责结束这个 Agent?

比较同一个父 Agent P 与子实例 C。改变调用 Context 和 parentAgent,分别观察资源归属与 Registry 分类。

01 / 创建入口

调用方和登记关系都指向 P

C 的 lifecycle effect 登记在 P.ctx,Registry 的 parentAgent 也指向 P。两种关系一致,各自承担自己的职责。

Registry 记为子实例,资源仍由 root 持有

parentAgent 只进入 Registry 的 owner 字段;它不会把已经登记在 root 的 lifecycle effect 搬到 P 的 Scope。

Registry 列为根,资源仍随 P 的 Scope 退出

资源归属来自调用方 Context;省略 parentAgent 不会抹掉这条 effect 关系,但 Registry 仍把 C 列在 roots 中。

调用方和工厂共同持有 Agent 的清理责任上层工厂与调用方都能进入同一次共享清理,下层 Scope 与 Session 由该过程退出。切换案例只改变调用方 Context;parentAgent 和 parentSession 的查询关系在下方独立展示,连线不表示持久谱系。工厂持有调用方持有收回 Scope关闭与注销工厂提供者track(dispose)P.ctx 的 FiberP 退出会触发这里root 的 FiberP 退出不触发这里P.ctx 的 FiberP 退出会触发这里同一次共享清理handle.dispose → teardownC 的 Agent Scope先停止活动,再释放实例资源C 的活 Session如有写 handle,先关闭
工厂提供者调用方 / Scope共享清理Session

工厂提供者 → 同一次清理提供者卸载会收回它创建的实例。

P.ctx 的 Fiber → 同一次清理P 退出会触发这里;资源归属由调用入口决定。

清理 → C 的 Scope 与活 Session停止活动、释放 Scope、如有写 handle,先关闭。

工厂提供者 → 同一次清理提供者卸载会收回它创建的实例。

root 的 Fiber → 同一次清理P 退出不触发这里;资源归属由调用入口决定。

清理 → C 的 Scope 与活 Session停止活动、释放 Scope、如有写 handle,先关闭。

工厂提供者 → 同一次清理提供者卸载会收回它创建的实例。

P.ctx 的 Fiber → 同一次清理P 退出会触发这里;资源归属由调用入口决定。

清理 → C 的 Scope 与活 Session停止活动、释放 Scope、如有写 handle,先关闭。

P 退出后,C 已完成清理
这里比较父 Agent P 的退出;工厂提供者退出仍会触发对 C 的清理。

P 退出后,C 仍然存活
这里比较父 Agent P 的退出;工厂提供者退出仍会触发对 C 的清理。

P 退出后,C 已完成清理
这里比较父 Agent P 的退出;工厂提供者退出仍会触发对 C 的清理。

02 / 分开检查三种关系

const child = await P.ctx.agents.create({
  sessionId: childId,
  parentAgent: P,
})

await parentHandle.dispose()
// C 的 Scope、写 handle 与活登记已退出。
const child = await root.agents.create({
  sessionId: childId,
  parentAgent: P,
})

await parentHandle.dispose()
// C 仍存活;应由 child.dispose() 等入口清理。
const child = await P.ctx.agents.create({
  sessionId: childId,
})

await parentHandle.dispose()
// C 随调用方清理,roots() 的分类不代替清理。
查询结果
entry.ownerP 的确切 Agent 对象
roots().includes(C)否
meta.parentSession另行提供的持久谱系,不参与 effect 迁移
查询结果
entry.ownerP 的确切 Agent 对象
roots().includes(C)否
meta.parentSession另行提供的持久谱系,不参与 effect 迁移
查询结果
entry.ownerundefined
roots().includes(C)是
meta.parentSession另行提供的持久谱系,不参与 effect 迁移
P 退出后,C 已完成清理

parentAgent 不会自动迁移清理函数。
parentSession 不会自动建立进程内 owner。
工厂与返回 handle 仍可结束 C 的生命周期。
P 退出后,C 仍然存活

parentAgent 不会自动迁移清理函数。
parentSession 不会自动建立进程内 owner。
工厂与返回 handle 仍可结束 C 的生命周期。
P 退出后,C 已完成清理

parentAgent 不会自动迁移清理函数。
parentSession 不会自动建立进程内 owner。
工厂与返回 handle 仍可结束 C 的生命周期。
查看实验依据与边界

核心运行时实验 23–25,未挂载 Subagent 管理器等额外消费者。资源 owner、Registry owner 与持久谱系独立设置;这张图不表示权限校验或完整 Turn 状态机。

agent/src/index.ts:391–415, 459–479, 570–600 · agent-loop/src/index.ts:601–662