@assistant-ui/react 0.5.24 → 0.5.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts 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
  }