@assistant-ui/react 0.1.7 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +5 -3
- package/dist/{Thread-ZUDFhMtm.d.mts → ThreadActions-DqqhRbf1.d.mts} +8 -3
- package/dist/{Thread-ZUDFhMtm.d.ts → ThreadActions-DqqhRbf1.d.ts} +8 -3
- package/dist/{chunk-XVZ2GVQM.mjs → chunk-7O2URLFI.mjs} +1 -1
- package/dist/chunk-7O2URLFI.mjs.map +1 -0
- package/dist/experimental.d.mts +40 -33
- package/dist/experimental.d.ts +40 -33
- package/dist/experimental.js +26 -26
- package/dist/experimental.js.map +1 -1
- package/dist/experimental.mjs +24 -24
- package/dist/experimental.mjs.map +1 -1
- package/dist/index.d.mts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +156 -120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +157 -121
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -4
- package/dist/chunk-XVZ2GVQM.mjs.map +0 -1
package/dist/index.mjs
CHANGED
@@ -9,7 +9,7 @@ import {
|
|
9
9
|
useContentPartContext,
|
10
10
|
useMessageContext,
|
11
11
|
useThreadContext
|
12
|
-
} from "./chunk-
|
12
|
+
} from "./chunk-7O2URLFI.mjs";
|
13
13
|
|
14
14
|
// src/actions/useCopyMessage.tsx
|
15
15
|
import { useCallback } from "react";
|
@@ -50,7 +50,7 @@ var getMessageText = (message) => {
|
|
50
50
|
|
51
51
|
// src/actions/useCopyMessage.tsx
|
52
52
|
var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
53
|
-
const { useMessage, useComposer } = useMessageContext();
|
53
|
+
const { useMessage, useMessageUtils, useComposer } = useMessageContext();
|
54
54
|
const hasCopyableContent = useCombinedStore(
|
55
55
|
[useMessage, useComposer],
|
56
56
|
(m, c) => {
|
@@ -58,13 +58,14 @@ var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
|
58
58
|
}
|
59
59
|
);
|
60
60
|
const callback = useCallback(() => {
|
61
|
+
const { message } = useMessage.getState();
|
62
|
+
const { setIsCopied } = useMessageUtils.getState();
|
61
63
|
const { isEditing, value: composerValue } = useComposer.getState();
|
62
|
-
const { message, setIsCopied } = useMessage.getState();
|
63
64
|
const valueToCopy = isEditing ? composerValue : getMessageText(message);
|
64
65
|
navigator.clipboard.writeText(valueToCopy);
|
65
66
|
setIsCopied(true);
|
66
67
|
setTimeout(() => setIsCopied(false), copiedDuration);
|
67
|
-
}, [
|
68
|
+
}, [useMessage, useMessageUtils, useComposer, copiedDuration]);
|
68
69
|
if (!hasCopyableContent) return null;
|
69
70
|
return callback;
|
70
71
|
};
|
@@ -72,7 +73,7 @@ var useCopyMessage = ({ copiedDuration = 3e3 }) => {
|
|
72
73
|
// src/actions/useReloadMessage.tsx
|
73
74
|
import { useCallback as useCallback2 } from "react";
|
74
75
|
var useReloadMessage = () => {
|
75
|
-
const { useThread, useViewport } = useThreadContext();
|
76
|
+
const { useThread, useThreadActions, useViewport } = useThreadContext();
|
76
77
|
const { useMessage } = useMessageContext();
|
77
78
|
const disabled = useCombinedStore(
|
78
79
|
[useThread, useMessage],
|
@@ -80,9 +81,9 @@ var useReloadMessage = () => {
|
|
80
81
|
);
|
81
82
|
const callback = useCallback2(() => {
|
82
83
|
const { parentId } = useMessage.getState();
|
83
|
-
|
84
|
+
useThreadActions.getState().startRun(parentId);
|
84
85
|
useViewport.getState().scrollToBottom();
|
85
|
-
}, [
|
86
|
+
}, [useThreadActions, useMessage, useViewport]);
|
86
87
|
if (disabled) return null;
|
87
88
|
return callback;
|
88
89
|
};
|
@@ -106,7 +107,7 @@ var useBeginMessageEdit = () => {
|
|
106
107
|
// src/actions/useGoToNextBranch.tsx
|
107
108
|
import { useCallback as useCallback4 } from "react";
|
108
109
|
var useGoToNextBranch = () => {
|
109
|
-
const {
|
110
|
+
const { useThreadActions } = useThreadContext();
|
110
111
|
const { useMessage, useComposer } = useMessageContext();
|
111
112
|
const disabled = useCombinedStore(
|
112
113
|
[useMessage, useComposer],
|
@@ -114,8 +115,8 @@ var useGoToNextBranch = () => {
|
|
114
115
|
);
|
115
116
|
const callback = useCallback4(() => {
|
116
117
|
const { message, branches } = useMessage.getState();
|
117
|
-
|
118
|
-
}, [
|
118
|
+
useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) + 1]);
|
119
|
+
}, [useThreadActions, useMessage]);
|
119
120
|
if (disabled) return null;
|
120
121
|
return callback;
|
121
122
|
};
|
@@ -123,7 +124,7 @@ var useGoToNextBranch = () => {
|
|
123
124
|
// src/actions/useGoToPreviousBranch.tsx
|
124
125
|
import { useCallback as useCallback5 } from "react";
|
125
126
|
var useGoToPreviousBranch = () => {
|
126
|
-
const {
|
127
|
+
const { useThreadActions } = useThreadContext();
|
127
128
|
const { useMessage, useComposer } = useMessageContext();
|
128
129
|
const disabled = useCombinedStore(
|
129
130
|
[useMessage, useComposer],
|
@@ -131,8 +132,8 @@ var useGoToPreviousBranch = () => {
|
|
131
132
|
);
|
132
133
|
const callback = useCallback5(() => {
|
133
134
|
const { message, branches } = useMessage.getState();
|
134
|
-
|
135
|
-
}, [
|
135
|
+
useThreadActions.getState().switchToBranch(branches[branches.indexOf(message.id) - 1]);
|
136
|
+
}, [useThreadActions, useMessage]);
|
136
137
|
if (disabled) return null;
|
137
138
|
return callback;
|
138
139
|
};
|
@@ -278,7 +279,9 @@ var ThreadViewport = forwardRef2(({ autoScroll = true, onScroll, children, ...re
|
|
278
279
|
if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
|
279
280
|
} else if (newIsAtBottom !== isAtBottom) {
|
280
281
|
isScrollingToBottomRef.current = false;
|
281
|
-
useViewport.setState({
|
282
|
+
useViewport.setState({
|
283
|
+
isAtBottom: newIsAtBottom
|
284
|
+
});
|
282
285
|
}
|
283
286
|
lastScrollTop.current = div.scrollTop;
|
284
287
|
};
|
@@ -302,7 +305,7 @@ import { memo } from "react";
|
|
302
305
|
|
303
306
|
// src/context/providers/MessageProvider.tsx
|
304
307
|
import { useEffect as useEffect3, useState } from "react";
|
305
|
-
import { create as
|
308
|
+
import { create as create3 } from "zustand";
|
306
309
|
|
307
310
|
// src/context/stores/MessageComposer.ts
|
308
311
|
import { create } from "zustand";
|
@@ -338,17 +341,34 @@ var makeEditComposerStore = ({
|
|
338
341
|
}
|
339
342
|
}));
|
340
343
|
|
344
|
+
// src/context/stores/MessageUtils.ts
|
345
|
+
import { create as create2 } from "zustand";
|
346
|
+
var makeMessageUtilsStore = () => create2((set) => ({
|
347
|
+
inProgressIndicator: null,
|
348
|
+
setInProgressIndicator: (value) => {
|
349
|
+
set({ inProgressIndicator: value });
|
350
|
+
},
|
351
|
+
isCopied: false,
|
352
|
+
setIsCopied: (value) => {
|
353
|
+
set({ isCopied: value });
|
354
|
+
},
|
355
|
+
isHovering: false,
|
356
|
+
setIsHovering: (value) => {
|
357
|
+
set({ isHovering: value });
|
358
|
+
}
|
359
|
+
}));
|
360
|
+
|
341
361
|
// src/context/providers/MessageProvider.tsx
|
342
362
|
import { jsx as jsx4 } from "react/jsx-runtime";
|
343
363
|
var getIsLast = (thread, message) => {
|
344
364
|
return thread.messages[thread.messages.length - 1]?.id === message.id;
|
345
365
|
};
|
346
|
-
var syncMessage = (thread, useMessage, messageIndex) => {
|
366
|
+
var syncMessage = (thread, getBranches, useMessage, messageIndex) => {
|
347
367
|
const parentId = thread.messages[messageIndex - 1]?.id ?? null;
|
348
368
|
const message = thread.messages[messageIndex];
|
349
369
|
if (!message) return;
|
350
370
|
const isLast = getIsLast(thread, message);
|
351
|
-
const branches =
|
371
|
+
const branches = getBranches(message.id);
|
352
372
|
const currentState = useMessage.getState();
|
353
373
|
if (currentState.message === message && currentState.parentId === parentId && currentState.branches === branches && currentState.isLast === isLast)
|
354
374
|
return;
|
@@ -360,26 +380,10 @@ var syncMessage = (thread, useMessage, messageIndex) => {
|
|
360
380
|
});
|
361
381
|
};
|
362
382
|
var useMessageContext2 = (messageIndex) => {
|
363
|
-
const { useThread } = useThreadContext();
|
383
|
+
const { useThread, useThreadActions } = useThreadContext();
|
364
384
|
const [context] = useState(() => {
|
365
|
-
const useMessage =
|
366
|
-
|
367
|
-
parentId: null,
|
368
|
-
branches: [],
|
369
|
-
isLast: false,
|
370
|
-
inProgressIndicator: null,
|
371
|
-
isCopied: false,
|
372
|
-
isHovering: false,
|
373
|
-
setInProgressIndicator: (value) => {
|
374
|
-
set({ inProgressIndicator: value });
|
375
|
-
},
|
376
|
-
setIsCopied: (value) => {
|
377
|
-
set({ isCopied: value });
|
378
|
-
},
|
379
|
-
setIsHovering: (value) => {
|
380
|
-
set({ isHovering: value });
|
381
|
-
}
|
382
|
-
}));
|
385
|
+
const useMessage = create3(() => ({}));
|
386
|
+
const useMessageUtils = makeMessageUtilsStore();
|
383
387
|
const useComposer = makeEditComposerStore({
|
384
388
|
onEdit: () => {
|
385
389
|
const message = useMessage.getState().message;
|
@@ -399,20 +403,30 @@ var useMessageContext2 = (messageIndex) => {
|
|
399
403
|
const nonTextParts = message.content.filter(
|
400
404
|
(part) => part.type !== "text" && part.type !== "ui"
|
401
405
|
);
|
402
|
-
|
406
|
+
useThreadActions.getState().append({
|
403
407
|
parentId,
|
404
408
|
content: [{ type: "text", text }, ...nonTextParts]
|
405
409
|
});
|
406
410
|
}
|
407
411
|
});
|
408
|
-
syncMessage(
|
409
|
-
|
412
|
+
syncMessage(
|
413
|
+
useThread.getState(),
|
414
|
+
useThreadActions.getState().getBranches,
|
415
|
+
useMessage,
|
416
|
+
messageIndex
|
417
|
+
);
|
418
|
+
return { useMessage, useMessageUtils, useComposer };
|
410
419
|
});
|
411
420
|
useEffect3(() => {
|
412
421
|
return useThread.subscribe((thread) => {
|
413
|
-
syncMessage(
|
422
|
+
syncMessage(
|
423
|
+
thread,
|
424
|
+
useThreadActions.getState().getBranches,
|
425
|
+
context.useMessage,
|
426
|
+
messageIndex
|
427
|
+
);
|
414
428
|
});
|
415
|
-
}, [
|
429
|
+
}, [useThread, useThreadActions, context, messageIndex]);
|
416
430
|
return context;
|
417
431
|
};
|
418
432
|
var MessageProvider = ({
|
@@ -439,16 +453,19 @@ var ComposerIf = ({ children, ...query }) => {
|
|
439
453
|
|
440
454
|
// src/primitives/message/MessageIf.tsx
|
441
455
|
var useMessageIf = (props) => {
|
442
|
-
const { useMessage } = useMessageContext();
|
443
|
-
return
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
456
|
+
const { useMessage, useMessageUtils } = useMessageContext();
|
457
|
+
return useCombinedStore(
|
458
|
+
[useMessage, useMessageUtils],
|
459
|
+
({ message, branches, isLast }, { isCopied, isHovering }) => {
|
460
|
+
if (props.hasBranches === true && branches.length < 2) return false;
|
461
|
+
if (props.user && message.role !== "user") return false;
|
462
|
+
if (props.assistant && message.role !== "assistant") return false;
|
463
|
+
if (props.lastOrHover === true && !isHovering && !isLast) return false;
|
464
|
+
if (props.copied === true && !isCopied) return false;
|
465
|
+
if (props.copied === false && isCopied) return false;
|
466
|
+
return true;
|
467
|
+
}
|
468
|
+
);
|
452
469
|
};
|
453
470
|
var MessageIf = ({ children, ...query }) => {
|
454
471
|
const result = useMessageIf(query);
|
@@ -727,8 +744,8 @@ import { forwardRef as forwardRef9 } from "react";
|
|
727
744
|
import { jsx as jsx12 } from "react/jsx-runtime";
|
728
745
|
var MessageRoot = forwardRef9(
|
729
746
|
({ onMouseEnter, onMouseLeave, ...rest }, ref) => {
|
730
|
-
const {
|
731
|
-
const setIsHovering =
|
747
|
+
const { useMessageUtils } = useMessageContext();
|
748
|
+
const setIsHovering = useMessageUtils((s) => s.setIsHovering);
|
732
749
|
const handleMouseEnter = () => {
|
733
750
|
setIsHovering(true);
|
734
751
|
};
|
@@ -753,7 +770,7 @@ import { memo as memo2 } from "react";
|
|
753
770
|
|
754
771
|
// src/context/providers/ContentPartProvider.tsx
|
755
772
|
import { useEffect as useEffect5, useState as useState2 } from "react";
|
756
|
-
import { create as
|
773
|
+
import { create as create4 } from "zustand";
|
757
774
|
import { jsx as jsx13 } from "react/jsx-runtime";
|
758
775
|
var syncContentPart = ({ message }, useContentPart, partIndex) => {
|
759
776
|
const part = message.content[partIndex];
|
@@ -762,19 +779,24 @@ var syncContentPart = ({ message }, useContentPart, partIndex) => {
|
|
762
779
|
const status = partIndex === message.content.length - 1 ? messageStatus : "done";
|
763
780
|
const currentState = useContentPart.getState();
|
764
781
|
if (currentState.part === part && currentState.status === status) return;
|
765
|
-
useContentPart.setState(
|
782
|
+
useContentPart.setState(
|
783
|
+
Object.freeze({
|
784
|
+
part,
|
785
|
+
status
|
786
|
+
})
|
787
|
+
);
|
766
788
|
};
|
767
789
|
var useContentPartContext2 = (partIndex) => {
|
768
790
|
const { useMessage } = useMessageContext();
|
769
791
|
const [context] = useState2(() => {
|
770
|
-
const useContentPart =
|
771
|
-
|
772
|
-
|
773
|
-
}));
|
792
|
+
const useContentPart = create4(
|
793
|
+
() => ({})
|
794
|
+
);
|
774
795
|
syncContentPart(useMessage.getState(), useContentPart, partIndex);
|
775
796
|
return { useContentPart };
|
776
797
|
});
|
777
798
|
useEffect5(() => {
|
799
|
+
syncContentPart(useMessage.getState(), context.useContentPart, partIndex);
|
778
800
|
return useMessage.subscribe((message) => {
|
779
801
|
syncContentPart(message, context.useContentPart, partIndex);
|
780
802
|
});
|
@@ -804,10 +826,10 @@ var ContentPartDisplay = () => {
|
|
804
826
|
|
805
827
|
// src/primitives/contentPart/ContentPartInProgressIndicator.tsx
|
806
828
|
var ContentPartInProgressIndicator = () => {
|
807
|
-
const {
|
829
|
+
const { useMessageUtils } = useMessageContext();
|
808
830
|
const { useContentPart } = useContentPartContext();
|
809
831
|
const indicator = useCombinedStore(
|
810
|
-
[
|
832
|
+
[useMessageUtils, useContentPart],
|
811
833
|
(m, c) => c.status === "in_progress" ? m.inProgressIndicator : null
|
812
834
|
);
|
813
835
|
return indicator;
|
@@ -841,10 +863,8 @@ var defaultComponents = {
|
|
841
863
|
UI: () => /* @__PURE__ */ jsx15(ContentPartDisplay, {}),
|
842
864
|
tools: {
|
843
865
|
Fallback: (props) => {
|
844
|
-
const {
|
845
|
-
const Render =
|
846
|
-
(s) => s.getToolRenderer(props.part.toolName)
|
847
|
-
);
|
866
|
+
const { useToolUIs } = useAssistantContext();
|
867
|
+
const Render = useToolUIs((s) => s.getToolUI(props.part.toolName));
|
848
868
|
if (!Render) return null;
|
849
869
|
return /* @__PURE__ */ jsx15(Render, { ...props });
|
850
870
|
}
|
@@ -858,6 +878,8 @@ var MessageContentPartComponent = ({
|
|
858
878
|
tools: { by_name = {}, Fallback = defaultComponents.tools.Fallback } = {}
|
859
879
|
} = {}
|
860
880
|
}) => {
|
881
|
+
const { useThreadActions } = useThreadContext();
|
882
|
+
const addToolResult = useThreadActions((t) => t.addToolResult);
|
861
883
|
const { useContentPart } = useContentPartContext();
|
862
884
|
const { part, status } = useContentPart();
|
863
885
|
const type = part.type;
|
@@ -870,7 +892,8 @@ var MessageContentPartComponent = ({
|
|
870
892
|
return /* @__PURE__ */ jsx15(UI, { part, status });
|
871
893
|
case "tool-call": {
|
872
894
|
const Tool = by_name[part.toolName] || Fallback;
|
873
|
-
|
895
|
+
const addResult = (result) => addToolResult(part.toolCallId, result);
|
896
|
+
return /* @__PURE__ */ jsx15(Tool, { part, status, addResult });
|
874
897
|
}
|
875
898
|
default:
|
876
899
|
throw new Error(`Unknown content part type: ${type}`);
|
@@ -910,10 +933,10 @@ import {
|
|
910
933
|
} from "react";
|
911
934
|
import { jsx as jsx16 } from "react/jsx-runtime";
|
912
935
|
var MessageInProgress = forwardRef11((props, ref) => {
|
913
|
-
const {
|
936
|
+
const { useMessageUtils } = useMessageContext();
|
914
937
|
useMemo2(() => {
|
915
|
-
|
916
|
-
}, [
|
938
|
+
useMessageUtils.getState().setInProgressIndicator(/* @__PURE__ */ jsx16(Primitive10.span, { ...props, ref }));
|
939
|
+
}, [useMessageUtils, props, ref]);
|
917
940
|
return null;
|
918
941
|
});
|
919
942
|
MessageInProgress.displayName = "MessageInProgress";
|
@@ -997,14 +1020,14 @@ import { forwardRef as forwardRef14 } from "react";
|
|
997
1020
|
import { jsx as jsx21 } from "react/jsx-runtime";
|
998
1021
|
var ActionBarRoot = forwardRef14(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {
|
999
1022
|
const { useThread } = useThreadContext();
|
1000
|
-
const { useMessage } = useMessageContext();
|
1023
|
+
const { useMessage, useMessageUtils } = useMessageContext();
|
1001
1024
|
const hideAndfloatStatus = useCombinedStore(
|
1002
|
-
[useThread, useMessage],
|
1003
|
-
(t, m) => {
|
1025
|
+
[useThread, useMessage, useMessageUtils],
|
1026
|
+
(t, m, mu) => {
|
1004
1027
|
if (hideWhenRunning && t.isRunning) return "hidden" /* Hidden */;
|
1005
1028
|
const autohideEnabled = autohide === "always" || autohide === "not-last" && !m.isLast;
|
1006
1029
|
if (!autohideEnabled) return "normal" /* Normal */;
|
1007
|
-
if (!
|
1030
|
+
if (!mu.isHovering) return "hidden" /* Hidden */;
|
1008
1031
|
if (autohideFloat === "always" || autohideFloat === "single-branch" && m.branches.length <= 1)
|
1009
1032
|
return "floating" /* Floating */;
|
1010
1033
|
return "normal" /* Normal */;
|
@@ -1337,6 +1360,9 @@ var LocalRuntime = class {
|
|
1337
1360
|
this._configProviders.add(provider);
|
1338
1361
|
return () => this._configProviders.delete(provider);
|
1339
1362
|
}
|
1363
|
+
addToolResult() {
|
1364
|
+
throw new Error("LocalRuntime does not yet support tool results");
|
1365
|
+
}
|
1340
1366
|
};
|
1341
1367
|
|
1342
1368
|
// src/runtime/local/useLocalRuntime.tsx
|
@@ -1355,7 +1381,7 @@ import { memo as memo3 } from "react";
|
|
1355
1381
|
import { useEffect as useEffect7, useInsertionEffect as useInsertionEffect3, useRef as useRef5, useState as useState5 } from "react";
|
1356
1382
|
|
1357
1383
|
// src/context/stores/AssistantModelConfig.ts
|
1358
|
-
import { create as
|
1384
|
+
import { create as create5 } from "zustand";
|
1359
1385
|
|
1360
1386
|
// src/utils/ProxyConfigProvider.ts
|
1361
1387
|
var ProxyConfigProvider = class {
|
@@ -1372,30 +1398,30 @@ var ProxyConfigProvider = class {
|
|
1372
1398
|
};
|
1373
1399
|
|
1374
1400
|
// src/context/stores/AssistantModelConfig.ts
|
1375
|
-
var makeAssistantModelConfigStore = () =>
|
1401
|
+
var makeAssistantModelConfigStore = () => create5(() => {
|
1376
1402
|
const proxy = new ProxyConfigProvider();
|
1377
|
-
return {
|
1403
|
+
return Object.freeze({
|
1378
1404
|
getModelConfig: () => {
|
1379
1405
|
return proxy.getModelConfig();
|
1380
1406
|
},
|
1381
1407
|
registerModelConfigProvider: (provider) => {
|
1382
1408
|
return proxy.registerModelConfigProvider(provider);
|
1383
1409
|
}
|
1384
|
-
};
|
1410
|
+
});
|
1385
1411
|
});
|
1386
1412
|
|
1387
|
-
// src/context/stores/
|
1388
|
-
import { create as
|
1389
|
-
var
|
1413
|
+
// src/context/stores/AssistantToolUIs.ts
|
1414
|
+
import { create as create6 } from "zustand";
|
1415
|
+
var makeAssistantToolUIsStore = () => create6((set) => {
|
1390
1416
|
const renderers = /* @__PURE__ */ new Map();
|
1391
|
-
return {
|
1392
|
-
|
1417
|
+
return Object.freeze({
|
1418
|
+
getToolUI: (name) => {
|
1393
1419
|
const arr = renderers.get(name);
|
1394
1420
|
const last = arr?.at(-1);
|
1395
1421
|
if (last) return last;
|
1396
1422
|
return null;
|
1397
1423
|
},
|
1398
|
-
|
1424
|
+
setToolUI: (name, render) => {
|
1399
1425
|
let arr = renderers.get(name);
|
1400
1426
|
if (!arr) {
|
1401
1427
|
arr = [];
|
@@ -1408,25 +1434,27 @@ var makeAssistantToolRenderersStore = () => create5((set) => {
|
|
1408
1434
|
if (index !== -1) {
|
1409
1435
|
arr.splice(index, 1);
|
1410
1436
|
}
|
1411
|
-
|
1437
|
+
if (index === arr.length) {
|
1438
|
+
set({});
|
1439
|
+
}
|
1412
1440
|
};
|
1413
1441
|
}
|
1414
|
-
};
|
1442
|
+
});
|
1415
1443
|
});
|
1416
1444
|
|
1417
1445
|
// src/context/providers/ThreadProvider.tsx
|
1418
1446
|
import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect2, useRef as useRef4, useState as useState4 } from "react";
|
1419
1447
|
|
1420
1448
|
// src/context/stores/Composer.ts
|
1421
|
-
import { create as
|
1422
|
-
var makeComposerStore = (useThread) =>
|
1449
|
+
import { create as create7 } from "zustand";
|
1450
|
+
var makeComposerStore = (useThread, useThreadActions) => create7()((set, get, store) => {
|
1423
1451
|
return {
|
1424
1452
|
...makeBaseComposer(set, get, store),
|
1425
1453
|
isEditing: true,
|
1426
1454
|
send: () => {
|
1427
1455
|
const { setValue, value } = get();
|
1428
1456
|
setValue("");
|
1429
|
-
|
1457
|
+
useThreadActions.getState().append({
|
1430
1458
|
parentId: useThread.getState().messages.at(-1)?.id ?? null,
|
1431
1459
|
content: [{ type: "text", text: value }]
|
1432
1460
|
});
|
@@ -1434,41 +1462,26 @@ var makeComposerStore = (useThread) => create6()((set, get, store) => {
|
|
1434
1462
|
cancel: () => {
|
1435
1463
|
const thread = useThread.getState();
|
1436
1464
|
if (!thread.isRunning) return false;
|
1437
|
-
|
1465
|
+
useThreadActions.getState().cancelRun();
|
1438
1466
|
return true;
|
1439
1467
|
}
|
1440
1468
|
};
|
1441
1469
|
});
|
1442
1470
|
|
1443
1471
|
// src/context/stores/Thread.ts
|
1444
|
-
import { create as
|
1472
|
+
import { create as create8 } from "zustand";
|
1445
1473
|
var makeThreadStore = (runtimeRef) => {
|
1446
|
-
|
1474
|
+
return create8(() => ({
|
1447
1475
|
messages: runtimeRef.current.messages,
|
1448
|
-
isRunning: runtimeRef.current.isRunning
|
1449
|
-
getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
|
1450
|
-
switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
|
1451
|
-
startRun: (parentId) => runtimeRef.current.startRun(parentId),
|
1452
|
-
append: (message) => runtimeRef.current.append(message),
|
1453
|
-
cancelRun: () => runtimeRef.current.cancelRun()
|
1476
|
+
isRunning: runtimeRef.current.isRunning
|
1454
1477
|
}));
|
1455
|
-
const onRuntimeUpdate = () => {
|
1456
|
-
useThread.setState({
|
1457
|
-
messages: runtimeRef.current.messages,
|
1458
|
-
isRunning: runtimeRef.current.isRunning
|
1459
|
-
});
|
1460
|
-
};
|
1461
|
-
return {
|
1462
|
-
useThread,
|
1463
|
-
onRuntimeUpdate
|
1464
|
-
};
|
1465
1478
|
};
|
1466
1479
|
|
1467
1480
|
// src/context/stores/ThreadViewport.tsx
|
1468
|
-
import { create as
|
1481
|
+
import { create as create9 } from "zustand";
|
1469
1482
|
var makeThreadViewportStore = () => {
|
1470
1483
|
const scrollToBottomListeners = /* @__PURE__ */ new Set();
|
1471
|
-
return
|
1484
|
+
return create9(() => ({
|
1472
1485
|
isAtBottom: true,
|
1473
1486
|
scrollToBottom: () => {
|
1474
1487
|
for (const listener of scrollToBottomListeners) {
|
@@ -1484,6 +1497,21 @@ var makeThreadViewportStore = () => {
|
|
1484
1497
|
}));
|
1485
1498
|
};
|
1486
1499
|
|
1500
|
+
// src/context/stores/ThreadActions.ts
|
1501
|
+
import { create as create10 } from "zustand";
|
1502
|
+
var makeThreadActionStore = (runtimeRef) => {
|
1503
|
+
return create10(
|
1504
|
+
() => Object.freeze({
|
1505
|
+
getBranches: (messageId) => runtimeRef.current.getBranches(messageId),
|
1506
|
+
switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),
|
1507
|
+
startRun: (parentId) => runtimeRef.current.startRun(parentId),
|
1508
|
+
append: (message) => runtimeRef.current.append(message),
|
1509
|
+
cancelRun: () => runtimeRef.current.cancelRun(),
|
1510
|
+
addToolResult: (toolCallId, result) => runtimeRef.current.addToolResult(toolCallId, result)
|
1511
|
+
})
|
1512
|
+
);
|
1513
|
+
};
|
1514
|
+
|
1487
1515
|
// src/context/providers/ThreadProvider.tsx
|
1488
1516
|
import { jsx as jsx23, jsxs as jsxs4 } from "react/jsx-runtime";
|
1489
1517
|
var ThreadProvider = ({
|
@@ -1494,23 +1522,31 @@ var ThreadProvider = ({
|
|
1494
1522
|
useInsertionEffect2(() => {
|
1495
1523
|
runtimeRef.current = runtime;
|
1496
1524
|
});
|
1497
|
-
const [
|
1498
|
-
const
|
1525
|
+
const [context] = useState4(() => {
|
1526
|
+
const useThread = makeThreadStore(runtimeRef);
|
1527
|
+
const useThreadActions = makeThreadActionStore(runtimeRef);
|
1499
1528
|
const useViewport = makeThreadViewportStore();
|
1500
|
-
const useComposer = makeComposerStore(useThread);
|
1529
|
+
const useComposer = makeComposerStore(useThread, useThreadActions);
|
1501
1530
|
return {
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
},
|
1507
|
-
onRuntimeUpdate: onRuntimeUpdate2
|
1531
|
+
useThread,
|
1532
|
+
useThreadActions,
|
1533
|
+
useComposer,
|
1534
|
+
useViewport
|
1508
1535
|
};
|
1509
1536
|
});
|
1510
1537
|
useEffect6(() => {
|
1538
|
+
const onRuntimeUpdate = () => {
|
1539
|
+
context.useThread.setState(
|
1540
|
+
Object.freeze({
|
1541
|
+
messages: runtimeRef.current.messages,
|
1542
|
+
isRunning: runtimeRef.current.isRunning
|
1543
|
+
}),
|
1544
|
+
true
|
1545
|
+
);
|
1546
|
+
};
|
1511
1547
|
onRuntimeUpdate();
|
1512
1548
|
return runtime.subscribe(onRuntimeUpdate);
|
1513
|
-
}, [
|
1549
|
+
}, [context, runtime]);
|
1514
1550
|
const RuntimeSynchronizer = runtime.unstable_synchronizer;
|
1515
1551
|
return /* @__PURE__ */ jsxs4(ThreadContext.Provider, { value: context, children: [
|
1516
1552
|
RuntimeSynchronizer && /* @__PURE__ */ jsx23(RuntimeSynchronizer, {}),
|
@@ -1527,8 +1563,8 @@ var AssistantProvider = ({ children, runtime }) => {
|
|
1527
1563
|
});
|
1528
1564
|
const [context] = useState5(() => {
|
1529
1565
|
const useModelConfig = makeAssistantModelConfigStore();
|
1530
|
-
const
|
1531
|
-
return { useModelConfig,
|
1566
|
+
const useToolUIs = makeAssistantToolUIsStore();
|
1567
|
+
return { useModelConfig, useToolUIs };
|
1532
1568
|
});
|
1533
1569
|
const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);
|
1534
1570
|
useEffect7(() => {
|