@assistant-ui/react-ag-ui 0.0.57 → 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.
- package/README.md +16 -0
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts +3 -4
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadRuntimeCore.js +29 -43
- package/dist/runtime/AgUiThreadRuntimeCore.js.map +1 -1
- package/dist/runtime/adapter/conversions.d.ts.map +1 -1
- package/dist/runtime/adapter/conversions.js +34 -11
- package/dist/runtime/adapter/conversions.js.map +1 -1
- package/dist/runtime/adapter/run-aggregator.d.ts +13 -3
- package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
- package/dist/runtime/adapter/run-aggregator.js +326 -119
- package/dist/runtime/adapter/run-aggregator.js.map +1 -1
- package/dist/runtime/adapter/subscriber.d.ts +9 -0
- package/dist/runtime/adapter/subscriber.d.ts.map +1 -1
- package/dist/runtime/adapter/subscriber.js +4 -1
- package/dist/runtime/adapter/subscriber.js.map +1 -1
- package/dist/runtime/adapter/tool-approval.d.ts +3 -1
- package/dist/runtime/adapter/tool-approval.d.ts.map +1 -1
- package/dist/runtime/adapter/tool-approval.js +11 -12
- package/dist/runtime/adapter/tool-approval.js.map +1 -1
- package/dist/runtime/event-parser.d.ts.map +1 -1
- package/dist/runtime/event-parser.js +176 -45
- package/dist/runtime/event-parser.js.map +1 -1
- package/dist/runtime/types.d.ts +42 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/useAgUiRuntime.js +1 -0
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +9 -9
- package/src/runtime/AgUiThreadRuntimeCore.ts +40 -60
- package/src/runtime/adapter/conversions.ts +87 -17
- package/src/runtime/adapter/run-aggregator.approval.test.ts +128 -0
- package/src/runtime/adapter/run-aggregator.ts +510 -139
- package/src/runtime/adapter/subscriber.ts +10 -1
- package/src/runtime/adapter/tool-approval.test.ts +75 -0
- package/src/runtime/adapter/tool-approval.ts +17 -12
- package/src/runtime/event-parser.ts +216 -36
- package/src/runtime/types.ts +70 -12
- package/src/useAgUiRuntime.approval.test.tsx +34 -24
- package/src/useAgUiRuntime.toolDeferral.test.tsx +186 -0
- package/src/useAgUiRuntime.ts +1 -0
|
@@ -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 (
|
|
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
|
|
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) =>
|
|
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
|
|
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")
|
|
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))
|
|
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
|
-
} :
|
|
99
|
+
} : reject("missing runId");
|
|
62
100
|
}
|
|
63
101
|
case "RUN_FINISHED": {
|
|
64
102
|
const runId = getString("runId");
|
|
65
|
-
if (!runId) return
|
|
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" }, {
|
|
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
|
|
123
|
+
if (!isNonEmptyString(delta)) return reject("missing non-empty delta");
|
|
83
124
|
return withOptional({
|
|
84
125
|
type: "TEXT_MESSAGE_CONTENT",
|
|
85
126
|
delta
|
|
86
|
-
}, {
|
|
127
|
+
}, {
|
|
128
|
+
messageId: getString("messageId"),
|
|
129
|
+
subagentRunId: getString("subagentRunId")
|
|
130
|
+
});
|
|
87
131
|
}
|
|
88
|
-
case "TEXT_MESSAGE_END": return withOptional({ type: "TEXT_MESSAGE_END" }, {
|
|
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
|
-
}, {
|
|
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" }, {
|
|
105
|
-
|
|
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
|
-
}, {
|
|
167
|
+
}, {
|
|
168
|
+
messageId: getString("messageId"),
|
|
169
|
+
subagentRunId: getString("subagentRunId")
|
|
170
|
+
});
|
|
112
171
|
}
|
|
113
|
-
case "REASONING_MESSAGE_END": return withOptional({ type: "REASONING_MESSAGE_END" }, {
|
|
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
|
|
119
|
-
if (subtype !== "message" && subtype !== "tool-call") return
|
|
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" }, {
|
|
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
|
|
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
|
|
142
|
-
|
|
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
|
|
146
|
-
};
|
|
214
|
+
delta
|
|
215
|
+
}, { subagentRunId: getString("subagentRunId") });
|
|
147
216
|
}
|
|
148
217
|
case "TOOL_CALL_END": {
|
|
149
218
|
const toolCallId = getString("toolCallId");
|
|
150
|
-
|
|
219
|
+
if (!toolCallId) return reject("missing toolCallId");
|
|
220
|
+
return withOptional({
|
|
151
221
|
type: "TOOL_CALL_END",
|
|
152
222
|
toolCallId
|
|
153
|
-
} :
|
|
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
|
|
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":
|
|
176
|
-
|
|
177
|
-
|
|
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":
|
|
184
|
-
|
|
185
|
-
|
|
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
|
|
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
|
|
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":"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"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -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;;
|
|
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"}
|
package/dist/useAgUiRuntime.js
CHANGED
|
@@ -137,6 +137,7 @@ function useAgUiRuntime(options) {
|
|
|
137
137
|
onAddToolResult: (options) => core.addToolResult(options),
|
|
138
138
|
onRespondToToolApproval: (options) => core.respondToToolApproval(options).catch((error) => {
|
|
139
139
|
core.reportError(error);
|
|
140
|
+
throw error;
|
|
140
141
|
}),
|
|
141
142
|
onResume: (config) => core.resume(config),
|
|
142
143
|
setMessages: (messages) => core.applyExternalMessages(messages),
|