@copilotkit/react-ui 1.5.11 → 1.5.12-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/{chunk-7II4YL7R.mjs → chunk-34FREWVK.mjs} +16 -6
- package/dist/chunk-34FREWVK.mjs.map +1 -0
- package/dist/chunk-3VNMQWGT.mjs +25 -0
- package/dist/chunk-3VNMQWGT.mjs.map +1 -0
- package/dist/{chunk-WSMMTZCM.mjs → chunk-B23XDGH4.mjs} +2 -2
- package/dist/chunk-F7VWGY77.mjs +22 -0
- package/dist/chunk-F7VWGY77.mjs.map +1 -0
- package/dist/chunk-HEIDCT7I.mjs +10 -0
- package/dist/chunk-HEIDCT7I.mjs.map +1 -0
- package/dist/{chunk-DCNCY2PL.mjs → chunk-I7MG52I5.mjs} +19 -9
- package/dist/chunk-I7MG52I5.mjs.map +1 -0
- package/dist/{chunk-375NVWZM.mjs → chunk-O6JFOQQA.mjs} +2 -2
- package/dist/chunk-OFYI4UU4.mjs +35 -0
- package/dist/chunk-OFYI4UU4.mjs.map +1 -0
- package/dist/{chunk-3E7HY2UN.mjs → chunk-P5A3A5FO.mjs} +58 -31
- package/dist/chunk-P5A3A5FO.mjs.map +1 -0
- package/dist/chunk-SQMEPWVT.mjs +1 -0
- package/dist/chunk-UWWMAJ7R.mjs +100 -0
- package/dist/chunk-UWWMAJ7R.mjs.map +1 -0
- package/dist/{chunk-UWVGLGFQ.mjs → chunk-VKVNMHM5.mjs} +14 -4
- package/dist/chunk-VKVNMHM5.mjs.map +1 -0
- package/dist/components/chat/Chat.d.ts +10 -2
- package/dist/components/chat/Chat.js +384 -271
- package/dist/components/chat/Chat.js.map +1 -1
- package/dist/components/chat/Chat.mjs +8 -6
- package/dist/components/chat/Messages.d.ts +1 -1
- package/dist/components/chat/Messages.js +15 -5
- package/dist/components/chat/Messages.js.map +1 -1
- package/dist/components/chat/Messages.mjs +1 -1
- package/dist/components/chat/Modal.d.ts +1 -1
- package/dist/components/chat/Modal.js +396 -279
- package/dist/components/chat/Modal.js.map +1 -1
- package/dist/components/chat/Modal.mjs +9 -7
- package/dist/components/chat/Popup.js +398 -281
- package/dist/components/chat/Popup.js.map +1 -1
- package/dist/components/chat/Popup.mjs +10 -8
- package/dist/components/chat/Sidebar.js +398 -281
- package/dist/components/chat/Sidebar.js.map +1 -1
- package/dist/components/chat/Sidebar.mjs +10 -8
- package/dist/components/chat/index.d.ts +4 -1
- package/dist/components/chat/index.js +406 -283
- package/dist/components/chat/index.js.map +1 -1
- package/dist/components/chat/index.mjs +22 -11
- package/dist/components/chat/messages/AssistantMessage.d.ts +7 -0
- package/dist/components/chat/messages/AssistantMessage.js +615 -0
- package/dist/components/chat/messages/AssistantMessage.js.map +1 -0
- package/dist/components/chat/messages/AssistantMessage.mjs +13 -0
- package/dist/components/chat/messages/AssistantMessage.mjs.map +1 -0
- package/dist/components/chat/messages/RenderActionExecutionMessage.js +59 -54
- package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +1 -3
- package/dist/components/chat/messages/RenderAgentStateMessage.js +55 -42
- package/dist/components/chat/messages/RenderAgentStateMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderAgentStateMessage.mjs +1 -3
- package/dist/components/chat/messages/RenderResultMessage.js +11 -29
- package/dist/components/chat/messages/RenderResultMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderResultMessage.mjs +1 -3
- package/dist/components/chat/messages/RenderTextMessage.js +11 -581
- package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderTextMessage.mjs +1 -6
- package/dist/components/chat/messages/UserMessage.d.ts +7 -0
- package/dist/components/chat/messages/UserMessage.js +34 -0
- package/dist/components/chat/messages/UserMessage.js.map +1 -0
- package/dist/components/chat/messages/UserMessage.mjs +8 -0
- package/dist/components/chat/messages/UserMessage.mjs.map +1 -0
- package/dist/components/chat/props.d.ts +36 -1
- package/dist/components/chat/props.js.map +1 -1
- package/dist/components/index.d.ts +4 -1
- package/dist/components/index.js +406 -283
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +22 -11
- package/dist/index.d.ts +4 -1
- package/dist/index.js +406 -283
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -11
- package/package.json +4 -4
- package/src/components/chat/Chat.tsx +25 -1
- package/src/components/chat/Messages.tsx +10 -0
- package/src/components/chat/Modal.tsx +7 -0
- package/src/components/chat/index.tsx +3 -0
- package/src/components/chat/messages/AssistantMessage.tsx +20 -0
- package/src/components/chat/messages/RenderActionExecutionMessage.tsx +45 -24
- package/src/components/chat/messages/RenderAgentStateMessage.tsx +39 -19
- package/src/components/chat/messages/RenderResultMessage.tsx +9 -7
- package/src/components/chat/messages/RenderTextMessage.tsx +12 -19
- package/src/components/chat/messages/UserMessage.tsx +5 -0
- package/src/components/chat/props.ts +43 -0
- package/dist/chunk-3E7HY2UN.mjs.map +0 -1
- package/dist/chunk-6INMITFA.mjs +0 -18
- package/dist/chunk-6INMITFA.mjs.map +0 -1
- package/dist/chunk-7II4YL7R.mjs.map +0 -1
- package/dist/chunk-DCNCY2PL.mjs.map +0 -1
- package/dist/chunk-MRFF7GSQ.mjs +0 -1
- package/dist/chunk-RU73BEZM.mjs +0 -41
- package/dist/chunk-RU73BEZM.mjs.map +0 -1
- package/dist/chunk-UWVGLGFQ.mjs.map +0 -1
- package/dist/chunk-ZABXREBH.mjs +0 -65
- package/dist/chunk-ZABXREBH.mjs.map +0 -1
- /package/dist/{chunk-WSMMTZCM.mjs.map → chunk-B23XDGH4.mjs.map} +0 -0
- /package/dist/{chunk-375NVWZM.mjs.map → chunk-O6JFOQQA.mjs.map} +0 -0
- /package/dist/{chunk-MRFF7GSQ.mjs.map → chunk-SQMEPWVT.mjs.map} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -1,26 +1,32 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import "./chunk-EFZPSZWO.mjs";
|
|
3
3
|
import "./chunk-MMVDU6DF.mjs";
|
|
4
|
-
import "./chunk-
|
|
4
|
+
import "./chunk-SQMEPWVT.mjs";
|
|
5
5
|
import {
|
|
6
6
|
CopilotSidebar
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-B23XDGH4.mjs";
|
|
8
8
|
import "./chunk-WB3YULQ4.mjs";
|
|
9
9
|
import {
|
|
10
10
|
CopilotPopup
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-O6JFOQQA.mjs";
|
|
12
|
+
import "./chunk-VKVNMHM5.mjs";
|
|
13
13
|
import "./chunk-YAGE7RCE.mjs";
|
|
14
14
|
import "./chunk-VEC45H6Q.mjs";
|
|
15
15
|
import "./chunk-RQNJNK2W.mjs";
|
|
16
16
|
import {
|
|
17
17
|
CopilotChat
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-I7MG52I5.mjs";
|
|
19
|
+
import "./chunk-UWWMAJ7R.mjs";
|
|
20
|
+
import "./chunk-F7VWGY77.mjs";
|
|
21
|
+
import "./chunk-OFYI4UU4.mjs";
|
|
22
|
+
import {
|
|
23
|
+
UserMessage
|
|
24
|
+
} from "./chunk-HEIDCT7I.mjs";
|
|
21
25
|
import "./chunk-V7W6IM2V.mjs";
|
|
22
|
-
import
|
|
23
|
-
|
|
26
|
+
import {
|
|
27
|
+
AssistantMessage
|
|
28
|
+
} from "./chunk-3VNMQWGT.mjs";
|
|
29
|
+
import "./chunk-P5A3A5FO.mjs";
|
|
24
30
|
import "./chunk-RJCZRKTV.mjs";
|
|
25
31
|
import {
|
|
26
32
|
CopilotDevConsole
|
|
@@ -34,8 +40,10 @@ import "./chunk-BH6PCAAL.mjs";
|
|
|
34
40
|
import "./chunk-OTPAZXVR.mjs";
|
|
35
41
|
import "./chunk-EMQEEXUB.mjs";
|
|
36
42
|
import "./chunk-YQFVRDNC.mjs";
|
|
37
|
-
import
|
|
38
|
-
|
|
43
|
+
import {
|
|
44
|
+
Markdown
|
|
45
|
+
} from "./chunk-YQ3D5IQV.mjs";
|
|
46
|
+
import "./chunk-34FREWVK.mjs";
|
|
39
47
|
import "./chunk-3XAXY2Z3.mjs";
|
|
40
48
|
import {
|
|
41
49
|
useChatContext
|
|
@@ -51,10 +59,13 @@ import "./chunk-54JAUBUJ.mjs";
|
|
|
51
59
|
import "./chunk-S5MBUNGN.mjs";
|
|
52
60
|
import "./chunk-MRXNTQOX.mjs";
|
|
53
61
|
export {
|
|
62
|
+
AssistantMessage,
|
|
54
63
|
CopilotChat,
|
|
55
64
|
CopilotDevConsole,
|
|
56
65
|
CopilotPopup,
|
|
57
66
|
CopilotSidebar,
|
|
67
|
+
Markdown,
|
|
68
|
+
UserMessage,
|
|
58
69
|
shouldShowDevConsole,
|
|
59
70
|
useChatContext,
|
|
60
71
|
useCopilotChatSuggestions
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"publishConfig": {
|
|
10
10
|
"access": "public"
|
|
11
11
|
},
|
|
12
|
-
"version": "1.5.
|
|
12
|
+
"version": "1.5.12-next.1",
|
|
13
13
|
"sideEffects": [
|
|
14
14
|
"**/*.css"
|
|
15
15
|
],
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"react-syntax-highlighter": "^15.5.0",
|
|
51
51
|
"remark-gfm": "^3.0.1",
|
|
52
52
|
"remark-math": "^5.1.1",
|
|
53
|
-
"@copilotkit/react-core": "1.5.
|
|
54
|
-
"@copilotkit/runtime-client-gql": "1.5.
|
|
55
|
-
"@copilotkit/shared": "1.5.
|
|
53
|
+
"@copilotkit/react-core": "1.5.12-next.1",
|
|
54
|
+
"@copilotkit/runtime-client-gql": "1.5.12-next.1",
|
|
55
|
+
"@copilotkit/shared": "1.5.12-next.1"
|
|
56
56
|
},
|
|
57
57
|
"keywords": [
|
|
58
58
|
"copilotkit",
|
|
@@ -58,6 +58,9 @@ import { RenderTextMessage as DefaultRenderTextMessage } from "./messages/Render
|
|
|
58
58
|
import { RenderActionExecutionMessage as DefaultRenderActionExecutionMessage } from "./messages/RenderActionExecutionMessage";
|
|
59
59
|
import { RenderResultMessage as DefaultRenderResultMessage } from "./messages/RenderResultMessage";
|
|
60
60
|
import { RenderAgentStateMessage as DefaultRenderAgentStateMessage } from "./messages/RenderAgentStateMessage";
|
|
61
|
+
import { AssistantMessage as DefaultAssistantMessage } from "./messages/AssistantMessage";
|
|
62
|
+
import { UserMessage as DefaultUserMessage } from "./messages/UserMessage";
|
|
63
|
+
import { Markdown as DefaultRenderer } from "./Markdown";
|
|
61
64
|
import { Suggestion } from "./Suggestion";
|
|
62
65
|
import React, { useEffect, useRef, useState } from "react";
|
|
63
66
|
import {
|
|
@@ -69,8 +72,15 @@ import {
|
|
|
69
72
|
import { reloadSuggestions } from "./Suggestion";
|
|
70
73
|
import { CopilotChatSuggestion } from "../../types/suggestions";
|
|
71
74
|
import { Message, Role, TextMessage } from "@copilotkit/runtime-client-gql";
|
|
72
|
-
import { InputProps, MessagesProps, RenderMessageProps, ResponseButtonProps } from "./props";
|
|
73
75
|
import { randomId } from "@copilotkit/shared";
|
|
76
|
+
import {
|
|
77
|
+
AssistantMessageProps,
|
|
78
|
+
InputProps,
|
|
79
|
+
MessagesProps,
|
|
80
|
+
RenderMessageProps,
|
|
81
|
+
ResponseButtonProps,
|
|
82
|
+
UserMessageProps,
|
|
83
|
+
} from "./props";
|
|
74
84
|
|
|
75
85
|
import { CopilotDevConsole } from "../dev-console";
|
|
76
86
|
import { HintFunction, runAgent, stopAgent } from "@copilotkit/react-core";
|
|
@@ -133,6 +143,16 @@ export interface CopilotChatProps {
|
|
|
133
143
|
*/
|
|
134
144
|
showResponseButton?: boolean;
|
|
135
145
|
|
|
146
|
+
/**
|
|
147
|
+
* A custom assistant message component to use instead of the default.
|
|
148
|
+
*/
|
|
149
|
+
AssistantMessage?: React.ComponentType<AssistantMessageProps>;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A custom user message component to use instead of the default.
|
|
153
|
+
*/
|
|
154
|
+
UserMessage?: React.ComponentType<UserMessageProps>;
|
|
155
|
+
|
|
136
156
|
/**
|
|
137
157
|
* A custom Messages component to use instead of the default.
|
|
138
158
|
*/
|
|
@@ -245,6 +265,8 @@ export function CopilotChat({
|
|
|
245
265
|
className,
|
|
246
266
|
icons,
|
|
247
267
|
labels,
|
|
268
|
+
AssistantMessage = DefaultAssistantMessage,
|
|
269
|
+
UserMessage = DefaultUserMessage,
|
|
248
270
|
}: CopilotChatProps) {
|
|
249
271
|
const context = useCopilotContext();
|
|
250
272
|
|
|
@@ -274,6 +296,8 @@ export function CopilotChat({
|
|
|
274
296
|
<WrappedCopilotChat icons={icons} labels={labels} className={className}>
|
|
275
297
|
<CopilotDevConsole />
|
|
276
298
|
<Messages
|
|
299
|
+
AssistantMessage={AssistantMessage}
|
|
300
|
+
UserMessage={UserMessage}
|
|
277
301
|
RenderTextMessage={RenderTextMessage}
|
|
278
302
|
RenderActionExecutionMessage={RenderActionExecutionMessage}
|
|
279
303
|
RenderAgentStateMessage={RenderAgentStateMessage}
|
|
@@ -11,6 +11,8 @@ export const Messages = ({
|
|
|
11
11
|
RenderActionExecutionMessage,
|
|
12
12
|
RenderAgentStateMessage,
|
|
13
13
|
RenderResultMessage,
|
|
14
|
+
AssistantMessage,
|
|
15
|
+
UserMessage,
|
|
14
16
|
}: MessagesProps) => {
|
|
15
17
|
const context = useChatContext();
|
|
16
18
|
const initialMessages = useMemo(
|
|
@@ -49,6 +51,8 @@ export const Messages = ({
|
|
|
49
51
|
inProgress={inProgress}
|
|
50
52
|
index={index}
|
|
51
53
|
isCurrentMessage={isCurrentMessage}
|
|
54
|
+
AssistantMessage={AssistantMessage}
|
|
55
|
+
UserMessage={UserMessage}
|
|
52
56
|
/>
|
|
53
57
|
);
|
|
54
58
|
} else if (message.isActionExecutionMessage()) {
|
|
@@ -60,6 +64,8 @@ export const Messages = ({
|
|
|
60
64
|
index={index}
|
|
61
65
|
isCurrentMessage={isCurrentMessage}
|
|
62
66
|
actionResult={actionResults[message.id]}
|
|
67
|
+
AssistantMessage={AssistantMessage}
|
|
68
|
+
UserMessage={UserMessage}
|
|
63
69
|
/>
|
|
64
70
|
);
|
|
65
71
|
} else if (message.isAgentStateMessage()) {
|
|
@@ -70,6 +76,8 @@ export const Messages = ({
|
|
|
70
76
|
inProgress={inProgress}
|
|
71
77
|
index={index}
|
|
72
78
|
isCurrentMessage={isCurrentMessage}
|
|
79
|
+
AssistantMessage={AssistantMessage}
|
|
80
|
+
UserMessage={UserMessage}
|
|
73
81
|
/>
|
|
74
82
|
);
|
|
75
83
|
} else if (message.isResultMessage()) {
|
|
@@ -80,6 +88,8 @@ export const Messages = ({
|
|
|
80
88
|
inProgress={inProgress}
|
|
81
89
|
index={index}
|
|
82
90
|
isCurrentMessage={isCurrentMessage}
|
|
91
|
+
AssistantMessage={AssistantMessage}
|
|
92
|
+
UserMessage={UserMessage}
|
|
83
93
|
/>
|
|
84
94
|
);
|
|
85
95
|
}
|
|
@@ -8,6 +8,9 @@ import { Messages as DefaultMessages } from "./Messages";
|
|
|
8
8
|
import { Input as DefaultInput } from "./Input";
|
|
9
9
|
import { ResponseButton as DefaultResponseButton } from "./Response";
|
|
10
10
|
import { CopilotChat, CopilotChatProps } from "./Chat";
|
|
11
|
+
import { Markdown as DefaultRenderer } from "./Markdown";
|
|
12
|
+
import { AssistantMessage as DefaultAssistantMessage } from "./messages/AssistantMessage";
|
|
13
|
+
import { UserMessage as DefaultUserMessage } from "./messages/UserMessage";
|
|
11
14
|
|
|
12
15
|
export interface CopilotModalProps extends CopilotChatProps {
|
|
13
16
|
/**
|
|
@@ -77,6 +80,8 @@ export const CopilotModal = ({
|
|
|
77
80
|
Messages = DefaultMessages,
|
|
78
81
|
Input = DefaultInput,
|
|
79
82
|
ResponseButton = DefaultResponseButton,
|
|
83
|
+
AssistantMessage = DefaultAssistantMessage,
|
|
84
|
+
UserMessage = DefaultUserMessage,
|
|
80
85
|
className,
|
|
81
86
|
children,
|
|
82
87
|
}: CopilotModalProps) => {
|
|
@@ -109,6 +114,8 @@ export const CopilotModal = ({
|
|
|
109
114
|
Messages={Messages}
|
|
110
115
|
Input={Input}
|
|
111
116
|
ResponseButton={ResponseButton}
|
|
117
|
+
AssistantMessage={AssistantMessage}
|
|
118
|
+
UserMessage={UserMessage}
|
|
112
119
|
/>
|
|
113
120
|
</Window>
|
|
114
121
|
</div>
|
|
@@ -2,4 +2,7 @@ export * from "./props";
|
|
|
2
2
|
export { CopilotPopup } from "./Popup";
|
|
3
3
|
export { CopilotSidebar } from "./Sidebar";
|
|
4
4
|
export { CopilotChat } from "./Chat";
|
|
5
|
+
export { Markdown } from "./Markdown";
|
|
6
|
+
export { AssistantMessage } from "./messages/AssistantMessage";
|
|
7
|
+
export { UserMessage } from "./messages/UserMessage";
|
|
5
8
|
export { useChatContext } from "./ChatContext";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AssistantMessageProps } from "../props";
|
|
2
|
+
import { useChatContext } from "../ChatContext";
|
|
3
|
+
import { Markdown } from "../Markdown";
|
|
4
|
+
|
|
5
|
+
export const AssistantMessage = (props: AssistantMessageProps) => {
|
|
6
|
+
const { icons } = useChatContext();
|
|
7
|
+
const { message, isLoading, subComponent } = props;
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<>
|
|
11
|
+
{(message || isLoading) && (
|
|
12
|
+
<div className="copilotKitMessage copilotKitAssistantMessage">
|
|
13
|
+
{message && <Markdown content={message || ""} />}
|
|
14
|
+
{isLoading && icons.spinnerIcon}
|
|
15
|
+
</div>
|
|
16
|
+
)}
|
|
17
|
+
<div style={{ marginBottom: "0.5rem" }}>{subComponent}</div>
|
|
18
|
+
</>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { MessageStatusCode } from "@copilotkit/runtime-client-gql";
|
|
2
2
|
import { RenderMessageProps } from "../props";
|
|
3
|
-
import { useChatContext } from "../ChatContext";
|
|
4
3
|
import { RenderFunctionStatus, useCopilotContext } from "@copilotkit/react-core";
|
|
5
4
|
|
|
6
5
|
export function RenderActionExecutionMessage(props: RenderMessageProps) {
|
|
7
|
-
const { message, inProgress, index, isCurrentMessage, actionResult } = props;
|
|
8
6
|
const { chatComponentsCache } = useCopilotContext();
|
|
9
|
-
const {
|
|
7
|
+
const { message, inProgress, index, isCurrentMessage, actionResult, AssistantMessage } = props;
|
|
10
8
|
|
|
11
9
|
if (message.isActionExecutionMessage()) {
|
|
12
10
|
if (
|
|
@@ -22,9 +20,14 @@ export function RenderActionExecutionMessage(props: RenderMessageProps) {
|
|
|
22
20
|
// when render is static, we show it only when in progress
|
|
23
21
|
if (isCurrentMessage && inProgress) {
|
|
24
22
|
return (
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
<AssistantMessage
|
|
24
|
+
rawData={message}
|
|
25
|
+
key={index}
|
|
26
|
+
data-message-role="assistant"
|
|
27
|
+
isLoading={false}
|
|
28
|
+
isGenerating={true}
|
|
29
|
+
message={render}
|
|
30
|
+
/>
|
|
28
31
|
);
|
|
29
32
|
}
|
|
30
33
|
// Done - silent by default to avoid a series of "done" messages
|
|
@@ -57,30 +60,44 @@ export function RenderActionExecutionMessage(props: RenderMessageProps) {
|
|
|
57
60
|
}
|
|
58
61
|
if (typeof toRender === "string") {
|
|
59
62
|
return (
|
|
60
|
-
<
|
|
61
|
-
{
|
|
62
|
-
|
|
63
|
+
<AssistantMessage
|
|
64
|
+
rawData={message}
|
|
65
|
+
data-message-role="assistant"
|
|
66
|
+
key={index}
|
|
67
|
+
isLoading={false}
|
|
68
|
+
isGenerating={false}
|
|
69
|
+
message={toRender}
|
|
70
|
+
/>
|
|
63
71
|
);
|
|
64
72
|
} else {
|
|
65
73
|
return (
|
|
66
|
-
<
|
|
74
|
+
<AssistantMessage
|
|
75
|
+
rawData={message}
|
|
76
|
+
data-message-role="action-render"
|
|
67
77
|
key={index}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
</div>
|
|
78
|
+
isLoading={false}
|
|
79
|
+
isGenerating={false}
|
|
80
|
+
subComponent={toRender}
|
|
81
|
+
/>
|
|
73
82
|
);
|
|
74
83
|
}
|
|
75
84
|
} catch (e) {
|
|
76
85
|
console.error(`Error executing render function for action ${message.name}: ${e}`);
|
|
77
86
|
return (
|
|
78
|
-
<
|
|
79
|
-
{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
{
|
|
83
|
-
|
|
87
|
+
<AssistantMessage
|
|
88
|
+
rawData={message}
|
|
89
|
+
data-message-role="assistant"
|
|
90
|
+
key={index}
|
|
91
|
+
isLoading={false}
|
|
92
|
+
isGenerating={false}
|
|
93
|
+
subComponent={
|
|
94
|
+
<div>
|
|
95
|
+
<b>❌ Error executing render: {message.name}</b>
|
|
96
|
+
<br />
|
|
97
|
+
{e instanceof Error ? e.message : String(e)}
|
|
98
|
+
</div>
|
|
99
|
+
}
|
|
100
|
+
/>
|
|
84
101
|
);
|
|
85
102
|
}
|
|
86
103
|
}
|
|
@@ -92,9 +109,13 @@ export function RenderActionExecutionMessage(props: RenderMessageProps) {
|
|
|
92
109
|
} else {
|
|
93
110
|
// In progress
|
|
94
111
|
return (
|
|
95
|
-
<
|
|
96
|
-
{
|
|
97
|
-
|
|
112
|
+
<AssistantMessage
|
|
113
|
+
rawData={message}
|
|
114
|
+
key={index}
|
|
115
|
+
data-message-role="assistant"
|
|
116
|
+
isLoading={true}
|
|
117
|
+
isGenerating={true}
|
|
118
|
+
/>
|
|
98
119
|
);
|
|
99
120
|
}
|
|
100
121
|
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { AgentStateMessage } from "@copilotkit/runtime-client-gql";
|
|
2
1
|
import { RenderMessageProps } from "../props";
|
|
3
|
-
import { useChatContext } from "../ChatContext";
|
|
4
2
|
import { CoagentInChatRenderFunction, useCopilotContext } from "@copilotkit/react-core";
|
|
5
3
|
|
|
6
4
|
export function RenderAgentStateMessage(props: RenderMessageProps) {
|
|
7
|
-
const { message, inProgress, index, isCurrentMessage } = props;
|
|
8
5
|
const { chatComponentsCache } = useCopilotContext();
|
|
9
|
-
const {
|
|
6
|
+
const { message, inProgress, index, isCurrentMessage, AssistantMessage } = props;
|
|
10
7
|
|
|
11
8
|
if (message.isAgentStateMessage()) {
|
|
12
9
|
let render: string | CoagentInChatRenderFunction | undefined;
|
|
@@ -24,9 +21,14 @@ export function RenderAgentStateMessage(props: RenderMessageProps) {
|
|
|
24
21
|
// when render is static, we show it only when in progress
|
|
25
22
|
if (isCurrentMessage && inProgress) {
|
|
26
23
|
return (
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
<AssistantMessage
|
|
25
|
+
rawData={message}
|
|
26
|
+
message={render}
|
|
27
|
+
data-message-role="assistant"
|
|
28
|
+
key={index}
|
|
29
|
+
isLoading={true}
|
|
30
|
+
isGenerating={true}
|
|
31
|
+
/>
|
|
30
32
|
);
|
|
31
33
|
}
|
|
32
34
|
// Done - silent by default to avoid a series of "done" messages
|
|
@@ -53,9 +55,13 @@ export function RenderAgentStateMessage(props: RenderMessageProps) {
|
|
|
53
55
|
|
|
54
56
|
if (!toRender && isCurrentMessage && inProgress) {
|
|
55
57
|
return (
|
|
56
|
-
<
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
<AssistantMessage
|
|
59
|
+
data-message-role="assistant"
|
|
60
|
+
key={index}
|
|
61
|
+
rawData={message}
|
|
62
|
+
isLoading={true}
|
|
63
|
+
isGenerating={true}
|
|
64
|
+
/>
|
|
59
65
|
);
|
|
60
66
|
} else if (!toRender) {
|
|
61
67
|
return null;
|
|
@@ -63,15 +69,25 @@ export function RenderAgentStateMessage(props: RenderMessageProps) {
|
|
|
63
69
|
|
|
64
70
|
if (typeof toRender === "string") {
|
|
65
71
|
return (
|
|
66
|
-
<
|
|
67
|
-
{
|
|
68
|
-
|
|
72
|
+
<AssistantMessage
|
|
73
|
+
rawData={message}
|
|
74
|
+
message={toRender}
|
|
75
|
+
isLoading={true}
|
|
76
|
+
isGenerating={true}
|
|
77
|
+
data-message-role="assistant"
|
|
78
|
+
key={index}
|
|
79
|
+
/>
|
|
69
80
|
);
|
|
70
81
|
} else {
|
|
71
82
|
return (
|
|
72
|
-
<
|
|
73
|
-
{
|
|
74
|
-
|
|
83
|
+
<AssistantMessage
|
|
84
|
+
rawData={message}
|
|
85
|
+
data-message-role="agent-state-render"
|
|
86
|
+
key={index}
|
|
87
|
+
isLoading={false}
|
|
88
|
+
isGenerating={false}
|
|
89
|
+
subComponent={toRender}
|
|
90
|
+
/>
|
|
75
91
|
);
|
|
76
92
|
}
|
|
77
93
|
}
|
|
@@ -83,9 +99,13 @@ export function RenderAgentStateMessage(props: RenderMessageProps) {
|
|
|
83
99
|
} else {
|
|
84
100
|
// In progress
|
|
85
101
|
return (
|
|
86
|
-
<
|
|
87
|
-
{
|
|
88
|
-
|
|
102
|
+
<AssistantMessage
|
|
103
|
+
rawData={message}
|
|
104
|
+
isLoading={true}
|
|
105
|
+
isGenerating={true}
|
|
106
|
+
data-message-role="assistant"
|
|
107
|
+
key={index}
|
|
108
|
+
/>
|
|
89
109
|
);
|
|
90
110
|
}
|
|
91
111
|
}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { ResultMessage } from "@copilotkit/runtime-client-gql";
|
|
2
1
|
import { RenderMessageProps } from "../props";
|
|
3
|
-
import { useChatContext } from "../ChatContext";
|
|
4
2
|
|
|
5
3
|
export function RenderResultMessage(props: RenderMessageProps) {
|
|
6
|
-
const { message, inProgress, index, isCurrentMessage } = props;
|
|
7
|
-
|
|
4
|
+
const { message, inProgress, index, isCurrentMessage, AssistantMessage } = props;
|
|
5
|
+
|
|
8
6
|
if (message.isResultMessage() && inProgress && isCurrentMessage) {
|
|
9
7
|
return (
|
|
10
|
-
<
|
|
11
|
-
{
|
|
12
|
-
|
|
8
|
+
<AssistantMessage
|
|
9
|
+
key={index}
|
|
10
|
+
data-message-role="assistant"
|
|
11
|
+
rawData={message}
|
|
12
|
+
isLoading={true}
|
|
13
|
+
isGenerating={true}
|
|
14
|
+
/>
|
|
13
15
|
);
|
|
14
16
|
}
|
|
15
17
|
}
|
|
@@ -1,35 +1,28 @@
|
|
|
1
|
-
import { TextMessage } from "@copilotkit/runtime-client-gql";
|
|
2
1
|
import { RenderMessageProps } from "../props";
|
|
3
|
-
import { Markdown } from "../Markdown";
|
|
4
|
-
import { useChatContext } from "../ChatContext";
|
|
5
2
|
|
|
6
3
|
export function RenderTextMessage(props: RenderMessageProps) {
|
|
7
|
-
const { message, inProgress, index, isCurrentMessage } = props;
|
|
8
|
-
|
|
4
|
+
const { message, inProgress, index, isCurrentMessage, UserMessage, AssistantMessage } = props;
|
|
5
|
+
|
|
9
6
|
if (message.isTextMessage()) {
|
|
10
7
|
if (message.role === "user") {
|
|
11
8
|
return (
|
|
12
|
-
<
|
|
9
|
+
<UserMessage
|
|
13
10
|
key={index}
|
|
14
11
|
data-message-role="user"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
</div>
|
|
12
|
+
message={message.content}
|
|
13
|
+
rawData={message}
|
|
14
|
+
/>
|
|
19
15
|
);
|
|
20
16
|
} else if (message.role == "assistant") {
|
|
21
17
|
return (
|
|
22
|
-
<
|
|
18
|
+
<AssistantMessage
|
|
23
19
|
key={index}
|
|
24
20
|
data-message-role="assistant"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
{
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<Markdown content={message.content} />
|
|
31
|
-
)}
|
|
32
|
-
</div>
|
|
21
|
+
message={message.content}
|
|
22
|
+
rawData={message}
|
|
23
|
+
isLoading={inProgress && isCurrentMessage && !message.content}
|
|
24
|
+
isGenerating={inProgress && isCurrentMessage && !!message.content}
|
|
25
|
+
/>
|
|
33
26
|
);
|
|
34
27
|
}
|
|
35
28
|
}
|
|
@@ -23,18 +23,61 @@ export interface MessagesProps {
|
|
|
23
23
|
messages: Message[];
|
|
24
24
|
inProgress: boolean;
|
|
25
25
|
children?: React.ReactNode;
|
|
26
|
+
AssistantMessage: React.ComponentType<AssistantMessageProps>;
|
|
27
|
+
UserMessage: React.ComponentType<UserMessageProps>;
|
|
26
28
|
RenderTextMessage: React.ComponentType<RenderMessageProps>;
|
|
27
29
|
RenderActionExecutionMessage: React.ComponentType<RenderMessageProps>;
|
|
28
30
|
RenderAgentStateMessage: React.ComponentType<RenderMessageProps>;
|
|
29
31
|
RenderResultMessage: React.ComponentType<RenderMessageProps>;
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
export interface Renderer {
|
|
35
|
+
content: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface UserMessageProps {
|
|
39
|
+
message?: string;
|
|
40
|
+
rawData: any;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface AssistantMessageProps {
|
|
44
|
+
/**
|
|
45
|
+
* The message content from the assistant
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
message?: string;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The raw data from the assistant's response
|
|
52
|
+
*/
|
|
53
|
+
rawData: any;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* A component that was decided to render by the LLM.
|
|
57
|
+
* When working with useCopilotActions and useCoAgentStateRender, this will be
|
|
58
|
+
* the render component that was specified.
|
|
59
|
+
*/
|
|
60
|
+
subComponent?: React.JSX.Element;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Whether a response is loading, this is when the LLM is thinking of a response but hasn't finished yet.
|
|
64
|
+
*/
|
|
65
|
+
isLoading: boolean;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Whether a response is generating, this is when the LLM is actively generating and streaming content.
|
|
69
|
+
*/
|
|
70
|
+
isGenerating: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
32
73
|
export interface RenderMessageProps {
|
|
33
74
|
message: Message;
|
|
34
75
|
inProgress: boolean;
|
|
35
76
|
index: number;
|
|
36
77
|
isCurrentMessage: boolean;
|
|
37
78
|
actionResult?: string;
|
|
79
|
+
AssistantMessage: React.ComponentType<AssistantMessageProps>;
|
|
80
|
+
UserMessage: React.ComponentType<UserMessageProps>;
|
|
38
81
|
}
|
|
39
82
|
|
|
40
83
|
export interface InputProps {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat/messages/RenderActionExecutionMessage.tsx"],"sourcesContent":["import { MessageStatusCode } from \"@copilotkit/runtime-client-gql\";\nimport { RenderMessageProps } from \"../props\";\nimport { useChatContext } from \"../ChatContext\";\nimport { RenderFunctionStatus, useCopilotContext } from \"@copilotkit/react-core\";\n\nexport function RenderActionExecutionMessage(props: RenderMessageProps) {\n const { message, inProgress, index, isCurrentMessage, actionResult } = props;\n const { chatComponentsCache } = useCopilotContext();\n const { icons } = useChatContext();\n\n if (message.isActionExecutionMessage()) {\n if (\n chatComponentsCache.current !== null &&\n (chatComponentsCache.current.actions[message.name] ||\n chatComponentsCache.current.actions[\"*\"])\n ) {\n const render =\n chatComponentsCache.current.actions[message.name] ||\n chatComponentsCache.current.actions[\"*\"];\n // render a static string\n if (typeof render === \"string\") {\n // when render is static, we show it only when in progress\n if (isCurrentMessage && inProgress) {\n return (\n <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>\n {icons.spinnerIcon} <span className=\"inProgressLabel\">{render}</span>\n </div>\n );\n }\n // Done - silent by default to avoid a series of \"done\" messages\n else {\n return null;\n }\n }\n // render is a function\n else {\n const args = message.arguments;\n\n let status: RenderFunctionStatus = \"inProgress\";\n\n if (actionResult !== undefined) {\n status = \"complete\";\n } else if (message.status.code !== MessageStatusCode.Pending) {\n status = \"executing\";\n }\n\n try {\n const toRender = render({\n status: status as any,\n args,\n result: actionResult,\n name: message.name,\n });\n // No result and complete: stay silent\n if (!toRender && status === \"complete\") {\n return null;\n }\n if (typeof toRender === \"string\") {\n return (\n <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>\n {isCurrentMessage && inProgress && icons.spinnerIcon} {toRender}\n </div>\n );\n } else {\n return (\n <div\n key={index}\n data-message-type=\"action-render\"\n className=\"copilotKitCustomAssistantMessage\"\n >\n {toRender}\n </div>\n );\n }\n } catch (e) {\n console.error(`Error executing render function for action ${message.name}: ${e}`);\n return (\n <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>\n {isCurrentMessage && inProgress && icons.spinnerIcon}\n <b>❌ Error executing render: {message.name}</b>\n <br />\n {e instanceof Error ? e.message : String(e)}\n </div>\n );\n }\n }\n }\n // No render function found- show the default message\n else if (!inProgress || !isCurrentMessage) {\n // Done - silent by default to avoid a series of \"done\" messages\n return null;\n } else {\n // In progress\n return (\n <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>\n {icons.spinnerIcon}\n </div>\n );\n }\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,yBAAyB;AAGlC,SAA+B,yBAAyB;AAqB5C,SACsB,KADtB;AAnBL,SAAS,6BAA6B,OAA2B;AACtE,QAAM,EAAE,SAAS,YAAY,OAAO,kBAAkB,aAAa,IAAI;AACvE,QAAM,EAAE,oBAAoB,IAAI,kBAAkB;AAClD,QAAM,EAAE,MAAM,IAAI,eAAe;AAEjC,MAAI,QAAQ,yBAAyB,GAAG;AACtC,QACE,oBAAoB,YAAY,SAC/B,oBAAoB,QAAQ,QAAQ,QAAQ,IAAI,KAC/C,oBAAoB,QAAQ,QAAQ,GAAG,IACzC;AACA,YAAM,SACJ,oBAAoB,QAAQ,QAAQ,QAAQ,IAAI,KAChD,oBAAoB,QAAQ,QAAQ,GAAG;AAEzC,UAAI,OAAO,WAAW,UAAU;AAE9B,YAAI,oBAAoB,YAAY;AAClC,iBACE,qBAAC,SAAgB,WAAW,gDACzB;AAAA,kBAAM;AAAA,YAAY;AAAA,YAAC,oBAAC,UAAK,WAAU,mBAAmB,kBAAO;AAAA,eADtD,KAEV;AAAA,QAEJ,OAEK;AACH,iBAAO;AAAA,QACT;AAAA,MACF,OAEK;AACH,cAAM,OAAO,QAAQ;AAErB,YAAI,SAA+B;AAEnC,YAAI,iBAAiB,QAAW;AAC9B,mBAAS;AAAA,QACX,WAAW,QAAQ,OAAO,SAAS,kBAAkB,SAAS;AAC5D,mBAAS;AAAA,QACX;AAEA,YAAI;AACF,gBAAM,WAAW,OAAO;AAAA,YACtB;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,MAAM,QAAQ;AAAA,UAChB,CAAC;AAED,cAAI,CAAC,YAAY,WAAW,YAAY;AACtC,mBAAO;AAAA,UACT;AACA,cAAI,OAAO,aAAa,UAAU;AAChC,mBACE,qBAAC,SAAgB,WAAW,gDACzB;AAAA,kCAAoB,cAAc,MAAM;AAAA,cAAY;AAAA,cAAE;AAAA,iBAD/C,KAEV;AAAA,UAEJ,OAAO;AACL,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,qBAAkB;AAAA,gBAClB,WAAU;AAAA,gBAET;AAAA;AAAA,cAJI;AAAA,YAKP;AAAA,UAEJ;AAAA,QACF,SAAS,GAAP;AACA,kBAAQ,MAAM,8CAA8C,QAAQ,SAAS,GAAG;AAChF,iBACE,qBAAC,SAAgB,WAAW,gDACzB;AAAA,gCAAoB,cAAc,MAAM;AAAA,YACzC,qBAAC,OAAE;AAAA;AAAA,cAA2B,QAAQ;AAAA,eAAK;AAAA,YAC3C,oBAAC,QAAG;AAAA,YACH,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,eAJlC,KAKV;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,WAES,CAAC,cAAc,CAAC,kBAAkB;AAEzC,aAAO;AAAA,IACT,OAAO;AAEL,aACE,oBAAC,SAAgB,WAAW,gDACzB,gBAAM,eADC,KAEV;AAAA,IAEJ;AAAA,EACF;AACF;","names":[]}
|
package/dist/chunk-6INMITFA.mjs
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
useChatContext
|
|
3
|
-
} from "./chunk-CBBFRI3Q.mjs";
|
|
4
|
-
|
|
5
|
-
// src/components/chat/messages/RenderResultMessage.tsx
|
|
6
|
-
import { jsx } from "react/jsx-runtime";
|
|
7
|
-
function RenderResultMessage(props) {
|
|
8
|
-
const { message, inProgress, index, isCurrentMessage } = props;
|
|
9
|
-
const { icons } = useChatContext();
|
|
10
|
-
if (message.isResultMessage() && inProgress && isCurrentMessage) {
|
|
11
|
-
return /* @__PURE__ */ jsx("div", { className: `copilotKitMessage copilotKitAssistantMessage`, children: icons.spinnerIcon }, index);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
RenderResultMessage
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=chunk-6INMITFA.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat/messages/RenderResultMessage.tsx"],"sourcesContent":["import { ResultMessage } from \"@copilotkit/runtime-client-gql\";\nimport { RenderMessageProps } from \"../props\";\nimport { useChatContext } from \"../ChatContext\";\n\nexport function RenderResultMessage(props: RenderMessageProps) {\n const { message, inProgress, index, isCurrentMessage } = props;\n const { icons } = useChatContext();\n if (message.isResultMessage() && inProgress && isCurrentMessage) {\n return (\n <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>\n {icons.spinnerIcon}\n </div>\n );\n }\n}\n"],"mappings":";;;;;AASM;AALC,SAAS,oBAAoB,OAA2B;AAC7D,QAAM,EAAE,SAAS,YAAY,OAAO,iBAAiB,IAAI;AACzD,QAAM,EAAE,MAAM,IAAI,eAAe;AACjC,MAAI,QAAQ,gBAAgB,KAAK,cAAc,kBAAkB;AAC/D,WACE,oBAAC,SAAgB,WAAW,gDACzB,gBAAM,eADC,KAEV;AAAA,EAEJ;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat/Messages.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef } from \"react\";\nimport { MessagesProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport { Message, ResultMessage, TextMessage, Role } from \"@copilotkit/runtime-client-gql\";\n\nexport const Messages = ({\n messages,\n inProgress,\n children,\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n}: MessagesProps) => {\n const context = useChatContext();\n const initialMessages = useMemo(\n () => makeInitialMessages(context.labels.initial),\n [context.labels.initial],\n );\n messages = [...initialMessages, ...messages];\n\n const actionResults: Record<string, string> = {};\n\n for (let i = 0; i < messages.length; i++) {\n if (messages[i].isActionExecutionMessage()) {\n const id = messages[i].id;\n const resultMessage: ResultMessage | undefined = messages.find(\n (message) => message.isResultMessage() && message.actionExecutionId === id,\n ) as ResultMessage | undefined;\n\n if (resultMessage) {\n actionResults[id] = ResultMessage.decodeResult(resultMessage.result || \"\");\n }\n }\n }\n\n const { messagesEndRef, messagesContainerRef } = useScrollToBottom(messages);\n\n return (\n <div className=\"copilotKitMessages\" ref={messagesContainerRef}>\n {messages.map((message, index) => {\n const isCurrentMessage = index === messages.length - 1;\n\n if (message.isTextMessage()) {\n return (\n <RenderTextMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n />\n );\n } else if (message.isActionExecutionMessage()) {\n return (\n <RenderActionExecutionMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n actionResult={actionResults[message.id]}\n />\n );\n } else if (message.isAgentStateMessage()) {\n return (\n <RenderAgentStateMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n />\n );\n } else if (message.isResultMessage()) {\n return (\n <RenderResultMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n />\n );\n }\n })}\n <footer ref={messagesEndRef}>{children}</footer>\n </div>\n );\n};\n\nfunction makeInitialMessages(initial?: string | string[]): Message[] {\n let initialArray: string[] = [];\n if (initial) {\n if (Array.isArray(initial)) {\n initialArray.push(...initial);\n } else {\n initialArray.push(initial);\n }\n }\n\n return initialArray.map(\n (message) =>\n new TextMessage({\n role: Role.Assistant,\n content: message,\n }),\n );\n}\nexport function useScrollToBottom(messages: any[]) {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const messagesContainerRef = useRef<HTMLDivElement | null>(null);\n const isProgrammaticScrollRef = useRef(false);\n const isUserScrollUpRef = useRef(false);\n\n const scrollToBottom = () => {\n if (messagesEndRef.current) {\n isProgrammaticScrollRef.current = true;\n messagesEndRef.current.scrollIntoView({\n behavior: \"auto\",\n });\n }\n };\n\n const handleScroll = () => {\n if (isProgrammaticScrollRef.current) {\n isProgrammaticScrollRef.current = false;\n return;\n }\n\n if (messagesContainerRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = messagesContainerRef.current;\n isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;\n }\n };\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (container) {\n container.addEventListener(\"scroll\", handleScroll);\n }\n return () => {\n if (container) {\n container.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (!container) {\n return;\n }\n\n const mutationObserver = new MutationObserver(() => {\n if (!isUserScrollUpRef.current) {\n scrollToBottom();\n }\n });\n\n mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return () => {\n mutationObserver.disconnect();\n };\n }, []);\n\n useEffect(() => {\n isUserScrollUpRef.current = false;\n scrollToBottom();\n }, [messages.filter((m) => m.isTextMessage() && m.role === Role.User).length]);\n\n return { messagesEndRef, messagesContainerRef };\n}\n"],"mappings":"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","names":[]}
|