@assistant-ui/react-ai-sdk 0.1.2 → 0.1.4

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 DELETED
@@ -1,86 +0,0 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe } from '@assistant-ui/react';
2
- import { LanguageModel, Message } from 'ai';
3
- import { ReactNode } from 'react';
4
- import { ProxyConfigProvider } from '@assistant-ui/react/internal';
5
- import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
6
-
7
- declare class VercelModelAdapter implements ChatModelAdapter {
8
- private readonly model;
9
- constructor(model: LanguageModel);
10
- run({ messages, abortSignal, onUpdate }: ChatModelRunOptions): Promise<{
11
- content: AssistantContentPart[];
12
- }>;
13
- }
14
-
15
- type VercelRSCMessage = {
16
- id: string;
17
- role: "user" | "assistant";
18
- display: ReactNode;
19
- createdAt?: Date;
20
- };
21
-
22
- type RSCMessageConverter<T> = {
23
- convertMessage: (message: T) => VercelRSCMessage;
24
- };
25
- type VercelRSCAdapterBase<T> = {
26
- messages: T[];
27
- append: (message: AppendMessage) => Promise<void>;
28
- edit?: (message: AppendMessage) => Promise<void>;
29
- reload?: (parentId: string | null) => Promise<void>;
30
- convertMessage?: (message: T) => VercelRSCMessage;
31
- };
32
- type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
33
-
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
35
- adapter: VercelRSCAdapter<T>;
36
- private useAdapter;
37
- private _subscriptions;
38
- isRunning: boolean;
39
- messages: ThreadMessage[];
40
- constructor(adapter: VercelRSCAdapter<T>);
41
- private withRunning;
42
- getBranches(): readonly string[];
43
- switchToBranch(): void;
44
- append(message: AppendMessage): Promise<void>;
45
- startRun(parentId: string | null): Promise<void>;
46
- cancelRun(): void;
47
- subscribe(callback: () => void): Unsubscribe;
48
- onAdapterUpdated(): void;
49
- private updateData;
50
- unstable_synchronizer: () => null;
51
- }
52
-
53
- declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter<T>) => VercelRSCRuntime<T>;
54
-
55
- declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
-
57
- type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
-
59
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
60
- vercel: VercelHelpers;
61
- private _subscriptions;
62
- private repository;
63
- private assistantOptimisticId;
64
- private useVercel;
65
- messages: ThreadMessage[];
66
- isRunning: boolean;
67
- constructor(vercel: VercelHelpers);
68
- getBranches(messageId: string): string[];
69
- switchToBranch(branchId: string): void;
70
- append(message: AppendMessage): Promise<void>;
71
- startRun(parentId: string | null): Promise<void>;
72
- cancelRun(): void;
73
- subscribe(callback: () => void): Unsubscribe;
74
- private updateVercelMessages;
75
- onVercelUpdated(): void;
76
- private updateData;
77
- unstable_synchronizer: () => null;
78
- }
79
-
80
- declare const useVercelUseChatRuntime: (chatHelpers: UseChatHelpers) => VercelAIRuntime;
81
-
82
- declare const useVercelUseAssistantRuntime: (assistantHelpers: UseAssistantHelpers) => VercelAIRuntime;
83
-
84
- declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
85
-
86
- export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessage, getVercelRSCMessage, VercelModelAdapter as unstable_VercelModelAdapter, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
package/dist/index.d.ts DELETED
@@ -1,86 +0,0 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe } from '@assistant-ui/react';
2
- import { LanguageModel, Message } from 'ai';
3
- import { ReactNode } from 'react';
4
- import { ProxyConfigProvider } from '@assistant-ui/react/internal';
5
- import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
6
-
7
- declare class VercelModelAdapter implements ChatModelAdapter {
8
- private readonly model;
9
- constructor(model: LanguageModel);
10
- run({ messages, abortSignal, onUpdate }: ChatModelRunOptions): Promise<{
11
- content: AssistantContentPart[];
12
- }>;
13
- }
14
-
15
- type VercelRSCMessage = {
16
- id: string;
17
- role: "user" | "assistant";
18
- display: ReactNode;
19
- createdAt?: Date;
20
- };
21
-
22
- type RSCMessageConverter<T> = {
23
- convertMessage: (message: T) => VercelRSCMessage;
24
- };
25
- type VercelRSCAdapterBase<T> = {
26
- messages: T[];
27
- append: (message: AppendMessage) => Promise<void>;
28
- edit?: (message: AppendMessage) => Promise<void>;
29
- reload?: (parentId: string | null) => Promise<void>;
30
- convertMessage?: (message: T) => VercelRSCMessage;
31
- };
32
- type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
33
-
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
35
- adapter: VercelRSCAdapter<T>;
36
- private useAdapter;
37
- private _subscriptions;
38
- isRunning: boolean;
39
- messages: ThreadMessage[];
40
- constructor(adapter: VercelRSCAdapter<T>);
41
- private withRunning;
42
- getBranches(): readonly string[];
43
- switchToBranch(): void;
44
- append(message: AppendMessage): Promise<void>;
45
- startRun(parentId: string | null): Promise<void>;
46
- cancelRun(): void;
47
- subscribe(callback: () => void): Unsubscribe;
48
- onAdapterUpdated(): void;
49
- private updateData;
50
- unstable_synchronizer: () => null;
51
- }
52
-
53
- declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter<T>) => VercelRSCRuntime<T>;
54
-
55
- declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
-
57
- type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
-
59
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
60
- vercel: VercelHelpers;
61
- private _subscriptions;
62
- private repository;
63
- private assistantOptimisticId;
64
- private useVercel;
65
- messages: ThreadMessage[];
66
- isRunning: boolean;
67
- constructor(vercel: VercelHelpers);
68
- getBranches(messageId: string): string[];
69
- switchToBranch(branchId: string): void;
70
- append(message: AppendMessage): Promise<void>;
71
- startRun(parentId: string | null): Promise<void>;
72
- cancelRun(): void;
73
- subscribe(callback: () => void): Unsubscribe;
74
- private updateVercelMessages;
75
- onVercelUpdated(): void;
76
- private updateData;
77
- unstable_synchronizer: () => null;
78
- }
79
-
80
- declare const useVercelUseChatRuntime: (chatHelpers: UseChatHelpers) => VercelAIRuntime;
81
-
82
- declare const useVercelUseAssistantRuntime: (assistantHelpers: UseAssistantHelpers) => VercelAIRuntime;
83
-
84
- declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
85
-
86
- export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessage, getVercelRSCMessage, VercelModelAdapter as unstable_VercelModelAdapter, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
package/dist/index.js DELETED
@@ -1,497 +0,0 @@
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
-
32
- // src/core/VercelModelAdapter.tsx
33
- var import_ai = require("ai");
34
- var VercelModelAdapter = class {
35
- constructor(model) {
36
- this.model = model;
37
- }
38
- async run({ messages, abortSignal, onUpdate }) {
39
- const { fullStream } = await (0, import_ai.streamText)({
40
- model: this.model,
41
- abortSignal,
42
- messages: messages.map((m) => ({
43
- role: m.role,
44
- content: m.content.filter((c) => c.type !== "ui")
45
- }))
46
- });
47
- const content = [];
48
- for await (const aiPart of fullStream) {
49
- switch (aiPart.type) {
50
- case "text-delta": {
51
- let part = content.at(-1);
52
- if (!part || part.type !== "text") {
53
- part = { type: "text", text: "" };
54
- content.push(part);
55
- }
56
- part.text += aiPart.textDelta;
57
- break;
58
- }
59
- case "tool-call": {
60
- content.push({
61
- type: "tool-call",
62
- name: aiPart.toolName,
63
- args: aiPart.args
64
- });
65
- break;
66
- }
67
- }
68
- onUpdate({ content });
69
- }
70
- return { content };
71
- }
72
- };
73
-
74
- // src/rsc/useVercelRSCRuntime.tsx
75
- var import_react2 = require("react");
76
-
77
- // src/rsc/VercelRSCRuntime.tsx
78
- var import_internal = require("@assistant-ui/react/internal");
79
- var import_zustand = require("zustand");
80
-
81
- // src/rsc/useVercelRSCSync.tsx
82
- var import_react = require("react");
83
-
84
- // src/utils/ThreadMessageConverter.ts
85
- var ThreadMessageConverter = class {
86
- cache = /* @__PURE__ */ new WeakMap();
87
- convertMessages(messages, converter, keyMapper = (key) => key) {
88
- return messages.map((m) => {
89
- const key = keyMapper(m);
90
- const cached = this.cache.get(key);
91
- const newMessage = converter(m, cached);
92
- this.cache.set(key, newMessage);
93
- return newMessage;
94
- });
95
- }
96
- };
97
-
98
- // src/rsc/getVercelRSCMessage.tsx
99
- var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
100
- var getVercelRSCMessage = (message) => {
101
- return message[symbolInnerRSCMessage];
102
- };
103
-
104
- // src/rsc/useVercelRSCSync.tsx
105
- var vercelToThreadMessage = (converter, rawMessage) => {
106
- const message = converter(rawMessage);
107
- return {
108
- id: message.id,
109
- role: message.role,
110
- content: [{ type: "ui", display: message.display }],
111
- createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
112
- ...{ status: "done" },
113
- [symbolInnerRSCMessage]: rawMessage
114
- };
115
- };
116
- var useVercelRSCSync = (adapter, updateData) => {
117
- const [converter, convertCallback] = (0, import_react.useMemo)(() => {
118
- const rscConverter = adapter.convertMessage ?? ((m) => m);
119
- const convertCallback2 = (m, cache) => {
120
- if (cache) return cache;
121
- return vercelToThreadMessage(rscConverter, m);
122
- };
123
- return [new ThreadMessageConverter(), convertCallback2];
124
- }, [adapter.convertMessage]);
125
- (0, import_react.useEffect)(() => {
126
- updateData(converter.convertMessages(adapter.messages, convertCallback));
127
- }, [updateData, converter, convertCallback, adapter.messages]);
128
- };
129
-
130
- // src/rsc/VercelRSCRuntime.tsx
131
- var EMPTY_BRANCHES = Object.freeze([]);
132
- var VercelRSCRuntime = class extends import_internal.ProxyConfigProvider {
133
- constructor(adapter) {
134
- super();
135
- this.adapter = adapter;
136
- this.useAdapter = (0, import_zustand.create)(() => ({
137
- adapter
138
- }));
139
- }
140
- useAdapter;
141
- _subscriptions = /* @__PURE__ */ new Set();
142
- isRunning = false;
143
- messages = [];
144
- withRunning = (callback) => {
145
- this.isRunning = true;
146
- return callback.finally(() => {
147
- this.isRunning = false;
148
- });
149
- };
150
- getBranches() {
151
- return EMPTY_BRANCHES;
152
- }
153
- switchToBranch() {
154
- throw new Error(
155
- "Branch switching is not supported by VercelRSCAssistantProvider."
156
- );
157
- }
158
- async append(message) {
159
- if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
160
- if (!this.adapter.edit)
161
- throw new Error(
162
- "Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider."
163
- );
164
- await this.withRunning(this.adapter.edit(message));
165
- } else {
166
- await this.withRunning(this.adapter.append(message));
167
- }
168
- }
169
- async startRun(parentId) {
170
- if (!this.adapter.reload)
171
- throw new Error(
172
- "Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider."
173
- );
174
- await this.withRunning(this.adapter.reload(parentId));
175
- }
176
- cancelRun() {
177
- if (process.env["NODE_ENV"] === "development") {
178
- console.warn(
179
- "Run cancellation is not supported by VercelRSCAssistantProvider."
180
- );
181
- }
182
- }
183
- subscribe(callback) {
184
- this._subscriptions.add(callback);
185
- return () => this._subscriptions.delete(callback);
186
- }
187
- onAdapterUpdated() {
188
- if (this.useAdapter.getState().adapter !== this.adapter) {
189
- this.useAdapter.setState({ adapter: this.adapter });
190
- }
191
- }
192
- updateData = (messages) => {
193
- this.messages = messages;
194
- for (const callback of this._subscriptions) callback();
195
- };
196
- unstable_synchronizer = () => {
197
- const { adapter } = this.useAdapter();
198
- useVercelRSCSync(adapter, this.updateData);
199
- return null;
200
- };
201
- };
202
-
203
- // src/rsc/useVercelRSCRuntime.tsx
204
- var useVercelRSCRuntime = (adapter) => {
205
- const [runtime] = (0, import_react2.useState)(() => new VercelRSCRuntime(adapter));
206
- (0, import_react2.useInsertionEffect)(() => {
207
- runtime.adapter = adapter;
208
- });
209
- (0, import_react2.useEffect)(() => {
210
- runtime.onAdapterUpdated();
211
- });
212
- return runtime;
213
- };
214
-
215
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
216
- var import_react5 = require("react");
217
-
218
- // src/ui/VercelAIRuntime.tsx
219
- var import_internal2 = require("@assistant-ui/react/internal");
220
- var import_zustand2 = require("zustand");
221
-
222
- // src/ui/getVercelAIMessage.tsx
223
- var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
224
- var getVercelAIMessage = (message) => {
225
- return message[symbolInnerAIMessage];
226
- };
227
-
228
- // src/ui/utils/sliceMessagesUntil.tsx
229
- var sliceMessagesUntil = (messages, messageId) => {
230
- if (messageId == null) return [];
231
- let messageIdx = messages.findIndex((m) => m.id === messageId);
232
- if (messageIdx === -1)
233
- throw new Error(
234
- "useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui."
235
- );
236
- while (messages[messageIdx + 1]?.role === "assistant") {
237
- messageIdx++;
238
- }
239
- return messages.slice(0, messageIdx + 1);
240
- };
241
-
242
- // src/ui/utils/useVercelAIComposerSync.tsx
243
- var import_experimental = require("@assistant-ui/react/experimental");
244
- var import_react3 = require("react");
245
- var useVercelAIComposerSync = (vercel) => {
246
- const { useComposer } = (0, import_experimental.useThreadContext)();
247
- (0, import_react3.useEffect)(() => {
248
- useComposer.setState({
249
- value: vercel.input,
250
- setValue: vercel.setInput
251
- });
252
- }, [useComposer, vercel.input, vercel.setInput]);
253
- };
254
-
255
- // src/ui/utils/useVercelAIThreadSync.tsx
256
- var import_react4 = require("react");
257
- var getIsRunning = (vercel) => {
258
- if ("isLoading" in vercel) return vercel.isLoading;
259
- return vercel.status === "in_progress";
260
- };
261
- var vercelToThreadMessage2 = (messages, status) => {
262
- const firstMessage = messages[0];
263
- if (!firstMessage) throw new Error("No messages found");
264
- const common = {
265
- id: firstMessage.id,
266
- createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date(),
267
- [symbolInnerAIMessage]: messages
268
- };
269
- switch (firstMessage.role) {
270
- case "user":
271
- if (messages.length > 1) {
272
- throw new Error(
273
- "Multiple user messages found. This is likely an internal bug in assistant-ui."
274
- );
275
- }
276
- return {
277
- ...common,
278
- role: "user",
279
- content: [{ type: "text", text: firstMessage.content }]
280
- };
281
- case "assistant":
282
- return {
283
- ...common,
284
- role: "assistant",
285
- content: messages.flatMap((message) => [
286
- ...message.content ? [{ type: "text", text: message.content }] : [],
287
- ...message.toolInvocations?.map(
288
- (t) => ({
289
- type: "tool-call",
290
- name: t.toolName,
291
- args: t.args,
292
- result: "result" in t ? t.result : void 0
293
- })
294
- ) ?? []
295
- ]),
296
- status
297
- };
298
- default:
299
- throw new Error(
300
- `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
301
- );
302
- }
303
- };
304
- var hasItems = (messages) => messages.length > 0;
305
- var chunkedMessages = (messages) => {
306
- const chunks = [];
307
- let currentChunk = [];
308
- for (const message of messages) {
309
- if (message.role === "assistant") {
310
- currentChunk.push(message);
311
- } else {
312
- if (hasItems(currentChunk)) {
313
- chunks.push(currentChunk);
314
- currentChunk = [];
315
- }
316
- chunks.push([message]);
317
- }
318
- }
319
- if (hasItems(currentChunk)) {
320
- chunks.push(currentChunk);
321
- }
322
- return chunks;
323
- };
324
- var shallowArrayEqual = (a, b) => {
325
- if (a.length !== b.length) return false;
326
- for (let i = 0; i < a.length; i++) {
327
- if (a[i] !== b[i]) return false;
328
- }
329
- return true;
330
- };
331
- var useVercelAIThreadSync = (vercel, updateData) => {
332
- const isRunning = getIsRunning(vercel);
333
- const converter = (0, import_react4.useMemo)(() => new ThreadMessageConverter(), []);
334
- (0, import_react4.useEffect)(() => {
335
- const lastMessageId = vercel.messages.at(-1)?.id;
336
- const convertCallback = (messages2, cache) => {
337
- const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
338
- if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
339
- return cache;
340
- return vercelToThreadMessage2(messages2, status);
341
- };
342
- const messages = converter.convertMessages(
343
- chunkedMessages(vercel.messages),
344
- convertCallback,
345
- (m) => m[0]
346
- );
347
- updateData(isRunning, messages);
348
- }, [updateData, isRunning, vercel.messages, converter]);
349
- };
350
-
351
- // src/ui/VercelAIRuntime.tsx
352
- var hasUpcomingMessage = (isRunning, messages) => {
353
- return isRunning && messages[messages.length - 1]?.role !== "assistant";
354
- };
355
- var VercelAIRuntime = class extends import_internal2.ProxyConfigProvider {
356
- constructor(vercel) {
357
- super();
358
- this.vercel = vercel;
359
- this.useVercel = (0, import_zustand2.create)(() => ({
360
- vercel
361
- }));
362
- }
363
- _subscriptions = /* @__PURE__ */ new Set();
364
- repository = new import_internal2.MessageRepository();
365
- assistantOptimisticId = null;
366
- useVercel;
367
- messages = [];
368
- isRunning = false;
369
- getBranches(messageId) {
370
- return this.repository.getBranches(messageId);
371
- }
372
- switchToBranch(branchId) {
373
- this.repository.switchToBranch(branchId);
374
- this.updateVercelMessages(this.repository.getMessages());
375
- }
376
- async append(message) {
377
- if (message.content.length !== 1 || message.content[0]?.type !== "text")
378
- throw new Error("Only text content is supported by Vercel AI SDK.");
379
- const newMessages = sliceMessagesUntil(
380
- this.vercel.messages,
381
- message.parentId
382
- );
383
- this.vercel.setMessages(newMessages);
384
- await this.vercel.append({
385
- role: "user",
386
- content: message.content[0].text
387
- });
388
- }
389
- async startRun(parentId) {
390
- const reloadMaybe = "reload" in this.vercel ? this.vercel.reload : void 0;
391
- if (!reloadMaybe)
392
- throw new Error(
393
- "Reload is not supported by Vercel AI SDK's useAssistant."
394
- );
395
- const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);
396
- this.vercel.setMessages(newMessages);
397
- await reloadMaybe();
398
- }
399
- cancelRun() {
400
- const previousMessage = this.vercel.messages.at(-1);
401
- this.vercel.stop();
402
- if (this.assistantOptimisticId) {
403
- this.repository.deleteMessage(this.assistantOptimisticId);
404
- this.assistantOptimisticId = null;
405
- }
406
- let messages = this.repository.getMessages();
407
- if (previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id) {
408
- this.vercel.setInput(previousMessage.content);
409
- this.repository.deleteMessage(previousMessage.id);
410
- messages = this.repository.getMessages();
411
- }
412
- setTimeout(() => {
413
- this.updateVercelMessages(messages);
414
- }, 0);
415
- }
416
- subscribe(callback) {
417
- this._subscriptions.add(callback);
418
- return () => this._subscriptions.delete(callback);
419
- }
420
- updateVercelMessages = (messages) => {
421
- this.vercel.setMessages(
422
- messages.flatMap(getVercelAIMessage).filter((m) => m != null)
423
- );
424
- };
425
- onVercelUpdated() {
426
- if (this.useVercel.getState().vercel !== this.vercel) {
427
- this.useVercel.setState({ vercel: this.vercel });
428
- }
429
- }
430
- updateData = (isRunning, vm) => {
431
- for (let i = 0; i < vm.length; i++) {
432
- const message = vm[i];
433
- const parent = vm[i - 1];
434
- this.repository.addOrUpdateMessage(parent?.id ?? null, message);
435
- }
436
- if (this.assistantOptimisticId) {
437
- this.repository.deleteMessage(this.assistantOptimisticId);
438
- this.assistantOptimisticId = null;
439
- }
440
- if (hasUpcomingMessage(isRunning, vm)) {
441
- this.assistantOptimisticId = this.repository.appendOptimisticMessage(
442
- vm.at(-1)?.id ?? null,
443
- {
444
- role: "assistant",
445
- content: [{ type: "text", text: "" }]
446
- }
447
- );
448
- }
449
- this.repository.resetHead(
450
- this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
451
- );
452
- this.messages = this.repository.getMessages();
453
- this.isRunning = isRunning;
454
- for (const callback of this._subscriptions) callback();
455
- };
456
- unstable_synchronizer = () => {
457
- const { vercel } = this.useVercel();
458
- useVercelAIThreadSync(vercel, this.updateData);
459
- useVercelAIComposerSync(vercel);
460
- return null;
461
- };
462
- };
463
-
464
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
465
- var useVercelUseChatRuntime = (chatHelpers) => {
466
- const [runtime] = (0, import_react5.useState)(() => new VercelAIRuntime(chatHelpers));
467
- (0, import_react5.useInsertionEffect)(() => {
468
- runtime.vercel = chatHelpers;
469
- });
470
- (0, import_react5.useEffect)(() => {
471
- runtime.onVercelUpdated();
472
- });
473
- return runtime;
474
- };
475
-
476
- // src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
477
- var import_react6 = require("react");
478
- var useVercelUseAssistantRuntime = (assistantHelpers) => {
479
- const [runtime] = (0, import_react6.useState)(() => new VercelAIRuntime(assistantHelpers));
480
- (0, import_react6.useInsertionEffect)(() => {
481
- runtime.vercel = assistantHelpers;
482
- });
483
- (0, import_react6.useEffect)(() => {
484
- runtime.onVercelUpdated();
485
- });
486
- return runtime;
487
- };
488
- // Annotate the CommonJS export names for ESM import in node:
489
- 0 && (module.exports = {
490
- getVercelAIMessage,
491
- getVercelRSCMessage,
492
- unstable_VercelModelAdapter,
493
- useVercelRSCRuntime,
494
- useVercelUseAssistantRuntime,
495
- useVercelUseChatRuntime
496
- });
497
- //# sourceMappingURL=index.js.map