@assistant-ui/react 0.5.2 → 0.5.3

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
@@ -3330,9 +3330,7 @@ var EdgeChatAdapter = class {
3330
3330
  signal: abortSignal
3331
3331
  });
3332
3332
  if (result.status !== 200) {
3333
- throw new Error(
3334
- `Edge runtime returned status ${result.status}: ${await result.text()}`
3335
- );
3333
+ throw new Error(`Status ${result.status}: ${await result.text()}`);
3336
3334
  }
3337
3335
  const stream = result.body.pipeThrough(new TextDecoderStream()).pipeThrough(chunkByLineStream()).pipeThrough(assistantDecoderStream()).pipeThrough(toolResultStream(config.tools)).pipeThrough(runResultStream());
3338
3336
  let update;
@@ -3563,6 +3561,213 @@ var useLocalRuntime = (adapter, options) => {
3563
3561
  return runtime;
3564
3562
  };
3565
3563
 
3564
+ // src/runtimes/external-store/ExternalStoreThreadRuntime.tsx
3565
+ import { create as create14 } from "zustand";
3566
+
3567
+ // src/runtimes/external-store/getExternalStoreMessage.tsx
3568
+ var symbolInnerMessage = Symbol("innerMessage");
3569
+ var getExternalStoreMessage = (message) => {
3570
+ return message[symbolInnerMessage];
3571
+ };
3572
+
3573
+ // src/runtimes/external-store/useExternalStoreSync.tsx
3574
+ import { useEffect as useEffect11, useMemo as useMemo3 } from "react";
3575
+
3576
+ // src/runtimes/external-store/ThreadMessageConverter.ts
3577
+ var ThreadMessageConverter = class {
3578
+ cache = /* @__PURE__ */ new WeakMap();
3579
+ convertMessages(messages, converter, keyMapper = (key) => key) {
3580
+ return messages.map((m, idx) => {
3581
+ const key = keyMapper(m);
3582
+ const cached = this.cache.get(key);
3583
+ const newMessage = converter(cached, m, idx);
3584
+ this.cache.set(key, newMessage);
3585
+ return newMessage;
3586
+ });
3587
+ }
3588
+ };
3589
+
3590
+ // src/runtimes/external-store/useExternalStoreSync.tsx
3591
+ var useExternalStoreSync = (adapter, updateData) => {
3592
+ const [converter, convertCallback] = useMemo3(() => {
3593
+ const converter2 = adapter.convertMessage ?? ((m) => m);
3594
+ const convertCallback2 = (cache, m, idx) => {
3595
+ if (cache) return cache;
3596
+ const newMessage = converter2(m, idx);
3597
+ newMessage[symbolInnerMessage] = m;
3598
+ return newMessage;
3599
+ };
3600
+ return [new ThreadMessageConverter(), convertCallback2];
3601
+ }, [adapter.convertMessage]);
3602
+ useEffect11(() => {
3603
+ updateData(
3604
+ adapter.isRunning ?? false,
3605
+ converter.convertMessages(adapter.messages, convertCallback)
3606
+ );
3607
+ }, [
3608
+ updateData,
3609
+ converter,
3610
+ convertCallback,
3611
+ adapter.messages,
3612
+ adapter.isRunning
3613
+ ]);
3614
+ };
3615
+
3616
+ // src/runtimes/external-store/ExternalStoreThreadRuntime.tsx
3617
+ var hasUpcomingMessage = (isRunning, messages) => {
3618
+ return isRunning && messages[messages.length - 1]?.role !== "assistant";
3619
+ };
3620
+ var ExternalStoreThreadRuntime = class {
3621
+ constructor(store) {
3622
+ this.store = store;
3623
+ this.useStore = create14(() => ({
3624
+ store
3625
+ }));
3626
+ }
3627
+ _subscriptions = /* @__PURE__ */ new Set();
3628
+ repository = new MessageRepository();
3629
+ assistantOptimisticId = null;
3630
+ useStore;
3631
+ get capabilities() {
3632
+ return {
3633
+ edit: this.store.onEdit !== void 0,
3634
+ reload: this.store.onReload !== void 0,
3635
+ cancel: this.store.onCancel !== void 0,
3636
+ copy: true
3637
+ };
3638
+ }
3639
+ messages = [];
3640
+ isRunning = false;
3641
+ getBranches(messageId) {
3642
+ return this.repository.getBranches(messageId);
3643
+ }
3644
+ switchToBranch(branchId) {
3645
+ this.repository.switchToBranch(branchId);
3646
+ this.updateMessages(this.repository.getMessages());
3647
+ }
3648
+ async append(message) {
3649
+ if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
3650
+ if (!this.store.onEdit)
3651
+ throw new Error("Runtime does not support editing messages.");
3652
+ await this.store.onEdit(message);
3653
+ } else {
3654
+ await this.store.onNew(message);
3655
+ }
3656
+ }
3657
+ async startRun(parentId) {
3658
+ if (!this.store.onReload)
3659
+ throw new Error("Runtime does not support reloading messages.");
3660
+ await this.store.onReload(parentId);
3661
+ }
3662
+ cancelRun() {
3663
+ if (!this.store.onCancel)
3664
+ throw new Error("Runtime does not support cancelling runs.");
3665
+ this.store.onCancel();
3666
+ if (this.assistantOptimisticId) {
3667
+ this.repository.deleteMessage(this.assistantOptimisticId);
3668
+ this.assistantOptimisticId = null;
3669
+ }
3670
+ let messages = this.repository.getMessages();
3671
+ setTimeout(() => {
3672
+ this.updateMessages(messages);
3673
+ }, 0);
3674
+ }
3675
+ subscribe(callback) {
3676
+ this._subscriptions.add(callback);
3677
+ return () => this._subscriptions.delete(callback);
3678
+ }
3679
+ updateMessages = (messages) => {
3680
+ this.store.setMessages?.(
3681
+ messages.flatMap(getExternalStoreMessage).filter((m) => m != null)
3682
+ );
3683
+ };
3684
+ onStoreUpdated() {
3685
+ if (this.useStore.getState().store !== this.store) {
3686
+ this.useStore.setState({ store: this.store });
3687
+ }
3688
+ }
3689
+ updateData = (isRunning, vm) => {
3690
+ for (let i = 0; i < vm.length; i++) {
3691
+ const message = vm[i];
3692
+ const parent = vm[i - 1];
3693
+ this.repository.addOrUpdateMessage(parent?.id ?? null, message);
3694
+ }
3695
+ if (this.assistantOptimisticId) {
3696
+ this.repository.deleteMessage(this.assistantOptimisticId);
3697
+ this.assistantOptimisticId = null;
3698
+ }
3699
+ if (hasUpcomingMessage(isRunning, vm)) {
3700
+ this.assistantOptimisticId = this.repository.appendOptimisticMessage(
3701
+ vm.at(-1)?.id ?? null,
3702
+ {
3703
+ role: "assistant",
3704
+ content: []
3705
+ }
3706
+ );
3707
+ }
3708
+ this.repository.resetHead(
3709
+ this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
3710
+ );
3711
+ this.messages = this.repository.getMessages();
3712
+ this.isRunning = isRunning;
3713
+ for (const callback of this._subscriptions) callback();
3714
+ };
3715
+ unstable_synchronizer = () => {
3716
+ const { store } = this.useStore();
3717
+ useExternalStoreSync(store, this.updateData);
3718
+ return null;
3719
+ };
3720
+ addToolResult(options) {
3721
+ if (!this.store.onAddToolResult)
3722
+ throw new Error("Runtime does not support tool results.");
3723
+ this.store.onAddToolResult(options);
3724
+ }
3725
+ };
3726
+
3727
+ // src/runtimes/external-store/ExternalStoreRuntime.tsx
3728
+ var ExternalStoreRuntime = class extends BaseAssistantRuntime {
3729
+ _proxyConfigProvider = new ProxyConfigProvider();
3730
+ constructor(store) {
3731
+ super(new ExternalStoreThreadRuntime(store));
3732
+ }
3733
+ set store(store) {
3734
+ this.thread.store = store;
3735
+ }
3736
+ onStoreUpdated() {
3737
+ return this.thread.onStoreUpdated();
3738
+ }
3739
+ getModelConfig() {
3740
+ return this._proxyConfigProvider.getModelConfig();
3741
+ }
3742
+ registerModelConfigProvider(provider) {
3743
+ return this._proxyConfigProvider.registerModelConfigProvider(provider);
3744
+ }
3745
+ switchToThread(threadId) {
3746
+ if (threadId) {
3747
+ if (!this.store.onSwitchThread)
3748
+ throw new Error("Runtime does not support switching threads.");
3749
+ return this.store.onSwitchThread(threadId);
3750
+ } else {
3751
+ if (!this.store.onNewThread)
3752
+ throw new Error("Runtime does not support switching to new threads.");
3753
+ return this.store.onNewThread();
3754
+ }
3755
+ }
3756
+ };
3757
+
3758
+ // src/runtimes/external-store/useExternalStoreRuntime.tsx
3759
+ import { useEffect as useEffect12, useInsertionEffect as useInsertionEffect4, useState as useState9 } from "react";
3760
+ var useExternalStoreRuntime = (store) => {
3761
+ const [runtime] = useState9(() => new ExternalStoreRuntime(store));
3762
+ useInsertionEffect4(() => {
3763
+ runtime.store = store;
3764
+ });
3765
+ useEffect12(() => {
3766
+ runtime.onStoreUpdated();
3767
+ });
3768
+ return runtime;
3769
+ };
3770
+
3566
3771
  // src/ui/thread-config.tsx
3567
3772
  import { createContext as createContext5, useContext as useContext5 } from "react";
3568
3773
  import { Fragment as Fragment3, jsx as jsx29 } from "react/jsx-runtime";
@@ -4263,6 +4468,7 @@ export {
4263
4468
  contentPart_exports as ContentPartPrimitive,
4264
4469
  EdgeChatAdapter,
4265
4470
  edit_composer_default as EditComposer,
4471
+ ExternalStoreRuntime,
4266
4472
  internal_exports as INTERNAL,
4267
4473
  message_exports as MessagePrimitive,
4268
4474
  thread_default as Thread,
@@ -4275,6 +4481,7 @@ export {
4275
4481
  fromCoreMessages,
4276
4482
  fromLanguageModelMessages,
4277
4483
  fromLanguageModelTools,
4484
+ getExternalStoreMessage,
4278
4485
  makeAssistantTool,
4279
4486
  makeAssistantToolUI,
4280
4487
  toCoreMessage,
@@ -4302,6 +4509,7 @@ export {
4302
4509
  useContentPartImage,
4303
4510
  useContentPartText,
4304
4511
  useEdgeRuntime,
4512
+ useExternalStoreRuntime,
4305
4513
  useLocalRuntime,
4306
4514
  useMessageContext,
4307
4515
  useMessageIf,