@assistant-ui/react 0.5.24 → 0.5.26

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.d.mts CHANGED
@@ -125,7 +125,6 @@ declare class LocalThreadRuntime implements ThreadRuntime {
125
125
  }>;
126
126
  readonly isDisabled = false;
127
127
  get messages(): ThreadMessage[];
128
- get isRunning(): boolean;
129
128
  constructor(configProvider: ModelConfigProvider, adapter: ChatModelAdapter, options?: LocalRuntimeOptions | undefined);
130
129
  getBranches(messageId: string): string[];
131
130
  switchToBranch(branchId: string): void;
@@ -551,7 +550,6 @@ declare class ExternalStoreThreadRuntime implements ReactThreadRuntime {
551
550
  };
552
551
  messages: ThreadMessage[];
553
552
  isDisabled: boolean;
554
- isRunning: boolean;
555
553
  converter: ThreadMessageConverter;
556
554
  private _store;
557
555
  constructor(store: ExternalStoreAdapter<any>);
@@ -603,7 +601,8 @@ type ThreadActionsState = Readonly<{
603
601
  addToolResult: (options: AddToolResultOptions) => void;
604
602
  }>;
605
603
 
606
- type ThreadRuntime = Readonly<ThreadState & Omit<ThreadActionsState, "getRuntime"> & {
604
+ type ThreadRuntime = Readonly<Omit<ThreadActionsState, "getRuntime"> & {
605
+ isDisabled: boolean;
607
606
  messages: readonly ThreadMessage[];
608
607
  subscribe: (callback: () => void) => Unsubscribe;
609
608
  }>;
@@ -654,6 +653,7 @@ declare function useAssistantContext(options: {
654
653
  type ThreadState = Readonly<{
655
654
  isRunning: boolean;
656
655
  isDisabled: boolean;
656
+ unstable_canAppendNew: boolean;
657
657
  }>;
658
658
 
659
659
  type ThreadViewportState = Readonly<{
package/dist/index.d.ts CHANGED
@@ -125,7 +125,6 @@ declare class LocalThreadRuntime implements ThreadRuntime {
125
125
  }>;
126
126
  readonly isDisabled = false;
127
127
  get messages(): ThreadMessage[];
128
- get isRunning(): boolean;
129
128
  constructor(configProvider: ModelConfigProvider, adapter: ChatModelAdapter, options?: LocalRuntimeOptions | undefined);
130
129
  getBranches(messageId: string): string[];
131
130
  switchToBranch(branchId: string): void;
@@ -551,7 +550,6 @@ declare class ExternalStoreThreadRuntime implements ReactThreadRuntime {
551
550
  };
552
551
  messages: ThreadMessage[];
553
552
  isDisabled: boolean;
554
- isRunning: boolean;
555
553
  converter: ThreadMessageConverter;
556
554
  private _store;
557
555
  constructor(store: ExternalStoreAdapter<any>);
@@ -603,7 +601,8 @@ type ThreadActionsState = Readonly<{
603
601
  addToolResult: (options: AddToolResultOptions) => void;
604
602
  }>;
605
603
 
606
- type ThreadRuntime = Readonly<ThreadState & Omit<ThreadActionsState, "getRuntime"> & {
604
+ type ThreadRuntime = Readonly<Omit<ThreadActionsState, "getRuntime"> & {
605
+ isDisabled: boolean;
607
606
  messages: readonly ThreadMessage[];
608
607
  subscribe: (callback: () => void) => Unsubscribe;
609
608
  }>;
@@ -654,6 +653,7 @@ declare function useAssistantContext(options: {
654
653
  type ThreadState = Readonly<{
655
654
  isRunning: boolean;
656
655
  isDisabled: boolean;
656
+ unstable_canAppendNew: boolean;
657
657
  }>;
658
658
 
659
659
  type ThreadViewportState = Readonly<{
package/dist/index.js CHANGED
@@ -159,11 +159,23 @@ var makeComposerStore = (useThreadMessages, useThreadActions) => {
159
159
 
160
160
  // src/context/stores/Thread.ts
161
161
 
162
+ var getThreadStateFromRuntime = (runtime) => {
163
+ const lastMessage = runtime.messages.at(-1);
164
+ if (_optionalChain([lastMessage, 'optionalAccess', _11 => _11.role]) !== "assistant")
165
+ return Object.freeze({
166
+ isDisabled: runtime.isDisabled,
167
+ isRunning: false,
168
+ unstable_canAppendNew: !runtime.isDisabled
169
+ });
170
+ return Object.freeze({
171
+ isDisabled: runtime.isDisabled,
172
+ isRunning: lastMessage.status.type === "running",
173
+ unstable_canAppendNew: !runtime.isDisabled && lastMessage.status.type !== "running" && lastMessage.status.type !== "requires-action"
174
+ });
175
+ };
162
176
  var makeThreadStore = (runtimeRef) => {
163
- return _zustand.create.call(void 0, () => ({
164
- isDisabled: runtimeRef.getState().isDisabled,
165
- isRunning: runtimeRef.getState().isRunning
166
- }));
177
+ const runtime = runtimeRef.getState();
178
+ return _zustand.create.call(void 0, () => getThreadStateFromRuntime(runtime));
167
179
  };
168
180
 
169
181
  // src/context/stores/ThreadViewport.tsx
@@ -260,13 +272,11 @@ var ThreadProvider = ({
260
272
  _react.useCallback.call(void 0,
261
273
  (thread) => {
262
274
  const onThreadUpdate = () => {
263
- const threadState = context.useThread.getState();
264
- if (thread.isRunning !== threadState.isRunning || thread.isDisabled !== threadState.isDisabled) {
275
+ const oldState = context.useThread.getState();
276
+ const state = getThreadStateFromRuntime(thread);
277
+ if (oldState.isDisabled !== state.isDisabled || oldState.isRunning !== state.isRunning || oldState.unstable_canAppendNew !== state.unstable_canAppendNew) {
265
278
  context.useThread.setState(
266
- Object.freeze({
267
- isRunning: thread.isRunning,
268
- isDisabled: thread.isDisabled
269
- }),
279
+ getThreadStateFromRuntime(thread),
270
280
  true
271
281
  );
272
282
  }
@@ -344,7 +354,7 @@ var AssistantRuntimeProvider = _react.memo.call(void 0, AssistantRuntimeProvider
344
354
  var MessageContext = _react.createContext.call(void 0, null);
345
355
  function useMessageContext(options) {
346
356
  const context = _react.useContext.call(void 0, MessageContext);
347
- if (!_optionalChain([options, 'optionalAccess', _11 => _11.optional]) && !context)
357
+ if (!_optionalChain([options, 'optionalAccess', _12 => _12.optional]) && !context)
348
358
  throw new Error(
349
359
  "This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />."
350
360
  );
@@ -371,7 +381,7 @@ var ContentPartContext = _react.createContext.call(void 0,
371
381
  );
372
382
  function useContentPartContext(options) {
373
383
  const context = _react.useContext.call(void 0, ContentPartContext);
374
- if (!_optionalChain([options, 'optionalAccess', _12 => _12.optional]) && !context)
384
+ if (!_optionalChain([options, 'optionalAccess', _13 => _13.optional]) && !context)
375
385
  throw new Error(
376
386
  "This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
377
387
  );
@@ -383,13 +393,13 @@ function useContentPartContext(options) {
383
393
  var toAppendMessage = (useThreadMessages, message) => {
384
394
  if (typeof message === "string") {
385
395
  return {
386
- parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _13 => _13.getState, 'call', _14 => _14(), 'access', _15 => _15.at, 'call', _16 => _16(-1), 'optionalAccess', _17 => _17.id]), () => ( null)),
396
+ parentId: _nullishCoalesce(_optionalChain([useThreadMessages, 'access', _14 => _14.getState, 'call', _15 => _15(), 'access', _16 => _16.at, 'call', _17 => _17(-1), 'optionalAccess', _18 => _18.id]), () => ( null)),
387
397
  role: "user",
388
398
  content: [{ type: "text", text: message }]
389
399
  };
390
400
  }
391
401
  return {
392
- parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _18 => _18.getState, 'call', _19 => _19(), 'access', _20 => _20.at, 'call', _21 => _21(-1), 'optionalAccess', _22 => _22.id]))), () => ( null)),
402
+ parentId: _nullishCoalesce(_nullishCoalesce(message.parentId, () => ( _optionalChain([useThreadMessages, 'access', _19 => _19.getState, 'call', _20 => _20(), 'access', _21 => _21.at, 'call', _22 => _22(-1), 'optionalAccess', _23 => _23.id]))), () => ( null)),
393
403
  role: _nullishCoalesce(message.role, () => ( "user")),
394
404
  content: message.content
395
405
  };
@@ -441,7 +451,7 @@ var useAssistantTool = (tool) => {
441
451
  const unsub2 = render ? setToolUI(toolName, render) : void 0;
442
452
  return () => {
443
453
  unsub1();
444
- _optionalChain([unsub2, 'optionalCall', _23 => _23()]);
454
+ _optionalChain([unsub2, 'optionalCall', _24 => _24()]);
445
455
  };
446
456
  }, [registerModelConfigProvider, setToolUI, tool]);
447
457
  };
@@ -520,8 +530,8 @@ var useCombinedStore = (stores, selector) => {
520
530
  return useCombined(selector);
521
531
  };
522
532
 
523
- // src/utils/getMessageText.tsx
524
- var getMessageText = (message) => {
533
+ // src/utils/getThreadMessageText.tsx
534
+ var getThreadMessageText = (message) => {
525
535
  const textParts = message.content.filter(
526
536
  (part) => part.type === "text"
527
537
  );
@@ -543,7 +553,7 @@ var useActionBarCopy = ({
543
553
  const { message } = useMessage.getState();
544
554
  const { setIsCopied } = useMessageUtils.getState();
545
555
  const { isEditing, value: composerValue } = useEditComposer.getState();
546
- const valueToCopy = isEditing ? composerValue : getMessageText(message);
556
+ const valueToCopy = isEditing ? composerValue : getThreadMessageText(message);
547
557
  navigator.clipboard.writeText(valueToCopy).then(() => {
548
558
  setIsCopied(true);
549
559
  setTimeout(() => setIsCopied(false), copiedDuration);
@@ -670,7 +680,7 @@ var useComposerSend = () => {
670
680
  const { useComposer } = useComposerContext();
671
681
  const disabled = useCombinedStore(
672
682
  [useThread, useComposer],
673
- (t, c) => t.isDisabled || t.isRunning || !c.isEditing || c.value.length === 0
683
+ (t, c) => !t.unstable_canAppendNew || !c.isEditing || c.value.length === 0
674
684
  );
675
685
  const callback = _react.useCallback.call(void 0, () => {
676
686
  const composerState = useComposer.getState();
@@ -878,7 +888,7 @@ var createActionButton = (displayName, useActionButton, forwardProps = []) => {
878
888
  ...primitiveProps,
879
889
  ref: forwardedRef,
880
890
  onClick: _primitive.composeEventHandlers.call(void 0, primitiveProps.onClick, () => {
881
- _optionalChain([callback, 'optionalCall', _24 => _24()]);
891
+ _optionalChain([callback, 'optionalCall', _25 => _25()]);
882
892
  })
883
893
  }
884
894
  );
@@ -1166,7 +1176,7 @@ var getContentPartState = ({ message }, useContentPart, partIndex) => {
1166
1176
  }
1167
1177
  }
1168
1178
  const status = toContentPartStatus(message, partIndex, part);
1169
- const currentState = _optionalChain([useContentPart, 'optionalAccess', _25 => _25.getState, 'call', _26 => _26()]);
1179
+ const currentState = _optionalChain([useContentPart, 'optionalAccess', _26 => _26.getState, 'call', _27 => _27()]);
1170
1180
  if (currentState && currentState.part === part && currentState.status === status)
1171
1181
  return null;
1172
1182
  return Object.freeze({ part, status });
@@ -1242,7 +1252,7 @@ var withSmoothContextProvider = (Component) => {
1242
1252
  };
1243
1253
  function useSmoothContext(options) {
1244
1254
  const context = _react.useContext.call(void 0, SmoothContext);
1245
- if (!_optionalChain([options, 'optionalAccess', _27 => _27.optional]) && !context)
1255
+ if (!_optionalChain([options, 'optionalAccess', _28 => _28.optional]) && !context)
1246
1256
  throw new Error(
1247
1257
  "This component must be used within a SmoothContextProvider."
1248
1258
  );
@@ -1313,7 +1323,7 @@ var useSmooth = (state, smooth = false) => {
1313
1323
  const [displayedText, setDisplayedText] = _react.useState.call(void 0, text);
1314
1324
  const setText = _reactusecallbackref.useCallbackRef.call(void 0, (text2) => {
1315
1325
  setDisplayedText(text2);
1316
- _optionalChain([useSmoothStatus2, 'optionalAccess', _28 => _28.setState, 'call', _29 => _29(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
1326
+ _optionalChain([useSmoothStatus2, 'optionalAccess', _29 => _29.setState, 'call', _30 => _30(text2 !== state.part.text ? SMOOTH_STATUS : state.status)]);
1317
1327
  });
1318
1328
  const [animatorRef] = _react.useState.call(void 0,
1319
1329
  new TextStreamAnimator(text, setText)
@@ -1457,7 +1467,7 @@ var MessageContentPartImpl = ({
1457
1467
  };
1458
1468
  var MessageContentPart = _react.memo.call(void 0,
1459
1469
  MessageContentPartImpl,
1460
- (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _30 => _30.components, 'optionalAccess', _31 => _31.Text]) === _optionalChain([next, 'access', _32 => _32.components, 'optionalAccess', _33 => _33.Text]) && _optionalChain([prev, 'access', _34 => _34.components, 'optionalAccess', _35 => _35.Image]) === _optionalChain([next, 'access', _36 => _36.components, 'optionalAccess', _37 => _37.Image]) && _optionalChain([prev, 'access', _38 => _38.components, 'optionalAccess', _39 => _39.UI]) === _optionalChain([next, 'access', _40 => _40.components, 'optionalAccess', _41 => _41.UI]) && _optionalChain([prev, 'access', _42 => _42.components, 'optionalAccess', _43 => _43.tools]) === _optionalChain([next, 'access', _44 => _44.components, 'optionalAccess', _45 => _45.tools])
1470
+ (prev, next) => prev.partIndex === next.partIndex && _optionalChain([prev, 'access', _31 => _31.components, 'optionalAccess', _32 => _32.Text]) === _optionalChain([next, 'access', _33 => _33.components, 'optionalAccess', _34 => _34.Text]) && _optionalChain([prev, 'access', _35 => _35.components, 'optionalAccess', _36 => _36.Image]) === _optionalChain([next, 'access', _37 => _37.components, 'optionalAccess', _38 => _38.Image]) && _optionalChain([prev, 'access', _39 => _39.components, 'optionalAccess', _40 => _40.UI]) === _optionalChain([next, 'access', _41 => _41.components, 'optionalAccess', _42 => _42.UI]) && _optionalChain([prev, 'access', _43 => _43.components, 'optionalAccess', _44 => _44.tools]) === _optionalChain([next, 'access', _45 => _45.components, 'optionalAccess', _46 => _46.tools])
1461
1471
  );
1462
1472
  var MessagePrimitiveContent = ({
1463
1473
  components
@@ -1568,10 +1578,10 @@ var ComposerPrimitiveInput = _react.forwardRef.call(void 0,
1568
1578
  const handleKeyPress = (e) => {
1569
1579
  if (isDisabled) return;
1570
1580
  if (e.key === "Enter" && e.shiftKey === false) {
1571
- const isRunning = useThread.getState().isRunning;
1572
- if (!isRunning) {
1581
+ const { unstable_canAppendNew } = useThread.getState();
1582
+ if (unstable_canAppendNew) {
1573
1583
  e.preventDefault();
1574
- _optionalChain([textareaRef, 'access', _46 => _46.current, 'optionalAccess', _47 => _47.closest, 'call', _48 => _48("form"), 'optionalAccess', _49 => _49.requestSubmit, 'call', _50 => _50()]);
1584
+ _optionalChain([textareaRef, 'access', _47 => _47.current, 'optionalAccess', _48 => _48.closest, 'call', _49 => _49("form"), 'optionalAccess', _50 => _50.requestSubmit, 'call', _51 => _51()]);
1575
1585
  }
1576
1586
  }
1577
1587
  };
@@ -1865,15 +1875,15 @@ var makeMessageUtilsStore = () => _zustand.create.call(void 0, (set) => ({
1865
1875
  // src/context/providers/MessageProvider.tsx
1866
1876
 
1867
1877
  var getIsLast = (messages, message) => {
1868
- return _optionalChain([messages, 'access', _51 => _51[messages.length - 1], 'optionalAccess', _52 => _52.id]) === message.id;
1878
+ return _optionalChain([messages, 'access', _52 => _52[messages.length - 1], 'optionalAccess', _53 => _53.id]) === message.id;
1869
1879
  };
1870
1880
  var getMessageState = (messages, getBranches, useMessage, messageIndex) => {
1871
- const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _53 => _53[messageIndex - 1], 'optionalAccess', _54 => _54.id]), () => ( null));
1881
+ const parentId = _nullishCoalesce(_optionalChain([messages, 'access', _54 => _54[messageIndex - 1], 'optionalAccess', _55 => _55.id]), () => ( null));
1872
1882
  const message = messages[messageIndex];
1873
1883
  if (!message) return null;
1874
1884
  const isLast = getIsLast(messages, message);
1875
1885
  const branches = getBranches(message.id);
1876
- const currentState = _optionalChain([useMessage, 'optionalAccess', _55 => _55.getState, 'call', _56 => _56()]);
1886
+ const currentState = _optionalChain([useMessage, 'optionalAccess', _56 => _56.getState, 'call', _57 => _57()]);
1877
1887
  if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
1878
1888
  return null;
1879
1889
  return Object.freeze({
@@ -1902,7 +1912,7 @@ var useMessageContext2 = (messageIndex) => {
1902
1912
  throw new Error(
1903
1913
  "Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui."
1904
1914
  );
1905
- const text = getMessageText(message);
1915
+ const text = getThreadMessageText(message);
1906
1916
  return text;
1907
1917
  },
1908
1918
  onSend: (text) => {
@@ -2000,7 +2010,7 @@ var ThreadPrimitiveMessagesImpl = ({
2000
2010
  ThreadPrimitiveMessagesImpl.displayName = "ThreadPrimitive.Messages";
2001
2011
  var ThreadPrimitiveMessages = _react.memo.call(void 0,
2002
2012
  ThreadPrimitiveMessagesImpl,
2003
- (prev, next) => _optionalChain([prev, 'access', _57 => _57.components, 'optionalAccess', _58 => _58.Message]) === _optionalChain([next, 'access', _59 => _59.components, 'optionalAccess', _60 => _60.Message]) && _optionalChain([prev, 'access', _61 => _61.components, 'optionalAccess', _62 => _62.UserMessage]) === _optionalChain([next, 'access', _63 => _63.components, 'optionalAccess', _64 => _64.UserMessage]) && _optionalChain([prev, 'access', _65 => _65.components, 'optionalAccess', _66 => _66.EditComposer]) === _optionalChain([next, 'access', _67 => _67.components, 'optionalAccess', _68 => _68.EditComposer]) && _optionalChain([prev, 'access', _69 => _69.components, 'optionalAccess', _70 => _70.AssistantMessage]) === _optionalChain([next, 'access', _71 => _71.components, 'optionalAccess', _72 => _72.AssistantMessage]) && _optionalChain([prev, 'access', _73 => _73.components, 'optionalAccess', _74 => _74.SystemMessage]) === _optionalChain([next, 'access', _75 => _75.components, 'optionalAccess', _76 => _76.SystemMessage])
2013
+ (prev, next) => _optionalChain([prev, 'access', _58 => _58.components, 'optionalAccess', _59 => _59.Message]) === _optionalChain([next, 'access', _60 => _60.components, 'optionalAccess', _61 => _61.Message]) && _optionalChain([prev, 'access', _62 => _62.components, 'optionalAccess', _63 => _63.UserMessage]) === _optionalChain([next, 'access', _64 => _64.components, 'optionalAccess', _65 => _65.UserMessage]) && _optionalChain([prev, 'access', _66 => _66.components, 'optionalAccess', _67 => _67.EditComposer]) === _optionalChain([next, 'access', _68 => _68.components, 'optionalAccess', _69 => _69.EditComposer]) && _optionalChain([prev, 'access', _70 => _70.components, 'optionalAccess', _71 => _71.AssistantMessage]) === _optionalChain([next, 'access', _72 => _72.components, 'optionalAccess', _73 => _73.AssistantMessage]) && _optionalChain([prev, 'access', _74 => _74.components, 'optionalAccess', _75 => _75.SystemMessage]) === _optionalChain([next, 'access', _76 => _76.components, 'optionalAccess', _77 => _77.SystemMessage])
2004
2014
  );
2005
2015
 
2006
2016
  // src/primitives/thread/ThreadScrollToBottom.tsx
@@ -2132,7 +2142,7 @@ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__in
2132
2142
  parentOrRoot.children = parentOrRoot.children.filter(
2133
2143
  (m) => m !== child.current.id
2134
2144
  );
2135
- if (_optionalChain([child, 'access', _77 => _77.prev, 'optionalAccess', _78 => _78.next]) === child) {
2145
+ if (_optionalChain([child, 'access', _78 => _78.prev, 'optionalAccess', _79 => _79.next]) === child) {
2136
2146
  const fallbackId = child.prev.children.at(-1);
2137
2147
  const fallback = fallbackId ? this.messages.get(fallbackId) : null;
2138
2148
  if (fallback === void 0) {
@@ -2162,7 +2172,7 @@ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__in
2162
2172
  }
2163
2173
  }
2164
2174
  getMessages() {
2165
- const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _79 => _79.head, 'optionalAccess', _80 => _80.level]), () => ( 0)));
2175
+ const messages = new Array(_nullishCoalesce(_optionalChain([this, 'access', _80 => _80.head, 'optionalAccess', _81 => _81.level]), () => ( 0)));
2166
2176
  for (let current = this.head; current; current = current.prev) {
2167
2177
  messages[current.level] = current.current;
2168
2178
  }
@@ -2200,7 +2210,7 @@ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__in
2200
2210
  "MessageRepository(updateMessage): Message not found. This is likely an internal bug in assistant-ui."
2201
2211
  );
2202
2212
  return {
2203
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _81 => _81.prev, 'optionalAccess', _82 => _82.current, 'access', _83 => _83.id]), () => ( null)),
2213
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _82 => _82.prev, 'optionalAccess', _83 => _83.current, 'access', _84 => _84.id]), () => ( null)),
2204
2214
  message: message.current
2205
2215
  };
2206
2216
  }
@@ -2285,11 +2295,11 @@ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__in
2285
2295
  for (const [, message] of this.messages) {
2286
2296
  exportItems.push({
2287
2297
  message: message.current,
2288
- parentId: _nullishCoalesce(_optionalChain([message, 'access', _84 => _84.prev, 'optionalAccess', _85 => _85.current, 'access', _86 => _86.id]), () => ( null))
2298
+ parentId: _nullishCoalesce(_optionalChain([message, 'access', _85 => _85.prev, 'optionalAccess', _86 => _86.current, 'access', _87 => _87.id]), () => ( null))
2289
2299
  });
2290
2300
  }
2291
2301
  return {
2292
- headId: _nullishCoalesce(_optionalChain([this, 'access', _87 => _87.head, 'optionalAccess', _88 => _88.current, 'access', _89 => _89.id]), () => ( null)),
2302
+ headId: _nullishCoalesce(_optionalChain([this, 'access', _88 => _88.head, 'optionalAccess', _89 => _89.current, 'access', _90 => _90.id]), () => ( null)),
2293
2303
  messages: exportItems
2294
2304
  };
2295
2305
  }
@@ -2297,7 +2307,7 @@ var MessageRepository = (_class4 = class {constructor() { _class4.prototype.__in
2297
2307
  for (const { message, parentId } of messages) {
2298
2308
  this.addOrUpdateMessage(parentId, message);
2299
2309
  }
2300
- this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _90 => _90.at, 'call', _91 => _91(-1), 'optionalAccess', _92 => _92.message, 'access', _93 => _93.id]))), () => ( null)));
2310
+ this.resetHead(_nullishCoalesce(_nullishCoalesce(headId, () => ( _optionalChain([messages, 'access', _91 => _91.at, 'call', _92 => _92(-1), 'optionalAccess', _93 => _93.message, 'access', _94 => _94.id]))), () => ( null)));
2301
2311
  }
2302
2312
  }, _class4);
2303
2313
 
@@ -2460,7 +2470,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
2460
2470
  });
2461
2471
  if (mergeRoundtrips) {
2462
2472
  const previousMessage = messages[messages.length - 1];
2463
- if (_optionalChain([previousMessage, 'optionalAccess', _94 => _94.role]) === "assistant") {
2473
+ if (_optionalChain([previousMessage, 'optionalAccess', _95 => _95.role]) === "assistant") {
2464
2474
  previousMessage.content.push(...newContent);
2465
2475
  break;
2466
2476
  }
@@ -2473,7 +2483,7 @@ var fromLanguageModelMessages = (lm, { mergeRoundtrips }) => {
2473
2483
  }
2474
2484
  case "tool": {
2475
2485
  const previousMessage = messages[messages.length - 1];
2476
- if (_optionalChain([previousMessage, 'optionalAccess', _95 => _95.role]) !== "assistant")
2486
+ if (_optionalChain([previousMessage, 'optionalAccess', _96 => _96.role]) !== "assistant")
2477
2487
  throw new Error(
2478
2488
  "A tool message must be preceded by an assistant message."
2479
2489
  );
@@ -2677,7 +2687,7 @@ var useEdgeRuntime = ({
2677
2687
  };
2678
2688
 
2679
2689
  // src/runtimes/local/shouldContinue.tsx
2680
- var shouldContinue = (result) => _optionalChain([result, 'access', _96 => _96.status, 'optionalAccess', _97 => _97.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
2690
+ var shouldContinue = (result) => _optionalChain([result, 'access', _97 => _97.status, 'optionalAccess', _98 => _98.type]) === "requires-action" && result.status.reason === "tool-calls" && result.content.every((c) => c.type !== "tool-call" || !!c.result);
2681
2691
 
2682
2692
  // src/runtimes/local/LocalThreadRuntime.tsx
2683
2693
  var CAPABILITIES = Object.freeze({
@@ -2692,7 +2702,7 @@ var LocalThreadRuntime = (_class5 = class {
2692
2702
  this.configProvider = configProvider;
2693
2703
  this.adapter = adapter;
2694
2704
  this.options = options;
2695
- if (_optionalChain([options, 'optionalAccess', _98 => _98.initialMessages])) {
2705
+ if (_optionalChain([options, 'optionalAccess', _99 => _99.initialMessages])) {
2696
2706
  let parentId = null;
2697
2707
  const messages = fromCoreMessages(options.initialMessages);
2698
2708
  for (const message of messages) {
@@ -2709,9 +2719,6 @@ var LocalThreadRuntime = (_class5 = class {
2709
2719
  get messages() {
2710
2720
  return this.repository.getMessages();
2711
2721
  }
2712
- get isRunning() {
2713
- return this.abortController != null;
2714
- }
2715
2722
  getBranches(messageId) {
2716
2723
  return this.repository.getBranches(messageId);
2717
2724
  }
@@ -2750,7 +2757,7 @@ var LocalThreadRuntime = (_class5 = class {
2750
2757
  }
2751
2758
  async performRoundtrip(parentId, message) {
2752
2759
  const messages = this.repository.getMessages();
2753
- _optionalChain([this, 'access', _99 => _99.abortController, 'optionalAccess', _100 => _100.abort, 'call', _101 => _101()]);
2760
+ _optionalChain([this, 'access', _100 => _100.abortController, 'optionalAccess', _101 => _101.abort, 'call', _102 => _102()]);
2754
2761
  this.abortController = new AbortController();
2755
2762
  const initialContent = message.content;
2756
2763
  const initialRoundtrips = message.roundtrips;
@@ -2759,13 +2766,13 @@ var LocalThreadRuntime = (_class5 = class {
2759
2766
  ...message,
2760
2767
  ...m.content ? { content: [...initialContent, ..._nullishCoalesce(m.content, () => ( []))] } : void 0,
2761
2768
  status: _nullishCoalesce(m.status, () => ( message.status)),
2762
- ..._optionalChain([m, 'access', _102 => _102.roundtrips, 'optionalAccess', _103 => _103.length]) ? { roundtrips: [..._nullishCoalesce(initialRoundtrips, () => ( [])), ...m.roundtrips] } : void 0
2769
+ ..._optionalChain([m, 'access', _103 => _103.roundtrips, 'optionalAccess', _104 => _104.length]) ? { roundtrips: [..._nullishCoalesce(initialRoundtrips, () => ( [])), ...m.roundtrips] } : void 0
2763
2770
  };
2764
2771
  this.repository.addOrUpdateMessage(parentId, message);
2765
2772
  this.notifySubscribers();
2766
2773
  };
2767
- const maxToolRoundtrips = _nullishCoalesce(_optionalChain([this, 'access', _104 => _104.options, 'optionalAccess', _105 => _105.maxToolRoundtrips]), () => ( 1));
2768
- const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _106 => _106.roundtrips, 'optionalAccess', _107 => _107.length]), () => ( 0));
2774
+ const maxToolRoundtrips = _nullishCoalesce(_optionalChain([this, 'access', _105 => _105.options, 'optionalAccess', _106 => _106.maxToolRoundtrips]), () => ( 1));
2775
+ const toolRoundtrips = _nullishCoalesce(_optionalChain([message, 'access', _107 => _107.roundtrips, 'optionalAccess', _108 => _108.length]), () => ( 0));
2769
2776
  if (toolRoundtrips > maxToolRoundtrips) {
2770
2777
  updateMessage({
2771
2778
  status: {
@@ -2800,8 +2807,6 @@ var LocalThreadRuntime = (_class5 = class {
2800
2807
  updateMessage({
2801
2808
  status: { type: "complete", reason: "unknown" }
2802
2809
  });
2803
- } else {
2804
- this.notifySubscribers();
2805
2810
  }
2806
2811
  } catch (e) {
2807
2812
  this.abortController = null;
@@ -2999,7 +3004,7 @@ var fromThreadMessageLike = (like, fallbackId, fallbackStatus) => {
2999
3004
 
3000
3005
  // src/runtimes/external-store/ExternalStoreThreadRuntime.tsx
3001
3006
  var hasUpcomingMessage = (isRunning, messages) => {
3002
- return isRunning && _optionalChain([messages, 'access', _108 => _108[messages.length - 1], 'optionalAccess', _109 => _109.role]) !== "assistant";
3007
+ return isRunning && _optionalChain([messages, 'access', _109 => _109[messages.length - 1], 'optionalAccess', _110 => _110.role]) !== "assistant";
3003
3008
  };
3004
3009
  var ExternalStoreThreadRuntime = (_class7 = class {
3005
3010
  __init17() {this._subscriptions = /* @__PURE__ */ new Set()}
@@ -3016,10 +3021,9 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3016
3021
  }
3017
3022
  __init20() {this.messages = []}
3018
3023
  __init21() {this.isDisabled = false}
3019
- __init22() {this.isRunning = false}
3020
- __init23() {this.converter = new ThreadMessageConverter()}
3024
+ __init22() {this.converter = new ThreadMessageConverter()}
3021
3025
 
3022
- constructor(store) {;_class7.prototype.__init17.call(this);_class7.prototype.__init18.call(this);_class7.prototype.__init19.call(this);_class7.prototype.__init20.call(this);_class7.prototype.__init21.call(this);_class7.prototype.__init22.call(this);_class7.prototype.__init23.call(this);_class7.prototype.__init24.call(this);
3026
+ constructor(store) {;_class7.prototype.__init17.call(this);_class7.prototype.__init18.call(this);_class7.prototype.__init19.call(this);_class7.prototype.__init20.call(this);_class7.prototype.__init21.call(this);_class7.prototype.__init22.call(this);_class7.prototype.__init23.call(this);
3023
3027
  this.store = store;
3024
3028
  }
3025
3029
  set store(store) {
@@ -3055,7 +3059,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3055
3059
  for (let i = 0; i < messages.length; i++) {
3056
3060
  const message = messages[i];
3057
3061
  const parent = messages[i - 1];
3058
- this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _113 => _113.id]), () => ( null)), message);
3062
+ this.repository.addOrUpdateMessage(_nullishCoalesce(_optionalChain([parent, 'optionalAccess', _114 => _114.id]), () => ( null)), message);
3059
3063
  }
3060
3064
  if (this.assistantOptimisticId) {
3061
3065
  this.repository.deleteMessage(this.assistantOptimisticId);
@@ -3063,7 +3067,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3063
3067
  }
3064
3068
  if (hasUpcomingMessage(isRunning, messages)) {
3065
3069
  this.assistantOptimisticId = this.repository.appendOptimisticMessage(
3066
- _nullishCoalesce(_optionalChain([messages, 'access', _114 => _114.at, 'call', _115 => _115(-1), 'optionalAccess', _116 => _116.id]), () => ( null)),
3070
+ _nullishCoalesce(_optionalChain([messages, 'access', _115 => _115.at, 'call', _116 => _116(-1), 'optionalAccess', _117 => _117.id]), () => ( null)),
3067
3071
  {
3068
3072
  role: "assistant",
3069
3073
  content: []
@@ -3071,11 +3075,10 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3071
3075
  );
3072
3076
  }
3073
3077
  this.repository.resetHead(
3074
- _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _117 => _117.at, 'call', _118 => _118(-1), 'optionalAccess', _119 => _119.id]))), () => ( null))
3078
+ _nullishCoalesce(_nullishCoalesce(this.assistantOptimisticId, () => ( _optionalChain([messages, 'access', _118 => _118.at, 'call', _119 => _119(-1), 'optionalAccess', _120 => _120.id]))), () => ( null))
3075
3079
  );
3076
3080
  this.messages = this.repository.getMessages();
3077
3081
  this.isDisabled = isDisabled;
3078
- this.isRunning = isRunning;
3079
3082
  for (const callback of this._subscriptions) callback();
3080
3083
  }
3081
3084
  getBranches(messageId) {
@@ -3088,7 +3091,7 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3088
3091
  this.updateMessages(this.repository.getMessages());
3089
3092
  }
3090
3093
  async append(message) {
3091
- if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _120 => _120.messages, 'access', _121 => _121.at, 'call', _122 => _122(-1), 'optionalAccess', _123 => _123.id]), () => ( null)))) {
3094
+ if (message.parentId !== (_nullishCoalesce(_optionalChain([this, 'access', _121 => _121.messages, 'access', _122 => _122.at, 'call', _123 => _123(-1), 'optionalAccess', _124 => _124.id]), () => ( null)))) {
3092
3095
  if (!this._store.onEdit)
3093
3096
  throw new Error("Runtime does not support editing messages.");
3094
3097
  await this._store.onEdit(message);
@@ -3118,8 +3121,8 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3118
3121
  this._subscriptions.add(callback);
3119
3122
  return () => this._subscriptions.delete(callback);
3120
3123
  }
3121
- __init24() {this.updateMessages = (messages) => {
3122
- _optionalChain([this, 'access', _124 => _124._store, 'access', _125 => _125.setMessages, 'optionalCall', _126 => _126(
3124
+ __init23() {this.updateMessages = (messages) => {
3125
+ _optionalChain([this, 'access', _125 => _125._store, 'access', _126 => _126.setMessages, 'optionalCall', _127 => _127(
3123
3126
  messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
3124
3127
  )]);
3125
3128
  }}
@@ -3132,9 +3135,9 @@ var ExternalStoreThreadRuntime = (_class7 = class {
3132
3135
 
3133
3136
  // src/runtimes/external-store/ExternalStoreRuntime.tsx
3134
3137
  var ExternalStoreRuntime = (_class8 = class extends BaseAssistantRuntime {
3135
- __init25() {this._proxyConfigProvider = new ProxyConfigProvider()}
3138
+ __init24() {this._proxyConfigProvider = new ProxyConfigProvider()}
3136
3139
  constructor(store) {
3137
- super(new ExternalStoreThreadRuntime(store));_class8.prototype.__init25.call(this);;
3140
+ super(new ExternalStoreThreadRuntime(store));_class8.prototype.__init24.call(this);;
3138
3141
  }
3139
3142
  set store(store) {
3140
3143
  this.thread.store = store;
@@ -3184,7 +3187,7 @@ var ThreadConfigProvider = ({
3184
3187
  }) => {
3185
3188
  const assistant = useAssistantContext({ optional: true });
3186
3189
  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 });
3187
- if (!_optionalChain([config, 'optionalAccess', _127 => _127.runtime])) return configProvider;
3190
+ if (!_optionalChain([config, 'optionalAccess', _128 => _128.runtime])) return configProvider;
3188
3191
  if (assistant) {
3189
3192
  throw new Error(
3190
3193
  "You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
@@ -3400,7 +3403,7 @@ var AssistantMessageContent = _react.forwardRef.call(void 0, ({ components: comp
3400
3403
  {
3401
3404
  components: {
3402
3405
  ...componentsProp,
3403
- Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _128 => _128.Text]), () => ( components.Text)), () => ( content_part_default.Text))
3406
+ Text: _nullishCoalesce(_nullishCoalesce(_optionalChain([componentsProp, 'optionalAccess', _129 => _129.Text]), () => ( components.Text)), () => ( content_part_default.Text))
3404
3407
  }
3405
3408
  }
3406
3409
  ) });
@@ -3575,7 +3578,7 @@ var ThreadWelcomeSuggestion = ({
3575
3578
  };
3576
3579
  var ThreadWelcomeSuggestions = () => {
3577
3580
  const { welcome: { suggestions } = {} } = useThreadConfig();
3578
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _129 => _129.map, 'call', _130 => _130((suggestion, idx) => {
3581
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestionContainer, { children: _optionalChain([suggestions, 'optionalAccess', _130 => _130.map, 'call', _131 => _131((suggestion, idx) => {
3579
3582
  const key = `${suggestion.prompt}-${idx}`;
3580
3583
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ThreadWelcomeSuggestion, { suggestion }, key);
3581
3584
  })]) });
@@ -3653,7 +3656,7 @@ var UserMessageContent = _react.forwardRef.call(void 0,
3653
3656
  {
3654
3657
  components: {
3655
3658
  ...components,
3656
- Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _131 => _131.Text]), () => ( content_part_default.Text))
3659
+ Text: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _132 => _132.Text]), () => ( content_part_default.Text))
3657
3660
  }
3658
3661
  }
3659
3662
  ) });
@@ -3755,10 +3758,10 @@ var ThreadMessages = ({ components, ...rest }) => {
3755
3758
  thread_exports.Messages,
3756
3759
  {
3757
3760
  components: {
3758
- UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _132 => _132.UserMessage]), () => ( user_message_default)),
3759
- EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _133 => _133.EditComposer]), () => ( edit_composer_default)),
3760
- AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _134 => _134.AssistantMessage]), () => ( assistant_message_default)),
3761
- SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _135 => _135.SystemMessage]), () => ( SystemMessage))
3761
+ UserMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _133 => _133.UserMessage]), () => ( user_message_default)),
3762
+ EditComposer: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _134 => _134.EditComposer]), () => ( edit_composer_default)),
3763
+ AssistantMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _135 => _135.AssistantMessage]), () => ( assistant_message_default)),
3764
+ SystemMessage: _nullishCoalesce(_optionalChain([components, 'optionalAccess', _136 => _136.SystemMessage]), () => ( SystemMessage))
3762
3765
  },
3763
3766
  ...rest
3764
3767
  }