@assistant-ui/react-ai-sdk 0.1.1 → 0.1.3

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.
@@ -1,7 +1,6 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe } from '@assistant-ui/react';
1
+ import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
2
  import { LanguageModel, Message } from 'ai';
3
3
  import { ReactNode } from 'react';
4
- import { ProxyConfigProvider } from '@assistant-ui/react/internal';
5
4
  import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
6
5
 
7
6
  declare class VercelModelAdapter implements ChatModelAdapter {
@@ -31,7 +30,8 @@ type VercelRSCAdapterBase<T> = {
31
30
  };
32
31
  type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
33
32
 
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
33
+ declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
+ declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
35
35
  adapter: VercelRSCAdapter<T>;
36
36
  private useAdapter;
37
37
  private _subscriptions;
@@ -56,6 +56,7 @@ declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
56
 
57
57
  type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
58
 
59
+ declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
59
60
  declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
60
61
  vercel: VercelHelpers;
61
62
  private _subscriptions;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe } from '@assistant-ui/react';
1
+ import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
2
  import { LanguageModel, Message } from 'ai';
3
3
  import { ReactNode } from 'react';
4
- import { ProxyConfigProvider } from '@assistant-ui/react/internal';
5
4
  import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
6
5
 
7
6
  declare class VercelModelAdapter implements ChatModelAdapter {
@@ -31,7 +30,8 @@ type VercelRSCAdapterBase<T> = {
31
30
  };
32
31
  type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
33
32
 
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
33
+ declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
+ declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
35
35
  adapter: VercelRSCAdapter<T>;
36
36
  private useAdapter;
37
37
  private _subscriptions;
@@ -56,6 +56,7 @@ declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
56
 
57
57
  type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
58
 
59
+ declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
59
60
  declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
60
61
  vercel: VercelHelpers;
61
62
  private _subscriptions;
package/dist/index.js CHANGED
@@ -1,11 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ getVercelAIMessage: () => getVercelAIMessage,
24
+ getVercelRSCMessage: () => getVercelRSCMessage,
25
+ unstable_VercelModelAdapter: () => VercelModelAdapter,
26
+ useVercelRSCRuntime: () => useVercelRSCRuntime,
27
+ useVercelUseAssistantRuntime: () => useVercelUseAssistantRuntime,
28
+ useVercelUseChatRuntime: () => useVercelUseChatRuntime
29
+ });
30
+ module.exports = __toCommonJS(src_exports);
31
+
1
32
  // src/core/VercelModelAdapter.tsx
2
- import { streamText } from "ai";
33
+ var import_ai = require("ai");
3
34
  var VercelModelAdapter = class {
4
35
  constructor(model) {
5
36
  this.model = model;
6
37
  }
7
38
  async run({ messages, abortSignal, onUpdate }) {
8
- const { fullStream } = await streamText({
39
+ const { fullStream } = await (0, import_ai.streamText)({
9
40
  model: this.model,
10
41
  abortSignal,
11
42
  messages: messages.map((m) => ({
@@ -41,14 +72,14 @@ var VercelModelAdapter = class {
41
72
  };
42
73
 
43
74
  // src/rsc/useVercelRSCRuntime.tsx
44
- import { useEffect as useEffect2, useInsertionEffect, useState } from "react";
75
+ var import_react3 = require("react");
45
76
 
46
77
  // src/rsc/VercelRSCRuntime.tsx
47
- import { ProxyConfigProvider } from "@assistant-ui/react/internal";
48
- import { create } from "zustand";
78
+ var import_react2 = require("@assistant-ui/react");
79
+ var import_zustand = require("zustand");
49
80
 
50
81
  // src/rsc/useVercelRSCSync.tsx
51
- import { useEffect, useMemo } from "react";
82
+ var import_react = require("react");
52
83
 
53
84
  // src/utils/ThreadMessageConverter.ts
54
85
  var ThreadMessageConverter = class {
@@ -83,7 +114,7 @@ var vercelToThreadMessage = (converter, rawMessage) => {
83
114
  };
84
115
  };
85
116
  var useVercelRSCSync = (adapter, updateData) => {
86
- const [converter, convertCallback] = useMemo(() => {
117
+ const [converter, convertCallback] = (0, import_react.useMemo)(() => {
87
118
  const rscConverter = adapter.convertMessage ?? ((m) => m);
88
119
  const convertCallback2 = (m, cache) => {
89
120
  if (cache) return cache;
@@ -91,18 +122,19 @@ var useVercelRSCSync = (adapter, updateData) => {
91
122
  };
92
123
  return [new ThreadMessageConverter(), convertCallback2];
93
124
  }, [adapter.convertMessage]);
94
- useEffect(() => {
125
+ (0, import_react.useEffect)(() => {
95
126
  updateData(converter.convertMessages(adapter.messages, convertCallback));
96
127
  }, [updateData, converter, convertCallback, adapter.messages]);
97
128
  };
98
129
 
99
130
  // src/rsc/VercelRSCRuntime.tsx
131
+ var { ProxyConfigProvider } = import_react2.INTERNAL;
100
132
  var EMPTY_BRANCHES = Object.freeze([]);
101
133
  var VercelRSCRuntime = class extends ProxyConfigProvider {
102
134
  constructor(adapter) {
103
135
  super();
104
136
  this.adapter = adapter;
105
- this.useAdapter = create(() => ({
137
+ this.useAdapter = (0, import_zustand.create)(() => ({
106
138
  adapter
107
139
  }));
108
140
  }
@@ -171,25 +203,22 @@ var VercelRSCRuntime = class extends ProxyConfigProvider {
171
203
 
172
204
  // src/rsc/useVercelRSCRuntime.tsx
173
205
  var useVercelRSCRuntime = (adapter) => {
174
- const [runtime] = useState(() => new VercelRSCRuntime(adapter));
175
- useInsertionEffect(() => {
206
+ const [runtime] = (0, import_react3.useState)(() => new VercelRSCRuntime(adapter));
207
+ (0, import_react3.useInsertionEffect)(() => {
176
208
  runtime.adapter = adapter;
177
209
  });
178
- useEffect2(() => {
210
+ (0, import_react3.useEffect)(() => {
179
211
  runtime.onAdapterUpdated();
180
212
  });
181
213
  return runtime;
182
214
  };
183
215
 
184
216
  // src/ui/use-chat/useVercelUseChatRuntime.tsx
185
- import { useEffect as useEffect5, useInsertionEffect as useInsertionEffect2, useState as useState2 } from "react";
217
+ var import_react7 = require("react");
186
218
 
187
219
  // src/ui/VercelAIRuntime.tsx
188
- import {
189
- MessageRepository,
190
- ProxyConfigProvider as ProxyConfigProvider2
191
- } from "@assistant-ui/react/internal";
192
- import { create as create2 } from "zustand";
220
+ var import_react6 = require("@assistant-ui/react");
221
+ var import_zustand2 = require("zustand");
193
222
 
194
223
  // src/ui/getVercelAIMessage.tsx
195
224
  var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
@@ -212,11 +241,11 @@ var sliceMessagesUntil = (messages, messageId) => {
212
241
  };
213
242
 
214
243
  // src/ui/utils/useVercelAIComposerSync.tsx
215
- import { useThreadContext } from "@assistant-ui/react/experimental";
216
- import { useEffect as useEffect3 } from "react";
244
+ var import_experimental = require("@assistant-ui/react/experimental");
245
+ var import_react4 = require("react");
217
246
  var useVercelAIComposerSync = (vercel) => {
218
- const { useComposer } = useThreadContext();
219
- useEffect3(() => {
247
+ const { useComposer } = (0, import_experimental.useThreadContext)();
248
+ (0, import_react4.useEffect)(() => {
220
249
  useComposer.setState({
221
250
  value: vercel.input,
222
251
  setValue: vercel.setInput
@@ -225,7 +254,7 @@ var useVercelAIComposerSync = (vercel) => {
225
254
  };
226
255
 
227
256
  // src/ui/utils/useVercelAIThreadSync.tsx
228
- import { useEffect as useEffect4, useMemo as useMemo2 } from "react";
257
+ var import_react5 = require("react");
229
258
  var getIsRunning = (vercel) => {
230
259
  if ("isLoading" in vercel) return vercel.isLoading;
231
260
  return vercel.status === "in_progress";
@@ -302,8 +331,8 @@ var shallowArrayEqual = (a, b) => {
302
331
  };
303
332
  var useVercelAIThreadSync = (vercel, updateData) => {
304
333
  const isRunning = getIsRunning(vercel);
305
- const converter = useMemo2(() => new ThreadMessageConverter(), []);
306
- useEffect4(() => {
334
+ const converter = (0, import_react5.useMemo)(() => new ThreadMessageConverter(), []);
335
+ (0, import_react5.useEffect)(() => {
307
336
  const lastMessageId = vercel.messages.at(-1)?.id;
308
337
  const convertCallback = (messages2, cache) => {
309
338
  const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
@@ -321,6 +350,7 @@ var useVercelAIThreadSync = (vercel, updateData) => {
321
350
  };
322
351
 
323
352
  // src/ui/VercelAIRuntime.tsx
353
+ var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository } = import_react6.INTERNAL;
324
354
  var hasUpcomingMessage = (isRunning, messages) => {
325
355
  return isRunning && messages[messages.length - 1]?.role !== "assistant";
326
356
  };
@@ -328,7 +358,7 @@ var VercelAIRuntime = class extends ProxyConfigProvider2 {
328
358
  constructor(vercel) {
329
359
  super();
330
360
  this.vercel = vercel;
331
- this.useVercel = create2(() => ({
361
+ this.useVercel = (0, import_zustand2.create)(() => ({
332
362
  vercel
333
363
  }));
334
364
  }
@@ -435,34 +465,35 @@ var VercelAIRuntime = class extends ProxyConfigProvider2 {
435
465
 
436
466
  // src/ui/use-chat/useVercelUseChatRuntime.tsx
437
467
  var useVercelUseChatRuntime = (chatHelpers) => {
438
- const [runtime] = useState2(() => new VercelAIRuntime(chatHelpers));
439
- useInsertionEffect2(() => {
468
+ const [runtime] = (0, import_react7.useState)(() => new VercelAIRuntime(chatHelpers));
469
+ (0, import_react7.useInsertionEffect)(() => {
440
470
  runtime.vercel = chatHelpers;
441
471
  });
442
- useEffect5(() => {
472
+ (0, import_react7.useEffect)(() => {
443
473
  runtime.onVercelUpdated();
444
474
  });
445
475
  return runtime;
446
476
  };
447
477
 
448
478
  // src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
449
- import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect3, useState as useState3 } from "react";
479
+ var import_react8 = require("react");
450
480
  var useVercelUseAssistantRuntime = (assistantHelpers) => {
451
- const [runtime] = useState3(() => new VercelAIRuntime(assistantHelpers));
452
- useInsertionEffect3(() => {
481
+ const [runtime] = (0, import_react8.useState)(() => new VercelAIRuntime(assistantHelpers));
482
+ (0, import_react8.useInsertionEffect)(() => {
453
483
  runtime.vercel = assistantHelpers;
454
484
  });
455
- useEffect6(() => {
485
+ (0, import_react8.useEffect)(() => {
456
486
  runtime.onVercelUpdated();
457
487
  });
458
488
  return runtime;
459
489
  };
460
- export {
490
+ // Annotate the CommonJS export names for ESM import in node:
491
+ 0 && (module.exports = {
461
492
  getVercelAIMessage,
462
493
  getVercelRSCMessage,
463
- VercelModelAdapter as unstable_VercelModelAdapter,
494
+ unstable_VercelModelAdapter,
464
495
  useVercelRSCRuntime,
465
496
  useVercelUseAssistantRuntime,
466
497
  useVercelUseChatRuntime
467
- };
498
+ });
468
499
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../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":["\"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 LanguageModel, streamText } from \"ai\";\n\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content.filter((c): c is TextContentPart => c.type !== \"ui\"),\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: \"\" };\n content.push(part);\n }\n part.text += aiPart.textDelta;\n break;\n }\n // TODO tool results\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n name: aiPart.toolName,\n args: aiPart.args,\n });\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\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 type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\n\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { ProxyConfigProvider } from \"@assistant-ui/react/internal\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst EMPTY_BRANCHES: readonly never[] = 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","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 { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (chatHelpers: UseChatHelpers) => {\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 {\n MessageRepository,\n ProxyConfigProvider,\n} from \"@assistant-ui/react/internal\";\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 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","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 name: t.toolName,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) as 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","ProxyConfigProvider","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","ProxyConfigProvider","create","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","useState","useInsertionEffect","useEffect"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../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","\"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 LanguageModel, streamText } from \"ai\";\n\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content.filter((c): c is TextContentPart => c.type !== \"ui\"),\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: \"\" };\n content.push(part);\n }\n part.text += aiPart.textDelta;\n break;\n }\n // TODO tool results\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n name: aiPart.toolName,\n args: aiPart.args,\n });\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\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 type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\n\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } 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 never[] = 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","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 { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (chatHelpers: UseChatHelpers) => {\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","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 name: t.toolName,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) as 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"]}