@assistant-ui/react-ai-sdk 1.3.26 → 1.3.28

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 (105) hide show
  1. package/dist/frontendTools.d.ts +9 -5
  2. package/dist/frontendTools.d.ts.map +1 -1
  3. package/dist/frontendTools.js +36 -35
  4. package/dist/frontendTools.js.map +1 -1
  5. package/dist/index.d.ts +9 -11
  6. package/dist/index.js +9 -10
  7. package/dist/injectQuoteContext.d.ts +6 -2
  8. package/dist/injectQuoteContext.d.ts.map +1 -1
  9. package/dist/injectQuoteContext.js +46 -53
  10. package/dist/injectQuoteContext.js.map +1 -1
  11. package/dist/modelContentEnvelope.d.ts +12 -10
  12. package/dist/modelContentEnvelope.d.ts.map +1 -1
  13. package/dist/modelContentEnvelope.js +17 -15
  14. package/dist/modelContentEnvelope.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  16. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  17. package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
  18. package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
  19. package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
  20. package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
  21. package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
  22. package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
  23. package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
  24. package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
  25. package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
  26. package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
  27. package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
  28. package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
  29. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
  30. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
  31. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
  32. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
  33. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
  34. package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
  35. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
  36. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
  37. package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
  38. package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
  39. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
  40. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
  41. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
  42. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
  43. package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
  44. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
  45. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
  46. package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
  47. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
  48. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
  49. package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
  50. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  51. package/dist/ui/getVercelAIMessages.d.ts +7 -3
  52. package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
  53. package/dist/ui/getVercelAIMessages.js +7 -3
  54. package/dist/ui/getVercelAIMessages.js.map +1 -1
  55. package/dist/ui/resumable.d.ts +18 -15
  56. package/dist/ui/resumable.d.ts.map +1 -1
  57. package/dist/ui/resumable.js +21 -20
  58. package/dist/ui/resumable.js.map +1 -1
  59. package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
  60. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  61. package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
  62. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  63. package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
  64. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  65. package/dist/ui/use-chat/useAISDKRuntime.js +184 -204
  66. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  67. package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
  68. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  69. package/dist/ui/use-chat/useChatRuntime.js +60 -81
  70. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  71. package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
  72. package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
  73. package/dist/ui/use-chat/useExternalHistory.js +178 -200
  74. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  75. package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
  76. package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
  77. package/dist/ui/use-chat/useStreamingTiming.js +60 -75
  78. package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
  79. package/dist/ui/utils/convertMessage.d.ts +29 -20
  80. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  81. package/dist/ui/utils/convertMessage.js +207 -301
  82. package/dist/ui/utils/convertMessage.js.map +1 -1
  83. package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
  84. package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
  85. package/dist/ui/utils/sliceMessagesUntil.js +10 -10
  86. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  87. package/dist/ui/utils/toCreateMessage.d.ts +7 -3
  88. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  89. package/dist/ui/utils/toCreateMessage.js +34 -38
  90. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  91. package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
  92. package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
  93. package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
  94. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  95. package/dist/usage.d.ts +15 -12
  96. package/dist/usage.d.ts.map +1 -1
  97. package/dist/usage.js +80 -99
  98. package/dist/usage.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
  101. package/src/ui/use-chat/useAISDKRuntime.ts +8 -0
  102. package/src/ui/utils/convertMessage.test.ts +71 -6
  103. package/src/ui/utils/convertMessage.ts +27 -25
  104. package/dist/index.d.ts.map +0 -1
  105. package/dist/index.js.map +0 -1
@@ -1,317 +1,223 @@
1
- import { isToolUIPart, getToolName } from "ai";
2
- import { createMessageConverter as unstable_createMessageConverter, } from "@assistant-ui/core/react";
3
- import { isMcpAppUri, } from "@assistant-ui/core";
4
1
  import { unwrapModelContentEnvelope } from "../../modelContentEnvelope.js";
2
+ import { getToolName, isToolUIPart } from "ai";
3
+ import { createMessageConverter } from "@assistant-ui/core/react";
4
+ import { isMcpAppUri } from "@assistant-ui/core";
5
+ //#region src/ui/utils/convertMessage.ts
5
6
  function stripClosingDelimiters(json) {
6
- return json.replace(/[}\]"]+$/, "");
7
+ return json.replace(/[}\]"]+$/, "");
7
8
  }
8
9
  const MCP_APP_METADATA_CACHE_MAX = 100;
9
10
  function extractMcpAppMetadata(part, cache) {
10
- if (!part || typeof part !== "object")
11
- return undefined;
12
- const meta = part
13
- .callProviderMetadata;
14
- const mcp = meta && typeof meta === "object"
15
- ? meta.mcp
16
- : undefined;
17
- const app = mcp && typeof mcp === "object" ? mcp.app : undefined;
18
- let a;
19
- if (app && typeof app === "object") {
20
- a = app;
21
- }
22
- else {
23
- // MCP-UI tools (e.g. xmcp) surface the UI pointer as
24
- // result._meta["ui/resourceUri"] rather than in callProviderMetadata.
25
- const output = part.output;
26
- const outMeta = output && typeof output === "object"
27
- ? output._meta
28
- : undefined;
29
- const uiResourceUri = outMeta && typeof outMeta === "object"
30
- ? outMeta["ui/resourceUri"]
31
- : undefined;
32
- if (typeof uiResourceUri !== "string")
33
- return undefined;
34
- a = { resourceUri: uiResourceUri };
35
- }
36
- if (typeof a["resourceUri"] !== "string")
37
- return undefined;
38
- if (!isMcpAppUri(a["resourceUri"]))
39
- return undefined;
40
- const cached = cache?.get(a["resourceUri"]);
41
- if (cached) {
42
- cache.delete(a["resourceUri"]);
43
- cache.set(a["resourceUri"], cached);
44
- return cached;
45
- }
46
- const out = {
47
- resourceUri: a["resourceUri"],
48
- };
49
- if (typeof a["mimeType"] === "string")
50
- out.mimeType = a["mimeType"];
51
- if (Array.isArray(a["visibility"])) {
52
- out.visibility = a["visibility"].filter((v) => v === "model" || v === "app");
53
- }
54
- if (cache) {
55
- if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {
56
- const oldest = cache.keys().next().value;
57
- if (oldest !== undefined)
58
- cache.delete(oldest);
59
- }
60
- cache.set(a["resourceUri"], out);
61
- }
62
- return out;
11
+ if (!part || typeof part !== "object") return void 0;
12
+ const meta = part.callProviderMetadata;
13
+ const mcp = meta && typeof meta === "object" ? meta.mcp : void 0;
14
+ const app = mcp && typeof mcp === "object" ? mcp.app : void 0;
15
+ let a;
16
+ if (app && typeof app === "object") a = app;
17
+ else {
18
+ const output = part.output;
19
+ const outMeta = output && typeof output === "object" ? output._meta : void 0;
20
+ const uiResourceUri = outMeta && typeof outMeta === "object" ? outMeta["ui/resourceUri"] : void 0;
21
+ if (typeof uiResourceUri !== "string") return void 0;
22
+ a = { resourceUri: uiResourceUri };
23
+ }
24
+ if (typeof a["resourceUri"] !== "string") return void 0;
25
+ if (!isMcpAppUri(a["resourceUri"])) return void 0;
26
+ const cached = cache?.get(a["resourceUri"]);
27
+ if (cached) {
28
+ cache.delete(a["resourceUri"]);
29
+ cache.set(a["resourceUri"], cached);
30
+ return cached;
31
+ }
32
+ const out = { resourceUri: a["resourceUri"] };
33
+ if (typeof a["mimeType"] === "string") out.mimeType = a["mimeType"];
34
+ if (Array.isArray(a["visibility"])) out.visibility = a["visibility"].filter((v) => v === "model" || v === "app");
35
+ if (cache) {
36
+ if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {
37
+ const oldest = cache.keys().next().value;
38
+ if (oldest !== void 0) cache.delete(oldest);
39
+ }
40
+ cache.set(a["resourceUri"], out);
41
+ }
42
+ return out;
63
43
  }
64
44
  const hasOwn = (value, key) => Object.hasOwn(value, key);
65
45
  const stabilizeToolArgsValue = (value, path, keyOrderByPath) => {
66
- if (Array.isArray(value)) {
67
- return value.map((item, idx) => stabilizeToolArgsValue(item, `${path}[${idx}]`, keyOrderByPath));
68
- }
69
- if (value && typeof value === "object") {
70
- const record = value;
71
- const currentKeys = Object.keys(record);
72
- const previousOrder = keyOrderByPath.get(path) ?? [];
73
- const previousOrderSet = new Set(previousOrder);
74
- const nextOrder = [
75
- ...previousOrder.filter((key) => hasOwn(record, key)),
76
- ...currentKeys.filter((key) => !previousOrderSet.has(key)),
77
- ];
78
- keyOrderByPath.set(path, nextOrder);
79
- return Object.fromEntries(nextOrder.map((key) => [
80
- key,
81
- stabilizeToolArgsValue(record[key], `${path}.${key}`, keyOrderByPath),
82
- ]));
83
- }
84
- return value;
46
+ if (Array.isArray(value)) return value.map((item, idx) => stabilizeToolArgsValue(item, `${path}[${idx}]`, keyOrderByPath));
47
+ if (value && typeof value === "object") {
48
+ const record = value;
49
+ const currentKeys = Object.keys(record);
50
+ const previousOrder = keyOrderByPath.get(path) ?? [];
51
+ const previousOrderSet = new Set(previousOrder);
52
+ const nextOrder = [...previousOrder.filter((key) => hasOwn(record, key)), ...currentKeys.filter((key) => !previousOrderSet.has(key))];
53
+ keyOrderByPath.set(path, nextOrder);
54
+ return Object.fromEntries(nextOrder.map((key) => [key, stabilizeToolArgsValue(record[key], `${path}.${key}`, keyOrderByPath)]));
55
+ }
56
+ return value;
85
57
  };
86
58
  function stableStringifyToolArgs(keyOrderCache, cacheKey, args) {
87
- const keyOrderByPath = keyOrderCache?.get(cacheKey) ?? new Map();
88
- keyOrderCache?.set(cacheKey, keyOrderByPath);
89
- const stableArgs = stabilizeToolArgsValue(args, "$", keyOrderByPath);
90
- return JSON.stringify(stableArgs);
59
+ const keyOrderByPath = keyOrderCache?.get(cacheKey) ?? /* @__PURE__ */ new Map();
60
+ keyOrderCache?.set(cacheKey, keyOrderByPath);
61
+ const stableArgs = stabilizeToolArgsValue(args, "$", keyOrderByPath);
62
+ return JSON.stringify(stableArgs);
91
63
  }
92
- /**
93
- * Resolves the interrupt fields for a tool call part.
94
- *
95
- * Two interrupt paths for tool approvals:
96
- * 1. AI SDK server-side approval: approval-requested state with part.approval payload
97
- * 2. Frontend tools: toolStatuses interrupt from context.human()
98
- */
99
- function getToolInterrupt(part, toolStatus) {
100
- if (part.state === "approval-requested" && "approval" in part) {
101
- return {
102
- interrupt: {
103
- type: "human",
104
- payload: part.approval,
105
- },
106
- status: {
107
- type: "requires-action",
108
- reason: "interrupt",
109
- },
110
- };
111
- }
112
- if (toolStatus?.type === "interrupt") {
113
- return {
114
- interrupt: toolStatus.payload,
115
- status: {
116
- type: "requires-action",
117
- reason: "interrupt",
118
- },
119
- };
120
- }
121
- return {};
64
+ function getToolApprovalAndInterrupt(part, toolStatus) {
65
+ if (part.approval && typeof part.approval.id === "string") {
66
+ const { id, approved, reason, isAutomatic } = part.approval;
67
+ return { approval: {
68
+ id,
69
+ ...typeof approved === "boolean" && { approved },
70
+ ...typeof reason === "string" && { reason },
71
+ ...isAutomatic === true && { isAutomatic: true }
72
+ } };
73
+ }
74
+ if (toolStatus?.type === "interrupt") return { interrupt: toolStatus.payload };
75
+ return {};
122
76
  }
123
77
  function convertParts(message, metadata) {
124
- if (!message.parts || message.parts.length === 0) {
125
- return [];
126
- }
127
- const converted = message.parts
128
- .filter((p) => p.type !== "step-start" &&
129
- (message.role !== "user" || p.type !== "file"))
130
- .map((part) => {
131
- if (part.type === "text") {
132
- return {
133
- type: "text",
134
- text: part.text,
135
- };
136
- }
137
- if (part.type === "reasoning") {
138
- return {
139
- type: "reasoning",
140
- text: part.text,
141
- };
142
- }
143
- if (isToolUIPart(part)) {
144
- const toolName = getToolName(part);
145
- const toolCallId = part.toolCallId;
146
- const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;
147
- const rawInput = part.input;
148
- let args;
149
- if (rawInput != null &&
150
- typeof rawInput === "object" &&
151
- !Array.isArray(rawInput)) {
152
- args = rawInput;
153
- metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);
154
- }
155
- else {
156
- args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};
157
- }
158
- let result;
159
- let modelContent;
160
- let isError = false;
161
- if (part.state === "output-available") {
162
- const unwrapped = unwrapModelContentEnvelope(part.output);
163
- result = unwrapped.result;
164
- modelContent = unwrapped.modelContent;
165
- }
166
- else if (part.state === "output-error") {
167
- isError = true;
168
- result = { error: part.errorText };
169
- }
170
- else if (part.state === "output-denied") {
171
- isError = true;
172
- result = {
173
- error: part.approval.reason ||
174
- "Tool approval denied",
175
- };
176
- }
177
- let argsText = stableStringifyToolArgs(metadata.toolArgsKeyOrderCache, argsKeyOrderCacheKey, args);
178
- if (part.state === "input-streaming") {
179
- // strip closing delimiters added by the AI SDK's fix-json
180
- argsText = stripClosingDelimiters(argsText);
181
- }
182
- else {
183
- metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);
184
- if (part.state === "output-available" ||
185
- part.state === "output-error" ||
186
- part.state === "output-denied") {
187
- metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);
188
- }
189
- }
190
- const toolStatus = metadata.toolStatuses?.[toolCallId];
191
- const mcpApp = extractMcpAppMetadata(part, metadata.mcpAppMetadataCache);
192
- return {
193
- type: "tool-call",
194
- toolName,
195
- toolCallId,
196
- argsText,
197
- args,
198
- result,
199
- isError,
200
- ...(modelContent !== undefined && { modelContent }),
201
- ...(mcpApp && { mcp: { app: mcpApp } }),
202
- ...getToolInterrupt(part, toolStatus),
203
- };
204
- }
205
- if (part.type === "source-url") {
206
- return {
207
- type: "source",
208
- sourceType: "url",
209
- id: part.sourceId,
210
- url: part.url,
211
- ...(part.title != null ? { title: part.title } : undefined),
212
- ...(part.providerMetadata != null
213
- ? {
214
- providerMetadata: part.providerMetadata,
215
- }
216
- : undefined),
217
- };
218
- }
219
- if (part.type === "file") {
220
- return {
221
- type: "file",
222
- data: part.url,
223
- mimeType: part.mediaType,
224
- ...(part.filename != null && { filename: part.filename }),
225
- };
226
- }
227
- if (part.type === "source-document") {
228
- return {
229
- type: "source",
230
- sourceType: "document",
231
- id: part.sourceId,
232
- title: part.title,
233
- mediaType: part.mediaType,
234
- ...(part.filename != null ? { filename: part.filename } : undefined),
235
- ...(part.providerMetadata != null
236
- ? {
237
- providerMetadata: part.providerMetadata,
238
- }
239
- : undefined),
240
- };
241
- }
242
- if (part.type.startsWith("data-")) {
243
- return {
244
- type: "data",
245
- name: part.type.substring(5),
246
- data: part.data,
247
- };
248
- }
249
- console.warn(`Unsupported message part type: ${part.type}`);
250
- return null;
251
- })
252
- .filter(Boolean);
253
- const seenToolCallIds = new Set();
254
- return converted.filter((part) => {
255
- if (part.type === "tool-call" && part.toolCallId != null) {
256
- if (seenToolCallIds.has(part.toolCallId))
257
- return false;
258
- seenToolCallIds.add(part.toolCallId);
259
- }
260
- return true;
261
- });
78
+ if (!message.parts || message.parts.length === 0) return [];
79
+ const converted = message.parts.filter((p) => p.type !== "step-start" && (message.role !== "user" || p.type !== "file")).map((part) => {
80
+ if (part.type === "text") return {
81
+ type: "text",
82
+ text: part.text
83
+ };
84
+ if (part.type === "reasoning") return {
85
+ type: "reasoning",
86
+ text: part.text
87
+ };
88
+ if (isToolUIPart(part)) {
89
+ const toolName = getToolName(part);
90
+ const toolCallId = part.toolCallId;
91
+ const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;
92
+ const rawInput = part.input;
93
+ let args;
94
+ if (rawInput != null && typeof rawInput === "object" && !Array.isArray(rawInput)) {
95
+ args = rawInput;
96
+ metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);
97
+ } else args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};
98
+ let result;
99
+ let modelContent;
100
+ let isError = false;
101
+ if (part.state === "output-available") {
102
+ const unwrapped = unwrapModelContentEnvelope(part.output);
103
+ result = unwrapped.result;
104
+ modelContent = unwrapped.modelContent;
105
+ } else if (part.state === "output-error") {
106
+ isError = true;
107
+ result = { error: part.errorText };
108
+ } else if (part.state === "output-denied") {
109
+ isError = true;
110
+ result = { error: part.approval?.reason || "Tool approval denied" };
111
+ }
112
+ let argsText = stableStringifyToolArgs(metadata.toolArgsKeyOrderCache, argsKeyOrderCacheKey, args);
113
+ if (part.state === "input-streaming") argsText = stripClosingDelimiters(argsText);
114
+ else {
115
+ metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);
116
+ if (part.state === "output-available" || part.state === "output-error" || part.state === "output-denied") metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);
117
+ }
118
+ const toolStatus = metadata.toolStatuses?.[toolCallId];
119
+ const mcpApp = extractMcpAppMetadata(part, metadata.mcpAppMetadataCache);
120
+ return {
121
+ type: "tool-call",
122
+ toolName,
123
+ toolCallId,
124
+ argsText,
125
+ args,
126
+ result,
127
+ isError,
128
+ ...modelContent !== void 0 && { modelContent },
129
+ ...mcpApp && { mcp: { app: mcpApp } },
130
+ ...getToolApprovalAndInterrupt(part, toolStatus)
131
+ };
132
+ }
133
+ if (part.type === "source-url") return {
134
+ type: "source",
135
+ sourceType: "url",
136
+ id: part.sourceId,
137
+ url: part.url,
138
+ ...part.title != null ? { title: part.title } : void 0,
139
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
140
+ };
141
+ if (part.type === "file") return {
142
+ type: "file",
143
+ data: part.url,
144
+ mimeType: part.mediaType,
145
+ ...part.filename != null && { filename: part.filename }
146
+ };
147
+ if (part.type === "source-document") return {
148
+ type: "source",
149
+ sourceType: "document",
150
+ id: part.sourceId,
151
+ title: part.title,
152
+ mediaType: part.mediaType,
153
+ ...part.filename != null ? { filename: part.filename } : void 0,
154
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : void 0
155
+ };
156
+ if (part.type.startsWith("data-")) return {
157
+ type: "data",
158
+ name: part.type.substring(5),
159
+ data: part.data
160
+ };
161
+ console.warn(`Unsupported message part type: ${part.type}`);
162
+ return null;
163
+ }).filter(Boolean);
164
+ const seenToolCallIds = /* @__PURE__ */ new Set();
165
+ return converted.filter((part) => {
166
+ if (part.type === "tool-call" && part.toolCallId != null) {
167
+ if (seenToolCallIds.has(part.toolCallId)) return false;
168
+ seenToolCallIds.add(part.toolCallId);
169
+ }
170
+ return true;
171
+ });
262
172
  }
263
- export const AISDKMessageConverter = unstable_createMessageConverter((message, metadata) => {
264
- const createdAt = new Date();
265
- const content = convertParts(message, metadata);
266
- switch (message.role) {
267
- case "user":
268
- return {
269
- role: "user",
270
- id: message.id,
271
- createdAt,
272
- content,
273
- attachments: message.parts
274
- ?.filter((p) => p.type === "file")
275
- .map((part, idx) => ({
276
- id: idx.toString(),
277
- type: part.mediaType.startsWith("image/") ? "image" : "file",
278
- name: part.filename ?? "file",
279
- content: [
280
- part.mediaType.startsWith("image/")
281
- ? {
282
- type: "image",
283
- image: part.url,
284
- filename: part.filename,
285
- }
286
- : {
287
- type: "file",
288
- filename: part.filename,
289
- data: part.url,
290
- mimeType: part.mediaType,
291
- },
292
- ],
293
- contentType: part.mediaType ?? "unknown/unknown",
294
- status: { type: "complete" },
295
- })),
296
- metadata: message.metadata,
297
- };
298
- case "system":
299
- case "assistant": {
300
- const timing = metadata.messageTiming?.[message.id];
301
- return {
302
- role: message.role,
303
- id: message.id,
304
- createdAt,
305
- content,
306
- metadata: {
307
- ...message.metadata,
308
- ...(timing && { timing }),
309
- },
310
- };
311
- }
312
- default:
313
- console.warn(`Unsupported message role: ${message.role}`);
314
- return [];
315
- }
173
+ const AISDKMessageConverter = createMessageConverter((message, metadata) => {
174
+ const createdAt = /* @__PURE__ */ new Date();
175
+ const content = convertParts(message, metadata);
176
+ switch (message.role) {
177
+ case "user": return {
178
+ role: "user",
179
+ id: message.id,
180
+ createdAt,
181
+ content,
182
+ attachments: message.parts?.filter((p) => p.type === "file").map((part, idx) => ({
183
+ id: idx.toString(),
184
+ type: part.mediaType.startsWith("image/") ? "image" : "file",
185
+ name: part.filename ?? "file",
186
+ content: [part.mediaType.startsWith("image/") ? {
187
+ type: "image",
188
+ image: part.url,
189
+ filename: part.filename
190
+ } : {
191
+ type: "file",
192
+ filename: part.filename,
193
+ data: part.url,
194
+ mimeType: part.mediaType
195
+ }],
196
+ contentType: part.mediaType ?? "unknown/unknown",
197
+ status: { type: "complete" }
198
+ })),
199
+ metadata: message.metadata
200
+ };
201
+ case "system":
202
+ case "assistant": {
203
+ const timing = metadata.messageTiming?.[message.id];
204
+ return {
205
+ role: message.role,
206
+ id: message.id,
207
+ createdAt,
208
+ content,
209
+ metadata: {
210
+ ...message.metadata,
211
+ ...timing && { timing }
212
+ }
213
+ };
214
+ }
215
+ default:
216
+ console.warn(`Unsupported message role: ${message.role}`);
217
+ return [];
218
+ }
316
219
  });
220
+ //#endregion
221
+ export { AISDKMessageConverter };
222
+
317
223
  //# sourceMappingURL=convertMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convertMessage.js","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convertMessage.js","names":["unstable_createMessageConverter"],"sources":["../../../src/ui/utils/convertMessage.ts"],"sourcesContent":["import { isToolUIPart, getToolName, type UIMessage } from \"ai\";\nimport {\n createMessageConverter as unstable_createMessageConverter,\n type useExternalMessageConverter,\n} from \"@assistant-ui/core/react\";\nimport {\n isMcpAppUri,\n type ReasoningMessagePart,\n type ToolCallMessagePart,\n type TextMessagePart,\n type DataMessagePart,\n type SourceMessagePart,\n type SourceProviderMetadata,\n type FileMessagePart,\n type ThreadMessageLike,\n type McpAppMetadata,\n} from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport { unwrapModelContentEnvelope } from \"../../modelContentEnvelope\";\n\ntype MessageMetadata = ThreadMessageLike[\"metadata\"];\nexport type AISDKMessageConverterMetadata =\n useExternalMessageConverter.Metadata & {\n toolArgsKeyOrderCache?: Map<string, Map<string, string[]>>;\n toolLastInputCache?: Map<string, ReadonlyJSONObject>;\n mcpAppMetadataCache?: Map<string, McpAppMetadata>;\n };\n\nfunction stripClosingDelimiters(json: string): string {\n return json.replace(/[}\\]\"]+$/, \"\");\n}\n\nconst MCP_APP_METADATA_CACHE_MAX = 100;\n\nfunction extractMcpAppMetadata(\n part: unknown,\n cache: Map<string, McpAppMetadata> | undefined,\n): McpAppMetadata | undefined {\n if (!part || typeof part !== \"object\") return undefined;\n const meta = (part as { callProviderMetadata?: unknown })\n .callProviderMetadata;\n const mcp =\n meta && typeof meta === \"object\"\n ? (meta as { mcp?: unknown }).mcp\n : undefined;\n const app =\n mcp && typeof mcp === \"object\" ? (mcp as { app?: unknown }).app : undefined;\n let a: Record<string, unknown>;\n if (app && typeof app === \"object\") {\n a = app as Record<string, unknown>;\n } else {\n // MCP-UI tools (e.g. xmcp) surface the UI pointer as\n // result._meta[\"ui/resourceUri\"] rather than in callProviderMetadata.\n const output = (part as { output?: unknown }).output;\n const outMeta =\n output && typeof output === \"object\"\n ? (output as { _meta?: unknown })._meta\n : undefined;\n const uiResourceUri =\n outMeta && typeof outMeta === \"object\"\n ? (outMeta as Record<string, unknown>)[\"ui/resourceUri\"]\n : undefined;\n if (typeof uiResourceUri !== \"string\") return undefined;\n a = { resourceUri: uiResourceUri };\n }\n if (typeof a[\"resourceUri\"] !== \"string\") return undefined;\n if (!isMcpAppUri(a[\"resourceUri\"])) return undefined;\n const cached = cache?.get(a[\"resourceUri\"]);\n if (cached) {\n cache!.delete(a[\"resourceUri\"]);\n cache!.set(a[\"resourceUri\"], cached);\n return cached;\n }\n const out: { -readonly [K in keyof McpAppMetadata]: McpAppMetadata[K] } = {\n resourceUri: a[\"resourceUri\"],\n };\n if (typeof a[\"mimeType\"] === \"string\") out.mimeType = a[\"mimeType\"];\n if (Array.isArray(a[\"visibility\"])) {\n out.visibility = a[\"visibility\"].filter(\n (v): v is \"model\" | \"app\" => v === \"model\" || v === \"app\",\n );\n }\n if (cache) {\n if (cache.size >= MCP_APP_METADATA_CACHE_MAX) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n cache.set(a[\"resourceUri\"], out);\n }\n return out;\n}\n\nconst hasOwn = (value: object, key: string) => Object.hasOwn(value, key);\n\nconst stabilizeToolArgsValue = (\n value: unknown,\n path: string,\n keyOrderByPath: Map<string, string[]>,\n): unknown => {\n if (Array.isArray(value)) {\n return value.map((item, idx) =>\n stabilizeToolArgsValue(item, `${path}[${idx}]`, keyOrderByPath),\n );\n }\n\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n const currentKeys = Object.keys(record);\n const previousOrder = keyOrderByPath.get(path) ?? [];\n const previousOrderSet = new Set(previousOrder);\n const nextOrder = [\n ...previousOrder.filter((key) => hasOwn(record, key)),\n ...currentKeys.filter((key) => !previousOrderSet.has(key)),\n ];\n keyOrderByPath.set(path, nextOrder);\n\n return Object.fromEntries(\n nextOrder.map((key) => [\n key,\n stabilizeToolArgsValue(record[key], `${path}.${key}`, keyOrderByPath),\n ]),\n );\n }\n\n return value;\n};\n\nfunction stableStringifyToolArgs(\n keyOrderCache: Map<string, Map<string, string[]>> | undefined,\n cacheKey: string,\n args: ReadonlyJSONObject,\n): string {\n const keyOrderByPath = keyOrderCache?.get(cacheKey) ?? new Map();\n keyOrderCache?.set(cacheKey, keyOrderByPath);\n\n const stableArgs = stabilizeToolArgsValue(\n args,\n \"$\",\n keyOrderByPath,\n ) as ReadonlyJSONObject;\n return JSON.stringify(stableArgs);\n}\n\nfunction getToolApprovalAndInterrupt(\n part: {\n approval?:\n | {\n id: string;\n approved?: boolean;\n reason?: string;\n isAutomatic?: boolean;\n }\n | undefined;\n },\n toolStatus: { type: string; payload?: unknown } | undefined,\n): {\n approval?: NonNullable<ToolCallMessagePart[\"approval\"]>;\n interrupt?: NonNullable<ToolCallMessagePart[\"interrupt\"]>;\n} {\n if (part.approval && typeof part.approval.id === \"string\") {\n const { id, approved, reason, isAutomatic } = part.approval;\n return {\n approval: {\n id,\n ...(typeof approved === \"boolean\" && { approved }),\n ...(typeof reason === \"string\" && { reason }),\n ...(isAutomatic === true && { isAutomatic: true }),\n },\n };\n }\n\n if (toolStatus?.type === \"interrupt\") {\n return {\n interrupt: toolStatus.payload as NonNullable<\n ToolCallMessagePart[\"interrupt\"]\n >,\n };\n }\n\n return {};\n}\n\ntype MessageContent = Exclude<ThreadMessageLike[\"content\"], string>;\n\nfunction convertParts(\n message: UIMessage,\n metadata: AISDKMessageConverterMetadata,\n): MessageContent {\n if (!message.parts || message.parts.length === 0) {\n return [];\n }\n\n const converted = message.parts\n .filter(\n (p) =>\n p.type !== \"step-start\" &&\n (message.role !== \"user\" || p.type !== \"file\"),\n )\n .map((part) => {\n if (part.type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n } satisfies TextMessagePart;\n }\n\n if (part.type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n } satisfies ReasoningMessagePart;\n }\n\n if (isToolUIPart(part)) {\n const toolName = getToolName(part);\n const toolCallId = part.toolCallId;\n const argsKeyOrderCacheKey = `${message.id}:${toolCallId}`;\n\n const rawInput = part.input as ReadonlyJSONObject | null | undefined;\n let args: ReadonlyJSONObject;\n if (\n rawInput != null &&\n typeof rawInput === \"object\" &&\n !Array.isArray(rawInput)\n ) {\n args = rawInput;\n metadata.toolLastInputCache?.set(argsKeyOrderCacheKey, args);\n } else {\n args = metadata.toolLastInputCache?.get(argsKeyOrderCacheKey) ?? {};\n }\n\n let result: unknown;\n let modelContent: ToolCallMessagePart[\"modelContent\"];\n let isError = false;\n\n if (part.state === \"output-available\") {\n const unwrapped = unwrapModelContentEnvelope(part.output);\n result = unwrapped.result;\n modelContent = unwrapped.modelContent;\n } else if (part.state === \"output-error\") {\n isError = true;\n result = { error: part.errorText };\n } else if (part.state === \"output-denied\") {\n isError = true;\n result = {\n error:\n (part as { approval?: { reason?: string } }).approval?.reason ||\n \"Tool approval denied\",\n };\n }\n\n let argsText = stableStringifyToolArgs(\n metadata.toolArgsKeyOrderCache,\n argsKeyOrderCacheKey,\n args,\n );\n if (part.state === \"input-streaming\") {\n // strip closing delimiters added by the AI SDK's fix-json\n argsText = stripClosingDelimiters(argsText);\n } else {\n metadata.toolArgsKeyOrderCache?.delete(argsKeyOrderCacheKey);\n if (\n part.state === \"output-available\" ||\n part.state === \"output-error\" ||\n part.state === \"output-denied\"\n ) {\n metadata.toolLastInputCache?.delete(argsKeyOrderCacheKey);\n }\n }\n\n const toolStatus = metadata.toolStatuses?.[toolCallId];\n const mcpApp = extractMcpAppMetadata(\n part,\n metadata.mcpAppMetadataCache,\n );\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText,\n args,\n result,\n isError,\n ...(modelContent !== undefined && { modelContent }),\n ...(mcpApp && { mcp: { app: mcpApp } }),\n ...getToolApprovalAndInterrupt(part, toolStatus),\n } satisfies ToolCallMessagePart;\n }\n\n if (part.type === \"source-url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.sourceId,\n url: part.url,\n ...(part.title != null ? { title: part.title } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type === \"file\") {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n ...(part.filename != null && { filename: part.filename }),\n } satisfies FileMessagePart;\n }\n\n if (part.type === \"source-document\") {\n return {\n type: \"source\",\n sourceType: \"document\",\n id: part.sourceId,\n title: part.title,\n mediaType: part.mediaType,\n ...(part.filename != null ? { filename: part.filename } : undefined),\n ...(part.providerMetadata != null\n ? {\n providerMetadata:\n part.providerMetadata as SourceProviderMetadata,\n }\n : undefined),\n } satisfies SourceMessagePart;\n }\n\n if (part.type.startsWith(\"data-\")) {\n return {\n type: \"data\",\n name: part.type.substring(5),\n data: (part as any).data,\n } satisfies DataMessagePart;\n }\n\n console.warn(`Unsupported message part type: ${part.type}`);\n return null;\n })\n .filter(Boolean) as MessageContent[number][];\n\n const seenToolCallIds = new Set<string>();\n return converted.filter((part) => {\n if (part.type === \"tool-call\" && part.toolCallId != null) {\n if (seenToolCallIds.has(part.toolCallId)) return false;\n seenToolCallIds.add(part.toolCallId);\n }\n return true;\n });\n}\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: UIMessage, metadata: AISDKMessageConverterMetadata) => {\n const createdAt = new Date();\n const content = convertParts(message, metadata);\n\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt,\n content,\n attachments: message.parts\n ?.filter((p) => p.type === \"file\")\n .map((part, idx) => ({\n id: idx.toString(),\n type: part.mediaType.startsWith(\"image/\") ? \"image\" : \"file\",\n name: part.filename ?? \"file\",\n content: [\n part.mediaType.startsWith(\"image/\")\n ? {\n type: \"image\",\n image: part.url,\n filename: part.filename!,\n }\n : {\n type: \"file\",\n filename: part.filename!,\n data: part.url,\n mimeType: part.mediaType,\n },\n ],\n contentType: part.mediaType ?? \"unknown/unknown\",\n status: { type: \"complete\" as const },\n })),\n metadata: message.metadata as MessageMetadata,\n };\n\n case \"system\":\n case \"assistant\": {\n const timing = metadata.messageTiming?.[message.id];\n return {\n role: message.role,\n id: message.id,\n createdAt,\n content,\n metadata: {\n ...(message.metadata as MessageMetadata),\n ...(timing && { timing }),\n },\n };\n }\n\n default:\n console.warn(`Unsupported message role: ${message.role}`);\n return [];\n }\n },\n);\n"],"mappings":"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"}
@@ -1,3 +1,7 @@
1
- import type { UIMessage } from "ai";
2
- export declare const sliceMessagesUntil: <UI_MESSAGE extends UIMessage = UIMessage>(messages: UI_MESSAGE[], messageId: string | null) => UI_MESSAGE[];
1
+ import { UIMessage } from "ai";
2
+
3
+ //#region src/ui/utils/sliceMessagesUntil.d.ts
4
+ declare const sliceMessagesUntil: <UI_MESSAGE extends UIMessage = UIMessage>(messages: UI_MESSAGE[], messageId: string | null) => UI_MESSAGE[];
5
+ //#endregion
6
+ export { sliceMessagesUntil };
3
7
  //# sourceMappingURL=sliceMessagesUntil.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sliceMessagesUntil.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/sliceMessagesUntil.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,eAAO,MAAM,kBAAkB,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EACzE,UAAU,UAAU,EAAE,EACtB,WAAW,MAAM,GAAG,IAAI,iBAezB,CAAC"}
1
+ {"version":3,"file":"sliceMessagesUntil.d.ts","names":[],"sources":["../../../src/ui/utils/sliceMessagesUntil.ts"],"mappings":";;;cAEa,kBAAA,sBAAyC,SAAA,GAAY,SAAA,EAChE,QAAA,EAAU,UAAA,IACV,SAAA,oBAAwB,UAAA"}