@assistant-ui/react-ag-ui 0.0.71 → 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.
- package/README.md +1 -1
- package/dist/runtime/{AgUiThreadRuntimeCore.d.ts → AgUiThreadController.d.ts} +6 -12
- package/dist/runtime/AgUiThreadController.d.ts.map +1 -0
- package/dist/runtime/{AgUiThreadRuntimeCore.js → AgUiThreadController.js} +246 -159
- package/dist/runtime/AgUiThreadController.js.map +1 -0
- package/dist/runtime/adapter/conversions.d.ts +4 -4
- package/dist/runtime/adapter/conversions.d.ts.map +1 -1
- package/dist/runtime/adapter/conversions.js +111 -33
- package/dist/runtime/adapter/conversions.js.map +1 -1
- package/dist/runtime/adapter/run-aggregator.d.ts +3 -5
- package/dist/runtime/adapter/run-aggregator.d.ts.map +1 -1
- package/dist/runtime/adapter/run-aggregator.js +47 -61
- package/dist/runtime/adapter/run-aggregator.js.map +1 -1
- package/dist/runtime/adapter/subscriber.d.ts +0 -24
- package/dist/runtime/adapter/subscriber.d.ts.map +1 -1
- package/dist/runtime/adapter/subscriber.js +1 -22
- package/dist/runtime/adapter/subscriber.js.map +1 -1
- package/dist/runtime/agUiThreadState.d.ts +60 -0
- package/dist/runtime/agUiThreadState.d.ts.map +1 -0
- package/dist/runtime/agUiThreadState.js +95 -0
- package/dist/runtime/agUiThreadState.js.map +1 -0
- package/dist/runtime/event-parser.d.ts.map +1 -1
- package/dist/runtime/event-parser.js +45 -48
- package/dist/runtime/event-parser.js.map +1 -1
- package/dist/runtime/mcp-tool-result.d.ts +3 -1
- package/dist/runtime/mcp-tool-result.d.ts.map +1 -1
- package/dist/runtime/mcp-tool-result.js +6 -3
- package/dist/runtime/mcp-tool-result.js.map +1 -1
- package/dist/runtime/types.d.ts +11 -35
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/useAgUiRuntime.js +2 -2
- package/dist/useAgUiRuntime.js.map +1 -1
- package/package.json +12 -11
- package/src/runtime/{AgUiThreadRuntimeCore.interrupt-cancel.test.ts → AgUiThreadController.interrupt-cancel.test.ts} +4 -4
- package/src/runtime/{AgUiThreadRuntimeCore.test.ts → AgUiThreadController.test.ts} +35 -6
- package/src/runtime/{AgUiThreadRuntimeCore.ts → AgUiThreadController.ts} +356 -171
- package/src/runtime/adapter/conversions.content.test.ts +37 -5
- package/src/runtime/adapter/conversions.tools.test.ts +2 -1
- package/src/runtime/adapter/conversions.ts +235 -58
- package/src/runtime/adapter/run-aggregator.ts +79 -114
- package/src/runtime/adapter/subscriber.ts +1 -44
- package/src/runtime/agUiThreadState.test.ts +205 -0
- package/src/runtime/agUiThreadState.ts +130 -0
- package/src/runtime/event-parser.ts +40 -58
- package/src/runtime/mcp-tool-result.ts +16 -2
- package/src/runtime/types.ts +16 -28
- package/src/useAgUiRuntime.fast-refresh.test.tsx +3 -3
- package/src/useAgUiRuntime.thread-switch.test.tsx +4 -4
- package/src/useAgUiRuntime.ts +3 -3
- package/dist/runtime/AgUiThreadRuntimeCore.d.ts.map +0 -1
- 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;
|
|
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 "
|
|
138
|
-
const
|
|
138
|
+
case "REASONING_START": {
|
|
139
|
+
const messageId = getString("messageId");
|
|
140
|
+
if (!messageId) return reject("missing messageId");
|
|
139
141
|
return withOptional({
|
|
140
|
-
type: "
|
|
141
|
-
|
|
142
|
+
type: "REASONING_START",
|
|
143
|
+
messageId
|
|
142
144
|
}, {
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
175
|
-
|
|
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":
|
|
199
|
-
messageId
|
|
200
|
-
|
|
201
|
-
|
|
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":"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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\";\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
|
|
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":"
|
|
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
|
|
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
|
|
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"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CreateAppendMessage, AttachmentAdapter, DictationAdapter, ExternalStoreSharedOptions, ExternalStoreThreadListAdapter, FeedbackAdapter, RealtimeVoiceAdapter, RunConfig, SpeechSynthesisAdapter, ThreadHistoryAdapter, ThreadMessage } from "@assistant-ui/core";
|
|
2
2
|
import type { JoinStrategy } from "@assistant-ui/core/react";
|
|
3
|
-
import type { AbstractAgent, Context, Message } from "@ag-ui/client";
|
|
3
|
+
import type { AbstractAgent, ContentPart, Context, Message } from "@ag-ui/client";
|
|
4
4
|
import type { Logger } from "./logger.js";
|
|
5
5
|
import type { ReadonlyJSONValue } from "assistant-stream/utils";
|
|
6
6
|
import type { McpToolCallResult } from "./mcp-tool-result.js";
|
|
@@ -18,6 +18,7 @@ export type AgUiCustomMetadata = {
|
|
|
18
18
|
* represent (a developer record rides as a system message). */
|
|
19
19
|
role?: "developer";
|
|
20
20
|
interrupts?: AgUiInterrupt[];
|
|
21
|
+
pendingToolCallIds?: string[];
|
|
21
22
|
opaqueReasoning?: AgUiOpaqueReasoning[];
|
|
22
23
|
};
|
|
23
24
|
/**
|
|
@@ -143,9 +144,12 @@ export type AgUiRuntimeExtras = {
|
|
|
143
144
|
};
|
|
144
145
|
export type AgUiRunFinishedOutcome = {
|
|
145
146
|
type: "success";
|
|
147
|
+
pendingToolCallIds?: string[];
|
|
146
148
|
} | {
|
|
147
149
|
type: "interrupt";
|
|
148
150
|
interrupts: AgUiInterrupt[];
|
|
151
|
+
} | {
|
|
152
|
+
type: "cancelled";
|
|
149
153
|
};
|
|
150
154
|
export type AgUiSubagentFinishedOutcome = {
|
|
151
155
|
type: "success";
|
|
@@ -180,45 +184,24 @@ export type AgUiEvent = {
|
|
|
180
184
|
type: "TEXT_MESSAGE_END";
|
|
181
185
|
messageId?: string;
|
|
182
186
|
subagentRunId?: string;
|
|
183
|
-
} | {
|
|
184
|
-
type: "TEXT_MESSAGE_CHUNK";
|
|
185
|
-
messageId?: string;
|
|
186
|
-
delta: string;
|
|
187
|
-
subagentRunId?: string;
|
|
188
|
-
} | {
|
|
189
|
-
type: "THINKING_START";
|
|
190
|
-
title?: string;
|
|
191
|
-
timestamp?: number;
|
|
192
|
-
} | {
|
|
193
|
-
type: "THINKING_TEXT_MESSAGE_START";
|
|
194
|
-
timestamp?: number;
|
|
195
|
-
} | {
|
|
196
|
-
type: "THINKING_TEXT_MESSAGE_CONTENT";
|
|
197
|
-
delta: string;
|
|
198
|
-
} | {
|
|
199
|
-
type: "THINKING_TEXT_MESSAGE_END";
|
|
200
|
-
timestamp?: number;
|
|
201
|
-
} | {
|
|
202
|
-
type: "THINKING_END";
|
|
203
|
-
timestamp?: number;
|
|
204
187
|
} | {
|
|
205
188
|
type: "REASONING_START";
|
|
206
|
-
messageId
|
|
189
|
+
messageId: string;
|
|
207
190
|
subagentRunId?: string;
|
|
208
191
|
timestamp?: number;
|
|
209
192
|
} | {
|
|
210
193
|
type: "REASONING_MESSAGE_START";
|
|
211
|
-
messageId
|
|
194
|
+
messageId: string;
|
|
212
195
|
subagentRunId?: string;
|
|
213
196
|
timestamp?: number;
|
|
214
197
|
} | {
|
|
215
198
|
type: "REASONING_MESSAGE_CONTENT";
|
|
216
|
-
messageId
|
|
199
|
+
messageId: string;
|
|
217
200
|
delta: string;
|
|
218
201
|
subagentRunId?: string;
|
|
219
202
|
} | {
|
|
220
203
|
type: "REASONING_MESSAGE_END";
|
|
221
|
-
messageId
|
|
204
|
+
messageId: string;
|
|
222
205
|
subagentRunId?: string;
|
|
223
206
|
timestamp?: number;
|
|
224
207
|
} | {
|
|
@@ -229,7 +212,7 @@ export type AgUiEvent = {
|
|
|
229
212
|
subagentRunId?: string;
|
|
230
213
|
} | {
|
|
231
214
|
type: "REASONING_END";
|
|
232
|
-
messageId
|
|
215
|
+
messageId: string;
|
|
233
216
|
subagentRunId?: string;
|
|
234
217
|
timestamp?: number;
|
|
235
218
|
} | {
|
|
@@ -247,18 +230,11 @@ export type AgUiEvent = {
|
|
|
247
230
|
type: "TOOL_CALL_END";
|
|
248
231
|
toolCallId: string;
|
|
249
232
|
subagentRunId?: string;
|
|
250
|
-
} | {
|
|
251
|
-
type: "TOOL_CALL_CHUNK";
|
|
252
|
-
toolCallId?: string;
|
|
253
|
-
toolCallName?: string;
|
|
254
|
-
parentMessageId?: string;
|
|
255
|
-
delta?: string;
|
|
256
|
-
subagentRunId?: string;
|
|
257
233
|
} | {
|
|
258
234
|
type: "TOOL_CALL_RESULT";
|
|
259
235
|
messageId?: string;
|
|
260
236
|
toolCallId: string;
|
|
261
|
-
content: string;
|
|
237
|
+
content: string | ContentPart[];
|
|
262
238
|
role?: "tool";
|
|
263
239
|
mcpResult?: McpToolCallResult;
|
|
264
240
|
subagentRunId?: string;
|