@fishwithcat/dsh-subagent 0.2.2-alpha.2 → 0.2.2-alpha.3

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.
@@ -3,22 +3,16 @@ import { z } from 'zod'
3
3
 
4
4
  import { createTypertRemoteInfo } from '@deepseek-ai/dsh-typert-protocol/remote-info'
5
5
 
6
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0$schema$value
7
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0$schema$value ??= z.string())
8
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1$schema$value
9
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1$schema$value ??= z.string())
10
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2$schema$value
11
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2$schema$value ??= z.literal("continuable"))
12
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_result$schema$value
13
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_result$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_result$schema$value ??= z.object({
6
+ let _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0$schema$value
7
+ const _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0$schema$value ??= z.string())
8
+ let _deepseek_ai_dsh_subagent_subagents_interruptByUser_result$schema$value
9
+ const _deepseek_ai_dsh_subagent_subagents_interruptByUser_result$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByUser_result$schema$value ??= z.object({
14
10
  'accepted': z.literal(true).readonly(),
15
11
  }))
16
12
  let _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0$schema$value
17
13
  const _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0$schema = () => (_deepseek_ai_dsh_subagent_subagents_prompt_parameter_0$schema$value ??= z.object({
18
14
  'requestId': z.string().readonly().describe('Identity persisted on the accepted message, minted before the call.'),
19
- 'parentSessionId': z.string().readonly(),
20
15
  'childSessionId': z.string().readonly(),
21
- 'mode': z.literal("continuable").readonly().describe('Required discriminator retained from the browser control address.'),
22
16
  'delivery': z.union([z.literal("queue"), z.literal("steer")]).readonly().describe('Whether this message queues a later turn or targets the nearest step.'),
23
17
  'content': z.array(z.union([z.object({
24
18
  'type': z.literal("text").readonly(),
@@ -35,18 +29,12 @@ let _deepseek_ai_dsh_subagent_subagents_prompt_result$schema$value
35
29
  const _deepseek_ai_dsh_subagent_subagents_prompt_result$schema = () => (_deepseek_ai_dsh_subagent_subagents_prompt_result$schema$value ??= z.object({
36
30
  'messageId': z.string().readonly(),
37
31
  }))
38
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0_strict$schema$value
39
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0_strict$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0_strict$schema$value ??= z.string())
40
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1_strict$schema$value
41
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1_strict$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1_strict$schema$value ??= z.string())
42
- let _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2_strict$schema$value
43
- const _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2_strict$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2_strict$schema$value ??= z.literal("continuable"))
32
+ let _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0_strict$schema$value
33
+ const _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0_strict$schema = () => (_deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0_strict$schema$value ??= z.string())
44
34
  let _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0_strict$schema$value
45
35
  const _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0_strict$schema = () => (_deepseek_ai_dsh_subagent_subagents_prompt_parameter_0_strict$schema$value ??= z.strictObject({
46
36
  'requestId': z.string().readonly().describe('Identity persisted on the accepted message, minted before the call.'),
47
- 'parentSessionId': z.string().readonly(),
48
37
  'childSessionId': z.string().readonly(),
49
- 'mode': z.literal("continuable").readonly().describe('Required discriminator retained from the browser control address.'),
50
38
  'delivery': z.union([z.literal("queue"), z.literal("steer")]).readonly().describe('Whether this message queues a later turn or targets the nearest step.'),
51
39
  'content': z.array(z.union([z.strictObject({
52
40
  'type': z.literal("text").readonly(),
@@ -63,9 +51,9 @@ const _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0_strict$schema = ()
63
51
  const $remote = createTypertRemoteInfo({
64
52
  package: '@fishwithcat/dsh-subagent',
65
53
  methods: {
66
- 'subagents/interruptByParent': {
54
+ 'subagents/interruptByUser': {
67
55
  service: 'subagents',
68
- description: 'Remote face of {@link interrupt} under one durable parent address. No catalog, history, persistence, or parent Agent lookup runs: the core primitive alone authorizes the address against the live Activation, which is what keeps a live child interruptible while its parent Agent is offline. Absent, idle, and already-completed targets are accepted no-ops there.',
56
+ description: 'Remote face of {@link interrupt}, authorized on the target Session by the Gateway. No catalog, history, persistence, or parent Agent lookup runs. Absent, idle, and already-completed targets are accepted no-ops there.',
69
57
  invocation: { kind: 'direct' },
70
58
  parameters: [
71
59
  {
@@ -75,80 +63,46 @@ const $remote = createTypertRemoteInfo({
75
63
  codec: {
76
64
  mode: 'strict',
77
65
  typeSymbol: '@deepseek-ai/dsh-session/types#SessionId',
78
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0$schema,
66
+ create: _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0$schema,
79
67
  jsonSchema: {"type":"string"},
80
68
  },
81
69
  strictCodec: {
82
70
  mode: 'strict',
83
71
  typeSymbol: '@deepseek-ai/dsh-session/types#SessionId',
84
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_0_strict$schema,
72
+ create: _deepseek_ai_dsh_subagent_subagents_interruptByUser_parameter_0_strict$schema,
85
73
  jsonSchema: {"type":"string"},
86
74
  },
87
75
  },
88
- {
89
- name: 'parentSessionId',
90
- description: 'durable direct parent whose authority is claimed.',
91
- source: 'json',
92
- codec: {
93
- mode: 'strict',
94
- typeSymbol: '@deepseek-ai/dsh-session/types#SessionId',
95
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1$schema,
96
- jsonSchema: {"type":"string"},
97
- },
98
- strictCodec: {
99
- mode: 'strict',
100
- typeSymbol: '@deepseek-ai/dsh-session/types#SessionId',
101
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_1_strict$schema,
102
- jsonSchema: {"type":"string"},
103
- },
104
- },
105
- {
106
- name: 'mode',
107
- description: 'required continuable-address discriminator.',
108
- source: 'json',
109
- codec: {
110
- mode: 'strict',
111
- typeSymbol: '@deepseek-ai/dsh-subagent#subagents/interruptByParent:mode',
112
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2$schema,
113
- jsonSchema: {"type":"string","const":"continuable"},
114
- },
115
- strictCodec: {
116
- mode: 'strict',
117
- typeSymbol: '@deepseek-ai/dsh-subagent#subagents/interruptByParent:mode',
118
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_parameter_2_strict$schema,
119
- jsonSchema: {"type":"string","const":"continuable"},
120
- },
121
- },
122
76
  ],
123
77
  result: {
124
78
  mode: 'strict',
125
79
  typeSymbol: '@deepseek-ai/dsh-subagent/client#SubagentInterruptReceipt',
126
- create: _deepseek_ai_dsh_subagent_subagents_interruptByParent_result$schema,
80
+ create: _deepseek_ai_dsh_subagent_subagents_interruptByUser_result$schema,
127
81
  description: 'acknowledgement that the cancel signal was admitted, not that the target is quiescent.',
128
82
  jsonSchema: {"type":"object","properties":{"accepted":{"type":"boolean","const":true}},"required":["accepted"],"additionalProperties":true},
129
83
  },
130
- sourceLocation: {"file":"packages/subagent/subagent/src/index.ts","line":529,"column":3},
84
+ sourceLocation: {"file":"packages/subagent/subagent/src/index.ts","line":467,"column":3},
131
85
  },
132
86
  'subagents/prompt': {
133
87
  service: 'subagents',
134
- description: 'Deliver one browser-authored message to a continuable child through the exact live direct parent, retaining the caller-minted request identity and validated browser zone on the accepted message. Success identifies the message the child\'s inbox accepted; later execution is independent of this call. Queue delivery targets a later turn; steer delivery targets the nearest step and retains the Agent loop\'s best-effort fallback semantics. Image parts are admitted and persisted through the attachment store before delivery, and the child\'s model must accept image input. Cold resume at capacity rejects with `subagent/delivery-unavailable`.',
88
+ description: 'Deliver one browser-authored message to a continuable child through its live subagent tree root, retaining the caller-minted request identity and validated browser zone on the accepted message. Success identifies the message the child\'s inbox accepted; later execution is independent of this call. Queue delivery targets a later turn; steer delivery targets the nearest step and retains the Agent loop\'s best-effort fallback semantics. Image parts are admitted and persisted through the attachment store before delivery, and the child\'s model must accept image input. Cold resume at capacity rejects with `subagent/delivery-unavailable`. Access is checked on the target Session before attachment admission or restoration.',
135
89
  invocation: { kind: 'direct' },
136
90
  parameters: [
137
91
  {
138
92
  name: 'request',
139
- description: 'durable address, delivery, minted identity, content, and optional browser zone.',
93
+ description: 'target id, delivery, minted identity, content, and optional browser zone.',
140
94
  source: 'json',
141
95
  codec: {
142
96
  mode: 'strict',
143
97
  typeSymbol: '@deepseek-ai/dsh-subagent/client#SubagentPromptRequest',
144
98
  create: _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0$schema,
145
- jsonSchema: {"type":"object","properties":{"requestId":{"type":"string","description":"Identity persisted on the accepted message, minted before the call."},"parentSessionId":{"type":"string"},"childSessionId":{"type":"string"},"mode":{"type":"string","const":"continuable","description":"Required discriminator retained from the browser control address."},"delivery":{"type":"string","enum":["queue","steer"],"description":"Whether this message queues a later turn or targets the nearest step."},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string"}},"required":["type","text"],"additionalProperties":true},{"type":"object","properties":{"type":{"type":"string","const":"image"},"mediaType":{"type":"string","enum":["image/png","image/jpeg","image/webp","image/gif"]},"data":{"type":"string"},"name":{"type":"string"}},"required":["type","mediaType","data"],"additionalProperties":true}]},"description":"Browser prompt parts delivered as the child's user message. The Host admits and persists image parts before delivery, so the wire never carries a durable attachment reference the caller could fabricate."},"clientTimeZone":{"type":"string","description":"Optional browser zone sampled for this exact human prompt."}},"required":["requestId","parentSessionId","childSessionId","mode","delivery","content"],"additionalProperties":true},
99
+ jsonSchema: {"type":"object","properties":{"requestId":{"type":"string","description":"Identity persisted on the accepted message, minted before the call."},"childSessionId":{"type":"string"},"delivery":{"type":"string","enum":["queue","steer"],"description":"Whether this message queues a later turn or targets the nearest step."},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string"}},"required":["type","text"],"additionalProperties":true},{"type":"object","properties":{"type":{"type":"string","const":"image"},"mediaType":{"type":"string","enum":["image/png","image/jpeg","image/webp","image/gif"]},"data":{"type":"string"},"name":{"type":"string"}},"required":["type","mediaType","data"],"additionalProperties":true}]},"description":"Browser prompt parts delivered as the child's user message. The Host admits and persists image parts before delivery, so the wire never carries a durable attachment reference the caller could fabricate."},"clientTimeZone":{"type":"string","description":"Optional browser zone sampled for this exact human prompt."}},"required":["requestId","childSessionId","delivery","content"],"additionalProperties":true},
146
100
  },
147
101
  strictCodec: {
148
102
  mode: 'strict',
149
103
  typeSymbol: '@deepseek-ai/dsh-subagent/client#SubagentPromptRequest',
150
104
  create: _deepseek_ai_dsh_subagent_subagents_prompt_parameter_0_strict$schema,
151
- jsonSchema: {"type":"object","properties":{"requestId":{"type":"string","description":"Identity persisted on the accepted message, minted before the call."},"parentSessionId":{"type":"string"},"childSessionId":{"type":"string"},"mode":{"type":"string","const":"continuable","description":"Required discriminator retained from the browser control address."},"delivery":{"type":"string","enum":["queue","steer"],"description":"Whether this message queues a later turn or targets the nearest step."},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string"}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"image"},"mediaType":{"type":"string","enum":["image/png","image/jpeg","image/webp","image/gif"]},"data":{"type":"string"},"name":{"type":"string"}},"required":["type","mediaType","data"],"additionalProperties":false}]},"description":"Browser prompt parts delivered as the child's user message. The Host admits and persists image parts before delivery, so the wire never carries a durable attachment reference the caller could fabricate."},"clientTimeZone":{"type":"string","description":"Optional browser zone sampled for this exact human prompt."}},"required":["requestId","parentSessionId","childSessionId","mode","delivery","content"],"additionalProperties":false},
105
+ jsonSchema: {"type":"object","properties":{"requestId":{"type":"string","description":"Identity persisted on the accepted message, minted before the call."},"childSessionId":{"type":"string"},"delivery":{"type":"string","enum":["queue","steer"],"description":"Whether this message queues a later turn or targets the nearest step."},"content":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"text"},"text":{"type":"string"}},"required":["type","text"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"image"},"mediaType":{"type":"string","enum":["image/png","image/jpeg","image/webp","image/gif"]},"data":{"type":"string"},"name":{"type":"string"}},"required":["type","mediaType","data"],"additionalProperties":false}]},"description":"Browser prompt parts delivered as the child's user message. The Host admits and persists image parts before delivery, so the wire never carries a durable attachment reference the caller could fabricate."},"clientTimeZone":{"type":"string","description":"Optional browser zone sampled for this exact human prompt."}},"required":["requestId","childSessionId","delivery","content"],"additionalProperties":false},
152
106
  },
153
107
  },
154
108
  ],
@@ -160,7 +114,7 @@ const $remote = createTypertRemoteInfo({
160
114
  description: 'the accepted message\'s inbox identity.',
161
115
  jsonSchema: {"type":"object","properties":{"messageId":{"type":"string"}},"required":["messageId"],"additionalProperties":true},
162
116
  },
163
- sourceLocation: {"file":"packages/subagent/subagent/src/index.ts","line":460,"column":9},
117
+ sourceLocation: {"file":"packages/subagent/subagent/src/index.ts","line":414,"column":9},
164
118
  },
165
119
  },
166
120
  }, z)
@@ -204,45 +158,38 @@ export const TYPERT = {
204
158
  },
205
159
  {
206
160
  "kind": "method",
207
- "name": "waitForChildren",
208
- "signature": "async waitForChildren(parent: Agent): Promise<boolean>",
209
- "summary": "Join progressing descendants without cancelling them.",
210
- "jsDoc": "/**\n * Join progressing descendants without cancelling them. Idle descendants whose\n * inboxes require a later wake stay resident and do not delay host completion.\n * @param parent - the exact parent whose descendant work is observed.\n * @returns whether work was joined; hosts recheck parent idle after true.\n */"
161
+ "name": "rootOf",
162
+ "signature": "rootOf(caller: Agent): Agent",
163
+ "summary": "Resolve the root shared by an Agent and its other agents in its subagent tree.",
164
+ "jsDoc": "/**\n * Resolve the root shared by an Agent and its other agents in its subagent tree.\n * @param caller - exact live Agent whose subagent ancestry selects the tree.\n * @returns the live root; ordinary Session forks lead independent trees.\n * @throws when the caller or its runtime owner is unavailable.\n */"
165
+ },
166
+ {
167
+ "kind": "method",
168
+ "name": "waitForTreeWork",
169
+ "signature": "async waitForTreeWork(root: Agent): Promise<boolean>",
170
+ "summary": "Join progressing subagent tree work for its root.",
171
+ "jsDoc": "/**\n * Join progressing subagent tree work for its root. Idle members with parked input\n * stay resident without delaying host completion. Ordinary members return false.\n * @param root - exact live subagent tree root whose member work is awaited.\n * @returns whether work was joined; hosts recheck root idle after true.\n */"
211
172
  },
212
173
  {
213
174
  "kind": "method",
214
175
  "name": "sendMessage",
215
176
  "signature": "async sendMessage( sender: Agent, targetId: SessionId, content: ContentBlock[], options: SubagentSendMessageOptions, ): Promise<MessageId>",
216
- "summary": "Steer one model-authored message to the sender's direct parent or direct continuable child.",
217
- "jsDoc": "/**\n * Steer one model-authored message to the sender's direct parent or direct\n * continuable child. A running target admits it at the nearest step boundary;\n * an idle target starts a turn, and an absent direct child cold-resumes from\n * persistence. The service derives durable sender attribution from the exact\n * live sender. Caller cancellation stops only pre-acceptance work.\n * @param sender - exact live Agent authorizing and originating the message.\n * @param targetId - durable direct-parent or direct-child session id.\n * @param content - model-authored content to deliver.\n * @param options - caller cancellation before inbox acceptance.\n * @returns the accepted message's inbox id.\n * @throws when continuation services are unavailable, adjacency is rejected,\n * or the message was not admitted.\n */"
177
+ "summary": "Steer one model-authored message to another member of the same subagent tree.",
178
+ "jsDoc": "/**\n * Steer one model-authored message to another member of the same subagent tree.\n * A running target receives it at its next step; an idle target starts a turn.\n * A cold target resumes under its runtime subagent tree root without restoring\n * its creation ancestors. Sender identity is rechecked before inbox acceptance; cancellation\n * stops only pre-acceptance work and never retracts an accepted message.\n * @param sender - exact live root or resident continuable Agent originating the message.\n * @param targetId - another root or continuable member's durable Session id.\n * @param content - model-authored content to deliver.\n * @param options - caller cancellation before inbox acceptance.\n * @returns the accepted message's inbox id.\n * @throws when the target is outside the tree, cannot resume, or rejects input.\n */"
218
179
  },
219
180
  {
220
181
  "kind": "method",
221
182
  "name": "interrupt",
222
183
  "signature": "interrupt(targetSessionId: SessionId, authority: SubagentInterruptAuthority): void",
223
- "summary": "Interrupt one live child's current execution under a human parent address or an exact live ancestor Agent.",
224
- "jsDoc": "/**\n * Interrupt one live child's current execution under a human parent\n * address or an exact live ancestor Agent. Fire-and-return: the cancel\n * signal is issued before this returns, but the target may keep running\n * until it observes the signal. Unclaimed pending inbox work, the Activation,\n * and published descendants are preserved; claimed work is not requeued.\n * Once the interrupted Agent is idle, a waking send resumes the parked FIFO\n * queue. External backends stop their single execution. An absent target\n * is an accepted no-op, as is a manager-less composition, which cannot own a\n * live Activation.\n * @param targetSessionId - the durable child session id to interrupt.\n * @param authority - the human parent address or exact live ancestor Agent.\n * @throws {SubagentError} `UNAUTHORIZED` when the authority does not own the\n * live target.\n */"
184
+ "summary": "Interrupt one live child's current execution under a trusted user operation or an exact live ancestor Agent.",
185
+ "jsDoc": "/**\n * Interrupt one live child's current execution under a trusted user\n * operation or an exact live ancestor Agent. Fire-and-return: the cancel\n * signal is issued before this returns, but the target may keep running\n * until it observes the signal. Unclaimed pending inbox work, the Activation,\n * and published descendants are preserved; claimed work is not requeued.\n * Once the interrupted Agent is idle, a waking send resumes the parked FIFO\n * queue. External backends stop their single execution. An absent target\n * is an accepted no-op, as is a manager-less composition, which cannot own a\n * live Activation.\n * @param targetSessionId - the durable child session id to interrupt.\n * @param authority - a trusted user operation or exact live ancestor Agent.\n * @throws {SubagentError} `UNAUTHORIZED` when the authority does not own the\n * live target.\n */"
225
186
  },
226
187
  {
227
188
  "kind": "method",
228
189
  "name": "drainDescendants",
229
190
  "signature": "async drainDescendants(parents: readonly Agent[]): Promise<void>",
230
- "summary": "Close subagent admission below exact live parent Agents, stop only their visible descendant Activations synchronously, then await admitted scoped materializations and release those forests child-first.",
231
- "jsDoc": "/**\n * Close subagent admission below exact live parent Agents, stop only their\n * visible descendant Activations synchronously, then await admitted scoped\n * materializations and release those forests child-first. The scoped cutoff\n * lasts until each exact parent leaves the registry; unrelated parent trees\n * remain live.\n * @param parents - exact host-owned parent Agents entering teardown.\n * @returns once every retained descendant activation released its execution handle.\n * @throws an aggregate error after all branches settle when any failed.\n */"
232
- },
233
- {
234
- "kind": "method",
235
- "name": "drainChildren",
236
- "signature": "async drainChildren(parent: Agent, childIds: readonly SessionId[]): Promise<void>",
237
- "summary": "Release selected resident direct children of one exact live parent.",
238
- "jsDoc": "/**\n * Release selected resident direct children of one exact live\n * parent. Other children of the same parent remain admitted and resident.\n * Absent targets and a manager-less composition are accepted no-ops.\n * @param parent - exact live direct parent authorizing the selected release.\n * @param childIds - durable direct-child ids to release when resident.\n * @returns once every selected activation released its execution handle.\n * @throws {SubagentError} `UNAUTHORIZED` when a resident target belongs to a\n * different parent or the supplied parent identity is stale.\n */"
239
- },
240
- {
241
- "kind": "method",
242
- "name": "listChildren",
243
- "signature": "listChildren(parentSessionId: SessionId, signal?: AbortSignal): Promise<SubagentCatalogEntry[]>",
244
- "summary": "Read the parent's durable direct-child catalog without loading or resuming an Agent.",
245
- "jsDoc": "/**\n * Read the parent's durable direct-child catalog without loading or resuming an Agent.\n * The service owns and releases the live-preferred Session observation.\n * @param parentSessionId - parent whose direct children are requested.\n * @param signal - cancellation forwarded to the Session query.\n * @returns catalog children in parent event order.\n * @throws {@link SubagentError} when query or catalog projection is unavailable.\n * @throws SessionQueryError when the parent cannot be read or the query is cancelled.\n */"
191
+ "summary": "Close admission and stop all instances in the selected subagent trees, then await pending startup and cleanup.",
192
+ "jsDoc": "/**\n * Close admission and stop all instances in the selected subagent trees, then await\n * pending startup and cleanup. Ordinary members are ignored. The cutoff lasts\n * until each exact root leaves the registry; unrelated subagent trees remain live.\n * @param parents - exact live subagent tree roots entering teardown.\n * @returns once all admitted startup and member cleanup have settled.\n * @throws an aggregate error after all branches settle when any failed.\n */"
246
193
  },
247
194
  {
248
195
  "kind": "method",
@@ -254,16 +201,16 @@ export const TYPERT = {
254
201
  {
255
202
  "kind": "method",
256
203
  "name": "prompt",
257
- "signature": "@Remote('prompt') async prompt(request: SubagentPromptRequest, signal: AbortSignal): Promise<SubagentPromptReceipt>",
258
- "summary": "Deliver one browser-authored message to a continuable child through the exact live direct parent, retaining the caller-minted request identity and validated browser zone on the accepted message.",
259
- "jsDoc": "/**\n * Deliver one browser-authored message to a continuable child through the\n * exact live direct parent, retaining the caller-minted request identity and\n * validated browser zone on the accepted message. Success identifies the\n * message the child's inbox accepted; later execution is independent of this\n * call. Queue delivery targets a later turn; steer delivery targets the\n * nearest step and retains the Agent loop's best-effort fallback semantics.\n * Image parts are admitted and persisted through the attachment store\n * before delivery, and the child's model must accept image input.\n * Cold resume at capacity rejects with `subagent/delivery-unavailable`.\n * @param request - durable address, delivery, minted identity, content, and optional browser zone.\n * @param signal - carrier cancellation, owning the call until inbox acceptance.\n * @returns the accepted message's inbox identity.\n * @throws {RemoteError} `gateway/bad-request`, `subagent/attachment-invalid`,\n * `subagent/invalid-time-zone`, `subagent/parent-unavailable`,\n * `subagent/not-resumable`, `subagent/unauthorized`,\n * `subagent/delivery-unavailable`, `gateway/cancelled`, or `gateway/internal`.\n */"
204
+ "signature": "@Remote({ name: 'prompt', resources: { session: request => request.childSessionId } }) async prompt(request: SubagentPromptRequest, signal: AbortSignal): Promise<SubagentPromptReceipt>",
205
+ "summary": "Deliver one browser-authored message to a continuable child through its live subagent tree root, retaining the caller-minted request identity and validated browser zone on the accepted message.",
206
+ "jsDoc": "/**\n * Deliver one browser-authored message to a continuable child through its\n * live subagent tree root, retaining the caller-minted request identity and\n * validated browser zone on the accepted message. Success identifies the\n * message the child's inbox accepted; later execution is independent of this\n * call. Queue delivery targets a later turn; steer delivery targets the\n * nearest step and retains the Agent loop's best-effort fallback semantics.\n * Image parts are admitted and persisted through the attachment store\n * before delivery, and the child's model must accept image input.\n * Cold resume at capacity rejects with `subagent/delivery-unavailable`.\n * Access is checked on the target Session before attachment admission or restoration.\n * @param request - target id, delivery, minted identity, content, and optional browser zone.\n * @param signal - carrier cancellation, owning the call until inbox acceptance.\n * @returns the accepted message's inbox identity.\n * @throws {RemoteError} `gateway/bad-request`, `subagent/attachment-invalid`,\n * `subagent/invalid-time-zone`,\n * `subagent/not-resumable`, `subagent/unauthorized`,\n * `subagent/delivery-unavailable`, `gateway/cancelled`, or `gateway/internal`.\n */"
260
207
  },
261
208
  {
262
209
  "kind": "method",
263
- "name": "interruptByParent",
264
- "signature": "@Remote('interruptByParent') interruptByParent( childSessionId: SessionId, parentSessionId: SessionId, mode: 'continuable', ): SubagentInterruptReceipt",
265
- "summary": "Remote face of {@link interrupt} under one durable parent address.",
266
- "jsDoc": "/**\n * Remote face of {@link interrupt} under one durable parent address. No\n * catalog, history, persistence, or parent Agent lookup runs: the core\n * primitive alone authorizes the address against the live Activation, which\n * is what keeps a live child interruptible while its parent Agent is offline.\n * Absent, idle, and already-completed targets are accepted no-ops there.\n * @param childSessionId - durable child session id to interrupt.\n * @param parentSessionId - durable direct parent whose authority is claimed.\n * @param mode - required continuable-address discriminator.\n * @returns acknowledgement that the cancel signal was admitted, not that the target is quiescent.\n * @throws {RemoteError} `gateway/bad-request` for an empty id,\n * `subagent/unauthorized` when the address does not own the live target,\n * otherwise `gateway/internal`.\n */"
210
+ "name": "interruptByUser",
211
+ "signature": "@Remote({ name: 'interruptByUser', resources: { session: childSessionId => childSessionId } }) interruptByUser(childSessionId: SessionId): SubagentInterruptReceipt",
212
+ "summary": "Remote face of {@link interrupt}, authorized on the target Session by the Gateway.",
213
+ "jsDoc": "/**\n * Remote face of {@link interrupt}, authorized on the target Session by the Gateway.\n * No catalog, history, persistence, or parent Agent lookup runs.\n * Absent, idle, and already-completed targets are accepted no-ops there.\n * @param childSessionId - durable child session id to interrupt.\n * @returns acknowledgement that the cancel signal was admitted, not that the target is quiescent.\n * @throws {RemoteError} `gateway/bad-request` for an empty id,\n * otherwise `gateway/internal`.\n */"
267
214
  },
268
215
  {
269
216
  "kind": "method",
@@ -278,13 +225,6 @@ export const TYPERT = {
278
225
  "signature": "getProvider(name: string): SubagentProvider | undefined",
279
226
  "summary": "Look up a provider by name.",
280
227
  "jsDoc": "/**\n * Look up a provider by name.\n * @param name - the provider name.\n * @returns the provider, or undefined when absent.\n */"
281
- },
282
- {
283
- "kind": "method",
284
- "name": "list",
285
- "signature": "list(): string[]",
286
- "summary": "List registered provider names in insertion order.",
287
- "jsDoc": "/**\n * List registered provider names in insertion order.\n * @returns the registered names.\n */"
288
228
  }
289
229
  ],
290
230
  "types": [
@@ -560,6 +500,10 @@ export const TYPERT = {
560
500
  "name": "KnownCatalogMode",
561
501
  "declaration": "export type KnownCatalogMode = { readonly mode: 'one-shot'; readonly label?: string; } | { readonly mode: 'continuable'; readonly label: string; };"
562
502
  },
503
+ {
504
+ "name": "KnownSubagentCatalogFields",
505
+ "declaration": "export type KnownSubagentCatalogFields = { readonly mode: 'one-shot'; readonly label?: string; } | { readonly mode: 'external'; readonly label?: string; } | { readonly mode: 'continuable'; readonly label: string; };"
506
+ },
563
507
  {
564
508
  "name": "LegacyAfterScheduleRecord",
565
509
  "declaration": "export interface LegacyAfterScheduleRecord extends Omit<AfterScheduleRecord, 'title'> {\n readonly title?: string;\n}"
@@ -642,7 +586,7 @@ export const TYPERT = {
642
586
  },
643
587
  {
644
588
  "name": "MessageSourceMap",
645
- "declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'tool-registry': { kind: 'tool-registry'; };\n 'action-cards': { kind: 'action-cards'; through: SessionSeq; } & ContextFormed;\n 'runtime-context': { kind: 'runtime-context'; } & ContextFormed;\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; principal?: Principal; };\n 'working-directory': { kind: 'working-directory'; };\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'skill-invocation': SkillInvocationSource;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'compact-checkpoint': CompactionCheckpointSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n 'user-question-reply': { kind: 'user-question-reply'; callId: ToolCallId; outcome: 'answered'; };\n 'team-message': TeamMessageSource;\n goal: GoalMessageSource;\n 'plan-mode': { kind: 'plan-mode'; } & ContextFormed;\n schedule: { kind: 'schedule'; } & ContextFormed;\n 'session-reference': SessionReferenceSource;\n webhook: { readonly kind: 'webhook'; readonly provider: string; readonly source: WebhookSourceId; readonly deliveryId: WebhookDeliveryId; readonly ruleId: WebhookRuleId; readonly form: 'notice'; readonly summary: string; };\n}"
589
+ "declaration": "export interface MessageSourceMap {\n user: { kind: 'user'; };\n model: ModelMessageSource;\n tool: ToolMessageSource;\n 'system-prompt': SystemPromptMessageSource;\n 'model-selection': { kind: 'model-selection'; } & ContextFormed;\n 'tool-registry': { kind: 'tool-registry'; };\n 'action-cards': { kind: 'action-cards'; through: SessionSeq; } & ContextFormed;\n 'runtime-context': { kind: 'runtime-context'; } & ContextFormed;\n 'team-message': TeamMessageSource;\n 'working-directory': { kind: 'working-directory'; };\n 'user-approval': { kind: 'user-approval'; } & ContextFormed;\n 'agent-message': AgentMessageSource;\n 'subagent-settled': SubagentSettledMessageSource;\n 'user-rpc': { kind: 'user'; rpcId: SessionRequestId; clientTimeZone?: string; principal?: Principal; };\n 'skill-invocation': SkillInvocationSource;\n 'ptc-mode': { kind: 'ptc-mode'; };\n 'compact-checkpoint': CompactionCheckpointSource;\n 'cordis-host-runner': { kind: 'cordis-host-runner'; };\n 'user-question-reply': { kind: 'user-question-reply'; callId: ToolCallId; outcome: 'answered'; };\n goal: GoalMessageSource;\n 'plan-mode': { kind: 'plan-mode'; } & ContextFormed;\n schedule: { kind: 'schedule'; } & ContextFormed;\n 'session-reference': SessionReferenceSource;\n webhook: { readonly kind: 'webhook'; readonly provider: string; readonly source: WebhookSourceId; readonly deliveryId: WebhookDeliveryId; readonly ruleId: WebhookRuleId; readonly form: 'notice'; readonly summary: string; };\n}"
646
590
  },
647
591
  {
648
592
  "name": "Model",
@@ -758,7 +702,7 @@ export const TYPERT = {
758
702
  },
759
703
  {
760
704
  "name": "SessionEventMap",
761
- "declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'model/selection': ModelSelection;\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'agent-preset/selected': { agentPreset: string; };\n 'job/registered': JobRegisteredData;\n 'job/settled': JobSettledData;\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'working-directory/change': { cwd: string; };\n 'approval/grant': { toolName: string; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; remembered?: true; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'permission/preset': { preset: string; };\n 'subagent/descriptor': SubagentDescriptorData;\n 'subagent/catalog': SubagentCatalogEvent;\n 'compaction/start': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; };\n 'compaction/summary': { compactionId: CompactionId; sourceCommandId?: CommandId; summary: ContentBlock[]; shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; provider: string; model: string; maxTokens?: number; usage?: TokenUsage; } & ({ rawOutput: ContentBlock[]; llmStreamCall: true; } | { rawOutput?: ContentBlock[]; llmStreamCall?: never; });\n 'compaction/end': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; error?: string; };\n 'compaction/prune': { shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'feedback/record': FeedbackRecord;\n 'llm/retry': LlmRetryEventData;\n 'llm/retry-started': LlmRetryStartedEventData;\n 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\n 'goal/change': GoalChangeMeta;\n 'feedback/message-put': MessageFeedbackPut;\n 'feedback/message-delete': MessageFeedbackDelete;\n 'plan/mode': { active: boolean; };\n 'schedule/change': ScheduleChange;\n 'session-log-deepseek/delivery-accepted': { sessionId: import('@deepseek-ai/dsh-session/types').SessionId; sessionFormatVersion?: number; throughSeq: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'subagent/model-selection-policy': { allowedModels: AllowedModelRoute[]; };\n 'workspace/changes': { turn: number; };\n}"
705
+ "declaration": "export interface SessionEventMap {\n 'turn/start': { turn: number; };\n 'turn/end': { turn: number; reason: TurnEndReason; };\n 'step/start': { turn: number; step: number; };\n 'step/end': { turn: number; step: number; };\n 'user/message': UserMessage;\n 'developer/message': { turn: number; step: number; message: DeveloperMessage; headerSeq?: SessionSeq; };\n 'system/message': { turn: number; step: number; message: SystemMessage; };\n 'assistant/message': { turn: number; step: number; message: AssistantMessage; stream: AssistantStreamRecord[]; usage?: TokenUsage; interrupted?: true; };\n 'assistant/attempt': { turn: number; step: number; stream: AssistantStreamRecord[]; };\n 'tool/call': { turn: number; step: number; callId: ToolCallId; name: string; arguments: string; };\n 'tool/result': { turn: number; step: number; message: ToolResultMessage; error?: { name: string; code: string; reason?: string; }; meta?: JsonValue; };\n 'request/header': { header: EpochHeader; reason: RequestHeaderReason; startsSeries?: true; };\n 'request/context': RequestContext;\n 'session/end-seed': { inherited?: true; };\n 'agent/inbox/spliced': { target: InboxTarget; start: number; removedCount?: number; inserted: UserMessage[]; outcome?: 'canceled'; };\n 'model/selection': ModelSelection;\n 'sandbox/mode': { mode: SandboxMode; source?: 'delegation'; };\n 'agent-preset/selected': { agentPreset: string; };\n 'team/mode': { enabled: boolean; };\n 'team/member': { version: 2; teamId: TeamId; member: TeamMemberSnapshot; };\n 'team/task': { version: 2; teamId: TeamId; task: TeamTaskSnapshot; };\n 'team/message/queued': { version: 2; teamId: TeamId; message: TeamMessageSnapshot; };\n 'team/message/delivered': { version: 2; teamId: TeamId; messageId: TeamMessageId; targetId: SessionId; };\n 'working-directory/change': { cwd: string; };\n 'image/offload': { targets: ImageOffloadTarget[]; };\n 'session/title': SessionTitleEventData;\n 'todo/write': { todos: TodoItem[]; };\n 'approval/grant': { toolName: string; };\n 'approval/asked': { id: ApprovalRequestId; toolName: string; callId?: ToolCallId; reason?: string; };\n 'approval/decided': { id: ApprovalRequestId; outcome: ApprovalOutcome; remembered?: true; };\n 'approval/policy': { policy: ApprovalPolicy; source?: 'delegation'; };\n 'command/run': { commandId: CommandId; name: string; args?: string; source: CommandSource; };\n 'command/done': { commandId: CommandId; kind: 'success' | 'error'; text?: string; sourceEventSeq?: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'permission/preset': { preset: string; };\n 'subagent/descriptor': SubagentDescriptorData;\n 'subagent/catalog': SubagentCatalogEvent;\n 'job/registered': JobRegisteredData;\n 'job/settled': JobSettledData;\n 'compaction/start': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; };\n 'compaction/summary': { compactionId: CompactionId; sourceCommandId?: CommandId; summary: ContentBlock[]; shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; provider: string; model: string; maxTokens?: number; usage?: TokenUsage; } & ({ rawOutput: ContentBlock[]; llmStreamCall: true; } | { rawOutput?: ContentBlock[]; llmStreamCall?: never; });\n 'compaction/end': { compactionId: CompactionId; sourceCommandId?: CommandId; turn: number | null; error?: string; };\n 'compaction/prune': { shadowedRange: { start: SessionSeq; end: SessionSeq; }; shadowedSeqs: SessionSeq[]; shadowedTokenCount: number; };\n 'tool/ptc-dispatch-start': PtcDispatchStartEventData;\n 'tool/ptc-dispatch': PtcDispatchEventData;\n 'feedback/record': FeedbackRecord;\n 'llm/retry': LlmRetryEventData;\n 'llm/retry-started': LlmRetryStartedEventData;\n 'goal/change': GoalChangeMeta;\n 'feedback/message-put': MessageFeedbackPut;\n 'feedback/message-delete': MessageFeedbackDelete;\n 'plan/mode': { active: boolean; };\n 'schedule/change': ScheduleChange;\n 'session-log-deepseek/delivery-accepted': { sessionId: import('@deepseek-ai/dsh-session/types').SessionId; sessionFormatVersion?: number; throughSeq: import('@deepseek-ai/dsh-session/types').SessionSeq; };\n 'subagent/model-selection-policy': { allowedModels: AllowedModelRoute[]; };\n 'workspace/changes': { turn: number; };\n}"
762
706
  },
763
707
  {
764
708
  "name": "SessionEventType",
@@ -826,23 +770,23 @@ export const TYPERT = {
826
770
  },
827
771
  {
828
772
  "name": "SubagentActivationSpec",
829
- "declaration": "export interface SubagentActivationSpec {\n readonly provider: string;\n readonly label: string;\n readonly childId?: SessionId;\n readonly request: Omit<SubagentStartRequest, 'label' | 'signal'>;\n readonly signal: AbortSignal;\n readonly delivery: 'parent' | 'caller';\n}"
773
+ "declaration": "export interface SubagentActivationSpec extends Omit<SubagentStartRequest, 'label' | 'signal'> {\n readonly provider: string;\n readonly label: string;\n readonly childId?: SessionId;\n readonly signal: AbortSignal;\n readonly delivery: 'parent' | 'caller';\n}"
830
774
  },
831
775
  {
832
776
  "name": "SubagentCapabilities",
833
777
  "declaration": "export interface SubagentCapabilities {\n readonly agentOptions: boolean;\n readonly agentPreset: boolean;\n readonly outputSchema: boolean;\n readonly depthLimit: boolean;\n}"
834
778
  },
835
- {
836
- "name": "SubagentCatalogEntry",
837
- "declaration": "export type SubagentCatalogEntry = { readonly id: SessionId; readonly createdAt: number; } & ({ readonly mode: 'one-shot'; readonly label?: string; } | { readonly mode: 'external'; readonly label?: string; } | { readonly mode: 'continuable'; readonly label: string; } | { readonly mode: 'unknown'; readonly label?: string; });"
838
- },
839
779
  {
840
780
  "name": "SubagentCatalogEvent",
841
781
  "declaration": "export type SubagentCatalogEvent = { readonly childId: SessionId; readonly childCreatedAt: number; } & (({ readonly version: 0; } & KnownCatalogMode) | ({ readonly version: 1; } & (KnownCatalogMode | { readonly mode: 'unknown'; readonly label?: string; })) | { readonly version: 2; readonly mode: 'external'; readonly label?: string; });"
842
782
  },
843
783
  {
844
784
  "name": "SubagentCatalogRow",
845
- "declaration": "export type SubagentCatalogRow = { readonly id: SessionId; readonly activity: 'running' | 'inactive'; } & ({ readonly mode: 'one-shot'; readonly label?: string; } | { readonly mode: 'external'; readonly label?: string; } | { readonly mode: 'continuable'; readonly label: string; });"
785
+ "declaration": "export type SubagentCatalogRow = { readonly id: SessionId; readonly activity: 'running' | 'inactive'; } & KnownSubagentCatalogFields;"
786
+ },
787
+ {
788
+ "name": "SubagentDelivery",
789
+ "declaration": "export type SubagentDelivery = 'queue' | 'steer';"
846
790
  },
847
791
  {
848
792
  "name": "SubagentDescendantListEntry",
@@ -858,7 +802,7 @@ export const TYPERT = {
858
802
  },
859
803
  {
860
804
  "name": "SubagentInterruptAuthority",
861
- "declaration": "export type SubagentInterruptAuthority = { readonly kind: 'user'; readonly parentSessionId: SessionId; } | { readonly kind: 'ancestor'; readonly agent: Agent; };"
805
+ "declaration": "export type SubagentInterruptAuthority = { readonly kind: 'user'; } | { readonly kind: 'ancestor'; readonly agent: Agent; };"
862
806
  },
863
807
  {
864
808
  "name": "SubagentInterruptReceipt",
@@ -874,7 +818,7 @@ export const TYPERT = {
874
818
  },
875
819
  {
876
820
  "name": "SubagentPromptRequest",
877
- "declaration": "export interface SubagentPromptRequest {\n readonly requestId: SubagentPromptRequestId;\n readonly parentSessionId: SessionId;\n readonly childSessionId: SessionId;\n readonly mode: 'continuable';\n readonly delivery: 'queue' | 'steer';\n readonly content: readonly PromptContentPart[];\n readonly clientTimeZone?: string;\n}"
821
+ "declaration": "export interface SubagentPromptRequest {\n readonly requestId: SubagentPromptRequestId;\n readonly childSessionId: SessionId;\n readonly delivery: SubagentDelivery;\n readonly content: readonly PromptContentPart[];\n readonly clientTimeZone?: string;\n}"
878
822
  },
879
823
  {
880
824
  "name": "SubagentPromptRequestId",
@@ -898,7 +842,7 @@ export const TYPERT = {
898
842
  },
899
843
  {
900
844
  "name": "SubagentSettledMessageSource",
901
- "declaration": "export interface SubagentSettledMessageSource {\n readonly kind: 'subagent-settled';\n readonly form: 'notice';\n readonly summary: string;\n readonly senderSessionId: SessionId;\n}"
845
+ "declaration": "export interface SubagentSettledMessageSource {\n readonly kind: 'subagent-settled';\n readonly form: 'notice';\n readonly summary: string;\n readonly stopReason?: SubagentResult['stopReason'];\n readonly senderSessionId: SessionId;\n}"
902
846
  },
903
847
  {
904
848
  "name": "SubagentStartRequest",
@@ -1053,14 +997,14 @@ export const TYPERT = {
1053
997
  ],
1054
998
  "events": [
1055
999
  {
1056
- "description": "A published child settled. Scope-filtered dispatch uses the same delegating parent carrier as `subagent/start`, so the lifecycle pair reaches the same scoped audience.",
1000
+ "description": "A published child settled. Scope-filtered dispatch uses the same subagent tree-root carrier as `subagent/start`, so the lifecycle pair reaches the same scoped audience.",
1057
1001
  "summary": "A published child settled.",
1058
1002
  "tags": [
1059
1003
  {
1060
1004
  "name": "param",
1061
1005
  "argument": "info",
1062
- "comment": "- the run identity and terminal outcome.",
1063
- "text": "@param info - the run identity and terminal outcome.\n *"
1006
+ "comment": "- run identity, durable direct creator `parentSessionId`, and terminal outcome.",
1007
+ "text": "@param info - run identity, durable direct creator `parentSessionId`, and terminal outcome.\n *"
1064
1008
  },
1065
1009
  {
1066
1010
  "name": "mode",
@@ -1068,7 +1012,7 @@ export const TYPERT = {
1068
1012
  "text": "@mode emit"
1069
1013
  }
1070
1014
  ],
1071
- "jsDoc": "/**\n * A published child settled. Scope-filtered dispatch uses the same delegating\n * parent carrier as `subagent/start`, so the lifecycle pair reaches the\n * same scoped audience.\n * @param info - the run identity and terminal outcome.\n * @mode emit\n */",
1015
+ "jsDoc": "/**\n * A published child settled. Scope-filtered dispatch uses the same subagent tree-root\n * carrier as `subagent/start`, so the lifecycle pair reaches the\n * same scoped audience.\n * @param info - run identity, durable direct creator `parentSessionId`, and terminal outcome.\n * @mode emit\n */",
1072
1016
  "name": "subagent/end",
1073
1017
  "mode": "emit",
1074
1018
  "signature": "'subagent/end'(this: Scoped<SubagentRuntime>, info: SubagentRunEndInfo): void"
@@ -1116,14 +1060,14 @@ export const TYPERT = {
1116
1060
  "signature": "'subagent/provider-removed'(name: string): void"
1117
1061
  },
1118
1062
  {
1119
- "description": "A provider established a published child. For in-process providers, `ctx.agents.get(info.id)` resolves during this notification. Scope-filtered dispatch keys the carrier by the delegating parent, so a parent-scoped listener observes only its own delegations. Paired with `subagent/end`.",
1063
+ "description": "A provider established a published child. For in-process providers, `ctx.agents.get(info.id)` resolves during this notification. Scope-filtered dispatch keys the carrier by the subagent tree root, so a root-scoped listener observes all subagent tree activations. Paired with `subagent/end`.",
1120
1064
  "summary": "A provider established a published child.",
1121
1065
  "tags": [
1122
1066
  {
1123
1067
  "name": "param",
1124
1068
  "argument": "info",
1125
- "comment": "- the provider and published child identity.",
1126
- "text": "@param info - the provider and published child identity.\n *"
1069
+ "comment": "- provider, child identity, and durable direct creator `parentSessionId`.",
1070
+ "text": "@param info - provider, child identity, and durable direct creator `parentSessionId`.\n *"
1127
1071
  },
1128
1072
  {
1129
1073
  "name": "mode",
@@ -1131,7 +1075,7 @@ export const TYPERT = {
1131
1075
  "text": "@mode emit"
1132
1076
  }
1133
1077
  ],
1134
- "jsDoc": "/**\n * A provider established a published child. For in-process providers,\n * `ctx.agents.get(info.id)` resolves during this notification.\n * Scope-filtered dispatch keys the carrier by the delegating parent, so a\n * parent-scoped listener observes only its own delegations. Paired with\n * `subagent/end`.\n * @param info - the provider and published child identity.\n * @mode emit\n */",
1078
+ "jsDoc": "/**\n * A provider established a published child. For in-process providers,\n * `ctx.agents.get(info.id)` resolves during this notification.\n * Scope-filtered dispatch keys the carrier by the subagent tree root, so a\n * root-scoped listener observes all subagent tree activations. Paired with\n * `subagent/end`.\n * @param info - provider, child identity, and durable direct creator `parentSessionId`.\n * @mode emit\n */",
1135
1079
  "name": "subagent/start",
1136
1080
  "mode": "emit",
1137
1081
  "signature": "'subagent/start'(this: Scoped<SubagentRuntime>, info: SubagentRunInfo): void"
@@ -9,11 +9,11 @@ import type { SubagentInterruptReceipt, SubagentPromptReceipt, SubagentPromptReq
9
9
 
10
10
  declare module '@deepseek-ai/dsh-typert-protocol' {
11
11
  interface TypertRemoteNamespace$7375626167656e7473 {
12
- interruptByParent: (childSessionId: SessionId, parentSessionId: SessionId, mode: 'continuable') => Promise<RemoteResult<SubagentInterruptReceipt>>
12
+ interruptByUser: (childSessionId: SessionId) => Promise<RemoteResult<SubagentInterruptReceipt>>
13
13
  prompt: (request: SubagentPromptRequest, signal?: AbortSignal) => Promise<RemoteResult<SubagentPromptReceipt>>
14
14
  }
15
15
  interface TypertRemoteMap {
16
- 'subagents/interruptByParent': (childSessionId: SessionId, parentSessionId: SessionId, mode: 'continuable') => Promise<RemoteResult<SubagentInterruptReceipt>>
16
+ 'subagents/interruptByUser': (childSessionId: SessionId) => Promise<RemoteResult<SubagentInterruptReceipt>>
17
17
  'subagents/prompt': (request: SubagentPromptRequest, signal?: AbortSignal) => Promise<RemoteResult<SubagentPromptReceipt>>
18
18
  }
19
19
  interface TypertRemoteNamespaceMap {
@@ -22,7 +22,7 @@ declare module '@deepseek-ai/dsh-typert-protocol' {
22
22
  }
23
23
 
24
24
  export declare const TYPERT_REMOTE: TypertRemoteInfo<{
25
- readonly 'subagents/interruptByParent': TypertRemoteMethod<{ readonly 'childSessionId': SessionId; readonly 'parentSessionId': SessionId; readonly 'mode': 'continuable' }, SubagentInterruptReceipt>
25
+ readonly 'subagents/interruptByUser': TypertRemoteMethod<{ readonly 'childSessionId': SessionId }, SubagentInterruptReceipt>
26
26
  readonly 'subagents/prompt': TypertRemoteMethod<{ readonly 'request': SubagentPromptRequest }, SubagentPromptReceipt>
27
27
  }>
28
28
  export default TYPERT_REMOTE