@assistant-ui/react 0.5.53 → 0.5.55
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{chunk-ZQNZLTZL.mjs → chunk-33TPUWEZ.mjs} +4 -3
- package/dist/{chunk-ZQNZLTZL.mjs.map → chunk-33TPUWEZ.mjs.map} +1 -1
- package/dist/{chunk-4LR4BB23.js → chunk-CWAZOKEW.js} +4 -3
- package/dist/{chunk-4LR4BB23.js.map → chunk-CWAZOKEW.js.map} +1 -1
- package/dist/edge.js +3 -2
- package/dist/edge.js.map +1 -1
- package/dist/edge.mjs +3 -2
- package/dist/edge.mjs.map +1 -1
- package/dist/index.d.mts +961 -71
- package/dist/index.d.ts +961 -71
- package/dist/index.js +549 -435
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +516 -402
- package/dist/index.mjs.map +1 -1
- package/dist/styles/index.css.map +1 -1
- package/dist/styles/tailwindcss/thread.css +3 -1
- package/package.json +7 -7
package/dist/index.mjs
CHANGED
@@ -10,7 +10,7 @@ import {
|
|
10
10
|
toLanguageModelMessages,
|
11
11
|
toLanguageModelTools,
|
12
12
|
toolResultStream
|
13
|
-
} from "./chunk-
|
13
|
+
} from "./chunk-33TPUWEZ.mjs";
|
14
14
|
import {
|
15
15
|
__export
|
16
16
|
} from "./chunk-BJPOCE4O.mjs";
|
@@ -22,52 +22,72 @@ import { memo } from "react";
|
|
22
22
|
import { useEffect as useEffect4, useInsertionEffect as useInsertionEffect3, useRef as useRef2, useState as useState8 } from "react";
|
23
23
|
|
24
24
|
// src/context/react/AssistantContext.ts
|
25
|
-
import { createContext
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
function
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
import { createContext } from "react";
|
26
|
+
|
27
|
+
// src/context/react/utils/createContextHook.ts
|
28
|
+
import { useContext } from "react";
|
29
|
+
function createContextHook(context, providerName) {
|
30
|
+
function useContextHook(options) {
|
31
|
+
const contextValue = useContext(context);
|
32
|
+
if (!options?.optional && !contextValue) {
|
33
|
+
throw new Error(`This component must be used within ${providerName}.`);
|
34
|
+
}
|
35
|
+
return contextValue;
|
36
|
+
}
|
37
|
+
return useContextHook;
|
36
38
|
}
|
37
39
|
|
38
|
-
// src/context/
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
40
|
+
// src/context/react/utils/createContextStoreHook.ts
|
41
|
+
function createContextStoreHook(contextHook, contextKey) {
|
42
|
+
function useStoreStoreHook(options) {
|
43
|
+
const context = contextHook(options);
|
44
|
+
if (!context) {
|
45
|
+
if (!options?.optional) {
|
46
|
+
throw new Error(`This component must be used within a ${contextKey}.`);
|
47
|
+
}
|
48
|
+
return null;
|
49
|
+
}
|
50
|
+
return context[contextKey];
|
46
51
|
}
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
function useStoreHook(param) {
|
53
|
+
let optional = false;
|
54
|
+
let selector;
|
55
|
+
if (typeof param === "function") {
|
56
|
+
selector = param;
|
57
|
+
} else if (param && typeof param === "object") {
|
58
|
+
optional = !!param.optional;
|
59
|
+
selector = param.selector;
|
60
|
+
}
|
61
|
+
const store = useStoreStoreHook({
|
62
|
+
optional
|
63
|
+
});
|
64
|
+
if (!store) return null;
|
65
|
+
return selector ? store(selector) : store();
|
52
66
|
}
|
53
|
-
|
67
|
+
return {
|
68
|
+
[contextKey]: useStoreHook,
|
69
|
+
[`${contextKey}Store`]: useStoreStoreHook
|
70
|
+
};
|
71
|
+
}
|
54
72
|
|
55
|
-
// src/context/
|
56
|
-
var
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
73
|
+
// src/context/react/AssistantContext.ts
|
74
|
+
var AssistantContext = createContext(
|
75
|
+
null
|
76
|
+
);
|
77
|
+
var useAssistantContext = createContextHook(
|
78
|
+
AssistantContext,
|
79
|
+
"AssistantRuntimeProvider"
|
80
|
+
);
|
81
|
+
var { useAssistantRuntime, useAssistantRuntimeStore } = createContextStoreHook(useAssistantContext, "useAssistantRuntime");
|
82
|
+
var { useToolUIs, useToolUIsStore } = createContextStoreHook(
|
83
|
+
useAssistantContext,
|
84
|
+
"useToolUIs"
|
85
|
+
);
|
86
|
+
var { useAssistantActions, useAssistantActionsStore } = createContextStoreHook(useAssistantContext, "useAssistantActions");
|
67
87
|
|
68
88
|
// src/context/stores/AssistantToolUIs.ts
|
69
|
-
import { create
|
70
|
-
var makeAssistantToolUIsStore = () =>
|
89
|
+
import { create } from "zustand";
|
90
|
+
var makeAssistantToolUIsStore = () => create((set) => {
|
71
91
|
const renderers = /* @__PURE__ */ new Map();
|
72
92
|
return Object.freeze({
|
73
93
|
getToolUI: (name) => {
|
@@ -101,24 +121,36 @@ var makeAssistantToolUIsStore = () => create2((set) => {
|
|
101
121
|
import { useEffect as useEffect3, useInsertionEffect as useInsertionEffect2, useState as useState7 } from "react";
|
102
122
|
|
103
123
|
// src/context/react/ThreadContext.ts
|
104
|
-
import { createContext as createContext2
|
124
|
+
import { createContext as createContext2 } from "react";
|
105
125
|
var ThreadContext = createContext2(null);
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
var
|
126
|
+
var useThreadContext = createContextHook(
|
127
|
+
ThreadContext,
|
128
|
+
"AssistantRuntimeProvider"
|
129
|
+
);
|
130
|
+
var { useThreadRuntime, useThreadRuntimeStore } = createContextStoreHook(useThreadContext, "useThreadRuntime");
|
131
|
+
var { useThread, useThreadStore } = createContextStoreHook(
|
132
|
+
useThreadContext,
|
133
|
+
"useThread"
|
134
|
+
);
|
135
|
+
var { useThreadMessages, useThreadMessagesStore } = createContextStoreHook(useThreadContext, "useThreadMessages");
|
136
|
+
var { useThreadActions, useThreadActionsStore } = createContextStoreHook(useThreadContext, "useThreadActions");
|
137
|
+
var {
|
138
|
+
useComposer: useThreadComposer,
|
139
|
+
useComposerStore: useThreadComposerStore
|
140
|
+
} = createContextStoreHook(useThreadContext, "useComposer");
|
141
|
+
var {
|
142
|
+
useViewport: useThreadViewport,
|
143
|
+
useViewportStore: useThreadViewportStore
|
144
|
+
} = createContextStoreHook(useThreadContext, "useViewport");
|
145
|
+
|
146
|
+
// src/context/stores/ThreadComposer.ts
|
147
|
+
import { create as create2 } from "zustand";
|
148
|
+
var makeThreadComposerStore = (useThreadRuntime2) => {
|
118
149
|
const focusListeners = /* @__PURE__ */ new Set();
|
119
|
-
return
|
120
|
-
const runtime =
|
150
|
+
return create2()((_, get) => {
|
151
|
+
const runtime = useThreadRuntime2.getState();
|
121
152
|
return {
|
153
|
+
type: "thread",
|
122
154
|
get value() {
|
123
155
|
return get().text;
|
124
156
|
},
|
@@ -127,27 +159,27 @@ var makeComposerStore = (useThreadRuntime) => {
|
|
127
159
|
},
|
128
160
|
attachments: runtime.composer.attachments,
|
129
161
|
addAttachment: (file) => {
|
130
|
-
|
162
|
+
useThreadRuntime2.getState().composer.addAttachment(file);
|
131
163
|
},
|
132
164
|
removeAttachment: (attachmentId) => {
|
133
|
-
|
165
|
+
useThreadRuntime2.getState().composer.removeAttachment(attachmentId);
|
134
166
|
},
|
135
167
|
reset: () => {
|
136
|
-
|
168
|
+
useThreadRuntime2.getState().composer.reset();
|
137
169
|
},
|
138
170
|
text: runtime.composer.text,
|
139
171
|
setText: (text) => {
|
140
|
-
|
172
|
+
useThreadRuntime2.getState().composer.setText(text);
|
141
173
|
},
|
142
174
|
canCancel: runtime.capabilities.cancel,
|
143
175
|
isEditing: true,
|
144
176
|
isEmpty: runtime.composer.isEmpty,
|
145
177
|
send: () => {
|
146
|
-
const runtime2 =
|
178
|
+
const runtime2 = useThreadRuntime2.getState();
|
147
179
|
runtime2.composer.send();
|
148
180
|
},
|
149
181
|
cancel: () => {
|
150
|
-
|
182
|
+
useThreadRuntime2.getState().cancelRun();
|
151
183
|
},
|
152
184
|
focus: () => {
|
153
185
|
for (const listener of focusListeners) {
|
@@ -165,7 +197,7 @@ var makeComposerStore = (useThreadRuntime) => {
|
|
165
197
|
};
|
166
198
|
|
167
199
|
// src/context/stores/Thread.ts
|
168
|
-
import { create as
|
200
|
+
import { create as create3 } from "zustand";
|
169
201
|
var getThreadStateFromRuntime = (runtime) => {
|
170
202
|
const lastMessage = runtime.messages.at(-1);
|
171
203
|
return Object.freeze({
|
@@ -177,14 +209,14 @@ var getThreadStateFromRuntime = (runtime) => {
|
|
177
209
|
};
|
178
210
|
var makeThreadStore = (runtimeRef) => {
|
179
211
|
const runtime = runtimeRef.getState();
|
180
|
-
return
|
212
|
+
return create3(() => getThreadStateFromRuntime(runtime));
|
181
213
|
};
|
182
214
|
|
183
215
|
// src/context/stores/ThreadViewport.tsx
|
184
|
-
import { create as
|
216
|
+
import { create as create4 } from "zustand";
|
185
217
|
var makeThreadViewportStore = () => {
|
186
218
|
const scrollToBottomListeners = /* @__PURE__ */ new Set();
|
187
|
-
return
|
219
|
+
return create4(() => ({
|
188
220
|
isAtBottom: true,
|
189
221
|
scrollToBottom: () => {
|
190
222
|
for (const listener of scrollToBottomListeners) {
|
@@ -201,9 +233,9 @@ var makeThreadViewportStore = () => {
|
|
201
233
|
};
|
202
234
|
|
203
235
|
// src/context/stores/ThreadActions.ts
|
204
|
-
import { create as
|
236
|
+
import { create as create5 } from "zustand";
|
205
237
|
var makeThreadActionStore = (runtimeStore) => {
|
206
|
-
return
|
238
|
+
return create5(
|
207
239
|
() => Object.freeze({
|
208
240
|
getBranches: (messageId) => runtimeStore.getState().getBranches(messageId),
|
209
241
|
switchToBranch: (branchId) => runtimeStore.getState().switchToBranch(branchId),
|
@@ -217,15 +249,15 @@ var makeThreadActionStore = (runtimeStore) => {
|
|
217
249
|
};
|
218
250
|
|
219
251
|
// src/context/stores/ThreadMessages.ts
|
220
|
-
import { create as
|
252
|
+
import { create as create6 } from "zustand";
|
221
253
|
var makeThreadMessagesStore = (runtimeRef) => {
|
222
|
-
return
|
254
|
+
return create6(() => runtimeRef.getState().messages);
|
223
255
|
};
|
224
256
|
|
225
257
|
// src/context/stores/ThreadRuntime.tsx
|
226
|
-
import { create as
|
258
|
+
import { create as create7 } from "zustand";
|
227
259
|
var makeThreadRuntimeStore = (runtime) => {
|
228
|
-
return
|
260
|
+
return create7(() => runtime);
|
229
261
|
};
|
230
262
|
|
231
263
|
// src/runtimes/core/subscribeToMainThread.ts
|
@@ -358,6 +390,20 @@ var ThreadRuntimeComposer = class {
|
|
358
390
|
}
|
359
391
|
};
|
360
392
|
|
393
|
+
// src/utils/ProxyConfigProvider.ts
|
394
|
+
var ProxyConfigProvider = class {
|
395
|
+
_providers = /* @__PURE__ */ new Set();
|
396
|
+
getModelConfig() {
|
397
|
+
return mergeModelConfigs(this._providers);
|
398
|
+
}
|
399
|
+
registerModelConfigProvider(provider) {
|
400
|
+
this._providers.add(provider);
|
401
|
+
return () => {
|
402
|
+
this._providers.delete(provider);
|
403
|
+
};
|
404
|
+
}
|
405
|
+
};
|
406
|
+
|
361
407
|
// src/utils/idUtils.tsx
|
362
408
|
import { customAlphabet } from "nanoid/non-secure";
|
363
409
|
var generateId = customAlphabet(
|
@@ -609,26 +655,43 @@ var MessageRepository = class {
|
|
609
655
|
|
610
656
|
// src/utils/smooth/useSmooth.tsx
|
611
657
|
import { useEffect, useMemo, useRef, useState as useState2 } from "react";
|
658
|
+
import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
|
612
659
|
|
613
660
|
// src/utils/smooth/SmoothContext.tsx
|
614
661
|
import {
|
615
|
-
createContext as
|
662
|
+
createContext as createContext4,
|
616
663
|
forwardRef,
|
617
|
-
useContext as
|
664
|
+
useContext as useContext2,
|
618
665
|
useState
|
619
666
|
} from "react";
|
620
|
-
import { create as
|
667
|
+
import { create as create8 } from "zustand";
|
668
|
+
|
669
|
+
// src/context/react/ContentPartContext.ts
|
670
|
+
import { createContext as createContext3 } from "react";
|
671
|
+
var ContentPartContext = createContext3(
|
672
|
+
null
|
673
|
+
);
|
674
|
+
var useContentPartContext = createContextHook(
|
675
|
+
ContentPartContext,
|
676
|
+
"a component passed to <MessagePrimitive.Content components={...}>"
|
677
|
+
);
|
678
|
+
var { useContentPart, useContentPartStore } = createContextStoreHook(
|
679
|
+
useContentPartContext,
|
680
|
+
"useContentPart"
|
681
|
+
);
|
682
|
+
|
683
|
+
// src/utils/smooth/SmoothContext.tsx
|
621
684
|
import { jsx } from "react/jsx-runtime";
|
622
|
-
var SmoothContext =
|
685
|
+
var SmoothContext = createContext4(null);
|
623
686
|
var makeSmoothContext = (initialState) => {
|
624
|
-
const useSmoothStatus2 =
|
687
|
+
const useSmoothStatus2 = create8(() => initialState);
|
625
688
|
return { useSmoothStatus: useSmoothStatus2 };
|
626
689
|
};
|
627
690
|
var SmoothContextProvider = ({ children }) => {
|
628
691
|
const outer = useSmoothContext({ optional: true });
|
629
|
-
const
|
692
|
+
const contentPartStore = useContentPartStore();
|
630
693
|
const [context] = useState(
|
631
|
-
() => makeSmoothContext(
|
694
|
+
() => makeSmoothContext(contentPartStore.getState().status)
|
632
695
|
);
|
633
696
|
if (outer) return children;
|
634
697
|
return /* @__PURE__ */ jsx(SmoothContext.Provider, { value: context, children });
|
@@ -641,20 +704,24 @@ var withSmoothContextProvider = (Component) => {
|
|
641
704
|
return Wrapped;
|
642
705
|
};
|
643
706
|
function useSmoothContext(options) {
|
644
|
-
const context =
|
707
|
+
const context = useContext2(SmoothContext);
|
645
708
|
if (!options?.optional && !context)
|
646
709
|
throw new Error(
|
647
710
|
"This component must be used within a SmoothContextProvider."
|
648
711
|
);
|
649
712
|
return context;
|
650
713
|
}
|
651
|
-
var useSmoothStatus = (
|
652
|
-
|
653
|
-
|
714
|
+
var { useSmoothStatus, useSmoothStatusStore } = createContextStoreHook(
|
715
|
+
useSmoothContext,
|
716
|
+
"useSmoothStatus"
|
717
|
+
);
|
718
|
+
|
719
|
+
// src/context/ReadonlyStore.ts
|
720
|
+
var writableStore = (store) => {
|
721
|
+
return store;
|
654
722
|
};
|
655
723
|
|
656
724
|
// src/utils/smooth/useSmooth.tsx
|
657
|
-
import { useCallbackRef } from "@radix-ui/react-use-callback-ref";
|
658
725
|
var TextStreamAnimator = class {
|
659
726
|
constructor(currentText, setText) {
|
660
727
|
this.currentText = currentText;
|
@@ -703,21 +770,28 @@ var SMOOTH_STATUS = Object.freeze({
|
|
703
770
|
type: "running"
|
704
771
|
});
|
705
772
|
var useSmooth = (state, smooth = false) => {
|
706
|
-
const { useSmoothStatus: useSmoothStatus2 } = useSmoothContext({ optional: true }) ?? {};
|
707
773
|
const {
|
708
774
|
part: { text }
|
709
775
|
} = state;
|
710
|
-
const { useMessage } = useMessageContext();
|
711
776
|
const id = useMessage((m) => m.message.id);
|
712
777
|
const idRef = useRef(id);
|
713
778
|
const [displayedText, setDisplayedText] = useState2(text);
|
779
|
+
const smoothStatusStore = useSmoothStatusStore({ optional: true });
|
714
780
|
const setText = useCallbackRef((text2) => {
|
715
781
|
setDisplayedText(text2);
|
716
|
-
|
782
|
+
if (smoothStatusStore) {
|
783
|
+
writableStore(smoothStatusStore).setState(
|
784
|
+
text2 !== state.part.text ? SMOOTH_STATUS : state.status
|
785
|
+
);
|
786
|
+
}
|
717
787
|
});
|
718
788
|
useEffect(() => {
|
719
|
-
|
720
|
-
|
789
|
+
if (smoothStatusStore) {
|
790
|
+
writableStore(smoothStatusStore).setState(
|
791
|
+
text !== state.part.text ? SMOOTH_STATUS : state.status
|
792
|
+
);
|
793
|
+
}
|
794
|
+
}, [smoothStatusStore, text, displayedText, state.status, state.part.text]);
|
721
795
|
const [animatorRef] = useState2(
|
722
796
|
new TextStreamAnimator(text, setText)
|
723
797
|
);
|
@@ -1350,7 +1424,9 @@ var LocalThreadRuntime = class {
|
|
1350
1424
|
toolCallId,
|
1351
1425
|
result
|
1352
1426
|
}) {
|
1353
|
-
|
1427
|
+
const messageData = this.repository.getMessage(messageId);
|
1428
|
+
const { parentId } = messageData;
|
1429
|
+
let { message } = messageData;
|
1354
1430
|
if (message.role !== "assistant")
|
1355
1431
|
throw new Error("Tried to add tool result to non-assistant message");
|
1356
1432
|
let added = false;
|
@@ -1421,10 +1497,7 @@ var LocalRuntime = class extends BaseAssistantRuntime {
|
|
1421
1497
|
registerModelConfigProvider(provider) {
|
1422
1498
|
return this._proxyConfigProvider.registerModelConfigProvider(provider);
|
1423
1499
|
}
|
1424
|
-
|
1425
|
-
if (threadId) {
|
1426
|
-
throw new Error("LocalRuntime does not yet support switching threads");
|
1427
|
-
}
|
1500
|
+
switchToNewThread() {
|
1428
1501
|
const { initialMessages, ...options } = this.thread.options;
|
1429
1502
|
return this.thread = new LocalThreadRuntime(
|
1430
1503
|
this._proxyConfigProvider,
|
@@ -1432,6 +1505,12 @@ var LocalRuntime = class extends BaseAssistantRuntime {
|
|
1432
1505
|
options
|
1433
1506
|
);
|
1434
1507
|
}
|
1508
|
+
switchToThread(threadId) {
|
1509
|
+
if (threadId !== null) {
|
1510
|
+
throw new Error("LocalRuntime does not yet support switching threads");
|
1511
|
+
}
|
1512
|
+
this.switchToNewThread();
|
1513
|
+
}
|
1435
1514
|
reset({
|
1436
1515
|
initialMessages
|
1437
1516
|
} = {}) {
|
@@ -1755,8 +1834,17 @@ var ExternalStoreRuntime = class extends BaseAssistantRuntime {
|
|
1755
1834
|
registerModelConfigProvider(provider) {
|
1756
1835
|
return this._proxyConfigProvider.registerModelConfigProvider(provider);
|
1757
1836
|
}
|
1837
|
+
async switchToNewThread() {
|
1838
|
+
if (!this.store.onNewThread)
|
1839
|
+
throw new Error("Runtime does not support switching to new threads.");
|
1840
|
+
this.thread = new ExternalStoreThreadRuntime({
|
1841
|
+
messages: [],
|
1842
|
+
onNew: this.store.onNew
|
1843
|
+
});
|
1844
|
+
await this.store.onNewThread();
|
1845
|
+
}
|
1758
1846
|
async switchToThread(threadId) {
|
1759
|
-
if (threadId) {
|
1847
|
+
if (threadId !== null) {
|
1760
1848
|
if (!this.store.onSwitchThread)
|
1761
1849
|
throw new Error("Runtime does not support switching threads.");
|
1762
1850
|
this.thread = new ExternalStoreThreadRuntime({
|
@@ -1765,13 +1853,7 @@ var ExternalStoreRuntime = class extends BaseAssistantRuntime {
|
|
1765
1853
|
});
|
1766
1854
|
this.store.onSwitchThread(threadId);
|
1767
1855
|
} else {
|
1768
|
-
|
1769
|
-
throw new Error("Runtime does not support switching to new threads.");
|
1770
|
-
this.thread = new ExternalStoreThreadRuntime({
|
1771
|
-
messages: [],
|
1772
|
-
onNew: this.store.onNew
|
1773
|
-
});
|
1774
|
-
await this.store.onNewThread();
|
1856
|
+
this.switchToNewThread();
|
1775
1857
|
}
|
1776
1858
|
}
|
1777
1859
|
};
|
@@ -2146,11 +2228,6 @@ var CompositeAttachmentAdapter = class {
|
|
2146
2228
|
}
|
2147
2229
|
};
|
2148
2230
|
|
2149
|
-
// src/context/ReadonlyStore.ts
|
2150
|
-
var writableStore = (store) => {
|
2151
|
-
return store;
|
2152
|
-
};
|
2153
|
-
|
2154
2231
|
// src/context/providers/ThreadProvider.tsx
|
2155
2232
|
import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
|
2156
2233
|
var ThreadProvider = ({
|
@@ -2158,18 +2235,18 @@ var ThreadProvider = ({
|
|
2158
2235
|
provider
|
2159
2236
|
}) => {
|
2160
2237
|
const [context] = useState7(() => {
|
2161
|
-
const
|
2162
|
-
const
|
2163
|
-
const
|
2164
|
-
const
|
2238
|
+
const useThreadRuntime2 = makeThreadRuntimeStore(provider.thread);
|
2239
|
+
const useThread2 = makeThreadStore(useThreadRuntime2);
|
2240
|
+
const useThreadMessages2 = makeThreadMessagesStore(useThreadRuntime2);
|
2241
|
+
const useThreadActions2 = makeThreadActionStore(useThreadRuntime2);
|
2165
2242
|
const useViewport = makeThreadViewportStore();
|
2166
|
-
const
|
2243
|
+
const useComposer2 = makeThreadComposerStore(useThreadRuntime2);
|
2167
2244
|
return {
|
2168
|
-
useThread,
|
2169
|
-
useThreadRuntime,
|
2170
|
-
useThreadMessages,
|
2171
|
-
useThreadActions,
|
2172
|
-
useComposer,
|
2245
|
+
useThread: useThread2,
|
2246
|
+
useThreadRuntime: useThreadRuntime2,
|
2247
|
+
useThreadMessages: useThreadMessages2,
|
2248
|
+
useThreadActions: useThreadActions2,
|
2249
|
+
useComposer: useComposer2,
|
2173
2250
|
useViewport
|
2174
2251
|
};
|
2175
2252
|
});
|
@@ -2217,18 +2294,19 @@ var ThreadProvider = ({
|
|
2217
2294
|
};
|
2218
2295
|
|
2219
2296
|
// src/context/stores/AssistantActions.tsx
|
2220
|
-
import { create as
|
2221
|
-
var makeAssistantActionsStore = (runtimeRef) =>
|
2297
|
+
import { create as create9 } from "zustand";
|
2298
|
+
var makeAssistantActionsStore = (runtimeRef) => create9(
|
2222
2299
|
() => Object.freeze({
|
2223
2300
|
switchToThread: () => runtimeRef.current.switchToThread(null),
|
2301
|
+
registerModelConfigProvider: (provider) => runtimeRef.current.registerModelConfigProvider(provider),
|
2224
2302
|
getRuntime: () => runtimeRef.current
|
2225
2303
|
})
|
2226
2304
|
);
|
2227
2305
|
|
2228
2306
|
// src/context/stores/AssistantRuntime.tsx
|
2229
|
-
import { create as
|
2307
|
+
import { create as create10 } from "zustand";
|
2230
2308
|
var makeAssistantRuntimeStore = (runtime) => {
|
2231
|
-
return
|
2309
|
+
return create10(() => runtime);
|
2232
2310
|
};
|
2233
2311
|
|
2234
2312
|
// src/context/providers/AssistantProvider.tsx
|
@@ -2239,21 +2317,15 @@ var AssistantProvider = ({ children, runtime }) => {
|
|
2239
2317
|
runtimeRef.current = runtime;
|
2240
2318
|
});
|
2241
2319
|
const [context] = useState8(() => {
|
2242
|
-
const
|
2243
|
-
const
|
2244
|
-
const
|
2245
|
-
const useAssistantActions = makeAssistantActionsStore(runtimeRef);
|
2320
|
+
const useAssistantRuntime2 = makeAssistantRuntimeStore(runtime);
|
2321
|
+
const useToolUIs2 = makeAssistantToolUIsStore();
|
2322
|
+
const useAssistantActions2 = makeAssistantActionsStore(runtimeRef);
|
2246
2323
|
return {
|
2247
|
-
|
2248
|
-
|
2249
|
-
|
2250
|
-
useAssistantActions
|
2324
|
+
useToolUIs: useToolUIs2,
|
2325
|
+
useAssistantRuntime: useAssistantRuntime2,
|
2326
|
+
useAssistantActions: useAssistantActions2
|
2251
2327
|
};
|
2252
2328
|
});
|
2253
|
-
const getModelConfig = context.useModelConfig();
|
2254
|
-
useEffect4(() => {
|
2255
|
-
return runtime.registerModelConfigProvider(getModelConfig);
|
2256
|
-
}, [runtime, getModelConfig]);
|
2257
2329
|
useEffect4(
|
2258
2330
|
() => writableStore(context.useAssistantRuntime).setState(runtime, true),
|
2259
2331
|
[runtime, context]
|
@@ -2270,93 +2342,95 @@ var AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
|
2270
2342
|
|
2271
2343
|
// src/context/providers/TextContentPartProvider.tsx
|
2272
2344
|
import { useState as useState9 } from "react";
|
2273
|
-
import { create as
|
2274
|
-
|
2275
|
-
// src/context/react/ContentPartContext.ts
|
2276
|
-
import { createContext as createContext4, useContext as useContext4 } from "react";
|
2277
|
-
var ContentPartContext = createContext4(
|
2278
|
-
null
|
2279
|
-
);
|
2280
|
-
function useContentPartContext(options) {
|
2281
|
-
const context = useContext4(ContentPartContext);
|
2282
|
-
if (!options?.optional && !context)
|
2283
|
-
throw new Error(
|
2284
|
-
"This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >."
|
2285
|
-
);
|
2286
|
-
return context;
|
2287
|
-
}
|
2288
|
-
|
2289
|
-
// src/context/providers/TextContentPartProvider.tsx
|
2345
|
+
import { create as create11 } from "zustand";
|
2290
2346
|
import { jsx as jsx9 } from "react/jsx-runtime";
|
2291
2347
|
var TextContentPartProvider = ({ children, text }) => {
|
2292
2348
|
const [context] = useState9(() => {
|
2293
|
-
const
|
2349
|
+
const useContentPart2 = create11(() => ({
|
2294
2350
|
status: { type: "complete" },
|
2295
2351
|
part: { type: "text", text }
|
2296
2352
|
}));
|
2297
2353
|
return {
|
2298
|
-
useContentPart
|
2354
|
+
useContentPart: useContentPart2
|
2299
2355
|
};
|
2300
2356
|
});
|
2301
2357
|
return /* @__PURE__ */ jsx9(ContentPartContext.Provider, { value: context, children });
|
2302
2358
|
};
|
2303
2359
|
|
2304
|
-
// src/context/react/ComposerContext.ts
|
2305
|
-
import { useMemo as useMemo3 } from "react";
|
2306
|
-
|
2307
2360
|
// src/context/react/MessageContext.ts
|
2308
|
-
import { createContext as createContext5
|
2361
|
+
import { createContext as createContext5 } from "react";
|
2309
2362
|
var MessageContext = createContext5(null);
|
2310
|
-
|
2311
|
-
|
2312
|
-
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2363
|
+
var useMessageContext = createContextHook(
|
2364
|
+
MessageContext,
|
2365
|
+
"a component passed to <ThreadPrimitive.Messages components={...} />"
|
2366
|
+
);
|
2367
|
+
var { useMessage, useMessageStore } = createContextStoreHook(
|
2368
|
+
useMessageContext,
|
2369
|
+
"useMessage"
|
2370
|
+
);
|
2371
|
+
var { useMessageUtils, useMessageUtilsStore } = createContextStoreHook(
|
2372
|
+
useMessageContext,
|
2373
|
+
"useMessageUtils"
|
2374
|
+
);
|
2375
|
+
var { useEditComposer, useEditComposerStore } = createContextStoreHook(
|
2376
|
+
useMessageContext,
|
2377
|
+
"useEditComposer"
|
2378
|
+
);
|
2318
2379
|
|
2319
2380
|
// src/context/react/ComposerContext.ts
|
2381
|
+
import { useMemo as useMemo3 } from "react";
|
2320
2382
|
var useComposerContext = () => {
|
2321
|
-
const { useComposer } = useThreadContext();
|
2322
|
-
const { useEditComposer } = useMessageContext({ optional: true }) ?? {};
|
2383
|
+
const { useComposer: useComposer2 } = useThreadContext();
|
2384
|
+
const { useEditComposer: useEditComposer2 } = useMessageContext({ optional: true }) ?? {};
|
2323
2385
|
return useMemo3(
|
2324
2386
|
() => ({
|
2325
|
-
useComposer:
|
2326
|
-
type:
|
2387
|
+
useComposer: useEditComposer2 ?? useComposer2,
|
2388
|
+
type: useEditComposer2 ? "edit" : "new"
|
2327
2389
|
}),
|
2328
|
-
[
|
2390
|
+
[useEditComposer2, useComposer2]
|
2329
2391
|
);
|
2330
2392
|
};
|
2393
|
+
var { useComposer, useComposerStore } = createContextStoreHook(
|
2394
|
+
useComposerContext,
|
2395
|
+
"useComposer"
|
2396
|
+
);
|
2331
2397
|
|
2332
2398
|
// src/hooks/useAppendMessage.tsx
|
2333
2399
|
import { useCallback } from "react";
|
2334
|
-
var toAppendMessage = (
|
2400
|
+
var toAppendMessage = (useThreadMessages2, message) => {
|
2335
2401
|
if (typeof message === "string") {
|
2336
2402
|
return {
|
2337
|
-
parentId:
|
2403
|
+
parentId: useThreadMessages2.getState().at(-1)?.id ?? null,
|
2338
2404
|
role: "user",
|
2339
2405
|
content: [{ type: "text", text: message }],
|
2340
2406
|
attachments: []
|
2341
2407
|
};
|
2342
2408
|
}
|
2343
2409
|
return {
|
2344
|
-
parentId: message.parentId ??
|
2410
|
+
parentId: message.parentId ?? useThreadMessages2.getState().at(-1)?.id ?? null,
|
2345
2411
|
role: message.role ?? "user",
|
2346
2412
|
content: message.content,
|
2347
2413
|
attachments: message.attachments ?? []
|
2348
2414
|
};
|
2349
2415
|
};
|
2350
2416
|
var useAppendMessage = () => {
|
2351
|
-
const
|
2417
|
+
const threadMessagesStore = useThreadMessagesStore();
|
2418
|
+
const threadActionsStore = useThreadActionsStore();
|
2419
|
+
const threadViewportStore = useThreadViewportStore();
|
2420
|
+
const threadComposerStore = useThreadComposerStore();
|
2352
2421
|
const append = useCallback(
|
2353
2422
|
(message) => {
|
2354
|
-
const appendMessage = toAppendMessage(
|
2355
|
-
|
2356
|
-
|
2357
|
-
|
2423
|
+
const appendMessage = toAppendMessage(threadMessagesStore, message);
|
2424
|
+
threadActionsStore.getState().append(appendMessage);
|
2425
|
+
threadViewportStore.getState().scrollToBottom();
|
2426
|
+
threadComposerStore.getState().focus();
|
2358
2427
|
},
|
2359
|
-
[
|
2428
|
+
[
|
2429
|
+
threadMessagesStore,
|
2430
|
+
threadActionsStore,
|
2431
|
+
threadViewportStore,
|
2432
|
+
threadComposerStore
|
2433
|
+
]
|
2360
2434
|
);
|
2361
2435
|
return append;
|
2362
2436
|
};
|
@@ -2364,23 +2438,20 @@ var useAppendMessage = () => {
|
|
2364
2438
|
// src/hooks/useSwitchToNewThread.tsx
|
2365
2439
|
import { useCallback as useCallback2 } from "react";
|
2366
2440
|
var useSwitchToNewThread = () => {
|
2367
|
-
const
|
2368
|
-
const
|
2441
|
+
const assistantActionsStore = useAssistantActionsStore();
|
2442
|
+
const threadComposerStore = useThreadComposerStore();
|
2369
2443
|
const switchToNewThread = useCallback2(() => {
|
2370
|
-
|
2371
|
-
|
2372
|
-
}, [
|
2444
|
+
assistantActionsStore.getState().switchToThread(null);
|
2445
|
+
threadComposerStore.getState().focus();
|
2446
|
+
}, [assistantActionsStore, threadComposerStore]);
|
2373
2447
|
return switchToNewThread;
|
2374
2448
|
};
|
2375
2449
|
|
2376
2450
|
// src/model-config/useAssistantTool.tsx
|
2377
2451
|
import { useEffect as useEffect5 } from "react";
|
2378
2452
|
var useAssistantTool = (tool) => {
|
2379
|
-
const
|
2380
|
-
const
|
2381
|
-
(s) => s.registerModelConfigProvider
|
2382
|
-
);
|
2383
|
-
const setToolUI = useToolUIs((s) => s.setToolUI);
|
2453
|
+
const assistantActionsStore = useAssistantActionsStore();
|
2454
|
+
const toolUIsStore = useToolUIsStore();
|
2384
2455
|
useEffect5(() => {
|
2385
2456
|
const { toolName, render, ...rest } = tool;
|
2386
2457
|
const config = {
|
@@ -2388,15 +2459,15 @@ var useAssistantTool = (tool) => {
|
|
2388
2459
|
[tool.toolName]: rest
|
2389
2460
|
}
|
2390
2461
|
};
|
2391
|
-
const unsub1 = registerModelConfigProvider({
|
2462
|
+
const unsub1 = assistantActionsStore.getState().registerModelConfigProvider({
|
2392
2463
|
getModelConfig: () => config
|
2393
2464
|
});
|
2394
|
-
const unsub2 = render ? setToolUI(toolName, render) : void 0;
|
2465
|
+
const unsub2 = render ? toolUIsStore.getState().setToolUI(toolName, render) : void 0;
|
2395
2466
|
return () => {
|
2396
2467
|
unsub1();
|
2397
2468
|
unsub2?.();
|
2398
2469
|
};
|
2399
|
-
}, [
|
2470
|
+
}, [assistantActionsStore, toolUIsStore, tool]);
|
2400
2471
|
};
|
2401
2472
|
|
2402
2473
|
// src/model-config/makeAssistantTool.tsx
|
@@ -2412,13 +2483,12 @@ var makeAssistantTool = (tool) => {
|
|
2412
2483
|
// src/model-config/useAssistantToolUI.tsx
|
2413
2484
|
import { useEffect as useEffect6 } from "react";
|
2414
2485
|
var useAssistantToolUI = (tool) => {
|
2415
|
-
const
|
2416
|
-
const setToolUI = useToolUIs((s) => s.setToolUI);
|
2486
|
+
const toolUIsStore = useToolUIsStore();
|
2417
2487
|
useEffect6(() => {
|
2418
2488
|
if (!tool) return;
|
2419
2489
|
const { toolName, render } = tool;
|
2420
|
-
return setToolUI(toolName, render);
|
2421
|
-
}, [
|
2490
|
+
return toolUIsStore.getState().setToolUI(toolName, render);
|
2491
|
+
}, [toolUIsStore, tool]);
|
2422
2492
|
};
|
2423
2493
|
|
2424
2494
|
// src/model-config/makeAssistantToolUI.tsx
|
@@ -2434,16 +2504,13 @@ var makeAssistantToolUI = (tool) => {
|
|
2434
2504
|
// src/model-config/useAssistantInstructions.tsx
|
2435
2505
|
import { useEffect as useEffect7 } from "react";
|
2436
2506
|
var useAssistantInstructions = (instruction) => {
|
2437
|
-
const
|
2438
|
-
const registerModelConfigProvider = useModelConfig(
|
2439
|
-
(s) => s.registerModelConfigProvider
|
2440
|
-
);
|
2507
|
+
const runtimeStore = useAssistantRuntimeStore();
|
2441
2508
|
useEffect7(() => {
|
2442
2509
|
const config = {
|
2443
2510
|
system: instruction
|
2444
2511
|
};
|
2445
|
-
return registerModelConfigProvider({ getModelConfig: () => config });
|
2446
|
-
}, [
|
2512
|
+
return runtimeStore.getState().registerModelConfigProvider({ getModelConfig: () => config });
|
2513
|
+
}, [runtimeStore, instruction]);
|
2447
2514
|
};
|
2448
2515
|
|
2449
2516
|
// src/primitive-hooks/actionBar/useActionBarCopy.tsx
|
@@ -2479,23 +2546,25 @@ var useCombinedStore = (stores, selector) => {
|
|
2479
2546
|
var useActionBarCopy = ({
|
2480
2547
|
copiedDuration = 3e3
|
2481
2548
|
} = {}) => {
|
2482
|
-
const
|
2549
|
+
const messageStore = useMessageStore();
|
2550
|
+
const messageUtilsStore = useMessageUtilsStore();
|
2551
|
+
const editComposerStore = useEditComposerStore();
|
2483
2552
|
const hasCopyableContent = useCombinedStore(
|
2484
|
-
[
|
2553
|
+
[messageStore, editComposerStore],
|
2485
2554
|
({ message }, c) => {
|
2486
2555
|
return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
|
2487
2556
|
}
|
2488
2557
|
);
|
2489
2558
|
const callback = useCallback3(() => {
|
2490
|
-
const { message } =
|
2491
|
-
const { setIsCopied } =
|
2492
|
-
const { isEditing, text: composerValue } =
|
2559
|
+
const { message } = messageStore.getState();
|
2560
|
+
const { setIsCopied } = messageUtilsStore.getState();
|
2561
|
+
const { isEditing, text: composerValue } = editComposerStore.getState();
|
2493
2562
|
const valueToCopy = isEditing ? composerValue : getThreadMessageText(message);
|
2494
2563
|
navigator.clipboard.writeText(valueToCopy).then(() => {
|
2495
2564
|
setIsCopied(true);
|
2496
2565
|
setTimeout(() => setIsCopied(false), copiedDuration);
|
2497
2566
|
});
|
2498
|
-
}, [
|
2567
|
+
}, [messageStore, messageUtilsStore, editComposerStore, copiedDuration]);
|
2499
2568
|
if (!hasCopyableContent) return null;
|
2500
2569
|
return callback;
|
2501
2570
|
};
|
@@ -2503,12 +2572,12 @@ var useActionBarCopy = ({
|
|
2503
2572
|
// src/primitive-hooks/actionBar/useActionBarEdit.tsx
|
2504
2573
|
import { useCallback as useCallback4 } from "react";
|
2505
2574
|
var useActionBarEdit = () => {
|
2506
|
-
const
|
2575
|
+
const editComposerStore = useEditComposerStore();
|
2507
2576
|
const disabled = useEditComposer((c) => c.isEditing);
|
2508
2577
|
const callback = useCallback4(() => {
|
2509
|
-
const { edit } =
|
2578
|
+
const { edit } = editComposerStore.getState();
|
2510
2579
|
edit();
|
2511
|
-
}, [
|
2580
|
+
}, [editComposerStore]);
|
2512
2581
|
if (disabled) return null;
|
2513
2582
|
return callback;
|
2514
2583
|
};
|
@@ -2516,18 +2585,26 @@ var useActionBarEdit = () => {
|
|
2516
2585
|
// src/primitive-hooks/actionBar/useActionBarReload.tsx
|
2517
2586
|
import { useCallback as useCallback5 } from "react";
|
2518
2587
|
var useActionBarReload = () => {
|
2519
|
-
const
|
2520
|
-
const
|
2588
|
+
const messageStore = useMessageStore();
|
2589
|
+
const threadStore = useThreadStore();
|
2590
|
+
const threadActionsStore = useThreadActionsStore();
|
2591
|
+
const threadComposerStore = useThreadComposerStore();
|
2592
|
+
const threadViewportStore = useThreadViewportStore();
|
2521
2593
|
const disabled = useCombinedStore(
|
2522
|
-
[
|
2594
|
+
[threadStore, messageStore],
|
2523
2595
|
(t, m) => t.isRunning || t.isDisabled || m.message.role !== "assistant"
|
2524
2596
|
);
|
2525
2597
|
const callback = useCallback5(() => {
|
2526
|
-
const { parentId } =
|
2527
|
-
|
2528
|
-
|
2529
|
-
|
2530
|
-
}, [
|
2598
|
+
const { parentId } = messageStore.getState();
|
2599
|
+
threadActionsStore.getState().startRun(parentId);
|
2600
|
+
threadViewportStore.getState().scrollToBottom();
|
2601
|
+
threadComposerStore.getState().focus();
|
2602
|
+
}, [
|
2603
|
+
threadActionsStore,
|
2604
|
+
threadComposerStore,
|
2605
|
+
threadViewportStore,
|
2606
|
+
messageStore
|
2607
|
+
]);
|
2531
2608
|
if (disabled) return null;
|
2532
2609
|
return callback;
|
2533
2610
|
};
|
@@ -2535,19 +2612,21 @@ var useActionBarReload = () => {
|
|
2535
2612
|
// src/primitive-hooks/actionBar/useActionBarSpeak.tsx
|
2536
2613
|
import { useCallback as useCallback6 } from "react";
|
2537
2614
|
var useActionBarSpeak = () => {
|
2538
|
-
const
|
2539
|
-
const
|
2615
|
+
const messageStore = useMessageStore();
|
2616
|
+
const editComposerStore = useEditComposerStore();
|
2617
|
+
const threadActionsStore = useThreadActionsStore();
|
2618
|
+
const messageUtilsStore = useMessageUtilsStore();
|
2540
2619
|
const hasSpeakableContent = useCombinedStore(
|
2541
|
-
[
|
2620
|
+
[messageStore, editComposerStore],
|
2542
2621
|
({ message }, c) => {
|
2543
2622
|
return !c.isEditing && (message.role !== "assistant" || message.status.type !== "running") && message.content.some((c2) => c2.type === "text" && c2.text.length > 0);
|
2544
2623
|
}
|
2545
2624
|
);
|
2546
2625
|
const callback = useCallback6(async () => {
|
2547
|
-
const { message } =
|
2548
|
-
const utt =
|
2549
|
-
|
2550
|
-
}, [
|
2626
|
+
const { message } = messageStore.getState();
|
2627
|
+
const utt = threadActionsStore.getState().speak(message.id);
|
2628
|
+
messageUtilsStore.getState().addUtterance(utt);
|
2629
|
+
}, [threadActionsStore, messageStore, messageUtilsStore]);
|
2551
2630
|
if (!hasSpeakableContent) return null;
|
2552
2631
|
return callback;
|
2553
2632
|
};
|
@@ -2555,18 +2634,17 @@ var useActionBarSpeak = () => {
|
|
2555
2634
|
// src/primitive-hooks/actionBar/useActionBarStopSpeaking.tsx
|
2556
2635
|
import { useCallback as useCallback7 } from "react";
|
2557
2636
|
var useActionBarStopSpeaking = () => {
|
2558
|
-
const
|
2637
|
+
const messageUtilsStore = useMessageUtilsStore();
|
2559
2638
|
const isSpeaking = useMessageUtils((u) => u.isSpeaking);
|
2560
2639
|
const callback = useCallback7(async () => {
|
2561
|
-
|
2562
|
-
}, [
|
2640
|
+
messageUtilsStore.getState().stopSpeaking();
|
2641
|
+
}, [messageUtilsStore]);
|
2563
2642
|
if (!isSpeaking) return null;
|
2564
2643
|
return callback;
|
2565
2644
|
};
|
2566
2645
|
|
2567
2646
|
// src/primitive-hooks/branchPicker/useBranchPickerCount.tsx
|
2568
2647
|
var useBranchPickerCount = () => {
|
2569
|
-
const { useMessage } = useMessageContext();
|
2570
2648
|
const branchCount = useMessage((s) => s.branches.length);
|
2571
2649
|
return branchCount;
|
2572
2650
|
};
|
@@ -2574,23 +2652,23 @@ var useBranchPickerCount = () => {
|
|
2574
2652
|
// src/primitive-hooks/branchPicker/useBranchPickerNext.tsx
|
2575
2653
|
import { useCallback as useCallback8 } from "react";
|
2576
2654
|
var useBranchPickerNext = () => {
|
2577
|
-
const
|
2578
|
-
const
|
2655
|
+
const messageStore = useMessageStore();
|
2656
|
+
const editComposerStore = useEditComposerStore();
|
2657
|
+
const threadActionsStore = useThreadActionsStore();
|
2579
2658
|
const disabled = useCombinedStore(
|
2580
|
-
[
|
2659
|
+
[messageStore, editComposerStore],
|
2581
2660
|
(m, c) => c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length
|
2582
2661
|
);
|
2583
2662
|
const callback = useCallback8(() => {
|
2584
|
-
const { message, branches } =
|
2585
|
-
|
2586
|
-
}, [
|
2663
|
+
const { message, branches } = messageStore.getState();
|
2664
|
+
threadActionsStore.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
|
2665
|
+
}, [threadActionsStore, messageStore]);
|
2587
2666
|
if (disabled) return null;
|
2588
2667
|
return callback;
|
2589
2668
|
};
|
2590
2669
|
|
2591
2670
|
// src/primitive-hooks/branchPicker/useBranchPickerNumber.tsx
|
2592
2671
|
var useBranchPickerNumber = () => {
|
2593
|
-
const { useMessage } = useMessageContext();
|
2594
2672
|
const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));
|
2595
2673
|
return branchIdx + 1;
|
2596
2674
|
};
|
@@ -2598,16 +2676,17 @@ var useBranchPickerNumber = () => {
|
|
2598
2676
|
// src/primitive-hooks/branchPicker/useBranchPickerPrevious.tsx
|
2599
2677
|
import { useCallback as useCallback9 } from "react";
|
2600
2678
|
var useBranchPickerPrevious = () => {
|
2601
|
-
const
|
2602
|
-
const
|
2679
|
+
const messageStore = useMessageStore();
|
2680
|
+
const editComposerStore = useEditComposerStore();
|
2681
|
+
const threadActionsStore = useThreadActionsStore();
|
2603
2682
|
const disabled = useCombinedStore(
|
2604
|
-
[
|
2683
|
+
[messageStore, editComposerStore],
|
2605
2684
|
(m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0
|
2606
2685
|
);
|
2607
2686
|
const callback = useCallback9(() => {
|
2608
|
-
const { message, branches } =
|
2609
|
-
|
2610
|
-
}, [
|
2687
|
+
const { message, branches } = messageStore.getState();
|
2688
|
+
threadActionsStore.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
|
2689
|
+
}, [threadActionsStore, messageStore]);
|
2611
2690
|
if (disabled) return null;
|
2612
2691
|
return callback;
|
2613
2692
|
};
|
@@ -2615,19 +2694,18 @@ var useBranchPickerPrevious = () => {
|
|
2615
2694
|
// src/primitive-hooks/composer/useComposerCancel.tsx
|
2616
2695
|
import { useCallback as useCallback10 } from "react";
|
2617
2696
|
var useComposerCancel = () => {
|
2618
|
-
const
|
2697
|
+
const composerStore = useComposerStore();
|
2619
2698
|
const disabled = useComposer((c) => !c.canCancel);
|
2620
2699
|
const callback = useCallback10(() => {
|
2621
|
-
const { cancel } =
|
2700
|
+
const { cancel } = composerStore.getState();
|
2622
2701
|
cancel();
|
2623
|
-
}, [
|
2702
|
+
}, [composerStore]);
|
2624
2703
|
if (disabled) return null;
|
2625
2704
|
return callback;
|
2626
2705
|
};
|
2627
2706
|
|
2628
2707
|
// src/primitive-hooks/composer/useComposerIf.tsx
|
2629
2708
|
var useComposerIf = (props) => {
|
2630
|
-
const { useComposer } = useComposerContext();
|
2631
2709
|
return useComposer((composer) => {
|
2632
2710
|
if (props.editing === true && !composer.isEditing) return false;
|
2633
2711
|
if (props.editing === false && composer.isEditing) return false;
|
@@ -2638,23 +2716,21 @@ var useComposerIf = (props) => {
|
|
2638
2716
|
// src/primitive-hooks/composer/useComposerSend.tsx
|
2639
2717
|
import { useCallback as useCallback11 } from "react";
|
2640
2718
|
var useComposerSend = () => {
|
2641
|
-
const
|
2642
|
-
|
2643
|
-
|
2644
|
-
|
2645
|
-
} = useThreadContext();
|
2646
|
-
const { useComposer } = useComposerContext();
|
2719
|
+
const threadStore = useThreadStore();
|
2720
|
+
const threadViewportStore = useThreadViewportStore();
|
2721
|
+
const composerStore = useComposerStore();
|
2722
|
+
const threadComposerStore = useThreadComposerStore();
|
2647
2723
|
const disabled = useCombinedStore(
|
2648
|
-
[
|
2724
|
+
[threadStore, composerStore],
|
2649
2725
|
(t, c) => t.isRunning || !c.isEditing || c.isEmpty
|
2650
2726
|
);
|
2651
2727
|
const callback = useCallback11(() => {
|
2652
|
-
const composerState =
|
2728
|
+
const composerState = composerStore.getState();
|
2653
2729
|
if (!composerState.isEditing) return;
|
2654
2730
|
composerState.send();
|
2655
|
-
|
2656
|
-
|
2657
|
-
}, [
|
2731
|
+
threadViewportStore.getState().scrollToBottom();
|
2732
|
+
threadComposerStore.getState().focus();
|
2733
|
+
}, [threadComposerStore, composerStore, threadViewportStore]);
|
2658
2734
|
if (disabled) return null;
|
2659
2735
|
return callback;
|
2660
2736
|
};
|
@@ -2662,11 +2738,12 @@ var useComposerSend = () => {
|
|
2662
2738
|
// src/primitive-hooks/composer/useComposerAddAttachment.tsx
|
2663
2739
|
import { useCallback as useCallback12 } from "react";
|
2664
2740
|
var useComposerAddAttachment = () => {
|
2665
|
-
const { useComposer, useThreadRuntime } = useThreadContext();
|
2666
2741
|
const disabled = useComposer((c) => !c.isEditing);
|
2742
|
+
const threadComposerStore = useThreadComposerStore();
|
2743
|
+
const threadRuntimeStore = useThreadRuntimeStore();
|
2667
2744
|
const callback = useCallback12(() => {
|
2668
|
-
const { addAttachment } =
|
2669
|
-
const { attachmentAccept } =
|
2745
|
+
const { addAttachment } = threadComposerStore.getState();
|
2746
|
+
const { attachmentAccept } = threadRuntimeStore.getState().composer;
|
2670
2747
|
const input = document.createElement("input");
|
2671
2748
|
input.type = "file";
|
2672
2749
|
if (attachmentAccept !== "*") {
|
@@ -2678,14 +2755,13 @@ var useComposerAddAttachment = () => {
|
|
2678
2755
|
addAttachment(file);
|
2679
2756
|
};
|
2680
2757
|
input.click();
|
2681
|
-
}, [
|
2758
|
+
}, [threadComposerStore, threadRuntimeStore]);
|
2682
2759
|
if (disabled) return null;
|
2683
2760
|
return callback;
|
2684
2761
|
};
|
2685
2762
|
|
2686
2763
|
// src/primitive-hooks/contentPart/useContentPartDisplay.tsx
|
2687
2764
|
var useContentPartDisplay = () => {
|
2688
|
-
const { useContentPart } = useContentPartContext();
|
2689
2765
|
const display = useContentPart((c) => {
|
2690
2766
|
if (c.part.type !== "ui")
|
2691
2767
|
throw new Error(
|
@@ -2698,7 +2774,6 @@ var useContentPartDisplay = () => {
|
|
2698
2774
|
|
2699
2775
|
// src/primitive-hooks/contentPart/useContentPartImage.tsx
|
2700
2776
|
var useContentPartImage = () => {
|
2701
|
-
const { useContentPart } = useContentPartContext();
|
2702
2777
|
const image = useContentPart((c) => {
|
2703
2778
|
if (c.part.type !== "image")
|
2704
2779
|
throw new Error(
|
@@ -2711,7 +2786,6 @@ var useContentPartImage = () => {
|
|
2711
2786
|
|
2712
2787
|
// src/primitive-hooks/contentPart/useContentPartText.tsx
|
2713
2788
|
var useContentPartText = () => {
|
2714
|
-
const { useContentPart } = useContentPartContext();
|
2715
2789
|
const text = useContentPart((c) => {
|
2716
2790
|
if (c.part.type !== "text")
|
2717
2791
|
throw new Error(
|
@@ -2724,9 +2798,10 @@ var useContentPartText = () => {
|
|
2724
2798
|
|
2725
2799
|
// src/primitive-hooks/message/useMessageIf.tsx
|
2726
2800
|
var useMessageIf = (props) => {
|
2727
|
-
const
|
2801
|
+
const messageStore = useMessageStore();
|
2802
|
+
const messageUtilsStore = useMessageUtilsStore();
|
2728
2803
|
return useCombinedStore(
|
2729
|
-
[
|
2804
|
+
[messageStore, messageUtilsStore],
|
2730
2805
|
({ message, branches, isLast }, { isCopied, isHovering, isSpeaking }) => {
|
2731
2806
|
if (props.hasBranches === true && branches.length < 2) return false;
|
2732
2807
|
if (props.user && message.role !== "user") return false;
|
@@ -2748,9 +2823,10 @@ var useMessageIf = (props) => {
|
|
2748
2823
|
|
2749
2824
|
// src/primitive-hooks/thread/useThreadIf.tsx
|
2750
2825
|
var useThreadIf = (props) => {
|
2751
|
-
const
|
2826
|
+
const threadStore = useThreadStore();
|
2827
|
+
const threadMessagesStore = useThreadMessagesStore();
|
2752
2828
|
return useCombinedStore(
|
2753
|
-
[
|
2829
|
+
[threadStore, threadMessagesStore],
|
2754
2830
|
(thread, messages) => {
|
2755
2831
|
if (props.empty === true && messages.length !== 0) return false;
|
2756
2832
|
if (props.empty === false && messages.length === 0) return false;
|
@@ -2771,12 +2847,13 @@ var useThreadEmpty = () => {
|
|
2771
2847
|
// src/primitive-hooks/thread/useThreadScrollToBottom.tsx
|
2772
2848
|
import { useCallback as useCallback13 } from "react";
|
2773
2849
|
var useThreadScrollToBottom = () => {
|
2774
|
-
const
|
2775
|
-
const
|
2850
|
+
const isAtBottom = useThreadViewport((s) => s.isAtBottom);
|
2851
|
+
const threadViewportStore = useThreadViewportStore();
|
2852
|
+
const threadComposerStore = useThreadComposerStore();
|
2776
2853
|
const handleScrollToBottom = useCallback13(() => {
|
2777
|
-
|
2778
|
-
|
2779
|
-
}, [
|
2854
|
+
threadViewportStore.getState().scrollToBottom();
|
2855
|
+
threadComposerStore.getState().focus();
|
2856
|
+
}, [threadViewportStore, threadComposerStore]);
|
2780
2857
|
if (isAtBottom) return null;
|
2781
2858
|
return handleScrollToBottom;
|
2782
2859
|
};
|
@@ -2787,19 +2864,20 @@ var useThreadSuggestion = ({
|
|
2787
2864
|
prompt,
|
2788
2865
|
autoSend
|
2789
2866
|
}) => {
|
2790
|
-
const
|
2867
|
+
const threadStore = useThreadStore();
|
2868
|
+
const composerStore = useThreadComposerStore();
|
2791
2869
|
const append = useAppendMessage();
|
2792
2870
|
const disabled = useThread((t) => t.isDisabled);
|
2793
2871
|
const callback = useCallback14(() => {
|
2794
|
-
const thread =
|
2795
|
-
const composer =
|
2872
|
+
const thread = threadStore.getState();
|
2873
|
+
const composer = composerStore.getState();
|
2796
2874
|
if (autoSend && !thread.isRunning) {
|
2797
2875
|
append(prompt);
|
2798
2876
|
composer.setText("");
|
2799
2877
|
} else {
|
2800
2878
|
composer.setText(prompt);
|
2801
2879
|
}
|
2802
|
-
}, [
|
2880
|
+
}, [threadStore, composerStore, autoSend, append, prompt]);
|
2803
2881
|
if (disabled) return null;
|
2804
2882
|
return callback;
|
2805
2883
|
};
|
@@ -2825,10 +2903,11 @@ var useActionBarFloatStatus = ({
|
|
2825
2903
|
autohide,
|
2826
2904
|
autohideFloat
|
2827
2905
|
}) => {
|
2828
|
-
const
|
2829
|
-
const
|
2906
|
+
const threadStore = useThreadStore();
|
2907
|
+
const messageStore = useMessageStore();
|
2908
|
+
const messageUtilsStore = useMessageUtilsStore();
|
2830
2909
|
return useCombinedStore(
|
2831
|
-
[
|
2910
|
+
[threadStore, messageStore, messageUtilsStore],
|
2832
2911
|
(t, m, mu) => {
|
2833
2912
|
if (hideWhenRunning && t.isRunning) return "hidden" /* Hidden */;
|
2834
2913
|
const autohideEnabled = autohide === "always" || autohide === "not-last" && !m.isLast;
|
@@ -2947,6 +3026,7 @@ var ActionBarPrimitiveStopSpeaking = forwardRef7((props, ref) => {
|
|
2947
3026
|
}
|
2948
3027
|
);
|
2949
3028
|
});
|
3029
|
+
ActionBarPrimitiveStopSpeaking.displayName = "ActionBarPrimitive.StopSpeaking";
|
2950
3030
|
|
2951
3031
|
// src/primitives/assistantModal/index.ts
|
2952
3032
|
var assistantModal_exports = {};
|
@@ -2967,12 +3047,12 @@ import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-
|
|
2967
3047
|
import { useEffect as useEffect8 } from "react";
|
2968
3048
|
var useOnComposerFocus = (callback) => {
|
2969
3049
|
const callbackRef = useCallbackRef2(callback);
|
2970
|
-
const
|
3050
|
+
const threadComposerStore = useThreadComposerStore();
|
2971
3051
|
useEffect8(() => {
|
2972
|
-
return
|
3052
|
+
return threadComposerStore.getState().onFocus(() => {
|
2973
3053
|
callbackRef();
|
2974
3054
|
});
|
2975
|
-
}, [
|
3055
|
+
}, [threadComposerStore, callbackRef]);
|
2976
3056
|
};
|
2977
3057
|
|
2978
3058
|
// src/primitives/assistantModal/scope.tsx
|
@@ -3154,10 +3234,10 @@ var useManagedRef = (callback) => {
|
|
3154
3234
|
import { useComposedRefs } from "@radix-ui/react-compose-refs";
|
3155
3235
|
import { jsx as jsx19 } from "react/jsx-runtime";
|
3156
3236
|
var useIsHoveringRef = () => {
|
3157
|
-
const
|
3237
|
+
const messageUtilsStore = useMessageUtilsStore();
|
3158
3238
|
const callbackRef = useCallback16(
|
3159
3239
|
(el) => {
|
3160
|
-
const setIsHovering =
|
3240
|
+
const setIsHovering = messageUtilsStore.getState().setIsHovering;
|
3161
3241
|
const handleMouseEnter = () => {
|
3162
3242
|
setIsHovering(true);
|
3163
3243
|
};
|
@@ -3172,14 +3252,14 @@ var useIsHoveringRef = () => {
|
|
3172
3252
|
setIsHovering(false);
|
3173
3253
|
};
|
3174
3254
|
},
|
3175
|
-
[
|
3255
|
+
[messageUtilsStore]
|
3176
3256
|
);
|
3177
3257
|
return useManagedRef(callbackRef);
|
3178
3258
|
};
|
3179
|
-
var MessagePrimitiveRoot = forwardRef11((
|
3259
|
+
var MessagePrimitiveRoot = forwardRef11((props, forwardRef30) => {
|
3180
3260
|
const isHoveringRef = useIsHoveringRef();
|
3181
3261
|
const ref = useComposedRefs(forwardRef30, isHoveringRef);
|
3182
|
-
return /* @__PURE__ */ jsx19(Primitive5.div, { ...
|
3262
|
+
return /* @__PURE__ */ jsx19(Primitive5.div, { ...props, ref });
|
3183
3263
|
});
|
3184
3264
|
MessagePrimitiveRoot.displayName = "MessagePrimitive.Root";
|
3185
3265
|
|
@@ -3198,7 +3278,7 @@ import { memo as memo2 } from "react";
|
|
3198
3278
|
|
3199
3279
|
// src/context/providers/ContentPartProvider.tsx
|
3200
3280
|
import { useEffect as useEffect9, useState as useState11 } from "react";
|
3201
|
-
import { create as
|
3281
|
+
import { create as create12 } from "zustand";
|
3202
3282
|
import { jsx as jsx20 } from "react/jsx-runtime";
|
3203
3283
|
var COMPLETE_STATUS = {
|
3204
3284
|
type: "complete"
|
@@ -3219,7 +3299,7 @@ var toContentPartStatus = (message, partIndex, part) => {
|
|
3219
3299
|
return message.status;
|
3220
3300
|
};
|
3221
3301
|
var EMPTY_CONTENT = Object.freeze({ type: "text", text: "" });
|
3222
|
-
var getContentPartState = ({ message },
|
3302
|
+
var getContentPartState = ({ message }, useContentPart2, partIndex) => {
|
3223
3303
|
let part = message.content[partIndex];
|
3224
3304
|
if (!part) {
|
3225
3305
|
if (message.content.length === 0 && partIndex === 0) {
|
@@ -3231,18 +3311,18 @@ var getContentPartState = ({ message }, useContentPart, partIndex) => {
|
|
3231
3311
|
part = EMPTY_CONTENT;
|
3232
3312
|
}
|
3233
3313
|
const status = toContentPartStatus(message, partIndex, part);
|
3234
|
-
const currentState =
|
3314
|
+
const currentState = useContentPart2?.getState();
|
3235
3315
|
if (currentState && currentState.part === part && currentState.status === status)
|
3236
3316
|
return null;
|
3237
3317
|
return Object.freeze({ part, status });
|
3238
3318
|
};
|
3239
3319
|
var useContentPartContext2 = (partIndex) => {
|
3240
|
-
const
|
3320
|
+
const messageStore = useMessageStore();
|
3241
3321
|
const [context] = useState11(() => {
|
3242
|
-
const
|
3243
|
-
() => getContentPartState(
|
3322
|
+
const useContentPart2 = create12(
|
3323
|
+
() => getContentPartState(messageStore.getState(), void 0, partIndex)
|
3244
3324
|
);
|
3245
|
-
return { useContentPart };
|
3325
|
+
return { useContentPart: useContentPart2 };
|
3246
3326
|
});
|
3247
3327
|
useEffect9(() => {
|
3248
3328
|
const syncContentPart = (message) => {
|
@@ -3254,9 +3334,9 @@ var useContentPartContext2 = (partIndex) => {
|
|
3254
3334
|
if (!newState) return;
|
3255
3335
|
writableStore(context.useContentPart).setState(newState, true);
|
3256
3336
|
};
|
3257
|
-
syncContentPart(
|
3258
|
-
return
|
3259
|
-
}, [context,
|
3337
|
+
syncContentPart(messageStore.getState());
|
3338
|
+
return messageStore.subscribe(syncContentPart);
|
3339
|
+
}, [context, messageStore, partIndex]);
|
3260
3340
|
return context;
|
3261
3341
|
};
|
3262
3342
|
var ContentPartProvider = ({
|
@@ -3304,7 +3384,6 @@ ContentPartPrimitiveDisplay.displayName = "ContentPartPrimitive.Display";
|
|
3304
3384
|
|
3305
3385
|
// src/primitives/contentPart/ContentPartInProgress.tsx
|
3306
3386
|
var ContentPartPrimitiveInProgress = ({ children }) => {
|
3307
|
-
const { useContentPart } = useContentPartContext();
|
3308
3387
|
const isInProgress = useContentPart((c) => c.status.type === "running");
|
3309
3388
|
return isInProgress ? children : null;
|
3310
3389
|
};
|
@@ -3316,7 +3395,6 @@ var ToolUIDisplay = ({
|
|
3316
3395
|
UI,
|
3317
3396
|
...props
|
3318
3397
|
}) => {
|
3319
|
-
const { useToolUIs } = useAssistantContext();
|
3320
3398
|
const Render = useToolUIs((s) => s.getToolUI(props.part.toolName)) ?? UI;
|
3321
3399
|
if (!Render) return null;
|
3322
3400
|
return /* @__PURE__ */ jsx23(Render, { ...props });
|
@@ -3338,10 +3416,8 @@ var MessageContentPartComponent = ({
|
|
3338
3416
|
tools: { by_name = {}, Fallback: Fallback2 = void 0 } = {}
|
3339
3417
|
} = {}
|
3340
3418
|
}) => {
|
3341
|
-
const
|
3342
|
-
const
|
3343
|
-
const addToolResult = useThreadActions((t) => t.addToolResult);
|
3344
|
-
const { useContentPart } = useContentPartContext();
|
3419
|
+
const messageStore = useMessageStore();
|
3420
|
+
const threadActionsStore = useThreadActionsStore();
|
3345
3421
|
const { part, status } = useContentPart();
|
3346
3422
|
const type = part.type;
|
3347
3423
|
switch (type) {
|
@@ -3362,8 +3438,8 @@ var MessageContentPartComponent = ({
|
|
3362
3438
|
return /* @__PURE__ */ jsx23(UI, { part, status });
|
3363
3439
|
case "tool-call": {
|
3364
3440
|
const Tool = by_name[part.toolName] || Fallback2;
|
3365
|
-
const addResult = (result) => addToolResult({
|
3366
|
-
messageId:
|
3441
|
+
const addResult = (result) => threadActionsStore.getState().addToolResult({
|
3442
|
+
messageId: messageStore.getState().message.id,
|
3367
3443
|
toolName: part.toolName,
|
3368
3444
|
toolCallId: part.toolCallId,
|
3369
3445
|
result
|
@@ -3396,7 +3472,6 @@ var MessageContentPart = memo2(
|
|
3396
3472
|
var MessagePrimitiveContent = ({
|
3397
3473
|
components
|
3398
3474
|
}) => {
|
3399
|
-
const { useMessage } = useMessageContext();
|
3400
3475
|
const contentLength = useMessage((s) => s.message.content.length) || 1;
|
3401
3476
|
return Array.from({ length: contentLength }, (_, index) => /* @__PURE__ */ jsx23(MessageContentPart, { partIndex: index, components }, index));
|
3402
3477
|
};
|
@@ -3412,48 +3487,70 @@ MessagePrimitiveInProgress.displayName = "MessagePrimitive.InProgress";
|
|
3412
3487
|
import { memo as memo3 } from "react";
|
3413
3488
|
|
3414
3489
|
// src/context/react/AttachmentContext.ts
|
3415
|
-
import { createContext as createContext6, useContext as
|
3490
|
+
import { createContext as createContext6, useContext as useContext3 } from "react";
|
3416
3491
|
var AttachmentContext = createContext6(
|
3417
3492
|
null
|
3418
3493
|
);
|
3419
3494
|
function useAttachmentContext(options) {
|
3420
|
-
const context =
|
3421
|
-
if (options?.
|
3495
|
+
const context = useContext3(AttachmentContext);
|
3496
|
+
if (!options?.optional && !context)
|
3422
3497
|
throw new Error(
|
3423
|
-
"This component must be used within a ComposerPrimitive.Attachments component."
|
3498
|
+
"This component must be used within a ComposerPrimitive.Attachments or MessagePrimitive.Attachments component."
|
3424
3499
|
);
|
3425
|
-
|
3500
|
+
return context;
|
3501
|
+
}
|
3502
|
+
function useComposerAttachmentContext(options) {
|
3503
|
+
const context = useAttachmentContext(options);
|
3504
|
+
if (!context) return null;
|
3505
|
+
if (context.type !== "composer")
|
3426
3506
|
throw new Error(
|
3427
|
-
"This component must be used within a
|
3507
|
+
"This component must be used within a ComposerPrimitive.Attachments component."
|
3428
3508
|
);
|
3429
|
-
|
3509
|
+
return context;
|
3510
|
+
}
|
3511
|
+
function useMessageAttachmentContext(options) {
|
3512
|
+
const context = useAttachmentContext(options);
|
3513
|
+
if (!context) return null;
|
3514
|
+
if (context.type !== "message")
|
3430
3515
|
throw new Error(
|
3431
|
-
"This component must be used within a
|
3516
|
+
"This component must be used within a MessagePrimitive.Attachments component."
|
3432
3517
|
);
|
3433
3518
|
return context;
|
3434
3519
|
}
|
3520
|
+
var { useAttachment, useAttachmentStore } = createContextStoreHook(
|
3521
|
+
useAttachmentContext,
|
3522
|
+
"useAttachment"
|
3523
|
+
);
|
3524
|
+
var {
|
3525
|
+
useAttachment: useComposerAttachment,
|
3526
|
+
useAttachmentStore: useComposerAttachmentStore
|
3527
|
+
} = createContextStoreHook(useComposerAttachmentContext, "useAttachment");
|
3528
|
+
var {
|
3529
|
+
useAttachment: useMessageAttachment,
|
3530
|
+
useAttachmentStore: useMessageAttachmentStore
|
3531
|
+
} = createContextStoreHook(useMessageAttachmentContext, "useAttachment");
|
3435
3532
|
|
3436
3533
|
// src/context/providers/MessageAttachmentProvider.tsx
|
3437
3534
|
import { useEffect as useEffect10, useState as useState12 } from "react";
|
3438
|
-
import { create as
|
3535
|
+
import { create as create13 } from "zustand";
|
3439
3536
|
import { jsx as jsx24 } from "react/jsx-runtime";
|
3440
|
-
var getAttachment = ({ message },
|
3537
|
+
var getAttachment = ({ message }, useAttachment2, partIndex) => {
|
3441
3538
|
if (message.role !== "user") return null;
|
3442
3539
|
const attachments = message.attachments;
|
3443
|
-
|
3540
|
+
const attachment = attachments[partIndex];
|
3444
3541
|
if (!attachment) return null;
|
3445
|
-
const currentState =
|
3542
|
+
const currentState = useAttachment2?.getState();
|
3446
3543
|
if (currentState && currentState.attachment === attachment) return null;
|
3447
3544
|
return Object.freeze({ attachment });
|
3448
3545
|
};
|
3449
|
-
var
|
3450
|
-
const
|
3546
|
+
var useMessageAttachmentContext2 = (partIndex) => {
|
3547
|
+
const messageStore = useMessageStore();
|
3451
3548
|
const [context] = useState12(
|
3452
3549
|
() => {
|
3453
|
-
const
|
3454
|
-
() => getAttachment(
|
3550
|
+
const useAttachment2 = create13(
|
3551
|
+
() => getAttachment(messageStore.getState(), void 0, partIndex)
|
3455
3552
|
);
|
3456
|
-
return { type: "message", useAttachment };
|
3553
|
+
return { type: "message", useAttachment: useAttachment2 };
|
3457
3554
|
}
|
3458
3555
|
);
|
3459
3556
|
useEffect10(() => {
|
@@ -3466,16 +3563,16 @@ var useMessageAttachmentContext = (partIndex) => {
|
|
3466
3563
|
if (!newState) return;
|
3467
3564
|
writableStore(context.useAttachment).setState(newState, true);
|
3468
3565
|
};
|
3469
|
-
syncAttachment(
|
3470
|
-
return
|
3471
|
-
}, [context,
|
3566
|
+
syncAttachment(messageStore.getState());
|
3567
|
+
return messageStore.subscribe(syncAttachment);
|
3568
|
+
}, [context, messageStore, partIndex]);
|
3472
3569
|
return context;
|
3473
3570
|
};
|
3474
3571
|
var MessageAttachmentProvider = ({
|
3475
3572
|
attachmentIndex: partIndex,
|
3476
3573
|
children
|
3477
3574
|
}) => {
|
3478
|
-
const context =
|
3575
|
+
const context = useMessageAttachmentContext2(partIndex);
|
3479
3576
|
return /* @__PURE__ */ jsx24(AttachmentContext.Provider, { value: context, children });
|
3480
3577
|
};
|
3481
3578
|
|
@@ -3496,8 +3593,7 @@ var getComponent = (components, attachment) => {
|
|
3496
3593
|
}
|
3497
3594
|
};
|
3498
3595
|
var AttachmentComponent = ({ components }) => {
|
3499
|
-
const
|
3500
|
-
const Component = useAttachment(
|
3596
|
+
const Component = useMessageAttachment(
|
3501
3597
|
(a) => getComponent(components, a.attachment)
|
3502
3598
|
);
|
3503
3599
|
if (!Component) return null;
|
@@ -3511,7 +3607,6 @@ var MessageAttachment = memo3(
|
|
3511
3607
|
(prev, next) => prev.attachmentIndex === next.attachmentIndex && prev.components?.Image === next.components?.Image && prev.components?.Document === next.components?.Document && prev.components?.File === next.components?.File && prev.components?.Attachment === next.components?.Attachment
|
3512
3608
|
);
|
3513
3609
|
var MessagePrimitiveAttachments = ({ components }) => {
|
3514
|
-
const { useMessage } = useMessageContext();
|
3515
3610
|
const attachmentsCount = useMessage(({ message }) => {
|
3516
3611
|
if (message.role !== "user") return 0;
|
3517
3612
|
return message.attachments.length;
|
@@ -3593,8 +3688,8 @@ var ComposerPrimitiveInput = forwardRef16(
|
|
3593
3688
|
onKeyDown,
|
3594
3689
|
...rest
|
3595
3690
|
}, forwardedRef) => {
|
3596
|
-
const
|
3597
|
-
const
|
3691
|
+
const threadStore = useThreadStore();
|
3692
|
+
const composerStore = useComposerStore();
|
3598
3693
|
const value = useComposer((c) => {
|
3599
3694
|
if (!c.isEditing) return "";
|
3600
3695
|
return c.text;
|
@@ -3604,7 +3699,7 @@ var ComposerPrimitiveInput = forwardRef16(
|
|
3604
3699
|
const textareaRef = useRef4(null);
|
3605
3700
|
const ref = useComposedRefs2(forwardedRef, textareaRef);
|
3606
3701
|
useEscapeKeydown2((e) => {
|
3607
|
-
const composer =
|
3702
|
+
const composer = composerStore.getState();
|
3608
3703
|
if (composer.canCancel) {
|
3609
3704
|
composer.cancel();
|
3610
3705
|
e.preventDefault();
|
@@ -3614,7 +3709,7 @@ var ComposerPrimitiveInput = forwardRef16(
|
|
3614
3709
|
if (isDisabled) return;
|
3615
3710
|
if (e.nativeEvent.isComposing) return;
|
3616
3711
|
if (e.key === "Enter" && e.shiftKey === false) {
|
3617
|
-
const { isRunning } =
|
3712
|
+
const { isRunning } = threadStore.getState();
|
3618
3713
|
if (!isRunning) {
|
3619
3714
|
e.preventDefault();
|
3620
3715
|
textareaRef.current?.closest("form")?.requestSubmit();
|
@@ -3633,7 +3728,7 @@ var ComposerPrimitiveInput = forwardRef16(
|
|
3633
3728
|
}, [autoFocusEnabled]);
|
3634
3729
|
useEffect11(() => focus(), [focus]);
|
3635
3730
|
useOnComposerFocus(() => {
|
3636
|
-
if (type === "
|
3731
|
+
if (composerStore.getState().type === "thread") {
|
3637
3732
|
focus();
|
3638
3733
|
}
|
3639
3734
|
});
|
@@ -3646,7 +3741,7 @@ var ComposerPrimitiveInput = forwardRef16(
|
|
3646
3741
|
ref,
|
3647
3742
|
disabled: isDisabled,
|
3648
3743
|
onChange: composeEventHandlers6(onChange, (e) => {
|
3649
|
-
const composerState =
|
3744
|
+
const composerState = composerStore.getState();
|
3650
3745
|
if (!composerState.isEditing) return;
|
3651
3746
|
return composerState.setText(e.target.value);
|
3652
3747
|
}),
|
@@ -3680,23 +3775,23 @@ import { memo as memo4 } from "react";
|
|
3680
3775
|
|
3681
3776
|
// src/context/providers/ComposerAttachmentProvider.tsx
|
3682
3777
|
import { useEffect as useEffect12, useState as useState13 } from "react";
|
3683
|
-
import { create as
|
3778
|
+
import { create as create14 } from "zustand";
|
3684
3779
|
import { jsx as jsx29 } from "react/jsx-runtime";
|
3685
|
-
var getAttachment2 = ({ attachments },
|
3686
|
-
|
3780
|
+
var getAttachment2 = ({ attachments }, useAttachment2, partIndex) => {
|
3781
|
+
const attachment = attachments[partIndex];
|
3687
3782
|
if (!attachment) return null;
|
3688
|
-
const currentState =
|
3783
|
+
const currentState = useAttachment2?.getState();
|
3689
3784
|
if (currentState && currentState.attachment === attachment) return null;
|
3690
3785
|
return Object.freeze({ attachment });
|
3691
3786
|
};
|
3692
|
-
var
|
3693
|
-
const
|
3787
|
+
var useComposerAttachmentContext2 = (partIndex) => {
|
3788
|
+
const threadComposerStore = useThreadComposerStore();
|
3694
3789
|
const [context] = useState13(
|
3695
3790
|
() => {
|
3696
|
-
const
|
3697
|
-
() => getAttachment2(
|
3791
|
+
const useAttachment2 = create14(
|
3792
|
+
() => getAttachment2(threadComposerStore.getState(), void 0, partIndex)
|
3698
3793
|
);
|
3699
|
-
return { type: "composer", useAttachment };
|
3794
|
+
return { type: "composer", useAttachment: useAttachment2 };
|
3700
3795
|
}
|
3701
3796
|
);
|
3702
3797
|
useEffect12(() => {
|
@@ -3709,13 +3804,13 @@ var useComposerAttachmentContext = (partIndex) => {
|
|
3709
3804
|
if (!newState) return;
|
3710
3805
|
writableStore(context.useAttachment).setState(newState, true);
|
3711
3806
|
};
|
3712
|
-
syncAttachment(
|
3713
|
-
return
|
3714
|
-
}, [context,
|
3807
|
+
syncAttachment(threadComposerStore.getState());
|
3808
|
+
return threadComposerStore.subscribe(syncAttachment);
|
3809
|
+
}, [context, threadComposerStore, partIndex]);
|
3715
3810
|
return context;
|
3716
3811
|
};
|
3717
3812
|
var ComposerAttachmentProvider = ({ attachmentIndex: partIndex, children }) => {
|
3718
|
-
const context =
|
3813
|
+
const context = useComposerAttachmentContext2(partIndex);
|
3719
3814
|
return /* @__PURE__ */ jsx29(AttachmentContext.Provider, { value: context, children });
|
3720
3815
|
};
|
3721
3816
|
|
@@ -3736,8 +3831,7 @@ var getComponent2 = (components, attachment) => {
|
|
3736
3831
|
}
|
3737
3832
|
};
|
3738
3833
|
var AttachmentComponent2 = ({ components }) => {
|
3739
|
-
const
|
3740
|
-
const Component = useAttachment(
|
3834
|
+
const Component = useComposerAttachment(
|
3741
3835
|
(a) => getComponent2(components, a.attachment)
|
3742
3836
|
);
|
3743
3837
|
if (!Component) return null;
|
@@ -3751,8 +3845,7 @@ var ComposerAttachment = memo4(
|
|
3751
3845
|
(prev, next) => prev.attachmentIndex === next.attachmentIndex && prev.components?.Image === next.components?.Image && prev.components?.Document === next.components?.Document && prev.components?.File === next.components?.File && prev.components?.Attachment === next.components?.Attachment
|
3752
3846
|
);
|
3753
3847
|
var ComposerPrimitiveAttachments = ({ components }) => {
|
3754
|
-
const
|
3755
|
-
const attachmentsCount = useComposer((s) => s.attachments.length);
|
3848
|
+
const attachmentsCount = useThreadComposer((s) => s.attachments.length);
|
3756
3849
|
return Array.from({ length: attachmentsCount }, (_, index) => /* @__PURE__ */ jsx30(
|
3757
3850
|
ComposerAttachment,
|
3758
3851
|
{
|
@@ -3877,12 +3970,12 @@ import { useCallbackRef as useCallbackRef4 } from "@radix-ui/react-use-callback-
|
|
3877
3970
|
import { useEffect as useEffect13 } from "react";
|
3878
3971
|
var useOnScrollToBottom = (callback) => {
|
3879
3972
|
const callbackRef = useCallbackRef4(callback);
|
3880
|
-
const
|
3973
|
+
const threadViewportStore = useThreadViewportStore();
|
3881
3974
|
useEffect13(() => {
|
3882
|
-
return
|
3975
|
+
return threadViewportStore.getState().onScrollToBottom(() => {
|
3883
3976
|
callbackRef();
|
3884
3977
|
});
|
3885
|
-
}, [
|
3978
|
+
}, [threadViewportStore, callbackRef]);
|
3886
3979
|
};
|
3887
3980
|
|
3888
3981
|
// src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
|
@@ -3890,7 +3983,7 @@ var useThreadViewportAutoScroll = ({
|
|
3890
3983
|
autoScroll = true
|
3891
3984
|
}) => {
|
3892
3985
|
const divRef = useRef5(null);
|
3893
|
-
const
|
3986
|
+
const threadViewportStore = useThreadViewportStore();
|
3894
3987
|
const lastScrollTop = useRef5(0);
|
3895
3988
|
const isScrollingToBottomRef = useRef5(false);
|
3896
3989
|
const scrollToBottom = (behavior) => {
|
@@ -3902,7 +3995,7 @@ var useThreadViewportAutoScroll = ({
|
|
3902
3995
|
const handleScroll = () => {
|
3903
3996
|
const div = divRef.current;
|
3904
3997
|
if (!div) return;
|
3905
|
-
const isAtBottom =
|
3998
|
+
const isAtBottom = threadViewportStore.getState().isAtBottom;
|
3906
3999
|
const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight + 1;
|
3907
4000
|
if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
|
3908
4001
|
} else {
|
@@ -3910,13 +4003,15 @@ var useThreadViewportAutoScroll = ({
|
|
3910
4003
|
isScrollingToBottomRef.current = false;
|
3911
4004
|
}
|
3912
4005
|
if (newIsAtBottom !== isAtBottom) {
|
3913
|
-
writableStore(
|
4006
|
+
writableStore(threadViewportStore).setState({
|
4007
|
+
isAtBottom: newIsAtBottom
|
4008
|
+
});
|
3914
4009
|
}
|
3915
4010
|
}
|
3916
4011
|
lastScrollTop.current = div.scrollTop;
|
3917
4012
|
};
|
3918
4013
|
const resizeRef = useOnResizeContent(() => {
|
3919
|
-
if (isScrollingToBottomRef.current ||
|
4014
|
+
if (isScrollingToBottomRef.current || threadViewportStore.getState().isAtBottom) {
|
3920
4015
|
scrollToBottom("instant");
|
3921
4016
|
}
|
3922
4017
|
handleScroll();
|
@@ -3936,7 +4031,7 @@ var useThreadViewportAutoScroll = ({
|
|
3936
4031
|
|
3937
4032
|
// src/primitives/thread/ThreadViewport.tsx
|
3938
4033
|
import { jsx as jsx32 } from "react/jsx-runtime";
|
3939
|
-
var ThreadPrimitiveViewport = forwardRef18(({ autoScroll,
|
4034
|
+
var ThreadPrimitiveViewport = forwardRef18(({ autoScroll, children, ...rest }, forwardedRef) => {
|
3940
4035
|
const autoScrollRef = useThreadViewportAutoScroll({
|
3941
4036
|
autoScroll
|
3942
4037
|
});
|
@@ -3950,14 +4045,15 @@ import { memo as memo5 } from "react";
|
|
3950
4045
|
|
3951
4046
|
// src/context/providers/MessageProvider.tsx
|
3952
4047
|
import { useEffect as useEffect14, useState as useState14 } from "react";
|
3953
|
-
import { create as
|
4048
|
+
import { create as create17 } from "zustand";
|
3954
4049
|
|
3955
4050
|
// src/context/stores/EditComposer.ts
|
3956
|
-
import { create as
|
4051
|
+
import { create as create15 } from "zustand";
|
3957
4052
|
var makeEditComposerStore = ({
|
3958
4053
|
onEdit,
|
3959
4054
|
onSend
|
3960
|
-
}) =>
|
4055
|
+
}) => create15()((set, get) => ({
|
4056
|
+
type: "edit",
|
3961
4057
|
get value() {
|
3962
4058
|
return get().text;
|
3963
4059
|
},
|
@@ -3991,8 +4087,8 @@ var makeEditComposerStore = ({
|
|
3991
4087
|
}));
|
3992
4088
|
|
3993
4089
|
// src/context/stores/MessageUtils.ts
|
3994
|
-
import { create as
|
3995
|
-
var makeMessageUtilsStore = () =>
|
4090
|
+
import { create as create16 } from "zustand";
|
4091
|
+
var makeMessageUtilsStore = () => create16((set) => {
|
3996
4092
|
let utterance = null;
|
3997
4093
|
return {
|
3998
4094
|
isCopied: false,
|
@@ -4022,13 +4118,13 @@ import { jsx as jsx33 } from "react/jsx-runtime";
|
|
4022
4118
|
var getIsLast = (messages, message) => {
|
4023
4119
|
return messages[messages.length - 1]?.id === message.id;
|
4024
4120
|
};
|
4025
|
-
var getMessageState = (messages, getBranches,
|
4121
|
+
var getMessageState = (messages, getBranches, useMessage2, messageIndex) => {
|
4026
4122
|
const parentId = messages[messageIndex - 1]?.id ?? null;
|
4027
4123
|
const message = messages[messageIndex];
|
4028
4124
|
if (!message) return null;
|
4029
4125
|
const isLast = getIsLast(messages, message);
|
4030
4126
|
const branches = getBranches(message.id);
|
4031
|
-
const currentState =
|
4127
|
+
const currentState = useMessage2?.getState();
|
4032
4128
|
if (currentState && currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
|
4033
4129
|
return null;
|
4034
4130
|
return Object.freeze({
|
@@ -4039,31 +4135,32 @@ var getMessageState = (messages, getBranches, useMessage, messageIndex) => {
|
|
4039
4135
|
});
|
4040
4136
|
};
|
4041
4137
|
var useMessageContext2 = (messageIndex) => {
|
4042
|
-
const
|
4138
|
+
const threadMessagesStore = useThreadMessagesStore();
|
4139
|
+
const threadActionsStore = useThreadActionsStore();
|
4043
4140
|
const [context] = useState14(() => {
|
4044
|
-
const
|
4141
|
+
const useMessage2 = create17(
|
4045
4142
|
() => getMessageState(
|
4046
|
-
|
4047
|
-
|
4143
|
+
threadMessagesStore.getState(),
|
4144
|
+
threadActionsStore.getState().getBranches,
|
4048
4145
|
void 0,
|
4049
4146
|
messageIndex
|
4050
4147
|
)
|
4051
4148
|
);
|
4052
|
-
const
|
4053
|
-
const
|
4149
|
+
const useMessageUtils2 = makeMessageUtilsStore();
|
4150
|
+
const useEditComposer2 = makeEditComposerStore({
|
4054
4151
|
onEdit: () => {
|
4055
|
-
const message =
|
4152
|
+
const message = useMessage2.getState().message;
|
4056
4153
|
const text = getThreadMessageText(message);
|
4057
4154
|
return text;
|
4058
4155
|
},
|
4059
4156
|
onSend: (text) => {
|
4060
|
-
const { message, parentId } =
|
4157
|
+
const { message, parentId } = useMessage2.getState();
|
4061
4158
|
const previousText = getThreadMessageText(message);
|
4062
4159
|
if (previousText === text) return;
|
4063
4160
|
const nonTextParts = message.content.filter(
|
4064
4161
|
(part) => part.type !== "text" && part.type !== "ui"
|
4065
4162
|
);
|
4066
|
-
|
4163
|
+
threadActionsStore.getState().append({
|
4067
4164
|
parentId,
|
4068
4165
|
role: message.role,
|
4069
4166
|
content: [{ type: "text", text }, ...nonTextParts],
|
@@ -4071,22 +4168,22 @@ var useMessageContext2 = (messageIndex) => {
|
|
4071
4168
|
});
|
4072
4169
|
}
|
4073
4170
|
});
|
4074
|
-
return { useMessage, useMessageUtils, useEditComposer };
|
4171
|
+
return { useMessage: useMessage2, useMessageUtils: useMessageUtils2, useEditComposer: useEditComposer2 };
|
4075
4172
|
});
|
4076
4173
|
useEffect14(() => {
|
4077
4174
|
const syncMessage = (thread) => {
|
4078
4175
|
const newState = getMessageState(
|
4079
4176
|
thread,
|
4080
|
-
|
4177
|
+
threadActionsStore.getState().getBranches,
|
4081
4178
|
context.useMessage,
|
4082
4179
|
messageIndex
|
4083
4180
|
);
|
4084
4181
|
if (!newState) return;
|
4085
4182
|
writableStore(context.useMessage).setState(newState, true);
|
4086
4183
|
};
|
4087
|
-
syncMessage(
|
4088
|
-
return
|
4089
|
-
}, [
|
4184
|
+
syncMessage(threadMessagesStore.getState());
|
4185
|
+
return threadMessagesStore.subscribe(syncMessage);
|
4186
|
+
}, [threadMessagesStore, threadActionsStore, context, messageIndex]);
|
4090
4187
|
return context;
|
4091
4188
|
};
|
4092
4189
|
var MessageProvider = ({
|
@@ -4131,7 +4228,6 @@ var getComponent3 = (components, role, isEditing) => {
|
|
4131
4228
|
var ThreadMessageComponent = ({
|
4132
4229
|
components
|
4133
4230
|
}) => {
|
4134
|
-
const { useMessage, useEditComposer } = useMessageContext();
|
4135
4231
|
const role = useMessage((m) => m.message.role);
|
4136
4232
|
const isEditing = useEditComposer((c) => c.isEditing);
|
4137
4233
|
const Component = getComponent3(components, role, isEditing);
|
@@ -4150,7 +4246,6 @@ var ThreadMessage = memo5(
|
|
4150
4246
|
var ThreadPrimitiveMessagesImpl = ({
|
4151
4247
|
components
|
4152
4248
|
}) => {
|
4153
|
-
const { useThreadMessages } = useThreadContext();
|
4154
4249
|
const messagesLength = useThreadMessages((t) => t.length);
|
4155
4250
|
if (messagesLength === 0) return null;
|
4156
4251
|
return Array.from({ length: messagesLength }, (_, index) => /* @__PURE__ */ jsx34(ThreadMessage, { messageIndex: index, components }, index));
|
@@ -4177,21 +4272,21 @@ var ThreadPrimitiveSuggestion = createActionButton(
|
|
4177
4272
|
// src/ui/thread-config.tsx
|
4178
4273
|
import {
|
4179
4274
|
createContext as createContext7,
|
4180
|
-
useContext as
|
4275
|
+
useContext as useContext4
|
4181
4276
|
} from "react";
|
4182
4277
|
import { Fragment as Fragment3, jsx as jsx35 } from "react/jsx-runtime";
|
4183
4278
|
var ThreadConfigContext = createContext7({});
|
4184
4279
|
var useThreadConfig = () => {
|
4185
|
-
return
|
4280
|
+
return useContext4(ThreadConfigContext);
|
4186
4281
|
};
|
4187
4282
|
var ThreadConfigProvider = ({
|
4188
4283
|
children,
|
4189
4284
|
config
|
4190
4285
|
}) => {
|
4191
|
-
const
|
4286
|
+
const hasAssistant = !!useAssistantRuntimeStore({ optional: true });
|
4192
4287
|
const configProvider = config && Object.keys(config ?? {}).length > 0 ? /* @__PURE__ */ jsx35(ThreadConfigContext.Provider, { value: config, children }) : /* @__PURE__ */ jsx35(Fragment3, { children });
|
4193
4288
|
if (!config?.runtime) return configProvider;
|
4194
|
-
if (
|
4289
|
+
if (hasAssistant) {
|
4195
4290
|
throw new Error(
|
4196
4291
|
"You provided a runtime to <Thread> while simulataneously using <AssistantRuntimeProvider>. This is not allowed."
|
4197
4292
|
);
|
@@ -4212,19 +4307,16 @@ import {
|
|
4212
4307
|
import { Fragment as Fragment4, jsx as jsx36, jsxs as jsxs4 } from "react/jsx-runtime";
|
4213
4308
|
var useAllowCopy = (ensureCapability = false) => {
|
4214
4309
|
const { assistantMessage: { allowCopy = true } = {} } = useThreadConfig();
|
4215
|
-
const { useThread } = useThreadContext();
|
4216
4310
|
const copySupported = useThread((t) => t.capabilities.unstable_copy);
|
4217
4311
|
return allowCopy && (!ensureCapability || copySupported);
|
4218
4312
|
};
|
4219
4313
|
var useAllowSpeak = (ensureCapability = false) => {
|
4220
4314
|
const { assistantMessage: { allowSpeak = true } = {} } = useThreadConfig();
|
4221
|
-
const { useThread } = useThreadContext();
|
4222
4315
|
const speakSupported = useThread((t) => t.capabilities.speak);
|
4223
4316
|
return allowSpeak && (!ensureCapability || speakSupported);
|
4224
4317
|
};
|
4225
4318
|
var useAllowReload = (ensureCapability = false) => {
|
4226
4319
|
const { assistantMessage: { allowReload = true } = {} } = useThreadConfig();
|
4227
|
-
const { useThread } = useThreadContext();
|
4228
4320
|
const reloadSupported = useThread((t) => t.capabilities.reload);
|
4229
4321
|
return allowReload && (!ensureCapability || reloadSupported);
|
4230
4322
|
};
|
@@ -4324,7 +4416,6 @@ import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
|
|
4324
4416
|
import { jsx as jsx37, jsxs as jsxs5 } from "react/jsx-runtime";
|
4325
4417
|
var useAllowBranchPicker = (ensureCapability = false) => {
|
4326
4418
|
const { branchPicker: { allowBranchPicker = true } = {} } = useThreadConfig();
|
4327
|
-
const { useThread } = useThreadContext();
|
4328
4419
|
const branchPickerSupported = useThread((t) => t.capabilities.edit);
|
4329
4420
|
return allowBranchPicker && (!ensureCapability || branchPickerSupported);
|
4330
4421
|
};
|
@@ -4518,8 +4609,7 @@ var ComposerAttachmentRoot = withDefaults("div", {
|
|
4518
4609
|
});
|
4519
4610
|
ComposerAttachmentRoot.displayName = "ComposerAttachmentRoot";
|
4520
4611
|
var ComposerAttachment2 = () => {
|
4521
|
-
const
|
4522
|
-
const attachment = useAttachment((a) => a.attachment);
|
4612
|
+
const attachment = useComposerAttachment((a) => a.attachment);
|
4523
4613
|
return /* @__PURE__ */ jsxs8(ComposerAttachmentRoot, { children: [
|
4524
4614
|
".",
|
4525
4615
|
attachment.name.split(".").pop(),
|
@@ -4533,10 +4623,10 @@ var ComposerAttachmentRemove = forwardRef22((props, ref) => {
|
|
4533
4623
|
composer: { removeAttachment: { tooltip = "Remove file" } = {} } = {}
|
4534
4624
|
} = {}
|
4535
4625
|
} = useThreadConfig();
|
4536
|
-
const
|
4537
|
-
const
|
4626
|
+
const composerStore = useThreadComposerStore();
|
4627
|
+
const attachmentStore = useAttachmentStore();
|
4538
4628
|
const handleRemoveAttachment = () => {
|
4539
|
-
|
4629
|
+
composerStore.getState().removeAttachment(attachmentStore.getState().attachment.id);
|
4540
4630
|
};
|
4541
4631
|
return /* @__PURE__ */ jsx42(
|
4542
4632
|
TooltipIconButton,
|
@@ -4565,7 +4655,6 @@ var composer_attachment_default = Object.assign(
|
|
4565
4655
|
import { Fragment as Fragment5, jsx as jsx43, jsxs as jsxs9 } from "react/jsx-runtime";
|
4566
4656
|
var useAllowAttachments = (ensureCapability = false) => {
|
4567
4657
|
const { composer: { allowAttachments = true } = {} } = useThreadConfig();
|
4568
|
-
const { useThread } = useThreadContext();
|
4569
4658
|
const attachmentsSupported = useThread((t) => t.capabilities.attachments);
|
4570
4659
|
return allowAttachments && (!ensureCapability || attachmentsSupported);
|
4571
4660
|
};
|
@@ -4637,7 +4726,6 @@ var ComposerAddAttachment = forwardRef23((props, ref) => {
|
|
4637
4726
|
});
|
4638
4727
|
ComposerAddAttachment.displayName = "ComposerAddAttachment";
|
4639
4728
|
var useAllowCancel = () => {
|
4640
|
-
const { useThread } = useThreadContext();
|
4641
4729
|
const cancelSupported = useThread((t) => t.capabilities.cancel);
|
4642
4730
|
return cancelSupported;
|
4643
4731
|
};
|
@@ -4766,7 +4854,6 @@ import { PencilIcon } from "lucide-react";
|
|
4766
4854
|
import { jsx as jsx45 } from "react/jsx-runtime";
|
4767
4855
|
var useAllowEdit = (ensureCapability = false) => {
|
4768
4856
|
const { userMessage: { allowEdit = true } = {} } = useThreadConfig();
|
4769
|
-
const { useThread } = useThreadContext();
|
4770
4857
|
const editSupported = useThread((t) => t.capabilities.edit);
|
4771
4858
|
return allowEdit && (!ensureCapability || editSupported);
|
4772
4859
|
};
|
@@ -4801,7 +4888,6 @@ var UserMessageAttachmentRoot = withDefaults("div", {
|
|
4801
4888
|
});
|
4802
4889
|
UserMessageAttachmentRoot.displayName = "UserMessageAttachmentRoot";
|
4803
4890
|
var UserMessageAttachment = () => {
|
4804
|
-
const { useAttachment } = useAttachmentContext();
|
4805
4891
|
const attachment = useAttachment((a) => a.attachment);
|
4806
4892
|
return /* @__PURE__ */ jsxs11(UserMessageAttachmentRoot, { children: [
|
4807
4893
|
".",
|
@@ -5123,36 +5209,64 @@ export {
|
|
5123
5209
|
useActionBarSpeak,
|
5124
5210
|
useActionBarStopSpeaking,
|
5125
5211
|
useAppendMessage,
|
5212
|
+
useAssistantActions,
|
5213
|
+
useAssistantActionsStore,
|
5126
5214
|
useAssistantContext,
|
5127
5215
|
useAssistantInstructions,
|
5216
|
+
useAssistantRuntime,
|
5217
|
+
useAssistantRuntimeStore,
|
5128
5218
|
useAssistantTool,
|
5129
5219
|
useAssistantToolUI,
|
5130
5220
|
useBranchPickerCount,
|
5131
5221
|
useBranchPickerNext,
|
5132
5222
|
useBranchPickerNumber,
|
5133
5223
|
useBranchPickerPrevious,
|
5224
|
+
useComposer,
|
5134
5225
|
useComposerAddAttachment,
|
5135
5226
|
useComposerCancel,
|
5136
5227
|
useComposerContext,
|
5137
5228
|
useComposerIf,
|
5138
5229
|
useComposerSend,
|
5230
|
+
useComposerStore,
|
5231
|
+
useContentPart,
|
5139
5232
|
useContentPartContext,
|
5140
5233
|
useContentPartDisplay,
|
5141
5234
|
useContentPartImage,
|
5235
|
+
useContentPartStore,
|
5142
5236
|
useContentPartText,
|
5143
5237
|
useDangerousInBrowserRuntime,
|
5144
5238
|
useEdgeRuntime,
|
5239
|
+
useEditComposer,
|
5240
|
+
useEditComposerStore,
|
5145
5241
|
useExternalMessageConverter,
|
5146
5242
|
useExternalStoreRuntime,
|
5147
5243
|
useLocalRuntime,
|
5244
|
+
useMessage,
|
5148
5245
|
useMessageContext,
|
5149
5246
|
useMessageIf,
|
5247
|
+
useMessageStore,
|
5248
|
+
useMessageUtils,
|
5249
|
+
useMessageUtilsStore,
|
5150
5250
|
useSwitchToNewThread,
|
5251
|
+
useThread,
|
5252
|
+
useThreadActions,
|
5253
|
+
useThreadActionsStore,
|
5254
|
+
useThreadComposer,
|
5255
|
+
useThreadComposerStore,
|
5151
5256
|
useThreadConfig,
|
5152
5257
|
useThreadContext,
|
5153
5258
|
useThreadEmpty,
|
5154
5259
|
useThreadIf,
|
5260
|
+
useThreadMessages,
|
5261
|
+
useThreadMessagesStore,
|
5262
|
+
useThreadRuntime,
|
5263
|
+
useThreadRuntimeStore,
|
5155
5264
|
useThreadScrollToBottom,
|
5156
|
-
|
5265
|
+
useThreadStore,
|
5266
|
+
useThreadSuggestion,
|
5267
|
+
useThreadViewport,
|
5268
|
+
useThreadViewportStore,
|
5269
|
+
useToolUIs,
|
5270
|
+
useToolUIsStore
|
5157
5271
|
};
|
5158
5272
|
//# sourceMappingURL=index.mjs.map
|