@copilotkit/react-ui 1.8.13-next.1 → 1.8.13-next.2
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 +9 -0
- package/dist/{chunk-ZDKVXAL3.mjs → chunk-3R6CEFJE.mjs} +11 -9
- package/dist/chunk-3R6CEFJE.mjs.map +1 -0
- package/dist/{chunk-RVLCPPEL.mjs → chunk-5INP2EWU.mjs} +6 -4
- package/dist/chunk-5INP2EWU.mjs.map +1 -0
- package/dist/{chunk-XFCMZH2H.mjs → chunk-6VUDBDUN.mjs} +2 -2
- package/dist/{chunk-MDMNZ6JL.mjs → chunk-756IINQI.mjs} +2 -2
- package/dist/{chunk-24TDU7MY.mjs → chunk-ALWZ35SI.mjs} +2 -2
- package/dist/{chunk-IIRQWGWV.mjs → chunk-B3D7U7TJ.mjs} +5 -3
- package/dist/chunk-B3D7U7TJ.mjs.map +1 -0
- package/dist/{chunk-KQ44Z255.mjs → chunk-EMIYIMQ6.mjs} +4 -4
- package/dist/{chunk-K7SXHJRT.mjs → chunk-IQ7DDXDA.mjs} +2 -2
- package/dist/{chunk-DSQGQJI4.mjs → chunk-MPZAMNCN.mjs} +2 -2
- package/dist/{chunk-LUPGADWY.mjs → chunk-UKWBNVMQ.mjs} +2 -2
- package/dist/{chunk-OZXUB3V7.mjs → chunk-XMNTLIK5.mjs} +5 -4
- package/dist/chunk-XMNTLIK5.mjs.map +1 -0
- package/dist/chunk-YTXEWDNC.mjs +117 -0
- package/dist/chunk-YTXEWDNC.mjs.map +1 -0
- package/dist/{chunk-NWE7CLTB.mjs → chunk-ZRW27A32.mjs} +11 -9
- package/dist/chunk-ZRW27A32.mjs.map +1 -0
- package/dist/components/chat/Button.d.ts +1 -0
- package/dist/components/chat/Chat.d.ts +7 -2
- package/dist/components/chat/Chat.js +78 -26
- package/dist/components/chat/Chat.js.map +1 -1
- package/dist/components/chat/Chat.mjs +11 -11
- package/dist/components/chat/Header.d.ts +1 -0
- package/dist/components/chat/Input.d.ts +1 -0
- package/dist/components/chat/Input.mjs +2 -2
- package/dist/components/chat/Markdown.d.ts +3 -1
- package/dist/components/chat/Markdown.js +65 -20
- package/dist/components/chat/Markdown.js.map +1 -1
- package/dist/components/chat/Markdown.mjs +1 -1
- package/dist/components/chat/Messages.d.ts +1 -1
- package/dist/components/chat/Messages.js +4 -2
- 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 +81 -27
- package/dist/components/chat/Modal.js.map +1 -1
- package/dist/components/chat/Modal.mjs +18 -18
- package/dist/components/chat/Popup.js +81 -27
- package/dist/components/chat/Popup.js.map +1 -1
- package/dist/components/chat/Popup.mjs +19 -19
- package/dist/components/chat/Sidebar.js +81 -27
- package/dist/components/chat/Sidebar.js.map +1 -1
- package/dist/components/chat/Sidebar.mjs +19 -19
- package/dist/components/chat/Suggestion.d.ts +1 -0
- package/dist/components/chat/Window.d.ts +1 -0
- package/dist/components/chat/index.d.ts +3 -2
- package/dist/components/chat/index.js +81 -27
- package/dist/components/chat/index.js.map +1 -1
- package/dist/components/chat/index.mjs +23 -23
- package/dist/components/chat/messages/AssistantMessage.d.ts +1 -0
- package/dist/components/chat/messages/AssistantMessage.js +68 -22
- package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
- package/dist/components/chat/messages/AssistantMessage.mjs +2 -2
- package/dist/components/chat/messages/RenderActionExecutionMessage.d.ts +1 -0
- package/dist/components/chat/messages/RenderActionExecutionMessage.js +68 -22
- package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +3 -3
- package/dist/components/chat/messages/RenderAgentStateMessage.d.ts +1 -0
- package/dist/components/chat/messages/RenderAgentStateMessage.js +68 -22
- package/dist/components/chat/messages/RenderAgentStateMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderAgentStateMessage.mjs +3 -3
- package/dist/components/chat/messages/RenderImageMessage.d.ts +1 -0
- package/dist/components/chat/messages/RenderImageMessage.js +68 -22
- package/dist/components/chat/messages/RenderImageMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderImageMessage.mjs +3 -3
- package/dist/components/chat/messages/RenderResultMessage.d.ts +1 -0
- package/dist/components/chat/messages/RenderResultMessage.js +68 -22
- package/dist/components/chat/messages/RenderResultMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderResultMessage.mjs +3 -3
- package/dist/components/chat/messages/RenderTextMessage.d.ts +1 -0
- package/dist/components/chat/messages/RenderTextMessage.js +72 -24
- package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderTextMessage.mjs +3 -3
- package/dist/components/chat/messages/UserMessage.d.ts +1 -0
- package/dist/components/chat/props.d.ts +22 -1
- package/dist/components/chat/props.js.map +1 -1
- package/dist/components/index.d.ts +3 -2
- package/dist/components/index.js +81 -27
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +27 -27
- package/dist/index.css +32 -28
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +81 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +27 -27
- package/package.json +9 -8
- package/src/components/chat/Chat.tsx +10 -0
- package/src/components/chat/Markdown.tsx +86 -29
- package/src/components/chat/Messages.tsx +2 -0
- package/src/components/chat/Modal.tsx +2 -0
- package/src/components/chat/messages/AssistantMessage.tsx +2 -1
- package/src/components/chat/messages/RenderTextMessage.tsx +2 -0
- package/src/components/chat/props.ts +23 -0
- package/src/css/markdown.css +33 -28
- package/dist/chunk-ABHUX6T6.mjs +0 -72
- package/dist/chunk-ABHUX6T6.mjs.map +0 -1
- package/dist/chunk-IIRQWGWV.mjs.map +0 -1
- package/dist/chunk-NWE7CLTB.mjs.map +0 -1
- package/dist/chunk-OZXUB3V7.mjs.map +0 -1
- package/dist/chunk-RVLCPPEL.mjs.map +0 -1
- package/dist/chunk-ZDKVXAL3.mjs.map +0 -1
- /package/dist/{chunk-XFCMZH2H.mjs.map → chunk-6VUDBDUN.mjs.map} +0 -0
- /package/dist/{chunk-MDMNZ6JL.mjs.map → chunk-756IINQI.mjs.map} +0 -0
- /package/dist/{chunk-24TDU7MY.mjs.map → chunk-ALWZ35SI.mjs.map} +0 -0
- /package/dist/{chunk-KQ44Z255.mjs.map → chunk-EMIYIMQ6.mjs.map} +0 -0
- /package/dist/{chunk-K7SXHJRT.mjs.map → chunk-IQ7DDXDA.mjs.map} +0 -0
- /package/dist/{chunk-DSQGQJI4.mjs.map → chunk-MPZAMNCN.mjs.map} +0 -0
- /package/dist/{chunk-LUPGADWY.mjs.map → chunk-UKWBNVMQ.mjs.map} +0 -0
package/dist/index.mjs
CHANGED
|
@@ -2,54 +2,54 @@
|
|
|
2
2
|
import "./chunk-EFZPSZWO.mjs";
|
|
3
3
|
import "./chunk-MMVDU6DF.mjs";
|
|
4
4
|
import "./chunk-PXEVB7IK.mjs";
|
|
5
|
-
import "./chunk-WB3YULQ4.mjs";
|
|
6
5
|
import {
|
|
7
6
|
CopilotPopup
|
|
8
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-IQ7DDXDA.mjs";
|
|
9
8
|
import {
|
|
10
9
|
CopilotSidebar
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-756IINQI.mjs";
|
|
11
|
+
import "./chunk-WB3YULQ4.mjs";
|
|
12
|
+
import "./chunk-3R6CEFJE.mjs";
|
|
13
13
|
import "./chunk-TIDV74OE.mjs";
|
|
14
|
+
import "./chunk-UH2UFL5W.mjs";
|
|
15
|
+
import "./chunk-V7W6IM2V.mjs";
|
|
16
|
+
import {
|
|
17
|
+
CopilotDevConsole
|
|
18
|
+
} from "./chunk-VGPQYMKJ.mjs";
|
|
19
|
+
import "./chunk-Q5V6S67N.mjs";
|
|
20
|
+
import {
|
|
21
|
+
shouldShowDevConsole
|
|
22
|
+
} from "./chunk-6TCUJ3B7.mjs";
|
|
23
|
+
import "./chunk-KXE2JCUH.mjs";
|
|
24
|
+
import "./chunk-NRA3CFEE.mjs";
|
|
25
|
+
import "./chunk-BH6PCAAL.mjs";
|
|
14
26
|
import "./chunk-UFN2VWSR.mjs";
|
|
15
27
|
import {
|
|
16
28
|
CopilotChat
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
29
|
+
} from "./chunk-ZRW27A32.mjs";
|
|
30
|
+
import "./chunk-MPZAMNCN.mjs";
|
|
31
|
+
import "./chunk-ALWZ35SI.mjs";
|
|
20
32
|
import {
|
|
21
33
|
RenderImageMessage
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
34
|
+
} from "./chunk-UKWBNVMQ.mjs";
|
|
35
|
+
import "./chunk-6VUDBDUN.mjs";
|
|
36
|
+
import "./chunk-5INP2EWU.mjs";
|
|
25
37
|
import {
|
|
26
38
|
AssistantMessage
|
|
27
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-XMNTLIK5.mjs";
|
|
28
40
|
import {
|
|
29
41
|
UserMessage
|
|
30
42
|
} from "./chunk-HWMFMBJC.mjs";
|
|
31
43
|
import "./chunk-XZNY26GH.mjs";
|
|
32
44
|
import "./chunk-PLHTVHUW.mjs";
|
|
33
|
-
import "./chunk-
|
|
45
|
+
import "./chunk-EMIYIMQ6.mjs";
|
|
46
|
+
import "./chunk-CGEAG65D.mjs";
|
|
34
47
|
import "./chunk-YQFVRDNC.mjs";
|
|
35
48
|
import {
|
|
36
49
|
Markdown
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-IIRQWGWV.mjs";
|
|
39
|
-
import "./chunk-CGEAG65D.mjs";
|
|
50
|
+
} from "./chunk-YTXEWDNC.mjs";
|
|
40
51
|
import "./chunk-KENCH7RN.mjs";
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-V7W6IM2V.mjs";
|
|
43
|
-
import {
|
|
44
|
-
CopilotDevConsole
|
|
45
|
-
} from "./chunk-VGPQYMKJ.mjs";
|
|
46
|
-
import "./chunk-Q5V6S67N.mjs";
|
|
47
|
-
import {
|
|
48
|
-
shouldShowDevConsole
|
|
49
|
-
} from "./chunk-6TCUJ3B7.mjs";
|
|
50
|
-
import "./chunk-KXE2JCUH.mjs";
|
|
51
|
-
import "./chunk-NRA3CFEE.mjs";
|
|
52
|
-
import "./chunk-BH6PCAAL.mjs";
|
|
52
|
+
import "./chunk-B3D7U7TJ.mjs";
|
|
53
53
|
import {
|
|
54
54
|
useChatContext
|
|
55
55
|
} from "./chunk-IEMQ2SQW.mjs";
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"publishConfig": {
|
|
10
10
|
"access": "public"
|
|
11
11
|
},
|
|
12
|
-
"version": "1.8.13-next.
|
|
12
|
+
"version": "1.8.13-next.2",
|
|
13
13
|
"sideEffects": [
|
|
14
14
|
"**/*.css"
|
|
15
15
|
],
|
|
@@ -46,13 +46,14 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@headlessui/react": "^2.1.3",
|
|
49
|
-
"react-markdown": "^
|
|
50
|
-
"react-syntax-highlighter": "^15.
|
|
51
|
-
"
|
|
52
|
-
"remark-
|
|
53
|
-
"
|
|
54
|
-
"@copilotkit/
|
|
55
|
-
"@copilotkit/
|
|
49
|
+
"react-markdown": "^10.1.0",
|
|
50
|
+
"react-syntax-highlighter": "^15.6.1",
|
|
51
|
+
"rehype-raw": "^7.0.0",
|
|
52
|
+
"remark-gfm": "^4.0.1",
|
|
53
|
+
"remark-math": "^6.0.0",
|
|
54
|
+
"@copilotkit/react-core": "1.8.13-next.2",
|
|
55
|
+
"@copilotkit/runtime-client-gql": "1.8.13-next.2",
|
|
56
|
+
"@copilotkit/shared": "1.8.13-next.2"
|
|
56
57
|
},
|
|
57
58
|
"keywords": [
|
|
58
59
|
"copilotkit",
|
|
@@ -74,6 +74,7 @@ import { Message, Role, TextMessage, ImageMessage } from "@copilotkit/runtime-cl
|
|
|
74
74
|
import { randomId } from "@copilotkit/shared";
|
|
75
75
|
import {
|
|
76
76
|
AssistantMessageProps,
|
|
77
|
+
ComponentsMap,
|
|
77
78
|
InputProps,
|
|
78
79
|
MessagesProps,
|
|
79
80
|
RenderMessageProps,
|
|
@@ -82,6 +83,7 @@ import {
|
|
|
82
83
|
|
|
83
84
|
import { HintFunction, runAgent, stopAgent } from "@copilotkit/react-core";
|
|
84
85
|
import { ImageUploadQueue } from "./ImageUploadQueue";
|
|
86
|
+
import { Components } from "react-markdown";
|
|
85
87
|
|
|
86
88
|
/**
|
|
87
89
|
* Props for CopilotChat component.
|
|
@@ -137,6 +139,12 @@ export interface CopilotChatProps {
|
|
|
137
139
|
*/
|
|
138
140
|
onThumbsDown?: (message: string) => void;
|
|
139
141
|
|
|
142
|
+
/**
|
|
143
|
+
* A list of markdown components to render in assistant message.
|
|
144
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
145
|
+
*/
|
|
146
|
+
markdownTagRenderers?: ComponentsMap;
|
|
147
|
+
|
|
140
148
|
/**
|
|
141
149
|
* Icons can be used to set custom icons for the chat window.
|
|
142
150
|
*/
|
|
@@ -291,6 +299,7 @@ export function CopilotChat({
|
|
|
291
299
|
onCopy,
|
|
292
300
|
onThumbsUp,
|
|
293
301
|
onThumbsDown,
|
|
302
|
+
markdownTagRenderers,
|
|
294
303
|
Messages = DefaultMessages,
|
|
295
304
|
RenderTextMessage = DefaultRenderTextMessage,
|
|
296
305
|
RenderActionExecutionMessage = DefaultRenderActionExecutionMessage,
|
|
@@ -482,6 +491,7 @@ export function CopilotChat({
|
|
|
482
491
|
onCopy={handleCopy}
|
|
483
492
|
onThumbsUp={onThumbsUp}
|
|
484
493
|
onThumbsDown={onThumbsDown}
|
|
494
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
485
495
|
>
|
|
486
496
|
{currentSuggestions.length > 0 && (
|
|
487
497
|
<div className="suggestions">
|
|
@@ -3,42 +3,19 @@ import ReactMarkdown, { Options, Components } from "react-markdown";
|
|
|
3
3
|
import { CodeBlock } from "./CodeBlock";
|
|
4
4
|
import remarkGfm from "remark-gfm";
|
|
5
5
|
import remarkMath from "remark-math";
|
|
6
|
+
import rehypeRaw from "rehype-raw";
|
|
6
7
|
|
|
7
|
-
const
|
|
8
|
-
ReactMarkdown,
|
|
9
|
-
(prevProps, nextProps) =>
|
|
10
|
-
prevProps.children === nextProps.children && prevProps.className === nextProps.className,
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
type MarkdownProps = {
|
|
14
|
-
content: string;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const Markdown = ({ content }: MarkdownProps) => {
|
|
18
|
-
return (
|
|
19
|
-
<div className="copilotKitMarkdown">
|
|
20
|
-
<MemoizedReactMarkdown components={components} remarkPlugins={[remarkGfm, remarkMath]}>
|
|
21
|
-
{content}
|
|
22
|
-
</MemoizedReactMarkdown>
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const components: Components = {
|
|
8
|
+
const defaultComponents: Components = {
|
|
28
9
|
a({ children, ...props }) {
|
|
29
10
|
return (
|
|
30
|
-
<a
|
|
31
|
-
style={{ color: "blue", textDecoration: "underline" }}
|
|
32
|
-
{...props}
|
|
33
|
-
target="_blank"
|
|
34
|
-
rel="noopener noreferrer"
|
|
35
|
-
>
|
|
11
|
+
<a className="copilotKitMarkdownElement" {...props} target="_blank" rel="noopener noreferrer">
|
|
36
12
|
{children}
|
|
37
13
|
</a>
|
|
38
14
|
);
|
|
39
15
|
},
|
|
16
|
+
// @ts-expect-error -- inline
|
|
40
17
|
code({ children, className, inline, ...props }) {
|
|
41
|
-
if (children.length) {
|
|
18
|
+
if (Array.isArray(children) && children.length) {
|
|
42
19
|
if (children[0] == "▍") {
|
|
43
20
|
return (
|
|
44
21
|
<span
|
|
@@ -52,7 +29,7 @@ const components: Components = {
|
|
|
52
29
|
);
|
|
53
30
|
}
|
|
54
31
|
|
|
55
|
-
children[0] = (children[0] as string).replace("`▍`", "▍");
|
|
32
|
+
children[0] = (children?.[0] as string).replace("`▍`", "▍");
|
|
56
33
|
}
|
|
57
34
|
|
|
58
35
|
const match = /language-(\w+)/.exec(className || "");
|
|
@@ -74,4 +51,84 @@ const components: Components = {
|
|
|
74
51
|
/>
|
|
75
52
|
);
|
|
76
53
|
},
|
|
54
|
+
h1: ({ children, ...props }) => (
|
|
55
|
+
<h1 className="copilotKitMarkdownElement" {...props}>
|
|
56
|
+
{children}
|
|
57
|
+
</h1>
|
|
58
|
+
),
|
|
59
|
+
h2: ({ children, ...props }) => (
|
|
60
|
+
<h2 className="copilotKitMarkdownElement" {...props}>
|
|
61
|
+
{children}
|
|
62
|
+
</h2>
|
|
63
|
+
),
|
|
64
|
+
h3: ({ children, ...props }) => (
|
|
65
|
+
<h3 className="copilotKitMarkdownElement" {...props}>
|
|
66
|
+
{children}
|
|
67
|
+
</h3>
|
|
68
|
+
),
|
|
69
|
+
h4: ({ children, ...props }) => (
|
|
70
|
+
<h4 className="copilotKitMarkdownElement" {...props}>
|
|
71
|
+
{children}
|
|
72
|
+
</h4>
|
|
73
|
+
),
|
|
74
|
+
h5: ({ children, ...props }) => (
|
|
75
|
+
<h5 className="copilotKitMarkdownElement" {...props}>
|
|
76
|
+
{children}
|
|
77
|
+
</h5>
|
|
78
|
+
),
|
|
79
|
+
h6: ({ children, ...props }) => (
|
|
80
|
+
<h6 className="copilotKitMarkdownElement" {...props}>
|
|
81
|
+
{children}
|
|
82
|
+
</h6>
|
|
83
|
+
),
|
|
84
|
+
p: ({ children, ...props }) => (
|
|
85
|
+
<p className="copilotKitMarkdownElement" {...props}>
|
|
86
|
+
{children}
|
|
87
|
+
</p>
|
|
88
|
+
),
|
|
89
|
+
pre: ({ children, ...props }) => (
|
|
90
|
+
<pre className="copilotKitMarkdownElement" {...props}>
|
|
91
|
+
{children}
|
|
92
|
+
</pre>
|
|
93
|
+
),
|
|
94
|
+
blockquote: ({ children, ...props }) => (
|
|
95
|
+
<blockquote className="copilotKitMarkdownElement" {...props}>
|
|
96
|
+
{children}
|
|
97
|
+
</blockquote>
|
|
98
|
+
),
|
|
99
|
+
ul: ({ children, ...props }) => (
|
|
100
|
+
<ul className="copilotKitMarkdownElement" {...props}>
|
|
101
|
+
{children}
|
|
102
|
+
</ul>
|
|
103
|
+
),
|
|
104
|
+
li: ({ children, ...props }) => (
|
|
105
|
+
<li className="copilotKitMarkdownElement" {...props}>
|
|
106
|
+
{children}
|
|
107
|
+
</li>
|
|
108
|
+
),
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const MemoizedReactMarkdown: FC<Options> = memo(
|
|
112
|
+
ReactMarkdown,
|
|
113
|
+
(prevProps, nextProps) =>
|
|
114
|
+
prevProps.children === nextProps.children && prevProps.components === nextProps.components,
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
type MarkdownProps = {
|
|
118
|
+
content: string;
|
|
119
|
+
components?: Components;
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
export const Markdown = ({ content, components }: MarkdownProps) => {
|
|
123
|
+
return (
|
|
124
|
+
<div className="copilotKitMarkdown">
|
|
125
|
+
<MemoizedReactMarkdown
|
|
126
|
+
components={{ ...defaultComponents, ...components }}
|
|
127
|
+
remarkPlugins={[remarkGfm, remarkMath]}
|
|
128
|
+
rehypePlugins={[rehypeRaw]}
|
|
129
|
+
>
|
|
130
|
+
{content}
|
|
131
|
+
</MemoizedReactMarkdown>
|
|
132
|
+
</div>
|
|
133
|
+
);
|
|
77
134
|
};
|
|
@@ -19,6 +19,7 @@ export const Messages = ({
|
|
|
19
19
|
onCopy,
|
|
20
20
|
onThumbsUp,
|
|
21
21
|
onThumbsDown,
|
|
22
|
+
markdownTagRenderers,
|
|
22
23
|
}: MessagesProps) => {
|
|
23
24
|
const context = useChatContext();
|
|
24
25
|
const initialMessages = useMemo(
|
|
@@ -67,6 +68,7 @@ export const Messages = ({
|
|
|
67
68
|
onCopy={onCopy}
|
|
68
69
|
onThumbsUp={onThumbsUp}
|
|
69
70
|
onThumbsDown={onThumbsDown}
|
|
71
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
70
72
|
/>
|
|
71
73
|
);
|
|
72
74
|
} else if (message.isActionExecutionMessage()) {
|
|
@@ -82,6 +82,7 @@ export const CopilotModal = ({
|
|
|
82
82
|
onThumbsDown,
|
|
83
83
|
onCopy,
|
|
84
84
|
onRegenerate,
|
|
85
|
+
markdownTagRenderers,
|
|
85
86
|
className,
|
|
86
87
|
children,
|
|
87
88
|
}: CopilotModalProps) => {
|
|
@@ -118,6 +119,7 @@ export const CopilotModal = ({
|
|
|
118
119
|
onThumbsDown={onThumbsDown}
|
|
119
120
|
onCopy={onCopy}
|
|
120
121
|
onRegenerate={onRegenerate}
|
|
122
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
121
123
|
/>
|
|
122
124
|
</Window>
|
|
123
125
|
</div>
|
|
@@ -14,6 +14,7 @@ export const AssistantMessage = (props: AssistantMessageProps) => {
|
|
|
14
14
|
onThumbsUp,
|
|
15
15
|
onThumbsDown,
|
|
16
16
|
isCurrentMessage,
|
|
17
|
+
markdownTagRenderers,
|
|
17
18
|
} = props;
|
|
18
19
|
const [copied, setCopied] = useState(false);
|
|
19
20
|
|
|
@@ -54,7 +55,7 @@ export const AssistantMessage = (props: AssistantMessageProps) => {
|
|
|
54
55
|
<>
|
|
55
56
|
{(message || isLoading) && (
|
|
56
57
|
<div className="copilotKitMessage copilotKitAssistantMessage">
|
|
57
|
-
{message && <Markdown content={message || ""} />}
|
|
58
|
+
{message && <Markdown content={message || ""} components={markdownTagRenderers} />}
|
|
58
59
|
{isLoading && <LoadingIcon />}
|
|
59
60
|
|
|
60
61
|
{message && !isLoading && (
|
|
@@ -16,6 +16,7 @@ export function RenderTextMessage({
|
|
|
16
16
|
onCopy,
|
|
17
17
|
onThumbsUp,
|
|
18
18
|
onThumbsDown,
|
|
19
|
+
markdownTagRenderers,
|
|
19
20
|
} = props;
|
|
20
21
|
|
|
21
22
|
if (message.isTextMessage()) {
|
|
@@ -42,6 +43,7 @@ export function RenderTextMessage({
|
|
|
42
43
|
onCopy={onCopy}
|
|
43
44
|
onThumbsUp={onThumbsUp}
|
|
44
45
|
onThumbsDown={onThumbsDown}
|
|
46
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
45
47
|
/>
|
|
46
48
|
);
|
|
47
49
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Message } from "@copilotkit/runtime-client-gql";
|
|
2
|
+
import { ReactNode } from "react";
|
|
2
3
|
|
|
3
4
|
export interface ButtonProps {}
|
|
4
5
|
|
|
@@ -19,6 +20,10 @@ export interface SuggestionsProps {
|
|
|
19
20
|
onClick: (message: string) => void;
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
export type ComponentsMap<T extends Record<string, object> = Record<string, object>> = {
|
|
24
|
+
[K in keyof T]: React.FC<{ children?: ReactNode } & T[K]>;
|
|
25
|
+
};
|
|
26
|
+
|
|
22
27
|
export interface MessagesProps {
|
|
23
28
|
messages: Message[];
|
|
24
29
|
inProgress: boolean;
|
|
@@ -50,6 +55,12 @@ export interface MessagesProps {
|
|
|
50
55
|
* Callback function for thumbs down feedback
|
|
51
56
|
*/
|
|
52
57
|
onThumbsDown?: (message: string) => void;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A list of markdown components to render in assistant message.
|
|
61
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
62
|
+
*/
|
|
63
|
+
markdownTagRenderers?: ComponentsMap;
|
|
53
64
|
}
|
|
54
65
|
|
|
55
66
|
export interface Renderer {
|
|
@@ -115,6 +126,12 @@ export interface AssistantMessageProps {
|
|
|
115
126
|
* Callback function for thumbs down feedback
|
|
116
127
|
*/
|
|
117
128
|
onThumbsDown?: (message: string) => void;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* A list of markdown components to render in assistant message.
|
|
132
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
133
|
+
*/
|
|
134
|
+
markdownTagRenderers?: ComponentsMap;
|
|
118
135
|
}
|
|
119
136
|
|
|
120
137
|
export interface RenderMessageProps {
|
|
@@ -145,6 +162,12 @@ export interface RenderMessageProps {
|
|
|
145
162
|
* Callback function for thumbs down feedback
|
|
146
163
|
*/
|
|
147
164
|
onThumbsDown?: (message: string) => void;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* A list of markdown components to render in assistant message.
|
|
168
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
169
|
+
*/
|
|
170
|
+
markdownTagRenderers?: ComponentsMap;
|
|
148
171
|
}
|
|
149
172
|
|
|
150
173
|
export interface InputProps {
|
package/src/css/markdown.css
CHANGED
|
@@ -1,63 +1,68 @@
|
|
|
1
|
-
.
|
|
2
|
-
.
|
|
3
|
-
.
|
|
4
|
-
.
|
|
5
|
-
.
|
|
6
|
-
.
|
|
1
|
+
h1.copilotKitMarkdownElement,
|
|
2
|
+
h2.copilotKitMarkdownElement,
|
|
3
|
+
h3.copilotKitMarkdownElement,
|
|
4
|
+
h4.copilotKitMarkdownElement,
|
|
5
|
+
h5.copilotKitMarkdownElement,
|
|
6
|
+
h6.copilotKitMarkdownElement {
|
|
7
7
|
font-weight: bold;
|
|
8
8
|
line-height: 1.2;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
.
|
|
12
|
-
.
|
|
13
|
-
.
|
|
14
|
-
.
|
|
15
|
-
.
|
|
16
|
-
.
|
|
11
|
+
h1.copilotKitMarkdownElement:not(:last-child),
|
|
12
|
+
h2.copilotKitMarkdownElement:not(:last-child),
|
|
13
|
+
h3.copilotKitMarkdownElement:not(:last-child),
|
|
14
|
+
h4.copilotKitMarkdownElement:not(:last-child),
|
|
15
|
+
h5.copilotKitMarkdownElement:not(:last-child),
|
|
16
|
+
h6.copilotKitMarkdownElement:not(:last-child) {
|
|
17
17
|
margin-bottom: 1rem;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.
|
|
20
|
+
h1.copilotKitMarkdownElement {
|
|
21
21
|
font-size: 1.5em;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
.
|
|
24
|
+
h2.copilotKitMarkdownElement {
|
|
25
25
|
font-size: 1.25em;
|
|
26
26
|
font-weight: 600;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
.
|
|
29
|
+
h3.copilotKitMarkdownElement {
|
|
30
30
|
font-size: 1.1em;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
.
|
|
33
|
+
h4.copilotKitMarkdownElement {
|
|
34
34
|
font-size: 1em;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
.
|
|
37
|
+
h5.copilotKitMarkdownElement {
|
|
38
38
|
font-size: 0.9em;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
.
|
|
41
|
+
h6.copilotKitMarkdownElement {
|
|
42
42
|
font-size: 0.8em;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
.
|
|
45
|
+
a.copilotKitMarkdownElement {
|
|
46
|
+
color: blue;
|
|
47
|
+
text-decoration: underline;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
p.copilotKitMarkdownElement {
|
|
46
51
|
padding: 0px;
|
|
47
52
|
margin: 0px;
|
|
48
53
|
line-height: 1.75;
|
|
49
54
|
font-size: 1rem;
|
|
50
55
|
}
|
|
51
56
|
|
|
52
|
-
.
|
|
53
|
-
.
|
|
54
|
-
.
|
|
55
|
-
.
|
|
56
|
-
.
|
|
57
|
+
p.copilotKitMarkdownElement:not(:last-child),
|
|
58
|
+
pre.copilotKitMarkdownElement:not(:last-child),
|
|
59
|
+
ol.copilotKitMarkdownElement:not(:last-child),
|
|
60
|
+
ul.copilotKitMarkdownElement:not(:last-child),
|
|
61
|
+
blockquote.copilotKitMarkdownElement:not(:last-child) {
|
|
57
62
|
margin-bottom: 1.25em;
|
|
58
63
|
}
|
|
59
64
|
|
|
60
|
-
.
|
|
65
|
+
blockquote.copilotKitMarkdownElement {
|
|
61
66
|
border-color: rgb(142, 142, 160);
|
|
62
67
|
border-left-width: 2px;
|
|
63
68
|
border-left-style: solid;
|
|
@@ -65,17 +70,17 @@
|
|
|
65
70
|
padding-left: 10px;
|
|
66
71
|
}
|
|
67
72
|
|
|
68
|
-
.
|
|
73
|
+
blockquote.copilotKitMarkdownElement p {
|
|
69
74
|
padding: 0.7em 0;
|
|
70
75
|
}
|
|
71
76
|
|
|
72
|
-
.
|
|
77
|
+
ul.copilotKitMarkdownElement {
|
|
73
78
|
list-style-type: disc;
|
|
74
79
|
padding-left: 20px;
|
|
75
80
|
overflow: visible;
|
|
76
81
|
}
|
|
77
82
|
|
|
78
|
-
.
|
|
83
|
+
li.copilotKitMarkdownElement {
|
|
79
84
|
list-style-type: inherit;
|
|
80
85
|
list-style-position: outside;
|
|
81
86
|
margin-left: 0;
|
package/dist/chunk-ABHUX6T6.mjs
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CodeBlock
|
|
3
|
-
} from "./chunk-KENCH7RN.mjs";
|
|
4
|
-
import {
|
|
5
|
-
__objRest,
|
|
6
|
-
__spreadProps,
|
|
7
|
-
__spreadValues
|
|
8
|
-
} from "./chunk-MRXNTQOX.mjs";
|
|
9
|
-
|
|
10
|
-
// src/components/chat/Markdown.tsx
|
|
11
|
-
import { memo } from "react";
|
|
12
|
-
import ReactMarkdown from "react-markdown";
|
|
13
|
-
import remarkGfm from "remark-gfm";
|
|
14
|
-
import remarkMath from "remark-math";
|
|
15
|
-
import { jsx } from "react/jsx-runtime";
|
|
16
|
-
var MemoizedReactMarkdown = memo(
|
|
17
|
-
ReactMarkdown,
|
|
18
|
-
(prevProps, nextProps) => prevProps.children === nextProps.children && prevProps.className === nextProps.className
|
|
19
|
-
);
|
|
20
|
-
var Markdown = ({ content }) => {
|
|
21
|
-
return /* @__PURE__ */ jsx("div", { className: "copilotKitMarkdown", children: /* @__PURE__ */ jsx(MemoizedReactMarkdown, { components, remarkPlugins: [remarkGfm, remarkMath], children: content }) });
|
|
22
|
-
};
|
|
23
|
-
var components = {
|
|
24
|
-
a(_a) {
|
|
25
|
-
var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
|
|
26
|
-
return /* @__PURE__ */ jsx(
|
|
27
|
-
"a",
|
|
28
|
-
__spreadProps(__spreadValues({
|
|
29
|
-
style: { color: "blue", textDecoration: "underline" }
|
|
30
|
-
}, props), {
|
|
31
|
-
target: "_blank",
|
|
32
|
-
rel: "noopener noreferrer",
|
|
33
|
-
children
|
|
34
|
-
})
|
|
35
|
-
);
|
|
36
|
-
},
|
|
37
|
-
code(_c) {
|
|
38
|
-
var _d = _c, { children, className, inline } = _d, props = __objRest(_d, ["children", "className", "inline"]);
|
|
39
|
-
if (children.length) {
|
|
40
|
-
if (children[0] == "\u258D") {
|
|
41
|
-
return /* @__PURE__ */ jsx(
|
|
42
|
-
"span",
|
|
43
|
-
{
|
|
44
|
-
style: {
|
|
45
|
-
animation: "pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite",
|
|
46
|
-
marginTop: "0.25rem"
|
|
47
|
-
},
|
|
48
|
-
children: "\u258D"
|
|
49
|
-
}
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
children[0] = children[0].replace("`\u258D`", "\u258D");
|
|
53
|
-
}
|
|
54
|
-
const match = /language-(\w+)/.exec(className || "");
|
|
55
|
-
if (inline) {
|
|
56
|
-
return /* @__PURE__ */ jsx("code", __spreadProps(__spreadValues({ className }, props), { children }));
|
|
57
|
-
}
|
|
58
|
-
return /* @__PURE__ */ jsx(
|
|
59
|
-
CodeBlock,
|
|
60
|
-
__spreadValues({
|
|
61
|
-
language: match && match[1] || "",
|
|
62
|
-
value: String(children).replace(/\n$/, "")
|
|
63
|
-
}, props),
|
|
64
|
-
Math.random()
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
export {
|
|
70
|
-
Markdown
|
|
71
|
-
};
|
|
72
|
-
//# sourceMappingURL=chunk-ABHUX6T6.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/chat/Markdown.tsx"],"sourcesContent":["import { FC, memo } from \"react\";\nimport ReactMarkdown, { Options, Components } from \"react-markdown\";\nimport { CodeBlock } from \"./CodeBlock\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nconst MemoizedReactMarkdown: FC<Options> = memo(\n ReactMarkdown,\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children && prevProps.className === nextProps.className,\n);\n\ntype MarkdownProps = {\n content: string;\n};\n\nexport const Markdown = ({ content }: MarkdownProps) => {\n return (\n <div className=\"copilotKitMarkdown\">\n <MemoizedReactMarkdown components={components} remarkPlugins={[remarkGfm, remarkMath]}>\n {content}\n </MemoizedReactMarkdown>\n </div>\n );\n};\n\nconst components: Components = {\n a({ children, ...props }) {\n return (\n <a\n style={{ color: \"blue\", textDecoration: \"underline\" }}\n {...props}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n );\n },\n code({ children, className, inline, ...props }) {\n if (children.length) {\n if (children[0] == \"▍\") {\n return (\n <span\n style={{\n animation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n marginTop: \"0.25rem\",\n }}\n >\n ▍\n </span>\n );\n }\n\n children[0] = (children[0] as string).replace(\"`▍`\", \"▍\");\n }\n\n const match = /language-(\\w+)/.exec(className || \"\");\n\n if (inline) {\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n }\n\n return (\n <CodeBlock\n key={Math.random()}\n language={(match && match[1]) || \"\"}\n value={String(children).replace(/\\n$/, \"\")}\n {...props}\n />\n );\n },\n};\n"],"mappings":";;;;;;;;;;AAAA,SAAa,YAAY;AACzB,OAAO,mBAA4C;AAEnD,OAAO,eAAe;AACtB,OAAO,gBAAgB;AAejB;AAbN,IAAM,wBAAqC;AAAA,EACzC;AAAA,EACA,CAAC,WAAW,cACV,UAAU,aAAa,UAAU,YAAY,UAAU,cAAc,UAAU;AACnF;AAMO,IAAM,WAAW,CAAC,EAAE,QAAQ,MAAqB;AACtD,SACE,oBAAC,SAAI,WAAU,sBACb,8BAAC,yBAAsB,YAAwB,eAAe,CAAC,WAAW,UAAU,GACjF,mBACH,GACF;AAEJ;AAEA,IAAM,aAAyB;AAAA,EAC7B,EAAE,IAAwB;AAAxB,iBAAE,WA3BN,IA2BI,IAAe,kBAAf,IAAe,CAAb;AACF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,OAAO,QAAQ,gBAAgB,YAAY;AAAA,SAChD,QAFL;AAAA,QAGC,QAAO;AAAA,QACP,KAAI;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAAA,EACA,KAAK,IAA2C;AAA3C,iBAAE,YAAU,WAAW,OAvC9B,IAuCO,IAAkC,kBAAlC,IAAkC,CAAhC,YAAU,aAAW;AAC1B,QAAI,SAAS,QAAQ;AACnB,UAAI,SAAS,CAAC,KAAK,UAAK;AACtB,eACE;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,YACD;AAAA;AAAA,QAED;AAAA,MAEJ;AAEA,eAAS,CAAC,IAAK,SAAS,CAAC,EAAa,QAAQ,YAAO,QAAG;AAAA,IAC1D;AAEA,UAAM,QAAQ,iBAAiB,KAAK,aAAa,EAAE;AAEnD,QAAI,QAAQ;AACV,aACE,oBAAC,uCAAK,aAA0B,QAA/B,EACE,WACH;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,UAAW,SAAS,MAAM,CAAC,KAAM;AAAA,QACjC,OAAO,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE;AAAA,SACrC;AAAA,MAHC,KAAK,OAAO;AAAA,IAInB;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\";\nimport { useLangGraphInterruptRender } from \"@copilotkit/react-core\";\n\nexport const Messages = ({\n messages,\n inProgress,\n children,\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n AssistantMessage,\n UserMessage,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n}: MessagesProps) => {\n const context = useChatContext();\n const initialMessages = useMemo(\n () => makeInitialMessages(context.labels.initial),\n [context.labels.initial],\n );\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 { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);\n\n const interrupt = useLangGraphInterruptRender();\n\n return (\n <div className=\"copilotKitMessages\" ref={messagesContainerRef}>\n <div className=\"copilotKitMessagesContainer\">\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 AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\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 AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\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 AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\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 AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n } else if (message.isImageMessage && message.isImageMessage()) {\n return (\n <RenderImageMessage\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n />\n );\n }\n })}\n {interrupt}\n </div>\n <footer className=\"copilotKitMessagesFooter\" ref={messagesEndRef}>\n {children}\n </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}\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 (messagesContainerRef.current && messagesEndRef.current) {\n isProgrammaticScrollRef.current = true;\n messagesContainerRef.current.scrollTop = messagesContainerRef.current.scrollHeight;\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":[]}
|