@assistant-ui/react 0.15.2 → 0.15.4

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 (50) hide show
  1. package/dist/client/ExternalThread.d.ts.map +1 -1
  2. package/dist/client/ExternalThread.js +1 -0
  3. package/dist/client/ExternalThread.js.map +1 -1
  4. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  5. package/dist/client/InMemoryThreadList.js +199 -176
  6. package/dist/client/InMemoryThreadList.js.map +1 -1
  7. package/dist/client/SingleThreadList.d.ts.map +1 -1
  8. package/dist/client/SingleThreadList.js +56 -48
  9. package/dist/client/SingleThreadList.js.map +1 -1
  10. package/dist/legacy-runtime/cloud/auiV0.d.ts +2 -0
  11. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  12. package/dist/legacy-runtime/cloud/auiV0.js +6 -4
  13. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  14. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +6 -0
  15. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  16. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  17. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +20 -15
  18. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  19. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  20. package/dist/mcp-apps/McpAppRenderer.js +25 -14
  21. package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
  22. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -1
  23. package/dist/mcp-apps/McpAppsRemoteHost.js +17 -6
  24. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -1
  25. package/dist/primitives/message/MessagePartsGrouped.d.ts +6 -1
  26. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  27. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  28. package/dist/primitives/suggestion/SuggestionTrigger.d.ts +4 -2
  29. package/dist/primitives/suggestion/SuggestionTrigger.d.ts.map +1 -1
  30. package/dist/primitives/suggestion/SuggestionTrigger.js +21 -42
  31. package/dist/primitives/suggestion/SuggestionTrigger.js.map +1 -1
  32. package/dist/primitives/thread/ThreadSuggestion.d.ts +4 -2
  33. package/dist/primitives/thread/ThreadSuggestion.d.ts.map +1 -1
  34. package/dist/primitives/thread/ThreadSuggestion.js.map +1 -1
  35. package/package.json +6 -6
  36. package/src/client/ExternalThread.ts +1 -0
  37. package/src/client/InMemoryThreadList.ts +27 -7
  38. package/src/client/SingleThreadList.ts +10 -2
  39. package/src/legacy-runtime/cloud/auiV0.ts +8 -2
  40. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +6 -0
  41. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.test.tsx +31 -0
  42. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts +26 -17
  43. package/src/mcp-apps/McpAppRenderer.test.tsx +262 -3
  44. package/src/mcp-apps/McpAppRenderer.tsx +27 -15
  45. package/src/mcp-apps/McpAppsRemoteHost.ts +18 -9
  46. package/src/primitives/message/MessagePartsGrouped.tsx +6 -1
  47. package/src/primitives/suggestion/SuggestionTrigger.ts +11 -32
  48. package/src/primitives/thread/ThreadSuggestion.ts +2 -1
  49. package/src/tests/RemoteThreadListRuntime.reloadMainThread.test.tsx +115 -0
  50. package/src/tests/threadListItemIsRunning.test.tsx +198 -0
@@ -5,19 +5,21 @@ import { resource } from "@assistant-ui/tap";
5
5
  //#region src/client/SingleThreadList.ts
6
6
  const RESOLVED_PROMISE = Promise.resolve();
7
7
  const THREAD_ID = "default";
8
- const useSingleThreadListItem = () => {
9
- const $ = c(2);
8
+ const useSingleThreadListItem = (t0) => {
9
+ const $ = c(3);
10
+ const { isRunning } = t0;
10
11
  const [custom, setCustom] = useState();
11
- let t0;
12
- if ($[0] !== custom) {
13
- t0 = {
12
+ let t1;
13
+ if ($[0] !== custom || $[1] !== isRunning) {
14
+ t1 = {
14
15
  getState: () => ({
15
16
  id: THREAD_ID,
16
17
  remoteId: void 0,
17
18
  externalId: void 0,
18
19
  title: void 0,
19
20
  status: "regular",
20
- custom
21
+ custom,
22
+ isRunning
21
23
  }),
22
24
  switchTo: _temp,
23
25
  rename: _temp2,
@@ -30,9 +32,10 @@ const useSingleThreadListItem = () => {
30
32
  detach: _temp8
31
33
  };
32
34
  $[0] = custom;
33
- $[1] = t0;
34
- } else t0 = $[1];
35
- return t0;
35
+ $[1] = isRunning;
36
+ $[2] = t1;
37
+ } else t1 = $[2];
38
+ return t1;
36
39
  };
37
40
  const SingleThreadListItem = resource(useSingleThreadListItem);
38
41
  /**
@@ -41,34 +44,35 @@ const SingleThreadListItem = resource(useSingleThreadListItem);
41
44
  * Mounts the provided thread resource element.
42
45
  */
43
46
  const useSingleThreadList = (t0) => {
44
- const $ = c(18);
47
+ const $ = c(19);
45
48
  const { thread } = t0;
49
+ const threadClient = useClientResource(thread);
46
50
  let t1;
47
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
48
- t1 = SingleThreadListItem();
49
- $[0] = t1;
50
- } else t1 = $[0];
51
+ if ($[0] !== threadClient.state.isRunning) {
52
+ t1 = SingleThreadListItem({ isRunning: threadClient.state.isRunning });
53
+ $[0] = threadClient.state.isRunning;
54
+ $[1] = t1;
55
+ } else t1 = $[1];
51
56
  const itemClient = useClientResource(t1);
52
- const threadClient = useClientResource(thread);
53
57
  let t2;
54
58
  let t3;
55
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
59
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
56
60
  t2 = [THREAD_ID];
57
61
  t3 = [];
58
- $[1] = t2;
59
- $[2] = t3;
62
+ $[2] = t2;
63
+ $[3] = t3;
60
64
  } else {
61
- t2 = $[1];
62
- t3 = $[2];
65
+ t2 = $[2];
66
+ t3 = $[3];
63
67
  }
64
68
  let t4;
65
- if ($[3] !== itemClient.state) {
69
+ if ($[4] !== itemClient.state) {
66
70
  t4 = [itemClient.state];
67
- $[3] = itemClient.state;
68
- $[4] = t4;
69
- } else t4 = $[4];
71
+ $[4] = itemClient.state;
72
+ $[5] = t4;
73
+ } else t4 = $[5];
70
74
  let t5;
71
- if ($[5] !== t4 || $[6] !== threadClient.state) {
75
+ if ($[6] !== t4 || $[7] !== threadClient.state) {
72
76
  t5 = {
73
77
  mainThreadId: THREAD_ID,
74
78
  newThreadId: null,
@@ -80,52 +84,53 @@ const useSingleThreadList = (t0) => {
80
84
  threadItems: t4,
81
85
  main: threadClient.state
82
86
  };
83
- $[5] = t4;
84
- $[6] = threadClient.state;
85
- $[7] = t5;
86
- } else t5 = $[7];
87
+ $[6] = t4;
88
+ $[7] = threadClient.state;
89
+ $[8] = t5;
90
+ } else t5 = $[8];
87
91
  const state = t5;
88
92
  let t6;
89
- if ($[8] !== state) {
93
+ if ($[9] !== state) {
90
94
  t6 = () => state;
91
- $[8] = state;
92
- $[9] = t6;
93
- } else t6 = $[9];
95
+ $[9] = state;
96
+ $[10] = t6;
97
+ } else t6 = $[10];
94
98
  let t7;
95
- if ($[10] !== itemClient.methods) {
99
+ if ($[11] !== itemClient.methods) {
96
100
  t7 = (selector) => {
97
101
  if (selector !== "main" && !(typeof selector === "object" && "id" in selector && selector.id === THREAD_ID) && !(typeof selector === "object" && "index" in selector && selector.index === 0)) throw new Error(`SingleThreadList: unknown item selector ${JSON.stringify(selector)}`);
98
102
  return itemClient.methods;
99
103
  };
100
- $[10] = itemClient.methods;
101
- $[11] = t7;
102
- } else t7 = $[11];
104
+ $[11] = itemClient.methods;
105
+ $[12] = t7;
106
+ } else t7 = $[12];
103
107
  let t8;
104
- if ($[12] !== threadClient.methods) {
108
+ if ($[13] !== threadClient.methods) {
105
109
  t8 = (selector_0) => {
106
110
  if (selector_0 !== "main" && selector_0 !== THREAD_ID) throw new Error(`SingleThreadList: unknown thread selector ${JSON.stringify(selector_0)}`);
107
111
  return threadClient.methods;
108
112
  };
109
- $[12] = threadClient.methods;
110
- $[13] = t8;
111
- } else t8 = $[13];
113
+ $[13] = threadClient.methods;
114
+ $[14] = t8;
115
+ } else t8 = $[14];
112
116
  let t9;
113
- if ($[14] !== t6 || $[15] !== t7 || $[16] !== t8) {
117
+ if ($[15] !== t6 || $[16] !== t7 || $[17] !== t8) {
114
118
  t9 = {
115
119
  getState: t6,
116
120
  switchToThread: _temp9,
117
121
  switchToNewThread: _temp0,
118
122
  getLoadThreadsPromise: _temp1,
119
123
  reload: _temp10,
120
- loadMore: _temp11,
124
+ reloadMainThread: _temp11,
125
+ loadMore: _temp12,
121
126
  item: t7,
122
127
  thread: t8
123
128
  };
124
- $[14] = t6;
125
- $[15] = t7;
126
- $[16] = t8;
127
- $[17] = t9;
128
- } else t9 = $[17];
129
+ $[15] = t6;
130
+ $[16] = t7;
131
+ $[17] = t8;
132
+ $[18] = t9;
133
+ } else t9 = $[18];
129
134
  return t9;
130
135
  };
131
136
  const SingleThreadList = resource(useSingleThreadList);
@@ -157,6 +162,9 @@ function _temp10() {
157
162
  function _temp11() {
158
163
  return RESOLVED_PROMISE;
159
164
  }
165
+ function _temp12() {
166
+ return RESOLVED_PROMISE;
167
+ }
160
168
  //#endregion
161
169
  export { SingleThreadList };
162
170
 
@@ -1 +1 @@
1
- {"version":3,"file":"SingleThreadList.js","names":["useMemo","useState","resource","ClientElement","ClientOutput","useClientResource","RESOLVED_PROMISE","Promise","resolve","THREAD_ID","useSingleThreadListItem","$","_c","custom","setCustom","t0","getState","id","remoteId","undefined","externalId","title","status","switchTo","_temp","rename","_temp2","updateCustom","archive","_temp3","unarchive","_temp4","delete","_temp5","generateTitle","_temp6","initialize","_temp7","detach","_temp8","SingleThreadListItem","SingleThreadListProps","thread","useSingleThreadList","t1","Symbol","for","itemClient","threadClient","t2","t3","t4","state","t5","mainThreadId","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t6","t7","methods","selector","index","Error","JSON","stringify","t8","selector_0","t9","switchToThread","_temp9","switchToNewThread","_temp0","getLoadThreadsPromise","_temp1","reload","_temp10","loadMore","_temp11","item","SingleThreadList"],"sources":["../../src/client/SingleThreadList.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n type ClientElement,\n type ClientOutput,\n useClientResource,\n} from \"@assistant-ui/store\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\nconst THREAD_ID = \"default\";\n\nconst useSingleThreadListItem = (): ClientOutput<\"threadListItem\"> => {\n const [custom, setCustom] = useState<Record<string, unknown> | undefined>();\n\n return {\n getState: () => ({\n id: THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n status: \"regular\",\n custom,\n }),\n switchTo: () => {},\n rename: () => {},\n updateCustom: setCustom,\n archive: () => {},\n unarchive: () => {},\n delete: () => {},\n generateTitle: () => {},\n initialize: async () => ({ remoteId: THREAD_ID, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst SingleThreadListItem = resource(useSingleThreadListItem);\n\ntype SingleThreadListProps = {\n thread: ClientElement<\"thread\">;\n};\n\n/**\n * A minimal threads scope that wraps a single thread.\n * Automatically provided by ExternalThread when no threads scope exists.\n * Mounts the provided thread resource element.\n */\nconst useSingleThreadList = ({\n thread,\n}: SingleThreadListProps): ClientOutput<\"threads\"> => {\n const itemClient = useClientResource(SingleThreadListItem());\n const threadClient = useClientResource(thread);\n\n const state = useMemo(\n () => ({\n mainThreadId: THREAD_ID,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: [THREAD_ID],\n archivedThreadIds: [],\n threadItems: [itemClient.state],\n main: threadClient.state,\n }),\n [itemClient.state, threadClient.state],\n );\n\n return {\n getState: () => state,\n switchToThread: () => {\n throw new Error(\"SingleThreadList does not support switchToThread\");\n },\n switchToNewThread: () => {\n throw new Error(\"SingleThreadList does not support switchToNewThread\");\n },\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (\n selector !== \"main\" &&\n !(\n typeof selector === \"object\" &&\n \"id\" in selector &&\n selector.id === THREAD_ID\n ) &&\n !(\n typeof selector === \"object\" &&\n \"index\" in selector &&\n selector.index === 0\n )\n ) {\n throw new Error(\n `SingleThreadList: unknown item selector ${JSON.stringify(selector)}`,\n );\n }\n return itemClient.methods;\n },\n thread: (selector) => {\n if (selector !== \"main\" && selector !== THREAD_ID) {\n throw new Error(\n `SingleThreadList: unknown thread selector ${JSON.stringify(selector)}`,\n );\n }\n return threadClient.methods;\n },\n };\n};\n\nexport const SingleThreadList = resource(useSingleThreadList);\n"],"mappings":";;;;;AAQA,MAAMM,mBAAmBC,QAAQC,QAAQ;AACzC,MAAMC,YAAY;AAElB,MAAMC,gCAA0B;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAC9B,MAAA,CAAAC,QAAAC,aAA4Bb,SAA8C;CAAE,IAAAc;CAAA,IAAAJ,EAAA,OAAAE,QAAA;EAErEE,KAAA;GAAAC,iBACY;IAAAC,IACXR;IAASS,UACHC,KAAAA;IAASC,YACPD,KAAAA;IAASE,OACdF,KAAAA;IAASG,QACR;IAAST;GAEnB;GAAEU,UACQC;GAAQC,QACVC;GAAQC,cACFb;GAASc,SACdC;GAAQC,WACNC;GAAQC,QACXC;GAAQC,eACDC;GAAQC,YACXC;GAA4DC,QAChEC;EACV;EAAC5B,EAAA,KAAAE;EAAAF,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,OAlBMI;AAkBN;AAGH,MAAMyB,uBAAuBtC,SAASQ,uBAAuB;;;;;;AAW7D,MAAMiC,uBAAsB5B,OAAA;CAAA,MAAAJ,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAA8B,WAAA3B;CAEL,IAAA6B;CAAA,IAAAjC,EAAA,OAAAkC,OAAAC,IAAA,2BAAA,GAAA;EACeF,KAAAJ,qBAAqB;EAAC7B,EAAA,KAAAiC;CAAA,OAAAA,KAAAjC,EAAA;CAA3D,MAAAoC,aAAmB1C,kBAAkBuC,EAAsB;CAC3D,MAAAI,eAAqB3C,kBAAkBqC,MAAM;CAAE,IAAAO;CAAA,IAAAC;CAAA,IAAAvC,EAAA,OAAAkC,OAAAC,IAAA,2BAAA,GAAA;EAShCG,KAAA,CAACxC,SAAS;EACFyC,KAAA,CAAA;EAAEvC,EAAA,KAAAsC;EAAAtC,EAAA,KAAAuC;CAAA,OAAA;EAAAD,KAAAtC,EAAA;EAAAuC,KAAAvC,EAAA;CAAA;CAAA,IAAAwC;CAAA,IAAAxC,EAAA,OAAAoC,WAAAK,OAAA;EACRD,KAAA,CAACJ,WAAUK,KAAM;EAACzC,EAAA,KAAAoC,WAAAK;EAAAzC,EAAA,KAAAwC;CAAA,OAAAA,KAAAxC,EAAA;CAAA,IAAA0C;CAAA,IAAA1C,EAAA,OAAAwC,MAAAxC,EAAA,OAAAqC,aAAAI,OAAA;EAR1BC,KAAA;GAAAC,cACS7C;GAAS8C,aACV;GAAIC,WACN;GAAKC,eACD;GAAKC,SACX;GAAKC,WACHV;GAAWW,mBACHV;GAAEW,aACRV;GAAkBW,MACzBd,aAAYI;EACpB;EAACzC,EAAA,KAAAwC;EAAAxC,EAAA,KAAAqC,aAAAI;EAAAzC,EAAA,KAAA0C;CAAA,OAAAA,KAAA1C,EAAA;CAXH,MAAAyC,QACSC;CAYP,IAAAU;CAAA,IAAApD,EAAA,OAAAyC,OAAA;EAGUW,WAAMX;EAAKzC,EAAA,KAAAyC;EAAAzC,EAAA,KAAAoD;CAAA,OAAAA,KAAApD,EAAA;CAAA,IAAAqD;CAAA,IAAArD,EAAA,QAAAoC,WAAAkB,SAAA;EAUfD,MAAAE,aAAA;GACJ,IACEA,aAAa,UAAb,EAEE,OAAOA,aAAa,YACpB,QAAQA,YACRA,SAAQjD,OAAQR,cAJlB,EAOE,OAAOyD,aAAa,YACpB,WAAWA,YACXA,SAAQC,UAAW,IAGrB,MAAM,IAAIC,MACR,2CAA2CC,KAAIC,UAAWJ,QAAQ,GACpE;GACD,OACMnB,WAAUkB;EAAQ;EAC1BtD,EAAA,MAAAoC,WAAAkB;EAAAtD,EAAA,MAAAqD;CAAA,OAAAA,KAAArD,EAAA;CAAA,IAAA4D;CAAA,IAAA5D,EAAA,QAAAqC,aAAAiB,SAAA;EACOM,MAAAC,eAAA;GACN,IAAIN,eAAa,UAAUA,eAAazD,WACtC,MAAM,IAAI2D,MACR,6CAA6CC,KAAIC,UAAWJ,UAAQ,GACtE;GACD,OACMlB,aAAYiB;EAAQ;EAC5BtD,EAAA,MAAAqC,aAAAiB;EAAAtD,EAAA,MAAA4D;CAAA,OAAAA,KAAA5D,EAAA;CAAA,IAAA8D;CAAA,IAAA9D,EAAA,QAAAoD,MAAApD,EAAA,QAAAqD,MAAArD,EAAA,QAAA4D,IAAA;EAtCIE,KAAA;GAAAzD,UACK+C;GAAWW,gBACLC;GAEfC,mBACkBC;GAElBC,uBACsBC;GAAsBC,QACrCC;GAAsBC,UACpBC;GAAsBC,MAC1BpB;GAmBLtB,QACO6B;EAQV;EAAC5D,EAAA,MAAAoD;EAAApD,EAAA,MAAAqD;EAAArD,EAAA,MAAA4D;EAAA5D,EAAA,MAAA8D;CAAA,OAAAA,KAAA9D,EAAA;CAAA,OAvCM8D;AAuCN;AAGH,MAAaY,mBAAmBnF,SAASyC,mBAAmB;AAlG5B,SAAAnB,QAAA,CAAA;AAAA,SAAAE,SAAA,CAAA;AAAA,SAAAG,SAAA,CAAA;AAAA,SAAAE,SAAA,CAAA;AAAA,SAAAE,SAAA,CAAA;AAAA,SAAAE,SAAA,CAAA;AAAA,eAAAE,SAAA;CAAA,OAmBH;EAAAnB,UAAYT;EAASW,YAAcD,KAAAA;CAAU;AAAC;AAnB3C,SAAAoB,SAAA,CAAA;AAmCJ,SAAAoC,SAAA;CAwBtB,MAAM,IAAIP,MAAM,kDAAkD;AAAE;AAxB9C,SAAAS,SAAA;CA2BtB,MAAM,IAAIT,MAAM,qDAAqD;AAAE;AA3BjD,SAAAW,SAAA;CAAA,OA6BKzE;AAAgB;AA7BrB,SAAA2E,UAAA;CAAA,OA8BV3E;AAAgB;AA9BN,SAAA6E,UAAA;CAAA,OA+BR7E;AAAgB"}
1
+ {"version":3,"file":"SingleThreadList.js","names":["useMemo","useState","resource","ClientElement","ClientOutput","useClientResource","RESOLVED_PROMISE","Promise","resolve","THREAD_ID","useSingleThreadListItem","t0","$","_c","isRunning","custom","setCustom","t1","getState","id","remoteId","undefined","externalId","title","status","switchTo","_temp","rename","_temp2","updateCustom","archive","_temp3","unarchive","_temp4","delete","_temp5","generateTitle","_temp6","initialize","_temp7","detach","_temp8","SingleThreadListItem","SingleThreadListProps","thread","useSingleThreadList","threadClient","state","itemClient","t2","t3","Symbol","for","t4","t5","mainThreadId","newThreadId","isLoading","isLoadingMore","hasMore","threadIds","archivedThreadIds","threadItems","main","t6","t7","methods","selector","index","Error","JSON","stringify","t8","selector_0","t9","switchToThread","_temp9","switchToNewThread","_temp0","getLoadThreadsPromise","_temp1","reload","_temp10","reloadMainThread","_temp11","loadMore","_temp12","item","SingleThreadList"],"sources":["../../src/client/SingleThreadList.ts"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport {\n type ClientElement,\n type ClientOutput,\n useClientResource,\n} from \"@assistant-ui/store\";\n\nconst RESOLVED_PROMISE = Promise.resolve();\nconst THREAD_ID = \"default\";\n\nconst useSingleThreadListItem = ({\n isRunning,\n}: {\n isRunning: boolean;\n}): ClientOutput<\"threadListItem\"> => {\n const [custom, setCustom] = useState<Record<string, unknown> | undefined>();\n\n return {\n getState: () => ({\n id: THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n status: \"regular\",\n custom,\n isRunning,\n }),\n switchTo: () => {},\n rename: () => {},\n updateCustom: setCustom,\n archive: () => {},\n unarchive: () => {},\n delete: () => {},\n generateTitle: () => {},\n initialize: async () => ({ remoteId: THREAD_ID, externalId: undefined }),\n detach: () => {},\n };\n};\n\nconst SingleThreadListItem = resource(useSingleThreadListItem);\n\ntype SingleThreadListProps = {\n thread: ClientElement<\"thread\">;\n};\n\n/**\n * A minimal threads scope that wraps a single thread.\n * Automatically provided by ExternalThread when no threads scope exists.\n * Mounts the provided thread resource element.\n */\nconst useSingleThreadList = ({\n thread,\n}: SingleThreadListProps): ClientOutput<\"threads\"> => {\n const threadClient = useClientResource(thread);\n const itemClient = useClientResource(\n SingleThreadListItem({ isRunning: threadClient.state.isRunning }),\n );\n\n const state = useMemo(\n () => ({\n mainThreadId: THREAD_ID,\n newThreadId: null,\n isLoading: false,\n isLoadingMore: false,\n hasMore: false,\n threadIds: [THREAD_ID],\n archivedThreadIds: [],\n threadItems: [itemClient.state],\n main: threadClient.state,\n }),\n [itemClient.state, threadClient.state],\n );\n\n return {\n getState: () => state,\n switchToThread: () => {\n throw new Error(\"SingleThreadList does not support switchToThread\");\n },\n switchToNewThread: () => {\n throw new Error(\"SingleThreadList does not support switchToNewThread\");\n },\n getLoadThreadsPromise: () => RESOLVED_PROMISE,\n reload: () => RESOLVED_PROMISE,\n reloadMainThread: () => RESOLVED_PROMISE,\n loadMore: () => RESOLVED_PROMISE,\n item: (selector) => {\n if (\n selector !== \"main\" &&\n !(\n typeof selector === \"object\" &&\n \"id\" in selector &&\n selector.id === THREAD_ID\n ) &&\n !(\n typeof selector === \"object\" &&\n \"index\" in selector &&\n selector.index === 0\n )\n ) {\n throw new Error(\n `SingleThreadList: unknown item selector ${JSON.stringify(selector)}`,\n );\n }\n return itemClient.methods;\n },\n thread: (selector) => {\n if (selector !== \"main\" && selector !== THREAD_ID) {\n throw new Error(\n `SingleThreadList: unknown thread selector ${JSON.stringify(selector)}`,\n );\n }\n return threadClient.methods;\n },\n };\n};\n\nexport const SingleThreadList = resource(useSingleThreadList);\n"],"mappings":"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"}
@@ -57,6 +57,7 @@ type AuiV0MessagePart = {
57
57
  readonly data: string;
58
58
  readonly mimeType: string;
59
59
  readonly filename?: string;
60
+ readonly sourceType?: "url" | "id";
60
61
  };
61
62
  type AuiV0AttachmentPart = {
62
63
  readonly type: "text";
@@ -70,6 +71,7 @@ type AuiV0AttachmentPart = {
70
71
  readonly data: string;
71
72
  readonly mimeType: string;
72
73
  readonly filename?: string;
74
+ readonly sourceType?: "url" | "id";
73
75
  } | {
74
76
  readonly type: "audio";
75
77
  readonly audio: {
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"mappings":";;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBAwEL,YAAY,SAAS,gBAAgB;iBA6FrC,YACd,cAAc;EAAiB;IAC9B"}
1
+ {"version":3,"file":"auiV0.d.ts","names":[],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"mappings":";;;;;KAgBK;WACM;WACA;WACA;WACA;WACA,mBAAmB;WACnB;WACA;;KAGN;WAEU;WACA;;WAGA;WACA;;WAGA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA;WACA;WACA;WACA,mBAAmB;;WAGnB;WACA;WACA;WACA,MAAM;WACN,SAAS;WACT;WACA,WAAW;;WAGX;WACA;WACA;WACA;WACA,SAAS;WACT;WACA,WAAW;;WAGX;WACA;;WAGA;WACA;WACA;WACA;WACA;;KAGV;WAEU;WACA;;WAGA;WACA;WACA;;WAGA;WACA;WACA;WACA;WACA;;WAGA;WACA;aACE;aACA;;;WAIF;WACA;WACA,MAAM;;KAGhB;WACM;WACA,MAAM;WACN;WACA;WACA,QAAQ;WACR,kBAAkB;;KAGxB;WACM;WACA,SAAS;WACT,kBAAkB;WAClB,uBAAuB;WACvB;aACE,iBAAiB;aACjB,+BAA+B;aAC/B,wBAAwB;aACxB;eACE;iBACE;iBACA;;;aAGJ,QAAQ;;;iBA2EL,YAAY,SAAS,gBAAgB;iBA8FrC,YACd,cAAc;EAAiB;IAC9B"}
@@ -17,7 +17,8 @@ const encodeAttachmentPart = (part) => {
17
17
  type: "file",
18
18
  data: part.data,
19
19
  mimeType: part.mimeType,
20
- ...part.filename != null ? { filename: part.filename } : void 0
20
+ ...part.filename != null ? { filename: part.filename } : void 0,
21
+ ...part.sourceType != null ? { sourceType: part.sourceType } : void 0
21
22
  };
22
23
  case "audio": return {
23
24
  type: "audio",
@@ -85,13 +86,13 @@ function auiV0Encode(message) {
85
86
  ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
86
87
  };
87
88
  case "tool-call":
88
- if (!isJSONValue(part.result)) console.warn(`tool-call result is not JSON! ${JSON.stringify(part)}`);
89
+ if (part.result !== void 0 && !isJSONValue(part.result)) console.warn(`tool-call result is not JSON! ${JSON.stringify(part)}`);
89
90
  return {
90
91
  type: "tool-call",
91
92
  toolCallId: part.toolCallId,
92
93
  toolName: part.toolName,
93
94
  ...JSON.stringify(part.args) === part.argsText ? { args: part.args } : { argsText: part.argsText },
94
- ...part.result ? { result: part.result } : void 0,
95
+ ...part.result !== void 0 ? { result: part.result } : void 0,
95
96
  ...part.isError ? { isError: true } : void 0,
96
97
  ...part.approval ? { approval: part.approval } : void 0
97
98
  };
@@ -103,7 +104,8 @@ function auiV0Encode(message) {
103
104
  type: "file",
104
105
  data: part.data,
105
106
  mimeType: part.mimeType,
106
- ...part.filename ? { filename: part.filename } : void 0
107
+ ...part.filename ? { filename: part.filename } : void 0,
108
+ ...part.sourceType ? { sourceType: part.sourceType } : void 0
107
109
  };
108
110
  default: throw new Error(`Message part type not supported by aui/v0: ${type}`);
109
111
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auiV0.js","names":["CompleteAttachment","MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalOption","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","AuiV0AttachmentPart","audio","format","name","AuiV0Attachment","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","undefined","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","map","auiV0Encode","auiV0Decode","cloudMessage","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"sourcesContent":["import type {\n CompleteAttachment,\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n ToolApprovalOption,\n} from \"@assistant-ui/core\";\nimport { fromThreadMessageLike } from \"../runtime-cores/external-store/ThreadMessageLike\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"@assistant-ui/core/internal\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../runtime-cores/utils/MessageRepository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n };\n\ntype AuiV0AttachmentPart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"audio\";\n readonly audio: {\n readonly data: string;\n readonly format: \"mp3\" | \"wav\";\n };\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"image\":\n return {\n type: \"image\",\n image: part.image,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"audio\":\n return {\n type: \"audio\",\n audio: { data: part.audio.data, format: part.audio.format },\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return { type: \"reasoning\", text: part.text };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (!isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n };\n\n default: {\n const unhandledType: \"audio\" | \"data\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auiV0.js","names":["CompleteAttachment","MessageStatus","SourceProviderMetadata","ThreadMessage","ToolApprovalOption","fromThreadMessageLike","CloudMessage","isJSONValue","ReadonlyJSONObject","ReadonlyJSONValue","ExportedMessageRepositoryItem","AuiV0ToolApproval","id","approved","reason","isAutomatic","options","optionId","resolution","AuiV0MessagePart","type","text","sourceType","url","title","providerMetadata","mediaType","filename","toolCallId","toolName","args","result","isError","approval","argsText","image","data","mimeType","AuiV0AttachmentPart","audio","format","name","AuiV0Attachment","contentType","status","content","AuiV0Message","role","attachments","metadata","unstable_state","unstable_annotations","unstable_data","steps","usage","inputTokens","outputTokens","custom","encodeAttachmentPart","part","undefined","console","warn","JSON","stringify","unhandledType","Error","encodeAttachments","message","length","map","auiV0Encode","auiV0Decode","cloudMessage","payload","createdAt","created_at","parentId","parent_id"],"sources":["../../../src/legacy-runtime/cloud/auiV0.ts"],"sourcesContent":["import type {\n CompleteAttachment,\n MessageStatus,\n SourceProviderMetadata,\n ThreadMessage,\n ToolApprovalOption,\n} from \"@assistant-ui/core\";\nimport { fromThreadMessageLike } from \"../runtime-cores/external-store/ThreadMessageLike\";\nimport type { CloudMessage } from \"assistant-cloud\";\nimport { isJSONValue } from \"@assistant-ui/core/internal\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"assistant-stream/utils\";\nimport type { ExportedMessageRepositoryItem } from \"../runtime-cores/utils/MessageRepository\";\n\ntype AuiV0ToolApproval = {\n readonly id: string;\n readonly approved?: boolean;\n readonly reason?: string;\n readonly isAutomatic?: boolean;\n readonly options?: readonly ToolApprovalOption[];\n readonly optionId?: string;\n readonly resolution?: \"cancelled\" | \"expired\";\n};\n\ntype AuiV0MessagePart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"reasoning\";\n readonly text: string;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"url\";\n readonly id: string;\n readonly url: string;\n readonly title?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"source\";\n readonly sourceType: \"document\";\n readonly id: string;\n readonly title: string;\n readonly mediaType: string;\n readonly filename?: string;\n readonly providerMetadata?: SourceProviderMetadata;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly args: ReadonlyJSONObject;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"tool-call\";\n readonly toolCallId: string;\n readonly toolName: string;\n readonly argsText: string;\n readonly result?: ReadonlyJSONValue;\n readonly isError?: true;\n readonly approval?: AuiV0ToolApproval;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n };\n\ntype AuiV0AttachmentPart =\n | {\n readonly type: \"text\";\n readonly text: string;\n }\n | {\n readonly type: \"image\";\n readonly image: string;\n readonly filename?: string;\n }\n | {\n readonly type: \"file\";\n readonly data: string;\n readonly mimeType: string;\n readonly filename?: string;\n readonly sourceType?: \"url\" | \"id\";\n }\n | {\n readonly type: \"audio\";\n readonly audio: {\n readonly data: string;\n readonly format: \"mp3\" | \"wav\";\n };\n }\n | {\n readonly type: \"data\";\n readonly name: string;\n readonly data: ReadonlyJSONValue;\n };\n\ntype AuiV0Attachment = {\n readonly id: string;\n readonly type: CompleteAttachment[\"type\"];\n readonly name: string;\n readonly contentType?: string;\n readonly status: CompleteAttachment[\"status\"];\n readonly content: readonly AuiV0AttachmentPart[];\n};\n\ntype AuiV0Message = {\n readonly role: \"assistant\" | \"user\" | \"system\";\n readonly status?: MessageStatus;\n readonly content: readonly AuiV0MessagePart[];\n readonly attachments?: readonly AuiV0Attachment[];\n readonly metadata: {\n readonly unstable_state?: ReadonlyJSONValue;\n readonly unstable_annotations: readonly ReadonlyJSONValue[];\n readonly unstable_data: readonly ReadonlyJSONValue[];\n readonly steps: readonly {\n readonly usage?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n };\n }[];\n readonly custom: ReadonlyJSONObject;\n };\n};\n\nconst encodeAttachmentPart = (\n part: CompleteAttachment[\"content\"][number],\n): AuiV0AttachmentPart => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"image\":\n return {\n type: \"image\",\n image: part.image,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.sourceType != null\n ? { sourceType: part.sourceType }\n : undefined),\n };\n\n case \"audio\":\n return {\n type: \"audio\",\n audio: { data: part.audio.data, format: part.audio.format },\n };\n\n case \"data\": {\n if (!isJSONValue(part.data)) {\n console.warn(`attachment data is not JSON! ${JSON.stringify(part)}`);\n }\n return {\n type: \"data\",\n name: part.name,\n data: part.data as ReadonlyJSONValue,\n };\n }\n\n default: {\n const unhandledType: never = type;\n throw new Error(\n `Attachment part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n};\n\nconst encodeAttachments = (\n message: ThreadMessage,\n): readonly AuiV0Attachment[] | undefined => {\n if (message.role !== \"user\" || message.attachments.length === 0) {\n return undefined;\n }\n\n return message.attachments.map(\n ({ id, type, name, contentType, status, content }) => ({\n id,\n type,\n name,\n status,\n ...(contentType != null ? { contentType } : undefined),\n content: content.map(encodeAttachmentPart),\n }),\n );\n};\n\nexport function auiV0Encode(message: ThreadMessage): AuiV0Message {\n // info: ID and createdAt are ignored (we use the server value instead)\n const status: MessageStatus | undefined =\n message.status?.type === \"running\"\n ? { type: \"incomplete\", reason: \"cancelled\" }\n : message.status;\n const attachments = encodeAttachments(message);\n\n return {\n role: message.role,\n content: message.content.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n\n case \"reasoning\":\n return { type: \"reasoning\", text: part.text };\n\n case \"source\":\n if (part.sourceType === \"url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.id,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n }\n\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.id,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null\n ? { filename: part.filename }\n : undefined),\n ...(part.providerMetadata != null\n ? { providerMetadata: part.providerMetadata }\n : undefined),\n };\n\n case \"tool-call\": {\n if (part.result !== undefined && !isJSONValue(part.result)) {\n console.warn(\n `tool-call result is not JSON! ${JSON.stringify(part)}`,\n );\n }\n return {\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n ...(JSON.stringify(part.args) === part.argsText\n ? { args: part.args }\n : { argsText: part.argsText }),\n ...(part.result !== undefined\n ? { result: part.result as ReadonlyJSONValue }\n : undefined),\n ...(part.isError ? { isError: true } : undefined),\n ...(part.approval ? { approval: part.approval } : undefined),\n };\n }\n\n case \"image\":\n return { type: \"image\", image: part.image };\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : undefined),\n ...(part.sourceType ? { sourceType: part.sourceType } : undefined),\n };\n\n default: {\n const unhandledType: \"audio\" | \"data\" | \"generative-ui\" = type;\n throw new Error(\n `Message part type not supported by aui/v0: ${unhandledType}`,\n );\n }\n }\n }),\n metadata: message.metadata as AuiV0Message[\"metadata\"],\n ...(status ? { status } : undefined),\n ...(attachments ? { attachments } : undefined),\n };\n}\n\nexport function auiV0Decode(\n cloudMessage: CloudMessage & { format: \"aui/v0\" },\n): ExportedMessageRepositoryItem {\n const payload = cloudMessage.content as unknown as AuiV0Message;\n const message = fromThreadMessageLike(\n {\n id: cloudMessage.id,\n createdAt: cloudMessage.created_at,\n ...payload,\n },\n cloudMessage.id,\n { type: \"complete\", reason: \"unknown\" },\n );\n\n return {\n parentId: cloudMessage.parent_id,\n message,\n };\n}\n"],"mappings":";;;AA4IA,MAAM0D,wBACJC,SACwB;CACxB,MAAMvC,OAAOuC,KAAKvC;CAClB,QAAQA,MAAR;EACE,KAAK,QACH,OAAO;GAAEA,MAAM;GAAQC,MAAMsC,KAAKtC;EAAK;EAEzC,KAAK,SACH,OAAO;GACLD,MAAM;GACNe,OAAOwB,KAAKxB;GACZ,GAAIwB,KAAKhC,YAAY,OAAO,EAAEA,UAAUgC,KAAKhC,SAAS,IAAIiC,KAAAA;EAC5D;EAEF,KAAK,QACH,OAAO;GACLxC,MAAM;GACNgB,MAAMuB,KAAKvB;GACXC,UAAUsB,KAAKtB;GACf,GAAIsB,KAAKhC,YAAY,OAAO,EAAEA,UAAUgC,KAAKhC,SAAS,IAAIiC,KAAAA;GAC1D,GAAID,KAAKrC,cAAc,OACnB,EAAEA,YAAYqC,KAAKrC,WAAW,IAC9BsC,KAAAA;EACN;EAEF,KAAK,SACH,OAAO;GACLxC,MAAM;GACNmB,OAAO;IAAEH,MAAMuB,KAAKpB,MAAMH;IAAMI,QAAQmB,KAAKpB,MAAMC;GAAO;EAC5D;EAEF,KAAK;GACH,IAAI,CAACjC,YAAYoD,KAAKvB,IAAI,GACxByB,QAAQC,KAAK,gCAAgCC,KAAKC,UAAUL,IAAI,GAAG;GAErE,OAAO;IACLvC,MAAM;IACNqB,MAAMkB,KAAKlB;IACXL,MAAMuB,KAAKvB;GACb;EAGF,SAEE,MAAM,IAAI8B,MACR,iDAAiDD,MACnD;CAEJ;AACF;AAEA,MAAME,qBACJC,YAC2C;CAC3C,IAAIA,QAAQrB,SAAS,UAAUqB,QAAQpB,YAAYqB,WAAW,GAC5D;CAGF,OAAOD,QAAQpB,YAAYsB,KACxB,EAAE1D,IAAIQ,MAAMqB,MAAME,aAAaC,QAAQC,eAAe;EACrDjC;EACAQ;EACAqB;EACAG;EACA,GAAID,eAAe,OAAO,EAAEA,YAAY,IAAIiB,KAAAA;EAC5Cf,SAASA,QAAQyB,IAAIZ,oBAAoB;CAC3C,EACF;AACF;AAEA,SAAgBa,YAAYH,SAAsC;CAEhE,MAAMxB,SACJwB,QAAQxB,QAAQxB,SAAS,YACrB;EAAEA,MAAM;EAAcN,QAAQ;CAAY,IAC1CsD,QAAQxB;CACd,MAAMI,cAAcmB,kBAAkBC,OAAO;CAE7C,OAAO;EACLrB,MAAMqB,QAAQrB;EACdF,SAASuB,QAAQvB,QAAQyB,KAAKX,SAAS;GACrC,MAAMvC,OAAOuC,KAAKvC;GAClB,QAAQA,MAAR;IACE,KAAK,QACH,OAAO;KAAEA,MAAM;KAAQC,MAAMsC,KAAKtC;IAAK;IAEzC,KAAK,aACH,OAAO;KAAED,MAAM;KAAaC,MAAMsC,KAAKtC;IAAK;IAE9C,KAAK;KACH,IAAIsC,KAAKrC,eAAe,OACtB,OAAO;MACLF,MAAM;MACNE,YAAY;MACZV,IAAI+C,KAAK/C;MACTW,KAAKoC,KAAKpC;MACV,GAAIoC,KAAKnC,SAAS,OAAO,EAAEA,OAAOmC,KAAKnC,MAAM,IAAIoC,KAAAA;MACjD,GAAID,KAAKlC,oBAAoB,OACzB,EAAEA,kBAAkBkC,KAAKlC,iBAAiB,IAC1CmC,KAAAA;KACN;KAGF,OAAO;MACLxC,MAAM;MACNE,YAAY;MACZV,IAAI+C,KAAK/C;MACTY,OAAOmC,KAAKnC;MACZE,WAAWiC,KAAKjC;MAChB,GAAIiC,KAAKhC,YAAY,OACjB,EAAEA,UAAUgC,KAAKhC,SAAS,IAC1BiC,KAAAA;MACJ,GAAID,KAAKlC,oBAAoB,OACzB,EAAEA,kBAAkBkC,KAAKlC,iBAAiB,IAC1CmC,KAAAA;KACN;IAEF,KAAK;KACH,IAAID,KAAK5B,WAAW6B,KAAAA,KAAa,CAACrD,YAAYoD,KAAK5B,MAAM,GACvD8B,QAAQC,KACN,iCAAiCC,KAAKC,UAAUL,IAAI,GACtD;KAEF,OAAO;MACLvC,MAAM;MACNQ,YAAY+B,KAAK/B;MACjBC,UAAU8B,KAAK9B;MACf,GAAIkC,KAAKC,UAAUL,KAAK7B,IAAI,MAAM6B,KAAKzB,WACnC,EAAEJ,MAAM6B,KAAK7B,KAAK,IAClB,EAAEI,UAAUyB,KAAKzB,SAAS;MAC9B,GAAIyB,KAAK5B,WAAW6B,KAAAA,IAChB,EAAE7B,QAAQ4B,KAAK5B,OAA4B,IAC3C6B,KAAAA;MACJ,GAAID,KAAK3B,UAAU,EAAEA,SAAS,KAAK,IAAI4B,KAAAA;MACvC,GAAID,KAAK1B,WAAW,EAAEA,UAAU0B,KAAK1B,SAAS,IAAI2B,KAAAA;KACpD;IAGF,KAAK,SACH,OAAO;KAAExC,MAAM;KAASe,OAAOwB,KAAKxB;IAAM;IAE5C,KAAK,QACH,OAAO;KACLf,MAAM;KACNgB,MAAMuB,KAAKvB;KACXC,UAAUsB,KAAKtB;KACf,GAAIsB,KAAKhC,WAAW,EAAEA,UAAUgC,KAAKhC,SAAS,IAAIiC,KAAAA;KAClD,GAAID,KAAKrC,aAAa,EAAEA,YAAYqC,KAAKrC,WAAW,IAAIsC,KAAAA;IAC1D;IAEF,SAEE,MAAM,IAAIM,MACR,8CAA8CD,MAChD;GAEJ;EACF,CAAC;EACDhB,UAAUmB,QAAQnB;EAClB,GAAIL,SAAS,EAAEA,OAAO,IAAIgB,KAAAA;EAC1B,GAAIZ,cAAc,EAAEA,YAAY,IAAIY,KAAAA;CACtC;AACF;AAEA,SAAgBY,YACdC,cAC+B;CAC/B,MAAMC,UAAUD,aAAa5B;CAC7B,MAAMuB,UAAU/D,sBACd;EACEO,IAAI6D,aAAa7D;EACjB+D,WAAWF,aAAaG;EACxB,GAAGF;CACL,GACAD,aAAa7D,IACb;EAAEQ,MAAM;EAAYN,QAAQ;CAAU,CACxC;CAEA,OAAO;EACL+D,UAAUJ,aAAaK;EACvBV;CACF;AACF"}
@@ -70,6 +70,12 @@ type AssistantTransportOptions<T> = {
70
70
  api: string;
71
71
  resumeApi?: string;
72
72
  protocol?: AssistantTransportProtocol;
73
+ /**
74
+ * When `false`, stream decoding and state reconciliation tolerate malformed
75
+ * input (invalid chunks are dropped with a console log) instead of throwing.
76
+ * Resume runs always decode leniently. Defaults to `true`.
77
+ */
78
+ strict?: boolean;
73
79
  converter: AssistantTransportStateConverter<T>;
74
80
  headers: HeadersValue | (() => Promise<HeadersValue>);
75
81
  body?: object | (() => Promise<object | undefined>);
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/types.ts"],"mappings":";;;;;KAaY;WACD;WACA;;KAGC;WACD;WACA;;KAGC,kBAAkB,WAAW;KAE7B;WACD;WACA,gBAAgB;;KAGf;WACD;WACA,gBAAgB;;KAIf;WACD;WACA,SAAS,cAAc;WACvB;WACA;;KAGC;WACD;WACA;WACA;WACA,QAAQ;WACR;WACA,WAAW;WACX,wBAAwB;;KAGvB,4BACR,oBACA,uBACA;KAGQ;WACD,mBAAmB;WACnB,QAAQ;WACR;;KAGC;EACV,iBAAiB;EACjB;EACA,cAAc,eAAe;;KAGnB,iCAAiC,MAC3C,OAAO,GACP,oBAAoB,yCACjB;KAGO;EACV,QAAQ;EACR,WAAW;;KAID,gBAAgB;KAKhB,eAAe,yBAAyB;KAExC;KAEA;EACV,UAAU;EACV;EACA;EACA,OAAO;EACP,cAAc;EACd,QAAQ;EACR;EACA;GAIC;;KAGS,0BAA0B;EACpC,cAAc;EACd;EACA;EACA,WAAW;EACX,WAAW,iCAAiC;EAC5C,SAAS,sBAAsB,QAAQ;EACvC,uBAAuB;;;;;;;;;;;;;EAavB,8BACE,MAAM,4BACH,0BAA0B,QAAQ;EACvC,cAAc,UAAU;EACxB;EACA,WACE,OAAO,OACP;IACE,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;eAE7B;;;;;;;EAOZ,YAAY;IACV,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;IACrC,QAAQ;;EAEV;IACE;;EAEF;IACE,cAAc;IACd,UAAU"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/types.ts"],"mappings":";;;;;KAaY;WACD;WACA;;KAGC;WACD;WACA;;KAGC,kBAAkB,WAAW;KAE7B;WACD;WACA,gBAAgB;;KAGf;WACD;WACA,gBAAgB;;KAIf;WACD;WACA,SAAS,cAAc;WACvB;WACA;;KAGC;WACD;WACA;WACA;WACA,QAAQ;WACR;WACA,WAAW;WACX,wBAAwB;;KAGvB,4BACR,oBACA,uBACA;KAGQ;WACD,mBAAmB;WACnB,QAAQ;WACR;;KAGC;EACV,iBAAiB;EACjB;EACA,cAAc,eAAe;;KAGnB,iCAAiC,MAC3C,OAAO,GACP,oBAAoB,yCACjB;KAGO;EACV,QAAQ;EACR,WAAW;;KAID,gBAAgB;KAKhB,eAAe,yBAAyB;KAExC;KAEA;EACV,UAAU;EACV;EACA;EACA,OAAO;EACP,cAAc;EACd,QAAQ;EACR;EACA;GAIC;;KAGS,0BAA0B;EACpC,cAAc;EACd;EACA;EACA,WAAW;;;;;;EAMX;EACA,WAAW,iCAAiC;EAC5C,SAAS,sBAAsB,QAAQ;EACvC,uBAAuB;;;;;;;;;;;;;EAavB,8BACE,MAAM,4BACH,0BAA0B,QAAQ;EACvC,cAAc,UAAU;EACxB;EACA,WACE,OAAO,OACP;IACE,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;eAE7B;;;;;;;EAOZ,YAAY;IACV,UAAU;IACV,cAAc,UAAU,OAAO,MAAM;IACrC,QAAQ;;EAEV;IACE;;EAEF;IACE,cAAc;IACd,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cA8Fa,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;cA6RU,+BAAgC,GAC3C,SAAS,0BAA0B,OAClC"}
1
+ {"version":3,"file":"useAssistantTransportRuntime.d.ts","names":[],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"mappings":";;;;cAgGa,yCAGH,SAAS;iBAOH,8BAA8B;iBAC9B,2BAA2B,GACzC,WAAW,OAAO,sBAAsB,IACvC;;;;cAoSU,+BAAgC,GAC3C,SAAS,0BAA0B,OAClC"}
@@ -24,6 +24,7 @@ const convertAppendMessageToCommand = (message) => {
24
24
  type: "image",
25
25
  image: contentPart.image
26
26
  });
27
+ if (parts.length === 0) return null;
27
28
  return {
28
29
  type: "add-message",
29
30
  message: {
@@ -64,6 +65,15 @@ const useAssistantTransportThreadRuntime = (options) => {
64
65
  const waitForReplayRender = useReplayRenderWait();
65
66
  const parentIdRef = useRef(void 0);
66
67
  const commandQueue = useCommandQueue({ onQueue: () => runManager.schedule() });
68
+ const enqueueAppendMessage = (message) => {
69
+ const command = convertAppendMessageToCommand(message);
70
+ if (!command) {
71
+ console.warn("[assistant-ui] Skipped add-message command with no supported parts");
72
+ return;
73
+ }
74
+ parentIdRef.current = message.parentId;
75
+ commandQueue.enqueue(command, { schedule: message.startRun ?? message.role === "user" });
76
+ };
67
77
  const threadId = useAuiState((s) => s.threadListItem.remoteId);
68
78
  const runManager = useRunManager({
69
79
  onRun: async (signal) => {
@@ -104,11 +114,14 @@ const useAssistantTransportThreadRuntime = (options) => {
104
114
  setReplaying: setIsReplaying,
105
115
  waitForRender: waitForReplayRender
106
116
  });
107
- const decoder = (options.protocol ?? "data-stream") === "assistant-transport" ? new AssistantTransportDecoder() : new DataStreamDecoder();
117
+ const protocol = options.protocol ?? "data-stream";
118
+ const strict = isResume ? false : options.strict ?? true;
119
+ const decoder = protocol === "assistant-transport" ? new AssistantTransportDecoder({ strict }) : new DataStreamDecoder({ strict });
108
120
  let err;
109
121
  const stream = body.pipeThrough(decoder).pipeThrough(new AssistantMessageAccumulator({
110
122
  initialMessage: unstable_createInitialMessage({ unstable_state: agentStateRef.current ?? null }),
111
123
  throttle: isResume,
124
+ strict,
112
125
  onError: (error) => {
113
126
  err = error;
114
127
  }
@@ -178,21 +191,13 @@ const useAssistantTransportThreadRuntime = (options) => {
178
191
  setToolStatuses,
179
192
  extras: {
180
193
  [symbolAssistantTransportExtras]: true,
181
- sendCommand: (command) => {
182
- commandQueue.enqueue(command);
194
+ sendCommand: (command_0) => {
195
+ commandQueue.enqueue(command_0);
183
196
  },
184
197
  state: agentStateRef.current
185
198
  },
186
- onNew: async (message) => {
187
- parentIdRef.current = message.parentId;
188
- const command_0 = convertAppendMessageToCommand(message);
189
- commandQueue.enqueue(command_0, { schedule: message.startRun ?? message.role === "user" });
190
- },
191
- ...options.capabilities?.edit && { onEdit: async (message_0) => {
192
- parentIdRef.current = message_0.parentId;
193
- const command_1 = convertAppendMessageToCommand(message_0);
194
- commandQueue.enqueue(command_1, { schedule: message_0.startRun ?? message_0.role === "user" });
195
- } },
199
+ onNew: async (message_0) => enqueueAppendMessage(message_0),
200
+ ...options.capabilities?.edit && { onEdit: async (message_1) => enqueueAppendMessage(message_1) },
196
201
  ...commandQueue.state.queued.length > 0 && { onReload: async (parentId_0) => {
197
202
  parentIdRef.current = parentId_0;
198
203
  runManager.schedule();
@@ -206,7 +211,7 @@ const useAssistantTransportThreadRuntime = (options) => {
206
211
  runManager.schedule();
207
212
  },
208
213
  onAddToolResult: async (toolOptions) => {
209
- const command_2 = {
214
+ const command_1 = {
210
215
  type: "add-tool-result",
211
216
  toolCallId: toolOptions.toolCallId,
212
217
  result: toolOptions.result,
@@ -215,7 +220,7 @@ const useAssistantTransportThreadRuntime = (options) => {
215
220
  ...toolOptions.artifact && { artifact: toolOptions.artifact },
216
221
  ...toolOptions.modelContent !== void 0 && { modelContent: toolOptions.modelContent }
217
222
  };
218
- commandQueue.enqueue(command_2);
223
+ commandQueue.enqueue(command_1);
219
224
  },
220
225
  onLoadExternalState: async (state) => {
221
226
  agentStateRef.current = state;
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantTransportRuntime.js","names":["c","_c","AppendMessage","ReadonlyJSONObject","ReadonlyJSONValue","asAsyncIterableStream","useExternalStoreRuntime","AssistantRuntime","AddToolResultOptions","useMemo","useRef","useState","AssistantMessageAccumulator","DataStreamDecoder","AssistantTransportDecoder","unstable_createInitialMessage","createInitialMessage","toToolsJSONSchema","AssistantTransportOptions","AddMessageCommand","AddToolResultCommand","UserMessagePart","QueuedCommand","AssistantTransportCommand","SendCommandsRequestBody","useCommandQueue","createReplayBoundaryStream","useReplayRenderWait","useRunManager","useConvertedState","ToolExecutionStatus","createRequestHeaders","useRemoteThreadListRuntime","InMemoryThreadListAdapter","useAui","useAuiState","UserExternalState","convertAppendMessageToCommand","message","role","Error","parts","content","attachments","flatMap","a","contentPart","type","push","text","image","parentId","sourceId","symbolAssistantTransportExtras","Symbol","AssistantTransportExtras","sendCommand","command","state","asAssistantTransportExtras","extras","useAssistantTransportSendCommand","$","aui","t0","thread","getState","transportExtras","useAssistantTransportState","selector","T","t","s","useAssistantTransportThreadRuntime","options","agentStateRef","initialState","rerender","resumeFlagRef","isReplaying","setIsReplaying","waitForReplayRender","parentIdRef","undefined","commandQueue","onQueue","runManager","schedule","threadId","threadListItem","remoteId","onRun","signal","AbortSignal","isResume","current","commands","flush","length","headers","bodyValue","body","context","runtime","getModelContext","requestBody","Record","system","tools","callSettings","config","prepareSendCommandsRequest","response","fetch","resumeApi","api","method","JSON","stringify","onResponse","ok","status","setReplaying","waitForRender","protocol","decoder","err","stream","pipeThrough","initialMessage","unstable_state","throttle","onError","error","markedDelivered","chunk","metadata","markDelivered","prev","queued","onFinish","onCancel","cmds","inTransit","reset","updateState","updater","inTransitCmds","queuedCmds","toolStatuses","setToolStatuses","pendingCommands","converted","converter","isRunning","messages","isLoading","adapters","unstable_enableToolInvocations","enqueue","onNew","Promise","startRun","capabilities","edit","onEdit","onReload","cancel","onResume","onAddToolResult","toolOptions","toolCallId","result","toolName","isError","artifact","modelContent","onLoadExternalState","useAssistantTransportRuntime","runtimeHook","RuntimeHook","adapter","allowNesting"],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AppendMessage } from \"@assistant-ui/core\";\nimport {\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { useExternalStoreRuntime } from \"../external-store/useExternalStoreRuntime\";\nimport type { AssistantRuntime } from \"../../runtime/AssistantRuntime\";\nimport type { AddToolResultOptions } from \"@assistant-ui/core\";\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n AssistantTransportDecoder,\n unstable_createInitialMessage as createInitialMessage,\n toToolsJSONSchema,\n} from \"assistant-stream\";\nimport type {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n AssistantTransportCommand,\n SendCommandsRequestBody,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport {\n createReplayBoundaryStream,\n useReplayRenderWait,\n} from \"./replayBoundaryStream\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport type { ToolExecutionStatus } from \"@assistant-ui/core\";\nimport { createRequestHeaders } from \"@assistant-ui/core\";\nimport { useRemoteThreadListRuntime } from \"../remote-thread-list/useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"@assistant-ui/core\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { UserExternalState } from \"../../../augmentations\";\n\nconst convertAppendMessageToCommand = (\n message: AppendMessage,\n): AddMessageCommand => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n const parts: UserMessagePart[] = [];\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n return {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n parentId: message.parentId,\n sourceId: message.sourceId,\n };\n};\n\nconst symbolAssistantTransportExtras = Symbol(\"assistant-transport-extras\");\ntype AssistantTransportExtras = {\n [symbolAssistantTransportExtras]: true;\n sendCommand: (command: AssistantTransportCommand) => void;\n state: UserExternalState;\n};\n\nconst asAssistantTransportExtras = (\n extras: unknown,\n): AssistantTransportExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAssistantTransportExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAssistantTransportRuntime\",\n );\n\n return extras as AssistantTransportExtras;\n};\n\nexport const useAssistantTransportSendCommand = () => {\n const aui = useAui();\n\n return (command: AssistantTransportCommand) => {\n const extras = aui.thread.getState().extras;\n const transportExtras = asAssistantTransportExtras(extras);\n transportExtras.sendCommand(command);\n };\n};\n\nexport function useAssistantTransportState(): UserExternalState;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T,\n): T;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T = (t) => t as T,\n): T | UserExternalState {\n return useAuiState((s) =>\n selector(asAssistantTransportExtras(s.thread.extras).state),\n );\n}\n\nconst useAssistantTransportThreadRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const [isReplaying, setIsReplaying] = useState(false);\n const waitForReplayRender = useReplayRenderWait();\n const parentIdRef = useRef<string | null | undefined>(undefined);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const threadId = useAuiState((s) => s.threadListItem.remoteId);\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume) return;\n\n // The flushed batch consumes the parentId; read it alongside the flush\n // (before any awaits) so a mid-run append keeps its own value. Resume\n // runs send no commands, so they neither send nor consume it.\n const parentId = isResume ? undefined : parentIdRef.current;\n if (!isResume) parentIdRef.current = undefined;\n\n const headers = await createRequestHeaders(options.headers);\n const bodyValue =\n typeof options.body === \"function\"\n ? await options.body()\n : options.body;\n const context = runtime.thread.getModelContext();\n\n let requestBody: Record<string, unknown> = {\n commands,\n state: agentStateRef.current,\n system: context.system,\n tools: context.tools ? toToolsJSONSchema(context.tools) : undefined,\n threadId,\n ...(parentId !== undefined && {\n parentId,\n }),\n // nested (new format, aligned with AssistantChatTransport)\n callSettings: context.callSettings,\n config: context.config,\n // @deprecated spread at top level — use nested `callSettings`/`config` instead. Will be removed in a future version.\n ...context.callSettings,\n ...context.config,\n ...(bodyValue ?? {}),\n };\n\n if (options.prepareSendCommandsRequest) {\n requestBody = await options.prepareSendCommandsRequest(\n requestBody as SendCommandsRequestBody,\n );\n }\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal,\n },\n );\n\n options.onResponse?.(response);\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const body = await createReplayBoundaryStream(response, {\n setReplaying: setIsReplaying,\n waitForRender: waitForReplayRender,\n });\n\n // Select decoder based on protocol option\n const protocol = options.protocol ?? \"data-stream\";\n const decoder =\n protocol === \"assistant-transport\"\n ? new AssistantTransportDecoder()\n : new DataStreamDecoder();\n\n let err: string | undefined;\n const stream = body.pipeThrough(decoder).pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n\n // A successful run confirms delivery even when no state-changing\n // chunk was observed.\n if (!markedDelivered) {\n commandQueue.markDelivered();\n }\n\n // commands that coalesced into this resume run must not starve\n if (isResume && commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n setIsReplaying(false);\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n\n commandQueue.reset();\n\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n },\n onError: async (error) => {\n setIsReplaying(false);\n const inTransitCmds = [...commandQueue.state.inTransit];\n const queuedCmds = [...commandQueue.state.queued];\n\n commandQueue.reset();\n\n try {\n await options.onError?.(error as Error, {\n commands: inTransitCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n } finally {\n options.onCancel?.({\n commands: queuedCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n error: error as Error,\n });\n }\n },\n });\n\n // Tool execution status state\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n toolStatuses,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n isLoading: isReplaying,\n adapters: options.adapters,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n extras: {\n [symbolAssistantTransportExtras]: true,\n sendCommand: (command: AssistantTransportCommand) => {\n commandQueue.enqueue(command);\n },\n state: agentStateRef.current as UserExternalState,\n } satisfies AssistantTransportExtras,\n onNew: async (message: AppendMessage): Promise<void> => {\n parentIdRef.current = message.parentId;\n const command = convertAppendMessageToCommand(message);\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n },\n ...(options.capabilities?.edit && {\n onEdit: async (message: AppendMessage): Promise<void> => {\n parentIdRef.current = message.parentId;\n const command = convertAppendMessageToCommand(message);\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n },\n }),\n ...(commandQueue.state.queued.length > 0 && {\n onReload: async (parentId: string | null) => {\n parentIdRef.current = parentId;\n runManager.schedule();\n },\n }),\n onCancel: async () => {\n runManager.cancel();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n ...(toolOptions.modelContent !== undefined && {\n modelContent: toolOptions.modelContent,\n }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n rerender((prev) => prev + 1);\n },\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n allowNesting: true,\n });\n return runtime;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useAssistantTransportRuntime.js","names":["c","_c","AppendMessage","ReadonlyJSONObject","ReadonlyJSONValue","asAsyncIterableStream","useExternalStoreRuntime","AssistantRuntime","AddToolResultOptions","useMemo","useRef","useState","AssistantMessageAccumulator","DataStreamDecoder","AssistantTransportDecoder","unstable_createInitialMessage","createInitialMessage","toToolsJSONSchema","AssistantTransportOptions","AddMessageCommand","AddToolResultCommand","UserMessagePart","QueuedCommand","AssistantTransportCommand","SendCommandsRequestBody","useCommandQueue","createReplayBoundaryStream","useReplayRenderWait","useRunManager","useConvertedState","ToolExecutionStatus","createRequestHeaders","useRemoteThreadListRuntime","InMemoryThreadListAdapter","useAui","useAuiState","UserExternalState","convertAppendMessageToCommand","message","role","Error","parts","content","attachments","flatMap","a","contentPart","type","push","text","image","length","parentId","sourceId","symbolAssistantTransportExtras","Symbol","AssistantTransportExtras","sendCommand","command","state","asAssistantTransportExtras","extras","useAssistantTransportSendCommand","$","aui","t0","thread","getState","transportExtras","useAssistantTransportState","selector","T","t","s","useAssistantTransportThreadRuntime","options","agentStateRef","initialState","rerender","resumeFlagRef","isReplaying","setIsReplaying","waitForReplayRender","parentIdRef","undefined","commandQueue","onQueue","runManager","schedule","enqueueAppendMessage","console","warn","current","enqueue","startRun","threadId","threadListItem","remoteId","onRun","signal","AbortSignal","isResume","commands","flush","headers","bodyValue","body","context","runtime","getModelContext","requestBody","Record","system","tools","callSettings","config","prepareSendCommandsRequest","response","fetch","resumeApi","api","method","JSON","stringify","onResponse","ok","status","setReplaying","waitForRender","protocol","strict","decoder","err","stream","pipeThrough","initialMessage","unstable_state","throttle","onError","error","markedDelivered","chunk","metadata","markDelivered","prev","queued","onFinish","onCancel","cmds","inTransit","reset","updateState","updater","inTransitCmds","queuedCmds","toolStatuses","setToolStatuses","pendingCommands","converted","converter","isRunning","messages","isLoading","adapters","unstable_enableToolInvocations","onNew","Promise","capabilities","edit","onEdit","onReload","cancel","onResume","onAddToolResult","toolOptions","toolCallId","result","toolName","isError","artifact","modelContent","onLoadExternalState","useAssistantTransportRuntime","runtimeHook","RuntimeHook","adapter","allowNesting"],"sources":["../../../../src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport type { AppendMessage } from \"@assistant-ui/core\";\nimport {\n type ReadonlyJSONObject,\n type ReadonlyJSONValue,\n asAsyncIterableStream,\n} from \"assistant-stream/utils\";\nimport { useExternalStoreRuntime } from \"../external-store/useExternalStoreRuntime\";\nimport type { AssistantRuntime } from \"../../runtime/AssistantRuntime\";\nimport type { AddToolResultOptions } from \"@assistant-ui/core\";\nimport { useMemo, useRef, useState } from \"react\";\nimport {\n AssistantMessageAccumulator,\n DataStreamDecoder,\n AssistantTransportDecoder,\n unstable_createInitialMessage as createInitialMessage,\n toToolsJSONSchema,\n} from \"assistant-stream\";\nimport type {\n AssistantTransportOptions,\n AddMessageCommand,\n AddToolResultCommand,\n UserMessagePart,\n QueuedCommand,\n AssistantTransportCommand,\n SendCommandsRequestBody,\n} from \"./types\";\nimport { useCommandQueue } from \"./commandQueue\";\nimport {\n createReplayBoundaryStream,\n useReplayRenderWait,\n} from \"./replayBoundaryStream\";\nimport { useRunManager } from \"./runManager\";\nimport { useConvertedState } from \"./useConvertedState\";\nimport type { ToolExecutionStatus } from \"@assistant-ui/core\";\nimport { createRequestHeaders } from \"@assistant-ui/core\";\nimport { useRemoteThreadListRuntime } from \"../remote-thread-list/useRemoteThreadListRuntime\";\nimport { InMemoryThreadListAdapter } from \"@assistant-ui/core\";\nimport { useAui, useAuiState } from \"@assistant-ui/store\";\nimport type { UserExternalState } from \"../../../augmentations\";\n\nconst convertAppendMessageToCommand = (\n message: AppendMessage,\n): AddMessageCommand | null => {\n if (message.role !== \"user\")\n throw new Error(\"Only user messages are supported\");\n\n const parts: UserMessagePart[] = [];\n const content = [\n ...message.content,\n ...(message.attachments?.flatMap((a) => a.content) ?? []),\n ];\n for (const contentPart of content) {\n if (contentPart.type === \"text\") {\n parts.push({ type: \"text\", text: contentPart.text });\n } else if (contentPart.type === \"image\") {\n parts.push({ type: \"image\", image: contentPart.image });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n type: \"add-message\",\n message: {\n role: \"user\",\n parts,\n },\n parentId: message.parentId,\n sourceId: message.sourceId,\n };\n};\n\nconst symbolAssistantTransportExtras = Symbol(\"assistant-transport-extras\");\ntype AssistantTransportExtras = {\n [symbolAssistantTransportExtras]: true;\n sendCommand: (command: AssistantTransportCommand) => void;\n state: UserExternalState;\n};\n\nconst asAssistantTransportExtras = (\n extras: unknown,\n): AssistantTransportExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolAssistantTransportExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useAssistantTransportRuntime\",\n );\n\n return extras as AssistantTransportExtras;\n};\n\nexport const useAssistantTransportSendCommand = () => {\n const aui = useAui();\n\n return (command: AssistantTransportCommand) => {\n const extras = aui.thread.getState().extras;\n const transportExtras = asAssistantTransportExtras(extras);\n transportExtras.sendCommand(command);\n };\n};\n\nexport function useAssistantTransportState(): UserExternalState;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T,\n): T;\nexport function useAssistantTransportState<T>(\n selector: (state: UserExternalState) => T = (t) => t as T,\n): T | UserExternalState {\n return useAuiState((s) =>\n selector(asAssistantTransportExtras(s.thread.extras).state),\n );\n}\n\nconst useAssistantTransportThreadRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const agentStateRef = useRef(options.initialState);\n const [, rerender] = useState(0);\n const resumeFlagRef = useRef(false);\n const [isReplaying, setIsReplaying] = useState(false);\n const waitForReplayRender = useReplayRenderWait();\n const parentIdRef = useRef<string | null | undefined>(undefined);\n const commandQueue = useCommandQueue({\n onQueue: () => runManager.schedule(),\n });\n\n const enqueueAppendMessage = (message: AppendMessage) => {\n const command = convertAppendMessageToCommand(message);\n if (!command) {\n console.warn(\n \"[assistant-ui] Skipped add-message command with no supported parts\",\n );\n return;\n }\n parentIdRef.current = message.parentId;\n commandQueue.enqueue(command, {\n schedule: message.startRun ?? message.role === \"user\",\n });\n };\n\n const threadId = useAuiState((s) => s.threadListItem.remoteId);\n\n const runManager = useRunManager({\n onRun: async (signal: AbortSignal) => {\n const isResume = resumeFlagRef.current;\n resumeFlagRef.current = false;\n setIsReplaying(false);\n const commands: QueuedCommand[] = isResume ? [] : commandQueue.flush();\n if (commands.length === 0 && !isResume) return;\n\n // The flushed batch consumes the parentId; read it alongside the flush\n // (before any awaits) so a mid-run append keeps its own value. Resume\n // runs send no commands, so they neither send nor consume it.\n const parentId = isResume ? undefined : parentIdRef.current;\n if (!isResume) parentIdRef.current = undefined;\n\n const headers = await createRequestHeaders(options.headers);\n const bodyValue =\n typeof options.body === \"function\"\n ? await options.body()\n : options.body;\n const context = runtime.thread.getModelContext();\n\n let requestBody: Record<string, unknown> = {\n commands,\n state: agentStateRef.current,\n system: context.system,\n tools: context.tools ? toToolsJSONSchema(context.tools) : undefined,\n threadId,\n ...(parentId !== undefined && {\n parentId,\n }),\n // nested (new format, aligned with AssistantChatTransport)\n callSettings: context.callSettings,\n config: context.config,\n // @deprecated spread at top level — use nested `callSettings`/`config` instead. Will be removed in a future version.\n ...context.callSettings,\n ...context.config,\n ...(bodyValue ?? {}),\n };\n\n if (options.prepareSendCommandsRequest) {\n requestBody = await options.prepareSendCommandsRequest(\n requestBody as SendCommandsRequestBody,\n );\n }\n\n const response = await fetch(\n isResume ? options.resumeApi! : options.api,\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(requestBody),\n signal,\n },\n );\n\n options.onResponse?.(response);\n\n if (!response.ok) {\n throw new Error(`Status ${response.status}: ${await response.text()}`);\n }\n\n if (!response.body) {\n throw new Error(\"Response body is null\");\n }\n\n const body = await createReplayBoundaryStream(response, {\n setReplaying: setIsReplaying,\n waitForRender: waitForReplayRender,\n });\n\n // Select decoder based on protocol option\n const protocol = options.protocol ?? \"data-stream\";\n // Resume replays a best-effort buffer; always reconcile leniently.\n const strict = isResume ? false : (options.strict ?? true);\n const decoder =\n protocol === \"assistant-transport\"\n ? new AssistantTransportDecoder({ strict })\n : new DataStreamDecoder({ strict });\n\n let err: string | undefined;\n const stream = body.pipeThrough(decoder).pipeThrough(\n new AssistantMessageAccumulator({\n initialMessage: createInitialMessage({\n unstable_state:\n (agentStateRef.current as ReadonlyJSONValue) ?? null,\n }),\n throttle: isResume,\n strict,\n onError: (error) => {\n err = error;\n },\n }),\n );\n\n let markedDelivered = false;\n\n for await (const chunk of asAsyncIterableStream(stream)) {\n if (chunk.metadata.unstable_state === agentStateRef.current) continue;\n\n if (!markedDelivered) {\n commandQueue.markDelivered();\n markedDelivered = true;\n }\n\n agentStateRef.current = chunk.metadata.unstable_state as T;\n rerender((prev) => prev + 1);\n }\n\n if (err) {\n throw new Error(err);\n }\n\n // A successful run confirms delivery even when no state-changing\n // chunk was observed.\n if (!markedDelivered) {\n commandQueue.markDelivered();\n }\n\n // commands that coalesced into this resume run must not starve\n if (isResume && commandQueue.state.queued.length > 0) {\n runManager.schedule();\n }\n },\n onFinish: options.onFinish,\n onCancel: () => {\n setIsReplaying(false);\n const cmds = [\n ...commandQueue.state.inTransit,\n ...commandQueue.state.queued,\n ];\n\n commandQueue.reset();\n\n options.onCancel?.({\n commands: cmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n },\n onError: async (error) => {\n setIsReplaying(false);\n const inTransitCmds = [...commandQueue.state.inTransit];\n const queuedCmds = [...commandQueue.state.queued];\n\n commandQueue.reset();\n\n try {\n await options.onError?.(error as Error, {\n commands: inTransitCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n });\n } finally {\n options.onCancel?.({\n commands: queuedCmds,\n updateState: (updater) => {\n agentStateRef.current = updater(agentStateRef.current);\n rerender((prev) => prev + 1);\n },\n error: error as Error,\n });\n }\n },\n });\n\n // Tool execution status state\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n\n // Reactive conversion of agent state + connection metadata → UI state\n const pendingCommands = useMemo(\n () => [...commandQueue.state.inTransit, ...commandQueue.state.queued],\n [commandQueue.state],\n );\n const converted = useConvertedState(\n options.converter,\n agentStateRef.current,\n pendingCommands,\n runManager.isRunning,\n toolStatuses,\n );\n\n // Create runtime\n const runtime = useExternalStoreRuntime({\n messages: converted.messages,\n state: converted.state,\n isRunning: converted.isRunning,\n isLoading: isReplaying,\n adapters: options.adapters,\n unstable_enableToolInvocations: true,\n setToolStatuses,\n extras: {\n [symbolAssistantTransportExtras]: true,\n sendCommand: (command: AssistantTransportCommand) => {\n commandQueue.enqueue(command);\n },\n state: agentStateRef.current as UserExternalState,\n } satisfies AssistantTransportExtras,\n onNew: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n ...(options.capabilities?.edit && {\n onEdit: async (message: AppendMessage): Promise<void> =>\n enqueueAppendMessage(message),\n }),\n ...(commandQueue.state.queued.length > 0 && {\n onReload: async (parentId: string | null) => {\n parentIdRef.current = parentId;\n runManager.schedule();\n },\n }),\n onCancel: async () => {\n runManager.cancel();\n },\n onResume: async () => {\n if (!options.resumeApi)\n throw new Error(\"Must pass resumeApi to options to resume runs\");\n\n resumeFlagRef.current = true;\n runManager.schedule();\n },\n onAddToolResult: async (\n toolOptions: AddToolResultOptions,\n ): Promise<void> => {\n const command: AddToolResultCommand = {\n type: \"add-tool-result\",\n toolCallId: toolOptions.toolCallId,\n result: toolOptions.result as ReadonlyJSONObject,\n toolName: toolOptions.toolName,\n isError: toolOptions.isError,\n ...(toolOptions.artifact && { artifact: toolOptions.artifact }),\n ...(toolOptions.modelContent !== undefined && {\n modelContent: toolOptions.modelContent,\n }),\n };\n\n commandQueue.enqueue(command);\n },\n onLoadExternalState: async (state) => {\n agentStateRef.current = state as T;\n rerender((prev) => prev + 1);\n },\n });\n\n return runtime;\n};\n\n/**\n * @alpha This is an experimental API that is subject to change.\n */\nexport const useAssistantTransportRuntime = <T>(\n options: AssistantTransportOptions<T>,\n): AssistantRuntime => {\n const runtime = useRemoteThreadListRuntime({\n runtimeHook: function RuntimeHook() {\n return useAssistantTransportThreadRuntime(options);\n },\n adapter: new InMemoryThreadListAdapter(),\n allowNesting: true,\n });\n return runtime;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"McpAppRenderer.d.ts","names":[],"sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"mappings":";;;;;KA8BY;;;;;;EAMV,MAAM,gBAAgB;;EAEtB,UAAU;;;;;EAKV;;EAEA,WAAW;;EAEX,cAAc;;EAEd,WAAW;;EAEX,kBAAkB;;EAElB,gBAAgB,cAAc,OAAO,UAAU;;cAgNpC,4CAAc;WAxBL,QAAA;IAwBmC,SAAA"}
1
+ {"version":3,"file":"McpAppRenderer.d.ts","names":[],"sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"mappings":";;;;;KA+BY;;;;;;EAMV,MAAM,gBAAgB;;EAEtB,UAAU;;;;;EAKV;;EAEA,WAAW;;EAEX,cAAc;;EAEd,WAAW;;EAEX,kBAAkB;;EAElB,gBAAgB,cAAc,OAAO,UAAU;;cA2NpC,4CAAc;WA5BL,QAAA;IA4BmC,SAAA"}