@assistant-ui/react-ag-ui 0.0.56 → 0.0.58

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.
Files changed (42) hide show
  1. package/README.md +16 -0
  2. package/dist/runtime/AgUiThreadRuntimeCore.d.ts +5 -17
  3. package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +1 -1
  4. package/dist/runtime/AgUiThreadRuntimeCore.js +133 -234
  5. package/dist/runtime/AgUiThreadRuntimeCore.js.map +1 -1
  6. package/dist/runtime/adapter/conversions.d.ts.map +1 -1
  7. package/dist/runtime/adapter/conversions.js +54 -25
  8. package/dist/runtime/adapter/conversions.js.map +1 -1
  9. package/dist/runtime/adapter/run-aggregator.d.ts +31 -4
  10. package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
  11. package/dist/runtime/adapter/run-aggregator.js +419 -123
  12. package/dist/runtime/adapter/run-aggregator.js.map +1 -1
  13. package/dist/runtime/adapter/subscriber.d.ts +9 -0
  14. package/dist/runtime/adapter/subscriber.d.ts.map +1 -1
  15. package/dist/runtime/adapter/subscriber.js +4 -1
  16. package/dist/runtime/adapter/subscriber.js.map +1 -1
  17. package/dist/runtime/adapter/tool-approval.d.ts +3 -1
  18. package/dist/runtime/adapter/tool-approval.d.ts.map +1 -1
  19. package/dist/runtime/adapter/tool-approval.js +11 -12
  20. package/dist/runtime/adapter/tool-approval.js.map +1 -1
  21. package/dist/runtime/event-parser.d.ts.map +1 -1
  22. package/dist/runtime/event-parser.js +176 -45
  23. package/dist/runtime/event-parser.js.map +1 -1
  24. package/dist/runtime/types.d.ts +42 -1
  25. package/dist/runtime/types.d.ts.map +1 -1
  26. package/dist/useAgUiRuntime.js +12 -9
  27. package/dist/useAgUiRuntime.js.map +1 -1
  28. package/package.json +10 -10
  29. package/src/runtime/AgUiThreadRuntimeCore.test.ts +105 -0
  30. package/src/runtime/AgUiThreadRuntimeCore.ts +190 -319
  31. package/src/runtime/adapter/conversions.ts +128 -36
  32. package/src/runtime/adapter/run-aggregator.approval.test.ts +128 -0
  33. package/src/runtime/adapter/run-aggregator.ts +670 -148
  34. package/src/runtime/adapter/subscriber.ts +10 -1
  35. package/src/runtime/adapter/tool-approval.test.ts +75 -0
  36. package/src/runtime/adapter/tool-approval.ts +17 -12
  37. package/src/runtime/event-parser.ts +216 -36
  38. package/src/runtime/types.ts +70 -12
  39. package/src/useAgUiRuntime.approval.test.tsx +34 -24
  40. package/src/useAgUiRuntime.history.test.tsx +76 -0
  41. package/src/useAgUiRuntime.toolDeferral.test.tsx +186 -0
  42. package/src/useAgUiRuntime.ts +12 -9
@@ -11,6 +11,10 @@ const withOptional = (base, optionals) => {
11
11
  };
12
12
  };
13
13
  const isPlainObject = (value) => !!value && typeof value === "object" && !Array.isArray(value);
14
+ const logRejectedEvent = (logger, type, payload, reason) => {
15
+ const typeLabel = isString(type) ? type : "unknown";
16
+ logger?.debug?.(`[agui] ${typeLabel} ${reason}`, payload);
17
+ };
14
18
  const parseInterrupt = (raw) => {
15
19
  if (!isPlainObject(raw)) return null;
16
20
  const id = raw.id;
@@ -27,17 +31,37 @@ const parseInterrupt = (raw) => {
27
31
  if (isPlainObject(raw.metadata)) interrupt.metadata = raw.metadata;
28
32
  return raw.responseSchema == null || isPlainObject(raw.responseSchema) ? interrupt : withRawResponseSchema(interrupt, raw.responseSchema);
29
33
  };
30
- const parseRunFinishedOutcome = (raw, logger) => {
31
- if (!isPlainObject(raw)) return void 0;
34
+ const parseRunFinishedOutcome = (raw, runId, logger) => {
35
+ if (raw == null) return void 0;
36
+ if (!isPlainObject(raw)) {
37
+ logRejectedEvent(logger, "RUN_FINISHED", {
38
+ runId,
39
+ outcome: raw
40
+ }, "has invalid outcome");
41
+ return;
42
+ }
32
43
  if (raw.type === "success") return { type: "success" };
33
44
  if (raw.type === "interrupt") {
34
45
  if (!Array.isArray(raw.interrupts)) {
35
- logger?.debug?.("[agui] RUN_FINISHED interrupt outcome missing interrupts array", raw);
46
+ logRejectedEvent(logger, "RUN_FINISHED", {
47
+ runId,
48
+ outcome: raw
49
+ }, "has an interrupt outcome missing interrupts array");
36
50
  return;
37
51
  }
38
- const parsed = raw.interrupts.map((entry) => parseInterrupt(entry)).filter((entry) => entry !== null);
52
+ const parsed = raw.interrupts.map((entry) => {
53
+ const interrupt = parseInterrupt(entry);
54
+ if (interrupt === null) logRejectedEvent(logger, "RUN_FINISHED", {
55
+ runId,
56
+ interrupt: entry
57
+ }, "has malformed interrupt");
58
+ return interrupt;
59
+ }).filter((entry) => entry !== null);
39
60
  if (parsed.length === 0) {
40
- logger?.debug?.("[agui] RUN_FINISHED interrupt outcome has no valid interrupts", raw.interrupts);
61
+ logRejectedEvent(logger, "RUN_FINISHED", {
62
+ runId,
63
+ interrupts: raw.interrupts
64
+ }, "has an interrupt outcome with no valid interrupts");
41
65
  return;
42
66
  }
43
67
  return {
@@ -45,12 +69,26 @@ const parseRunFinishedOutcome = (raw, logger) => {
45
69
  interrupts: parsed
46
70
  };
47
71
  }
72
+ logRejectedEvent(logger, "RUN_FINISHED", {
73
+ runId,
74
+ outcome: raw
75
+ }, "has unsupported outcome type");
48
76
  };
49
77
  const parseAgUiEvent = (event, options) => {
50
- if (!event || typeof event !== "object") return null;
78
+ if (!event || typeof event !== "object") {
79
+ logRejectedEvent(options?.logger, void 0, event, "is not an object");
80
+ return null;
81
+ }
51
82
  const payload = event;
52
83
  const typeValue = payload.type;
53
- if (!isString(typeValue)) return null;
84
+ if (!isString(typeValue)) {
85
+ logRejectedEvent(options?.logger, typeValue, payload, "has no string type");
86
+ return null;
87
+ }
88
+ const reject = (reason) => {
89
+ logRejectedEvent(options?.logger, typeValue, payload, reason);
90
+ return null;
91
+ };
54
92
  const getString = (key) => isString(payload[key]) ? payload[key] : void 0;
55
93
  switch (typeValue) {
56
94
  case "RUN_STARTED": {
@@ -58,15 +96,15 @@ const parseAgUiEvent = (event, options) => {
58
96
  return runId ? {
59
97
  type: "RUN_STARTED",
60
98
  runId
61
- } : null;
99
+ } : reject("missing runId");
62
100
  }
63
101
  case "RUN_FINISHED": {
64
102
  const runId = getString("runId");
65
- if (!runId) return null;
103
+ if (!runId) return reject("missing runId");
66
104
  return withOptional({
67
105
  type: "RUN_FINISHED",
68
106
  runId
69
- }, { outcome: parseRunFinishedOutcome(payload.outcome, options?.logger) });
107
+ }, { outcome: parseRunFinishedOutcome(payload.outcome, runId, options?.logger) });
70
108
  }
71
109
  case "RUN_CANCELLED": {
72
110
  const runId = getString("runId");
@@ -76,22 +114,34 @@ const parseAgUiEvent = (event, options) => {
76
114
  message: getString("message"),
77
115
  code: getString("code")
78
116
  });
79
- case "TEXT_MESSAGE_START": return withOptional({ type: "TEXT_MESSAGE_START" }, { messageId: getString("messageId") });
117
+ case "TEXT_MESSAGE_START": return withOptional({ type: "TEXT_MESSAGE_START" }, {
118
+ messageId: getString("messageId"),
119
+ subagentRunId: getString("subagentRunId")
120
+ });
80
121
  case "TEXT_MESSAGE_CONTENT": {
81
122
  const delta = getString("delta");
82
- if (!isNonEmptyString(delta)) return null;
123
+ if (!isNonEmptyString(delta)) return reject("missing non-empty delta");
83
124
  return withOptional({
84
125
  type: "TEXT_MESSAGE_CONTENT",
85
126
  delta
86
- }, { messageId: getString("messageId") });
127
+ }, {
128
+ messageId: getString("messageId"),
129
+ subagentRunId: getString("subagentRunId")
130
+ });
87
131
  }
88
- case "TEXT_MESSAGE_END": return withOptional({ type: "TEXT_MESSAGE_END" }, { messageId: getString("messageId") });
132
+ case "TEXT_MESSAGE_END": return withOptional({ type: "TEXT_MESSAGE_END" }, {
133
+ messageId: getString("messageId"),
134
+ subagentRunId: getString("subagentRunId")
135
+ });
89
136
  case "TEXT_MESSAGE_CHUNK": {
90
137
  const delta = getString("delta") ?? "";
91
138
  return withOptional({
92
139
  type: "TEXT_MESSAGE_CHUNK",
93
140
  delta
94
- }, { messageId: getString("messageId") });
141
+ }, {
142
+ messageId: getString("messageId"),
143
+ subagentRunId: getString("subagentRunId")
144
+ });
95
145
  }
96
146
  case "THINKING_START": return withOptional({ type: "THINKING_START" }, { title: getString("title") });
97
147
  case "THINKING_TEXT_MESSAGE_START": return { type: "THINKING_TEXT_MESSAGE_START" };
@@ -101,66 +151,87 @@ const parseAgUiEvent = (event, options) => {
101
151
  };
102
152
  case "THINKING_TEXT_MESSAGE_END": return { type: "THINKING_TEXT_MESSAGE_END" };
103
153
  case "THINKING_END": return { type: "THINKING_END" };
104
- case "REASONING_START": return withOptional({ type: "REASONING_START" }, { messageId: getString("messageId") });
105
- case "REASONING_MESSAGE_START": return withOptional({ type: "REASONING_MESSAGE_START" }, { messageId: getString("messageId") });
154
+ case "REASONING_START": return withOptional({ type: "REASONING_START" }, {
155
+ messageId: getString("messageId"),
156
+ subagentRunId: getString("subagentRunId")
157
+ });
158
+ case "REASONING_MESSAGE_START": return withOptional({ type: "REASONING_MESSAGE_START" }, {
159
+ messageId: getString("messageId"),
160
+ subagentRunId: getString("subagentRunId")
161
+ });
106
162
  case "REASONING_MESSAGE_CONTENT": {
107
163
  const delta = getString("delta") ?? "";
108
164
  return withOptional({
109
165
  type: "REASONING_MESSAGE_CONTENT",
110
166
  delta
111
- }, { messageId: getString("messageId") });
167
+ }, {
168
+ messageId: getString("messageId"),
169
+ subagentRunId: getString("subagentRunId")
170
+ });
112
171
  }
113
- case "REASONING_MESSAGE_END": return withOptional({ type: "REASONING_MESSAGE_END" }, { messageId: getString("messageId") });
172
+ case "REASONING_MESSAGE_END": return withOptional({ type: "REASONING_MESSAGE_END" }, {
173
+ messageId: getString("messageId"),
174
+ subagentRunId: getString("subagentRunId")
175
+ });
114
176
  case "REASONING_ENCRYPTED_VALUE": {
115
177
  const entityId = getString("entityId");
116
178
  const encryptedValue = getString("encryptedValue");
117
179
  const subtype = getString("subtype");
118
- if (!entityId || !encryptedValue) return null;
119
- if (subtype !== "message" && subtype !== "tool-call") return null;
180
+ if (!entityId || !encryptedValue) return reject("missing entityId or encryptedValue");
181
+ if (subtype !== "message" && subtype !== "tool-call") return reject("has an invalid subtype");
182
+ const subagentRunId = getString("subagentRunId");
120
183
  return {
121
184
  type: "REASONING_ENCRYPTED_VALUE",
122
185
  subtype,
123
186
  entityId,
124
- encryptedValue
187
+ encryptedValue,
188
+ ...subagentRunId !== void 0 ? { subagentRunId } : {}
125
189
  };
126
190
  }
127
- case "REASONING_END": return withOptional({ type: "REASONING_END" }, { messageId: getString("messageId") });
191
+ case "REASONING_END": return withOptional({ type: "REASONING_END" }, {
192
+ messageId: getString("messageId"),
193
+ subagentRunId: getString("subagentRunId")
194
+ });
128
195
  case "TOOL_CALL_START": {
129
196
  const toolCallId = getString("toolCallId");
130
- if (!toolCallId) return null;
197
+ if (!toolCallId) return reject("missing toolCallId");
131
198
  return withOptional({
132
199
  type: "TOOL_CALL_START",
133
200
  toolCallId
134
201
  }, {
135
202
  toolCallName: getString("toolCallName"),
136
- parentMessageId: getString("parentMessageId")
203
+ parentMessageId: getString("parentMessageId"),
204
+ subagentRunId: getString("subagentRunId")
137
205
  });
138
206
  }
139
207
  case "TOOL_CALL_ARGS": {
140
208
  const toolCallId = getString("toolCallId");
141
- if (!toolCallId) return null;
142
- return {
209
+ if (!toolCallId) return reject("missing toolCallId");
210
+ const delta = getString("delta") ?? "";
211
+ return withOptional({
143
212
  type: "TOOL_CALL_ARGS",
144
213
  toolCallId,
145
- delta: getString("delta") ?? ""
146
- };
214
+ delta
215
+ }, { subagentRunId: getString("subagentRunId") });
147
216
  }
148
217
  case "TOOL_CALL_END": {
149
218
  const toolCallId = getString("toolCallId");
150
- return toolCallId ? {
219
+ if (!toolCallId) return reject("missing toolCallId");
220
+ return withOptional({
151
221
  type: "TOOL_CALL_END",
152
222
  toolCallId
153
- } : null;
223
+ }, { subagentRunId: getString("subagentRunId") });
154
224
  }
155
225
  case "TOOL_CALL_CHUNK": return withOptional({ type: "TOOL_CALL_CHUNK" }, {
156
226
  toolCallId: getString("toolCallId"),
157
227
  toolCallName: getString("toolCallName"),
158
228
  parentMessageId: getString("parentMessageId"),
159
- delta: getString("delta")
229
+ delta: getString("delta"),
230
+ subagentRunId: getString("subagentRunId")
160
231
  });
161
232
  case "TOOL_CALL_RESULT": {
162
233
  const toolCallId = getString("toolCallId");
163
- if (!toolCallId) return null;
234
+ if (!toolCallId) return reject("missing toolCallId");
164
235
  const content = getString("content") ?? "";
165
236
  return withOptional({
166
237
  type: "TOOL_CALL_RESULT",
@@ -169,31 +240,37 @@ const parseAgUiEvent = (event, options) => {
169
240
  }, {
170
241
  messageId: getString("messageId"),
171
242
  role: payload.role === "tool" ? "tool" : void 0,
172
- mcpResult: parseMcpToolCallResult(payload, content)
243
+ mcpResult: parseMcpToolCallResult(payload, content),
244
+ subagentRunId: getString("subagentRunId")
173
245
  });
174
246
  }
175
- case "STATE_SNAPSHOT": return {
176
- type: "STATE_SNAPSHOT",
177
- snapshot: payload.snapshot
178
- };
247
+ case "STATE_SNAPSHOT":
248
+ if (payload.snapshot === void 0) return reject("missing snapshot");
249
+ return {
250
+ type: "STATE_SNAPSHOT",
251
+ snapshot: payload.snapshot
252
+ };
179
253
  case "STATE_DELTA": return {
180
254
  type: "STATE_DELTA",
181
255
  delta: Array.isArray(payload.delta) ? payload.delta : []
182
256
  };
183
- case "MESSAGES_SNAPSHOT": return {
184
- type: "MESSAGES_SNAPSHOT",
185
- messages: Array.isArray(payload.messages) ? payload.messages : []
186
- };
257
+ case "MESSAGES_SNAPSHOT":
258
+ if (!Array.isArray(payload.messages)) return reject("missing messages array");
259
+ return {
260
+ type: "MESSAGES_SNAPSHOT",
261
+ messages: payload.messages
262
+ };
187
263
  case "ACTIVITY_SNAPSHOT": {
188
264
  const activityType = getString("activityType");
189
- if (!activityType || !isPlainObject(payload.content)) return null;
265
+ if (!activityType || !isPlainObject(payload.content)) return reject("missing activityType or object content");
190
266
  return withOptional({
191
267
  type: "ACTIVITY_SNAPSHOT",
192
268
  activityType,
193
269
  content: payload.content
194
270
  }, {
195
271
  messageId: getString("messageId"),
196
- replace: typeof payload.replace === "boolean" ? payload.replace : void 0
272
+ replace: typeof payload.replace === "boolean" ? payload.replace : void 0,
273
+ subagentRunId: getString("subagentRunId")
197
274
  });
198
275
  }
199
276
  case "RAW": return withOptional({
@@ -202,13 +279,67 @@ const parseAgUiEvent = (event, options) => {
202
279
  }, { source: getString("source") });
203
280
  case "CUSTOM": {
204
281
  const name = getString("name");
205
- if (!name) return null;
282
+ if (!name) return reject("missing name");
206
283
  return {
207
284
  type: "CUSTOM",
208
285
  name,
209
286
  value: payload.value
210
287
  };
211
288
  }
289
+ case "SUBAGENT_STARTED": {
290
+ const subagentRunId = getString("subagentRunId");
291
+ const name = getString("name");
292
+ if (!subagentRunId || !name) return reject("missing subagentRunId or name");
293
+ return withOptional({
294
+ type: "SUBAGENT_STARTED",
295
+ subagentRunId,
296
+ name
297
+ }, {
298
+ description: getString("description"),
299
+ parentSubagentRunId: getString("parentSubagentRunId"),
300
+ parentToolCallId: getString("parentToolCallId"),
301
+ parentMessageId: getString("parentMessageId")
302
+ });
303
+ }
304
+ case "SUBAGENT_FINISHED": {
305
+ const subagentRunId = getString("subagentRunId");
306
+ if (!subagentRunId) return reject("missing subagentRunId");
307
+ const rawOutcome = payload.outcome;
308
+ let outcome;
309
+ if (rawOutcome == null) outcome = void 0;
310
+ else if (!isPlainObject(rawOutcome)) {
311
+ logRejectedEvent(options?.logger, "SUBAGENT_FINISHED", {
312
+ subagentRunId,
313
+ outcome: rawOutcome
314
+ }, "has invalid outcome");
315
+ outcome = void 0;
316
+ } else if (rawOutcome.type === "success") outcome = { type: "success" };
317
+ else if (rawOutcome.type === "suspended") outcome = withOptional({ type: "suspended" }, { interruptIds: Array.isArray(rawOutcome.interruptIds) ? rawOutcome.interruptIds.filter(isString) : void 0 });
318
+ else {
319
+ logRejectedEvent(options?.logger, "SUBAGENT_FINISHED", {
320
+ subagentRunId,
321
+ outcome: rawOutcome
322
+ }, "has unsupported outcome type");
323
+ outcome = void 0;
324
+ }
325
+ return withOptional({
326
+ type: "SUBAGENT_FINISHED",
327
+ subagentRunId
328
+ }, {
329
+ result: payload.result,
330
+ outcome
331
+ });
332
+ }
333
+ case "SUBAGENT_ERROR": {
334
+ const subagentRunId = getString("subagentRunId");
335
+ const message = getString("message");
336
+ if (!subagentRunId || !message) return reject("missing subagentRunId or message");
337
+ return withOptional({
338
+ type: "SUBAGENT_ERROR",
339
+ subagentRunId,
340
+ message
341
+ }, { code: getString("code") });
342
+ }
212
343
  default: return withOptional({
213
344
  type: "RAW",
214
345
  event: payload
@@ -1 +1 @@
1
- {"version":3,"file":"event-parser.js","names":[],"sources":["../../src/runtime/event-parser.ts"],"sourcesContent":["import type { AgUiEvent, AgUiInterrupt, AgUiRunFinishedOutcome } from \"./types\";\nimport type { Logger } from \"./logger\";\nimport { parseMcpToolCallResult } from \"./mcp-tool-result\";\nimport { withRawResponseSchema } from \"./interrupt-internals\";\n\nexport type ParseAgUiEventOptions = {\n logger?: Logger;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNonEmptyString = (value: unknown): value is string =>\n isString(value) && value.length > 0;\n\nconst withOptional = <T extends object>(\n base: T,\n optionals: Record<string, unknown>,\n) => {\n const definedEntries = Object.entries(optionals).filter(\n ([, value]) => value !== undefined,\n );\n return definedEntries.length === 0\n ? base\n : ({ ...base, ...Object.fromEntries(definedEntries) } as T);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst parseInterrupt = (raw: unknown): AgUiInterrupt | null => {\n if (!isPlainObject(raw)) return null;\n const id = raw.id;\n const reason = raw.reason;\n if (typeof id !== \"string\" || typeof reason !== \"string\") return null;\n const interrupt: AgUiInterrupt = { id, reason };\n if (typeof raw.message === \"string\") interrupt.message = raw.message;\n if (typeof raw.toolCallId === \"string\") interrupt.toolCallId = raw.toolCallId;\n if (typeof raw.expiresAt === \"string\") interrupt.expiresAt = raw.expiresAt;\n if (isPlainObject(raw.responseSchema))\n interrupt.responseSchema = raw.responseSchema;\n if (isPlainObject(raw.metadata)) interrupt.metadata = raw.metadata;\n // A present schema is kept whatever its shape: `false` is a JSON Schema that\n // rejects every payload, so normalizing it to absent would claim a gate no\n // decision can answer. Only an object schema fits `responseSchema`; every\n // other shape travels on the internal carrier. `null` is not a JSON Schema at\n // all, and it is what a server serializing an unset optional field sends, so\n // it reads as absent rather than as a schema nothing can satisfy.\n return raw.responseSchema == null || isPlainObject(raw.responseSchema)\n ? interrupt\n : withRawResponseSchema(interrupt, raw.responseSchema);\n};\n\nconst parseRunFinishedOutcome = (\n raw: unknown,\n logger: Logger | undefined,\n): AgUiRunFinishedOutcome | undefined => {\n if (!isPlainObject(raw)) return undefined;\n if (raw.type === \"success\") return { type: \"success\" };\n if (raw.type === \"interrupt\") {\n if (!Array.isArray(raw.interrupts)) {\n logger?.debug?.(\n \"[agui] RUN_FINISHED interrupt outcome missing interrupts array\",\n raw,\n );\n return undefined;\n }\n const parsed = raw.interrupts\n .map((entry) => parseInterrupt(entry))\n .filter((entry): entry is AgUiInterrupt => entry !== null);\n if (parsed.length === 0) {\n logger?.debug?.(\n \"[agui] RUN_FINISHED interrupt outcome has no valid interrupts\",\n raw.interrupts,\n );\n return undefined;\n }\n return { type: \"interrupt\", interrupts: parsed };\n }\n return undefined;\n};\n\nexport const parseAgUiEvent = (\n event: unknown,\n options?: ParseAgUiEventOptions,\n): AgUiEvent | null => {\n if (!event || typeof event !== \"object\") return null;\n const payload = event as Record<string, unknown>;\n const typeValue = payload.type;\n if (!isString(typeValue)) return null;\n\n const getString = (key: string) =>\n isString(payload[key]) ? (payload[key] as string) : undefined;\n\n switch (typeValue) {\n case \"RUN_STARTED\": {\n const runId = getString(\"runId\");\n return runId ? { type: \"RUN_STARTED\", runId } : null;\n }\n case \"RUN_FINISHED\": {\n const runId = getString(\"runId\");\n if (!runId) return null;\n return withOptional(\n { type: \"RUN_FINISHED\" as const, runId },\n {\n outcome: parseRunFinishedOutcome(payload.outcome, options?.logger),\n },\n );\n }\n case \"RUN_CANCELLED\": {\n const runId = getString(\"runId\");\n return withOptional({ type: \"RUN_CANCELLED\" as const }, { runId });\n }\n case \"RUN_ERROR\": {\n return withOptional(\n { type: \"RUN_ERROR\" as const },\n {\n message: getString(\"message\"),\n code: getString(\"code\"),\n },\n );\n }\n case \"TEXT_MESSAGE_START\":\n return withOptional(\n { type: \"TEXT_MESSAGE_START\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"TEXT_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\");\n if (!isNonEmptyString(delta)) return null;\n return withOptional(\n { type: \"TEXT_MESSAGE_CONTENT\" as const, delta },\n { messageId: getString(\"messageId\") },\n );\n }\n case \"TEXT_MESSAGE_END\":\n return withOptional(\n { type: \"TEXT_MESSAGE_END\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"TEXT_MESSAGE_CHUNK\": {\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"TEXT_MESSAGE_CHUNK\" as const, delta },\n { messageId: getString(\"messageId\") },\n );\n }\n case \"THINKING_START\":\n return withOptional(\n { type: \"THINKING_START\" as const },\n { title: getString(\"title\") },\n );\n case \"THINKING_TEXT_MESSAGE_START\":\n return { type: \"THINKING_TEXT_MESSAGE_START\" };\n case \"THINKING_TEXT_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\") ?? \"\";\n return { type: \"THINKING_TEXT_MESSAGE_CONTENT\", delta };\n }\n case \"THINKING_TEXT_MESSAGE_END\":\n return { type: \"THINKING_TEXT_MESSAGE_END\" };\n case \"THINKING_END\":\n return { type: \"THINKING_END\" };\n case \"REASONING_START\":\n return withOptional(\n { type: \"REASONING_START\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"REASONING_MESSAGE_START\":\n return withOptional(\n { type: \"REASONING_MESSAGE_START\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"REASONING_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"REASONING_MESSAGE_CONTENT\" as const, delta },\n { messageId: getString(\"messageId\") },\n );\n }\n case \"REASONING_MESSAGE_END\":\n return withOptional(\n { type: \"REASONING_MESSAGE_END\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"REASONING_ENCRYPTED_VALUE\": {\n const entityId = getString(\"entityId\");\n const encryptedValue = getString(\"encryptedValue\");\n const subtype = getString(\"subtype\");\n if (!entityId || !encryptedValue) return null;\n if (subtype !== \"message\" && subtype !== \"tool-call\") return null;\n return {\n type: \"REASONING_ENCRYPTED_VALUE\" as const,\n subtype,\n entityId,\n encryptedValue,\n };\n }\n case \"REASONING_END\":\n return withOptional(\n { type: \"REASONING_END\" as const },\n { messageId: getString(\"messageId\") },\n );\n case \"TOOL_CALL_START\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return null;\n return withOptional(\n { type: \"TOOL_CALL_START\" as const, toolCallId },\n {\n toolCallName: getString(\"toolCallName\"),\n parentMessageId: getString(\"parentMessageId\"),\n },\n );\n }\n case \"TOOL_CALL_ARGS\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return null;\n const delta = getString(\"delta\") ?? \"\";\n return { type: \"TOOL_CALL_ARGS\", toolCallId, delta };\n }\n case \"TOOL_CALL_END\": {\n const toolCallId = getString(\"toolCallId\");\n return toolCallId ? { type: \"TOOL_CALL_END\", toolCallId } : null;\n }\n case \"TOOL_CALL_CHUNK\":\n return withOptional(\n { type: \"TOOL_CALL_CHUNK\" as const },\n {\n toolCallId: getString(\"toolCallId\"),\n toolCallName: getString(\"toolCallName\"),\n parentMessageId: getString(\"parentMessageId\"),\n delta: getString(\"delta\"),\n },\n );\n case \"TOOL_CALL_RESULT\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return null;\n const content = getString(\"content\") ?? \"\";\n return withOptional(\n {\n type: \"TOOL_CALL_RESULT\" as const,\n toolCallId,\n content,\n },\n {\n messageId: getString(\"messageId\"),\n role: payload.role === \"tool\" ? \"tool\" : undefined,\n mcpResult: parseMcpToolCallResult(payload, content),\n },\n );\n }\n case \"STATE_SNAPSHOT\":\n return { type: \"STATE_SNAPSHOT\", snapshot: payload.snapshot };\n case \"STATE_DELTA\":\n return {\n type: \"STATE_DELTA\",\n delta: Array.isArray(payload.delta) ? (payload.delta as any[]) : [],\n };\n case \"MESSAGES_SNAPSHOT\":\n return {\n type: \"MESSAGES_SNAPSHOT\",\n messages: Array.isArray(payload.messages)\n ? (payload.messages as any[])\n : [],\n };\n case \"ACTIVITY_SNAPSHOT\": {\n const activityType = getString(\"activityType\");\n if (!activityType || !isPlainObject(payload.content)) return null;\n return withOptional(\n {\n type: \"ACTIVITY_SNAPSHOT\" as const,\n activityType,\n content: payload.content,\n },\n {\n messageId: getString(\"messageId\"),\n replace:\n typeof payload.replace === \"boolean\" ? payload.replace : undefined,\n },\n );\n }\n case \"RAW\":\n return withOptional(\n { type: \"RAW\" as const, event: payload.event },\n { source: getString(\"source\") },\n );\n case \"CUSTOM\": {\n const name = getString(\"name\");\n if (!name) return null;\n return { type: \"CUSTOM\", name, value: payload.value };\n }\n default:\n return withOptional(\n { type: \"RAW\" as const, event: payload },\n {\n source: isString(payload.type) ? (payload.type as string) : undefined,\n },\n );\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"event-parser.js","names":[],"sources":["../../src/runtime/event-parser.ts"],"sourcesContent":["import type {\n AgUiEvent,\n AgUiInterrupt,\n AgUiRunFinishedOutcome,\n AgUiSubagentFinishedOutcome,\n} from \"./types\";\nimport type { Logger } from \"./logger\";\nimport { parseMcpToolCallResult } from \"./mcp-tool-result\";\nimport { withRawResponseSchema } from \"./interrupt-internals\";\n\nexport type ParseAgUiEventOptions = {\n logger?: Logger;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNonEmptyString = (value: unknown): value is string =>\n isString(value) && value.length > 0;\n\nconst withOptional = <T extends object>(\n base: T,\n optionals: Record<string, unknown>,\n) => {\n const definedEntries = Object.entries(optionals).filter(\n ([, value]) => value !== undefined,\n );\n return definedEntries.length === 0\n ? base\n : ({ ...base, ...Object.fromEntries(definedEntries) } as T);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst logRejectedEvent = (\n logger: Logger | undefined,\n type: unknown,\n payload: unknown,\n reason: string,\n) => {\n const typeLabel = isString(type) ? type : \"unknown\";\n logger?.debug?.(`[agui] ${typeLabel} ${reason}`, payload);\n};\n\nconst parseInterrupt = (raw: unknown): AgUiInterrupt | null => {\n if (!isPlainObject(raw)) return null;\n const id = raw.id;\n const reason = raw.reason;\n if (typeof id !== \"string\" || typeof reason !== \"string\") return null;\n const interrupt: AgUiInterrupt = { id, reason };\n if (typeof raw.message === \"string\") interrupt.message = raw.message;\n if (typeof raw.toolCallId === \"string\") interrupt.toolCallId = raw.toolCallId;\n if (typeof raw.expiresAt === \"string\") interrupt.expiresAt = raw.expiresAt;\n if (isPlainObject(raw.responseSchema))\n interrupt.responseSchema = raw.responseSchema;\n if (isPlainObject(raw.metadata)) interrupt.metadata = raw.metadata;\n // A present schema is kept whatever its shape: `false` is a JSON Schema that\n // rejects every payload, so normalizing it to absent would claim a gate no\n // decision can answer. Only an object schema fits `responseSchema`; every\n // other shape travels on the internal carrier. `null` is not a JSON Schema at\n // all, and it is what a server serializing an unset optional field sends, so\n // it reads as absent rather than as a schema nothing can satisfy.\n return raw.responseSchema == null || isPlainObject(raw.responseSchema)\n ? interrupt\n : withRawResponseSchema(interrupt, raw.responseSchema);\n};\n\nconst parseRunFinishedOutcome = (\n raw: unknown,\n runId: string,\n logger: Logger | undefined,\n): AgUiRunFinishedOutcome | undefined => {\n if (raw == null) return undefined;\n if (!isPlainObject(raw)) {\n logRejectedEvent(\n logger,\n \"RUN_FINISHED\",\n { runId, outcome: raw },\n \"has invalid outcome\",\n );\n return undefined;\n }\n if (raw.type === \"success\") return { type: \"success\" };\n if (raw.type === \"interrupt\") {\n if (!Array.isArray(raw.interrupts)) {\n logRejectedEvent(\n logger,\n \"RUN_FINISHED\",\n { runId, outcome: raw },\n \"has an interrupt outcome missing interrupts array\",\n );\n return undefined;\n }\n const parsed = raw.interrupts\n .map((entry) => {\n const interrupt = parseInterrupt(entry);\n if (interrupt === null) {\n logRejectedEvent(\n logger,\n \"RUN_FINISHED\",\n { runId, interrupt: entry },\n \"has malformed interrupt\",\n );\n }\n return interrupt;\n })\n .filter((entry): entry is AgUiInterrupt => entry !== null);\n if (parsed.length === 0) {\n logRejectedEvent(\n logger,\n \"RUN_FINISHED\",\n { runId, interrupts: raw.interrupts },\n \"has an interrupt outcome with no valid interrupts\",\n );\n return undefined;\n }\n return { type: \"interrupt\", interrupts: parsed };\n }\n logRejectedEvent(\n logger,\n \"RUN_FINISHED\",\n { runId, outcome: raw },\n \"has unsupported outcome type\",\n );\n return undefined;\n};\n\nexport const parseAgUiEvent = (\n event: unknown,\n options?: ParseAgUiEventOptions,\n): AgUiEvent | null => {\n if (!event || typeof event !== \"object\") {\n logRejectedEvent(options?.logger, undefined, event, \"is not an object\");\n return null;\n }\n const payload = event as Record<string, unknown>;\n const typeValue = payload.type;\n if (!isString(typeValue)) {\n logRejectedEvent(options?.logger, typeValue, payload, \"has no string type\");\n return null;\n }\n\n const reject = (reason: string): null => {\n logRejectedEvent(options?.logger, typeValue, payload, reason);\n return null;\n };\n\n const getString = (key: string) =>\n isString(payload[key]) ? (payload[key] as string) : undefined;\n\n switch (typeValue) {\n case \"RUN_STARTED\": {\n const runId = getString(\"runId\");\n return runId ? { type: \"RUN_STARTED\", runId } : reject(\"missing runId\");\n }\n case \"RUN_FINISHED\": {\n const runId = getString(\"runId\");\n if (!runId) return reject(\"missing runId\");\n return withOptional(\n { type: \"RUN_FINISHED\" as const, runId },\n {\n outcome: parseRunFinishedOutcome(\n payload.outcome,\n runId,\n options?.logger,\n ),\n },\n );\n }\n case \"RUN_CANCELLED\": {\n const runId = getString(\"runId\");\n return withOptional({ type: \"RUN_CANCELLED\" as const }, { runId });\n }\n case \"RUN_ERROR\": {\n return withOptional(\n { type: \"RUN_ERROR\" as const },\n {\n message: getString(\"message\"),\n code: getString(\"code\"),\n },\n );\n }\n case \"TEXT_MESSAGE_START\":\n return withOptional(\n { type: \"TEXT_MESSAGE_START\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"TEXT_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\");\n if (!isNonEmptyString(delta)) return reject(\"missing non-empty delta\");\n return withOptional(\n { type: \"TEXT_MESSAGE_CONTENT\" as const, delta },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"TEXT_MESSAGE_END\":\n return withOptional(\n { type: \"TEXT_MESSAGE_END\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"TEXT_MESSAGE_CHUNK\": {\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"TEXT_MESSAGE_CHUNK\" as const, delta },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"THINKING_START\":\n return withOptional(\n { type: \"THINKING_START\" as const },\n { title: getString(\"title\") },\n );\n case \"THINKING_TEXT_MESSAGE_START\":\n return { type: \"THINKING_TEXT_MESSAGE_START\" };\n case \"THINKING_TEXT_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\") ?? \"\";\n return { type: \"THINKING_TEXT_MESSAGE_CONTENT\", delta };\n }\n case \"THINKING_TEXT_MESSAGE_END\":\n return { type: \"THINKING_TEXT_MESSAGE_END\" };\n case \"THINKING_END\":\n return { type: \"THINKING_END\" };\n case \"REASONING_START\":\n return withOptional(\n { type: \"REASONING_START\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"REASONING_MESSAGE_START\":\n return withOptional(\n { type: \"REASONING_MESSAGE_START\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"REASONING_MESSAGE_CONTENT\": {\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"REASONING_MESSAGE_CONTENT\" as const, delta },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"REASONING_MESSAGE_END\":\n return withOptional(\n { type: \"REASONING_MESSAGE_END\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"REASONING_ENCRYPTED_VALUE\": {\n const entityId = getString(\"entityId\");\n const encryptedValue = getString(\"encryptedValue\");\n const subtype = getString(\"subtype\");\n if (!entityId || !encryptedValue) {\n return reject(\"missing entityId or encryptedValue\");\n }\n if (subtype !== \"message\" && subtype !== \"tool-call\") {\n return reject(\"has an invalid subtype\");\n }\n // Spread rather than withOptional: routing the narrowed `subtype` through\n // a generic helper widens it back to string.\n const subagentRunId = getString(\"subagentRunId\");\n return {\n type: \"REASONING_ENCRYPTED_VALUE\" as const,\n subtype,\n entityId,\n encryptedValue,\n ...(subagentRunId !== undefined ? { subagentRunId } : {}),\n };\n }\n case \"REASONING_END\":\n return withOptional(\n { type: \"REASONING_END\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"TOOL_CALL_START\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return reject(\"missing toolCallId\");\n return withOptional(\n { type: \"TOOL_CALL_START\" as const, toolCallId },\n {\n toolCallName: getString(\"toolCallName\"),\n parentMessageId: getString(\"parentMessageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"TOOL_CALL_ARGS\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return reject(\"missing toolCallId\");\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"TOOL_CALL_ARGS\" as const, toolCallId, delta },\n { subagentRunId: getString(\"subagentRunId\") },\n );\n }\n case \"TOOL_CALL_END\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return reject(\"missing toolCallId\");\n return withOptional(\n { type: \"TOOL_CALL_END\" as const, toolCallId },\n { subagentRunId: getString(\"subagentRunId\") },\n );\n }\n case \"TOOL_CALL_CHUNK\":\n return withOptional(\n { type: \"TOOL_CALL_CHUNK\" as const },\n {\n toolCallId: getString(\"toolCallId\"),\n toolCallName: getString(\"toolCallName\"),\n parentMessageId: getString(\"parentMessageId\"),\n delta: getString(\"delta\"),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n case \"TOOL_CALL_RESULT\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return reject(\"missing toolCallId\");\n const content = getString(\"content\") ?? \"\";\n return withOptional(\n {\n type: \"TOOL_CALL_RESULT\" as const,\n toolCallId,\n content,\n },\n {\n messageId: getString(\"messageId\"),\n role: payload.role === \"tool\" ? \"tool\" : undefined,\n mcpResult: parseMcpToolCallResult(payload, content),\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"STATE_SNAPSHOT\":\n if (payload.snapshot === undefined) {\n return reject(\"missing snapshot\");\n }\n return { type: \"STATE_SNAPSHOT\", snapshot: payload.snapshot };\n case \"STATE_DELTA\":\n return {\n type: \"STATE_DELTA\",\n delta: Array.isArray(payload.delta) ? (payload.delta as any[]) : [],\n };\n case \"MESSAGES_SNAPSHOT\":\n if (!Array.isArray(payload.messages)) {\n return reject(\"missing messages array\");\n }\n return {\n type: \"MESSAGES_SNAPSHOT\",\n messages: payload.messages as any[],\n };\n case \"ACTIVITY_SNAPSHOT\": {\n const activityType = getString(\"activityType\");\n if (!activityType || !isPlainObject(payload.content)) {\n return reject(\"missing activityType or object content\");\n }\n return withOptional(\n {\n type: \"ACTIVITY_SNAPSHOT\" as const,\n activityType,\n content: payload.content,\n },\n {\n messageId: getString(\"messageId\"),\n replace:\n typeof payload.replace === \"boolean\" ? payload.replace : undefined,\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"RAW\":\n return withOptional(\n { type: \"RAW\" as const, event: payload.event },\n { source: getString(\"source\") },\n );\n case \"CUSTOM\": {\n const name = getString(\"name\");\n if (!name) return reject(\"missing name\");\n return { type: \"CUSTOM\", name, value: payload.value };\n }\n case \"SUBAGENT_STARTED\": {\n const subagentRunId = getString(\"subagentRunId\");\n const name = getString(\"name\");\n if (!subagentRunId || !name) {\n return reject(\"missing subagentRunId or name\");\n }\n return withOptional(\n { type: \"SUBAGENT_STARTED\" as const, subagentRunId, name },\n {\n description: getString(\"description\"),\n parentSubagentRunId: getString(\"parentSubagentRunId\"),\n parentToolCallId: getString(\"parentToolCallId\"),\n parentMessageId: getString(\"parentMessageId\"),\n },\n );\n }\n case \"SUBAGENT_FINISHED\": {\n const subagentRunId = getString(\"subagentRunId\");\n if (!subagentRunId) return reject(\"missing subagentRunId\");\n const rawOutcome = payload.outcome;\n let outcome: AgUiSubagentFinishedOutcome | undefined;\n if (rawOutcome == null) {\n outcome = undefined;\n } else if (!isPlainObject(rawOutcome)) {\n logRejectedEvent(\n options?.logger,\n \"SUBAGENT_FINISHED\",\n { subagentRunId, outcome: rawOutcome },\n \"has invalid outcome\",\n );\n outcome = undefined;\n } else if (rawOutcome.type === \"success\") {\n outcome = { type: \"success\" as const };\n } else if (rawOutcome.type === \"suspended\") {\n outcome = withOptional(\n { type: \"suspended\" as const },\n {\n interruptIds: Array.isArray(rawOutcome.interruptIds)\n ? (rawOutcome.interruptIds as unknown[]).filter(isString)\n : undefined,\n },\n );\n } else {\n logRejectedEvent(\n options?.logger,\n \"SUBAGENT_FINISHED\",\n { subagentRunId, outcome: rawOutcome },\n \"has unsupported outcome type\",\n );\n outcome = undefined;\n }\n return withOptional(\n { type: \"SUBAGENT_FINISHED\" as const, subagentRunId },\n { result: payload.result, outcome },\n );\n }\n case \"SUBAGENT_ERROR\": {\n const subagentRunId = getString(\"subagentRunId\");\n const message = getString(\"message\");\n if (!subagentRunId || !message) {\n return reject(\"missing subagentRunId or message\");\n }\n return withOptional(\n { type: \"SUBAGENT_ERROR\" as const, subagentRunId, message },\n { code: getString(\"code\") },\n );\n }\n default:\n return withOptional(\n { type: \"RAW\" as const, event: payload },\n {\n source: isString(payload.type) ? (payload.type as string) : undefined,\n },\n );\n }\n};\n"],"mappings":";;;AAcA,MAAM,YAAY,UAAoC,OAAO,UAAU;AACvE,MAAM,oBAAoB,UACxB,SAAS,KAAK,KAAK,MAAM,SAAS;AAEpC,MAAM,gBACJ,MACA,cACG;CACH,MAAM,iBAAiB,OAAO,QAAQ,SAAS,CAAC,CAAC,QAC9C,GAAG,WAAW,UAAU,KAAA,CAC3B;CACA,OAAO,eAAe,WAAW,IAC7B,OACC;EAAE,GAAG;EAAM,GAAG,OAAO,YAAY,cAAc;CAAE;AACxD;AAEA,MAAM,iBAAiB,UACrB,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAE9D,MAAM,oBACJ,QACA,MACA,SACA,WACG;CACH,MAAM,YAAY,SAAS,IAAI,IAAI,OAAO;CAC1C,QAAQ,QAAQ,UAAU,UAAU,GAAG,UAAU,OAAO;AAC1D;AAEA,MAAM,kBAAkB,QAAuC;CAC7D,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO;CAChC,MAAM,KAAK,IAAI;CACf,MAAM,SAAS,IAAI;CACnB,IAAI,OAAO,OAAO,YAAY,OAAO,WAAW,UAAU,OAAO;CACjE,MAAM,YAA2B;EAAE;EAAI;CAAO;CAC9C,IAAI,OAAO,IAAI,YAAY,UAAU,UAAU,UAAU,IAAI;CAC7D,IAAI,OAAO,IAAI,eAAe,UAAU,UAAU,aAAa,IAAI;CACnE,IAAI,OAAO,IAAI,cAAc,UAAU,UAAU,YAAY,IAAI;CACjE,IAAI,cAAc,IAAI,cAAc,GAClC,UAAU,iBAAiB,IAAI;CACjC,IAAI,cAAc,IAAI,QAAQ,GAAG,UAAU,WAAW,IAAI;CAO1D,OAAO,IAAI,kBAAkB,QAAQ,cAAc,IAAI,cAAc,IACjE,YACA,sBAAsB,WAAW,IAAI,cAAc;AACzD;AAEA,MAAM,2BACJ,KACA,OACA,WACuC;CACvC,IAAI,OAAO,MAAM,OAAO,KAAA;CACxB,IAAI,CAAC,cAAc,GAAG,GAAG;EACvB,iBACE,QACA,gBACA;GAAE;GAAO,SAAS;EAAI,GACtB,qBACF;EACA;CACF;CACA,IAAI,IAAI,SAAS,WAAW,OAAO,EAAE,MAAM,UAAU;CACrD,IAAI,IAAI,SAAS,aAAa;EAC5B,IAAI,CAAC,MAAM,QAAQ,IAAI,UAAU,GAAG;GAClC,iBACE,QACA,gBACA;IAAE;IAAO,SAAS;GAAI,GACtB,mDACF;GACA;EACF;EACA,MAAM,SAAS,IAAI,WAChB,KAAK,UAAU;GACd,MAAM,YAAY,eAAe,KAAK;GACtC,IAAI,cAAc,MAChB,iBACE,QACA,gBACA;IAAE;IAAO,WAAW;GAAM,GAC1B,yBACF;GAEF,OAAO;EACT,CAAC,CAAC,CACD,QAAQ,UAAkC,UAAU,IAAI;EAC3D,IAAI,OAAO,WAAW,GAAG;GACvB,iBACE,QACA,gBACA;IAAE;IAAO,YAAY,IAAI;GAAW,GACpC,mDACF;GACA;EACF;EACA,OAAO;GAAE,MAAM;GAAa,YAAY;EAAO;CACjD;CACA,iBACE,QACA,gBACA;EAAE;EAAO,SAAS;CAAI,GACtB,8BACF;AAEF;AAEA,MAAa,kBACX,OACA,YACqB;CACrB,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;EACvC,iBAAiB,SAAS,QAAQ,KAAA,GAAW,OAAO,kBAAkB;EACtE,OAAO;CACT;CACA,MAAM,UAAU;CAChB,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,SAAS,SAAS,GAAG;EACxB,iBAAiB,SAAS,QAAQ,WAAW,SAAS,oBAAoB;EAC1E,OAAO;CACT;CAEA,MAAM,UAAU,WAAyB;EACvC,iBAAiB,SAAS,QAAQ,WAAW,SAAS,MAAM;EAC5D,OAAO;CACT;CAEA,MAAM,aAAa,QACjB,SAAS,QAAQ,IAAI,IAAK,QAAQ,OAAkB,KAAA;CAEtD,QAAQ,WAAR;EACE,KAAK,eAAe;GAClB,MAAM,QAAQ,UAAU,OAAO;GAC/B,OAAO,QAAQ;IAAE,MAAM;IAAe;GAAM,IAAI,OAAO,eAAe;EACxE;EACA,KAAK,gBAAgB;GACnB,MAAM,QAAQ,UAAU,OAAO;GAC/B,IAAI,CAAC,OAAO,OAAO,OAAO,eAAe;GACzC,OAAO,aACL;IAAE,MAAM;IAAyB;GAAM,GACvC,EACE,SAAS,wBACP,QAAQ,SACR,OACA,SAAS,MACX,EACF,CACF;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,QAAQ,UAAU,OAAO;GAC/B,OAAO,aAAa,EAAE,MAAM,gBAAyB,GAAG,EAAE,MAAM,CAAC;EACnE;EACA,KAAK,aACH,OAAO,aACL,EAAE,MAAM,YAAqB,GAC7B;GACE,SAAS,UAAU,SAAS;GAC5B,MAAM,UAAU,MAAM;EACxB,CACF;EAEF,KAAK,sBACH,OAAO,aACL,EAAE,MAAM,qBAA8B,GACtC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,wBAAwB;GAC3B,MAAM,QAAQ,UAAU,OAAO;GAC/B,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO,OAAO,yBAAyB;GACrE,OAAO,aACL;IAAE,MAAM;IAAiC;GAAM,GAC/C;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,oBACH,OAAO,aACL,EAAE,MAAM,mBAA4B,GACpC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,sBAAsB;GACzB,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAA+B;GAAM,GAC7C;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,kBACH,OAAO,aACL,EAAE,MAAM,iBAA0B,GAClC,EAAE,OAAO,UAAU,OAAO,EAAE,CAC9B;EACF,KAAK,+BACH,OAAO,EAAE,MAAM,8BAA8B;EAC/C,KAAK,iCAEH,OAAO;GAAE,MAAM;GAAiC,OADlC,UAAU,OAAO,KAAK;EACkB;EAExD,KAAK,6BACH,OAAO,EAAE,MAAM,4BAA4B;EAC7C,KAAK,gBACH,OAAO,EAAE,MAAM,eAAe;EAChC,KAAK,mBACH,OAAO,aACL,EAAE,MAAM,kBAA2B,GACnC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,2BACH,OAAO,aACL,EAAE,MAAM,0BAAmC,GAC3C;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,6BAA6B;GAChC,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAAsC;GAAM,GACpD;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,yBACH,OAAO,aACL,EAAE,MAAM,wBAAiC,GACzC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,6BAA6B;GAChC,MAAM,WAAW,UAAU,UAAU;GACrC,MAAM,iBAAiB,UAAU,gBAAgB;GACjD,MAAM,UAAU,UAAU,SAAS;GACnC,IAAI,CAAC,YAAY,CAAC,gBAChB,OAAO,OAAO,oCAAoC;GAEpD,IAAI,YAAY,aAAa,YAAY,aACvC,OAAO,OAAO,wBAAwB;GAIxC,MAAM,gBAAgB,UAAU,eAAe;GAC/C,OAAO;IACL,MAAM;IACN;IACA;IACA;IACA,GAAI,kBAAkB,KAAA,IAAY,EAAE,cAAc,IAAI,CAAC;GACzD;EACF;EACA,KAAK,iBACH,OAAO,aACL,EAAE,MAAM,gBAAyB,GACjC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,mBAAmB;GACtB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,OAAO,aACL;IAAE,MAAM;IAA4B;GAAW,GAC/C;IACE,cAAc,UAAU,cAAc;IACtC,iBAAiB,UAAU,iBAAiB;IAC5C,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAA2B;IAAY;GAAM,GACrD,EAAE,eAAe,UAAU,eAAe,EAAE,CAC9C;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,OAAO,aACL;IAAE,MAAM;IAA0B;GAAW,GAC7C,EAAE,eAAe,UAAU,eAAe,EAAE,CAC9C;EACF;EACA,KAAK,mBACH,OAAO,aACL,EAAE,MAAM,kBAA2B,GACnC;GACE,YAAY,UAAU,YAAY;GAClC,cAAc,UAAU,cAAc;GACtC,iBAAiB,UAAU,iBAAiB;GAC5C,OAAO,UAAU,OAAO;GACxB,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,oBAAoB;GACvB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,MAAM,UAAU,UAAU,SAAS,KAAK;GACxC,OAAO,aACL;IACE,MAAM;IACN;IACA;GACF,GACA;IACE,WAAW,UAAU,WAAW;IAChC,MAAM,QAAQ,SAAS,SAAS,SAAS,KAAA;IACzC,WAAW,uBAAuB,SAAS,OAAO;IAClD,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK;GACH,IAAI,QAAQ,aAAa,KAAA,GACvB,OAAO,OAAO,kBAAkB;GAElC,OAAO;IAAE,MAAM;IAAkB,UAAU,QAAQ;GAAS;EAC9D,KAAK,eACH,OAAO;GACL,MAAM;GACN,OAAO,MAAM,QAAQ,QAAQ,KAAK,IAAK,QAAQ,QAAkB,CAAC;EACpE;EACF,KAAK;GACH,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,GACjC,OAAO,OAAO,wBAAwB;GAExC,OAAO;IACL,MAAM;IACN,UAAU,QAAQ;GACpB;EACF,KAAK,qBAAqB;GACxB,MAAM,eAAe,UAAU,cAAc;GAC7C,IAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ,OAAO,GACjD,OAAO,OAAO,wCAAwC;GAExD,OAAO,aACL;IACE,MAAM;IACN;IACA,SAAS,QAAQ;GACnB,GACA;IACE,WAAW,UAAU,WAAW;IAChC,SACE,OAAO,QAAQ,YAAY,YAAY,QAAQ,UAAU,KAAA;IAC3D,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,OACH,OAAO,aACL;GAAE,MAAM;GAAgB,OAAO,QAAQ;EAAM,GAC7C,EAAE,QAAQ,UAAU,QAAQ,EAAE,CAChC;EACF,KAAK,UAAU;GACb,MAAM,OAAO,UAAU,MAAM;GAC7B,IAAI,CAAC,MAAM,OAAO,OAAO,cAAc;GACvC,OAAO;IAAE,MAAM;IAAU;IAAM,OAAO,QAAQ;GAAM;EACtD;EACA,KAAK,oBAAoB;GACvB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,MAAM,OAAO,UAAU,MAAM;GAC7B,IAAI,CAAC,iBAAiB,CAAC,MACrB,OAAO,OAAO,+BAA+B;GAE/C,OAAO,aACL;IAAE,MAAM;IAA6B;IAAe;GAAK,GACzD;IACE,aAAa,UAAU,aAAa;IACpC,qBAAqB,UAAU,qBAAqB;IACpD,kBAAkB,UAAU,kBAAkB;IAC9C,iBAAiB,UAAU,iBAAiB;GAC9C,CACF;EACF;EACA,KAAK,qBAAqB;GACxB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,IAAI,CAAC,eAAe,OAAO,OAAO,uBAAuB;GACzD,MAAM,aAAa,QAAQ;GAC3B,IAAI;GACJ,IAAI,cAAc,MAChB,UAAU,KAAA;QACL,IAAI,CAAC,cAAc,UAAU,GAAG;IACrC,iBACE,SAAS,QACT,qBACA;KAAE;KAAe,SAAS;IAAW,GACrC,qBACF;IACA,UAAU,KAAA;GACZ,OAAO,IAAI,WAAW,SAAS,WAC7B,UAAU,EAAE,MAAM,UAAmB;QAChC,IAAI,WAAW,SAAS,aAC7B,UAAU,aACR,EAAE,MAAM,YAAqB,GAC7B,EACE,cAAc,MAAM,QAAQ,WAAW,YAAY,IAC9C,WAAW,aAA2B,OAAO,QAAQ,IACtD,KAAA,EACN,CACF;QACK;IACL,iBACE,SAAS,QACT,qBACA;KAAE;KAAe,SAAS;IAAW,GACrC,8BACF;IACA,UAAU,KAAA;GACZ;GACA,OAAO,aACL;IAAE,MAAM;IAA8B;GAAc,GACpD;IAAE,QAAQ,QAAQ;IAAQ;GAAQ,CACpC;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,MAAM,UAAU,UAAU,SAAS;GACnC,IAAI,CAAC,iBAAiB,CAAC,SACrB,OAAO,OAAO,kCAAkC;GAElD,OAAO,aACL;IAAE,MAAM;IAA2B;IAAe;GAAQ,GAC1D,EAAE,MAAM,UAAU,MAAM,EAAE,CAC5B;EACF;EACA,SACE,OAAO,aACL;GAAE,MAAM;GAAgB,OAAO;EAAQ,GACvC,EACE,QAAQ,SAAS,QAAQ,IAAI,IAAK,QAAQ,OAAkB,KAAA,EAC9D,CACF;CACJ;AACF"}
@@ -90,6 +90,12 @@ type AgUiRunFinishedOutcome = {
90
90
  type: "interrupt";
91
91
  interrupts: AgUiInterrupt[];
92
92
  };
93
+ type AgUiSubagentFinishedOutcome = {
94
+ type: "success";
95
+ } | {
96
+ type: "suspended";
97
+ interruptIds?: string[];
98
+ };
93
99
  type AgUiEvent = {
94
100
  type: "RUN_STARTED";
95
101
  runId: string;
@@ -107,16 +113,21 @@ type AgUiEvent = {
107
113
  } | {
108
114
  type: "TEXT_MESSAGE_START";
109
115
  messageId?: string;
116
+ subagentRunId?: string;
110
117
  } | {
111
118
  type: "TEXT_MESSAGE_CONTENT";
112
119
  messageId?: string;
113
120
  delta: string;
121
+ subagentRunId?: string;
114
122
  } | {
115
123
  type: "TEXT_MESSAGE_END";
116
124
  messageId?: string;
125
+ subagentRunId?: string;
117
126
  } | {
118
127
  type: "TEXT_MESSAGE_CHUNK";
128
+ messageId?: string;
119
129
  delta: string;
130
+ subagentRunId?: string;
120
131
  } | {
121
132
  type: "THINKING_START";
122
133
  title?: string;
@@ -132,42 +143,52 @@ type AgUiEvent = {
132
143
  } | {
133
144
  type: "REASONING_START";
134
145
  messageId?: string;
146
+ subagentRunId?: string;
135
147
  } | {
136
148
  type: "REASONING_MESSAGE_START";
137
149
  messageId?: string;
150
+ subagentRunId?: string;
138
151
  } | {
139
152
  type: "REASONING_MESSAGE_CONTENT";
140
153
  messageId?: string;
141
154
  delta: string;
155
+ subagentRunId?: string;
142
156
  } | {
143
157
  type: "REASONING_MESSAGE_END";
144
158
  messageId?: string;
159
+ subagentRunId?: string;
145
160
  } | {
146
161
  type: "REASONING_ENCRYPTED_VALUE";
147
162
  subtype: "message" | "tool-call";
148
163
  entityId: string;
149
164
  encryptedValue: string;
165
+ subagentRunId?: string;
150
166
  } | {
151
167
  type: "REASONING_END";
152
168
  messageId?: string;
169
+ subagentRunId?: string;
153
170
  } | {
154
171
  type: "TOOL_CALL_START";
155
172
  toolCallId: string;
156
173
  toolCallName?: string;
157
174
  parentMessageId?: string;
175
+ subagentRunId?: string;
158
176
  } | {
159
177
  type: "TOOL_CALL_ARGS";
160
178
  toolCallId: string;
161
179
  delta: string;
180
+ subagentRunId?: string;
162
181
  } | {
163
182
  type: "TOOL_CALL_END";
164
183
  toolCallId: string;
184
+ subagentRunId?: string;
165
185
  } | {
166
186
  type: "TOOL_CALL_CHUNK";
167
187
  toolCallId?: string;
168
188
  toolCallName?: string;
169
189
  parentMessageId?: string;
170
190
  delta?: string;
191
+ subagentRunId?: string;
171
192
  } | {
172
193
  type: "TOOL_CALL_RESULT";
173
194
  messageId?: string;
@@ -175,12 +196,14 @@ type AgUiEvent = {
175
196
  content: string;
176
197
  role?: "tool";
177
198
  mcpResult?: McpToolCallResult;
199
+ subagentRunId?: string;
178
200
  } | {
179
201
  type: "ACTIVITY_SNAPSHOT";
180
202
  activityType: string;
181
203
  content: Record<string, unknown>;
182
204
  messageId?: string;
183
205
  replace?: boolean;
206
+ subagentRunId?: string;
184
207
  } | {
185
208
  type: "RAW";
186
209
  event: any;
@@ -198,7 +221,25 @@ type AgUiEvent = {
198
221
  } | {
199
222
  type: "MESSAGES_SNAPSHOT";
200
223
  messages: any[];
224
+ } | {
225
+ type: "SUBAGENT_STARTED";
226
+ subagentRunId: string;
227
+ name: string;
228
+ description?: string;
229
+ parentSubagentRunId?: string;
230
+ parentToolCallId?: string;
231
+ parentMessageId?: string;
232
+ } | {
233
+ type: "SUBAGENT_FINISHED";
234
+ subagentRunId: string;
235
+ result?: unknown;
236
+ outcome?: AgUiSubagentFinishedOutcome;
237
+ } | {
238
+ type: "SUBAGENT_ERROR";
239
+ subagentRunId: string;
240
+ message: string;
241
+ code?: string;
201
242
  };
202
243
  //#endregion
203
- export { AgUiEvent, AgUiInterrupt, AgUiInterruptReason, AgUiResumeEntry, AgUiRunFinishedOutcome, AgUiRuntimeExtras, UseAgUiRuntimeAdapters, UseAgUiRuntimeOptions, UseAgUiThreadListAdapter };
244
+ export { AgUiEvent, AgUiInterrupt, AgUiInterruptReason, AgUiResumeEntry, AgUiRunFinishedOutcome, AgUiRuntimeExtras, AgUiSubagentFinishedOutcome, UseAgUiRuntimeAdapters, UseAgUiRuntimeOptions, UseAgUiThreadListAdapter };
204
245
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/runtime/types.ts"],"mappings":";;;;;;;;;;;;KAuBK;EACH,mBAAmB;EACnB,QAAQ;;;;;;EAMR;;KAGU,2BAA2B,KACrC;EAGA,qBAEM,qBACG,QAAQ,wBAAwB;;KAI/B;EACV,cAAc;EACd,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,UAAU;;;;EAIV,aAAa;;KAGH,wBAAwB;EAClC,OAAO;EACP,SAAS,QAAQ;EACjB;;;;;;;;;;;EAWA;;;;;;;EAOA;EACA,WAAW,GAAG;EACd;EACA,WAAW;;KAGD;KAMA;EACV;EACA,QAAQ;EACR;EACA;EACA,iBAAiB;EACjB;EACA,WAAW;;KAGD;EACV;EACA;EACA;;KAGU;EACV,qBAAqB;EACrB,iBAAiB,QAAQ;EACzB,2BACE,oBAAoB,sBACjB;EACL,YACE,SAAS,qBACT,qBAAqB,sBAClB;EACL,OAAO;EACP,WACE,MACI,sBACE,MAAM,kCAAkC;;KAItC;EACN;;EACA;EAAmB,YAAY;;KAEzB;EACN;EAAqB;;EAErB;EACA;EACA,UAAU;;EAEV;EAAuB;;EACvB;EAAmB;EAAkB;;EACrC;EAA4B;;EAC5B;EAA8B;EAAoB;;EAClD;EAA0B;;EAC1B;EAA4B;;EAC5B;EAAwB;;EACxB;;EACA;EAAuC;;EACvC;;EACA;;EACA;EAAyB;;EACzB;EAAiC;;EACjC;EAAmC;EAAoB;;EACvD;EAA+B;;EAE/B;EACA;EACA;EACA;;EAEA;EAAuB;;EAEvB;EACA;EACA;EACA;;EAEA;EAAwB;EAAoB;;EAC5C;EAAuB;;EAEvB;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA,YAAY;;EAGZ;EACA;EACA,SAAS;EACT;EACA;;EAEA;EAAa;EAAY;;EACzB;EAAgB;EAAc;;EAC9B;EAAwB;;EACxB;EAAqB;;EACrB;EAA2B"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/runtime/types.ts"],"mappings":";;;;;;;;;;;;KAuBK;EACH,mBAAmB;EACnB,QAAQ;;;;;;EAMR;;KAGU,2BAA2B,KACrC;EAGA,qBAEM,qBACG,QAAQ,wBAAwB;;KAI/B;EACV,cAAc;EACd,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,WAAW;EACX,UAAU;;;;EAIV,aAAa;;KAGH,wBAAwB;EAClC,OAAO;EACP,SAAS,QAAQ;EACjB;;;;;;;;;;;EAWA;;;;;;;EAOA;EACA,WAAW,GAAG;EACd;EACA,WAAW;;KAGD;KAMA;EACV;EACA,QAAQ;EACR;EACA;EACA,iBAAiB;EACjB;EACA,WAAW;;KAGD;EACV;EACA;EACA;;KAGU;EACV,qBAAqB;EACrB,iBAAiB,QAAQ;EACzB,2BACE,oBAAoB,sBACjB;EACL,YACE,SAAS,qBACT,qBAAqB,sBAClB;EACL,OAAO;EACP,WACE,MACI,sBACE,MAAM,kCAAkC;;KAItC;EACN;;EACA;EAAmB,YAAY;;KAEzB;EACN;;EACA;EAAmB;;KAEb;EACN;EAAqB;;EAErB;EACA;EACA,UAAU;;EAEV;EAAuB;;EACvB;EAAmB;EAAkB;;EACrC;EAA4B;EAAoB;;EAEhD;EACA;EACA;EACA;;EAEA;EAA0B;EAAoB;;EAE9C;EACA;EACA;EACA;;EAEA;EAAwB;;EACxB;;EACA;EAAuC;;EACvC;;EACA;;EACA;EAAyB;EAAoB;;EAE7C;EACA;EACA;;EAGA;EACA;EACA;EACA;;EAGA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;;EAEA;EAAuB;EAAoB;;EAE3C;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;;EAEA;EAAuB;EAAoB;;EAE3C;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA,YAAY;EACZ;;EAGA;EACA;EACA,SAAS;EACT;EACA;EACA;;EAEA;EAAa;EAAY;;EACzB;EAAgB;EAAc;;EAC9B;EAAwB;;EACxB;EAAqB;;EACrB;EAA2B;;EAE3B;EACA;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA,UAAU;;EAGV;EACA;EACA;EACA"}
@@ -28,14 +28,16 @@ function useAgUiRuntime(options) {
28
28
  notifyUpdate
29
29
  });
30
30
  const core = coreRef.current;
31
- core.updateOptions({
32
- agent: options.agent,
33
- logger,
34
- showThinking: options.showThinking ?? true,
35
- autoCancelPendingToolCalls: options.autoCancelPendingToolCalls,
36
- ...options.onError && { onError: options.onError },
37
- ...options.onCancel && { onCancel: options.onCancel },
38
- ...historyAdapter && { history: historyAdapter }
31
+ useEffect(() => {
32
+ core.updateOptions({
33
+ agent: options.agent,
34
+ logger,
35
+ showThinking: options.showThinking ?? true,
36
+ autoCancelPendingToolCalls: options.autoCancelPendingToolCalls,
37
+ ...options.onError && { onError: options.onError },
38
+ ...options.onCancel && { onCancel: options.onCancel },
39
+ ...historyAdapter && { history: historyAdapter }
40
+ });
39
41
  });
40
42
  const [toolStatuses, setToolStatuses] = useState({});
41
43
  const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
@@ -108,7 +110,7 @@ function useAgUiRuntime(options) {
108
110
  isLoading: core.isLoading,
109
111
  messageRepository: core.getMessageRepository(),
110
112
  state: core.getState(),
111
- isRunning,
113
+ isRunning: core.isRunning(),
112
114
  extras: agUiExtras.provide({
113
115
  interrupts: core.getPendingInterrupts()?.interrupts ?? EMPTY_INTERRUPTS,
114
116
  sendA2uiAction: (action) => core.sendA2uiAction(action),
@@ -135,6 +137,7 @@ function useAgUiRuntime(options) {
135
137
  onAddToolResult: (options) => core.addToolResult(options),
136
138
  onRespondToToolApproval: (options) => core.respondToToolApproval(options).catch((error) => {
137
139
  core.reportError(error);
140
+ throw error;
138
141
  }),
139
142
  onResume: (config) => core.resume(config),
140
143
  setMessages: (messages) => core.applyExternalMessages(messages),