@assistant-ui/react-ai-sdk 0.7.11 → 0.7.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +22 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -151,7 +151,11 @@ var convertMessage = (message) => {
|
|
|
151
151
|
result: "result" in t ? t.result : void 0
|
|
152
152
|
})
|
|
153
153
|
) ?? []
|
|
154
|
-
]
|
|
154
|
+
],
|
|
155
|
+
metadata: {
|
|
156
|
+
unstable_annotations: message.annotations,
|
|
157
|
+
unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0
|
|
158
|
+
}
|
|
155
159
|
};
|
|
156
160
|
case "data": {
|
|
157
161
|
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
@@ -187,21 +191,15 @@ var import_react7 = require("@assistant-ui/react");
|
|
|
187
191
|
|
|
188
192
|
// src/ui/utils/useInputSync.tsx
|
|
189
193
|
var import_react5 = require("react");
|
|
190
|
-
var
|
|
191
|
-
var useInputSync = (helpers, runtime) => {
|
|
194
|
+
var useInputSync = ({ setInput, input }, runtime) => {
|
|
192
195
|
(0, import_react5.useEffect)(() => {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
}, [helpers, runtime]);
|
|
197
|
-
const handleThreadUpdate = (0, import_react_use_callback_ref.useCallbackRef)(() => {
|
|
198
|
-
if (runtime.thread.composer.getState().text !== helpers.input) {
|
|
199
|
-
helpers.setInput(runtime.thread.composer.getState().text);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
196
|
+
runtime.thread.composer.setText(input);
|
|
197
|
+
}, [runtime, input]);
|
|
202
198
|
(0, import_react5.useEffect)(() => {
|
|
203
|
-
return runtime.thread.subscribe(
|
|
204
|
-
|
|
199
|
+
return runtime.thread.composer.subscribe(() => {
|
|
200
|
+
setInput(runtime.thread.composer.getState().text);
|
|
201
|
+
});
|
|
202
|
+
}, [runtime, setInput]);
|
|
205
203
|
};
|
|
206
204
|
|
|
207
205
|
// src/ui/utils/sliceMessagesUntil.tsx
|
|
@@ -281,12 +279,15 @@ var getVercelAIMessages = (message) => {
|
|
|
281
279
|
};
|
|
282
280
|
|
|
283
281
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
282
|
+
var import_react8 = require("react");
|
|
283
|
+
var import_ui_utils2 = require("@ai-sdk/ui-utils");
|
|
284
284
|
var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
285
285
|
const messages = (0, import_react7.useExternalMessageConverter)({
|
|
286
286
|
callback: convertMessage,
|
|
287
287
|
isRunning: chatHelpers.isLoading,
|
|
288
288
|
messages: chatHelpers.messages
|
|
289
289
|
});
|
|
290
|
+
const [threadId, setThreadId] = (0, import_react8.useState)((0, import_ui_utils2.generateId)());
|
|
290
291
|
const runtime = (0, import_react7.useExternalStoreRuntime)({
|
|
291
292
|
isRunning: chatHelpers.isLoading,
|
|
292
293
|
messages,
|
|
@@ -316,12 +317,16 @@ var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
|
316
317
|
...adapter.adapters,
|
|
317
318
|
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
318
319
|
get(target, prop, receiver) {
|
|
320
|
+
if (prop === "threadId") {
|
|
321
|
+
return target.threadId ?? threadId;
|
|
322
|
+
}
|
|
319
323
|
if (prop === "onSwitchToNewThread") {
|
|
320
324
|
return () => {
|
|
321
325
|
chatHelpers.messages = [];
|
|
322
326
|
chatHelpers.input = "";
|
|
323
327
|
chatHelpers.setMessages([]);
|
|
324
328
|
chatHelpers.setInput("");
|
|
329
|
+
setThreadId((0, import_ui_utils2.generateId)());
|
|
325
330
|
if (typeof target.onSwitchToNewThread === "function") {
|
|
326
331
|
return target.onSwitchToNewThread.call(target);
|
|
327
332
|
}
|
|
@@ -337,14 +342,14 @@ var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
|
337
342
|
};
|
|
338
343
|
|
|
339
344
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
340
|
-
var
|
|
345
|
+
var import_react9 = require("@assistant-ui/react");
|
|
341
346
|
var useVercelUseAssistantRuntime = (assistantHelpers, adapter = {}) => {
|
|
342
|
-
const messages = (0,
|
|
347
|
+
const messages = (0, import_react9.useExternalMessageConverter)({
|
|
343
348
|
callback: convertMessage,
|
|
344
349
|
isRunning: assistantHelpers.status === "in_progress",
|
|
345
350
|
messages: assistantHelpers.messages
|
|
346
351
|
});
|
|
347
|
-
const runtime = (0,
|
|
352
|
+
const runtime = (0, import_react9.useExternalStoreRuntime)({
|
|
348
353
|
isRunning: assistantHelpers.status === "in_progress",
|
|
349
354
|
messages,
|
|
350
355
|
onCancel: async () => assistantHelpers.stop(),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/utils/RSCThreadExtras.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/rsc/RSCDisplay.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useCallback, useMemo } from \"react\";\nimport { symbolInternalRSCExtras } from \"./utils/RSCThreadExtras\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n\n const convertFn = useMemo(() => {\n return (\n adapter.convertMessage?.bind(adapter) ?? ((m: T) => m as VercelRSCMessage)\n );\n }, [adapter.convertMessage]);\n const callback = useCallback(\n (m: T) => {\n return vercelToThreadMessage(convertFn, m);\n },\n [convertFn],\n );\n\n const messages = useExternalMessageConverter({\n callback,\n isRunning: adapter.isRunning ?? false,\n messages: adapter.messages,\n });\n\n const eAdapter: ExternalStoreAdapter = {\n isRunning: adapter.isRunning,\n messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n extras: {\n [symbolInternalRSCExtras]: { convertFn },\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","\"use client\";\nimport { VercelRSCMessage } from \"../VercelRSCMessage\";\n\nexport const symbolInternalRSCExtras = Symbol(\"internal-rsc-extras\");\nexport type RSCThreadExtras =\n | {\n [symbolInternalRSCExtras]?: {\n convertFn: (message: any) => VercelRSCMessage;\n };\n }\n | undefined;\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\n/**\n * @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC\n * implementation and has been replaced by a more generic external store message handler.\n */\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","\"use client\";\nimport {\n TextContentPartComponent,\n useThread,\n useMessage,\n getExternalStoreMessage,\n} from \"@assistant-ui/react\";\nimport {\n RSCThreadExtras,\n symbolInternalRSCExtras,\n} from \"./utils/RSCThreadExtras\";\n\nexport const RSCDisplay: TextContentPartComponent = () => {\n const convertFn = useThread((t) => {\n const extras = (t.extras as RSCThreadExtras)?.[symbolInternalRSCExtras];\n if (!extras)\n throw new Error(\n \"This function can only be used inside a Vercel RSC runtime.\",\n );\n return extras.convertFn;\n });\n return useMessage((m) => convertFn(getExternalStoreMessage(m)).display);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: 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 liekly 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","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_react","messages","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/utils/RSCThreadExtras.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/rsc/RSCDisplay.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useCallback, useMemo } from \"react\";\nimport { symbolInternalRSCExtras } from \"./utils/RSCThreadExtras\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n\n const convertFn = useMemo(() => {\n return (\n adapter.convertMessage?.bind(adapter) ?? ((m: T) => m as VercelRSCMessage)\n );\n }, [adapter.convertMessage]);\n const callback = useCallback(\n (m: T) => {\n return vercelToThreadMessage(convertFn, m);\n },\n [convertFn],\n );\n\n const messages = useExternalMessageConverter({\n callback,\n isRunning: adapter.isRunning ?? false,\n messages: adapter.messages,\n });\n\n const eAdapter: ExternalStoreAdapter = {\n isRunning: adapter.isRunning,\n messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n extras: {\n [symbolInternalRSCExtras]: { convertFn },\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","\"use client\";\nimport { VercelRSCMessage } from \"../VercelRSCMessage\";\n\nexport const symbolInternalRSCExtras = Symbol(\"internal-rsc-extras\");\nexport type RSCThreadExtras =\n | {\n [symbolInternalRSCExtras]?: {\n convertFn: (message: any) => VercelRSCMessage;\n };\n }\n | undefined;\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\n/**\n * @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC\n * implementation and has been replaced by a more generic external store message handler.\n */\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","\"use client\";\nimport {\n TextContentPartComponent,\n useThread,\n useMessage,\n getExternalStoreMessage,\n} from \"@assistant-ui/react\";\nimport {\n RSCThreadExtras,\n symbolInternalRSCExtras,\n} from \"./utils/RSCThreadExtras\";\n\nexport const RSCDisplay: TextContentPartComponent = () => {\n const convertFn = useThread((t) => {\n const extras = (t.extras as RSCThreadExtras)?.[symbolInternalRSCExtras];\n if (!extras)\n throw new Error(\n \"This function can only be used inside a Vercel RSC runtime.\",\n );\n return extras.convertFn;\n });\n return useMessage((m) => convertFn(getExternalStoreMessage(m)).display);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n metadata: {\n unstable_annotations: message.annotations,\n unstable_data: Array.isArray(message.data)\n ? message.data\n : message.data\n ? [message.data]\n : undefined,\n },\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { useState } from \"react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const [threadId, setThreadId] = useState<string>(generateId());\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"threadId\") {\n return target.threadId ?? threadId;\n }\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n setThreadId(generateId());\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n { setInput, input }: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n runtime.thread.composer.setText(input);\n }, [runtime, input]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return runtime.thread.composer.subscribe(() => {\n setInput(runtime.thread.composer.getState().text);\n });\n }, [runtime, setInput]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: 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 liekly 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","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_react","import_react","import_ui_utils","messages","import_react"]}
|
package/dist/index.mjs
CHANGED
|
@@ -129,7 +129,11 @@ var convertMessage = (message) => {
|
|
|
129
129
|
result: "result" in t ? t.result : void 0
|
|
130
130
|
})
|
|
131
131
|
) ?? []
|
|
132
|
-
]
|
|
132
|
+
],
|
|
133
|
+
metadata: {
|
|
134
|
+
unstable_annotations: message.annotations,
|
|
135
|
+
unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0
|
|
136
|
+
}
|
|
133
137
|
};
|
|
134
138
|
case "data": {
|
|
135
139
|
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
@@ -168,21 +172,15 @@ import {
|
|
|
168
172
|
|
|
169
173
|
// src/ui/utils/useInputSync.tsx
|
|
170
174
|
import { useEffect } from "react";
|
|
171
|
-
|
|
172
|
-
var useInputSync = (helpers, runtime) => {
|
|
175
|
+
var useInputSync = ({ setInput, input }, runtime) => {
|
|
173
176
|
useEffect(() => {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
177
|
-
}, [helpers, runtime]);
|
|
178
|
-
const handleThreadUpdate = useCallbackRef(() => {
|
|
179
|
-
if (runtime.thread.composer.getState().text !== helpers.input) {
|
|
180
|
-
helpers.setInput(runtime.thread.composer.getState().text);
|
|
181
|
-
}
|
|
182
|
-
});
|
|
177
|
+
runtime.thread.composer.setText(input);
|
|
178
|
+
}, [runtime, input]);
|
|
183
179
|
useEffect(() => {
|
|
184
|
-
return runtime.thread.subscribe(
|
|
185
|
-
|
|
180
|
+
return runtime.thread.composer.subscribe(() => {
|
|
181
|
+
setInput(runtime.thread.composer.getState().text);
|
|
182
|
+
});
|
|
183
|
+
}, [runtime, setInput]);
|
|
186
184
|
};
|
|
187
185
|
|
|
188
186
|
// src/ui/utils/sliceMessagesUntil.tsx
|
|
@@ -264,12 +262,15 @@ var getVercelAIMessages = (message) => {
|
|
|
264
262
|
};
|
|
265
263
|
|
|
266
264
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
265
|
+
import { useState } from "react";
|
|
266
|
+
import { generateId as generateId2 } from "@ai-sdk/ui-utils";
|
|
267
267
|
var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
268
268
|
const messages = useExternalMessageConverter2({
|
|
269
269
|
callback: convertMessage,
|
|
270
270
|
isRunning: chatHelpers.isLoading,
|
|
271
271
|
messages: chatHelpers.messages
|
|
272
272
|
});
|
|
273
|
+
const [threadId, setThreadId] = useState(generateId2());
|
|
273
274
|
const runtime = useExternalStoreRuntime2({
|
|
274
275
|
isRunning: chatHelpers.isLoading,
|
|
275
276
|
messages,
|
|
@@ -299,12 +300,16 @@ var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
|
299
300
|
...adapter.adapters,
|
|
300
301
|
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
301
302
|
get(target, prop, receiver) {
|
|
303
|
+
if (prop === "threadId") {
|
|
304
|
+
return target.threadId ?? threadId;
|
|
305
|
+
}
|
|
302
306
|
if (prop === "onSwitchToNewThread") {
|
|
303
307
|
return () => {
|
|
304
308
|
chatHelpers.messages = [];
|
|
305
309
|
chatHelpers.input = "";
|
|
306
310
|
chatHelpers.setMessages([]);
|
|
307
311
|
chatHelpers.setInput("");
|
|
312
|
+
setThreadId(generateId2());
|
|
308
313
|
if (typeof target.onSwitchToNewThread === "function") {
|
|
309
314
|
return target.onSwitchToNewThread.call(target);
|
|
310
315
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/utils/RSCThreadExtras.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/rsc/RSCDisplay.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useCallback, useMemo } from \"react\";\nimport { symbolInternalRSCExtras } from \"./utils/RSCThreadExtras\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n\n const convertFn = useMemo(() => {\n return (\n adapter.convertMessage?.bind(adapter) ?? ((m: T) => m as VercelRSCMessage)\n );\n }, [adapter.convertMessage]);\n const callback = useCallback(\n (m: T) => {\n return vercelToThreadMessage(convertFn, m);\n },\n [convertFn],\n );\n\n const messages = useExternalMessageConverter({\n callback,\n isRunning: adapter.isRunning ?? false,\n messages: adapter.messages,\n });\n\n const eAdapter: ExternalStoreAdapter = {\n isRunning: adapter.isRunning,\n messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n extras: {\n [symbolInternalRSCExtras]: { convertFn },\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","\"use client\";\nimport { VercelRSCMessage } from \"../VercelRSCMessage\";\n\nexport const symbolInternalRSCExtras = Symbol(\"internal-rsc-extras\");\nexport type RSCThreadExtras =\n | {\n [symbolInternalRSCExtras]?: {\n convertFn: (message: any) => VercelRSCMessage;\n };\n }\n | undefined;\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\n/**\n * @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC\n * implementation and has been replaced by a more generic external store message handler.\n */\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","\"use client\";\nimport {\n TextContentPartComponent,\n useThread,\n useMessage,\n getExternalStoreMessage,\n} from \"@assistant-ui/react\";\nimport {\n RSCThreadExtras,\n symbolInternalRSCExtras,\n} from \"./utils/RSCThreadExtras\";\n\nexport const RSCDisplay: TextContentPartComponent = () => {\n const convertFn = useThread((t) => {\n const extras = (t.extras as RSCThreadExtras)?.[symbolInternalRSCExtras];\n if (!extras)\n throw new Error(\n \"This function can only be used inside a Vercel RSC runtime.\",\n );\n return extras.convertFn;\n });\n return useMessage((m) => convertFn(getExternalStoreMessage(m)).display);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: 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 liekly 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","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["getExternalStoreMessage","getExternalStoreMessage","useExternalMessageConverter","useExternalStoreRuntime","getExternalStoreMessage","useExternalMessageConverter","useExternalStoreRuntime","messages","useExternalMessageConverter","useExternalStoreRuntime","useExternalMessageConverter","useExternalStoreRuntime"]}
|
|
1
|
+
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/utils/RSCThreadExtras.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/rsc/RSCDisplay.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useCallback, useMemo } from \"react\";\nimport { symbolInternalRSCExtras } from \"./utils/RSCThreadExtras\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n\n const convertFn = useMemo(() => {\n return (\n adapter.convertMessage?.bind(adapter) ?? ((m: T) => m as VercelRSCMessage)\n );\n }, [adapter.convertMessage]);\n const callback = useCallback(\n (m: T) => {\n return vercelToThreadMessage(convertFn, m);\n },\n [convertFn],\n );\n\n const messages = useExternalMessageConverter({\n callback,\n isRunning: adapter.isRunning ?? false,\n messages: adapter.messages,\n });\n\n const eAdapter: ExternalStoreAdapter = {\n isRunning: adapter.isRunning,\n messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n extras: {\n [symbolInternalRSCExtras]: { convertFn },\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","\"use client\";\nimport { VercelRSCMessage } from \"../VercelRSCMessage\";\n\nexport const symbolInternalRSCExtras = Symbol(\"internal-rsc-extras\");\nexport type RSCThreadExtras =\n | {\n [symbolInternalRSCExtras]?: {\n convertFn: (message: any) => VercelRSCMessage;\n };\n }\n | undefined;\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\n/**\n * @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC\n * implementation and has been replaced by a more generic external store message handler.\n */\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","\"use client\";\nimport {\n TextContentPartComponent,\n useThread,\n useMessage,\n getExternalStoreMessage,\n} from \"@assistant-ui/react\";\nimport {\n RSCThreadExtras,\n symbolInternalRSCExtras,\n} from \"./utils/RSCThreadExtras\";\n\nexport const RSCDisplay: TextContentPartComponent = () => {\n const convertFn = useThread((t) => {\n const extras = (t.extras as RSCThreadExtras)?.[symbolInternalRSCExtras];\n if (!extras)\n throw new Error(\n \"This function can only be used inside a Vercel RSC runtime.\",\n );\n return extras.convertFn;\n });\n return useMessage((m) => convertFn(getExternalStoreMessage(m)).display);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n metadata: {\n unstable_annotations: message.annotations,\n unstable_data: Array.isArray(message.data)\n ? message.data\n : message.data\n ? [message.data]\n : undefined,\n },\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { useState } from \"react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const [threadId, setThreadId] = useState<string>(generateId());\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"threadId\") {\n return target.threadId ?? threadId;\n }\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n setThreadId(generateId());\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n { setInput, input }: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n runtime.thread.composer.setText(input);\n }, [runtime, input]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return runtime.thread.composer.subscribe(() => {\n setInput(runtime.thread.composer.getState().text);\n });\n }, [runtime, setInput]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: 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 liekly 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","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["getExternalStoreMessage","getExternalStoreMessage","useExternalMessageConverter","useExternalStoreRuntime","getExternalStoreMessage","generateId","useExternalMessageConverter","useExternalStoreRuntime","messages","useExternalMessageConverter","useExternalStoreRuntime","useExternalMessageConverter","useExternalStoreRuntime"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-ai-sdk",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.13",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"zustand": "^5.0.3"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@assistant-ui/react": "^0.7.
|
|
34
|
+
"@assistant-ui/react": "^0.7.56",
|
|
35
35
|
"@types/react": "*",
|
|
36
36
|
"react": "^18 || ^19 || ^19.0.0-rc"
|
|
37
37
|
},
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"eslint-config-next": "15.1.5",
|
|
45
45
|
"tsup": "8.3.5",
|
|
46
|
-
"@assistant-ui/react": "0.7.
|
|
46
|
+
"@assistant-ui/react": "0.7.56",
|
|
47
47
|
"@assistant-ui/tsconfig": "0.0.0"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|