@assistant-ui/react 0.5.56 → 0.5.58

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.mjs CHANGED
@@ -1839,8 +1839,8 @@ var ExternalStoreRuntime = class extends BaseAssistantRuntime {
1839
1839
  if (!this.store.onSwitchToNewThread)
1840
1840
  throw new Error("Runtime does not support switching to new threads.");
1841
1841
  this.thread = new ExternalStoreThreadRuntime({
1842
- messages: [],
1843
- onNew: this.store.onNew
1842
+ ...this.store,
1843
+ messages: []
1844
1844
  });
1845
1845
  await this.store.onSwitchToNewThread();
1846
1846
  }
@@ -1849,8 +1849,9 @@ var ExternalStoreRuntime = class extends BaseAssistantRuntime {
1849
1849
  if (!this.store.onSwitchToThread)
1850
1850
  throw new Error("Runtime does not support switching threads.");
1851
1851
  this.thread = new ExternalStoreThreadRuntime({
1852
- messages: [],
1853
- onNew: this.store.onNew
1852
+ ...this.store,
1853
+ messages: []
1854
+ // ignore messages until rerender
1854
1855
  });
1855
1856
  this.store.onSwitchToThread(threadId);
1856
1857
  } else {
@@ -2344,19 +2345,40 @@ var AssistantRuntimeProviderImpl = ({ children, runtime }) => {
2344
2345
  var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
2345
2346
 
2346
2347
  // src/context/providers/TextContentPartProvider.tsx
2347
- import { useState as useState9 } from "react";
2348
+ import { useEffect as useEffect5, useState as useState9 } from "react";
2348
2349
  import { create as create11 } from "zustand";
2349
2350
  import { jsx as jsx9 } from "react/jsx-runtime";
2350
- var TextContentPartProvider = ({ children, text }) => {
2351
+ var COMPLETE_STATUS = {
2352
+ type: "complete"
2353
+ };
2354
+ var RUNNING_STATUS = {
2355
+ type: "running"
2356
+ };
2357
+ var TextContentPartProvider = ({ children, text, isRunning }) => {
2351
2358
  const [context] = useState9(() => {
2352
2359
  const useContentPart2 = create11(() => ({
2353
- status: { type: "complete" },
2360
+ status: isRunning ? RUNNING_STATUS : COMPLETE_STATUS,
2354
2361
  part: { type: "text", text }
2355
2362
  }));
2356
2363
  return {
2357
2364
  useContentPart: useContentPart2
2358
2365
  };
2359
2366
  });
2367
+ useEffect5(() => {
2368
+ const state = context.useContentPart.getState();
2369
+ const textUpdated = state.part.text !== text;
2370
+ const targetTextPart = textUpdated ? { type: "text", text } : state.part;
2371
+ const targetStatus = isRunning ? RUNNING_STATUS : COMPLETE_STATUS;
2372
+ const statusUpdated = state.status !== targetStatus;
2373
+ if (!textUpdated && !statusUpdated) return;
2374
+ writableStore(context.useContentPart).setState(
2375
+ {
2376
+ part: targetTextPart,
2377
+ status: targetStatus
2378
+ },
2379
+ true
2380
+ );
2381
+ }, [context, isRunning, text]);
2360
2382
  return /* @__PURE__ */ jsx9(ContentPartContext.Provider, { value: context, children });
2361
2383
  };
2362
2384
 
@@ -2451,11 +2473,11 @@ var useSwitchToNewThread = () => {
2451
2473
  };
2452
2474
 
2453
2475
  // src/model-config/useAssistantTool.tsx
2454
- import { useEffect as useEffect5 } from "react";
2476
+ import { useEffect as useEffect6 } from "react";
2455
2477
  var useAssistantTool = (tool) => {
2456
2478
  const assistantActionsStore = useAssistantActionsStore();
2457
2479
  const toolUIsStore = useToolUIsStore();
2458
- useEffect5(() => {
2480
+ useEffect6(() => {
2459
2481
  const { toolName, render, ...rest } = tool;
2460
2482
  const config = {
2461
2483
  tools: {
@@ -2484,10 +2506,10 @@ var makeAssistantTool = (tool) => {
2484
2506
  };
2485
2507
 
2486
2508
  // src/model-config/useAssistantToolUI.tsx
2487
- import { useEffect as useEffect6 } from "react";
2509
+ import { useEffect as useEffect7 } from "react";
2488
2510
  var useAssistantToolUI = (tool) => {
2489
2511
  const toolUIsStore = useToolUIsStore();
2490
- useEffect6(() => {
2512
+ useEffect7(() => {
2491
2513
  if (!tool) return;
2492
2514
  const { toolName, render } = tool;
2493
2515
  return toolUIsStore.getState().setToolUI(toolName, render);
@@ -2505,10 +2527,10 @@ var makeAssistantToolUI = (tool) => {
2505
2527
  };
2506
2528
 
2507
2529
  // src/model-config/useAssistantInstructions.tsx
2508
- import { useEffect as useEffect7 } from "react";
2530
+ import { useEffect as useEffect8 } from "react";
2509
2531
  var useAssistantInstructions = (instruction) => {
2510
2532
  const actionsStore = useAssistantActionsStore();
2511
- useEffect7(() => {
2533
+ useEffect8(() => {
2512
2534
  const config = {
2513
2535
  system: instruction
2514
2536
  };
@@ -3047,11 +3069,11 @@ import { composeEventHandlers as composeEventHandlers3 } from "@radix-ui/primiti
3047
3069
 
3048
3070
  // src/utils/hooks/useOnComposerFocus.tsx
3049
3071
  import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
3050
- import { useEffect as useEffect8 } from "react";
3072
+ import { useEffect as useEffect9 } from "react";
3051
3073
  var useOnComposerFocus = (callback) => {
3052
3074
  const callbackRef = useCallbackRef2(callback);
3053
3075
  const threadComposerStore = useThreadComposerStore();
3054
- useEffect8(() => {
3076
+ useEffect9(() => {
3055
3077
  return threadComposerStore.getState().onFocus(() => {
3056
3078
  callbackRef();
3057
3079
  });
@@ -3280,24 +3302,24 @@ MessagePrimitiveIf.displayName = "MessagePrimitive.If";
3280
3302
  import { memo as memo2 } from "react";
3281
3303
 
3282
3304
  // src/context/providers/ContentPartProvider.tsx
3283
- import { useEffect as useEffect9, useState as useState11 } from "react";
3305
+ import { useEffect as useEffect10, useState as useState11 } from "react";
3284
3306
  import { create as create12 } from "zustand";
3285
3307
  import { jsx as jsx20 } from "react/jsx-runtime";
3286
- var COMPLETE_STATUS = {
3308
+ var COMPLETE_STATUS2 = {
3287
3309
  type: "complete"
3288
3310
  };
3289
3311
  var toContentPartStatus = (message, partIndex, part) => {
3290
- if (message.role !== "assistant") return COMPLETE_STATUS;
3312
+ if (message.role !== "assistant") return COMPLETE_STATUS2;
3291
3313
  const isLastPart = partIndex === Math.max(0, message.content.length - 1);
3292
3314
  if (part.type !== "tool-call") {
3293
3315
  if ("reason" in message.status && message.status.reason === "tool-calls" && isLastPart)
3294
3316
  throw new Error(
3295
3317
  "Encountered unexpected requires-action status. This is likely an internal bug in assistant-ui."
3296
3318
  );
3297
- return isLastPart ? message.status : COMPLETE_STATUS;
3319
+ return isLastPart ? message.status : COMPLETE_STATUS2;
3298
3320
  }
3299
3321
  if (!!part.result) {
3300
- return COMPLETE_STATUS;
3322
+ return COMPLETE_STATUS2;
3301
3323
  }
3302
3324
  return message.status;
3303
3325
  };
@@ -3327,7 +3349,7 @@ var useContentPartContext2 = (partIndex) => {
3327
3349
  );
3328
3350
  return { useContentPart: useContentPart2 };
3329
3351
  });
3330
- useEffect9(() => {
3352
+ useEffect10(() => {
3331
3353
  const syncContentPart = (message) => {
3332
3354
  const newState = getContentPartState(
3333
3355
  message,
@@ -3534,7 +3556,7 @@ var {
3534
3556
  } = createContextStoreHook(useMessageAttachmentContext, "useAttachment");
3535
3557
 
3536
3558
  // src/context/providers/MessageAttachmentProvider.tsx
3537
- import { useEffect as useEffect10, useState as useState12 } from "react";
3559
+ import { useEffect as useEffect11, useState as useState12 } from "react";
3538
3560
  import { create as create13 } from "zustand";
3539
3561
  import { jsx as jsx24 } from "react/jsx-runtime";
3540
3562
  var getAttachment = ({ message }, useAttachment2, partIndex) => {
@@ -3556,7 +3578,7 @@ var useMessageAttachmentContext2 = (partIndex) => {
3556
3578
  return { type: "message", useAttachment: useAttachment2 };
3557
3579
  }
3558
3580
  );
3559
- useEffect10(() => {
3581
+ useEffect11(() => {
3560
3582
  const syncAttachment = (messageState) => {
3561
3583
  const newState = getAttachment(
3562
3584
  messageState,
@@ -3676,7 +3698,7 @@ import { Slot } from "@radix-ui/react-slot";
3676
3698
  import {
3677
3699
  forwardRef as forwardRef16,
3678
3700
  useCallback as useCallback17,
3679
- useEffect as useEffect11,
3701
+ useEffect as useEffect12,
3680
3702
  useRef as useRef4
3681
3703
  } from "react";
3682
3704
  import TextareaAutosize from "react-textarea-autosize";
@@ -3729,7 +3751,7 @@ var ComposerPrimitiveInput = forwardRef16(
3729
3751
  textareaRef.current.value.length
3730
3752
  );
3731
3753
  }, [autoFocusEnabled]);
3732
- useEffect11(() => focus(), [focus]);
3754
+ useEffect12(() => focus(), [focus]);
3733
3755
  useOnComposerFocus(() => {
3734
3756
  if (composerStore.getState().type === "thread") {
3735
3757
  focus();
@@ -3777,7 +3799,7 @@ var ComposerPrimitiveAddAttachment = createActionButton(
3777
3799
  import { memo as memo4 } from "react";
3778
3800
 
3779
3801
  // src/context/providers/ComposerAttachmentProvider.tsx
3780
- import { useEffect as useEffect12, useState as useState13 } from "react";
3802
+ import { useEffect as useEffect13, useState as useState13 } from "react";
3781
3803
  import { create as create14 } from "zustand";
3782
3804
  import { jsx as jsx29 } from "react/jsx-runtime";
3783
3805
  var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
@@ -3797,7 +3819,7 @@ var useComposerAttachmentContext2 = (partIndex) => {
3797
3819
  return { type: "composer", useAttachment: useAttachment2 };
3798
3820
  }
3799
3821
  );
3800
- useEffect12(() => {
3822
+ useEffect13(() => {
3801
3823
  const syncAttachment = (composer) => {
3802
3824
  const newState = getAttachment2(
3803
3825
  composer,
@@ -3970,11 +3992,11 @@ var useOnResizeContent = (callback) => {
3970
3992
 
3971
3993
  // src/utils/hooks/useOnScrollToBottom.tsx
3972
3994
  import { useCallbackRef as useCallbackRef4 } from "@radix-ui/react-use-callback-ref";
3973
- import { useEffect as useEffect13 } from "react";
3995
+ import { useEffect as useEffect14 } from "react";
3974
3996
  var useOnScrollToBottom = (callback) => {
3975
3997
  const callbackRef = useCallbackRef4(callback);
3976
3998
  const threadViewportStore = useThreadViewportStore();
3977
- useEffect13(() => {
3999
+ useEffect14(() => {
3978
4000
  return threadViewportStore.getState().onScrollToBottom(() => {
3979
4001
  callbackRef();
3980
4002
  });
@@ -4047,7 +4069,7 @@ ThreadPrimitiveViewport.displayName = "ThreadPrimitive.Viewport";
4047
4069
  import { memo as memo5 } from "react";
4048
4070
 
4049
4071
  // src/context/providers/MessageProvider.tsx
4050
- import { useEffect as useEffect14, useState as useState14 } from "react";
4072
+ import { useEffect as useEffect15, useState as useState14 } from "react";
4051
4073
  import { create as create17 } from "zustand";
4052
4074
 
4053
4075
  // src/context/stores/EditComposer.ts
@@ -4173,7 +4195,7 @@ var useMessageContext2 = (messageIndex) => {
4173
4195
  });
4174
4196
  return { useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
4175
4197
  });
4176
- useEffect14(() => {
4198
+ useEffect15(() => {
4177
4199
  const syncMessage = (thread) => {
4178
4200
  const newState = getMessageState(
4179
4201
  thread,