@assistant-ui/react-ai-sdk 1.1.19 → 1.1.21

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 (37) hide show
  1. package/dist/frontendTools.js +5 -11
  2. package/dist/frontendTools.js.map +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/ui/adapters/aiSDKFormatAdapter.js +21 -26
  8. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  9. package/dist/ui/getVercelAIMessages.js +3 -9
  10. package/dist/ui/getVercelAIMessages.js.map +1 -1
  11. package/dist/ui/index.d.ts +4 -4
  12. package/dist/ui/index.d.ts.map +1 -1
  13. package/dist/ui/index.js +3 -9
  14. package/dist/ui/index.js.map +1 -1
  15. package/dist/ui/use-chat/AssistantChatTransport.js +50 -59
  16. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  17. package/dist/ui/use-chat/useAISDKRuntime.js +129 -148
  18. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  19. package/dist/ui/use-chat/useChatRuntime.d.ts +1 -1
  20. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  21. package/dist/ui/use-chat/useChatRuntime.js +42 -64
  22. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  23. package/dist/ui/use-chat/useExternalHistory.js +88 -95
  24. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  25. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  26. package/dist/ui/utils/convertMessage.js +188 -174
  27. package/dist/ui/utils/convertMessage.js.map +1 -1
  28. package/dist/ui/utils/sliceMessagesUntil.js +10 -15
  29. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  30. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  31. package/dist/ui/utils/toCreateMessage.js +38 -43
  32. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  33. package/dist/ui/utils/vercelAttachmentAdapter.js +36 -38
  34. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  35. package/package.json +26 -17
  36. package/src/ui/utils/convertMessage.ts +6 -9
  37. package/src/ui/utils/toCreateMessage.ts +1 -0
@@ -1,186 +1,200 @@
1
- // src/ui/utils/convertMessage.ts
2
1
  import { isToolUIPart } from "ai";
3
- import {
4
- unstable_createMessageConverter
5
- } from "@assistant-ui/react";
2
+ import { unstable_createMessageConverter, } from "@assistant-ui/react";
6
3
  function stripClosingDelimiters(json) {
7
- return json.replace(/[}\]"]+$/, "");
4
+ return json.replace(/[}\]"]+$/, "");
8
5
  }
9
- var convertParts = (message, metadata) => {
10
- if (!message.parts || message.parts.length === 0) {
11
- return [];
12
- }
13
- return message.parts.filter((p) => p.type !== "step-start" && p.type !== "file").map((part) => {
14
- const type = part.type;
15
- if (type === "text") {
16
- return {
17
- type: "text",
18
- text: part.text
19
- };
20
- }
21
- if (type === "reasoning") {
22
- return {
23
- type: "reasoning",
24
- text: part.text
25
- };
6
+ const convertParts = (message, metadata) => {
7
+ if (!message.parts || message.parts.length === 0) {
8
+ return [];
26
9
  }
27
- if (isToolUIPart(part)) {
28
- const toolName = type.replace("tool-", "");
29
- const toolCallId = part.toolCallId;
30
- let args = {};
31
- let result;
32
- let isError = false;
33
- if (part.state === "input-streaming" || part.state === "input-available") {
34
- args = part.input || {};
35
- } else if (part.state === "output-available") {
36
- args = part.input || {};
37
- result = part.output;
38
- } else if (part.state === "output-error") {
39
- args = part.input || {};
40
- isError = true;
41
- result = { error: part.errorText };
42
- }
43
- let argsText = JSON.stringify(args);
44
- if (part.state === "input-streaming") {
45
- argsText = stripClosingDelimiters(argsText);
46
- }
47
- const toolStatus = metadata.toolStatuses?.[toolCallId];
48
- return {
49
- type: "tool-call",
50
- toolName,
51
- toolCallId,
52
- argsText,
53
- args,
54
- result,
55
- isError,
56
- ...toolStatus?.type === "interrupt" && {
57
- interrupt: toolStatus.payload,
58
- status: {
59
- type: "requires-action",
60
- reason: "interrupt"
61
- }
10
+ return message.parts
11
+ .filter((p) => p.type !== "step-start" && p.type !== "file")
12
+ .map((part) => {
13
+ const type = part.type;
14
+ // Handle text parts
15
+ if (type === "text") {
16
+ return {
17
+ type: "text",
18
+ text: part.text,
19
+ };
62
20
  }
63
- };
64
- }
65
- if (type === "dynamic-tool") {
66
- const toolName = part.toolName;
67
- const toolCallId = part.toolCallId;
68
- let args = {};
69
- let result;
70
- let isError = false;
71
- if (part.state === "input-streaming" || part.state === "input-available") {
72
- args = part.input || {};
73
- } else if (part.state === "output-available") {
74
- args = part.input || {};
75
- result = part.output;
76
- } else if (part.state === "output-error") {
77
- args = part.input || {};
78
- isError = true;
79
- result = { error: part.errorText };
80
- }
81
- const toolStatus = metadata.toolStatuses?.[toolCallId];
82
- return {
83
- type: "tool-call",
84
- toolName,
85
- toolCallId,
86
- argsText: JSON.stringify(args),
87
- args,
88
- result,
89
- isError,
90
- ...toolStatus?.type === "interrupt" && {
91
- interrupt: toolStatus.payload,
92
- status: {
93
- type: "requires-action",
94
- reason: "interrupt"
95
- }
21
+ // Handle reasoning parts
22
+ if (type === "reasoning") {
23
+ return {
24
+ type: "reasoning",
25
+ text: part.text,
26
+ };
96
27
  }
97
- };
98
- }
99
- if (type === "source-url") {
100
- return {
101
- type: "source",
102
- sourceType: "url",
103
- id: part.sourceId,
104
- url: part.url,
105
- title: part.title || ""
106
- };
107
- }
108
- if (type === "source-document") {
109
- console.warn(
110
- `Source document part type ${type} is not yet supported in conversion`
111
- );
112
- return null;
113
- }
114
- if (type.startsWith("data-")) {
115
- const name = type.substring(5);
116
- return {
117
- type: "data",
118
- name,
119
- data: part.data
120
- };
121
- }
122
- console.warn(`Unsupported message part type: ${type}`);
123
- return null;
124
- }).filter(Boolean);
28
+ // Handle tool-* parts (AI SDK v5 tool calls)
29
+ if (isToolUIPart(part)) {
30
+ const toolName = type.replace("tool-", "");
31
+ const toolCallId = part.toolCallId;
32
+ // Extract args and result based on state
33
+ let args = {};
34
+ let result;
35
+ let isError = false;
36
+ if (part.state === "input-streaming" ||
37
+ part.state === "input-available") {
38
+ args = part.input || {};
39
+ }
40
+ else if (part.state === "output-available") {
41
+ args = part.input || {};
42
+ result = part.output;
43
+ }
44
+ else if (part.state === "output-error") {
45
+ args = part.input || {};
46
+ isError = true;
47
+ result = { error: part.errorText };
48
+ }
49
+ let argsText = JSON.stringify(args);
50
+ if (part.state === "input-streaming") {
51
+ // the argsText is not complete, so we need to strip the closing delimiters
52
+ // these are added by the AI SDK in fix-json
53
+ argsText = stripClosingDelimiters(argsText);
54
+ }
55
+ const toolStatus = metadata.toolStatuses?.[toolCallId];
56
+ return {
57
+ type: "tool-call",
58
+ toolName,
59
+ toolCallId,
60
+ argsText,
61
+ args,
62
+ result,
63
+ isError,
64
+ ...(toolStatus?.type === "interrupt" && {
65
+ interrupt: toolStatus.payload,
66
+ status: {
67
+ type: "requires-action",
68
+ reason: "interrupt",
69
+ },
70
+ }),
71
+ };
72
+ }
73
+ // Handle dynamic-tool parts
74
+ if (type === "dynamic-tool") {
75
+ const toolName = part.toolName;
76
+ const toolCallId = part.toolCallId;
77
+ // Extract args and result based on state
78
+ let args = {};
79
+ let result;
80
+ let isError = false;
81
+ if (part.state === "input-streaming" ||
82
+ part.state === "input-available") {
83
+ args = part.input || {};
84
+ }
85
+ else if (part.state === "output-available") {
86
+ args = part.input || {};
87
+ result = part.output;
88
+ }
89
+ else if (part.state === "output-error") {
90
+ args = part.input || {};
91
+ isError = true;
92
+ result = { error: part.errorText };
93
+ }
94
+ const toolStatus = metadata.toolStatuses?.[toolCallId];
95
+ return {
96
+ type: "tool-call",
97
+ toolName,
98
+ toolCallId,
99
+ argsText: JSON.stringify(args),
100
+ args,
101
+ result,
102
+ isError,
103
+ ...(toolStatus?.type === "interrupt" && {
104
+ interrupt: toolStatus.payload,
105
+ status: {
106
+ type: "requires-action",
107
+ reason: "interrupt",
108
+ },
109
+ }),
110
+ };
111
+ }
112
+ // Handle source-url parts
113
+ if (type === "source-url") {
114
+ return {
115
+ type: "source",
116
+ sourceType: "url",
117
+ id: part.sourceId,
118
+ url: part.url,
119
+ title: part.title || "",
120
+ };
121
+ }
122
+ // Handle source-document parts
123
+ if (type === "source-document") {
124
+ console.warn(`Source document part type ${type} is not yet supported in conversion`);
125
+ return null;
126
+ }
127
+ // Handle data-* parts (AI SDK v5 data parts)
128
+ if (type.startsWith("data-")) {
129
+ const name = type.substring(5);
130
+ return {
131
+ type: "data",
132
+ name,
133
+ data: part.data,
134
+ };
135
+ }
136
+ // For unsupported types, we'll skip them instead of throwing
137
+ console.warn(`Unsupported message part type: ${type}`);
138
+ return null;
139
+ })
140
+ .filter(Boolean);
125
141
  };
126
- var AISDKMessageConverter = unstable_createMessageConverter(
127
- (message, metadata) => {
128
- const createdAt = /* @__PURE__ */ new Date();
142
+ export const AISDKMessageConverter = unstable_createMessageConverter((message, metadata) => {
143
+ // UIMessage doesn't have createdAt, so we'll use current date or undefined
144
+ const createdAt = new Date();
129
145
  switch (message.role) {
130
- case "user":
131
- return {
132
- role: "user",
133
- id: message.id,
134
- createdAt,
135
- content: convertParts(message, metadata),
136
- attachments: message.parts?.filter((p) => p.type === "file").map((part, idx) => {
146
+ case "user":
137
147
  return {
138
- id: idx.toString(),
139
- type: part.mediaType.startsWith("image/") ? "image" : "file",
140
- name: part.filename ?? "file",
141
- content: [
142
- part.mediaType.startsWith("image/") ? {
143
- type: "image",
144
- image: part.url,
145
- filename: part.filename
146
- } : {
147
- type: "file",
148
- filename: part.filename,
149
- data: part.url,
150
- mimeType: part.mediaType
151
- }
152
- ],
153
- contentType: part.mediaType ?? "unknown/unknown",
154
- status: { type: "complete" }
148
+ role: "user",
149
+ id: message.id,
150
+ createdAt,
151
+ content: convertParts(message, metadata),
152
+ attachments: message.parts
153
+ ?.filter((p) => p.type === "file")
154
+ .map((part, idx) => {
155
+ return {
156
+ id: idx.toString(),
157
+ type: part.mediaType.startsWith("image/") ? "image" : "file",
158
+ name: part.filename ?? "file",
159
+ content: [
160
+ part.mediaType.startsWith("image/")
161
+ ? {
162
+ type: "image",
163
+ image: part.url,
164
+ filename: part.filename,
165
+ }
166
+ : {
167
+ type: "file",
168
+ filename: part.filename,
169
+ data: part.url,
170
+ mimeType: part.mediaType,
171
+ },
172
+ ],
173
+ contentType: part.mediaType ?? "unknown/unknown",
174
+ status: { type: "complete" },
175
+ };
176
+ }),
177
+ metadata: message.metadata,
155
178
  };
156
- })
157
- };
158
- case "system":
159
- return {
160
- role: "system",
161
- id: message.id,
162
- createdAt,
163
- content: convertParts(message, metadata)
164
- };
165
- case "assistant":
166
- return {
167
- role: "assistant",
168
- id: message.id,
169
- createdAt,
170
- content: convertParts(message, metadata),
171
- metadata: {
172
- unstable_annotations: message.annotations,
173
- unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0,
174
- custom: {}
175
- }
176
- };
177
- default:
178
- console.warn(`Unsupported message role: ${message.role}`);
179
- return [];
179
+ case "system":
180
+ return {
181
+ role: "system",
182
+ id: message.id,
183
+ createdAt,
184
+ content: convertParts(message, metadata),
185
+ metadata: message.metadata,
186
+ };
187
+ case "assistant":
188
+ return {
189
+ role: "assistant",
190
+ id: message.id,
191
+ createdAt,
192
+ content: convertParts(message, metadata),
193
+ metadata: message.metadata,
194
+ };
195
+ default:
196
+ console.warn(`Unsupported message role: ${message.role}`);
197
+ return [];
180
198
  }
181
- }
182
- );
183
- export {
184
- AISDKMessageConverter
185
- };
199
+ });
186
200
  //# sourceMappingURL=convertMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/utils/convertMessage.ts"],"sourcesContent":["import { isToolUIPart, type UIMessage } from \"ai\";\nimport {\n unstable_createMessageConverter,\n type ReasoningMessagePart,\n type ToolCallMessagePart,\n type TextMessagePart,\n type DataMessagePart,\n type SourceMessagePart,\n type useExternalMessageConverter,\n} from \"@assistant-ui/react\";\n\nfunction stripClosingDelimiters(json: string) {\n return json.replace(/[}\\]\"]+$/, \"\");\n}\n\nconst convertParts = (\n message: UIMessage,\n metadata: useExternalMessageConverter.Metadata,\n) => {\n if (!message.parts || message.parts.length === 0) {\n return [];\n }\n\n return message.parts\n .filter((p) => p.type !== \"step-start\" && p.type !== \"file\")\n .map((part) => {\n const type = part.type;\n\n // Handle text parts\n if (type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n } satisfies TextMessagePart;\n }\n\n // Handle reasoning parts\n if (type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n } satisfies ReasoningMessagePart;\n }\n\n // Handle tool-* parts (AI SDK v5 tool calls)\n if (isToolUIPart(part)) {\n const toolName = type.replace(\"tool-\", \"\");\n const toolCallId = part.toolCallId;\n\n // Extract args and result based on state\n let args: any = {};\n let result: any;\n let isError = false;\n\n if (\n part.state === \"input-streaming\" ||\n part.state === \"input-available\"\n ) {\n args = part.input || {};\n } else if (part.state === \"output-available\") {\n args = part.input || {};\n result = part.output;\n } else if (part.state === \"output-error\") {\n args = part.input || {};\n isError = true;\n result = { error: part.errorText };\n }\n\n let argsText = JSON.stringify(args);\n if (part.state === \"input-streaming\") {\n // the argsText is not complete, so we need to strip the closing delimiters\n // these are added by the AI SDK in fix-json\n argsText = stripClosingDelimiters(argsText);\n }\n\n const toolStatus = metadata.toolStatuses?.[toolCallId];\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText,\n args,\n result,\n isError,\n ...(toolStatus?.type === \"interrupt\" && {\n interrupt: toolStatus.payload,\n status: {\n type: \"requires-action\" as const,\n reason: \"interrupt\",\n },\n }),\n } satisfies ToolCallMessagePart;\n }\n\n // Handle dynamic-tool parts\n if (type === \"dynamic-tool\") {\n const toolName = part.toolName;\n const toolCallId = part.toolCallId;\n\n // Extract args and result based on state\n let args: any = {};\n let result: any;\n let isError = false;\n\n if (\n part.state === \"input-streaming\" ||\n part.state === \"input-available\"\n ) {\n args = part.input || {};\n } else if (part.state === \"output-available\") {\n args = part.input || {};\n result = part.output;\n } else if (part.state === \"output-error\") {\n args = part.input || {};\n isError = true;\n result = { error: part.errorText };\n }\n\n const toolStatus = metadata.toolStatuses?.[toolCallId];\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText: JSON.stringify(args),\n args,\n result,\n isError,\n ...(toolStatus?.type === \"interrupt\" && {\n interrupt: toolStatus.payload,\n status: {\n type: \"requires-action\" as const,\n reason: \"interrupt\",\n },\n }),\n } satisfies ToolCallMessagePart;\n }\n\n // Handle source-url parts\n if (type === \"source-url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.sourceId,\n url: part.url,\n title: part.title || \"\",\n } satisfies SourceMessagePart;\n }\n\n // Handle source-document parts\n if (type === \"source-document\") {\n console.warn(\n `Source document part type ${type} is not yet supported in conversion`,\n );\n return null;\n }\n\n // Handle data-* parts (AI SDK v5 data parts)\n if (type.startsWith(\"data-\")) {\n const name = type.substring(5);\n return {\n type: \"data\",\n name,\n data: (part as any).data,\n } satisfies DataMessagePart;\n }\n\n // For unsupported types, we'll skip them instead of throwing\n console.warn(`Unsupported message part type: ${type}`);\n return null;\n })\n .filter(Boolean) as any[];\n};\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: UIMessage, metadata: useExternalMessageConverter.Metadata) => {\n // UIMessage doesn't have createdAt, so we'll use current date or undefined\n const createdAt = new Date();\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt,\n content: convertParts(message, metadata),\n attachments: message.parts\n ?.filter((p) => p.type === \"file\")\n .map((part, idx) => {\n return {\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 }),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt,\n content: convertParts(message, metadata),\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt,\n content: convertParts(message, metadata),\n metadata: {\n unstable_annotations: (message as any).annotations,\n unstable_data: Array.isArray((message as any).data)\n ? (message as any).data\n : (message as any).data\n ? [(message as any).data]\n : undefined,\n custom: {},\n },\n };\n\n default:\n console.warn(`Unsupported message role: ${message.role}`);\n return [];\n }\n },\n);\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"convertMessage.js","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,12 @@
1
- // src/ui/utils/sliceMessagesUntil.tsx
2
- var sliceMessagesUntil = (messages, messageId) => {
3
- if (messageId == null) return [];
4
- let messageIdx = messages.findIndex((m) => m.id === messageId);
5
- if (messageIdx === -1)
6
- throw new Error(
7
- "useVercelAIThreadState: Message not found. This is likely an internal bug in assistant-ui."
8
- );
9
- while (messages[messageIdx + 1]?.role === "assistant") {
10
- messageIdx++;
11
- }
12
- return messages.slice(0, messageIdx + 1);
13
- };
14
- export {
15
- sliceMessagesUntil
1
+ export const sliceMessagesUntil = (messages, messageId) => {
2
+ if (messageId == null)
3
+ return [];
4
+ let messageIdx = messages.findIndex((m) => m.id === messageId);
5
+ if (messageIdx === -1)
6
+ throw new Error("useVercelAIThreadState: Message not found. This is likely an internal bug in assistant-ui.");
7
+ while (messages[messageIdx + 1]?.role === "assistant") {
8
+ messageIdx++;
9
+ }
10
+ return messages.slice(0, messageIdx + 1);
16
11
  };
17
12
  //# sourceMappingURL=sliceMessagesUntil.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"sourcesContent":["import type { UIMessage } from \"ai\";\n\nexport const sliceMessagesUntil = <UI_MESSAGE extends UIMessage = UIMessage>(\n messages: UI_MESSAGE[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n"],"mappings":";AAEO,IAAM,qBAAqB,CAChC,UACA,cACG;AACH,MAAI,aAAa,KAAM,QAAO,CAAC;AAE/B,MAAI,aAAa,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC7D,MAAI,eAAe;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,SAAO,SAAS,aAAa,CAAC,GAAG,SAAS,aAAa;AACrD;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,GAAG,aAAa,CAAC;AACzC;","names":[]}
1
+ {"version":3,"file":"sliceMessagesUntil.js","sourceRoot":"","sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAsB,EACtB,SAAwB,EACxB,EAAE;IACF,IAAI,SAAS,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IAC/D,IAAI,UAAU,KAAK,CAAC,CAAC;QACnB,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IAEJ,OAAO,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QACtD,UAAU,EAAE,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"toCreateMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/toCreateMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,eAAe,EAEf,SAAS,EAGV,MAAM,IAAI,CAAC;AAEZ,eAAO,MAAM,eAAe,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EACtE,SAAS,aAAa,KACrB,eAAe,CAAC,UAAU,CAyC5B,CAAC"}
1
+ {"version":3,"file":"toCreateMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/toCreateMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,eAAe,EAEf,SAAS,EAGV,MAAM,IAAI,CAAC;AAEZ,eAAO,MAAM,eAAe,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EACtE,SAAS,aAAa,KACrB,eAAe,CAAC,UAAU,CA0C5B,CAAC"}
@@ -1,45 +1,40 @@
1
- // src/ui/utils/toCreateMessage.ts
2
- var toCreateMessage = (message) => {
3
- const inputParts = [
4
- ...message.content.filter((c) => c.type !== "file"),
5
- ...message.attachments?.flatMap(
6
- (a) => a.content.map((c) => ({
7
- ...c,
8
- filename: a.name
9
- }))
10
- ) ?? []
11
- ];
12
- const parts = inputParts.map((part) => {
13
- switch (part.type) {
14
- case "text":
15
- return {
16
- type: "text",
17
- text: part.text
18
- };
19
- case "image":
20
- return {
21
- type: "file",
22
- url: part.image,
23
- ...part.filename && { filename: part.filename },
24
- mediaType: "image/png"
25
- };
26
- case "file":
27
- return {
28
- type: "file",
29
- url: part.data,
30
- mediaType: part.mimeType,
31
- ...part.filename && { filename: part.filename }
32
- };
33
- default:
34
- throw new Error(`Unsupported part type: ${part.type}`);
35
- }
36
- });
37
- return {
38
- role: message.role,
39
- parts
40
- };
41
- };
42
- export {
43
- toCreateMessage
1
+ export const toCreateMessage = (message) => {
2
+ const inputParts = [
3
+ ...message.content.filter((c) => c.type !== "file"),
4
+ ...(message.attachments?.flatMap((a) => a.content.map((c) => ({
5
+ ...c,
6
+ filename: a.name,
7
+ }))) ?? []),
8
+ ];
9
+ const parts = inputParts.map((part) => {
10
+ switch (part.type) {
11
+ case "text":
12
+ return {
13
+ type: "text",
14
+ text: part.text,
15
+ };
16
+ case "image":
17
+ return {
18
+ type: "file",
19
+ url: part.image,
20
+ ...(part.filename && { filename: part.filename }),
21
+ mediaType: "image/png",
22
+ };
23
+ case "file":
24
+ return {
25
+ type: "file",
26
+ url: part.data,
27
+ mediaType: part.mimeType,
28
+ ...(part.filename && { filename: part.filename }),
29
+ };
30
+ default:
31
+ throw new Error(`Unsupported part type: ${part.type}`);
32
+ }
33
+ });
34
+ return {
35
+ role: message.role,
36
+ parts,
37
+ metadata: message.metadata,
38
+ };
44
39
  };
45
40
  //# sourceMappingURL=toCreateMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/utils/toCreateMessage.ts"],"sourcesContent":["import { AppendMessage } from \"@assistant-ui/react\";\nimport {\n CreateUIMessage,\n UIDataTypes,\n UIMessage,\n UIMessagePart,\n UITools,\n} from \"ai\";\n\nexport const toCreateMessage = <UI_MESSAGE extends UIMessage = UIMessage>(\n message: AppendMessage,\n): CreateUIMessage<UI_MESSAGE> => {\n const inputParts = [\n ...message.content.filter((c) => c.type !== \"file\"),\n ...(message.attachments?.flatMap((a) =>\n a.content.map((c) => ({\n ...c,\n filename: a.name,\n })),\n ) ?? []),\n ];\n\n const parts = inputParts.map((part): UIMessagePart<UIDataTypes, UITools> => {\n switch (part.type) {\n case \"text\":\n return {\n type: \"text\",\n text: part.text,\n };\n case \"image\":\n return {\n type: \"file\",\n url: part.image,\n ...(part.filename && { filename: part.filename }),\n mediaType: \"image/png\",\n };\n case \"file\":\n return {\n type: \"file\",\n url: part.data,\n mediaType: part.mimeType,\n ...(part.filename && { filename: part.filename }),\n };\n default:\n throw new Error(`Unsupported part type: ${part.type}`);\n }\n });\n\n return {\n role: message.role,\n parts,\n } satisfies CreateUIMessage<UIMessage> as CreateUIMessage<UI_MESSAGE>;\n};\n"],"mappings":";AASO,IAAM,kBAAkB,CAC7B,YACgC;AAChC,QAAM,aAAa;AAAA,IACjB,GAAG,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAAA,IAClD,GAAI,QAAQ,aAAa;AAAA,MAAQ,CAAC,MAChC,EAAE,QAAQ,IAAI,CAAC,OAAO;AAAA,QACpB,GAAG;AAAA,QACH,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,IACJ,KAAK,CAAC;AAAA,EACR;AAEA,QAAM,QAAQ,WAAW,IAAI,CAAC,SAA8C;AAC1E,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,QACb;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,KAAK;AAAA,UACV,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,SAAS;AAAA,UAC/C,WAAW;AAAA,QACb;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,KAAK;AAAA,UACV,WAAW,KAAK;AAAA,UAChB,GAAI,KAAK,YAAY,EAAE,UAAU,KAAK,SAAS;AAAA,QACjD;AAAA,MACF;AACE,cAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI,EAAE;AAAA,IACzD;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"file":"toCreateMessage.js","sourceRoot":"","sources":["../../../src/ui/utils/toCreateMessage.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAsB,EACO,EAAE;IAC/B,MAAM,UAAU,GAAG;QACjB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACrC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,GAAG,CAAC;YACJ,QAAQ,EAAE,CAAC,CAAC,IAAI;SACjB,CAAC,CAAC,CACJ,IAAI,EAAE,CAAC;KACT,CAAC;IAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAuC,EAAE;QACzE,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,MAAM;gBACT,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC;YACJ,KAAK,OAAO;gBACV,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,IAAI,CAAC,KAAK;oBACf,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACjD,SAAS,EAAE,WAAW;iBACvB,CAAC;YACJ,KAAK,MAAM;gBACT,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,GAAG,EAAE,IAAI,CAAC,IAAI;oBACd,SAAS,EAAE,IAAI,CAAC,QAAQ;oBACxB,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;iBAClD,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;KACyC,CAAC;AACxE,CAAC,CAAC"}
@@ -1,42 +1,40 @@
1
- // src/ui/utils/vercelAttachmentAdapter.ts
2
1
  import { generateId } from "ai";
3
- var getFileDataURL = (file) => new Promise((resolve, reject) => {
4
- const reader = new FileReader();
5
- reader.onload = () => resolve(reader.result);
6
- reader.onerror = (error) => reject(error);
7
- reader.readAsDataURL(file);
2
+ const getFileDataURL = (file) => new Promise((resolve, reject) => {
3
+ const reader = new FileReader();
4
+ reader.onload = () => resolve(reader.result);
5
+ reader.onerror = (error) => reject(error);
6
+ reader.readAsDataURL(file);
8
7
  });
9
- var vercelAttachmentAdapter = {
10
- accept: "image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css",
11
- async add({ file }) {
12
- return {
13
- id: generateId(),
14
- type: file.type.startsWith("image/") ? "image" : "file",
15
- name: file.name,
16
- file,
17
- contentType: file.type,
18
- content: [],
19
- status: { type: "requires-action", reason: "composer-send" }
20
- };
21
- },
22
- async send(attachment) {
23
- return {
24
- ...attachment,
25
- status: { type: "complete" },
26
- content: [
27
- {
28
- type: "file",
29
- mimeType: attachment.contentType,
30
- filename: attachment.name,
31
- data: await getFileDataURL(attachment.file)
32
- }
33
- ]
34
- };
35
- },
36
- async remove() {
37
- }
38
- };
39
- export {
40
- vercelAttachmentAdapter
8
+ export const vercelAttachmentAdapter = {
9
+ accept: "image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css",
10
+ async add({ file }) {
11
+ return {
12
+ id: generateId(),
13
+ type: file.type.startsWith("image/") ? "image" : "file",
14
+ name: file.name,
15
+ file,
16
+ contentType: file.type,
17
+ content: [],
18
+ status: { type: "requires-action", reason: "composer-send" },
19
+ };
20
+ },
21
+ async send(attachment) {
22
+ // noop
23
+ return {
24
+ ...attachment,
25
+ status: { type: "complete" },
26
+ content: [
27
+ {
28
+ type: "file",
29
+ mimeType: attachment.contentType,
30
+ filename: attachment.name,
31
+ data: await getFileDataURL(attachment.file),
32
+ },
33
+ ],
34
+ };
35
+ },
36
+ async remove() {
37
+ // noop
38
+ },
41
39
  };
42
40
  //# sourceMappingURL=vercelAttachmentAdapter.js.map