@assistant-ui/react-ag-ui 0.0.57 → 0.0.59
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/index.d.ts +2 -2
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts +19 -8
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +1 -1
- package/dist/runtime/AgUiThreadRuntimeCore.js +118 -86
- 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 +385 -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 +67 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/useAgUiRuntime.d.ts.map +1 -1
- package/dist/useAgUiRuntime.js +15 -5
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +9 -9
- package/src/index.ts +1 -0
- package/src/runtime/AgUiThreadRuntimeCore.test.ts +18 -0
- package/src/runtime/AgUiThreadRuntimeCore.ts +204 -120
- 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 +595 -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 +96 -12
- package/src/useAgUiRuntime.approval.test.tsx +34 -24
- package/src/useAgUiRuntime.queue.test.tsx +54 -0
- package/src/useAgUiRuntime.thread-switch.test.tsx +199 -0
- package/src/useAgUiRuntime.toolDeferral.test.tsx +186 -0
- package/src/useAgUiRuntime.ts +15 -3
|
@@ -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
|
@@ -35,10 +35,35 @@ type UseAgUiRuntimeAdapters = {
|
|
|
35
35
|
*/
|
|
36
36
|
threadList?: UseAgUiThreadListAdapter;
|
|
37
37
|
};
|
|
38
|
+
type AgUiResumeTranscript = "full" | "appended";
|
|
38
39
|
type UseAgUiRuntimeOptions = ExternalStoreSharedOptions & {
|
|
39
40
|
agent: AbstractAgent;
|
|
40
41
|
logger?: Partial<Logger>;
|
|
41
42
|
showThinking?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* What `messages` carries on a resume run, meaning a `RunAgentInput` that
|
|
45
|
+
* also carries `resume`. The AG-UI interrupt spec leaves this undefined: its
|
|
46
|
+
* contract rules constrain the thread id, interrupt coverage, idempotency,
|
|
47
|
+
* and expiry, and none of them mentions `messages`. Hosts therefore disagree,
|
|
48
|
+
* and both readings are conformant.
|
|
49
|
+
*
|
|
50
|
+
* `"full"` sends the whole thread, which is what `@ag-ui/client` itself does.
|
|
51
|
+
* Hosts that resume from a checkpoint ignore the transcript, and hosts that
|
|
52
|
+
* rebuild the interrupted run from it need it.
|
|
53
|
+
*
|
|
54
|
+
* `"appended"` sends only what was appended locally after the interrupted
|
|
55
|
+
* assistant message, which is nothing for an approval or a denial and the new
|
|
56
|
+
* user turn for `steerAway`. Choose it for a host that owns the thread and
|
|
57
|
+
* seeds a resume request from its own stored snapshot, because such a host
|
|
58
|
+
* appends the request body to that snapshot and a re-sent transcript
|
|
59
|
+
* duplicates the interrupted turn in its stored history. A host that rebuilds
|
|
60
|
+
* the run from `messages` has nothing to resume from under `"appended"`, and
|
|
61
|
+
* a host that derives its outgoing `MESSAGES_SNAPSHOT` from the request body
|
|
62
|
+
* emits a truncated one.
|
|
63
|
+
*
|
|
64
|
+
* Defaults to `"full"`.
|
|
65
|
+
*/
|
|
66
|
+
resumeTranscript?: AgUiResumeTranscript | undefined;
|
|
42
67
|
/**
|
|
43
68
|
* When the user sends, edits, or reloads a message while client-side tool
|
|
44
69
|
* calls are still pending, automatically cancel the unresolved tool calls
|
|
@@ -90,6 +115,12 @@ type AgUiRunFinishedOutcome = {
|
|
|
90
115
|
type: "interrupt";
|
|
91
116
|
interrupts: AgUiInterrupt[];
|
|
92
117
|
};
|
|
118
|
+
type AgUiSubagentFinishedOutcome = {
|
|
119
|
+
type: "success";
|
|
120
|
+
} | {
|
|
121
|
+
type: "suspended";
|
|
122
|
+
interruptIds?: string[];
|
|
123
|
+
};
|
|
93
124
|
type AgUiEvent = {
|
|
94
125
|
type: "RUN_STARTED";
|
|
95
126
|
runId: string;
|
|
@@ -107,16 +138,21 @@ type AgUiEvent = {
|
|
|
107
138
|
} | {
|
|
108
139
|
type: "TEXT_MESSAGE_START";
|
|
109
140
|
messageId?: string;
|
|
141
|
+
subagentRunId?: string;
|
|
110
142
|
} | {
|
|
111
143
|
type: "TEXT_MESSAGE_CONTENT";
|
|
112
144
|
messageId?: string;
|
|
113
145
|
delta: string;
|
|
146
|
+
subagentRunId?: string;
|
|
114
147
|
} | {
|
|
115
148
|
type: "TEXT_MESSAGE_END";
|
|
116
149
|
messageId?: string;
|
|
150
|
+
subagentRunId?: string;
|
|
117
151
|
} | {
|
|
118
152
|
type: "TEXT_MESSAGE_CHUNK";
|
|
153
|
+
messageId?: string;
|
|
119
154
|
delta: string;
|
|
155
|
+
subagentRunId?: string;
|
|
120
156
|
} | {
|
|
121
157
|
type: "THINKING_START";
|
|
122
158
|
title?: string;
|
|
@@ -132,42 +168,52 @@ type AgUiEvent = {
|
|
|
132
168
|
} | {
|
|
133
169
|
type: "REASONING_START";
|
|
134
170
|
messageId?: string;
|
|
171
|
+
subagentRunId?: string;
|
|
135
172
|
} | {
|
|
136
173
|
type: "REASONING_MESSAGE_START";
|
|
137
174
|
messageId?: string;
|
|
175
|
+
subagentRunId?: string;
|
|
138
176
|
} | {
|
|
139
177
|
type: "REASONING_MESSAGE_CONTENT";
|
|
140
178
|
messageId?: string;
|
|
141
179
|
delta: string;
|
|
180
|
+
subagentRunId?: string;
|
|
142
181
|
} | {
|
|
143
182
|
type: "REASONING_MESSAGE_END";
|
|
144
183
|
messageId?: string;
|
|
184
|
+
subagentRunId?: string;
|
|
145
185
|
} | {
|
|
146
186
|
type: "REASONING_ENCRYPTED_VALUE";
|
|
147
187
|
subtype: "message" | "tool-call";
|
|
148
188
|
entityId: string;
|
|
149
189
|
encryptedValue: string;
|
|
190
|
+
subagentRunId?: string;
|
|
150
191
|
} | {
|
|
151
192
|
type: "REASONING_END";
|
|
152
193
|
messageId?: string;
|
|
194
|
+
subagentRunId?: string;
|
|
153
195
|
} | {
|
|
154
196
|
type: "TOOL_CALL_START";
|
|
155
197
|
toolCallId: string;
|
|
156
198
|
toolCallName?: string;
|
|
157
199
|
parentMessageId?: string;
|
|
200
|
+
subagentRunId?: string;
|
|
158
201
|
} | {
|
|
159
202
|
type: "TOOL_CALL_ARGS";
|
|
160
203
|
toolCallId: string;
|
|
161
204
|
delta: string;
|
|
205
|
+
subagentRunId?: string;
|
|
162
206
|
} | {
|
|
163
207
|
type: "TOOL_CALL_END";
|
|
164
208
|
toolCallId: string;
|
|
209
|
+
subagentRunId?: string;
|
|
165
210
|
} | {
|
|
166
211
|
type: "TOOL_CALL_CHUNK";
|
|
167
212
|
toolCallId?: string;
|
|
168
213
|
toolCallName?: string;
|
|
169
214
|
parentMessageId?: string;
|
|
170
215
|
delta?: string;
|
|
216
|
+
subagentRunId?: string;
|
|
171
217
|
} | {
|
|
172
218
|
type: "TOOL_CALL_RESULT";
|
|
173
219
|
messageId?: string;
|
|
@@ -175,12 +221,14 @@ type AgUiEvent = {
|
|
|
175
221
|
content: string;
|
|
176
222
|
role?: "tool";
|
|
177
223
|
mcpResult?: McpToolCallResult;
|
|
224
|
+
subagentRunId?: string;
|
|
178
225
|
} | {
|
|
179
226
|
type: "ACTIVITY_SNAPSHOT";
|
|
180
227
|
activityType: string;
|
|
181
228
|
content: Record<string, unknown>;
|
|
182
229
|
messageId?: string;
|
|
183
230
|
replace?: boolean;
|
|
231
|
+
subagentRunId?: string;
|
|
184
232
|
} | {
|
|
185
233
|
type: "RAW";
|
|
186
234
|
event: any;
|
|
@@ -198,7 +246,25 @@ type AgUiEvent = {
|
|
|
198
246
|
} | {
|
|
199
247
|
type: "MESSAGES_SNAPSHOT";
|
|
200
248
|
messages: any[];
|
|
249
|
+
} | {
|
|
250
|
+
type: "SUBAGENT_STARTED";
|
|
251
|
+
subagentRunId: string;
|
|
252
|
+
name: string;
|
|
253
|
+
description?: string;
|
|
254
|
+
parentSubagentRunId?: string;
|
|
255
|
+
parentToolCallId?: string;
|
|
256
|
+
parentMessageId?: string;
|
|
257
|
+
} | {
|
|
258
|
+
type: "SUBAGENT_FINISHED";
|
|
259
|
+
subagentRunId: string;
|
|
260
|
+
result?: unknown;
|
|
261
|
+
outcome?: AgUiSubagentFinishedOutcome;
|
|
262
|
+
} | {
|
|
263
|
+
type: "SUBAGENT_ERROR";
|
|
264
|
+
subagentRunId: string;
|
|
265
|
+
message: string;
|
|
266
|
+
code?: string;
|
|
201
267
|
};
|
|
202
268
|
//#endregion
|
|
203
|
-
export { AgUiEvent, AgUiInterrupt, AgUiInterruptReason, AgUiResumeEntry, AgUiRunFinishedOutcome, AgUiRuntimeExtras, UseAgUiRuntimeAdapters, UseAgUiRuntimeOptions, UseAgUiThreadListAdapter };
|
|
269
|
+
export { AgUiEvent, AgUiInterrupt, AgUiInterruptReason, AgUiResumeEntry, AgUiResumeTranscript, AgUiRunFinishedOutcome, AgUiRuntimeExtras, AgUiSubagentFinishedOutcome, UseAgUiRuntimeAdapters, UseAgUiRuntimeOptions, UseAgUiThreadListAdapter };
|
|
204
270
|
//# 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;;;;;;;;;;;
|
|
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;KAEA,wBAAwB;EAClC,OAAO;EACP,SAAS,QAAQ;EACjB;;;;;;;;;;;;;;;;;;;;;;;;EAwBA,mBAAmB;;;;;;;;;;;EAWnB;;;;;;;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAgUiRuntime.d.ts","names":[],"sources":["../src/useAgUiRuntime.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useAgUiRuntime.d.ts","names":[],"sources":["../src/useAgUiRuntime.ts"],"mappings":";;;KA0CY,uBAAuB;;;;;EAKjC,8CAA8C;;;;;;EAM9C,oCACE,oBAAoB,sBACjB;;iBAGS,eACd,SAAS,wBACR"}
|