@assistant-ui/react 0.0.25 → 0.0.27

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.js CHANGED
@@ -41,7 +41,7 @@ __export(src_exports, {
41
41
  VercelRSCAssistantProvider: () => VercelRSCAssistantProvider,
42
42
  getVercelAIMessage: () => getVercelAIMessage,
43
43
  getVercelRSCMessage: () => getVercelRSCMessage,
44
- unstable_VercelModelAdapter: () => VercelModelAdapter,
44
+ unstable_MessageRepository: () => MessageRepository,
45
45
  unstable_useComposerContext: () => useComposerContext,
46
46
  unstable_useContentPartContext: () => useContentPartContext,
47
47
  unstable_useLocalRuntime: () => useLocalRuntime,
@@ -1041,16 +1041,16 @@ __export(contentPart_exports, {
1041
1041
  InProgressIndicator: () => ContentPartInProgressIndicator
1042
1042
  });
1043
1043
 
1044
- // src/runtime/vercel-ai/rsc/useVercelRSCRuntime.tsx
1044
+ // ../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx
1045
1045
  var import_react30 = require("react");
1046
1046
 
1047
- // src/runtime/vercel-ai/rsc/VercelRSCRuntime.tsx
1047
+ // ../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx
1048
1048
  var import_zustand4 = require("zustand");
1049
1049
 
1050
- // src/runtime/vercel-ai/rsc/useVercelRSCSync.tsx
1050
+ // ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
1051
1051
  var import_react29 = require("react");
1052
1052
 
1053
- // src/runtime/vercel-ai/utils/ThreadMessageConverter.ts
1053
+ // ../react-ai-sdk/src/utils/ThreadMessageConverter.ts
1054
1054
  var ThreadMessageConverter = class {
1055
1055
  cache = /* @__PURE__ */ new WeakMap();
1056
1056
  convertMessages(messages, converter, keyMapper = (key) => key) {
@@ -1064,13 +1064,13 @@ var ThreadMessageConverter = class {
1064
1064
  }
1065
1065
  };
1066
1066
 
1067
- // src/runtime/vercel-ai/rsc/getVercelRSCMessage.tsx
1067
+ // ../react-ai-sdk/src/rsc/getVercelRSCMessage.tsx
1068
1068
  var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
1069
1069
  var getVercelRSCMessage = (message) => {
1070
1070
  return message[symbolInnerRSCMessage];
1071
1071
  };
1072
1072
 
1073
- // src/runtime/vercel-ai/rsc/useVercelRSCSync.tsx
1073
+ // ../react-ai-sdk/src/rsc/useVercelRSCSync.tsx
1074
1074
  var vercelToThreadMessage = (converter, rawMessage) => {
1075
1075
  const message = converter(rawMessage);
1076
1076
  return {
@@ -1096,7 +1096,7 @@ var useVercelRSCSync = (adapter, updateData) => {
1096
1096
  }, [updateData, converter, convertCallback, adapter.messages]);
1097
1097
  };
1098
1098
 
1099
- // src/runtime/vercel-ai/rsc/VercelRSCRuntime.tsx
1099
+ // ../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx
1100
1100
  var EMPTY_BRANCHES = Object.freeze([]);
1101
1101
  var VercelRSCRuntime = class {
1102
1102
  constructor(adapter) {
@@ -1168,7 +1168,7 @@ var VercelRSCRuntime = class {
1168
1168
  };
1169
1169
  };
1170
1170
 
1171
- // src/runtime/vercel-ai/rsc/useVercelRSCRuntime.tsx
1171
+ // ../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx
1172
1172
  var useVercelRSCRuntime = (adapter) => {
1173
1173
  const [runtime] = (0, import_react30.useState)(() => new VercelRSCRuntime(adapter));
1174
1174
  (0, import_react30.useInsertionEffect)(() => {
@@ -1180,179 +1180,19 @@ var useVercelRSCRuntime = (adapter) => {
1180
1180
  return runtime;
1181
1181
  };
1182
1182
 
1183
- // src/runtime/vercel-ai/ui/use-chat/useVercelUseChatRuntime.tsx
1184
- var import_react33 = require("react");
1183
+ // ../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx
1184
+ var import_react35 = require("react");
1185
1185
 
1186
- // src/runtime/vercel-ai/ui/VercelAIRuntime.tsx
1186
+ // ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
1187
1187
  var import_zustand5 = require("zustand");
1188
1188
 
1189
- // src/runtime/utils/idUtils.tsx
1190
- var import_non_secure = require("nanoid/non-secure");
1191
- var generateId = (0, import_non_secure.customAlphabet)(
1192
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
1193
- 7
1194
- );
1195
- var optimisticPrefix = "__optimistic__";
1196
- var generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
1197
-
1198
- // src/runtime/utils/MessageRepository.tsx
1199
- var findHead = (message) => {
1200
- if (message.next) return findHead(message.next);
1201
- return message;
1202
- };
1203
- var MessageRepository = class {
1204
- messages = /* @__PURE__ */ new Map();
1205
- // message_id -> item
1206
- head = null;
1207
- root = {
1208
- children: []
1209
- };
1210
- performOp(newParent, child, operation) {
1211
- const parentOrRoot = child.prev ?? this.root;
1212
- const newParentOrRoot = newParent ?? this.root;
1213
- if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
1214
- if (operation !== "link") {
1215
- parentOrRoot.children = parentOrRoot.children.filter(
1216
- (m) => m !== child.current.id
1217
- );
1218
- if (child.prev?.next === child) {
1219
- const fallbackId = child.prev.children.at(-1);
1220
- const fallback = fallbackId ? this.messages.get(fallbackId) : null;
1221
- if (fallback === void 0) {
1222
- throw new Error(
1223
- "MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui."
1224
- );
1225
- }
1226
- child.prev.next = fallback;
1227
- }
1228
- }
1229
- if (operation !== "cut") {
1230
- newParentOrRoot.children = [
1231
- ...newParentOrRoot.children,
1232
- child.current.id
1233
- ];
1234
- if (newParent && (findHead(child) === this.head || newParent.next === null)) {
1235
- newParent.next = child;
1236
- }
1237
- child.prev = newParent;
1238
- }
1239
- }
1240
- getMessages() {
1241
- const messages = new Array(this.head?.level ?? 0);
1242
- for (let current = this.head; current; current = current.prev) {
1243
- messages[current.level] = current.current;
1244
- }
1245
- return messages;
1246
- }
1247
- addOrUpdateMessage(parentId, message) {
1248
- const existingItem = this.messages.get(message.id);
1249
- const prev = parentId ? this.messages.get(parentId) : null;
1250
- if (prev === void 0)
1251
- throw new Error(
1252
- "MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui."
1253
- );
1254
- if (existingItem) {
1255
- existingItem.current = message;
1256
- this.performOp(prev, existingItem, "relink");
1257
- return;
1258
- }
1259
- const newItem = {
1260
- prev,
1261
- current: message,
1262
- next: null,
1263
- children: [],
1264
- level: prev ? prev.level + 1 : 0
1265
- };
1266
- this.messages.set(message.id, newItem);
1267
- this.performOp(prev, newItem, "link");
1268
- if (this.head === prev) {
1269
- this.head = newItem;
1270
- }
1271
- }
1272
- appendOptimisticMessage(parentId, message) {
1273
- let optimisticId;
1274
- do {
1275
- optimisticId = generateOptimisticId();
1276
- } while (this.messages.has(optimisticId));
1277
- this.addOrUpdateMessage(parentId, {
1278
- ...message,
1279
- id: optimisticId,
1280
- createdAt: /* @__PURE__ */ new Date(),
1281
- ...message.role === "assistant" ? { status: "in_progress" } : void 0
1282
- });
1283
- return optimisticId;
1284
- }
1285
- deleteMessage(messageId, replacementId) {
1286
- const message = this.messages.get(messageId);
1287
- if (!message)
1288
- throw new Error(
1289
- "MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui."
1290
- );
1291
- const replacement = replacementId === void 0 ? message.prev : replacementId === null ? null : this.messages.get(replacementId);
1292
- if (replacement === void 0)
1293
- throw new Error(
1294
- "MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui."
1295
- );
1296
- for (const child of message.children) {
1297
- const childMessage = this.messages.get(child);
1298
- if (!childMessage)
1299
- throw new Error(
1300
- "MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui."
1301
- );
1302
- this.performOp(replacement, childMessage, "relink");
1303
- }
1304
- this.performOp(null, message, "cut");
1305
- this.messages.delete(messageId);
1306
- if (this.head === message) {
1307
- this.head = replacement ? findHead(replacement) : null;
1308
- }
1309
- }
1310
- getBranches(messageId) {
1311
- const message = this.messages.get(messageId);
1312
- if (!message)
1313
- throw new Error(
1314
- "MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui."
1315
- );
1316
- const { children } = message.prev ?? this.root;
1317
- return children;
1318
- }
1319
- switchToBranch(messageId) {
1320
- const message = this.messages.get(messageId);
1321
- if (!message)
1322
- throw new Error(
1323
- "MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui."
1324
- );
1325
- if (message.prev) {
1326
- message.prev.next = message;
1327
- }
1328
- this.head = findHead(message);
1329
- }
1330
- resetHead(messageId) {
1331
- if (messageId === null) {
1332
- this.head = null;
1333
- return;
1334
- }
1335
- const message = this.messages.get(messageId);
1336
- if (!message)
1337
- throw new Error(
1338
- "MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui."
1339
- );
1340
- this.head = message;
1341
- for (let current = message; current; current = current.prev) {
1342
- if (current.prev) {
1343
- current.prev.next = current;
1344
- }
1345
- }
1346
- }
1347
- };
1348
-
1349
- // src/runtime/vercel-ai/ui/getVercelAIMessage.tsx
1189
+ // ../react-ai-sdk/src/ui/getVercelAIMessage.tsx
1350
1190
  var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
1351
1191
  var getVercelAIMessage = (message) => {
1352
1192
  return message[symbolInnerAIMessage];
1353
1193
  };
1354
1194
 
1355
- // src/runtime/vercel-ai/ui/utils/sliceMessagesUntil.tsx
1195
+ // ../react-ai-sdk/src/ui/utils/sliceMessagesUntil.tsx
1356
1196
  var sliceMessagesUntil = (messages, messageId) => {
1357
1197
  if (messageId == null) return [];
1358
1198
  let messageIdx = messages.findIndex((m) => m.id === messageId);
@@ -1366,11 +1206,11 @@ var sliceMessagesUntil = (messages, messageId) => {
1366
1206
  return messages.slice(0, messageIdx + 1);
1367
1207
  };
1368
1208
 
1369
- // src/runtime/vercel-ai/ui/utils/useVercelAIComposerSync.tsx
1370
- var import_react31 = require("react");
1209
+ // ../react-ai-sdk/src/ui/utils/useVercelAIComposerSync.tsx
1210
+ var import_react32 = require("react");
1371
1211
  var useVercelAIComposerSync = (vercel) => {
1372
1212
  const { useComposer } = useThreadContext();
1373
- (0, import_react31.useEffect)(() => {
1213
+ (0, import_react32.useEffect)(() => {
1374
1214
  useComposer.setState({
1375
1215
  value: vercel.input,
1376
1216
  setValue: vercel.setInput
@@ -1378,8 +1218,8 @@ var useVercelAIComposerSync = (vercel) => {
1378
1218
  }, [useComposer, vercel.input, vercel.setInput]);
1379
1219
  };
1380
1220
 
1381
- // src/runtime/vercel-ai/ui/utils/useVercelAIThreadSync.tsx
1382
- var import_react32 = require("react");
1221
+ // ../react-ai-sdk/src/ui/utils/useVercelAIThreadSync.tsx
1222
+ var import_react33 = require("react");
1383
1223
  var getIsRunning = (vercel) => {
1384
1224
  if ("isLoading" in vercel) return vercel.isLoading;
1385
1225
  return vercel.status === "in_progress";
@@ -1456,8 +1296,8 @@ var shallowArrayEqual = (a, b) => {
1456
1296
  };
1457
1297
  var useVercelAIThreadSync = (vercel, updateData) => {
1458
1298
  const isRunning = getIsRunning(vercel);
1459
- const converter = (0, import_react32.useMemo)(() => new ThreadMessageConverter(), []);
1460
- (0, import_react32.useEffect)(() => {
1299
+ const converter = (0, import_react33.useMemo)(() => new ThreadMessageConverter(), []);
1300
+ (0, import_react33.useEffect)(() => {
1461
1301
  const lastMessageId = vercel.messages.at(-1)?.id;
1462
1302
  const convertCallback = (messages2, cache) => {
1463
1303
  const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
@@ -1474,7 +1314,7 @@ var useVercelAIThreadSync = (vercel, updateData) => {
1474
1314
  }, [updateData, isRunning, vercel.messages, converter]);
1475
1315
  };
1476
1316
 
1477
- // src/runtime/vercel-ai/ui/VercelAIRuntime.tsx
1317
+ // ../react-ai-sdk/src/ui/VercelAIRuntime.tsx
1478
1318
  var hasUpcomingMessage = (isRunning, messages) => {
1479
1319
  return isRunning && messages[messages.length - 1]?.role !== "assistant";
1480
1320
  };
@@ -1586,36 +1426,196 @@ var VercelAIRuntime = class {
1586
1426
  };
1587
1427
  };
1588
1428
 
1589
- // src/runtime/vercel-ai/ui/use-chat/useVercelUseChatRuntime.tsx
1429
+ // ../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx
1590
1430
  var useVercelUseChatRuntime = (chatHelpers) => {
1591
- const [runtime] = (0, import_react33.useState)(() => new VercelAIRuntime(chatHelpers));
1592
- (0, import_react33.useInsertionEffect)(() => {
1431
+ const [runtime] = (0, import_react35.useState)(() => new VercelAIRuntime(chatHelpers));
1432
+ (0, import_react35.useInsertionEffect)(() => {
1593
1433
  runtime.vercel = chatHelpers;
1594
1434
  });
1595
- (0, import_react33.useEffect)(() => {
1435
+ (0, import_react35.useEffect)(() => {
1596
1436
  runtime.onVercelUpdated();
1597
1437
  });
1598
1438
  return runtime;
1599
1439
  };
1600
1440
 
1601
- // src/runtime/vercel-ai/ui/use-assistant/useVercelUseAssistantRuntime.tsx
1602
- var import_react34 = require("react");
1441
+ // ../react-ai-sdk/src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
1442
+ var import_react36 = require("react");
1603
1443
  var useVercelUseAssistantRuntime = (assistantHelpers) => {
1604
- const [runtime] = (0, import_react34.useState)(() => new VercelAIRuntime(assistantHelpers));
1605
- (0, import_react34.useInsertionEffect)(() => {
1444
+ const [runtime] = (0, import_react36.useState)(() => new VercelAIRuntime(assistantHelpers));
1445
+ (0, import_react36.useInsertionEffect)(() => {
1606
1446
  runtime.vercel = assistantHelpers;
1607
1447
  });
1608
- (0, import_react34.useEffect)(() => {
1448
+ (0, import_react36.useEffect)(() => {
1609
1449
  runtime.onVercelUpdated();
1610
1450
  });
1611
1451
  return runtime;
1612
1452
  };
1613
1453
 
1454
+ // src/runtime/utils/idUtils.tsx
1455
+ var import_non_secure = require("nanoid/non-secure");
1456
+ var generateId = (0, import_non_secure.customAlphabet)(
1457
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
1458
+ 7
1459
+ );
1460
+ var optimisticPrefix = "__optimistic__";
1461
+ var generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;
1462
+
1463
+ // src/runtime/utils/MessageRepository.tsx
1464
+ var findHead = (message) => {
1465
+ if (message.next) return findHead(message.next);
1466
+ return message;
1467
+ };
1468
+ var MessageRepository = class {
1469
+ messages = /* @__PURE__ */ new Map();
1470
+ // message_id -> item
1471
+ head = null;
1472
+ root = {
1473
+ children: []
1474
+ };
1475
+ performOp(newParent, child, operation) {
1476
+ const parentOrRoot = child.prev ?? this.root;
1477
+ const newParentOrRoot = newParent ?? this.root;
1478
+ if (operation === "relink" && parentOrRoot === newParentOrRoot) return;
1479
+ if (operation !== "link") {
1480
+ parentOrRoot.children = parentOrRoot.children.filter(
1481
+ (m) => m !== child.current.id
1482
+ );
1483
+ if (child.prev?.next === child) {
1484
+ const fallbackId = child.prev.children.at(-1);
1485
+ const fallback = fallbackId ? this.messages.get(fallbackId) : null;
1486
+ if (fallback === void 0) {
1487
+ throw new Error(
1488
+ "MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui."
1489
+ );
1490
+ }
1491
+ child.prev.next = fallback;
1492
+ }
1493
+ }
1494
+ if (operation !== "cut") {
1495
+ newParentOrRoot.children = [
1496
+ ...newParentOrRoot.children,
1497
+ child.current.id
1498
+ ];
1499
+ if (newParent && (findHead(child) === this.head || newParent.next === null)) {
1500
+ newParent.next = child;
1501
+ }
1502
+ child.prev = newParent;
1503
+ }
1504
+ }
1505
+ getMessages() {
1506
+ const messages = new Array(this.head?.level ?? 0);
1507
+ for (let current = this.head; current; current = current.prev) {
1508
+ messages[current.level] = current.current;
1509
+ }
1510
+ return messages;
1511
+ }
1512
+ addOrUpdateMessage(parentId, message) {
1513
+ const existingItem = this.messages.get(message.id);
1514
+ const prev = parentId ? this.messages.get(parentId) : null;
1515
+ if (prev === void 0)
1516
+ throw new Error(
1517
+ "MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui."
1518
+ );
1519
+ if (existingItem) {
1520
+ existingItem.current = message;
1521
+ this.performOp(prev, existingItem, "relink");
1522
+ return;
1523
+ }
1524
+ const newItem = {
1525
+ prev,
1526
+ current: message,
1527
+ next: null,
1528
+ children: [],
1529
+ level: prev ? prev.level + 1 : 0
1530
+ };
1531
+ this.messages.set(message.id, newItem);
1532
+ this.performOp(prev, newItem, "link");
1533
+ if (this.head === prev) {
1534
+ this.head = newItem;
1535
+ }
1536
+ }
1537
+ appendOptimisticMessage(parentId, message) {
1538
+ let optimisticId;
1539
+ do {
1540
+ optimisticId = generateOptimisticId();
1541
+ } while (this.messages.has(optimisticId));
1542
+ this.addOrUpdateMessage(parentId, {
1543
+ ...message,
1544
+ id: optimisticId,
1545
+ createdAt: /* @__PURE__ */ new Date(),
1546
+ ...message.role === "assistant" ? { status: "in_progress" } : void 0
1547
+ });
1548
+ return optimisticId;
1549
+ }
1550
+ deleteMessage(messageId, replacementId) {
1551
+ const message = this.messages.get(messageId);
1552
+ if (!message)
1553
+ throw new Error(
1554
+ "MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui."
1555
+ );
1556
+ const replacement = replacementId === void 0 ? message.prev : replacementId === null ? null : this.messages.get(replacementId);
1557
+ if (replacement === void 0)
1558
+ throw new Error(
1559
+ "MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui."
1560
+ );
1561
+ for (const child of message.children) {
1562
+ const childMessage = this.messages.get(child);
1563
+ if (!childMessage)
1564
+ throw new Error(
1565
+ "MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui."
1566
+ );
1567
+ this.performOp(replacement, childMessage, "relink");
1568
+ }
1569
+ this.performOp(null, message, "cut");
1570
+ this.messages.delete(messageId);
1571
+ if (this.head === message) {
1572
+ this.head = replacement ? findHead(replacement) : null;
1573
+ }
1574
+ }
1575
+ getBranches(messageId) {
1576
+ const message = this.messages.get(messageId);
1577
+ if (!message)
1578
+ throw new Error(
1579
+ "MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui."
1580
+ );
1581
+ const { children } = message.prev ?? this.root;
1582
+ return children;
1583
+ }
1584
+ switchToBranch(messageId) {
1585
+ const message = this.messages.get(messageId);
1586
+ if (!message)
1587
+ throw new Error(
1588
+ "MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui."
1589
+ );
1590
+ if (message.prev) {
1591
+ message.prev.next = message;
1592
+ }
1593
+ this.head = findHead(message);
1594
+ }
1595
+ resetHead(messageId) {
1596
+ if (messageId === null) {
1597
+ this.head = null;
1598
+ return;
1599
+ }
1600
+ const message = this.messages.get(messageId);
1601
+ if (!message)
1602
+ throw new Error(
1603
+ "MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui."
1604
+ );
1605
+ this.head = message;
1606
+ for (let current = message; current; current = current.prev) {
1607
+ if (current.prev) {
1608
+ current.prev.next = current;
1609
+ }
1610
+ }
1611
+ }
1612
+ };
1613
+
1614
1614
  // src/context/providers/AssistantRuntimeProvider.tsx
1615
- var import_react36 = require("react");
1615
+ var import_react38 = require("react");
1616
1616
 
1617
1617
  // src/context/providers/ThreadProvider.tsx
1618
- var import_react35 = require("react");
1618
+ var import_react37 = require("react");
1619
1619
 
1620
1620
  // src/context/stores/Composer.ts
1621
1621
  var import_zustand6 = require("zustand");
@@ -1690,11 +1690,11 @@ var ThreadProvider = ({
1690
1690
  children,
1691
1691
  runtime
1692
1692
  }) => {
1693
- const runtimeRef = (0, import_react35.useRef)(runtime);
1694
- (0, import_react35.useInsertionEffect)(() => {
1693
+ const runtimeRef = (0, import_react37.useRef)(runtime);
1694
+ (0, import_react37.useInsertionEffect)(() => {
1695
1695
  runtimeRef.current = runtime;
1696
1696
  });
1697
- const [{ context, onRuntimeUpdate }] = (0, import_react35.useState)(() => {
1697
+ const [{ context, onRuntimeUpdate }] = (0, import_react37.useState)(() => {
1698
1698
  const { useThread, onRuntimeUpdate: onRuntimeUpdate2 } = makeThreadStore(runtimeRef);
1699
1699
  const useViewport = makeThreadViewportStore();
1700
1700
  const useComposer = makeComposerStore(useThread);
@@ -1707,7 +1707,7 @@ var ThreadProvider = ({
1707
1707
  onRuntimeUpdate: onRuntimeUpdate2
1708
1708
  };
1709
1709
  });
1710
- (0, import_react35.useEffect)(() => {
1710
+ (0, import_react37.useEffect)(() => {
1711
1711
  onRuntimeUpdate();
1712
1712
  return runtime.subscribe(onRuntimeUpdate);
1713
1713
  }, [onRuntimeUpdate, runtime]);
@@ -1723,7 +1723,7 @@ var import_jsx_runtime22 = require("react/jsx-runtime");
1723
1723
  var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
1724
1724
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ThreadProvider, { runtime, children });
1725
1725
  };
1726
- var AssistantRuntimeProvider = (0, import_react36.memo)(AssistantRuntimeProviderImpl);
1726
+ var AssistantRuntimeProvider = (0, import_react38.memo)(AssistantRuntimeProviderImpl);
1727
1727
 
1728
1728
  // src/runtime/vercel-deprecated/VercelAIAssistantProvider.tsx
1729
1729
  var import_jsx_runtime23 = require("react/jsx-runtime");
@@ -1762,7 +1762,7 @@ var VercelRSCAssistantProvider = ({
1762
1762
  };
1763
1763
 
1764
1764
  // src/runtime/local/useLocalRuntime.tsx
1765
- var import_react37 = require("react");
1765
+ var import_react39 = require("react");
1766
1766
 
1767
1767
  // src/runtime/local/LocalRuntime.tsx
1768
1768
  var LocalRuntime = class {
@@ -1812,15 +1812,17 @@ var LocalRuntime = class {
1812
1812
  this.abortController = new AbortController();
1813
1813
  this.notifySubscribers();
1814
1814
  try {
1815
- await this.adapter.run({
1815
+ const updateHandler = ({ content }) => {
1816
+ message.content = content;
1817
+ this.repository.addOrUpdateMessage(parentId, { ...message });
1818
+ this.notifySubscribers();
1819
+ };
1820
+ const result = await this.adapter.run({
1816
1821
  messages,
1817
1822
  abortSignal: this.abortController.signal,
1818
- onUpdate: ({ content }) => {
1819
- message.content = content;
1820
- this.repository.addOrUpdateMessage(parentId, { ...message });
1821
- this.notifySubscribers();
1822
- }
1823
+ onUpdate: updateHandler
1823
1824
  });
1825
+ updateHandler(result);
1824
1826
  message.status = "done";
1825
1827
  this.repository.addOrUpdateMessage(parentId, { ...message });
1826
1828
  } catch (e) {
@@ -1849,54 +1851,12 @@ var LocalRuntime = class {
1849
1851
 
1850
1852
  // src/runtime/local/useLocalRuntime.tsx
1851
1853
  var useLocalRuntime = (adapter) => {
1852
- const [runtime] = (0, import_react37.useState)(() => new LocalRuntime(adapter));
1853
- (0, import_react37.useInsertionEffect)(() => {
1854
+ const [runtime] = (0, import_react39.useState)(() => new LocalRuntime(adapter));
1855
+ (0, import_react39.useInsertionEffect)(() => {
1854
1856
  runtime.adapter = adapter;
1855
1857
  });
1856
1858
  return runtime;
1857
1859
  };
1858
-
1859
- // src/runtime/local/vercel/VercelModelAdapter.tsx
1860
- var import_ai = require("ai");
1861
- var VercelModelAdapter = class {
1862
- constructor(model) {
1863
- this.model = model;
1864
- }
1865
- async run({ messages, abortSignal, onUpdate }) {
1866
- const { fullStream } = await (0, import_ai.streamText)({
1867
- model: this.model,
1868
- abortSignal,
1869
- messages: messages.map((m) => ({
1870
- role: m.role,
1871
- content: m.content.filter((c) => c.type !== "ui")
1872
- }))
1873
- });
1874
- const content = [];
1875
- for await (const aiPart of fullStream) {
1876
- switch (aiPart.type) {
1877
- case "text-delta": {
1878
- let part = content.at(-1);
1879
- if (!part || part.type !== "text") {
1880
- part = { type: "text", text: "" };
1881
- content.push(part);
1882
- }
1883
- part.text += aiPart.textDelta;
1884
- break;
1885
- }
1886
- case "tool-call": {
1887
- content.push({
1888
- type: "tool-call",
1889
- name: aiPart.toolName,
1890
- args: aiPart.args
1891
- });
1892
- break;
1893
- }
1894
- }
1895
- onUpdate({ content });
1896
- }
1897
- return { content };
1898
- }
1899
- };
1900
1860
  // Annotate the CommonJS export names for ESM import in node:
1901
1861
  0 && (module.exports = {
1902
1862
  ActionBarPrimitive,
@@ -1910,7 +1870,7 @@ var VercelModelAdapter = class {
1910
1870
  VercelRSCAssistantProvider,
1911
1871
  getVercelAIMessage,
1912
1872
  getVercelRSCMessage,
1913
- unstable_VercelModelAdapter,
1873
+ unstable_MessageRepository,
1914
1874
  unstable_useComposerContext,
1915
1875
  unstable_useContentPartContext,
1916
1876
  unstable_useLocalRuntime,