@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.
Files changed (112) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/{chunk-ZDKVXAL3.mjs → chunk-3R6CEFJE.mjs} +11 -9
  3. package/dist/chunk-3R6CEFJE.mjs.map +1 -0
  4. package/dist/{chunk-RVLCPPEL.mjs → chunk-5INP2EWU.mjs} +6 -4
  5. package/dist/chunk-5INP2EWU.mjs.map +1 -0
  6. package/dist/{chunk-XFCMZH2H.mjs → chunk-6VUDBDUN.mjs} +2 -2
  7. package/dist/{chunk-MDMNZ6JL.mjs → chunk-756IINQI.mjs} +2 -2
  8. package/dist/{chunk-24TDU7MY.mjs → chunk-ALWZ35SI.mjs} +2 -2
  9. package/dist/{chunk-IIRQWGWV.mjs → chunk-B3D7U7TJ.mjs} +5 -3
  10. package/dist/chunk-B3D7U7TJ.mjs.map +1 -0
  11. package/dist/{chunk-KQ44Z255.mjs → chunk-EMIYIMQ6.mjs} +4 -4
  12. package/dist/{chunk-K7SXHJRT.mjs → chunk-IQ7DDXDA.mjs} +2 -2
  13. package/dist/{chunk-DSQGQJI4.mjs → chunk-MPZAMNCN.mjs} +2 -2
  14. package/dist/{chunk-LUPGADWY.mjs → chunk-UKWBNVMQ.mjs} +2 -2
  15. package/dist/{chunk-OZXUB3V7.mjs → chunk-XMNTLIK5.mjs} +5 -4
  16. package/dist/chunk-XMNTLIK5.mjs.map +1 -0
  17. package/dist/chunk-YTXEWDNC.mjs +117 -0
  18. package/dist/chunk-YTXEWDNC.mjs.map +1 -0
  19. package/dist/{chunk-NWE7CLTB.mjs → chunk-ZRW27A32.mjs} +11 -9
  20. package/dist/chunk-ZRW27A32.mjs.map +1 -0
  21. package/dist/components/chat/Button.d.ts +1 -0
  22. package/dist/components/chat/Chat.d.ts +7 -2
  23. package/dist/components/chat/Chat.js +78 -26
  24. package/dist/components/chat/Chat.js.map +1 -1
  25. package/dist/components/chat/Chat.mjs +11 -11
  26. package/dist/components/chat/Header.d.ts +1 -0
  27. package/dist/components/chat/Input.d.ts +1 -0
  28. package/dist/components/chat/Input.mjs +2 -2
  29. package/dist/components/chat/Markdown.d.ts +3 -1
  30. package/dist/components/chat/Markdown.js +65 -20
  31. package/dist/components/chat/Markdown.js.map +1 -1
  32. package/dist/components/chat/Markdown.mjs +1 -1
  33. package/dist/components/chat/Messages.d.ts +1 -1
  34. package/dist/components/chat/Messages.js +4 -2
  35. package/dist/components/chat/Messages.js.map +1 -1
  36. package/dist/components/chat/Messages.mjs +1 -1
  37. package/dist/components/chat/Modal.d.ts +1 -1
  38. package/dist/components/chat/Modal.js +81 -27
  39. package/dist/components/chat/Modal.js.map +1 -1
  40. package/dist/components/chat/Modal.mjs +18 -18
  41. package/dist/components/chat/Popup.js +81 -27
  42. package/dist/components/chat/Popup.js.map +1 -1
  43. package/dist/components/chat/Popup.mjs +19 -19
  44. package/dist/components/chat/Sidebar.js +81 -27
  45. package/dist/components/chat/Sidebar.js.map +1 -1
  46. package/dist/components/chat/Sidebar.mjs +19 -19
  47. package/dist/components/chat/Suggestion.d.ts +1 -0
  48. package/dist/components/chat/Window.d.ts +1 -0
  49. package/dist/components/chat/index.d.ts +3 -2
  50. package/dist/components/chat/index.js +81 -27
  51. package/dist/components/chat/index.js.map +1 -1
  52. package/dist/components/chat/index.mjs +23 -23
  53. package/dist/components/chat/messages/AssistantMessage.d.ts +1 -0
  54. package/dist/components/chat/messages/AssistantMessage.js +68 -22
  55. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  56. package/dist/components/chat/messages/AssistantMessage.mjs +2 -2
  57. package/dist/components/chat/messages/RenderActionExecutionMessage.d.ts +1 -0
  58. package/dist/components/chat/messages/RenderActionExecutionMessage.js +68 -22
  59. package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +1 -1
  60. package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +3 -3
  61. package/dist/components/chat/messages/RenderAgentStateMessage.d.ts +1 -0
  62. package/dist/components/chat/messages/RenderAgentStateMessage.js +68 -22
  63. package/dist/components/chat/messages/RenderAgentStateMessage.js.map +1 -1
  64. package/dist/components/chat/messages/RenderAgentStateMessage.mjs +3 -3
  65. package/dist/components/chat/messages/RenderImageMessage.d.ts +1 -0
  66. package/dist/components/chat/messages/RenderImageMessage.js +68 -22
  67. package/dist/components/chat/messages/RenderImageMessage.js.map +1 -1
  68. package/dist/components/chat/messages/RenderImageMessage.mjs +3 -3
  69. package/dist/components/chat/messages/RenderResultMessage.d.ts +1 -0
  70. package/dist/components/chat/messages/RenderResultMessage.js +68 -22
  71. package/dist/components/chat/messages/RenderResultMessage.js.map +1 -1
  72. package/dist/components/chat/messages/RenderResultMessage.mjs +3 -3
  73. package/dist/components/chat/messages/RenderTextMessage.d.ts +1 -0
  74. package/dist/components/chat/messages/RenderTextMessage.js +72 -24
  75. package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
  76. package/dist/components/chat/messages/RenderTextMessage.mjs +3 -3
  77. package/dist/components/chat/messages/UserMessage.d.ts +1 -0
  78. package/dist/components/chat/props.d.ts +22 -1
  79. package/dist/components/chat/props.js.map +1 -1
  80. package/dist/components/index.d.ts +3 -2
  81. package/dist/components/index.js +81 -27
  82. package/dist/components/index.js.map +1 -1
  83. package/dist/components/index.mjs +27 -27
  84. package/dist/index.css +32 -28
  85. package/dist/index.css.map +1 -1
  86. package/dist/index.d.ts +3 -2
  87. package/dist/index.js +81 -27
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +27 -27
  90. package/package.json +9 -8
  91. package/src/components/chat/Chat.tsx +10 -0
  92. package/src/components/chat/Markdown.tsx +86 -29
  93. package/src/components/chat/Messages.tsx +2 -0
  94. package/src/components/chat/Modal.tsx +2 -0
  95. package/src/components/chat/messages/AssistantMessage.tsx +2 -1
  96. package/src/components/chat/messages/RenderTextMessage.tsx +2 -0
  97. package/src/components/chat/props.ts +23 -0
  98. package/src/css/markdown.css +33 -28
  99. package/dist/chunk-ABHUX6T6.mjs +0 -72
  100. package/dist/chunk-ABHUX6T6.mjs.map +0 -1
  101. package/dist/chunk-IIRQWGWV.mjs.map +0 -1
  102. package/dist/chunk-NWE7CLTB.mjs.map +0 -1
  103. package/dist/chunk-OZXUB3V7.mjs.map +0 -1
  104. package/dist/chunk-RVLCPPEL.mjs.map +0 -1
  105. package/dist/chunk-ZDKVXAL3.mjs.map +0 -1
  106. /package/dist/{chunk-XFCMZH2H.mjs.map → chunk-6VUDBDUN.mjs.map} +0 -0
  107. /package/dist/{chunk-MDMNZ6JL.mjs.map → chunk-756IINQI.mjs.map} +0 -0
  108. /package/dist/{chunk-24TDU7MY.mjs.map → chunk-ALWZ35SI.mjs.map} +0 -0
  109. /package/dist/{chunk-KQ44Z255.mjs.map → chunk-EMIYIMQ6.mjs.map} +0 -0
  110. /package/dist/{chunk-K7SXHJRT.mjs.map → chunk-IQ7DDXDA.mjs.map} +0 -0
  111. /package/dist/{chunk-DSQGQJI4.mjs.map → chunk-MPZAMNCN.mjs.map} +0 -0
  112. /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-K7SXHJRT.mjs";
7
+ } from "./chunk-IQ7DDXDA.mjs";
9
8
  import {
10
9
  CopilotSidebar
11
- } from "./chunk-MDMNZ6JL.mjs";
12
- import "./chunk-ZDKVXAL3.mjs";
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-NWE7CLTB.mjs";
18
- import "./chunk-DSQGQJI4.mjs";
19
- import "./chunk-24TDU7MY.mjs";
29
+ } from "./chunk-ZRW27A32.mjs";
30
+ import "./chunk-MPZAMNCN.mjs";
31
+ import "./chunk-ALWZ35SI.mjs";
20
32
  import {
21
33
  RenderImageMessage
22
- } from "./chunk-LUPGADWY.mjs";
23
- import "./chunk-XFCMZH2H.mjs";
24
- import "./chunk-RVLCPPEL.mjs";
34
+ } from "./chunk-UKWBNVMQ.mjs";
35
+ import "./chunk-6VUDBDUN.mjs";
36
+ import "./chunk-5INP2EWU.mjs";
25
37
  import {
26
38
  AssistantMessage
27
- } from "./chunk-OZXUB3V7.mjs";
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-KQ44Z255.mjs";
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-ABHUX6T6.mjs";
38
- import "./chunk-IIRQWGWV.mjs";
39
- import "./chunk-CGEAG65D.mjs";
50
+ } from "./chunk-YTXEWDNC.mjs";
40
51
  import "./chunk-KENCH7RN.mjs";
41
- import "./chunk-UH2UFL5W.mjs";
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.1",
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": "^8.0.7",
50
- "react-syntax-highlighter": "^15.5.0",
51
- "remark-gfm": "^3.0.1",
52
- "remark-math": "^5.1.1",
53
- "@copilotkit/react-core": "1.8.13-next.1",
54
- "@copilotkit/runtime-client-gql": "1.8.13-next.1",
55
- "@copilotkit/shared": "1.8.13-next.1"
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 MemoizedReactMarkdown: FC<Options> = memo(
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 {
@@ -1,63 +1,68 @@
1
- .copilotKitMarkdown h1,
2
- .copilotKitMarkdown h2,
3
- .copilotKitMarkdown h3,
4
- .copilotKitMarkdown h4,
5
- .copilotKitMarkdown h5,
6
- .copilotKitMarkdown h6 {
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
- .copilotKitMarkdown h1:not(:last-child),
12
- .copilotKitMarkdown h2:not(:last-child),
13
- .copilotKitMarkdown h3:not(:last-child),
14
- .copilotKitMarkdown h4:not(:last-child),
15
- .copilotKitMarkdown h5:not(:last-child),
16
- .copilotKitMarkdown h6:not(:last-child) {
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
- .copilotKitMarkdown h1 {
20
+ h1.copilotKitMarkdownElement {
21
21
  font-size: 1.5em;
22
22
  }
23
23
 
24
- .copilotKitMarkdown h2 {
24
+ h2.copilotKitMarkdownElement {
25
25
  font-size: 1.25em;
26
26
  font-weight: 600;
27
27
  }
28
28
 
29
- .copilotKitMarkdown h3 {
29
+ h3.copilotKitMarkdownElement {
30
30
  font-size: 1.1em;
31
31
  }
32
32
 
33
- .copilotKitMarkdown h4 {
33
+ h4.copilotKitMarkdownElement {
34
34
  font-size: 1em;
35
35
  }
36
36
 
37
- .copilotKitMarkdown h5 {
37
+ h5.copilotKitMarkdownElement {
38
38
  font-size: 0.9em;
39
39
  }
40
40
 
41
- .copilotKitMarkdown h6 {
41
+ h6.copilotKitMarkdownElement {
42
42
  font-size: 0.8em;
43
43
  }
44
44
 
45
- .copilotKitMarkdown p {
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
- .copilotKitMarkdown p:not(:last-child),
53
- .copilotKitMarkdown pre:not(:last-child),
54
- .copilotKitMarkdown ol:not(:last-child),
55
- .copilotKitMarkdown ul:not(:last-child),
56
- .copilotKitMarkdown blockquote:not(:last-child) {
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
- .copilotKitMarkdown blockquote {
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
- .copilotKitMarkdown blockquote p {
73
+ blockquote.copilotKitMarkdownElement p {
69
74
  padding: 0.7em 0;
70
75
  }
71
76
 
72
- .copilotKitMarkdown ul {
77
+ ul.copilotKitMarkdownElement {
73
78
  list-style-type: disc;
74
79
  padding-left: 20px;
75
80
  overflow: visible;
76
81
  }
77
82
 
78
- .copilotKitMarkdown li {
83
+ li.copilotKitMarkdownElement {
79
84
  list-style-type: inherit;
80
85
  list-style-position: outside;
81
86
  margin-left: 0;
@@ -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":[]}