@assistant-ui/react 0.5.39 → 0.5.41

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.js CHANGED
@@ -204,7 +204,8 @@ var makeThreadActionStore = (runtimeStore) => {
204
204
  startRun: (parentId) => runtimeStore.getState().startRun(parentId),
205
205
  append: (message) => runtimeStore.getState().append(message),
206
206
  cancelRun: () => runtimeStore.getState().cancelRun(),
207
- addToolResult: (options) => runtimeStore.getState().addToolResult(options)
207
+ addToolResult: (options) => runtimeStore.getState().addToolResult(options),
208
+ speak: (messageId) => runtimeStore.getState().speak(messageId)
208
209
  })
209
210
  );
210
211
  };
@@ -1056,31 +1057,78 @@ var EdgeChatAdapter = class {
1056
1057
  // src/runtimes/edge/useEdgeRuntime.ts
1057
1058
  var useEdgeRuntime = ({
1058
1059
  initialMessages,
1060
+ maxToolRoundtrips,
1061
+ adapters,
1059
1062
  ...options
1060
1063
  }) => {
1061
1064
  const [adapter] = _react.useState.call(void 0, () => new EdgeChatAdapter(options));
1062
- return useLocalRuntime(adapter, { initialMessages });
1065
+ return useLocalRuntime(adapter, {
1066
+ initialMessages,
1067
+ maxToolRoundtrips,
1068
+ adapters
1069
+ });
1063
1070
  };
1064
1071
 
1065
1072
  // src/runtimes/local/shouldContinue.tsx
1066
1073
  var shouldContinue = (result) => _optionalChain([result, 'access', _33 => _33.status, 'optionalAccess', _34 => _34.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
1067
1074
 
1075
+ // src/utils/getThreadMessageText.tsx
1076
+ var getThreadMessageText = (message) => {
1077
+ const textParts = message.content.filter(
1078
+ (part) => part.type === "text"
1079
+ );
1080
+ return textParts.map((part) => part.text).join("\n\n");
1081
+ };
1082
+
1083
+ // src/runtimes/speech/WebSpeechSynthesisAdapter.ts
1084
+ var WebSpeechSynthesisAdapter = class {
1085
+ speak(message) {
1086
+ const text = getThreadMessageText(message);
1087
+ const utterance = new SpeechSynthesisUtterance(text);
1088
+ let ended = false;
1089
+ const endHandlers = /* @__PURE__ */ new Set();
1090
+ const handleEnd = () => {
1091
+ if (ended) return;
1092
+ ended = true;
1093
+ endHandlers.forEach((handler) => handler());
1094
+ };
1095
+ utterance.addEventListener("end", handleEnd);
1096
+ utterance.addEventListener("error", handleEnd);
1097
+ window.speechSynthesis.speak(utterance);
1098
+ return {
1099
+ stop: () => {
1100
+ window.speechSynthesis.cancel();
1101
+ handleEnd();
1102
+ },
1103
+ onEnd: (callback) => {
1104
+ if (ended) {
1105
+ let cancelled = false;
1106
+ queueMicrotask(() => {
1107
+ if (!cancelled) callback();
1108
+ });
1109
+ return () => {
1110
+ cancelled = true;
1111
+ };
1112
+ } else {
1113
+ endHandlers.add(callback);
1114
+ return () => {
1115
+ endHandlers.delete(callback);
1116
+ };
1117
+ }
1118
+ }
1119
+ };
1120
+ }
1121
+ };
1122
+
1068
1123
  // src/runtimes/local/LocalThreadRuntime.tsx
1069
- var CAPABILITIES = Object.freeze({
1070
- switchToBranch: true,
1071
- edit: true,
1072
- reload: true,
1073
- cancel: true,
1074
- copy: true
1075
- });
1076
1124
  var LocalThreadRuntime = (_class5 = class {
1077
- constructor(configProvider, adapter, options) {;_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this);_class5.prototype.__init15.call(this);_class5.prototype.__init16.call(this);
1125
+ constructor(configProvider, adapter, { initialMessages, ...options }) {;_class5.prototype.__init11.call(this);_class5.prototype.__init12.call(this);_class5.prototype.__init13.call(this);_class5.prototype.__init14.call(this);_class5.prototype.__init15.call(this);_class5.prototype.__init16.call(this);
1078
1126
  this.configProvider = configProvider;
1079
1127
  this.adapter = adapter;
1080
1128
  this.options = options;
1081
- if (options.initialMessages) {
1129
+ if (initialMessages) {
1082
1130
  let parentId = null;
1083
- const messages = fromCoreMessages(options.initialMessages);
1131
+ const messages = fromCoreMessages(initialMessages);
1084
1132
  for (const message of messages) {
1085
1133
  this.repository.addOrUpdateMessage(parentId, message);
1086
1134
  parentId = message.id;
@@ -1090,7 +1138,14 @@ var LocalThreadRuntime = (_class5 = class {
1090
1138
  __init11() {this._subscriptions = /* @__PURE__ */ new Set()}
1091
1139
  __init12() {this.abortController = null}
1092
1140
  __init13() {this.repository = new MessageRepository()}
1093
- __init14() {this.capabilities = CAPABILITIES}
1141
+ __init14() {this.capabilities = {
1142
+ switchToBranch: true,
1143
+ edit: true,
1144
+ reload: true,
1145
+ cancel: true,
1146
+ unstable_copy: true,
1147
+ speak: false
1148
+ }}
1094
1149
  __init15() {this.isDisabled = false}
1095
1150
  get messages() {
1096
1151
  return this.repository.getMessages();
@@ -1102,6 +1157,15 @@ var LocalThreadRuntime = (_class5 = class {
1102
1157
  this.notifySubscribers();
1103
1158
  }
1104
1159
  }}
1160
+
1161
+ set options({ initialMessages, ...options }) {
1162
+ this._options = options;
1163
+ const canSpeak = _optionalChain([options, 'access', _35 => _35.adapters, 'optionalAccess', _36 => _36.speech]) !== void 0;
1164
+ if (this.capabilities.speak !== canSpeak) {
1165
+ this.capabilities.speak = canSpeak;
1166
+ this.notifySubscribers();
1167
+ }
1168
+ }
1105
1169
  getBranches(messageId) {
1106
1170
  return this.repository.getBranches(messageId);
1107
1171
  }
@@ -1140,18 +1204,18 @@ var LocalThreadRuntime = (_class5 = class {
1140
1204
  }
1141
1205
  async performRoundtrip(parentId, message) {
1142
1206
  const messages = this.repository.getMessages();
1143
- _optionalChain([this, 'access', _35 => _35.abortController, 'optionalAccess', _36 => _36.abort, 'call', _37 => _37()]);
1207
+ _optionalChain([this, 'access', _37 => _37.abortController, 'optionalAccess', _38 => _38.abort, 'call', _39 => _39()]);
1144
1208
  this.abortController = new AbortController();
1145
1209
  const initialContent = message.content;
1146
- const initialRoundtrips = _optionalChain([message, 'access', _38 => _38.metadata, 'optionalAccess', _39 => _39.roundtrips]);
1147
- const initalCustom = _optionalChain([message, 'access', _40 => _40.metadata, 'optionalAccess', _41 => _41.custom]);
1210
+ const initialRoundtrips = _optionalChain([message, 'access', _40 => _40.metadata, 'optionalAccess', _41 => _41.roundtrips]);
1211
+ const initalCustom = _optionalChain([message, 'access', _42 => _42.metadata, 'optionalAccess', _43 => _43.custom]);
1148
1212
  const updateMessage = (m) => {
1149
1213
  message = {
1150
1214
  ...message,
1151
1215
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
1152
1216
  status: _nullishCoalesce(m.status, () => ( message.status)),
1153
1217
  // TODO deprecated, remove in v0.6
1154
- ..._optionalChain([m, 'access', _42 => _42.metadata, 'optionalAccess', _43 => _43.roundtrips]) ? {
1218
+ ..._optionalChain([m, 'access', _44 => _44.metadata, 'optionalAccess', _45 => _45.roundtrips]) ? {
1155
1219
  roundtrips: [
1156
1220
  ..._nullishCoalesce(initialRoundtrips, () => ( [])),
1157
1221
  ...m.metadata.roundtrips
@@ -1166,7 +1230,7 @@ var LocalThreadRuntime = (_class5 = class {
1166
1230
  ...m.metadata.roundtrips
1167
1231
  ]
1168
1232
  } : void 0,
1169
- ..._optionalChain([m, 'access', _44 => _44.metadata, 'optionalAccess', _45 => _45.custom]) ? {
1233
+ ..._optionalChain([m, 'access', _46 => _46.metadata, 'optionalAccess', _47 => _47.custom]) ? {
1170
1234
  custom: { ..._nullishCoalesce(initalCustom, () => ( {})), ...m.metadata.custom }
1171
1235
  } : void 0
1172
1236
  }
@@ -1175,8 +1239,8 @@ var LocalThreadRuntime = (_class5 = class {
1175
1239
  this.repository.addOrUpdateMessage(parentId, message);
1176
1240
  this.notifySubscribers();
1177
1241
  };
1178
- const maxToolRoundtrips = _nullishCoalesce(this.options.maxToolRoundtrips, () => ( 1));
1179
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _46 => _46.metadata, 'optionalAccess', _47 => _47.roundtrips, 'optionalAccess', _48 => _48.length]), () => ( 0));
1242
+ const maxToolRoundtrips = _nullishCoalesce(this._options.maxToolRoundtrips, () => ( 1));
1243
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _48 => _48.metadata, 'optionalAccess', _49 => _49.roundtrips, 'optionalAccess', _50 => _50.length]), () => ( 0));
1180
1244
  if (toolRoundtrips > maxToolRoundtrips) {
1181
1245
  updateMessage({
1182
1246
  status: {
@@ -1239,7 +1303,11 @@ var LocalThreadRuntime = (_class5 = class {
1239
1303
  this._subscriptions.add(callback);
1240
1304
  return () => this._subscriptions.delete(callback);
1241
1305
  }
1242
- addToolResult({ messageId, toolCallId, result }) {
1306
+ addToolResult({
1307
+ messageId,
1308
+ toolCallId,
1309
+ result
1310
+ }) {
1243
1311
  let { parentId, message } = this.repository.getMessage(messageId);
1244
1312
  if (message.role !== "assistant")
1245
1313
  throw new Error("Tried to add tool result to non-assistant message");
@@ -1266,6 +1334,11 @@ var LocalThreadRuntime = (_class5 = class {
1266
1334
  this.performRoundtrip(parentId, message);
1267
1335
  }
1268
1336
  }
1337
+ speak(messageId) {
1338
+ const { message } = this.repository.getMessage(messageId);
1339
+ const adapter = new WebSpeechSynthesisAdapter();
1340
+ return adapter.speak(message);
1341
+ }
1269
1342
  export() {
1270
1343
  return this.repository.export();
1271
1344
  }
@@ -1311,7 +1384,7 @@ var LocalRuntime = class extends BaseAssistantRuntime {
1311
1384
  const messages = fromCoreMessages(initialMessages);
1312
1385
  this.thread.import({
1313
1386
  messages: messages.map((m, idx) => ({
1314
- parentId: _nullishCoalesce(_optionalChain([messages, 'access', _49 => _49[idx - 1], 'optionalAccess', _50 => _50.id]), () => ( null)),
1387
+ parentId: _nullishCoalesce(_optionalChain([messages, 'access', _51 => _51[idx - 1], 'optionalAccess', _52 => _52.id]), () => ( null)),
1315
1388
  message: m
1316
1389
  }))
1317
1390
  });
@@ -1424,17 +1497,9 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
1424
1497
  }
1425
1498
  };
1426
1499
 
1427
- // src/utils/getThreadMessageText.tsx
1428
- var getThreadMessageText = (message) => {
1429
- const textParts = message.content.filter(
1430
- (part) => part.type === "text"
1431
- );
1432
- return textParts.map((part) => part.text).join("\n\n");
1433
- };
1434
-
1435
1500
  // src/runtimes/external-store/ExternalStoreThreadRuntime.tsx
1436
1501
  var hasUpcomingMessage = (isRunning, messages) => {
1437
- return isRunning && _optionalChain([messages, 'access', _51 => _51[messages.length - 1], 'optionalAccess', _52 => _52.role]) !== "assistant";
1502
+ return isRunning && _optionalChain([messages, 'access', _53 => _53[messages.length - 1], 'optionalAccess', _54 => _54.role]) !== "assistant";
1438
1503
  };
1439
1504
  var ExternalStoreThreadRuntime = (_class7 = class {
1440
1505
  __init18() {this._subscriptions = /* @__PURE__ */ new Set()}
@@ -1445,7 +1510,8 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1445
1510
  edit: false,
1446
1511
  reload: false,
1447
1512
  cancel: false,
1448
- copy: false
1513
+ unstable_copy: false,
1514
+ speak: false
1449
1515
  }}
1450
1516
  get capabilities() {
1451
1517
  return this._capabilities;
@@ -1475,7 +1541,8 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1475
1541
  edit: this._store.onEdit !== void 0,
1476
1542
  reload: this._store.onReload !== void 0,
1477
1543
  cancel: this._store.onCancel !== void 0,
1478
- copy: this._store.onCopy !== null
1544
+ unstable_copy: _optionalChain([this, 'access', _58 => _58._store, 'access', _59 => _59.unstable_capabilities, 'optionalAccess', _60 => _60.copy]) !== null,
1545
+ speak: this._store.onSpeak !== void 0
1479
1546
  };
1480
1547
  if (oldStore) {
1481
1548
  if (oldStore.convertMessage !== store.convertMessage) {
@@ -1502,7 +1569,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1502
1569
  for (let i = 0; i < messages.length; i++) {
1503
1570
  const message = messages[i];
1504
1571
  const parent = messages[i - 1];
1505
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _56 => _56.id]), () => ( null)), message);
1572
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _61 => _61.id]), () => ( null)), message);
1506
1573
  }
1507
1574
  if (this.assistantOptimisticId) {
1508
1575
  this.repository.deleteMessage(this.assistantOptimisticId);
@@ -1510,7 +1577,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1510
1577
  }
1511
1578
  if (hasUpcomingMessage(isRunning, messages)) {
1512
1579
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
1513
- _nullishCoalesce(_optionalChain([messages, 'access', _57 => _57.at, 'call', _58 => _58(-1), 'optionalAccess', _59 => _59.id]), () => ( null)),
1580
+ _nullishCoalesce(_optionalChain([messages, 'access', _62 => _62.at, 'call', _63 => _63(-1), 'optionalAccess', _64 => _64.id]), () => ( null)),
1514
1581
  {
1515
1582
  role: "assistant",
1516
1583
  content: []
@@ -1518,7 +1585,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1518
1585
  );
1519
1586
  }
1520
1587
  this.repository.resetHead(
1521
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _60 => _60.at, 'call', _61 => _61(-1), 'optionalAccess', _62 => _62.id]))), () => ( null))
1588
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _65 => _65.at, 'call', _66 => _66(-1), 'optionalAccess', _67 => _67.id]))), () => ( null))
1522
1589
  );
1523
1590
  this.messages = this.repository.getMessages();
1524
1591
  this.notifySubscribers();
@@ -1536,7 +1603,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1536
1603
  this.updateMessages(this.repository.getMessages());
1537
1604
  }
1538
1605
  async append(message) {
1539
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _63 => _63.messages, 'access', _64 => _64.at, 'call', _65 => _65(-1), 'optionalAccess', _66 => _66.id]), () => ( null)))) {
1606
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _68 => _68.messages, 'access', _69 => _69.at, 'call', _70 => _70(-1), 'optionalAccess', _71 => _71.id]), () => ( null)))) {
1540
1607
  if (!this._store.onEdit)
1541
1608
  throw new Error("Runtime does not support editing messages.");
1542
1609
  await this._store.onEdit(message);
@@ -1559,7 +1626,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1559
1626
  }
1560
1627
  let messages = this.repository.getMessages();
1561
1628
  const previousMessage = messages[messages.length - 1];
1562
- if (_optionalChain([previousMessage, 'optionalAccess', _67 => _67.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _68 => _68.at, 'call', _69 => _69(-1), 'optionalAccess', _70 => _70.id])) {
1629
+ if (_optionalChain([previousMessage, 'optionalAccess', _72 => _72.role]) === "user" && previousMessage.id === _optionalChain([messages, 'access', _73 => _73.at, 'call', _74 => _74(-1), 'optionalAccess', _75 => _75.id])) {
1563
1630
  this.repository.deleteMessage(previousMessage.id);
1564
1631
  if (!this.composer.text.trim()) {
1565
1632
  this.composer.setText(getThreadMessageText(previousMessage));
@@ -1572,20 +1639,26 @@ var ExternalStoreThreadRuntime = (_class7 = class {
1572
1639
  this.updateMessages(messages);
1573
1640
  }, 0);
1574
1641
  }
1642
+ addToolResult(options) {
1643
+ if (!this._store.onAddToolResult)
1644
+ throw new Error("Runtime does not support tool results.");
1645
+ this._store.onAddToolResult(options);
1646
+ }
1647
+ speak(messageId) {
1648
+ if (!this._store.onSpeak)
1649
+ throw new Error("Runtime does not support speaking.");
1650
+ const { message } = this.repository.getMessage(messageId);
1651
+ return this._store.onSpeak(message);
1652
+ }
1575
1653
  subscribe(callback) {
1576
1654
  this._subscriptions.add(callback);
1577
1655
  return () => this._subscriptions.delete(callback);
1578
1656
  }
1579
1657
  __init26() {this.updateMessages = (messages) => {
1580
- _optionalChain([this, 'access', _71 => _71._store, 'access', _72 => _72.setMessages, 'optionalCall', _73 => _73(
1658
+ _optionalChain([this, 'access', _76 => _76._store, 'access', _77 => _77.setMessages, 'optionalCall', _78 => _78(
1581
1659
  messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
1582
1660
  )]);
1583
1661
  }}
1584
- addToolResult(options) {
1585
- if (!this._store.onAddToolResult)
1586
- throw new Error("Runtime does not support tool results.");
1587
- this._store.onAddToolResult(options);
1588
- }
1589
1662
  }, _class7);
1590
1663
 
1591
1664
  // src/runtimes/external-store/ExternalStoreRuntime.tsx
@@ -1793,7 +1866,7 @@ var AssistantRuntimeProvider = _react.memo.call(void 0, AssistantRuntimeProvider
1793
1866
  var MessageContext = _react.createContext.call(void 0, null);
1794
1867
  function useMessageContext(options) {
1795
1868
  const context = _react.useContext.call(void 0, MessageContext);
1796
- if (!_optionalChain([options, 'optionalAccess', _74 => _74.optional]) && !context)
1869
+ if (!_optionalChain([options, 'optionalAccess', _79 => _79.optional]) && !context)
1797
1870
  throw new Error(
1798
1871
  "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
1799
1872
  );
@@ -1820,7 +1893,7 @@ var ContentPartContext = _react.createContext.call(void 0,
1820
1893
  );
1821
1894
  function useContentPartContext(options) {
1822
1895
  const context = _react.useContext.call(void 0, ContentPartContext);
1823
- if (!_optionalChain([options, 'optionalAccess', _75 => _75.optional]) && !context)
1896
+ if (!_optionalChain([options, 'optionalAccess', _80 => _80.optional]) && !context)
1824
1897
  throw new Error(
1825
1898
  "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
1826
1899
  );
@@ -1832,13 +1905,13 @@ function useContentPartContext(options) {
1832
1905
  var toAppendMessage = (useThreadMessages, message) => {
1833
1906
  if (typeof message === "string") {
1834
1907
  return {
1835
- parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _76 => _76.getState, 'call', _77 => _77(), 'access', _78 => _78.at, 'call', _79 => _79(-1), 'optionalAccess', _80 => _80.id]), () => ( null)),
1908
+ parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _81 => _81.getState, 'call', _82 => _82(), 'access', _83 => _83.at, 'call', _84 => _84(-1), 'optionalAccess', _85 => _85.id]), () => ( null)),
1836
1909
  role: "user",
1837
1910
  content: [{ type: "text", text: message }]
1838
1911
  };
1839
1912
  }
1840
1913
  return {
1841
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _81 => _81.getState, 'call', _82 => _82(), 'access', _83 => _83.at, 'call', _84 => _84(-1), 'optionalAccess', _85 => _85.id]))), () => ( null)),
1914
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _86 => _86.getState, 'call', _87 => _87(), 'access', _88 => _88.at, 'call', _89 => _89(-1), 'optionalAccess', _90 => _90.id]))), () => ( null)),
1842
1915
  role: _nullishCoalesce(message.role, () => ( "user")),
1843
1916
  content: message.content
1844
1917
  };
@@ -1890,7 +1963,7 @@ var useAssistantTool = (tool) => {
1890
1963
  const unsub2 = render ? setToolUI(toolName, render) : void 0;
1891
1964
  return () => {
1892
1965
  unsub1();
1893
- _optionalChain([unsub2, 'optionalCall', _86 => _86()]);
1966
+ _optionalChain([unsub2, 'optionalCall', _91 => _91()]);
1894
1967
  };
1895
1968
  }, [registerModelConfigProvider, setToolUI, tool]);
1896
1969
  };
@@ -1976,8 +2049,8 @@ var useActionBarCopy = ({
1976
2049
  const { useMessage, useMessageUtils, useEditComposer } = useMessageContext();
1977
2050
  const hasCopyableContent = useCombinedStore(
1978
2051
  [useMessage, useEditComposer],
1979
- (m, c) => {
1980
- return !c.isEditing && m.message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
2052
+ ({ message }, c) => {
2053
+ return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
1981
2054
  }
1982
2055
  );
1983
2056
  const callback = _react.useCallback.call(void 0, () => {
@@ -2029,6 +2102,38 @@ var useActionBarReload = () => {
2029
2102
  return callback;
2030
2103
  };
2031
2104
 
2105
+ // src/primitive-hooks/actionBar/useActionBarSpeak.tsx
2106
+
2107
+ var useActionBarSpeak = () => {
2108
+ const { useThreadActions } = useThreadContext();
2109
+ const { useMessage, useEditComposer, useMessageUtils } = useMessageContext();
2110
+ const hasSpeakableContent = useCombinedStore(
2111
+ [useMessage, useEditComposer],
2112
+ ({ message }, c) => {
2113
+ return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
2114
+ }
2115
+ );
2116
+ const callback = _react.useCallback.call(void 0, async () => {
2117
+ const { message } = useMessage.getState();
2118
+ const utt = useThreadActions.getState().speak(message.id);
2119
+ useMessageUtils.getState().addUtterance(utt);
2120
+ }, [useThreadActions, useMessage, useMessageUtils]);
2121
+ if (!hasSpeakableContent) return null;
2122
+ return callback;
2123
+ };
2124
+
2125
+ // src/primitive-hooks/actionBar/useActionBarStopSpeaking.tsx
2126
+
2127
+ var useActionBarStopSpeaking = () => {
2128
+ const { useMessageUtils } = useMessageContext();
2129
+ const isSpeaking = useMessageUtils((u) => u.isSpeaking);
2130
+ const callback = _react.useCallback.call(void 0, async () => {
2131
+ useMessageUtils.getState().stopSpeaking();
2132
+ }, [useMessageUtils]);
2133
+ if (!isSpeaking) return null;
2134
+ return callback;
2135
+ };
2136
+
2032
2137
  // src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
2033
2138
  var useBranchPickerCount = () => {
2034
2139
  const { useMessage } = useMessageContext();
@@ -2168,7 +2273,7 @@ var useMessageIf = (props) => {
2168
2273
  const { useMessage, useMessageUtils } = useMessageContext();
2169
2274
  return useCombinedStore(
2170
2275
  [useMessage, useMessageUtils],
2171
- ({ message, branches, isLast }, { isCopied, isHovering }) => {
2276
+ ({ message, branches, isLast }, { isCopied, isHovering, isSpeaking }) => {
2172
2277
  if (props.hasBranches === true && branches.length < 2) return false;
2173
2278
  if (props.user && message.role !== "user") return false;
2174
2279
  if (props.assistant && message.role !== "assistant") return false;
@@ -2176,6 +2281,8 @@ var useMessageIf = (props) => {
2176
2281
  if (props.lastOrHover === true && !isHovering && !isLast) return false;
2177
2282
  if (props.copied === true && !isCopied) return false;
2178
2283
  if (props.copied === false && isCopied) return false;
2284
+ if (props.speaking === true && !isSpeaking) return false;
2285
+ if (props.speaking === false && isSpeaking) return false;
2179
2286
  return true;
2180
2287
  }
2181
2288
  );
@@ -2245,7 +2352,9 @@ _chunkDCHYNTHIjs.__export.call(void 0, actionBar_exports, {
2245
2352
  Copy: () => ActionBarPrimitiveCopy,
2246
2353
  Edit: () => ActionBarPrimitiveEdit,
2247
2354
  Reload: () => ActionBarPrimitiveReload,
2248
- Root: () => ActionBarPrimitiveRoot
2355
+ Root: () => ActionBarPrimitiveRoot,
2356
+ Speak: () => ActionBarPrimitiveSpeak,
2357
+ StopSpeaking: () => ActionBarPrimitiveStopSpeaking
2249
2358
  });
2250
2359
 
2251
2360
  // src/primitives/actionBar/ActionBarRoot.tsx
@@ -2319,7 +2428,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
2319
2428
  ...primitiveProps,
2320
2429
  ref: forwardedRef,
2321
2430
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
2322
- _optionalChain([callback, 'optionalCall', _87 => _87()]);
2431
+ _optionalChain([callback, 'optionalCall', _92 => _92()]);
2323
2432
  })
2324
2433
  }
2325
2434
  );
@@ -2347,6 +2456,40 @@ var ActionBarPrimitiveEdit = createActionButton(
2347
2456
  useActionBarEdit
2348
2457
  );
2349
2458
 
2459
+ // src/primitives/actionBar/ActionBarSpeak.tsx
2460
+ var ActionBarPrimitiveSpeak = createActionButton(
2461
+ "ActionBarPrimitive.Speak",
2462
+ useActionBarSpeak
2463
+ );
2464
+
2465
+ // src/primitives/actionBar/ActionBarStopSpeaking.tsx
2466
+
2467
+ var _reactuseescapekeydown = require('@radix-ui/react-use-escape-keydown');
2468
+
2469
+
2470
+
2471
+ var ActionBarPrimitiveStopSpeaking = _react.forwardRef.call(void 0, (props, ref) => {
2472
+ const callback = useActionBarStopSpeaking();
2473
+ _reactuseescapekeydown.useEscapeKeydown.call(void 0, (e) => {
2474
+ if (callback) {
2475
+ e.preventDefault();
2476
+ callback();
2477
+ }
2478
+ });
2479
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2480
+ _reactprimitive.Primitive.button,
2481
+ {
2482
+ type: "button",
2483
+ disabled: !callback,
2484
+ ...props,
2485
+ ref,
2486
+ onClick: _primitive.composeEventHandlers.call(void 0, props.onClick, () => {
2487
+ _optionalChain([callback, 'optionalCall', _93 => _93()]);
2488
+ })
2489
+ }
2490
+ );
2491
+ });
2492
+
2350
2493
  // src/primitives/assistantModal/index.ts
2351
2494
  var assistantModal_exports = {};
2352
2495
  _chunkDCHYNTHIjs.__export.call(void 0, assistantModal_exports, {
@@ -2574,9 +2717,9 @@ var useIsHoveringRef = () => {
2574
2717
  );
2575
2718
  return useManagedRef(callbackRef);
2576
2719
  };
2577
- var MessagePrimitiveRoot = _react.forwardRef.call(void 0, ({ onMouseEnter, onMouseLeave, ...rest }, forwardRef29) => {
2720
+ var MessagePrimitiveRoot = _react.forwardRef.call(void 0, ({ onMouseEnter, onMouseLeave, ...rest }, forwardRef30) => {
2578
2721
  const isHoveringRef = useIsHoveringRef();
2579
- const ref = _reactcomposerefs.useComposedRefs.call(void 0, forwardRef29, isHoveringRef);
2722
+ const ref = _reactcomposerefs.useComposedRefs.call(void 0, forwardRef30, isHoveringRef);
2580
2723
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _reactprimitive.Primitive.div, { ...rest, ref });
2581
2724
  });
2582
2725
  MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
@@ -2627,7 +2770,7 @@ var getContentPartState = ({ message }, useContentPart, partIndex) => {
2627
2770
  }
2628
2771
  }
2629
2772
  const status = toContentPartStatus(message, partIndex, part);
2630
- const currentState = _optionalChain([useContentPart, 'optionalAccess', _88 => _88.getState, 'call', _89 => _89()]);
2773
+ const currentState = _optionalChain([useContentPart, 'optionalAccess', _94 => _94.getState, 'call', _95 => _95()]);
2631
2774
  if (currentState && currentState.part === part && currentState.status === status)
2632
2775
  return null;
2633
2776
  return Object.freeze({ part, status });
@@ -2775,7 +2918,7 @@ var MessageContentPartImpl = ({
2775
2918
  };
2776
2919
  var MessageContentPart = _react.memo.call(void 0,
2777
2920
  MessageContentPartImpl,
2778
- (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _90 => _90.components, 'optionalAccess', _91 => _91.Text]) === _optionalChain([next, 'access', _92 => _92.components, 'optionalAccess', _93 => _93.Text]) && _optionalChain([prev, 'access', _94 => _94.components, 'optionalAccess', _95 => _95.Image]) === _optionalChain([next, 'access', _96 => _96.components, 'optionalAccess', _97 => _97.Image]) && _optionalChain([prev, 'access', _98 => _98.components, 'optionalAccess', _99 => _99.UI]) === _optionalChain([next, 'access', _100 => _100.components, 'optionalAccess', _101 => _101.UI]) && _optionalChain([prev, 'access', _102 => _102.components, 'optionalAccess', _103 => _103.tools]) === _optionalChain([next, 'access', _104 => _104.components, 'optionalAccess', _105 => _105.tools])
2921
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _96 => _96.components, 'optionalAccess', _97 => _97.Text]) === _optionalChain([next, 'access', _98 => _98.components, 'optionalAccess', _99 => _99.Text]) && _optionalChain([prev, 'access', _100 => _100.components, 'optionalAccess', _101 => _101.Image]) === _optionalChain([next, 'access', _102 => _102.components, 'optionalAccess', _103 => _103.Image]) && _optionalChain([prev, 'access', _104 => _104.components, 'optionalAccess', _105 => _105.UI]) === _optionalChain([next, 'access', _106 => _106.components, 'optionalAccess', _107 => _107.UI]) && _optionalChain([prev, 'access', _108 => _108.components, 'optionalAccess', _109 => _109.tools]) === _optionalChain([next, 'access', _110 => _110.components, 'optionalAccess', _111 => _111.tools])
2779
2922
  );
2780
2923
  var MessagePrimitiveContent = ({
2781
2924
  components
@@ -2855,7 +2998,7 @@ var _reactslot = require('@radix-ui/react-slot');
2855
2998
 
2856
2999
 
2857
3000
  var _reacttextareaautosize = require('react-textarea-autosize'); var _reacttextareaautosize2 = _interopRequireDefault(_reacttextareaautosize);
2858
- var _reactuseescapekeydown = require('@radix-ui/react-use-escape-keydown');
3001
+
2859
3002
 
2860
3003
  var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
2861
3004
  ({
@@ -2890,7 +3033,7 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
2890
3033
  const { isRunning } = useThread.getState();
2891
3034
  if (!isRunning) {
2892
3035
  e.preventDefault();
2893
- _optionalChain([textareaRef, 'access', _106 => _106.current, 'optionalAccess', _107 => _107.closest, 'call', _108 => _108("form"), 'optionalAccess', _109 => _109.requestSubmit, 'call', _110 => _110()]);
3036
+ _optionalChain([textareaRef, 'access', _112 => _112.current, 'optionalAccess', _113 => _113.closest, 'call', _114 => _114("form"), 'optionalAccess', _115 => _115.requestSubmit, 'call', _116 => _116()]);
2894
3037
  }
2895
3038
  }
2896
3039
  };
@@ -3179,29 +3322,43 @@ var makeEditComposerStore = ({
3179
3322
 
3180
3323
  // src/context/stores/MessageUtils.ts
3181
3324
 
3182
- var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => ({
3183
- isCopied: false,
3184
- setIsCopied: (value) => {
3185
- set({ isCopied: value });
3186
- },
3187
- isHovering: false,
3188
- setIsHovering: (value) => {
3189
- set({ isHovering: value });
3190
- }
3191
- }));
3325
+ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => {
3326
+ let utterance = null;
3327
+ return {
3328
+ isCopied: false,
3329
+ setIsCopied: (value) => {
3330
+ set({ isCopied: value });
3331
+ },
3332
+ isHovering: false,
3333
+ setIsHovering: (value) => {
3334
+ set({ isHovering: value });
3335
+ },
3336
+ isSpeaking: false,
3337
+ stopSpeaking: () => {
3338
+ _optionalChain([utterance, 'optionalAccess', _117 => _117.stop, 'call', _118 => _118()]);
3339
+ },
3340
+ addUtterance: (utt) => {
3341
+ utterance = utt;
3342
+ set({ isSpeaking: true });
3343
+ utt.onEnd(() => {
3344
+ set({ isSpeaking: false });
3345
+ });
3346
+ }
3347
+ };
3348
+ });
3192
3349
 
3193
3350
  // src/context/providers/MessageProvider.tsx
3194
3351
 
3195
3352
  var getIsLast = (messages, message) => {
3196
- return _optionalChain([messages, 'access', _111 => _111[messages.length - 1], 'optionalAccess', _112 => _112.id]) === message.id;
3353
+ return _optionalChain([messages, 'access', _119 => _119[messages.length - 1], 'optionalAccess', _120 => _120.id]) === message.id;
3197
3354
  };
3198
3355
  var getMessageState = (messages, getBranches, useMessage, messageIndex) => {
3199
- const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _113 => _113[messageIndex - 1], 'optionalAccess', _114 => _114.id]), () => ( null));
3356
+ const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _121 => _121[messageIndex - 1], 'optionalAccess', _122 => _122.id]), () => ( null));
3200
3357
  const message = messages[messageIndex];
3201
3358
  if (!message) return null;
3202
3359
  const isLast = getIsLast(messages, message);
3203
3360
  const branches = getBranches(message.id);
3204
- const currentState = _optionalChain([useMessage, 'optionalAccess', _115 => _115.getState, 'call', _116 => _116()]);
3361
+ const currentState = _optionalChain([useMessage, 'optionalAccess', _123 => _123.getState, 'call', _124 => _124()]);
3205
3362
  if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
3206
3363
  return null;
3207
3364
  return Object.freeze({
@@ -3328,7 +3485,7 @@ var ThreadPrimitiveMessagesImpl = ({
3328
3485
  ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
3329
3486
  var ThreadPrimitiveMessages = _react.memo.call(void 0,
3330
3487
  ThreadPrimitiveMessagesImpl,
3331
- (prev, next) => _optionalChain([prev, 'access', _117 => _117.components, 'optionalAccess', _118 => _118.Message]) === _optionalChain([next, 'access', _119 => _119.components, 'optionalAccess', _120 => _120.Message]) && _optionalChain([prev, 'access', _121 => _121.components, 'optionalAccess', _122 => _122.UserMessage]) === _optionalChain([next, 'access', _123 => _123.components, 'optionalAccess', _124 => _124.UserMessage]) && _optionalChain([prev, 'access', _125 => _125.components, 'optionalAccess', _126 => _126.EditComposer]) === _optionalChain([next, 'access', _127 => _127.components, 'optionalAccess', _128 => _128.EditComposer]) && _optionalChain([prev, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.AssistantMessage]) === _optionalChain([next, 'access', _131 => _131.components, 'optionalAccess', _132 => _132.AssistantMessage]) && _optionalChain([prev, 'access', _133 => _133.components, 'optionalAccess', _134 => _134.SystemMessage]) === _optionalChain([next, 'access', _135 => _135.components, 'optionalAccess', _136 => _136.SystemMessage])
3488
+ (prev, next) => _optionalChain([prev, 'access', _125 => _125.components, 'optionalAccess', _126 => _126.Message]) === _optionalChain([next, 'access', _127 => _127.components, 'optionalAccess', _128 => _128.Message]) && _optionalChain([prev, 'access', _129 => _129.components, 'optionalAccess', _130 => _130.UserMessage]) === _optionalChain([next, 'access', _131 => _131.components, 'optionalAccess', _132 => _132.UserMessage]) && _optionalChain([prev, 'access', _133 => _133.components, 'optionalAccess', _134 => _134.EditComposer]) === _optionalChain([next, 'access', _135 => _135.components, 'optionalAccess', _136 => _136.EditComposer]) && _optionalChain([prev, 'access', _137 => _137.components, 'optionalAccess', _138 => _138.AssistantMessage]) === _optionalChain([next, 'access', _139 => _139.components, 'optionalAccess', _140 => _140.AssistantMessage]) && _optionalChain([prev, 'access', _141 => _141.components, 'optionalAccess', _142 => _142.SystemMessage]) === _optionalChain([next, 'access', _143 => _143.components, 'optionalAccess', _144 => _144.SystemMessage])
3332
3489
  );
3333
3490
 
3334
3491
  // src/primitives/thread/ThreadScrollToBottom.tsx
@@ -3360,7 +3517,7 @@ var ThreadConfigProvider = ({
3360
3517
  }) => {
3361
3518
  const assistant = useAssistantContext({ optional: true });
3362
3519
  const configProvider = config && Object.keys(_nullishCoalesce(config, () => ( {}))).length > 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
3363
- if (!_optionalChain([config, 'optionalAccess', _137 => _137.runtime])) return configProvider;
3520
+ if (!_optionalChain([config, 'optionalAccess', _145 => _145.runtime])) return configProvider;
3364
3521
  if (assistant) {
3365
3522
  throw new Error(
3366
3523
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -3372,14 +3529,26 @@ ThreadConfigProvider.displayName = "ThreadConfigProvider";
3372
3529
 
3373
3530
  // src/ui/assistant-action-bar.tsx
3374
3531
 
3532
+
3533
+
3534
+
3535
+
3536
+
3537
+
3375
3538
  var _lucidereact = require('lucide-react');
3376
3539
 
3377
3540
  var useAllowCopy = () => {
3378
3541
  const { assistantMessage: { allowCopy = true } = {} } = useThreadConfig();
3379
3542
  const { useThread } = useThreadContext();
3380
- const copySupported = useThread((t) => t.capabilities.copy);
3543
+ const copySupported = useThread((t) => t.capabilities.unstable_copy);
3381
3544
  return copySupported && allowCopy;
3382
3545
  };
3546
+ var useAllowSpeak = () => {
3547
+ const { assistantMessage: { allowSpeak = true } = {} } = useThreadConfig();
3548
+ const { useThread } = useThreadContext();
3549
+ const speakSupported = useThread((t) => t.capabilities.speak);
3550
+ return speakSupported && allowSpeak;
3551
+ };
3383
3552
  var useAllowReload = () => {
3384
3553
  const { assistantMessage: { allowReload = true } = {} } = useThreadConfig();
3385
3554
  const { useThread } = useThreadContext();
@@ -3397,6 +3566,7 @@ var AssistantActionBar = () => {
3397
3566
  autohide: "not-last",
3398
3567
  autohideFloat: "single-branch",
3399
3568
  children: [
3569
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantActionBarSpeechControl, {}),
3400
3570
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantActionBarCopy, {}),
3401
3571
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantActionBarReload, {})
3402
3572
  ]
@@ -3411,7 +3581,7 @@ AssistantActionBarRoot.displayName = "AssistantActionBarRoot";
3411
3581
  var AssistantActionBarCopy = _react.forwardRef.call(void 0, (props, ref) => {
3412
3582
  const {
3413
3583
  strings: {
3414
- assistantMessage: { reload: { tooltip = "Copy" } = {} } = {}
3584
+ assistantMessage: { copy: { tooltip = "Copy" } = {} } = {}
3415
3585
  } = {}
3416
3586
  } = useThreadConfig();
3417
3587
  const allowCopy = useAllowCopy();
@@ -3422,6 +3592,36 @@ var AssistantActionBarCopy = _react.forwardRef.call(void 0, (props, ref) => {
3422
3592
  ] }))) }) });
3423
3593
  });
3424
3594
  AssistantActionBarCopy.displayName = "AssistantActionBarCopy";
3595
+ var AssistantActionBarSpeechControl = () => {
3596
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
3597
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, message_exports.If, { speaking: false, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantActionBarSpeak, {}) }),
3598
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, message_exports.If, { speaking: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AssistantActionBarStopSpeaking, {}) })
3599
+ ] });
3600
+ };
3601
+ var AssistantActionBarSpeak = _react.forwardRef.call(void 0, (props, ref) => {
3602
+ const {
3603
+ strings: {
3604
+ assistantMessage: { speak: { tooltip = "Read aloud" } = {} } = {}
3605
+ } = {}
3606
+ } = useThreadConfig();
3607
+ const allowSpeak = useAllowSpeak();
3608
+ if (!allowSpeak) return null;
3609
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.Speak, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.AudioLinesIcon, {}))) }) });
3610
+ });
3611
+ AssistantActionBarSpeak.displayName = "AssistantActionBarSpeak";
3612
+ var AssistantActionBarStopSpeaking = _react.forwardRef.call(void 0, (props, ref) => {
3613
+ const {
3614
+ strings: {
3615
+ assistantMessage: {
3616
+ speak: { stop: { tooltip: stopTooltip = "Stop" } = {} } = {}
3617
+ } = {}
3618
+ } = {}
3619
+ } = useThreadConfig();
3620
+ const allowSpeak = useAllowSpeak();
3621
+ if (!allowSpeak) return null;
3622
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, actionBar_exports.StopSpeaking, { asChild: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, TooltipIconButton, { tooltip: stopTooltip, ...props, ref, children: _nullishCoalesce(props.children, () => ( /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.StopCircleIcon, {}))) }) });
3623
+ });
3624
+ AssistantActionBarStopSpeaking.displayName = "AssistantActionBarStopSpeaking";
3425
3625
  var AssistantActionBarReload = _react.forwardRef.call(void 0, (props, ref) => {
3426
3626
  const {
3427
3627
  strings: {
@@ -3436,7 +3636,10 @@ AssistantActionBarReload.displayName = "AssistantActionBarReload";
3436
3636
  var exports = {
3437
3637
  Root: AssistantActionBarRoot,
3438
3638
  Reload: AssistantActionBarReload,
3439
- Copy: AssistantActionBarCopy
3639
+ Copy: AssistantActionBarCopy,
3640
+ Speak: AssistantActionBarSpeak,
3641
+ StopSpeaking: AssistantActionBarStopSpeaking,
3642
+ SpeechControl: AssistantActionBarSpeechControl
3440
3643
  };
3441
3644
  var assistant_action_bar_default = Object.assign(
3442
3645
  AssistantActionBar,
@@ -3576,7 +3779,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
3576
3779
  {
3577
3780
  components: {
3578
3781
  ...componentsProp,
3579
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _138 => _138.Text]), () => ( components.Text)), () => ( content_part_default.Text))
3782
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _146 => _146.Text]), () => ( components.Text)), () => ( content_part_default.Text))
3580
3783
  }
3581
3784
  }
3582
3785
  ) });
@@ -3753,7 +3956,7 @@ var ThreadWelcomeSuggestion = ({
3753
3956
  };
3754
3957
  var ThreadWelcomeSuggestions = () => {
3755
3958
  const { welcome: { suggestions } = {} } = useThreadConfig();
3756
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _139 => _139.map, 'call', _140 => _140((suggestion, idx) => {
3959
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _147 => _147.map, 'call', _148 => _148((suggestion, idx) => {
3757
3960
  const key = `${suggestion.prompt}-${idx}`;
3758
3961
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
3759
3962
  })]) });
@@ -3831,7 +4034,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
3831
4034
  {
3832
4035
  components: {
3833
4036
  ...components,
3834
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _141 => _141.Text]), () => ( content_part_default.Text))
4037
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _149 => _149.Text]), () => ( content_part_default.Text))
3835
4038
  }
3836
4039
  }
3837
4040
  ) });
@@ -3933,10 +4136,10 @@ var ThreadMessages = ({ components, ...rest }) => {
3933
4136
  thread_exports.Messages,
3934
4137
  {
3935
4138
  components: {
3936
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _142 => _142.UserMessage]), () => ( user_message_default)),
3937
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _143 => _143.EditComposer]), () => ( edit_composer_default)),
3938
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _144 => _144.AssistantMessage]), () => ( assistant_message_default)),
3939
- SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _145 => _145.SystemMessage]), () => ( SystemMessage))
4139
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _150 => _150.UserMessage]), () => ( user_message_default)),
4140
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _151 => _151.EditComposer]), () => ( edit_composer_default)),
4141
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _152 => _152.AssistantMessage]), () => ( assistant_message_default)),
4142
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _153 => _153.SystemMessage]), () => ( SystemMessage))
3940
4143
  },
3941
4144
  ...rest
3942
4145
  }
@@ -4115,5 +4318,8 @@ var assistant_modal_default = Object.assign(AssistantModal, exports11);
4115
4318
 
4116
4319
 
4117
4320
 
4118
- exports.ActionBarPrimitive = actionBar_exports; exports.AssistantActionBar = assistant_action_bar_default; exports.AssistantMessage = assistant_message_default; exports.AssistantModal = assistant_modal_default; exports.AssistantModalPrimitive = assistantModal_exports; exports.AssistantRuntimeProvider = AssistantRuntimeProvider; exports.BranchPicker = branch_picker_default; exports.BranchPickerPrimitive = branchPicker_exports; exports.Composer = composer_default; exports.ComposerPrimitive = composer_exports; exports.ContentPart = content_part_default; exports.ContentPartPrimitive = contentPart_exports; exports.EdgeChatAdapter = EdgeChatAdapter; exports.EditComposer = edit_composer_default; exports.ExternalStoreRuntime = ExternalStoreRuntime; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; exports.Thread = thread_default; exports.ThreadConfigProvider = ThreadConfigProvider; exports.ThreadPrimitive = thread_exports; exports.ThreadWelcome = thread_welcome_default; exports.UserActionBar = user_action_bar_default; exports.UserMessage = user_message_default; exports.fromCoreMessage = fromCoreMessage; exports.fromCoreMessages = fromCoreMessages; exports.fromLanguageModelMessages = fromLanguageModelMessages; exports.fromLanguageModelTools = fromLanguageModelTools; exports.getExternalStoreMessage = getExternalStoreMessage; exports.makeAssistantTool = makeAssistantTool; exports.makeAssistantToolUI = makeAssistantToolUI; exports.streamUtils = streamUtils; exports.subscribeToMainThread = subscribeToMainThread; exports.toCoreMessage = _chunkBQ3MRWUVjs.toCoreMessage; exports.toCoreMessages = _chunkBQ3MRWUVjs.toCoreMessages; exports.toLanguageModelMessages = _chunkBQ3MRWUVjs.toLanguageModelMessages; exports.toLanguageModelTools = _chunkBQ3MRWUVjs.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarReload = useActionBarReload; exports.useAppendMessage = useAppendMessage; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadSuggestion = useThreadSuggestion;
4321
+
4322
+
4323
+
4324
+ exports.ActionBarPrimitive = actionBar_exports; exports.AssistantActionBar = assistant_action_bar_default; exports.AssistantMessage = assistant_message_default; exports.AssistantModal = assistant_modal_default; exports.AssistantModalPrimitive = assistantModal_exports; exports.AssistantRuntimeProvider = AssistantRuntimeProvider; exports.BranchPicker = branch_picker_default; exports.BranchPickerPrimitive = branchPicker_exports; exports.Composer = composer_default; exports.ComposerPrimitive = composer_exports; exports.ContentPart = content_part_default; exports.ContentPartPrimitive = contentPart_exports; exports.EdgeChatAdapter = EdgeChatAdapter; exports.EditComposer = edit_composer_default; exports.ExternalStoreRuntime = ExternalStoreRuntime; exports.INTERNAL = internal_exports; exports.MessagePrimitive = message_exports; exports.Thread = thread_default; exports.ThreadConfigProvider = ThreadConfigProvider; exports.ThreadPrimitive = thread_exports; exports.ThreadWelcome = thread_welcome_default; exports.UserActionBar = user_action_bar_default; exports.UserMessage = user_message_default; exports.WebSpeechSynthesisAdapter = WebSpeechSynthesisAdapter; exports.fromCoreMessage = fromCoreMessage; exports.fromCoreMessages = fromCoreMessages; exports.fromLanguageModelMessages = fromLanguageModelMessages; exports.fromLanguageModelTools = fromLanguageModelTools; exports.getExternalStoreMessage = getExternalStoreMessage; exports.makeAssistantTool = makeAssistantTool; exports.makeAssistantToolUI = makeAssistantToolUI; exports.streamUtils = streamUtils; exports.subscribeToMainThread = subscribeToMainThread; exports.toCoreMessage = _chunkBQ3MRWUVjs.toCoreMessage; exports.toCoreMessages = _chunkBQ3MRWUVjs.toCoreMessages; exports.toLanguageModelMessages = _chunkBQ3MRWUVjs.toLanguageModelMessages; exports.toLanguageModelTools = _chunkBQ3MRWUVjs.toLanguageModelTools; exports.useActionBarCopy = useActionBarCopy; exports.useActionBarEdit = useActionBarEdit; exports.useActionBarReload = useActionBarReload; exports.useActionBarSpeak = useActionBarSpeak; exports.useActionBarStopSpeaking = useActionBarStopSpeaking; exports.useAppendMessage = useAppendMessage; exports.useAssistantContext = useAssistantContext; exports.useAssistantInstructions = useAssistantInstructions; exports.useAssistantTool = useAssistantTool; exports.useAssistantToolUI = useAssistantToolUI; exports.useBranchPickerCount = useBranchPickerCount; exports.useBranchPickerNext = useBranchPickerNext; exports.useBranchPickerNumber = useBranchPickerNumber; exports.useBranchPickerPrevious = useBranchPickerPrevious; exports.useComposerCancel = useComposerCancel; exports.useComposerContext = useComposerContext; exports.useComposerIf = useComposerIf; exports.useComposerSend = useComposerSend; exports.useContentPartContext = useContentPartContext; exports.useContentPartDisplay = useContentPartDisplay; exports.useContentPartImage = useContentPartImage; exports.useContentPartText = useContentPartText; exports.useDangerousInBrowserRuntime = useDangerousInBrowserRuntime; exports.useEdgeRuntime = useEdgeRuntime; exports.useExternalStoreRuntime = useExternalStoreRuntime; exports.useLocalRuntime = useLocalRuntime; exports.useMessageContext = useMessageContext; exports.useMessageIf = useMessageIf; exports.useSwitchToNewThread = useSwitchToNewThread; exports.useThreadConfig = useThreadConfig; exports.useThreadContext = useThreadContext; exports.useThreadEmpty = useThreadEmpty; exports.useThreadIf = useThreadIf; exports.useThreadScrollToBottom = useThreadScrollToBottom; exports.useThreadSuggestion = useThreadSuggestion;
4119
4325
  //# sourceMappingURL=index.js.map