@xneog/dsh-subagent 0.1.0 → 0.1.3-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.i18n.yaml +2 -2
- package/README.md +108 -76
- package/README.zh.md +112 -80
- package/lib/index.js +1258 -718
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +923 -0
- package/lib/typert.remote-client.d.ts +27 -0
- package/lib/typert.remote-client.js +159 -0
- package/lib/types/assistant-output.d.ts +3 -3
- package/lib/types/assistant-output.js +8 -4
- package/lib/types/child-agent.d.ts +16 -5
- package/lib/types/child-agent.js +51 -13
- package/lib/types/client.d.ts +2 -1
- package/lib/types/client.js +1 -1
- package/lib/types/continuation.d.ts +100 -72
- package/lib/types/continuation.js +439 -169
- package/lib/types/control-types.d.ts +144 -0
- package/lib/types/control-types.js +9 -0
- package/lib/types/control.d.ts +67 -0
- package/lib/types/control.js +115 -0
- package/lib/types/descriptor-seed.d.ts +1 -1
- package/lib/types/descriptor-seed.js +1 -1
- package/lib/types/descriptor.d.ts +6 -1
- package/lib/types/descriptor.js +6 -2
- package/lib/types/index.d.ts +103 -69
- package/lib/types/index.js +436 -287
- package/lib/types/internal.d.ts +59 -0
- package/lib/types/internal.js +58 -0
- package/lib/types/lifecycle.js +4 -3
- package/lib/types/list-children.d.ts +12 -59
- package/lib/types/list-children.js +166 -101
- package/lib/types/out-of-process.d.ts +5 -2
- package/lib/types/out-of-process.js +42 -4
- package/lib/types/projection-types.d.ts +4 -3
- package/lib/types/projection.d.ts +55 -8
- package/lib/types/projection.js +33 -17
- package/lib/types/run-settlement.js +17 -6
- package/lib/types/types.d.ts +25 -0
- package/package.json +67 -37
- package/lib/types/activation-setup-registry.d.ts +0 -57
- package/lib/types/activation-setup-registry.js +0 -148
package/README.zh.md
CHANGED
|
@@ -1,122 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "面向用户与维护者的 subagent 委派 seam,用于选择提供方后端、组装委派工具或排查子 agent 运行问题。"
|
|
3
|
+
kind: "package-reference"
|
|
4
|
+
---
|
|
5
|
+
|
|
1
6
|
# @xneog/dsh-subagent
|
|
2
7
|
|
|
3
8
|
[English](README.md) | 中文
|
|
4
9
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
[subagent 家族概述](../README.md)列出了实现和面向模型的消费方。本包负责提供方注册表、共享请求和结果约定、持久描述符以及可继续子级编排。多个具名提供方可以在该约定背后共存。
|
|
8
|
-
|
|
9
|
-
## 服务 API
|
|
10
|
-
|
|
11
|
-
`SubagentRuntime` 具有以下操作:
|
|
12
|
-
|
|
13
|
-
| 成员 | 含义 |
|
|
14
|
-
|---|---|
|
|
15
|
-
| `registerProvider(provider)` | 按名称注册一个可信的同进程实现。注册受 effect 作用域约束;移除注册会阻止新的启动,但不会撤销已返回给调用方的运行。重复名称会明确报错。 |
|
|
16
|
-
| `getProvider(name)` | 返回提供方;不存在时返回 `undefined`。 |
|
|
17
|
-
| `list()` | 按插入顺序返回提供方名称。 |
|
|
18
|
-
| `start(name, request)` | 校验普通调用方请求,解析其已分离的 `one-shot` 描述符,然后等待提供方发布真正的一次性子 agent。兑现时返回由持有方拥有的 `SubagentRun`;如果调用被拒绝,提供方已经清理所有尚未发布的启动资源。发布后的轮次故障或基础设施故障则通过该 run 结算。可继续子 agent 绝不通过此操作进入。 |
|
|
19
|
-
| `startContinuable(spec)` | 建立一个持久化的可继续子 agent,并投递其初始提示词。子 agent 的 inbox 一接受该提示词,调用就会兑现为 `{ childId, messageId }`,无需等待轮次开始,也无需等待消息写入会话日志。在此之前发生的任何失败都会使调用被拒绝,不返回任何 id,并完全回滚该子 agent。要求 `ctx.agents`、会话持久化以及具备 `prepareContinuable` 能力的提供方。 |
|
|
20
|
-
| `followup(parent, childId, content, { source, signal })` | 将来自确切在线直接父级的一条后续消息作为子 agent 的下一个 FIFO 轮次投递,术语与 `Agent.followup()` 一致,并返回被接受的 `MessageId`。驻留中的子 agent 由其 inbox 直接接受(唤醒处于 waiting 的 Activation);不驻留的则从其持久化会话冷恢复。要求 `ctx.agents`;冷恢复还要求会话持久化。 |
|
|
21
|
-
| `interrupt(targetSessionId, authority)` | 凭人类出示的持久化父级地址 `{ kind: 'user', parentSessionId }`,或确切在线的祖先 Agent `{ kind: 'ancestor', agent }` 进行授权,中断一个在线可继续子级的当前轮次。准入判定同步完成,但取消异步生效:该操作发出 `Agent.cancel(cause, { keepInbox: true })` 后立即返回,不等待目标观察到信号。尚未领取的待处理 inbox 工作、Activation 和已发布的后代均会保留;已经领取到被中断轮次中的工作不会重新入队。目标不存在时视为已接受的空操作;错误的父级地址,或陈旧、指向自身、并非祖先的调用方,会以 `UNAUTHORIZED` 被拒绝。 |
|
|
22
|
-
| `reportFrom(child, content, { delivery, signal })` | 从确切在线可继续 child 向其确切在线直接 parent 投递一条选中消息,并返回已接受的稳定 `MessageId`。静默投递会注入上下文;唤醒投递会提交一个后续 parent 轮次。 |
|
|
23
|
-
| `registerContinuableSetup(contribution)` | 把一项可选部署能力组合到每个可继续 child 尚未发布的作用域中,并支持从驻留 child 立即撤销。 |
|
|
24
|
-
| `drainContinuableDescendants(parents)` | 在由 host 拥有的确切在线父级 Agent 之下关闭准入,只停止这些父级可见的可继续后代;等待已在这些根节点下获准的物化过程完成发布或回滚后,再按子级优先顺序释放所选的各棵树。该截止状态会持续到每个确切父级离开注册表;无关的父级树仍在线,管理器全局准入仍保持开放。 |
|
|
25
|
-
| `listChildren(parentSessionId, signal?)` | 按 `createdAt`、再按 id 的顺序列出由会话支撑的直接 subagent,包括其 `one-shot`/`continuable` 模式、`running`/`inactive` 活动状态、根据 origin 分类得出的一层 `hasChildren` 提示,以及每个子级的诊断信息,且不会加载或恢复它们。该操作直接读取在线会话存储和可选的会话持久化(没有持久化时只枚举在线子级),并要求已挂载 `sessionProjections` 注册表;不要求 `ctx.agents`、继续执行管理器或任何查询服务。 |
|
|
26
|
-
| `listDescendants(rootSessionId, signal?)` | 从同一份在线优先语料按稳定 pre-order 展平根的完整会话树,并为每个 subagent 条目附加持久 `parentId` 与相对根的 `depth`。普通会话与一次性 child 仍作为遍历节点,因此其下的可继续后代仍可发现。身份、diagnostic、依赖与取消约定均沿用 `listChildren()`。 |
|
|
27
|
-
|
|
28
|
-
`SubagentStartRequest.label` 是由会话支撑的一次性 child 所使用的可选简短持久化显示标签。面向模型的委派会提供其已有的 `description`;底层调用方无需凭空构造展示元数据。可继续启动始终携带自身的必填标签。`signal` 是必填项,也是一次性 `start` 的规范取消通道。发布前中止会使 `start()` 在回滚后拒绝;发布后中止会取消已返回 run 的剩余轮次工作,但不会隐藏其 id。请求还可以选择模型、要求结构化输出、限制委派深度、约束子 agent 工具或设置子 agent persona。对于可继续启动或后续操作,调用方信号只负责 inbox 接受前的查找、物化和准入;此后,Activation 由管理器独立拥有,因此调用方取消既不会取消已接受的轮次,也不会 dispose(资源释放)子 agent。
|
|
29
|
-
|
|
30
|
-
后续操作的权限来自子 agent 持久化 header 中记录的确切在线直接父级。冷恢复会在重建前检查该权限,并在最终无 await 的 inbox 准入区间再次检查,因此在物化期间被注销或替换的 parent 无法授权投递。后续操作上的 `source` 记录谁提供了所投递的消息,不授予任何权限。
|
|
10
|
+
## 概述
|
|
31
11
|
|
|
32
|
-
|
|
12
|
+
`dsh-subagent` 是子 agent 委派背后的服务:agent(智能体)把任务交给具名子 agent,收集完成的结果,并且——对可继续子 agent 而言——跨轮次持续发送后续工作。多个提供方在同一约定下共存,因此单个组合可以并排提供进程内子 agent、进程外 ACP 或 SDK 子 agent,以及真实 Codex 或 Claude Code 子 agent。子 agent 有两种形态:一次性运行以单个结果结算,可继续子 agent 的持久会话则接受后续消息并可被中断。同一服务还回答发现类问题——存在哪些子级、它们的模式、活动状态与血缘——而不加载或恢复它们。把它与至少一个提供方后端和一个委派工具一起挂载;后端与面向模型的工具位于兄弟包中。
|
|
33
13
|
|
|
34
|
-
##
|
|
14
|
+
## 目录
|
|
35
15
|
|
|
36
|
-
|
|
16
|
+
- [使用本包](#use-this-package)
|
|
17
|
+
- [理解实现](#understand-the-implementation)
|
|
18
|
+
- [进一步探索](#further-exploration)
|
|
19
|
+
- [模型体验](#model-experience)
|
|
20
|
+
- [已知限制与延期工作](#known-limitations-and-deferred-work)
|
|
21
|
+
- [开发备注](#dev-note)
|
|
37
22
|
|
|
38
|
-
|
|
39
|
-
- `depthLimit`:强制执行 `maxDepth`;
|
|
40
|
-
- `toolFilter`:应用请求的子 agent 工具限制;
|
|
41
|
-
- `persona`:应用每个子 agent 独立的 persona。
|
|
23
|
+
-----
|
|
42
24
|
|
|
43
|
-
|
|
25
|
+
<a id="use-this-package"></a>
|
|
26
|
+
## 使用本包
|
|
44
27
|
|
|
45
|
-
|
|
28
|
+
本包是每个委派组合都共享的约定。你通过把服务与一个或多个提供方后端以及面向模型的委派工具一起挂载来启用它;此后 agent 即可委派工作,服务会把每个请求路由到具名提供方。
|
|
46
29
|
|
|
47
|
-
|
|
30
|
+
### 启用委派
|
|
48
31
|
|
|
49
|
-
|
|
32
|
+
把服务与一个提供方和委派工具一起挂载。提供方以你配置的名称注册(进程内 spawn 后端默认为 `spawn`);工具行指名该提供方,让模型看到一个静态工具。一个最小的一次性配置:
|
|
50
33
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
34
|
+
```yaml
|
|
35
|
+
- name: '@xneog/dsh-subagent'
|
|
36
|
+
- name: '@xneog/dsh-subagent-spawn-in-process'
|
|
37
|
+
- name: '@xneog/dsh-tool-subagent'
|
|
38
|
+
config:
|
|
39
|
+
provider: spawn
|
|
40
|
+
toolName: subagent
|
|
41
|
+
```
|
|
54
42
|
|
|
55
|
-
|
|
43
|
+
调用该工具的 agent 会把子 agent 的最终答案作为工具结果收到。只挂载服务本身不会改变任何行为:在组合出提供方和工具之前,什么都不能委派。
|
|
56
44
|
|
|
57
|
-
|
|
45
|
+
### 一次性与可继续子级
|
|
58
46
|
|
|
59
|
-
|
|
47
|
+
一次性子 agent 只运行一次,并以单个结果结算,可附带可选的结构化输出与失败时的安全诊断。启动请求可以通过 `agentOptions` 覆盖子 Agent 的提供方、模型、推理等级与输出 token 上限;每个请求的选项都要求提供方声明对应能力。可继续子 agent 保留持久会话并按顺序接受后续消息:调用方收到稳定的子 agent id、发送相邻 Agent 消息,并可中断当前轮次而不销毁子 agent。工具行的 `backgroundMode` 选择形态(默认 `one-shot`,或在支持的提供方上使用 `continuable`)。
|
|
60
48
|
|
|
61
|
-
|
|
49
|
+
### 消息、中断与发现
|
|
62
50
|
|
|
63
|
-
|
|
51
|
+
每个确切在线 Agent 都可以对直接可继续 child 使用 `sendMessage()`;驻留的可继续 child 还可以对自己的直接 parent 使用它。正在工作的目标通过 Steer 在最近 step 接收消息;空闲目标启动轮次,且只有直接 child 可以冷恢复。parent 也可以随时中断正在运行的后代或列举自己的子级。浏览器发出的继续执行 prompt 可以携带图片部分:Host 先通过附件存储完成整批图片的准入与持久化,子级 inbox 才接受这条消息;当子级声明的模型不接受图片输入时拒绝投递。发现覆盖两种形态:服务列举直接子级与完整后代树——模式、活动状态与血缘——直接读取在线会话状态与可选持久化,不加载任何子 agent。
|
|
64
52
|
|
|
65
|
-
|
|
53
|
+
### 失败与恢复
|
|
66
54
|
|
|
67
|
-
|
|
55
|
+
需要所选提供方不具备的能力的请求会在启动时响亮失败,而不会被静默忽略。失败的子 agent 运行会返回停止原因,提供方后端还会附加安全诊断;被取消的请求以 `aborted` 结算。子 agent 相互隔离:崩溃或行为异常的子 agent 无法破坏父级会话。
|
|
68
56
|
|
|
69
|
-
|
|
57
|
+
-----
|
|
70
58
|
|
|
71
|
-
|
|
59
|
+
<a id="understand-the-implementation"></a>
|
|
60
|
+
## 理解实现
|
|
72
61
|
|
|
73
|
-
|
|
62
|
+
<details>
|
|
63
|
+
<summary>实现细节——点击展开</summary>
|
|
74
64
|
|
|
75
|
-
|
|
65
|
+
本节解释服务的构建方式以及可观察行为从何而来;完整约定见[使用本包](#use-this-package)。
|
|
76
66
|
|
|
77
|
-
|
|
67
|
+
### 设计理念
|
|
78
68
|
|
|
79
|
-
|
|
69
|
+
- **一个服务,多个提供方。** 服务是具名提供方注册表;每个后端以唯一名称注册,请求按名称选择一个。
|
|
70
|
+
- **两种子级形态。** 一次性运行在发布时转移所有权;可继续子级保留持久 Session,且同一时刻至多一个进程内 Activation。
|
|
71
|
+
- **兑现即发布。** 提供方的 `start()` 只有在真实子 agent 存在后才兑现,因此调用方要么拥有一段在线运行,要么一无所有。
|
|
72
|
+
- **同进程值可信。** 请求、描述符与结果按不可变约定借用;序列化与不可信输入校验属于进程与协议边界。
|
|
80
73
|
|
|
81
|
-
|
|
74
|
+
### 源码地图
|
|
82
75
|
|
|
83
|
-
|
|
76
|
+
| 文件 | 职责 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| [`src/index.ts`](src/index.ts) | 服务入口:提供方注册表、启动与继续 API、生命周期事件 |
|
|
79
|
+
| [`src/continuation.ts`](src/continuation.ts) | 可继续子级:身份预留、Activation 驻留、相邻消息、中断、结算 |
|
|
80
|
+
| [`src/internal.ts`](src/internal.ts) | 供浏览器与 Team 消息协议使用的 host-only Queue 与 Steer 适配器 |
|
|
81
|
+
| [`src/types.ts`](src/types.ts) | 公开的请求、结果与提供方约定 |
|
|
82
|
+
| [`src/descriptor.ts`](src/descriptor.ts) | 版本化的 `subagent/descriptor` 会话事件词汇 |
|
|
83
|
+
| [`src/child-agent.ts`](src/child-agent.ts) | 子级组装、委派策略、深度辅助函数 |
|
|
84
|
+
| [`src/list-children.ts`](src/list-children.ts) | 基于在线会话存储与可选持久化的发现 |
|
|
85
|
+
| [`src/control.ts`](src/control.ts) | 浏览器控制面组装:目录活性采样、浏览器时区校验、失败分码 |
|
|
86
|
+
| [`src/control-types.ts`](src/control-types.ts) | client-safe 的目录行、控制面请求、回执与失败 |
|
|
84
87
|
|
|
85
|
-
|
|
88
|
+
### 一次性流程
|
|
86
89
|
|
|
87
|
-
|
|
90
|
+
请求先对照提供方声明的能力进行校验,随后对持久化描述符做快照,再由提供方构建子 agent。两个进程内提供方都声明 `agentOptions`:创建子级时把请求字段叠加到父级最新已记录请求的提供方、模型与推理等级之上;父级还没有请求时回退到创建选项,并保留配置的 token 上限。更改路由而不显式指定推理等级时,会清除继承的路由自有等级,使所选模型解析自己的默认值。DSH SDK 也声明该能力并公开不可变的 `agentRouteDefaults`,使其实例持有的提供方/模型默认值在确切路由预检前成为基线;`start()` 仍负责直接调用方与输出上限。ACP、Codex 与 Claude Code 会拒绝 agent 路由覆盖,而不是静默忽略。成功时运行被发布、所有权转移给调用方;失败时提供方回滚每个尚未发布的资源。结果携带子 agent 的最终输出、可选的结构化值、停止原因与可选的安全诊断。
|
|
88
91
|
|
|
89
|
-
|
|
92
|
+
### 可继续流程
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
管理器预留 child 身份、解析持久化描述符、创建(或冷恢复)child、把它安装进 Activation 并提交提示词。模型编写的消息通过固定 Steer 调度跨一条 parent/child 边;host 协议保留内部 Queue 适配器以创建独立轮次。直接 child 不存在 Activation 时会从持久化会话冷恢复。当驻留 Activation 结算时,管理器会在 parent 自身的轮次流中告知该 child 的直接 parent。
|
|
92
95
|
|
|
93
|
-
|
|
96
|
+
### 所有权与不变式
|
|
94
97
|
|
|
95
|
-
|
|
98
|
+
- **发布即边界**——发布前提供方拥有设置并须在失败时回滚;发布后调用方拥有运行并须 dispose(资源释放)它。
|
|
99
|
+
- **注册受 effect 作用域约束**——移除提供方会阻止新启动,但绝不撤销已接受的运行。
|
|
100
|
+
- **Agent 消息权限基于确切相邻关系**——`sendMessage()` 要求确切在线 sender;每个 sender 都可以指定直接可继续 child,只有具备驻留可继续 Activation 的 sender 可以指定自己的直接 parent。
|
|
101
|
+
- **描述符仅进日志**——它是会话事件,不进入模型历史,并跨压缩(compaction)保留;可继续描述符会显式记录解析后的子级提供方、模型与推理等级,用于冷恢复。
|
|
96
102
|
|
|
97
|
-
|
|
103
|
+
</details>
|
|
98
104
|
|
|
99
|
-
|
|
105
|
+
-----
|
|
100
106
|
|
|
101
|
-
|
|
107
|
+
<a id="further-exploration"></a>
|
|
108
|
+
## 进一步探索
|
|
102
109
|
|
|
103
|
-
|
|
110
|
+
当包级约定不够用时阅读以下页面。它们从共享 seam 逐步进入后端、面向模型的工具与设计决策。
|
|
104
111
|
|
|
105
|
-
|
|
112
|
+
- [Subagent 子系统](../../../docs/subsystems/subagent.zh.md)——服务约定、提供方约定与终态结果语义。
|
|
113
|
+
- [Subagent 能力 seam](../../../.agents/notes/implemented/feature/2026-06-21-subagent-capability-seam.zh.md)——委派能力家族的设计记录。
|
|
114
|
+
- [可续跑后台 subagent](../../../.agents/notes/implemented/feature/2026-07-21-continuable-background-subagents.zh.md)——接受后续轮次的持久子级。
|
|
115
|
+
- [进程内 spawn 后端](../subagent-spawn-in-process/README.zh.md)——最容易组合的提供方。
|
|
116
|
+
- [进程外 ACP 后端](../subagent-acp/README.zh.md)——经 Agent Client Protocol 拥有自有运行时的子级。
|
|
117
|
+
- [合并后的 subagent 控制服务](../../../.agents/notes/implemented/simplification/2026-07-26-merge-subagent-control-service.zh.md)——后续消息、中断与列举面。
|
|
106
118
|
|
|
107
|
-
|
|
119
|
+
-----
|
|
108
120
|
|
|
121
|
+
<a id="model-experience"></a>
|
|
109
122
|
## 模型体验
|
|
110
123
|
|
|
111
124
|
### 结算通知
|
|
112
125
|
|
|
113
|
-
####
|
|
126
|
+
#### 模型看到什么
|
|
114
127
|
|
|
115
|
-
一条用户角色的父级消息,开头是结果本身——`Background subagent <child-id> finished and will do no further work unless you send it more.`,或子级被停止、耗尽额度、拒绝任务或失败时的对应句子——随后是 `Its closing message:` 与子级的最终 assistant 内容;若子级没有产出内容,则是 `It left no closing message
|
|
128
|
+
一条用户角色的父级消息,开头是结果本身——`Background subagent <child-id> finished and will do no further work unless you send it more.`,或子级被停止、耗尽额度、拒绝任务或失败时的对应句子——随后是 `Its closing message:` 与子级的最终 assistant 内容;若子级没有产出内容,则是 `It left no closing message.`。这条由 runtime 生成的通知与模型编写的父子消息相互独立;后者使用 `sendMessage()` 与 `AgentMessageSource`。委派 schema 与模型控制工具归 Consumer 包所有。
|
|
116
129
|
|
|
117
130
|
#### Token 影响
|
|
118
131
|
|
|
119
|
-
父级请求中,每个已结算的 Activation
|
|
132
|
+
父级请求中,每个已结算的 Activation 一条通知,长度取决于子级的最终消息。如果子级先发送自己的消息再结算,父级请求会同时承担两者。
|
|
120
133
|
|
|
121
134
|
#### KV Cache 影响
|
|
122
135
|
|
|
@@ -124,7 +137,7 @@ subagent seam 允许一个 agent(智能体)通过具名提供方把工作委
|
|
|
124
137
|
|
|
125
138
|
### 子级委派范围声明
|
|
126
139
|
|
|
127
|
-
####
|
|
140
|
+
#### 模型看到什么
|
|
128
141
|
|
|
129
142
|
每个进程内子 agent 的运行时上下文快照都携带下方的 `subagent:delegation` 声明,位于沙箱策略与审批策略语句之后。
|
|
130
143
|
|
|
@@ -142,13 +155,32 @@ You are a delegated subagent: your permission scope was fixed when you were star
|
|
|
142
155
|
|
|
143
156
|
子级内部前缀稳定:该声明在子 agent 生命周期内绝不变化,因此只写入第一份运行时上下文快照一次。父级侧不会直接使缓存失效;具名工具消费方共同负责请求前缀的任何变化。
|
|
144
157
|
|
|
145
|
-
##
|
|
158
|
+
## 已知限制与延期工作
|
|
159
|
+
|
|
160
|
+
<a id="known-limitations-and-deferred-work"></a>
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
这些限制说明该 seam 何时不合适,或何时需要特别的运维注意。它们是当前包约束,不是通用委派对比或任务积压。
|
|
164
|
+
|
|
165
|
+
- **ACP 子级仍为一次性,且无法通过追踪枚举**——ACP 运行在父级会话语料中没有本地子会话,远程提供方需要 Activation 所有权约定才能支持可继续子级。
|
|
166
|
+
- **仅允许相邻模型消息**——`sendMessage()` 要求确切在线 sender;每个 sender 都可以指定直接可继续 child,只有具备驻留可继续 Activation 的 sender 可以指定自己的直接 parent。浏览器提示使用独立的 Queue 控制路径。
|
|
167
|
+
- **child 到 parent 的投递要求直接 parent 保持在线**——服务没有持久 parent mailbox;parent 缺失时会拒绝消息,而非接受无法唤醒的工作。
|
|
168
|
+
- **取消收敛期间存在唤醒缺口**——中断信号发出后、driver 进入 idle 前被接受的后续消息会保持排队,直到另一条唤醒发送到达。
|
|
169
|
+
- **驻留仅限进程内**——Activation inbox 与所有权图不会在两个 harness 进程之间协调;对单个持久化存储的并发访问需要持久化邮箱与跨进程租约协议。
|
|
170
|
+
- **不回放已接受但未记录的消息**——崩溃可能丢失从未写入子会话日志、已被接受的提示词;丢失的消息不会自动回放。
|
|
171
|
+
- **没有持久化 parent mailbox**——child 到 parent 的消息要求驻留的可继续 child 与在线直接 parent,提供的是接受标识,不保证恰好一次投递。
|
|
172
|
+
- **生命周期事件只供观察**——影响运行的 `subagent/end` 延续或决策接口仍需等待具体消费方。
|
|
173
|
+
|
|
174
|
+
<a id="dev-note"></a>
|
|
175
|
+
### 开发备注
|
|
176
|
+
|
|
177
|
+
<details>
|
|
178
|
+
<summary>维护者的工作上下文——点击展开</summary>
|
|
179
|
+
|
|
180
|
+
本开发备注是维护者的工作上下文:开放问题与尚未决定的探索方向。它明确不具权威性——已交付的行为与限制以上文和包代码为准。
|
|
181
|
+
|
|
182
|
+
- **跨进程继续执行**——持久化邮箱与租约协议可让两个 harness 进程共享一个持久化存储。
|
|
183
|
+
- **可继续 ACP 子级**——需要持久化远程会话 id 与逐子级的继续执行能力声明。
|
|
184
|
+
- **host-user 投递**——未来的 host 适配器需要具体的经认证交互,该 seam 才能获得用户投递能力。
|
|
146
185
|
|
|
147
|
-
|
|
148
|
-
- **无 host-user 继续执行**:`followup()` 要求确切在线直接父级。只有 `interrupt()` 接受持久化 parent 地址形式的用户授权,因为停止一个轮次是幂等的且不投递任何内容;未来 host 适配器需要具体的经认证交互,才能让该 seam 获得用户投递能力。
|
|
149
|
-
- **不对当前轮次进行 steering**:可继续消息和唤醒式 report 会排入后续轮次,均不会重定向正在进行的轮次。
|
|
150
|
-
- **取消收敛期间存在唤醒缺口**:中断信号发出后、活动 driver 进入 idle 前被接受的唤醒型 follow-up 会保持排队,直到另一条唤醒发送到达。Issue #1838 负责 agent-loop 的唤醒锁存;普通会话取消也受此影响。
|
|
151
|
-
- **驻留仅限进程内**:Activation inbox 与所有权图不会在两个 harness 进程之间协调;对单个持久化存储的并发访问仍然需要持久化邮箱和跨进程租约协议。
|
|
152
|
-
- **不回放已接受但未记录的消息**:只有写入子 agent 会话日志的消息才能连同提供该消息的来源一起重建。崩溃可能丢失从未写入日志、已被接受的初始提示词或后续消息;此后一条经授权的消息可以冷恢复该子 agent,但丢失的消息不会自动回放。
|
|
153
|
-
- **没有持久化的上报 mailbox**:上报需要在线直接父级,提供的是接受标识,不保证恰好一次投递,也不提供已读回执。
|
|
154
|
-
- **生命周期事件只供观察**:影响运行的 `subagent/end` 延续或决策接口仍需等待具体消费方。
|
|
186
|
+
</details>
|