@assistant-ui/react-ai-sdk 0.1.7 → 0.2.1

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.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
1
+ import * as _assistant_ui_react from '@assistant-ui/react';
2
+ import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, ModelConfigProvider, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
3
  import { LanguageModel, Message } from 'ai';
3
4
  import { ReactNode } from 'react';
4
5
  import { useChat, UseAssistantHelpers } from '@ai-sdk/react';
@@ -30,8 +31,17 @@ type VercelRSCAdapterBase<T> = {
30
31
  };
31
32
  type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
32
33
 
33
- declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
34
+ declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
35
+ declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends BaseAssistantRuntime$1<VercelRSCThreadRuntime<T>> {
36
+ private readonly _proxyConfigProvider;
37
+ constructor(adapter: VercelRSCAdapter<T>);
38
+ set adapter(adapter: VercelRSCAdapter<T>);
39
+ onAdapterUpdated(): void;
40
+ getModelConfig(): _assistant_ui_react.ModelConfig;
41
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
42
+ switchToThread(): void;
43
+ }
44
+ declare class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage> implements ReactThreadRuntime {
35
45
  adapter: VercelRSCAdapter<T>;
36
46
  private useAdapter;
37
47
  private _subscriptions;
@@ -57,8 +67,17 @@ declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
57
67
 
58
68
  type VercelHelpers = ReturnType<typeof useChat> | UseAssistantHelpers;
59
69
 
60
- declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
61
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
70
+ declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
71
+ declare class VercelAIRuntime extends BaseAssistantRuntime<VercelAIThreadRuntime> {
72
+ private readonly _proxyConfigProvider;
73
+ constructor(vercel: VercelHelpers);
74
+ set vercel(vercel: VercelHelpers);
75
+ onVercelUpdated(): void;
76
+ getModelConfig(): _assistant_ui_react.ModelConfig;
77
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
78
+ switchToThread(threadId: string | null): void;
79
+ }
80
+ declare class VercelAIThreadRuntime implements ReactThreadRuntime {
62
81
  vercel: VercelHelpers;
63
82
  private _subscriptions;
64
83
  private repository;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
1
+ import * as _assistant_ui_react from '@assistant-ui/react';
2
+ import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, ModelConfigProvider, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
3
  import { LanguageModel, Message } from 'ai';
3
4
  import { ReactNode } from 'react';
4
5
  import { useChat, UseAssistantHelpers } from '@ai-sdk/react';
@@ -30,8 +31,17 @@ type VercelRSCAdapterBase<T> = {
30
31
  };
31
32
  type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
32
33
 
33
- declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
34
+ declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
35
+ declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends BaseAssistantRuntime$1<VercelRSCThreadRuntime<T>> {
36
+ private readonly _proxyConfigProvider;
37
+ constructor(adapter: VercelRSCAdapter<T>);
38
+ set adapter(adapter: VercelRSCAdapter<T>);
39
+ onAdapterUpdated(): void;
40
+ getModelConfig(): _assistant_ui_react.ModelConfig;
41
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
42
+ switchToThread(): void;
43
+ }
44
+ declare class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage> implements ReactThreadRuntime {
35
45
  adapter: VercelRSCAdapter<T>;
36
46
  private useAdapter;
37
47
  private _subscriptions;
@@ -57,8 +67,17 @@ declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
57
67
 
58
68
  type VercelHelpers = ReturnType<typeof useChat> | UseAssistantHelpers;
59
69
 
60
- declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
61
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
70
+ declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
71
+ declare class VercelAIRuntime extends BaseAssistantRuntime<VercelAIThreadRuntime> {
72
+ private readonly _proxyConfigProvider;
73
+ constructor(vercel: VercelHelpers);
74
+ set vercel(vercel: VercelHelpers);
75
+ onVercelUpdated(): void;
76
+ getModelConfig(): _assistant_ui_react.ModelConfig;
77
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
78
+ switchToThread(threadId: string | null): void;
79
+ }
80
+ declare class VercelAIThreadRuntime implements ReactThreadRuntime {
62
81
  vercel: VercelHelpers;
63
82
  private _subscriptions;
64
83
  private repository;
package/dist/index.js CHANGED
@@ -194,11 +194,31 @@ var useVercelRSCSync = (adapter, updateData) => {
194
194
  };
195
195
 
196
196
  // src/rsc/VercelRSCRuntime.tsx
197
- var { ProxyConfigProvider } = import_react2.INTERNAL;
197
+ var { ProxyConfigProvider, BaseAssistantRuntime } = import_react2.INTERNAL;
198
198
  var EMPTY_BRANCHES = Object.freeze([]);
199
- var VercelRSCRuntime = class extends ProxyConfigProvider {
199
+ var VercelRSCRuntime = class extends BaseAssistantRuntime {
200
+ _proxyConfigProvider = new ProxyConfigProvider();
201
+ constructor(adapter) {
202
+ super(new VercelRSCThreadRuntime(adapter));
203
+ }
204
+ set adapter(adapter) {
205
+ this.thread.adapter = adapter;
206
+ }
207
+ onAdapterUpdated() {
208
+ return this.thread.onAdapterUpdated();
209
+ }
210
+ getModelConfig() {
211
+ return this._proxyConfigProvider.getModelConfig();
212
+ }
213
+ registerModelConfigProvider(provider) {
214
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
215
+ }
216
+ switchToThread() {
217
+ throw new Error("VercelRSCRuntime does not support switching threads");
218
+ }
219
+ };
220
+ var VercelRSCThreadRuntime = class {
200
221
  constructor(adapter) {
201
- super();
202
222
  this.adapter = adapter;
203
223
  this.useAdapter = (0, import_zustand.create)(() => ({
204
224
  adapter
@@ -283,10 +303,10 @@ var useVercelRSCRuntime = (adapter) => {
283
303
  };
284
304
 
285
305
  // src/ui/use-chat/useVercelUseChatRuntime.tsx
286
- var import_react7 = require("react");
306
+ var import_react8 = require("react");
287
307
 
288
308
  // src/ui/VercelAIRuntime.tsx
289
- var import_react6 = require("@assistant-ui/react");
309
+ var import_react7 = require("@assistant-ui/react");
290
310
  var import_zustand2 = require("zustand");
291
311
 
292
312
  // src/ui/getVercelAIMessage.tsx
@@ -310,11 +330,11 @@ var sliceMessagesUntil = (messages, messageId) => {
310
330
  };
311
331
 
312
332
  // src/ui/utils/useVercelAIComposerSync.tsx
313
- var import_experimental = require("@assistant-ui/react/experimental");
314
- var import_react4 = require("react");
333
+ var import_react4 = require("@assistant-ui/react");
334
+ var import_react5 = require("react");
315
335
  var useVercelAIComposerSync = (vercel) => {
316
- const { useComposer } = (0, import_experimental.useThreadContext)();
317
- (0, import_react4.useEffect)(() => {
336
+ const { useComposer } = (0, import_react4.useThreadContext)();
337
+ (0, import_react5.useEffect)(() => {
318
338
  useComposer.setState({
319
339
  value: vercel.input,
320
340
  setValue: vercel.setInput
@@ -323,7 +343,7 @@ var useVercelAIComposerSync = (vercel) => {
323
343
  };
324
344
 
325
345
  // src/ui/utils/useVercelAIThreadSync.tsx
326
- var import_react5 = require("react");
346
+ var import_react6 = require("react");
327
347
  var getIsRunning = (vercel) => {
328
348
  if ("isLoading" in vercel) return vercel.isLoading;
329
349
  return vercel.status === "in_progress";
@@ -401,8 +421,8 @@ var shallowArrayEqual = (a, b) => {
401
421
  };
402
422
  var useVercelAIThreadSync = (vercel, updateData) => {
403
423
  const isRunning = getIsRunning(vercel);
404
- const converter = (0, import_react5.useMemo)(() => new ThreadMessageConverter(), []);
405
- (0, import_react5.useEffect)(() => {
424
+ const converter = (0, import_react6.useMemo)(() => new ThreadMessageConverter(), []);
425
+ (0, import_react6.useEffect)(() => {
406
426
  const lastMessageId = vercel.messages.at(-1)?.id;
407
427
  const convertCallback = (messages2, cache) => {
408
428
  const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
@@ -420,13 +440,40 @@ var useVercelAIThreadSync = (vercel, updateData) => {
420
440
  };
421
441
 
422
442
  // src/ui/VercelAIRuntime.tsx
423
- var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository } = import_react6.INTERNAL;
443
+ var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository, BaseAssistantRuntime: BaseAssistantRuntime2 } = import_react7.INTERNAL;
424
444
  var hasUpcomingMessage = (isRunning, messages) => {
425
445
  return isRunning && messages[messages.length - 1]?.role !== "assistant";
426
446
  };
427
- var VercelAIRuntime = class extends ProxyConfigProvider2 {
447
+ var VercelAIRuntime = class extends BaseAssistantRuntime2 {
448
+ _proxyConfigProvider = new ProxyConfigProvider2();
449
+ constructor(vercel) {
450
+ super(new VercelAIThreadRuntime(vercel));
451
+ }
452
+ set vercel(vercel) {
453
+ this.thread.vercel = vercel;
454
+ }
455
+ onVercelUpdated() {
456
+ return this.thread.onVercelUpdated();
457
+ }
458
+ getModelConfig() {
459
+ return this._proxyConfigProvider.getModelConfig();
460
+ }
461
+ registerModelConfigProvider(provider) {
462
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
463
+ }
464
+ switchToThread(threadId) {
465
+ if (threadId) {
466
+ throw new Error("VercelAIRuntime does not yet support switching threads");
467
+ }
468
+ this.thread.vercel.messages = [];
469
+ this.thread.vercel.input = "";
470
+ this.thread.vercel.setMessages([]);
471
+ this.thread.vercel.setInput("");
472
+ this.thread = new VercelAIThreadRuntime(this.thread.vercel);
473
+ }
474
+ };
475
+ var VercelAIThreadRuntime = class {
428
476
  constructor(vercel) {
429
- super();
430
477
  this.vercel = vercel;
431
478
  this.useVercel = (0, import_zustand2.create)(() => ({
432
479
  vercel
@@ -541,24 +588,24 @@ var VercelAIRuntime = class extends ProxyConfigProvider2 {
541
588
 
542
589
  // src/ui/use-chat/useVercelUseChatRuntime.tsx
543
590
  var useVercelUseChatRuntime = (chatHelpers) => {
544
- const [runtime] = (0, import_react7.useState)(() => new VercelAIRuntime(chatHelpers));
545
- (0, import_react7.useInsertionEffect)(() => {
591
+ const [runtime] = (0, import_react8.useState)(() => new VercelAIRuntime(chatHelpers));
592
+ (0, import_react8.useInsertionEffect)(() => {
546
593
  runtime.vercel = chatHelpers;
547
594
  });
548
- (0, import_react7.useEffect)(() => {
595
+ (0, import_react8.useEffect)(() => {
549
596
  runtime.onVercelUpdated();
550
597
  });
551
598
  return runtime;
552
599
  };
553
600
 
554
601
  // src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
555
- var import_react8 = require("react");
602
+ var import_react9 = require("react");
556
603
  var useVercelUseAssistantRuntime = (assistantHelpers) => {
557
- const [runtime] = (0, import_react8.useState)(() => new VercelAIRuntime(assistantHelpers));
558
- (0, import_react8.useInsertionEffect)(() => {
604
+ const [runtime] = (0, import_react9.useState)(() => new VercelAIRuntime(assistantHelpers));
605
+ (0, import_react9.useInsertionEffect)(() => {
559
606
  runtime.vercel = assistantHelpers;
560
607
  });
561
- (0, import_react8.useEffect)(() => {
608
+ (0, import_react9.useEffect)(() => {
562
609
  runtime.onVercelUpdated();
563
610
  });
564
611
  return runtime;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./core\";\nexport * from \"./rsc\";\nexport * from \"./ui\";\n","// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport {\n type AppendMessage,\n type AssistantRuntime,\n INTERNAL,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst { ProxyConfigProvider } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage>\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n super();\n\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\n\nconst { ProxyConfigProvider, MessageRepository } = INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n super();\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\n if (!(\"addToolResult\" in this.vercel)) {\n throw new Error(\"VercelAIRuntime does not support adding tool results\");\n }\n this.vercel.addToolResult({ toolCallId, result });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\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 { useThreadContext } from \"@assistant-ui/react/experimental\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n useComposer.setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type { TextContentPart, ThreadMessage } from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["import_react","import_react","convertCallback","import_react","import_react","import_zustand","import_react","import_react","vercelToThreadMessage","messages","ProxyConfigProvider","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./core\";\nexport * from \"./rsc\";\nexport * from \"./ui\";\n","// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n\nclass VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\n\nconst { ProxyConfigProvider, MessageRepository, BaseAssistantRuntime } =\n INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime extends BaseAssistantRuntime<VercelAIThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: VercelHelpers) {\n super(new VercelAIThreadRuntime(vercel));\n }\n\n public set vercel(vercel: VercelHelpers) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelAIThreadRuntime(this.thread.vercel);\n }\n}\n\nclass VercelAIThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\n if (!(\"addToolResult\" in this.vercel)) {\n throw new Error(\"VercelAIRuntime does not support adding tool results\");\n }\n this.vercel.addToolResult({ toolCallId, result });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\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 { useThreadContext, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n (useComposer as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["import_react","import_react","convertCallback","import_react","import_react","import_zustand","import_react","import_react","vercelToThreadMessage","messages","ProxyConfigProvider","BaseAssistantRuntime","import_react"]}
package/dist/index.mjs CHANGED
@@ -165,11 +165,31 @@ var useVercelRSCSync = (adapter, updateData) => {
165
165
  };
166
166
 
167
167
  // src/rsc/VercelRSCRuntime.tsx
168
- var { ProxyConfigProvider } = INTERNAL;
168
+ var { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;
169
169
  var EMPTY_BRANCHES = Object.freeze([]);
170
- var VercelRSCRuntime = class extends ProxyConfigProvider {
170
+ var VercelRSCRuntime = class extends BaseAssistantRuntime {
171
+ _proxyConfigProvider = new ProxyConfigProvider();
172
+ constructor(adapter) {
173
+ super(new VercelRSCThreadRuntime(adapter));
174
+ }
175
+ set adapter(adapter) {
176
+ this.thread.adapter = adapter;
177
+ }
178
+ onAdapterUpdated() {
179
+ return this.thread.onAdapterUpdated();
180
+ }
181
+ getModelConfig() {
182
+ return this._proxyConfigProvider.getModelConfig();
183
+ }
184
+ registerModelConfigProvider(provider) {
185
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
186
+ }
187
+ switchToThread() {
188
+ throw new Error("VercelRSCRuntime does not support switching threads");
189
+ }
190
+ };
191
+ var VercelRSCThreadRuntime = class {
171
192
  constructor(adapter) {
172
- super();
173
193
  this.adapter = adapter;
174
194
  this.useAdapter = create(() => ({
175
195
  adapter
@@ -257,7 +277,9 @@ var useVercelRSCRuntime = (adapter) => {
257
277
  import { useEffect as useEffect5, useInsertionEffect as useInsertionEffect2, useState as useState2 } from "react";
258
278
 
259
279
  // src/ui/VercelAIRuntime.tsx
260
- import { INTERNAL as INTERNAL2 } from "@assistant-ui/react";
280
+ import {
281
+ INTERNAL as INTERNAL2
282
+ } from "@assistant-ui/react";
261
283
  import { create as create2 } from "zustand";
262
284
 
263
285
  // src/ui/getVercelAIMessage.tsx
@@ -281,7 +303,7 @@ var sliceMessagesUntil = (messages, messageId) => {
281
303
  };
282
304
 
283
305
  // src/ui/utils/useVercelAIComposerSync.tsx
284
- import { useThreadContext } from "@assistant-ui/react/experimental";
306
+ import { useThreadContext } from "@assistant-ui/react";
285
307
  import { useEffect as useEffect3 } from "react";
286
308
  var useVercelAIComposerSync = (vercel) => {
287
309
  const { useComposer } = useThreadContext();
@@ -391,13 +413,40 @@ var useVercelAIThreadSync = (vercel, updateData) => {
391
413
  };
392
414
 
393
415
  // src/ui/VercelAIRuntime.tsx
394
- var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository } = INTERNAL2;
416
+ var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository, BaseAssistantRuntime: BaseAssistantRuntime2 } = INTERNAL2;
395
417
  var hasUpcomingMessage = (isRunning, messages) => {
396
418
  return isRunning && messages[messages.length - 1]?.role !== "assistant";
397
419
  };
398
- var VercelAIRuntime = class extends ProxyConfigProvider2 {
420
+ var VercelAIRuntime = class extends BaseAssistantRuntime2 {
421
+ _proxyConfigProvider = new ProxyConfigProvider2();
422
+ constructor(vercel) {
423
+ super(new VercelAIThreadRuntime(vercel));
424
+ }
425
+ set vercel(vercel) {
426
+ this.thread.vercel = vercel;
427
+ }
428
+ onVercelUpdated() {
429
+ return this.thread.onVercelUpdated();
430
+ }
431
+ getModelConfig() {
432
+ return this._proxyConfigProvider.getModelConfig();
433
+ }
434
+ registerModelConfigProvider(provider) {
435
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
436
+ }
437
+ switchToThread(threadId) {
438
+ if (threadId) {
439
+ throw new Error("VercelAIRuntime does not yet support switching threads");
440
+ }
441
+ this.thread.vercel.messages = [];
442
+ this.thread.vercel.input = "";
443
+ this.thread.vercel.setMessages([]);
444
+ this.thread.vercel.setInput("");
445
+ this.thread = new VercelAIThreadRuntime(this.thread.vercel);
446
+ }
447
+ };
448
+ var VercelAIThreadRuntime = class {
399
449
  constructor(vercel) {
400
- super();
401
450
  this.vercel = vercel;
402
451
  this.useVercel = create2(() => ({
403
452
  vercel
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport {\n type AppendMessage,\n type AssistantRuntime,\n INTERNAL,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst { ProxyConfigProvider } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage>\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n super();\n\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\n\nconst { ProxyConfigProvider, MessageRepository } = INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n super();\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\n if (!(\"addToolResult\" in this.vercel)) {\n throw new Error(\"VercelAIRuntime does not support adding tool results\");\n }\n this.vercel.addToolResult({ toolCallId, result });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\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 { useThreadContext } from \"@assistant-ui/react/experimental\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n useComposer.setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type { TextContentPart, ThreadMessage } from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["useEffect","convertCallback","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","ProxyConfigProvider","INTERNAL","create","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","useState","useInsertionEffect","useEffect"]}
1
+ {"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n\nclass VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\n\nconst { ProxyConfigProvider, MessageRepository, BaseAssistantRuntime } =\n INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime extends BaseAssistantRuntime<VercelAIThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: VercelHelpers) {\n super(new VercelAIThreadRuntime(vercel));\n }\n\n public set vercel(vercel: VercelHelpers) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelAIThreadRuntime(this.thread.vercel);\n }\n}\n\nclass VercelAIThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\n if (!(\"addToolResult\" in this.vercel)) {\n throw new Error(\"VercelAIRuntime does not support adding tool results\");\n }\n this.vercel.addToolResult({ toolCallId, result });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\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 { useThreadContext, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n (useComposer as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["useEffect","convertCallback","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","ProxyConfigProvider","BaseAssistantRuntime","INTERNAL","create","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","useState","useInsertionEffect","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-ai-sdk",
3
- "version": "0.1.7",
3
+ "version": "0.2.1",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": {
@@ -26,11 +26,11 @@
26
26
  "dependencies": {
27
27
  "tsup": "^8.1.0",
28
28
  "zod": "^3.23.8",
29
- "zustand": "^4.5.2"
29
+ "zustand": "^4.5.4"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@ai-sdk/react": "^0.0.x",
33
- "@assistant-ui/react": "^0.1.8",
33
+ "@assistant-ui/react": "^0.2.2",
34
34
  "@types/react": "*",
35
35
  "ai": "^3.1.x",
36
36
  "react": "^18"
@@ -41,8 +41,7 @@
41
41
  }
42
42
  },
43
43
  "devDependencies": {
44
- "@types/node": "^20.14.7",
45
- "@assistant-ui/react": "0.1.8",
44
+ "@types/node": "^20.14.9",
46
45
  "@assistant-ui/tsconfig": "0.0.0"
47
46
  },
48
47
  "publishConfig": {