@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.
Files changed (102) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/{chunk-7II4YL7R.mjs → chunk-34FREWVK.mjs} +16 -6
  3. package/dist/chunk-34FREWVK.mjs.map +1 -0
  4. package/dist/chunk-3VNMQWGT.mjs +25 -0
  5. package/dist/chunk-3VNMQWGT.mjs.map +1 -0
  6. package/dist/{chunk-WSMMTZCM.mjs → chunk-B23XDGH4.mjs} +2 -2
  7. package/dist/chunk-F7VWGY77.mjs +22 -0
  8. package/dist/chunk-F7VWGY77.mjs.map +1 -0
  9. package/dist/chunk-HEIDCT7I.mjs +10 -0
  10. package/dist/chunk-HEIDCT7I.mjs.map +1 -0
  11. package/dist/{chunk-DCNCY2PL.mjs → chunk-I7MG52I5.mjs} +19 -9
  12. package/dist/chunk-I7MG52I5.mjs.map +1 -0
  13. package/dist/{chunk-375NVWZM.mjs → chunk-O6JFOQQA.mjs} +2 -2
  14. package/dist/chunk-OFYI4UU4.mjs +35 -0
  15. package/dist/chunk-OFYI4UU4.mjs.map +1 -0
  16. package/dist/{chunk-3E7HY2UN.mjs → chunk-P5A3A5FO.mjs} +58 -31
  17. package/dist/chunk-P5A3A5FO.mjs.map +1 -0
  18. package/dist/chunk-SQMEPWVT.mjs +1 -0
  19. package/dist/chunk-UWWMAJ7R.mjs +100 -0
  20. package/dist/chunk-UWWMAJ7R.mjs.map +1 -0
  21. package/dist/{chunk-UWVGLGFQ.mjs → chunk-VKVNMHM5.mjs} +14 -4
  22. package/dist/chunk-VKVNMHM5.mjs.map +1 -0
  23. package/dist/components/chat/Chat.d.ts +10 -2
  24. package/dist/components/chat/Chat.js +384 -271
  25. package/dist/components/chat/Chat.js.map +1 -1
  26. package/dist/components/chat/Chat.mjs +8 -6
  27. package/dist/components/chat/Messages.d.ts +1 -1
  28. package/dist/components/chat/Messages.js +15 -5
  29. package/dist/components/chat/Messages.js.map +1 -1
  30. package/dist/components/chat/Messages.mjs +1 -1
  31. package/dist/components/chat/Modal.d.ts +1 -1
  32. package/dist/components/chat/Modal.js +396 -279
  33. package/dist/components/chat/Modal.js.map +1 -1
  34. package/dist/components/chat/Modal.mjs +9 -7
  35. package/dist/components/chat/Popup.js +398 -281
  36. package/dist/components/chat/Popup.js.map +1 -1
  37. package/dist/components/chat/Popup.mjs +10 -8
  38. package/dist/components/chat/Sidebar.js +398 -281
  39. package/dist/components/chat/Sidebar.js.map +1 -1
  40. package/dist/components/chat/Sidebar.mjs +10 -8
  41. package/dist/components/chat/index.d.ts +4 -1
  42. package/dist/components/chat/index.js +406 -283
  43. package/dist/components/chat/index.js.map +1 -1
  44. package/dist/components/chat/index.mjs +22 -11
  45. package/dist/components/chat/messages/AssistantMessage.d.ts +7 -0
  46. package/dist/components/chat/messages/AssistantMessage.js +615 -0
  47. package/dist/components/chat/messages/AssistantMessage.js.map +1 -0
  48. package/dist/components/chat/messages/AssistantMessage.mjs +13 -0
  49. package/dist/components/chat/messages/AssistantMessage.mjs.map +1 -0
  50. package/dist/components/chat/messages/RenderActionExecutionMessage.js +59 -54
  51. package/dist/components/chat/messages/RenderActionExecutionMessage.js.map +1 -1
  52. package/dist/components/chat/messages/RenderActionExecutionMessage.mjs +1 -3
  53. package/dist/components/chat/messages/RenderAgentStateMessage.js +55 -42
  54. package/dist/components/chat/messages/RenderAgentStateMessage.js.map +1 -1
  55. package/dist/components/chat/messages/RenderAgentStateMessage.mjs +1 -3
  56. package/dist/components/chat/messages/RenderResultMessage.js +11 -29
  57. package/dist/components/chat/messages/RenderResultMessage.js.map +1 -1
  58. package/dist/components/chat/messages/RenderResultMessage.mjs +1 -3
  59. package/dist/components/chat/messages/RenderTextMessage.js +11 -581
  60. package/dist/components/chat/messages/RenderTextMessage.js.map +1 -1
  61. package/dist/components/chat/messages/RenderTextMessage.mjs +1 -6
  62. package/dist/components/chat/messages/UserMessage.d.ts +7 -0
  63. package/dist/components/chat/messages/UserMessage.js +34 -0
  64. package/dist/components/chat/messages/UserMessage.js.map +1 -0
  65. package/dist/components/chat/messages/UserMessage.mjs +8 -0
  66. package/dist/components/chat/messages/UserMessage.mjs.map +1 -0
  67. package/dist/components/chat/props.d.ts +36 -1
  68. package/dist/components/chat/props.js.map +1 -1
  69. package/dist/components/index.d.ts +4 -1
  70. package/dist/components/index.js +406 -283
  71. package/dist/components/index.js.map +1 -1
  72. package/dist/components/index.mjs +22 -11
  73. package/dist/index.d.ts +4 -1
  74. package/dist/index.js +406 -283
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +22 -11
  77. package/package.json +4 -4
  78. package/src/components/chat/Chat.tsx +25 -1
  79. package/src/components/chat/Messages.tsx +10 -0
  80. package/src/components/chat/Modal.tsx +7 -0
  81. package/src/components/chat/index.tsx +3 -0
  82. package/src/components/chat/messages/AssistantMessage.tsx +20 -0
  83. package/src/components/chat/messages/RenderActionExecutionMessage.tsx +45 -24
  84. package/src/components/chat/messages/RenderAgentStateMessage.tsx +39 -19
  85. package/src/components/chat/messages/RenderResultMessage.tsx +9 -7
  86. package/src/components/chat/messages/RenderTextMessage.tsx +12 -19
  87. package/src/components/chat/messages/UserMessage.tsx +5 -0
  88. package/src/components/chat/props.ts +43 -0
  89. package/dist/chunk-3E7HY2UN.mjs.map +0 -1
  90. package/dist/chunk-6INMITFA.mjs +0 -18
  91. package/dist/chunk-6INMITFA.mjs.map +0 -1
  92. package/dist/chunk-7II4YL7R.mjs.map +0 -1
  93. package/dist/chunk-DCNCY2PL.mjs.map +0 -1
  94. package/dist/chunk-MRFF7GSQ.mjs +0 -1
  95. package/dist/chunk-RU73BEZM.mjs +0 -41
  96. package/dist/chunk-RU73BEZM.mjs.map +0 -1
  97. package/dist/chunk-UWVGLGFQ.mjs.map +0 -1
  98. package/dist/chunk-ZABXREBH.mjs +0 -65
  99. package/dist/chunk-ZABXREBH.mjs.map +0 -1
  100. /package/dist/{chunk-WSMMTZCM.mjs.map → chunk-B23XDGH4.mjs.map} +0 -0
  101. /package/dist/{chunk-375NVWZM.mjs.map → chunk-O6JFOQQA.mjs.map} +0 -0
  102. /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-MRFF7GSQ.mjs";
4
+ import "./chunk-SQMEPWVT.mjs";
5
5
  import {
6
6
  CopilotSidebar
7
- } from "./chunk-WSMMTZCM.mjs";
7
+ } from "./chunk-B23XDGH4.mjs";
8
8
  import "./chunk-WB3YULQ4.mjs";
9
9
  import {
10
10
  CopilotPopup
11
- } from "./chunk-375NVWZM.mjs";
12
- import "./chunk-UWVGLGFQ.mjs";
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-DCNCY2PL.mjs";
19
- import "./chunk-6INMITFA.mjs";
20
- import "./chunk-RU73BEZM.mjs";
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 "./chunk-3E7HY2UN.mjs";
23
- import "./chunk-ZABXREBH.mjs";
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 "./chunk-YQ3D5IQV.mjs";
38
- import "./chunk-7II4YL7R.mjs";
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.11",
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.11",
54
- "@copilotkit/runtime-client-gql": "1.5.11",
55
- "@copilotkit/shared": "1.5.11"
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 { icons } = useChatContext();
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
26
- {icons.spinnerIcon} <span className="inProgressLabel">{render}</span>
27
- </div>
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
61
- {isCurrentMessage && inProgress && icons.spinnerIcon} {toRender}
62
- </div>
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
- <div
74
+ <AssistantMessage
75
+ rawData={message}
76
+ data-message-role="action-render"
67
77
  key={index}
68
- data-message-type="action-render"
69
- className="copilotKitCustomAssistantMessage"
70
- >
71
- {toRender}
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
79
- {isCurrentMessage && inProgress && icons.spinnerIcon}
80
- <b>❌ Error executing render: {message.name}</b>
81
- <br />
82
- {e instanceof Error ? e.message : String(e)}
83
- </div>
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
96
- {icons.spinnerIcon}
97
- </div>
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 { icons } = useChatContext();
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
28
- {icons.spinnerIcon} <span className="inProgressLabel">{render}</span>
29
- </div>
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
57
- {icons.spinnerIcon}
58
- </div>
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
67
- {isCurrentMessage && inProgress && icons.spinnerIcon} {toRender}
68
- </div>
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
- <div key={index} className="copilotKitCustomAssistantMessage">
73
- {toRender}
74
- </div>
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
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
87
- {icons.spinnerIcon}
88
- </div>
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
- const { icons } = useChatContext();
4
+ const { message, inProgress, index, isCurrentMessage, AssistantMessage } = props;
5
+
8
6
  if (message.isResultMessage() && inProgress && isCurrentMessage) {
9
7
  return (
10
- <div key={index} className={`copilotKitMessage copilotKitAssistantMessage`}>
11
- {icons.spinnerIcon}
12
- </div>
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
- const { icons } = useChatContext();
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
- <div
9
+ <UserMessage
13
10
  key={index}
14
11
  data-message-role="user"
15
- className="copilotKitMessage copilotKitUserMessage"
16
- >
17
- {message.content}
18
- </div>
12
+ message={message.content}
13
+ rawData={message}
14
+ />
19
15
  );
20
16
  } else if (message.role == "assistant") {
21
17
  return (
22
- <div
18
+ <AssistantMessage
23
19
  key={index}
24
20
  data-message-role="assistant"
25
- className={`copilotKitMessage copilotKitAssistantMessage`}
26
- >
27
- {isCurrentMessage && inProgress && !message.content ? (
28
- icons.spinnerIcon
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
  }
@@ -0,0 +1,5 @@
1
+ import { UserMessageProps } from "../props";
2
+
3
+ export const UserMessage = (props: UserMessageProps) => {
4
+ return <div className="copilotKitMessage copilotKitUserMessage">{props.message}</div>;
5
+ };
@@ -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":[]}
@@ -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":[]}