@assistant-ui/react-ag-ui 0.0.70 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +1 -1
  2. package/dist/runtime/{AgUiThreadRuntimeCore.d.ts → AgUiThreadController.d.ts} +8 -12
  3. package/dist/runtime/AgUiThreadController.d.ts.map +1 -0
  4. package/dist/runtime/{AgUiThreadRuntimeCore.js → AgUiThreadController.js} +302 -162
  5. package/dist/runtime/AgUiThreadController.js.map +1 -0
  6. package/dist/runtime/adapter/conversions.d.ts +4 -4
  7. package/dist/runtime/adapter/conversions.d.ts.map +1 -1
  8. package/dist/runtime/adapter/conversions.js +111 -33
  9. package/dist/runtime/adapter/conversions.js.map +1 -1
  10. package/dist/runtime/adapter/run-aggregator.d.ts +6 -5
  11. package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
  12. package/dist/runtime/adapter/run-aggregator.js +50 -62
  13. package/dist/runtime/adapter/run-aggregator.js.map +1 -1
  14. package/dist/runtime/adapter/subscriber.d.ts +0 -24
  15. package/dist/runtime/adapter/subscriber.d.ts.map +1 -1
  16. package/dist/runtime/adapter/subscriber.js +1 -22
  17. package/dist/runtime/adapter/subscriber.js.map +1 -1
  18. package/dist/runtime/agUiThreadState.d.ts +60 -0
  19. package/dist/runtime/agUiThreadState.d.ts.map +1 -0
  20. package/dist/runtime/agUiThreadState.js +95 -0
  21. package/dist/runtime/agUiThreadState.js.map +1 -0
  22. package/dist/runtime/event-parser.d.ts.map +1 -1
  23. package/dist/runtime/event-parser.js +45 -48
  24. package/dist/runtime/event-parser.js.map +1 -1
  25. package/dist/runtime/mcp-tool-result.d.ts +3 -1
  26. package/dist/runtime/mcp-tool-result.d.ts.map +1 -1
  27. package/dist/runtime/mcp-tool-result.js +6 -3
  28. package/dist/runtime/mcp-tool-result.js.map +1 -1
  29. package/dist/runtime/types.d.ts +13 -35
  30. package/dist/runtime/types.d.ts.map +1 -1
  31. package/dist/runtime/types.js.map +1 -1
  32. package/dist/useAgUiRuntime.d.ts.map +1 -1
  33. package/dist/useAgUiRuntime.js +4 -2
  34. package/dist/useAgUiRuntime.js.map +1 -1
  35. package/package.json +13 -12
  36. package/src/runtime/{AgUiThreadRuntimeCore.interrupt-cancel.test.ts → AgUiThreadController.interrupt-cancel.test.ts} +4 -4
  37. package/src/runtime/{AgUiThreadRuntimeCore.test.ts → AgUiThreadController.test.ts} +35 -6
  38. package/src/runtime/{AgUiThreadRuntimeCore.ts → AgUiThreadController.ts} +471 -169
  39. package/src/runtime/adapter/conversions.content.test.ts +37 -5
  40. package/src/runtime/adapter/conversions.tools.test.ts +2 -1
  41. package/src/runtime/adapter/conversions.ts +235 -58
  42. package/src/runtime/adapter/run-aggregator.ts +84 -114
  43. package/src/runtime/adapter/subscriber.ts +1 -44
  44. package/src/runtime/agUiThreadState.test.ts +205 -0
  45. package/src/runtime/agUiThreadState.ts +130 -0
  46. package/src/runtime/event-parser.ts +40 -58
  47. package/src/runtime/mcp-tool-result.ts +16 -2
  48. package/src/runtime/types.ts +18 -28
  49. package/src/useAgUiRuntime.external-store.test.tsx +39 -0
  50. package/src/useAgUiRuntime.fast-refresh.test.tsx +3 -3
  51. package/src/useAgUiRuntime.thread-switch.test.tsx +4 -4
  52. package/src/useAgUiRuntime.ts +5 -3
  53. package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +0 -1
  54. package/dist/runtime/AgUiThreadRuntimeCore.js.map +0 -1
@@ -0,0 +1,60 @@
1
+ import type { RunConfig } from "@assistant-ui/core";
2
+ import type { ReadonlyJSONValue } from "assistant-stream/utils";
3
+ export type AgUiThreadState = {
4
+ isRunning: boolean;
5
+ isLoading: boolean;
6
+ loadRequested: boolean;
7
+ historyMutationGeneration: number;
8
+ stateSnapshot: ReadonlyJSONValue | undefined;
9
+ lastRunConfig: RunConfig | undefined;
10
+ pendingResume: {
11
+ owner: AbortController;
12
+ messageId: string;
13
+ } | null;
14
+ pendingA2uiResumeOwner: AbortController | null;
15
+ pendingA2uiAction: Record<string, unknown> | undefined;
16
+ };
17
+ export type AgUiThreadAction = {
18
+ type: "runStarted";
19
+ } | {
20
+ type: "runFinished";
21
+ } | {
22
+ type: "loadRequested";
23
+ } | {
24
+ type: "loadStarted";
25
+ } | {
26
+ type: "loadFinished";
27
+ } | {
28
+ type: "historyMutationAdvanced";
29
+ } | {
30
+ type: "stateSnapshot";
31
+ snapshot: ReadonlyJSONValue;
32
+ } | {
33
+ type: "resetState";
34
+ } | {
35
+ type: "runConfigRecorded";
36
+ runConfig: RunConfig;
37
+ } | {
38
+ type: "resumeDeferred";
39
+ owner: AbortController;
40
+ messageId: string;
41
+ } | {
42
+ type: "resumeCleared";
43
+ } | {
44
+ type: "a2uiResumeDeferred";
45
+ owner: AbortController;
46
+ } | {
47
+ type: "a2uiResumeCleared";
48
+ } | {
49
+ type: "a2uiActionDeferred";
50
+ action: Record<string, unknown>;
51
+ } | {
52
+ type: "a2uiActionCleared";
53
+ } | {
54
+ type: "a2uiContinuationsCleared";
55
+ } | {
56
+ type: "resetThread";
57
+ };
58
+ export declare const createAgUiThreadState: () => AgUiThreadState;
59
+ export declare const reduceAgUiThreadState: (state: AgUiThreadState, action: AgUiThreadAction) => AgUiThreadState;
60
+ //# sourceMappingURL=agUiThreadState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agUiThreadState.d.ts","sourceRoot":"","sources":["../../src/runtime/agUiThreadState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,yBAAyB,EAAE,MAAM,CAAC;IAClC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpE,sBAAsB,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,yBAAyB,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,0BAA0B,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5B,eAAO,MAAM,qBAAqB,QAAO,eAUvC,CAAC;AAEH,eAAO,MAAM,qBAAqB,GAChC,OAAO,eAAe,EACtB,QAAQ,gBAAgB,KACvB,eAgFF,CAAC"}
@@ -0,0 +1,95 @@
1
+ //#region src/runtime/agUiThreadState.ts
2
+ const createAgUiThreadState = () => ({
3
+ isRunning: false,
4
+ isLoading: false,
5
+ loadRequested: false,
6
+ historyMutationGeneration: 0,
7
+ stateSnapshot: void 0,
8
+ lastRunConfig: void 0,
9
+ pendingResume: null,
10
+ pendingA2uiResumeOwner: null,
11
+ pendingA2uiAction: void 0
12
+ });
13
+ const reduceAgUiThreadState = (state, action) => {
14
+ switch (action.type) {
15
+ case "runStarted": return state.isRunning ? state : {
16
+ ...state,
17
+ isRunning: true
18
+ };
19
+ case "runFinished": return !state.isRunning ? state : {
20
+ ...state,
21
+ isRunning: false
22
+ };
23
+ case "loadRequested": return state.loadRequested ? state : {
24
+ ...state,
25
+ loadRequested: true
26
+ };
27
+ case "loadStarted": return state.isLoading ? state : {
28
+ ...state,
29
+ isLoading: true
30
+ };
31
+ case "loadFinished": return !state.isLoading ? state : {
32
+ ...state,
33
+ isLoading: false
34
+ };
35
+ case "historyMutationAdvanced": return {
36
+ ...state,
37
+ historyMutationGeneration: state.historyMutationGeneration + 1
38
+ };
39
+ case "stateSnapshot": return state.stateSnapshot === action.snapshot ? state : {
40
+ ...state,
41
+ stateSnapshot: action.snapshot
42
+ };
43
+ case "resetState": return state.stateSnapshot === void 0 ? state : {
44
+ ...state,
45
+ stateSnapshot: void 0
46
+ };
47
+ case "runConfigRecorded": return state.lastRunConfig === action.runConfig ? state : {
48
+ ...state,
49
+ lastRunConfig: action.runConfig
50
+ };
51
+ case "resumeDeferred": return state.pendingResume?.owner === action.owner && state.pendingResume.messageId === action.messageId ? state : {
52
+ ...state,
53
+ pendingResume: {
54
+ owner: action.owner,
55
+ messageId: action.messageId
56
+ }
57
+ };
58
+ case "resumeCleared": return state.pendingResume === null ? state : {
59
+ ...state,
60
+ pendingResume: null
61
+ };
62
+ case "a2uiResumeDeferred": return state.pendingA2uiResumeOwner === action.owner ? state : {
63
+ ...state,
64
+ pendingA2uiResumeOwner: action.owner
65
+ };
66
+ case "a2uiResumeCleared": return state.pendingA2uiResumeOwner === null ? state : {
67
+ ...state,
68
+ pendingA2uiResumeOwner: null
69
+ };
70
+ case "a2uiActionDeferred": return state.pendingA2uiAction === action.action ? state : {
71
+ ...state,
72
+ pendingA2uiAction: action.action
73
+ };
74
+ case "a2uiActionCleared": return state.pendingA2uiAction === void 0 ? state : {
75
+ ...state,
76
+ pendingA2uiAction: void 0
77
+ };
78
+ case "a2uiContinuationsCleared": return state.pendingA2uiResumeOwner === null && state.pendingA2uiAction === void 0 ? state : {
79
+ ...state,
80
+ pendingA2uiResumeOwner: null,
81
+ pendingA2uiAction: void 0
82
+ };
83
+ case "resetThread": return state.stateSnapshot === void 0 && state.pendingResume === null && state.pendingA2uiResumeOwner === null && state.pendingA2uiAction === void 0 ? state : {
84
+ ...state,
85
+ stateSnapshot: void 0,
86
+ pendingResume: null,
87
+ pendingA2uiResumeOwner: null,
88
+ pendingA2uiAction: void 0
89
+ };
90
+ }
91
+ };
92
+ //#endregion
93
+ export { createAgUiThreadState, reduceAgUiThreadState };
94
+
95
+ //# sourceMappingURL=agUiThreadState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agUiThreadState.js","names":[],"sources":["../../src/runtime/agUiThreadState.ts"],"sourcesContent":["import type { RunConfig } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONValue } from \"assistant-stream/utils\";\n\nexport type AgUiThreadState = {\n isRunning: boolean;\n isLoading: boolean;\n loadRequested: boolean;\n historyMutationGeneration: number;\n stateSnapshot: ReadonlyJSONValue | undefined;\n lastRunConfig: RunConfig | undefined;\n pendingResume: { owner: AbortController; messageId: string } | null;\n pendingA2uiResumeOwner: AbortController | null;\n pendingA2uiAction: Record<string, unknown> | undefined;\n};\n\nexport type AgUiThreadAction =\n | { type: \"runStarted\" }\n | { type: \"runFinished\" }\n | { type: \"loadRequested\" }\n | { type: \"loadStarted\" }\n | { type: \"loadFinished\" }\n | { type: \"historyMutationAdvanced\" }\n | { type: \"stateSnapshot\"; snapshot: ReadonlyJSONValue }\n | { type: \"resetState\" }\n | { type: \"runConfigRecorded\"; runConfig: RunConfig }\n | { type: \"resumeDeferred\"; owner: AbortController; messageId: string }\n | { type: \"resumeCleared\" }\n | { type: \"a2uiResumeDeferred\"; owner: AbortController }\n | { type: \"a2uiResumeCleared\" }\n | { type: \"a2uiActionDeferred\"; action: Record<string, unknown> }\n | { type: \"a2uiActionCleared\" }\n | { type: \"a2uiContinuationsCleared\" }\n | { type: \"resetThread\" };\n\nexport const createAgUiThreadState = (): AgUiThreadState => ({\n isRunning: false,\n isLoading: false,\n loadRequested: false,\n historyMutationGeneration: 0,\n stateSnapshot: undefined,\n lastRunConfig: undefined,\n pendingResume: null,\n pendingA2uiResumeOwner: null,\n pendingA2uiAction: undefined,\n});\n\nexport const reduceAgUiThreadState = (\n state: AgUiThreadState,\n action: AgUiThreadAction,\n): AgUiThreadState => {\n switch (action.type) {\n case \"runStarted\":\n return state.isRunning ? state : { ...state, isRunning: true };\n case \"runFinished\":\n return !state.isRunning ? state : { ...state, isRunning: false };\n case \"loadRequested\":\n return state.loadRequested ? state : { ...state, loadRequested: true };\n case \"loadStarted\":\n return state.isLoading ? state : { ...state, isLoading: true };\n case \"loadFinished\":\n return !state.isLoading ? state : { ...state, isLoading: false };\n case \"historyMutationAdvanced\":\n return {\n ...state,\n historyMutationGeneration: state.historyMutationGeneration + 1,\n };\n case \"stateSnapshot\":\n return state.stateSnapshot === action.snapshot\n ? state\n : { ...state, stateSnapshot: action.snapshot };\n case \"resetState\":\n return state.stateSnapshot === undefined\n ? state\n : { ...state, stateSnapshot: undefined };\n case \"runConfigRecorded\":\n return state.lastRunConfig === action.runConfig\n ? state\n : { ...state, lastRunConfig: action.runConfig };\n case \"resumeDeferred\":\n return state.pendingResume?.owner === action.owner &&\n state.pendingResume.messageId === action.messageId\n ? state\n : {\n ...state,\n pendingResume: { owner: action.owner, messageId: action.messageId },\n };\n case \"resumeCleared\":\n return state.pendingResume === null\n ? state\n : { ...state, pendingResume: null };\n case \"a2uiResumeDeferred\":\n return state.pendingA2uiResumeOwner === action.owner\n ? state\n : { ...state, pendingA2uiResumeOwner: action.owner };\n case \"a2uiResumeCleared\":\n return state.pendingA2uiResumeOwner === null\n ? state\n : { ...state, pendingA2uiResumeOwner: null };\n case \"a2uiActionDeferred\":\n return state.pendingA2uiAction === action.action\n ? state\n : { ...state, pendingA2uiAction: action.action };\n case \"a2uiActionCleared\":\n return state.pendingA2uiAction === undefined\n ? state\n : { ...state, pendingA2uiAction: undefined };\n case \"a2uiContinuationsCleared\":\n return state.pendingA2uiResumeOwner === null &&\n state.pendingA2uiAction === undefined\n ? state\n : {\n ...state,\n pendingA2uiResumeOwner: null,\n pendingA2uiAction: undefined,\n };\n case \"resetThread\":\n return state.stateSnapshot === undefined &&\n state.pendingResume === null &&\n state.pendingA2uiResumeOwner === null &&\n state.pendingA2uiAction === undefined\n ? state\n : {\n ...state,\n stateSnapshot: undefined,\n pendingResume: null,\n pendingA2uiResumeOwner: null,\n pendingA2uiAction: undefined,\n };\n }\n};\n"],"mappings":";AAkCA,MAAa,+BAAgD;CAC3D,WAAW;CACX,WAAW;CACX,eAAe;CACf,2BAA2B;CAC3B,eAAe,KAAA;CACf,eAAe,KAAA;CACf,eAAe;CACf,wBAAwB;CACxB,mBAAmB,KAAA;AACrB;AAEA,MAAa,yBACX,OACA,WACoB;CACpB,QAAQ,OAAO,MAAf;EACE,KAAK,cACH,OAAO,MAAM,YAAY,QAAQ;GAAE,GAAG;GAAO,WAAW;EAAK;EAC/D,KAAK,eACH,OAAO,CAAC,MAAM,YAAY,QAAQ;GAAE,GAAG;GAAO,WAAW;EAAM;EACjE,KAAK,iBACH,OAAO,MAAM,gBAAgB,QAAQ;GAAE,GAAG;GAAO,eAAe;EAAK;EACvE,KAAK,eACH,OAAO,MAAM,YAAY,QAAQ;GAAE,GAAG;GAAO,WAAW;EAAK;EAC/D,KAAK,gBACH,OAAO,CAAC,MAAM,YAAY,QAAQ;GAAE,GAAG;GAAO,WAAW;EAAM;EACjE,KAAK,2BACH,OAAO;GACL,GAAG;GACH,2BAA2B,MAAM,4BAA4B;EAC/D;EACF,KAAK,iBACH,OAAO,MAAM,kBAAkB,OAAO,WAClC,QACA;GAAE,GAAG;GAAO,eAAe,OAAO;EAAS;EACjD,KAAK,cACH,OAAO,MAAM,kBAAkB,KAAA,IAC3B,QACA;GAAE,GAAG;GAAO,eAAe,KAAA;EAAU;EAC3C,KAAK,qBACH,OAAO,MAAM,kBAAkB,OAAO,YAClC,QACA;GAAE,GAAG;GAAO,eAAe,OAAO;EAAU;EAClD,KAAK,kBACH,OAAO,MAAM,eAAe,UAAU,OAAO,SAC3C,MAAM,cAAc,cAAc,OAAO,YACvC,QACA;GACE,GAAG;GACH,eAAe;IAAE,OAAO,OAAO;IAAO,WAAW,OAAO;GAAU;EACpE;EACN,KAAK,iBACH,OAAO,MAAM,kBAAkB,OAC3B,QACA;GAAE,GAAG;GAAO,eAAe;EAAK;EACtC,KAAK,sBACH,OAAO,MAAM,2BAA2B,OAAO,QAC3C,QACA;GAAE,GAAG;GAAO,wBAAwB,OAAO;EAAM;EACvD,KAAK,qBACH,OAAO,MAAM,2BAA2B,OACpC,QACA;GAAE,GAAG;GAAO,wBAAwB;EAAK;EAC/C,KAAK,sBACH,OAAO,MAAM,sBAAsB,OAAO,SACtC,QACA;GAAE,GAAG;GAAO,mBAAmB,OAAO;EAAO;EACnD,KAAK,qBACH,OAAO,MAAM,sBAAsB,KAAA,IAC/B,QACA;GAAE,GAAG;GAAO,mBAAmB,KAAA;EAAU;EAC/C,KAAK,4BACH,OAAO,MAAM,2BAA2B,QACtC,MAAM,sBAAsB,KAAA,IAC1B,QACA;GACE,GAAG;GACH,wBAAwB;GACxB,mBAAmB,KAAA;EACrB;EACN,KAAK,eACH,OAAO,MAAM,kBAAkB,KAAA,KAC7B,MAAM,kBAAkB,QACxB,MAAM,2BAA2B,QACjC,MAAM,sBAAsB,KAAA,IAC1B,QACA;GACE,GAAG;GACH,eAAe,KAAA;GACf,eAAe;GACf,wBAAwB;GACxB,mBAAmB,KAAA;EACrB;CACR;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"event-parser.d.ts","sourceRoot":"","sources":["../../src/runtime/event-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAIV,mBAAgB;AACjB,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAiB;AAIvC,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAkHF,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,EACd,UAAU,qBAAqB,KAC9B,SAAS,GAAG,IAyXd,CAAC"}
1
+ {"version":3,"file":"event-parser.d.ts","sourceRoot":"","sources":["../../src/runtime/event-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAIV,mBAAgB;AACjB,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAiB;AAKvC,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA8HF,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,EACd,UAAU,qBAAqB,KAC9B,SAAS,GAAG,IA0Vd,CAAC"}
@@ -40,7 +40,8 @@ const parseRunFinishedOutcome = (raw, runId, logger) => {
40
40
  }, "has invalid outcome");
41
41
  return;
42
42
  }
43
- if (raw.type === "success") return { type: "success" };
43
+ if (raw.type === "success") return withOptional({ type: "success" }, { pendingToolCallIds: Array.isArray(raw.pendingToolCallIds) && raw.pendingToolCallIds.every(isString) ? raw.pendingToolCallIds : void 0 });
44
+ if (raw.type === "cancelled") return { type: "cancelled" };
44
45
  if (raw.type === "interrupt") {
45
46
  if (!Array.isArray(raw.interrupts)) {
46
47
  logRejectedEvent(logger, "RUN_FINISHED", {
@@ -134,52 +135,49 @@ const parseAgUiEvent = (event, options) => {
134
135
  messageId: getString("messageId"),
135
136
  subagentRunId: getString("subagentRunId")
136
137
  });
137
- case "TEXT_MESSAGE_CHUNK": {
138
- const delta = getString("delta") ?? "";
138
+ case "REASONING_START": {
139
+ const messageId = getString("messageId");
140
+ if (!messageId) return reject("missing messageId");
139
141
  return withOptional({
140
- type: "TEXT_MESSAGE_CHUNK",
141
- delta
142
+ type: "REASONING_START",
143
+ messageId
142
144
  }, {
143
- messageId: getString("messageId"),
144
- subagentRunId: getString("subagentRunId")
145
+ subagentRunId: getString("subagentRunId"),
146
+ timestamp
147
+ });
148
+ }
149
+ case "REASONING_MESSAGE_START": {
150
+ const messageId = getString("messageId");
151
+ if (!messageId) return reject("missing messageId");
152
+ return withOptional({
153
+ type: "REASONING_MESSAGE_START",
154
+ messageId
155
+ }, {
156
+ subagentRunId: getString("subagentRunId"),
157
+ timestamp
145
158
  });
146
159
  }
147
- case "THINKING_START": return withOptional({ type: "THINKING_START" }, {
148
- title: getString("title"),
149
- timestamp
150
- });
151
- case "THINKING_TEXT_MESSAGE_START": return withOptional({ type: "THINKING_TEXT_MESSAGE_START" }, { timestamp });
152
- case "THINKING_TEXT_MESSAGE_CONTENT": return {
153
- type: "THINKING_TEXT_MESSAGE_CONTENT",
154
- delta: getString("delta") ?? ""
155
- };
156
- case "THINKING_TEXT_MESSAGE_END": return withOptional({ type: "THINKING_TEXT_MESSAGE_END" }, { timestamp });
157
- case "THINKING_END": return withOptional({ type: "THINKING_END" }, { timestamp });
158
- case "REASONING_START": return withOptional({ type: "REASONING_START" }, {
159
- messageId: getString("messageId"),
160
- subagentRunId: getString("subagentRunId"),
161
- timestamp
162
- });
163
- case "REASONING_MESSAGE_START": return withOptional({ type: "REASONING_MESSAGE_START" }, {
164
- messageId: getString("messageId"),
165
- subagentRunId: getString("subagentRunId"),
166
- timestamp
167
- });
168
160
  case "REASONING_MESSAGE_CONTENT": {
161
+ const messageId = getString("messageId");
162
+ if (!messageId) return reject("missing messageId");
169
163
  const delta = getString("delta") ?? "";
170
164
  return withOptional({
171
165
  type: "REASONING_MESSAGE_CONTENT",
166
+ messageId,
172
167
  delta
168
+ }, { subagentRunId: getString("subagentRunId") });
169
+ }
170
+ case "REASONING_MESSAGE_END": {
171
+ const messageId = getString("messageId");
172
+ if (!messageId) return reject("missing messageId");
173
+ return withOptional({
174
+ type: "REASONING_MESSAGE_END",
175
+ messageId
173
176
  }, {
174
- messageId: getString("messageId"),
175
- subagentRunId: getString("subagentRunId")
177
+ subagentRunId: getString("subagentRunId"),
178
+ timestamp
176
179
  });
177
180
  }
178
- case "REASONING_MESSAGE_END": return withOptional({ type: "REASONING_MESSAGE_END" }, {
179
- messageId: getString("messageId"),
180
- subagentRunId: getString("subagentRunId"),
181
- timestamp
182
- });
183
181
  case "REASONING_ENCRYPTED_VALUE": {
184
182
  const entityId = getString("entityId");
185
183
  const encryptedValue = getString("encryptedValue");
@@ -195,11 +193,17 @@ const parseAgUiEvent = (event, options) => {
195
193
  ...subagentRunId !== void 0 ? { subagentRunId } : {}
196
194
  };
197
195
  }
198
- case "REASONING_END": return withOptional({ type: "REASONING_END" }, {
199
- messageId: getString("messageId"),
200
- subagentRunId: getString("subagentRunId"),
201
- timestamp
202
- });
196
+ case "REASONING_END": {
197
+ const messageId = getString("messageId");
198
+ if (!messageId) return reject("missing messageId");
199
+ return withOptional({
200
+ type: "REASONING_END",
201
+ messageId
202
+ }, {
203
+ subagentRunId: getString("subagentRunId"),
204
+ timestamp
205
+ });
206
+ }
203
207
  case "TOOL_CALL_START": {
204
208
  const toolCallId = getString("toolCallId");
205
209
  if (!toolCallId) return reject("missing toolCallId");
@@ -230,17 +234,10 @@ const parseAgUiEvent = (event, options) => {
230
234
  toolCallId
231
235
  }, { subagentRunId: getString("subagentRunId") });
232
236
  }
233
- case "TOOL_CALL_CHUNK": return withOptional({ type: "TOOL_CALL_CHUNK" }, {
234
- toolCallId: getString("toolCallId"),
235
- toolCallName: getString("toolCallName"),
236
- parentMessageId: getString("parentMessageId"),
237
- delta: getString("delta"),
238
- subagentRunId: getString("subagentRunId")
239
- });
240
237
  case "TOOL_CALL_RESULT": {
241
238
  const toolCallId = getString("toolCallId");
242
239
  if (!toolCallId) return reject("missing toolCallId");
243
- const content = getString("content") ?? "";
240
+ const content = Array.isArray(payload.content) ? payload.content : getString("content") ?? "";
244
241
  return withOptional({
245
242
  type: "TOOL_CALL_RESULT",
246
243
  toolCallId,
@@ -1 +1 @@
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 const timestamp =\n typeof payload.timestamp === \"number\" && Number.isFinite(payload.timestamp)\n ? payload.timestamp\n : 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\"), timestamp },\n );\n case \"THINKING_TEXT_MESSAGE_START\":\n return withOptional(\n { type: \"THINKING_TEXT_MESSAGE_START\" as const },\n { timestamp },\n );\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 withOptional(\n { type: \"THINKING_TEXT_MESSAGE_END\" as const },\n { timestamp },\n );\n case \"THINKING_END\":\n return withOptional({ type: \"THINKING_END\" as const }, { timestamp });\n case \"REASONING_START\":\n return withOptional(\n { type: \"REASONING_START\" as const },\n {\n messageId: getString(\"messageId\"),\n subagentRunId: getString(\"subagentRunId\"),\n timestamp,\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 timestamp,\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 timestamp,\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 timestamp,\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 \"ACTIVITY_DELTA\": {\n const messageId = getString(\"messageId\");\n const activityType = getString(\"activityType\");\n if (!messageId || !activityType || !Array.isArray(payload.patch)) {\n return reject(\"missing messageId, activityType or patch array\");\n }\n return withOptional(\n {\n type: \"ACTIVITY_DELTA\" as const,\n messageId,\n activityType,\n patch: payload.patch as any[],\n },\n { subagentRunId: getString(\"subagentRunId\") },\n );\n }\n case \"RAW\":\n return withOptional(\n { type: \"RAW\" as const, event: payload.event },\n { source: getString(\"source\") },\n );\n case \"CUSTOM\": {\n const name = getString(\"name\");\n if (!name) return reject(\"missing name\");\n return { type: \"CUSTOM\", name, value: payload.value };\n }\n case \"SUBAGENT_STARTED\": {\n const subagentRunId = getString(\"subagentRunId\");\n const name = getString(\"name\");\n if (!subagentRunId || !name) {\n return reject(\"missing subagentRunId or name\");\n }\n return withOptional(\n { type: \"SUBAGENT_STARTED\" as const, subagentRunId, name },\n {\n description: getString(\"description\"),\n parentSubagentRunId: getString(\"parentSubagentRunId\"),\n parentToolCallId: getString(\"parentToolCallId\"),\n parentMessageId: getString(\"parentMessageId\"),\n },\n );\n }\n case \"SUBAGENT_FINISHED\": {\n const subagentRunId = getString(\"subagentRunId\");\n if (!subagentRunId) return reject(\"missing subagentRunId\");\n const rawOutcome = payload.outcome;\n let outcome: AgUiSubagentFinishedOutcome | undefined;\n if (rawOutcome == null) {\n outcome = undefined;\n } else if (!isPlainObject(rawOutcome)) {\n logRejectedEvent(\n options?.logger,\n \"SUBAGENT_FINISHED\",\n { subagentRunId, outcome: rawOutcome },\n \"has invalid outcome\",\n );\n outcome = undefined;\n } else if (rawOutcome.type === \"success\") {\n outcome = { type: \"success\" as const };\n } else if (rawOutcome.type === \"suspended\") {\n outcome = withOptional(\n { type: \"suspended\" as const },\n {\n interruptIds: Array.isArray(rawOutcome.interruptIds)\n ? (rawOutcome.interruptIds as unknown[]).filter(isString)\n : undefined,\n },\n );\n } else {\n logRejectedEvent(\n options?.logger,\n \"SUBAGENT_FINISHED\",\n { subagentRunId, outcome: rawOutcome },\n \"has unsupported outcome type\",\n );\n outcome = undefined;\n }\n return withOptional(\n { type: \"SUBAGENT_FINISHED\" as const, subagentRunId },\n { result: payload.result, outcome },\n );\n }\n case \"SUBAGENT_ERROR\": {\n const subagentRunId = getString(\"subagentRunId\");\n const message = getString(\"message\");\n if (!subagentRunId || !message) {\n return reject(\"missing subagentRunId or message\");\n }\n return withOptional(\n { type: \"SUBAGENT_ERROR\" as const, subagentRunId, message },\n { code: getString(\"code\") },\n );\n }\n default:\n return withOptional(\n { type: \"RAW\" as const, event: payload },\n {\n source: isString(payload.type) ? (payload.type as string) : undefined,\n },\n );\n }\n};\n"],"mappings":";;;AAcA,MAAM,YAAY,UAAoC,OAAO,UAAU;AACvE,MAAM,oBAAoB,UACxB,SAAS,KAAK,KAAK,MAAM,SAAS;AAEpC,MAAM,gBACJ,MACA,cACG;CACH,MAAM,iBAAiB,OAAO,QAAQ,SAAS,CAAC,CAAC,QAC9C,GAAG,WAAW,UAAU,KAAA,CAC3B;CACA,OAAO,eAAe,WAAW,IAC7B,OACC;EAAE,GAAG;EAAM,GAAG,OAAO,YAAY,cAAc;CAAE;AACxD;AAEA,MAAM,iBAAiB,UACrB,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAE9D,MAAM,oBACJ,QACA,MACA,SACA,WACG;CACH,MAAM,YAAY,SAAS,IAAI,IAAI,OAAO;CAC1C,QAAQ,QAAQ,UAAU,UAAU,GAAG,UAAU,OAAO;AAC1D;AAEA,MAAM,kBAAkB,QAAuC;CAC7D,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO;CAChC,MAAM,KAAK,IAAI;CACf,MAAM,SAAS,IAAI;CACnB,IAAI,OAAO,OAAO,YAAY,OAAO,WAAW,UAAU,OAAO;CACjE,MAAM,YAA2B;EAAE;EAAI;CAAO;CAC9C,IAAI,OAAO,IAAI,YAAY,UAAU,UAAU,UAAU,IAAI;CAC7D,IAAI,OAAO,IAAI,eAAe,UAAU,UAAU,aAAa,IAAI;CACnE,IAAI,OAAO,IAAI,cAAc,UAAU,UAAU,YAAY,IAAI;CACjE,IAAI,cAAc,IAAI,cAAc,GAClC,UAAU,iBAAiB,IAAI;CACjC,IAAI,cAAc,IAAI,QAAQ,GAAG,UAAU,WAAW,IAAI;CAO1D,OAAO,IAAI,kBAAkB,QAAQ,cAAc,IAAI,cAAc,IACjE,YACA,sBAAsB,WAAW,IAAI,cAAc;AACzD;AAEA,MAAM,2BACJ,KACA,OACA,WACuC;CACvC,IAAI,OAAO,MAAM,OAAO,KAAA;CACxB,IAAI,CAAC,cAAc,GAAG,GAAG;EACvB,iBACE,QACA,gBACA;GAAE;GAAO,SAAS;EAAI,GACtB,qBACF;EACA;CACF;CACA,IAAI,IAAI,SAAS,WAAW,OAAO,EAAE,MAAM,UAAU;CACrD,IAAI,IAAI,SAAS,aAAa;EAC5B,IAAI,CAAC,MAAM,QAAQ,IAAI,UAAU,GAAG;GAClC,iBACE,QACA,gBACA;IAAE;IAAO,SAAS;GAAI,GACtB,mDACF;GACA;EACF;EACA,MAAM,SAAS,IAAI,WAChB,KAAK,UAAU;GACd,MAAM,YAAY,eAAe,KAAK;GACtC,IAAI,cAAc,MAChB,iBACE,QACA,gBACA;IAAE;IAAO,WAAW;GAAM,GAC1B,yBACF;GAEF,OAAO;EACT,CAAC,CAAC,CACD,QAAQ,UAAkC,UAAU,IAAI;EAC3D,IAAI,OAAO,WAAW,GAAG;GACvB,iBACE,QACA,gBACA;IAAE;IAAO,YAAY,IAAI;GAAW,GACpC,mDACF;GACA;EACF;EACA,OAAO;GAAE,MAAM;GAAa,YAAY;EAAO;CACjD;CACA,iBACE,QACA,gBACA;EAAE;EAAO,SAAS;CAAI,GACtB,8BACF;AAEF;AAEA,MAAa,kBACX,OACA,YACqB;CACrB,IAAI,CAAC,SAAS,OAAO,UAAU,UAAU;EACvC,iBAAiB,SAAS,QAAQ,KAAA,GAAW,OAAO,kBAAkB;EACtE,OAAO;CACT;CACA,MAAM,UAAU;CAChB,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,SAAS,SAAS,GAAG;EACxB,iBAAiB,SAAS,QAAQ,WAAW,SAAS,oBAAoB;EAC1E,OAAO;CACT;CAEA,MAAM,UAAU,WAAyB;EACvC,iBAAiB,SAAS,QAAQ,WAAW,SAAS,MAAM;EAC5D,OAAO;CACT;CAEA,MAAM,aAAa,QACjB,SAAS,QAAQ,IAAI,IAAK,QAAQ,OAAkB,KAAA;CACtD,MAAM,YACJ,OAAO,QAAQ,cAAc,YAAY,OAAO,SAAS,QAAQ,SAAS,IACtE,QAAQ,YACR,KAAA;CAEN,QAAQ,WAAR;EACE,KAAK,eAAe;GAClB,MAAM,QAAQ,UAAU,OAAO;GAC/B,OAAO,QAAQ;IAAE,MAAM;IAAe;GAAM,IAAI,OAAO,eAAe;EACxE;EACA,KAAK,gBAAgB;GACnB,MAAM,QAAQ,UAAU,OAAO;GAC/B,IAAI,CAAC,OAAO,OAAO,OAAO,eAAe;GACzC,OAAO,aACL;IAAE,MAAM;IAAyB;GAAM,GACvC,EACE,SAAS,wBACP,QAAQ,SACR,OACA,SAAS,MACX,EACF,CACF;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,QAAQ,UAAU,OAAO;GAC/B,OAAO,aAAa,EAAE,MAAM,gBAAyB,GAAG,EAAE,MAAM,CAAC;EACnE;EACA,KAAK,aACH,OAAO,aACL,EAAE,MAAM,YAAqB,GAC7B;GACE,SAAS,UAAU,SAAS;GAC5B,MAAM,UAAU,MAAM;EACxB,CACF;EAEF,KAAK,sBACH,OAAO,aACL,EAAE,MAAM,qBAA8B,GACtC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,wBAAwB;GAC3B,MAAM,QAAQ,UAAU,OAAO;GAC/B,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO,OAAO,yBAAyB;GACrE,OAAO,aACL;IAAE,MAAM;IAAiC;GAAM,GAC/C;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,oBACH,OAAO,aACL,EAAE,MAAM,mBAA4B,GACpC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,sBAAsB;GACzB,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAA+B;GAAM,GAC7C;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,kBACH,OAAO,aACL,EAAE,MAAM,iBAA0B,GAClC;GAAE,OAAO,UAAU,OAAO;GAAG;EAAU,CACzC;EACF,KAAK,+BACH,OAAO,aACL,EAAE,MAAM,8BAAuC,GAC/C,EAAE,UAAU,CACd;EACF,KAAK,iCAEH,OAAO;GAAE,MAAM;GAAiC,OADlC,UAAU,OAAO,KAAK;EACkB;EAExD,KAAK,6BACH,OAAO,aACL,EAAE,MAAM,4BAAqC,GAC7C,EAAE,UAAU,CACd;EACF,KAAK,gBACH,OAAO,aAAa,EAAE,MAAM,eAAwB,GAAG,EAAE,UAAU,CAAC;EACtE,KAAK,mBACH,OAAO,aACL,EAAE,MAAM,kBAA2B,GACnC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;GACxC;EACF,CACF;EACF,KAAK,2BACH,OAAO,aACL,EAAE,MAAM,0BAAmC,GAC3C;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;GACxC;EACF,CACF;EACF,KAAK,6BAA6B;GAChC,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAAsC;GAAM,GACpD;IACE,WAAW,UAAU,WAAW;IAChC,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,yBACH,OAAO,aACL,EAAE,MAAM,wBAAiC,GACzC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;GACxC;EACF,CACF;EACF,KAAK,6BAA6B;GAChC,MAAM,WAAW,UAAU,UAAU;GACrC,MAAM,iBAAiB,UAAU,gBAAgB;GACjD,MAAM,UAAU,UAAU,SAAS;GACnC,IAAI,CAAC,YAAY,CAAC,gBAChB,OAAO,OAAO,oCAAoC;GAEpD,IAAI,YAAY,aAAa,YAAY,aACvC,OAAO,OAAO,wBAAwB;GAIxC,MAAM,gBAAgB,UAAU,eAAe;GAC/C,OAAO;IACL,MAAM;IACN;IACA;IACA;IACA,GAAI,kBAAkB,KAAA,IAAY,EAAE,cAAc,IAAI,CAAC;GACzD;EACF;EACA,KAAK,iBACH,OAAO,aACL,EAAE,MAAM,gBAAyB,GACjC;GACE,WAAW,UAAU,WAAW;GAChC,eAAe,UAAU,eAAe;GACxC;EACF,CACF;EACF,KAAK,mBAAmB;GACtB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,OAAO,aACL;IAAE,MAAM;IAA4B;GAAW,GAC/C;IACE,cAAc,UAAU,cAAc;IACtC,iBAAiB,UAAU,iBAAiB;IAC5C,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,MAAM,QAAQ,UAAU,OAAO,KAAK;GACpC,OAAO,aACL;IAAE,MAAM;IAA2B;IAAY;GAAM,GACrD,EAAE,eAAe,UAAU,eAAe,EAAE,CAC9C;EACF;EACA,KAAK,iBAAiB;GACpB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,OAAO,aACL;IAAE,MAAM;IAA0B;GAAW,GAC7C,EAAE,eAAe,UAAU,eAAe,EAAE,CAC9C;EACF;EACA,KAAK,mBACH,OAAO,aACL,EAAE,MAAM,kBAA2B,GACnC;GACE,YAAY,UAAU,YAAY;GAClC,cAAc,UAAU,cAAc;GACtC,iBAAiB,UAAU,iBAAiB;GAC5C,OAAO,UAAU,OAAO;GACxB,eAAe,UAAU,eAAe;EAC1C,CACF;EACF,KAAK,oBAAoB;GACvB,MAAM,aAAa,UAAU,YAAY;GACzC,IAAI,CAAC,YAAY,OAAO,OAAO,oBAAoB;GACnD,MAAM,UAAU,UAAU,SAAS,KAAK;GACxC,OAAO,aACL;IACE,MAAM;IACN;IACA;GACF,GACA;IACE,WAAW,UAAU,WAAW;IAChC,MAAM,QAAQ,SAAS,SAAS,SAAS,KAAA;IACzC,WAAW,uBAAuB,SAAS,OAAO;IAClD,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK;GACH,IAAI,QAAQ,aAAa,KAAA,GACvB,OAAO,OAAO,kBAAkB;GAElC,OAAO;IAAE,MAAM;IAAkB,UAAU,QAAQ;GAAS;EAC9D,KAAK,eACH,OAAO;GACL,MAAM;GACN,OAAO,MAAM,QAAQ,QAAQ,KAAK,IAAK,QAAQ,QAAkB,CAAC;EACpE;EACF,KAAK;GACH,IAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,GACjC,OAAO,OAAO,wBAAwB;GAExC,OAAO;IACL,MAAM;IACN,UAAU,QAAQ;GACpB;EACF,KAAK,qBAAqB;GACxB,MAAM,eAAe,UAAU,cAAc;GAC7C,IAAI,CAAC,gBAAgB,CAAC,cAAc,QAAQ,OAAO,GACjD,OAAO,OAAO,wCAAwC;GAExD,OAAO,aACL;IACE,MAAM;IACN;IACA,SAAS,QAAQ;GACnB,GACA;IACE,WAAW,UAAU,WAAW;IAChC,SACE,OAAO,QAAQ,YAAY,YAAY,QAAQ,UAAU,KAAA;IAC3D,eAAe,UAAU,eAAe;GAC1C,CACF;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,YAAY,UAAU,WAAW;GACvC,MAAM,eAAe,UAAU,cAAc;GAC7C,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,MAAM,QAAQ,QAAQ,KAAK,GAC7D,OAAO,OAAO,gDAAgD;GAEhE,OAAO,aACL;IACE,MAAM;IACN;IACA;IACA,OAAO,QAAQ;GACjB,GACA,EAAE,eAAe,UAAU,eAAe,EAAE,CAC9C;EACF;EACA,KAAK,OACH,OAAO,aACL;GAAE,MAAM;GAAgB,OAAO,QAAQ;EAAM,GAC7C,EAAE,QAAQ,UAAU,QAAQ,EAAE,CAChC;EACF,KAAK,UAAU;GACb,MAAM,OAAO,UAAU,MAAM;GAC7B,IAAI,CAAC,MAAM,OAAO,OAAO,cAAc;GACvC,OAAO;IAAE,MAAM;IAAU;IAAM,OAAO,QAAQ;GAAM;EACtD;EACA,KAAK,oBAAoB;GACvB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,MAAM,OAAO,UAAU,MAAM;GAC7B,IAAI,CAAC,iBAAiB,CAAC,MACrB,OAAO,OAAO,+BAA+B;GAE/C,OAAO,aACL;IAAE,MAAM;IAA6B;IAAe;GAAK,GACzD;IACE,aAAa,UAAU,aAAa;IACpC,qBAAqB,UAAU,qBAAqB;IACpD,kBAAkB,UAAU,kBAAkB;IAC9C,iBAAiB,UAAU,iBAAiB;GAC9C,CACF;EACF;EACA,KAAK,qBAAqB;GACxB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,IAAI,CAAC,eAAe,OAAO,OAAO,uBAAuB;GACzD,MAAM,aAAa,QAAQ;GAC3B,IAAI;GACJ,IAAI,cAAc,MAChB,UAAU,KAAA;QACL,IAAI,CAAC,cAAc,UAAU,GAAG;IACrC,iBACE,SAAS,QACT,qBACA;KAAE;KAAe,SAAS;IAAW,GACrC,qBACF;IACA,UAAU,KAAA;GACZ,OAAO,IAAI,WAAW,SAAS,WAC7B,UAAU,EAAE,MAAM,UAAmB;QAChC,IAAI,WAAW,SAAS,aAC7B,UAAU,aACR,EAAE,MAAM,YAAqB,GAC7B,EACE,cAAc,MAAM,QAAQ,WAAW,YAAY,IAC9C,WAAW,aAA2B,OAAO,QAAQ,IACtD,KAAA,EACN,CACF;QACK;IACL,iBACE,SAAS,QACT,qBACA;KAAE;KAAe,SAAS;IAAW,GACrC,8BACF;IACA,UAAU,KAAA;GACZ;GACA,OAAO,aACL;IAAE,MAAM;IAA8B;GAAc,GACpD;IAAE,QAAQ,QAAQ;IAAQ;GAAQ,CACpC;EACF;EACA,KAAK,kBAAkB;GACrB,MAAM,gBAAgB,UAAU,eAAe;GAC/C,MAAM,UAAU,UAAU,SAAS;GACnC,IAAI,CAAC,iBAAiB,CAAC,SACrB,OAAO,OAAO,kCAAkC;GAElD,OAAO,aACL;IAAE,MAAM;IAA2B;IAAe;GAAQ,GAC1D,EAAE,MAAM,UAAU,MAAM,EAAE,CAC5B;EACF;EACA,SACE,OAAO,aACL;GAAE,MAAM;GAAgB,OAAO;EAAQ,GACvC,EACE,QAAQ,SAAS,QAAQ,IAAI,IAAK,QAAQ,OAAkB,KAAA,EAC9D,CACF;CACJ;AACF"}
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\";\nimport type { ContentPart } from \"@ag-ui/client\";\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\") {\n return withOptional(\n { type: \"success\" as const },\n {\n pendingToolCallIds:\n Array.isArray(raw.pendingToolCallIds) &&\n raw.pendingToolCallIds.every(isString)\n ? raw.pendingToolCallIds\n : undefined,\n },\n );\n }\n if (raw.type === \"cancelled\") return { type: \"cancelled\" };\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 const timestamp =\n typeof payload.timestamp === \"number\" && Number.isFinite(payload.timestamp)\n ? payload.timestamp\n : 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 \"REASONING_START\": {\n const messageId = getString(\"messageId\");\n if (!messageId) return reject(\"missing messageId\");\n return withOptional(\n { type: \"REASONING_START\" as const, messageId },\n {\n subagentRunId: getString(\"subagentRunId\"),\n timestamp,\n },\n );\n }\n case \"REASONING_MESSAGE_START\": {\n const messageId = getString(\"messageId\");\n if (!messageId) return reject(\"missing messageId\");\n return withOptional(\n { type: \"REASONING_MESSAGE_START\" as const, messageId },\n {\n subagentRunId: getString(\"subagentRunId\"),\n timestamp,\n },\n );\n }\n case \"REASONING_MESSAGE_CONTENT\": {\n const messageId = getString(\"messageId\");\n if (!messageId) return reject(\"missing messageId\");\n const delta = getString(\"delta\") ?? \"\";\n return withOptional(\n { type: \"REASONING_MESSAGE_CONTENT\" as const, messageId, delta },\n {\n subagentRunId: getString(\"subagentRunId\"),\n },\n );\n }\n case \"REASONING_MESSAGE_END\": {\n const messageId = getString(\"messageId\");\n if (!messageId) return reject(\"missing messageId\");\n return withOptional(\n { type: \"REASONING_MESSAGE_END\" as const, messageId },\n {\n subagentRunId: getString(\"subagentRunId\"),\n timestamp,\n },\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 const messageId = getString(\"messageId\");\n if (!messageId) return reject(\"missing messageId\");\n return withOptional(\n { type: \"REASONING_END\" as const, messageId },\n {\n subagentRunId: getString(\"subagentRunId\"),\n timestamp,\n },\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_RESULT\": {\n const toolCallId = getString(\"toolCallId\");\n if (!toolCallId) return reject(\"missing toolCallId\");\n const content = Array.isArray(payload.content)\n ? (payload.content as ContentPart[])\n : (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 \"ACTIVITY_DELTA\": {\n const messageId = getString(\"messageId\");\n const activityType = getString(\"activityType\");\n if (!messageId || !activityType || !Array.isArray(payload.patch)) {\n return reject(\"missing messageId, activityType or patch array\");\n }\n return withOptional(\n {\n type: \"ACTIVITY_DELTA\" as const,\n messageId,\n activityType,\n patch: payload.patch as any[],\n },\n { subagentRunId: getString(\"subagentRunId\") },\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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"}
@@ -1,9 +1,11 @@
1
+ import { type ContentPart } from "@ag-ui/client";
1
2
  export type McpToolCallResult = Record<string, unknown> & {
2
3
  content: unknown[];
3
4
  structuredContent?: Record<string, unknown>;
4
5
  _meta?: Record<string, unknown>;
5
6
  isError?: boolean;
6
7
  };
7
- export declare const parseMcpToolCallResult: (source: Record<string, unknown>, modelContent: string) => McpToolCallResult | undefined;
8
+ export declare const toolContentText: (content: string | ContentPart[]) => string;
9
+ export declare const parseMcpToolCallResult: (source: Record<string, unknown>, content: string | ContentPart[]) => McpToolCallResult | undefined;
8
10
  export declare const readMcpAppResourceUri: (meta: unknown) => string | undefined;
9
11
  //# sourceMappingURL=mcp-tool-result.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-result.d.ts","sourceRoot":"","sources":["../../src/runtime/mcp-tool-result.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxD,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,cAAc,MAAM,KACnB,iBAAiB,GAAG,SAatB,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAAI,MAAM,OAAO,KAAG,MAAM,GAAG,SAO9D,CAAC"}
1
+ {"version":3,"file":"mcp-tool-result.d.ts","sourceRoot":"","sources":["../../src/runtime/mcp-tool-result.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxD,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,GAAG,WAAW,EAAE,KAAG,MAK/D,CAAC;AAEJ,eAAO,MAAM,sBAAsB,GACjC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,MAAM,GAAG,WAAW,EAAE,KAC9B,iBAAiB,GAAG,SAmBtB,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAAI,MAAM,OAAO,KAAG,MAAM,GAAG,SAO9D,CAAC"}
@@ -1,12 +1,15 @@
1
1
  import { isMcpAppUri } from "@assistant-ui/core";
2
2
  import { isRecord } from "@assistant-ui/core/internal";
3
+ import { contentToText } from "@ag-ui/client";
3
4
  //#region src/runtime/mcp-tool-result.ts
4
- const parseMcpToolCallResult = (source, modelContent) => {
5
+ const toolContentText = (content) => contentToText(Array.isArray(content) ? content.filter(isRecord) : content);
6
+ const parseMcpToolCallResult = (source, content) => {
5
7
  const structuredContent = isRecord(source.structuredContent) ? source.structuredContent : void 0;
6
8
  const meta = isRecord(source._meta) ? source._meta : void 0;
7
9
  if (!structuredContent && !meta) return void 0;
10
+ const modelContent = toolContentText(content);
8
11
  return {
9
- content: modelContent ? [{
12
+ content: Array.isArray(content) ? content : modelContent ? [{
10
13
  type: "text",
11
14
  text: modelContent
12
15
  }] : [],
@@ -24,6 +27,6 @@ const readMcpAppResourceUri = (meta) => {
24
27
  return typeof flat === "string" && isMcpAppUri(flat) ? flat : void 0;
25
28
  };
26
29
  //#endregion
27
- export { parseMcpToolCallResult, readMcpAppResourceUri };
30
+ export { parseMcpToolCallResult, readMcpAppResourceUri, toolContentText };
28
31
 
29
32
  //# sourceMappingURL=mcp-tool-result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-result.js","names":[],"sources":["../../src/runtime/mcp-tool-result.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\nimport { isMcpAppUri } from \"@assistant-ui/core\";\n\nexport type McpToolCallResult = Record<string, unknown> & {\n content: unknown[];\n structuredContent?: Record<string, unknown>;\n _meta?: Record<string, unknown>;\n isError?: boolean;\n};\n\nexport const parseMcpToolCallResult = (\n source: Record<string, unknown>,\n modelContent: string,\n): McpToolCallResult | undefined => {\n const structuredContent = isRecord(source.structuredContent)\n ? source.structuredContent\n : undefined;\n const meta = isRecord(source._meta) ? source._meta : undefined;\n if (!structuredContent && !meta) return undefined;\n\n return {\n content: modelContent ? [{ type: \"text\", text: modelContent }] : [],\n ...(structuredContent ? { structuredContent } : {}),\n ...(meta ? { _meta: meta } : {}),\n ...(typeof source.isError === \"boolean\" ? { isError: source.isError } : {}),\n };\n};\n\n// The MCP Apps pointer on CallToolResult._meta: canonical nested `ui.resourceUri`\n// per the Apps spec (2026-01-26), with the deprecated flat `\"ui/resourceUri\"` kept\n// for legacy producers. Only ui:// URIs identify a widget.\nexport const readMcpAppResourceUri = (meta: unknown): string | undefined => {\n if (!isRecord(meta)) return undefined;\n const ui = meta[\"ui\"];\n const nested = isRecord(ui) ? ui[\"resourceUri\"] : undefined;\n if (typeof nested === \"string\" && isMcpAppUri(nested)) return nested;\n const flat = meta[\"ui/resourceUri\"];\n return typeof flat === \"string\" && isMcpAppUri(flat) ? flat : undefined;\n};\n"],"mappings":";;;AAUA,MAAa,0BACX,QACA,iBACkC;CAClC,MAAM,oBAAoB,SAAS,OAAO,iBAAiB,IACvD,OAAO,oBACP,KAAA;CACJ,MAAM,OAAO,SAAS,OAAO,KAAK,IAAI,OAAO,QAAQ,KAAA;CACrD,IAAI,CAAC,qBAAqB,CAAC,MAAM,OAAO,KAAA;CAExC,OAAO;EACL,SAAS,eAAe,CAAC;GAAE,MAAM;GAAQ,MAAM;EAAa,CAAC,IAAI,CAAC;EAClE,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;EACjD,GAAI,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;EAC9B,GAAI,OAAO,OAAO,YAAY,YAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;CAC3E;AACF;AAKA,MAAa,yBAAyB,SAAsC;CAC1E,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,KAAA;CAC5B,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,SAAS,EAAE,IAAI,GAAG,iBAAiB,KAAA;CAClD,IAAI,OAAO,WAAW,YAAY,YAAY,MAAM,GAAG,OAAO;CAC9D,MAAM,OAAO,KAAK;CAClB,OAAO,OAAO,SAAS,YAAY,YAAY,IAAI,IAAI,OAAO,KAAA;AAChE"}
1
+ {"version":3,"file":"mcp-tool-result.js","names":[],"sources":["../../src/runtime/mcp-tool-result.ts"],"sourcesContent":["import { isRecord } from \"@assistant-ui/core/internal\";\nimport { isMcpAppUri } from \"@assistant-ui/core\";\nimport { contentToText, type ContentPart } from \"@ag-ui/client\";\n\nexport type McpToolCallResult = Record<string, unknown> & {\n content: unknown[];\n structuredContent?: Record<string, unknown>;\n _meta?: Record<string, unknown>;\n isError?: boolean;\n};\n\nexport const toolContentText = (content: string | ContentPart[]): string =>\n contentToText(\n Array.isArray(content)\n ? (content.filter(isRecord) as ContentPart[])\n : content,\n );\n\nexport const parseMcpToolCallResult = (\n source: Record<string, unknown>,\n content: string | ContentPart[],\n): McpToolCallResult | undefined => {\n const structuredContent = isRecord(source.structuredContent)\n ? source.structuredContent\n : undefined;\n const meta = isRecord(source._meta) ? source._meta : undefined;\n if (!structuredContent && !meta) return undefined;\n\n const modelContent = toolContentText(content);\n\n return {\n content: Array.isArray(content)\n ? content\n : modelContent\n ? [{ type: \"text\", text: modelContent }]\n : [],\n ...(structuredContent ? { structuredContent } : {}),\n ...(meta ? { _meta: meta } : {}),\n ...(typeof source.isError === \"boolean\" ? { isError: source.isError } : {}),\n };\n};\n\n// The MCP Apps pointer on CallToolResult._meta: canonical nested `ui.resourceUri`\n// per the Apps spec (2026-01-26), with the deprecated flat `\"ui/resourceUri\"` kept\n// for legacy producers. Only ui:// URIs identify a widget.\nexport const readMcpAppResourceUri = (meta: unknown): string | undefined => {\n if (!isRecord(meta)) return undefined;\n const ui = meta[\"ui\"];\n const nested = isRecord(ui) ? ui[\"resourceUri\"] : undefined;\n if (typeof nested === \"string\" && isMcpAppUri(nested)) return nested;\n const flat = meta[\"ui/resourceUri\"];\n return typeof flat === \"string\" && isMcpAppUri(flat) ? flat : undefined;\n};\n"],"mappings":";;;;AAWA,MAAa,mBAAmB,YAC9B,cACE,MAAM,QAAQ,OAAO,IAChB,QAAQ,OAAO,QAAQ,IACxB,OACN;AAEF,MAAa,0BACX,QACA,YACkC;CAClC,MAAM,oBAAoB,SAAS,OAAO,iBAAiB,IACvD,OAAO,oBACP,KAAA;CACJ,MAAM,OAAO,SAAS,OAAO,KAAK,IAAI,OAAO,QAAQ,KAAA;CACrD,IAAI,CAAC,qBAAqB,CAAC,MAAM,OAAO,KAAA;CAExC,MAAM,eAAe,gBAAgB,OAAO;CAE5C,OAAO;EACL,SAAS,MAAM,QAAQ,OAAO,IAC1B,UACA,eACE,CAAC;GAAE,MAAM;GAAQ,MAAM;EAAa,CAAC,IACrC,CAAC;EACP,GAAI,oBAAoB,EAAE,kBAAkB,IAAI,CAAC;EACjD,GAAI,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;EAC9B,GAAI,OAAO,OAAO,YAAY,YAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;CAC3E;AACF;AAKA,MAAa,yBAAyB,SAAsC;CAC1E,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,KAAA;CAC5B,MAAM,KAAK,KAAK;CAChB,MAAM,SAAS,SAAS,EAAE,IAAI,GAAG,iBAAiB,KAAA;CAClD,IAAI,OAAO,WAAW,YAAY,YAAY,MAAM,GAAG,OAAO;CAC9D,MAAM,OAAO,KAAK;CAClB,OAAO,OAAO,SAAS,YAAY,YAAY,IAAI,IAAI,OAAO,KAAA;AAChE"}
@@ -1,5 +1,6 @@
1
1
  import type { CreateAppendMessage, AttachmentAdapter, DictationAdapter, ExternalStoreSharedOptions, ExternalStoreThreadListAdapter, FeedbackAdapter, RealtimeVoiceAdapter, RunConfig, SpeechSynthesisAdapter, ThreadHistoryAdapter, ThreadMessage } from "@assistant-ui/core";
2
- import type { AbstractAgent, Context, Message } from "@ag-ui/client";
2
+ import type { JoinStrategy } from "@assistant-ui/core/react";
3
+ import type { AbstractAgent, ContentPart, Context, Message } from "@ag-ui/client";
3
4
  import type { Logger } from "./logger.js";
4
5
  import type { ReadonlyJSONValue } from "assistant-stream/utils";
5
6
  import type { McpToolCallResult } from "./mcp-tool-result.js";
@@ -17,6 +18,7 @@ export type AgUiCustomMetadata = {
17
18
  * represent (a developer record rides as a system message). */
18
19
  role?: "developer";
19
20
  interrupts?: AgUiInterrupt[];
21
+ pendingToolCallIds?: string[];
20
22
  opaqueReasoning?: AgUiOpaqueReasoning[];
21
23
  };
22
24
  /**
@@ -55,6 +57,7 @@ export type UseAgUiRuntimeOptions = ExternalStoreSharedOptions & {
55
57
  agent: AbstractAgent;
56
58
  logger?: Partial<Logger>;
57
59
  showThinking?: boolean;
60
+ joinStrategy?: JoinStrategy;
58
61
  /**
59
62
  * Return context entries for each run. `messages` is the exact AG-UI
60
63
  * transcript sent in the run input, after transcript selection and message
@@ -141,9 +144,12 @@ export type AgUiRuntimeExtras = {
141
144
  };
142
145
  export type AgUiRunFinishedOutcome = {
143
146
  type: "success";
147
+ pendingToolCallIds?: string[];
144
148
  } | {
145
149
  type: "interrupt";
146
150
  interrupts: AgUiInterrupt[];
151
+ } | {
152
+ type: "cancelled";
147
153
  };
148
154
  export type AgUiSubagentFinishedOutcome = {
149
155
  type: "success";
@@ -178,45 +184,24 @@ export type AgUiEvent = {
178
184
  type: "TEXT_MESSAGE_END";
179
185
  messageId?: string;
180
186
  subagentRunId?: string;
181
- } | {
182
- type: "TEXT_MESSAGE_CHUNK";
183
- messageId?: string;
184
- delta: string;
185
- subagentRunId?: string;
186
- } | {
187
- type: "THINKING_START";
188
- title?: string;
189
- timestamp?: number;
190
- } | {
191
- type: "THINKING_TEXT_MESSAGE_START";
192
- timestamp?: number;
193
- } | {
194
- type: "THINKING_TEXT_MESSAGE_CONTENT";
195
- delta: string;
196
- } | {
197
- type: "THINKING_TEXT_MESSAGE_END";
198
- timestamp?: number;
199
- } | {
200
- type: "THINKING_END";
201
- timestamp?: number;
202
187
  } | {
203
188
  type: "REASONING_START";
204
- messageId?: string;
189
+ messageId: string;
205
190
  subagentRunId?: string;
206
191
  timestamp?: number;
207
192
  } | {
208
193
  type: "REASONING_MESSAGE_START";
209
- messageId?: string;
194
+ messageId: string;
210
195
  subagentRunId?: string;
211
196
  timestamp?: number;
212
197
  } | {
213
198
  type: "REASONING_MESSAGE_CONTENT";
214
- messageId?: string;
199
+ messageId: string;
215
200
  delta: string;
216
201
  subagentRunId?: string;
217
202
  } | {
218
203
  type: "REASONING_MESSAGE_END";
219
- messageId?: string;
204
+ messageId: string;
220
205
  subagentRunId?: string;
221
206
  timestamp?: number;
222
207
  } | {
@@ -227,7 +212,7 @@ export type AgUiEvent = {
227
212
  subagentRunId?: string;
228
213
  } | {
229
214
  type: "REASONING_END";
230
- messageId?: string;
215
+ messageId: string;
231
216
  subagentRunId?: string;
232
217
  timestamp?: number;
233
218
  } | {
@@ -245,18 +230,11 @@ export type AgUiEvent = {
245
230
  type: "TOOL_CALL_END";
246
231
  toolCallId: string;
247
232
  subagentRunId?: string;
248
- } | {
249
- type: "TOOL_CALL_CHUNK";
250
- toolCallId?: string;
251
- toolCallName?: string;
252
- parentMessageId?: string;
253
- delta?: string;
254
- subagentRunId?: string;
255
233
  } | {
256
234
  type: "TOOL_CALL_RESULT";
257
235
  messageId?: string;
258
236
  toolCallId: string;
259
- content: string;
237
+ content: string | ContentPart[];
260
238
  role?: "tool";
261
239
  mcpResult?: McpToolCallResult;
262
240
  subagentRunId?: string;