@assistant-ui/react 0.0.26 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -1016,16 +1016,16 @@ __export(contentPart_exports, {
1016
1016
  InProgressIndicator: () => ContentPartInProgressIndicator
1017
1017
  });
1018
1018
 
1019
- // src/runtime/vercel-ai/rsc/useVercelRSCRuntime.tsx
1019
+ // ../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx
1020
1020
  import { useEffect as useEffect7, useInsertionEffect, useState as useState3 } from "react";
1021
1021
 
1022
- // src/runtime/vercel-ai/rsc/VercelRSCRuntime.tsx
1022
+ // ../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx
1023
1023
  import { create as create4 } from "zustand";
1024
1024
 
1025
- // src/runtime/vercel-ai/rsc/useVercelRSCSync.tsx
1025
+ // ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
1026
1026
  import { useEffect as useEffect6, useMemo as useMemo4 } from "react";
1027
1027
 
1028
- // src/runtime/vercel-ai/utils/ThreadMessageConverter.ts
1028
+ // ../react-ai-sdk/src/utils/ThreadMessageConverter.ts
1029
1029
  var ThreadMessageConverter = class {
1030
1030
  cache = /* @__PURE__ */ new WeakMap();
1031
1031
  convertMessages(messages, converter, keyMapper = (key) => key) {
@@ -1039,13 +1039,13 @@ var ThreadMessageConverter = class {
1039
1039
  }
1040
1040
  };
1041
1041
 
1042
- // src/runtime/vercel-ai/rsc/getVercelRSCMessage.tsx
1042
+ // ../react-ai-sdk/src/rsc/getVercelRSCMessage.tsx
1043
1043
  var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
1044
1044
  var getVercelRSCMessage = (message) => {
1045
1045
  return message[symbolInnerRSCMessage];
1046
1046
  };
1047
1047
 
1048
- // src/runtime/vercel-ai/rsc/useVercelRSCSync.tsx
1048
+ // ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
1049
1049
  var vercelToThreadMessage = (converter, rawMessage) => {
1050
1050
  const message = converter(rawMessage);
1051
1051
  return {
@@ -1071,7 +1071,7 @@ var useVercelRSCSync = (adapter, updateData) => {
1071
1071
  }, [updateData, converter, convertCallback, adapter.messages]);
1072
1072
  };
1073
1073
 
1074
- // src/runtime/vercel-ai/rsc/VercelRSCRuntime.tsx
1074
+ // ../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx
1075
1075
  var EMPTY_BRANCHES = Object.freeze([]);
1076
1076
  var VercelRSCRuntime = class {
1077
1077
  constructor(adapter) {
@@ -1143,7 +1143,7 @@ var VercelRSCRuntime = class {
1143
1143
  };
1144
1144
  };
1145
1145
 
1146
- // src/runtime/vercel-ai/rsc/useVercelRSCRuntime.tsx
1146
+ // ../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx
1147
1147
  var useVercelRSCRuntime = (adapter) => {
1148
1148
  const [runtime] = useState3(() => new VercelRSCRuntime(adapter));
1149
1149
  useInsertionEffect(() => {
@@ -1155,179 +1155,19 @@ var useVercelRSCRuntime = (adapter) => {
1155
1155
  return runtime;
1156
1156
  };
1157
1157
 
1158
- // src/runtime/vercel-ai/ui/use-chat/useVercelUseChatRuntime.tsx
1158
+ // ../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx
1159
1159
  import { useEffect as useEffect10, useInsertionEffect as useInsertionEffect2, useState as useState4 } from "react";
1160
1160
 
1161
- // src/runtime/vercel-ai/ui/VercelAIRuntime.tsx
1161
+ // ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
1162
1162
  import { create as create5 } from "zustand";
1163
1163
 
1164
- // src/runtime/utils/idUtils.tsx
1165
- import { customAlphabet } from "nanoid/non-secure";
1166
- var generateId = customAlphabet(
1167
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
1168
- 7
1169
- );
1170
- var optimisticPrefix = "__optimistic__";
1171
- var generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
1172
-
1173
- // src/runtime/utils/MessageRepository.tsx
1174
- var findHead = (message) => {
1175
- if (message.next) return findHead(message.next);
1176
- return message;
1177
- };
1178
- var MessageRepository = class {
1179
- messages = /* @__PURE__ */ new Map();
1180
- // message_id -> item
1181
- head = null;
1182
- root = {
1183
- children: []
1184
- };
1185
- performOp(newParent, child, operation) {
1186
- const parentOrRoot = child.prev ?? this.root;
1187
- const newParentOrRoot = newParent ?? this.root;
1188
- if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
1189
- if (operation !== "link") {
1190
- parentOrRoot.children = parentOrRoot.children.filter(
1191
- (m) => m !== child.current.id
1192
- );
1193
- if (child.prev?.next === child) {
1194
- const fallbackId = child.prev.children.at(-1);
1195
- const fallback = fallbackId ? this.messages.get(fallbackId) : null;
1196
- if (fallback === void 0) {
1197
- throw new Error(
1198
- "MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui."
1199
- );
1200
- }
1201
- child.prev.next = fallback;
1202
- }
1203
- }
1204
- if (operation !== "cut") {
1205
- newParentOrRoot.children = [
1206
- ...newParentOrRoot.children,
1207
- child.current.id
1208
- ];
1209
- if (newParent && (findHead(child) === this.head || newParent.next === null)) {
1210
- newParent.next = child;
1211
- }
1212
- child.prev = newParent;
1213
- }
1214
- }
1215
- getMessages() {
1216
- const messages = new Array(this.head?.level ?? 0);
1217
- for (let current = this.head; current; current = current.prev) {
1218
- messages[current.level] = current.current;
1219
- }
1220
- return messages;
1221
- }
1222
- addOrUpdateMessage(parentId, message) {
1223
- const existingItem = this.messages.get(message.id);
1224
- const prev = parentId ? this.messages.get(parentId) : null;
1225
- if (prev === void 0)
1226
- throw new Error(
1227
- "MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui."
1228
- );
1229
- if (existingItem) {
1230
- existingItem.current = message;
1231
- this.performOp(prev, existingItem, "relink");
1232
- return;
1233
- }
1234
- const newItem = {
1235
- prev,
1236
- current: message,
1237
- next: null,
1238
- children: [],
1239
- level: prev ? prev.level + 1 : 0
1240
- };
1241
- this.messages.set(message.id, newItem);
1242
- this.performOp(prev, newItem, "link");
1243
- if (this.head === prev) {
1244
- this.head = newItem;
1245
- }
1246
- }
1247
- appendOptimisticMessage(parentId, message) {
1248
- let optimisticId;
1249
- do {
1250
- optimisticId = generateOptimisticId();
1251
- } while (this.messages.has(optimisticId));
1252
- this.addOrUpdateMessage(parentId, {
1253
- ...message,
1254
- id: optimisticId,
1255
- createdAt: /* @__PURE__ */ new Date(),
1256
- ...message.role === "assistant" ? { status: "in_progress" } : void 0
1257
- });
1258
- return optimisticId;
1259
- }
1260
- deleteMessage(messageId, replacementId) {
1261
- const message = this.messages.get(messageId);
1262
- if (!message)
1263
- throw new Error(
1264
- "MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui."
1265
- );
1266
- const replacement = replacementId === void 0 ? message.prev : replacementId === null ? null : this.messages.get(replacementId);
1267
- if (replacement === void 0)
1268
- throw new Error(
1269
- "MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui."
1270
- );
1271
- for (const child of message.children) {
1272
- const childMessage = this.messages.get(child);
1273
- if (!childMessage)
1274
- throw new Error(
1275
- "MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui."
1276
- );
1277
- this.performOp(replacement, childMessage, "relink");
1278
- }
1279
- this.performOp(null, message, "cut");
1280
- this.messages.delete(messageId);
1281
- if (this.head === message) {
1282
- this.head = replacement ? findHead(replacement) : null;
1283
- }
1284
- }
1285
- getBranches(messageId) {
1286
- const message = this.messages.get(messageId);
1287
- if (!message)
1288
- throw new Error(
1289
- "MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui."
1290
- );
1291
- const { children } = message.prev ?? this.root;
1292
- return children;
1293
- }
1294
- switchToBranch(messageId) {
1295
- const message = this.messages.get(messageId);
1296
- if (!message)
1297
- throw new Error(
1298
- "MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui."
1299
- );
1300
- if (message.prev) {
1301
- message.prev.next = message;
1302
- }
1303
- this.head = findHead(message);
1304
- }
1305
- resetHead(messageId) {
1306
- if (messageId === null) {
1307
- this.head = null;
1308
- return;
1309
- }
1310
- const message = this.messages.get(messageId);
1311
- if (!message)
1312
- throw new Error(
1313
- "MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui."
1314
- );
1315
- this.head = message;
1316
- for (let current = message; current; current = current.prev) {
1317
- if (current.prev) {
1318
- current.prev.next = current;
1319
- }
1320
- }
1321
- }
1322
- };
1323
-
1324
- // src/runtime/vercel-ai/ui/getVercelAIMessage.tsx
1164
+ // ../react-ai-sdk/src/ui/getVercelAIMessage.tsx
1325
1165
  var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
1326
1166
  var getVercelAIMessage = (message) => {
1327
1167
  return message[symbolInnerAIMessage];
1328
1168
  };
1329
1169
 
1330
- // src/runtime/vercel-ai/ui/utils/sliceMessagesUntil.tsx
1170
+ // ../react-ai-sdk/src/ui/utils/sliceMessagesUntil.tsx
1331
1171
  var sliceMessagesUntil = (messages, messageId) => {
1332
1172
  if (messageId == null) return [];
1333
1173
  let messageIdx = messages.findIndex((m) => m.id === messageId);
@@ -1341,7 +1181,7 @@ var sliceMessagesUntil = (messages, messageId) => {
1341
1181
  return messages.slice(0, messageIdx + 1);
1342
1182
  };
1343
1183
 
1344
- // src/runtime/vercel-ai/ui/utils/useVercelAIComposerSync.tsx
1184
+ // ../react-ai-sdk/src/ui/utils/useVercelAIComposerSync.tsx
1345
1185
  import { useEffect as useEffect8 } from "react";
1346
1186
  var useVercelAIComposerSync = (vercel) => {
1347
1187
  const { useComposer } = useThreadContext();
@@ -1353,7 +1193,7 @@ var useVercelAIComposerSync = (vercel) => {
1353
1193
  }, [useComposer, vercel.input, vercel.setInput]);
1354
1194
  };
1355
1195
 
1356
- // src/runtime/vercel-ai/ui/utils/useVercelAIThreadSync.tsx
1196
+ // ../react-ai-sdk/src/ui/utils/useVercelAIThreadSync.tsx
1357
1197
  import { useEffect as useEffect9, useMemo as useMemo5 } from "react";
1358
1198
  var getIsRunning = (vercel) => {
1359
1199
  if ("isLoading" in vercel) return vercel.isLoading;
@@ -1449,7 +1289,7 @@ var useVercelAIThreadSync = (vercel, updateData) => {
1449
1289
  }, [updateData, isRunning, vercel.messages, converter]);
1450
1290
  };
1451
1291
 
1452
- // src/runtime/vercel-ai/ui/VercelAIRuntime.tsx
1292
+ // ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
1453
1293
  var hasUpcomingMessage = (isRunning, messages) => {
1454
1294
  return isRunning && messages[messages.length - 1]?.role !== "assistant";
1455
1295
  };
@@ -1561,7 +1401,7 @@ var VercelAIRuntime = class {
1561
1401
  };
1562
1402
  };
1563
1403
 
1564
- // src/runtime/vercel-ai/ui/use-chat/useVercelUseChatRuntime.tsx
1404
+ // ../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx
1565
1405
  var useVercelUseChatRuntime = (chatHelpers) => {
1566
1406
  const [runtime] = useState4(() => new VercelAIRuntime(chatHelpers));
1567
1407
  useInsertionEffect2(() => {
@@ -1573,7 +1413,7 @@ var useVercelUseChatRuntime = (chatHelpers) => {
1573
1413
  return runtime;
1574
1414
  };
1575
1415
 
1576
- // src/runtime/vercel-ai/ui/use-assistant/useVercelUseAssistantRuntime.tsx
1416
+ // ../react-ai-sdk/src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
1577
1417
  import { useEffect as useEffect11, useInsertionEffect as useInsertionEffect3, useState as useState5 } from "react";
1578
1418
  var useVercelUseAssistantRuntime = (assistantHelpers) => {
1579
1419
  const [runtime] = useState5(() => new VercelAIRuntime(assistantHelpers));
@@ -1586,6 +1426,166 @@ var useVercelUseAssistantRuntime = (assistantHelpers) => {
1586
1426
  return runtime;
1587
1427
  };
1588
1428
 
1429
+ // src/runtime/utils/idUtils.tsx
1430
+ import { customAlphabet } from "nanoid/non-secure";
1431
+ var generateId = customAlphabet(
1432
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
1433
+ 7
1434
+ );
1435
+ var optimisticPrefix = "__optimistic__";
1436
+ var generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
1437
+
1438
+ // src/runtime/utils/MessageRepository.tsx
1439
+ var findHead = (message) => {
1440
+ if (message.next) return findHead(message.next);
1441
+ return message;
1442
+ };
1443
+ var MessageRepository = class {
1444
+ messages = /* @__PURE__ */ new Map();
1445
+ // message_id -> item
1446
+ head = null;
1447
+ root = {
1448
+ children: []
1449
+ };
1450
+ performOp(newParent, child, operation) {
1451
+ const parentOrRoot = child.prev ?? this.root;
1452
+ const newParentOrRoot = newParent ?? this.root;
1453
+ if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
1454
+ if (operation !== "link") {
1455
+ parentOrRoot.children = parentOrRoot.children.filter(
1456
+ (m) => m !== child.current.id
1457
+ );
1458
+ if (child.prev?.next === child) {
1459
+ const fallbackId = child.prev.children.at(-1);
1460
+ const fallback = fallbackId ? this.messages.get(fallbackId) : null;
1461
+ if (fallback === void 0) {
1462
+ throw new Error(
1463
+ "MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui."
1464
+ );
1465
+ }
1466
+ child.prev.next = fallback;
1467
+ }
1468
+ }
1469
+ if (operation !== "cut") {
1470
+ newParentOrRoot.children = [
1471
+ ...newParentOrRoot.children,
1472
+ child.current.id
1473
+ ];
1474
+ if (newParent && (findHead(child) === this.head || newParent.next === null)) {
1475
+ newParent.next = child;
1476
+ }
1477
+ child.prev = newParent;
1478
+ }
1479
+ }
1480
+ getMessages() {
1481
+ const messages = new Array(this.head?.level ?? 0);
1482
+ for (let current = this.head; current; current = current.prev) {
1483
+ messages[current.level] = current.current;
1484
+ }
1485
+ return messages;
1486
+ }
1487
+ addOrUpdateMessage(parentId, message) {
1488
+ const existingItem = this.messages.get(message.id);
1489
+ const prev = parentId ? this.messages.get(parentId) : null;
1490
+ if (prev === void 0)
1491
+ throw new Error(
1492
+ "MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui."
1493
+ );
1494
+ if (existingItem) {
1495
+ existingItem.current = message;
1496
+ this.performOp(prev, existingItem, "relink");
1497
+ return;
1498
+ }
1499
+ const newItem = {
1500
+ prev,
1501
+ current: message,
1502
+ next: null,
1503
+ children: [],
1504
+ level: prev ? prev.level + 1 : 0
1505
+ };
1506
+ this.messages.set(message.id, newItem);
1507
+ this.performOp(prev, newItem, "link");
1508
+ if (this.head === prev) {
1509
+ this.head = newItem;
1510
+ }
1511
+ }
1512
+ appendOptimisticMessage(parentId, message) {
1513
+ let optimisticId;
1514
+ do {
1515
+ optimisticId = generateOptimisticId();
1516
+ } while (this.messages.has(optimisticId));
1517
+ this.addOrUpdateMessage(parentId, {
1518
+ ...message,
1519
+ id: optimisticId,
1520
+ createdAt: /* @__PURE__ */ new Date(),
1521
+ ...message.role === "assistant" ? { status: "in_progress" } : void 0
1522
+ });
1523
+ return optimisticId;
1524
+ }
1525
+ deleteMessage(messageId, replacementId) {
1526
+ const message = this.messages.get(messageId);
1527
+ if (!message)
1528
+ throw new Error(
1529
+ "MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui."
1530
+ );
1531
+ const replacement = replacementId === void 0 ? message.prev : replacementId === null ? null : this.messages.get(replacementId);
1532
+ if (replacement === void 0)
1533
+ throw new Error(
1534
+ "MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui."
1535
+ );
1536
+ for (const child of message.children) {
1537
+ const childMessage = this.messages.get(child);
1538
+ if (!childMessage)
1539
+ throw new Error(
1540
+ "MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui."
1541
+ );
1542
+ this.performOp(replacement, childMessage, "relink");
1543
+ }
1544
+ this.performOp(null, message, "cut");
1545
+ this.messages.delete(messageId);
1546
+ if (this.head === message) {
1547
+ this.head = replacement ? findHead(replacement) : null;
1548
+ }
1549
+ }
1550
+ getBranches(messageId) {
1551
+ const message = this.messages.get(messageId);
1552
+ if (!message)
1553
+ throw new Error(
1554
+ "MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui."
1555
+ );
1556
+ const { children } = message.prev ?? this.root;
1557
+ return children;
1558
+ }
1559
+ switchToBranch(messageId) {
1560
+ const message = this.messages.get(messageId);
1561
+ if (!message)
1562
+ throw new Error(
1563
+ "MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui."
1564
+ );
1565
+ if (message.prev) {
1566
+ message.prev.next = message;
1567
+ }
1568
+ this.head = findHead(message);
1569
+ }
1570
+ resetHead(messageId) {
1571
+ if (messageId === null) {
1572
+ this.head = null;
1573
+ return;
1574
+ }
1575
+ const message = this.messages.get(messageId);
1576
+ if (!message)
1577
+ throw new Error(
1578
+ "MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui."
1579
+ );
1580
+ this.head = message;
1581
+ for (let current = message; current; current = current.prev) {
1582
+ if (current.prev) {
1583
+ current.prev.next = current;
1584
+ }
1585
+ }
1586
+ }
1587
+ };
1588
+
1589
1589
  // src/context/providers/AssistantRuntimeProvider.tsx
1590
1590
  import { memo } from "react";
1591
1591
 
@@ -1832,48 +1832,6 @@ var useLocalRuntime = (adapter) => {
1832
1832
  });
1833
1833
  return runtime;
1834
1834
  };
1835
-
1836
- // src/runtime/local/vercel/VercelModelAdapter.tsx
1837
- import { streamText } from "ai";
1838
- var VercelModelAdapter = class {
1839
- constructor(model) {
1840
- this.model = model;
1841
- }
1842
- async run({ messages, abortSignal, onUpdate }) {
1843
- const { fullStream } = await streamText({
1844
- model: this.model,
1845
- abortSignal,
1846
- messages: messages.map((m) => ({
1847
- role: m.role,
1848
- content: m.content.filter((c) => c.type !== "ui")
1849
- }))
1850
- });
1851
- const content = [];
1852
- for await (const aiPart of fullStream) {
1853
- switch (aiPart.type) {
1854
- case "text-delta": {
1855
- let part = content.at(-1);
1856
- if (!part || part.type !== "text") {
1857
- part = { type: "text", text: "" };
1858
- content.push(part);
1859
- }
1860
- part.text += aiPart.textDelta;
1861
- break;
1862
- }
1863
- case "tool-call": {
1864
- content.push({
1865
- type: "tool-call",
1866
- name: aiPart.toolName,
1867
- args: aiPart.args
1868
- });
1869
- break;
1870
- }
1871
- }
1872
- onUpdate({ content });
1873
- }
1874
- return { content };
1875
- }
1876
- };
1877
1835
  export {
1878
1836
  actionBar_exports as ActionBarPrimitive,
1879
1837
  AssistantRuntimeProvider,
@@ -1886,7 +1844,7 @@ export {
1886
1844
  VercelRSCAssistantProvider,
1887
1845
  getVercelAIMessage,
1888
1846
  getVercelRSCMessage,
1889
- VercelModelAdapter as unstable_VercelModelAdapter,
1847
+ MessageRepository as unstable_MessageRepository,
1890
1848
  useComposerContext as unstable_useComposerContext,
1891
1849
  useContentPartContext as unstable_useContentPartContext,
1892
1850
  useLocalRuntime as unstable_useLocalRuntime,