@copilotkit/react-ui 1.10.0-next.9 → 1.10.0

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 (60) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/dist/{chunk-U5ATIGWH.mjs → chunk-BJHJBS5M.mjs} +45 -5
  3. package/dist/chunk-BJHJBS5M.mjs.map +1 -0
  4. package/dist/{chunk-TW4LLLTE.mjs → chunk-GBP47ONN.mjs} +2 -2
  5. package/dist/{chunk-2KG77MAY.mjs → chunk-GJ4SX4JE.mjs} +38 -29
  6. package/dist/chunk-GJ4SX4JE.mjs.map +1 -0
  7. package/dist/{chunk-6C3YVF5W.mjs → chunk-J5ZZR6YB.mjs} +2 -2
  8. package/dist/chunk-MIVUCSGO.mjs +126 -0
  9. package/dist/chunk-MIVUCSGO.mjs.map +1 -0
  10. package/dist/{chunk-JHUTTP5C.mjs → chunk-T5QU6KSB.mjs} +5 -1
  11. package/dist/chunk-T5QU6KSB.mjs.map +1 -0
  12. package/dist/{chunk-7K2X77PW.mjs → chunk-Y44VLEUH.mjs} +8 -8
  13. package/dist/components/chat/Chat.d.ts +21 -2
  14. package/dist/components/chat/Chat.js +1022 -856
  15. package/dist/components/chat/Chat.js.map +1 -1
  16. package/dist/components/chat/Chat.mjs +7 -6
  17. package/dist/components/chat/Messages.d.ts +1 -1
  18. package/dist/components/chat/Messages.js +984 -23
  19. package/dist/components/chat/Messages.js.map +1 -1
  20. package/dist/components/chat/Messages.mjs +9 -1
  21. package/dist/components/chat/Modal.js +1030 -864
  22. package/dist/components/chat/Modal.js.map +1 -1
  23. package/dist/components/chat/Modal.mjs +8 -7
  24. package/dist/components/chat/Popup.js +1032 -866
  25. package/dist/components/chat/Popup.js.map +1 -1
  26. package/dist/components/chat/Popup.mjs +9 -8
  27. package/dist/components/chat/Sidebar.js +1032 -866
  28. package/dist/components/chat/Sidebar.js.map +1 -1
  29. package/dist/components/chat/Sidebar.mjs +9 -8
  30. package/dist/components/chat/index.js +1034 -868
  31. package/dist/components/chat/index.js.map +1 -1
  32. package/dist/components/chat/index.mjs +16 -15
  33. package/dist/components/chat/messages/LegacyRenderMessage.d.ts +28 -0
  34. package/dist/components/chat/messages/LegacyRenderMessage.js +980 -0
  35. package/dist/components/chat/messages/LegacyRenderMessage.js.map +1 -0
  36. package/dist/components/chat/messages/LegacyRenderMessage.mjs +17 -0
  37. package/dist/components/chat/messages/LegacyRenderMessage.mjs.map +1 -0
  38. package/dist/components/chat/messages/RenderMessage.js +4 -0
  39. package/dist/components/chat/messages/RenderMessage.js.map +1 -1
  40. package/dist/components/chat/messages/RenderMessage.mjs +1 -1
  41. package/dist/components/chat/props.d.ts +49 -0
  42. package/dist/components/chat/props.js.map +1 -1
  43. package/dist/components/index.js +1034 -868
  44. package/dist/components/index.js.map +1 -1
  45. package/dist/components/index.mjs +16 -15
  46. package/dist/index.js +1034 -868
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +16 -15
  49. package/package.json +4 -4
  50. package/src/components/chat/Chat.tsx +50 -14
  51. package/src/components/chat/Messages.tsx +56 -3
  52. package/src/components/chat/messages/LegacyRenderMessage.tsx +143 -0
  53. package/src/components/chat/messages/RenderMessage.tsx +3 -0
  54. package/src/components/chat/props.ts +57 -0
  55. package/dist/chunk-2KG77MAY.mjs.map +0 -1
  56. package/dist/chunk-JHUTTP5C.mjs.map +0 -1
  57. package/dist/chunk-U5ATIGWH.mjs.map +0 -1
  58. /package/dist/{chunk-TW4LLLTE.mjs.map → chunk-GBP47ONN.mjs.map} +0 -0
  59. /package/dist/{chunk-6C3YVF5W.mjs.map → chunk-J5ZZR6YB.mjs.map} +0 -0
  60. /package/dist/{chunk-7K2X77PW.mjs.map → chunk-Y44VLEUH.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,123 @@
1
1
  # ui
2
2
 
3
+ ## 1.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8674da1: - refactor(headless): completely overhaul headless ui to better support agentic features
8
+
9
+ Headless UI has been in a bad state for a bit now. When we added support for different
10
+ agentic runtimes we acquired tech-debt that, with this PR, is being alleviated.
11
+
12
+ As such, the following features have been updated to be completely functional with Headless UI.
13
+
14
+ - Generative UI
15
+ - Suggestions
16
+ - Agentic Generative UI
17
+ - Interrupts
18
+
19
+ In addition, a variety of QOL changes have been made.
20
+
21
+ - New AG-UI based message types
22
+ - Inline code rendering is fixed
23
+
24
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
25
+
26
+ ### Patch Changes
27
+
28
+ - 967d0ab: - refactor(chat): separate useCopilotChat into internal implementation and public API
29
+ - 2354be4: - feat(chat): implement custom error handling in CopilotChat and Modal components
30
+
31
+ - Added `renderError` prop to `CopilotChat` for inline error rendering.
32
+ - Introduced `triggerChatError` function to manage chat-specific errors and observability hooks.
33
+ - Updated `Modal` to handle observability hooks with public API key checks.
34
+ - Enhanced `CopilotObservabilityHooks` interface to include `onError` for error event handling.
35
+
36
+ - a8c0263: - feat: add event hooks system for chat components
37
+ - 6d1de58: - fix: address issues that would cause headless UI breaking changes in the next release
38
+
39
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
40
+
41
+ - fix: more fixes addressing breaking changes in new Headless UI
42
+
43
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
44
+
45
+ - chore: address linting issues
46
+
47
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
48
+
49
+ - chore: fixing branding and docs
50
+
51
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
52
+
53
+ - chore: more docs fixing
54
+
55
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
56
+
57
+ - Updated dependencies [967d0ab]
58
+ - Updated dependencies [a8c0263]
59
+ - Updated dependencies [8674da1]
60
+ - Updated dependencies [6d1de58]
61
+ - Updated dependencies [6de24ce]
62
+ - Updated dependencies [b64555d]
63
+ - @copilotkit/react-core@1.10.0
64
+ - @copilotkit/shared@1.10.0
65
+ - @copilotkit/runtime-client-gql@1.10.0
66
+
67
+ ## 1.10.0-next.13
68
+
69
+ ### Patch Changes
70
+
71
+ - @copilotkit/runtime-client-gql@1.10.0-next.13
72
+ - @copilotkit/react-core@1.10.0-next.13
73
+ - @copilotkit/shared@1.10.0-next.13
74
+
75
+ ## 1.10.0-next.12
76
+
77
+ ### Patch Changes
78
+
79
+ - Updated dependencies [b64555d]
80
+ - @copilotkit/react-core@1.10.0-next.12
81
+ - @copilotkit/runtime-client-gql@1.10.0-next.12
82
+ - @copilotkit/shared@1.10.0-next.12
83
+
84
+ ## 1.10.0-next.11
85
+
86
+ ### Patch Changes
87
+
88
+ - @copilotkit/runtime-client-gql@1.10.0-next.11
89
+ - @copilotkit/react-core@1.10.0-next.11
90
+ - @copilotkit/shared@1.10.0-next.11
91
+
92
+ ## 1.10.0-next.10
93
+
94
+ ### Patch Changes
95
+
96
+ - 6d1de58: - fix: address issues that would cause headless UI breaking changes in the next release
97
+
98
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
99
+
100
+ - fix: more fixes addressing breaking changes in new Headless UI
101
+
102
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
103
+
104
+ - chore: address linting issues
105
+
106
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
107
+
108
+ - chore: fixing branding and docs
109
+
110
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
111
+
112
+ - chore: more docs fixing
113
+
114
+ Signed-off-by: Tyler Slaton <tyler@copilotkit.ai>
115
+
116
+ - Updated dependencies [6d1de58]
117
+ - @copilotkit/react-core@1.10.0-next.10
118
+ - @copilotkit/shared@1.10.0-next.10
119
+ - @copilotkit/runtime-client-gql@1.10.0-next.10
120
+
3
121
  ## 1.10.0-next.9
4
122
 
5
123
  ### Patch Changes
@@ -1,6 +1,13 @@
1
+ import {
2
+ LegacyRenderMessage
3
+ } from "./chunk-MIVUCSGO.mjs";
1
4
  import {
2
5
  useChatContext
3
6
  } from "./chunk-IEMQ2SQW.mjs";
7
+ import {
8
+ __spreadProps,
9
+ __spreadValues
10
+ } from "./chunk-MRXNTQOX.mjs";
4
11
 
5
12
  // src/components/chat/Messages.tsx
6
13
  import { useEffect, useMemo, useRef } from "react";
@@ -12,23 +19,55 @@ var Messages = ({
12
19
  RenderMessage,
13
20
  AssistantMessage,
14
21
  UserMessage,
22
+ ImageRenderer,
15
23
  onRegenerate,
16
24
  onCopy,
17
25
  onThumbsUp,
18
26
  onThumbsDown,
19
- markdownTagRenderers
27
+ markdownTagRenderers,
28
+ // Legacy props
29
+ RenderTextMessage,
30
+ RenderActionExecutionMessage,
31
+ RenderAgentStateMessage,
32
+ RenderResultMessage,
33
+ RenderImageMessage
20
34
  }) => {
21
35
  const { labels } = useChatContext();
22
- const { visibleMessages, interrupt } = useCopilotChat();
36
+ const { messages: visibleMessages, interrupt } = useCopilotChat();
23
37
  const initialMessages = useMemo(() => makeInitialMessages(labels.initial), [labels.initial]);
24
38
  const messages = [...initialMessages, ...visibleMessages];
25
39
  const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);
40
+ const hasLegacyProps = !!(RenderTextMessage || RenderActionExecutionMessage || RenderAgentStateMessage || RenderResultMessage || RenderImageMessage);
41
+ useEffect(() => {
42
+ if (hasLegacyProps) {
43
+ console.warn(
44
+ "[CopilotKit] Legacy message render props (RenderTextMessage, RenderActionExecutionMessage, etc.) are deprecated. Please use the unified 'RenderMessage' prop instead. See migration guide: https://docs.copilotkit.ai/migration/render-message"
45
+ );
46
+ }
47
+ }, [hasLegacyProps]);
48
+ const legacyProps = useMemo(
49
+ () => ({
50
+ RenderTextMessage,
51
+ RenderActionExecutionMessage,
52
+ RenderAgentStateMessage,
53
+ RenderResultMessage,
54
+ RenderImageMessage
55
+ }),
56
+ [
57
+ RenderTextMessage,
58
+ RenderActionExecutionMessage,
59
+ RenderAgentStateMessage,
60
+ RenderResultMessage,
61
+ RenderImageMessage
62
+ ]
63
+ );
64
+ const MessageRenderer = hasLegacyProps ? (props) => /* @__PURE__ */ jsx(LegacyRenderMessage, __spreadProps(__spreadValues({}, props), { legacyProps })) : RenderMessage;
26
65
  return /* @__PURE__ */ jsxs("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
27
66
  /* @__PURE__ */ jsxs("div", { className: "copilotKitMessagesContainer", children: [
28
67
  messages.map((message, index) => {
29
68
  const isCurrentMessage = index === messages.length - 1;
30
69
  return /* @__PURE__ */ jsx(
31
- RenderMessage,
70
+ MessageRenderer,
32
71
  {
33
72
  message,
34
73
  inProgress,
@@ -36,6 +75,7 @@ var Messages = ({
36
75
  isCurrentMessage,
37
76
  AssistantMessage,
38
77
  UserMessage,
78
+ ImageRenderer,
39
79
  onRegenerate,
40
80
  onCopy,
41
81
  onThumbsUp,
@@ -65,7 +105,7 @@ function makeInitialMessages(initial) {
65
105
  return [
66
106
  {
67
107
  id: initial,
68
- role: "system",
108
+ role: "assistant",
69
109
  content: initial
70
110
  }
71
111
  ];
@@ -132,4 +172,4 @@ export {
132
172
  Messages,
133
173
  useScrollToBottom
134
174
  };
135
- //# sourceMappingURL=chunk-U5ATIGWH.mjs.map
175
+ //# sourceMappingURL=chunk-BJHJBS5M.mjs.map
@@ -0,0 +1 @@
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 } from \"@copilotkit/shared\";\nimport { useCopilotChatInternal as useCopilotChat } from \"@copilotkit/react-core\";\nimport { LegacyRenderMessage, LegacyRenderProps } from \"./messages/LegacyRenderMessage\";\n\nexport const Messages = ({\n inProgress,\n children,\n RenderMessage,\n AssistantMessage,\n UserMessage,\n ImageRenderer,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n markdownTagRenderers,\n\n // Legacy props\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n}: MessagesProps) => {\n const { labels } = useChatContext();\n const { messages: visibleMessages, interrupt } = useCopilotChat();\n const initialMessages = useMemo(() => makeInitialMessages(labels.initial), [labels.initial]);\n const messages = [...initialMessages, ...visibleMessages];\n const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);\n\n // Check if any legacy props are provided\n const hasLegacyProps = !!(\n RenderTextMessage ||\n RenderActionExecutionMessage ||\n RenderAgentStateMessage ||\n RenderResultMessage ||\n RenderImageMessage\n );\n\n // Show deprecation warning if legacy props are used\n useEffect(() => {\n if (hasLegacyProps) {\n console.warn(\n \"[CopilotKit] Legacy message render props (RenderTextMessage, RenderActionExecutionMessage, etc.) are deprecated. \" +\n \"Please use the unified 'RenderMessage' prop instead. \" +\n \"See migration guide: https://docs.copilotkit.ai/migration/render-message\",\n );\n }\n }, [hasLegacyProps]);\n\n // Create legacy props object for the adapter\n const legacyProps: LegacyRenderProps = useMemo(\n () => ({\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n }),\n [\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n ],\n );\n\n // Determine which render component to use\n const MessageRenderer = hasLegacyProps\n ? (props: any) => <LegacyRenderMessage {...props} legacyProps={legacyProps} />\n : RenderMessage;\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 return (\n <MessageRenderer\n key={index}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n ImageRenderer={ImageRenderer}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n markdownTagRenderers={markdownTagRenderers}\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[] | undefined): Message[] {\n if (!initial) return [];\n\n if (Array.isArray(initial)) {\n return initial.map((message) => {\n return {\n id: message,\n role: \"assistant\",\n content: message,\n };\n });\n }\n\n return [\n {\n id: initial,\n role: \"assistant\",\n content: initial,\n },\n ];\n}\n\nexport function useScrollToBottom(messages: Message[]) {\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.role === \"user\").length]);\n\n return { messagesEndRef, messagesContainerRef };\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,WAAW,SAAS,cAAc;AAI3C,SAAS,0BAA0B,sBAAsB;AAqEnC,cAKhB,YALgB;AAlEf,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAqB;AACnB,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,QAAM,EAAE,UAAU,iBAAiB,UAAU,IAAI,eAAe;AAChE,QAAM,kBAAkB,QAAQ,MAAM,oBAAoB,OAAO,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC;AAC3F,QAAM,WAAW,CAAC,GAAG,iBAAiB,GAAG,eAAe;AACxD,QAAM,EAAE,sBAAsB,eAAe,IAAI,kBAAkB,QAAQ;AAG3E,QAAM,iBAAiB,CAAC,EACtB,qBACA,gCACA,2BACA,uBACA;AAIF,YAAU,MAAM;AACd,QAAI,gBAAgB;AAClB,cAAQ;AAAA,QACN;AAAA,MAGF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAGnB,QAAM,cAAiC;AAAA,IACrC,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,iBACpB,CAAC,UAAe,oBAAC,sDAAwB,QAAxB,EAA+B,cAA0B,IAC1E;AAEJ,SACE,qBAAC,SAAI,WAAU,sBAAqB,KAAK,sBACvC;AAAA,yBAAC,SAAI,WAAU,+BACZ;AAAA,eAAS,IAAI,CAAC,SAAS,UAAU;AAChC,cAAM,mBAAmB,UAAU,SAAS,SAAS;AACrD,eACE;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UAZK;AAAA,QAaP;AAAA,MAEJ,CAAC;AAAA,MACA;AAAA,OACH;AAAA,IACA,oBAAC,YAAO,WAAU,4BAA2B,KAAK,gBAC/C,UACH;AAAA,KACF;AAEJ;AAEA,SAAS,oBAAoB,SAAmD;AAC9E,MAAI,CAAC;AAAS,WAAO,CAAC;AAEtB,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,WAAO,QAAQ,IAAI,CAAC,YAAY;AAC9B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,UAAqB;AACrD,QAAM,iBAAiB,OAAuB,IAAI;AAClD,QAAM,uBAAuB,OAA8B,IAAI;AAC/D,QAAM,0BAA0B,OAAO,KAAK;AAC5C,QAAM,oBAAoB,OAAO,KAAK;AAEtC,QAAM,iBAAiB,MAAM;AAC3B,QAAI,qBAAqB,WAAW,eAAe,SAAS;AAC1D,8BAAwB,UAAU;AAClC,2BAAqB,QAAQ,YAAY,qBAAqB,QAAQ;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,wBAAwB,SAAS;AACnC,8BAAwB,UAAU;AAClC;AAAA,IACF;AAEA,QAAI,qBAAqB,SAAS;AAChC,YAAM,EAAE,WAAW,cAAc,aAAa,IAAI,qBAAqB;AACvE,wBAAkB,UAAU,YAAY,eAAe;AAAA,IACzD;AAAA,EACF;AAEA,YAAU,MAAM;AACd,UAAM,YAAY,qBAAqB;AACvC,QAAI,WAAW;AACb,gBAAU,iBAAiB,UAAU,YAAY;AAAA,IACnD;AACA,WAAO,MAAM;AACX,UAAI,WAAW;AACb,kBAAU,oBAAoB,UAAU,YAAY;AAAA,MACtD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,YAAY,qBAAqB;AACvC,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,mBAAmB,IAAI,iBAAiB,MAAM;AAClD,UAAI,CAAC,kBAAkB,SAAS;AAC9B,uBAAe;AAAA,MACjB;AAAA,IACF,CAAC;AAED,qBAAiB,QAAQ,WAAW;AAAA,MAClC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,IACjB,CAAC;AAED,WAAO,MAAM;AACX,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,sBAAkB,UAAU;AAC5B,mBAAe;AAAA,EACjB,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,CAAC;AAErD,SAAO,EAAE,gBAAgB,qBAAqB;AAChD;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CopilotModal
3
- } from "./chunk-7K2X77PW.mjs";
3
+ } from "./chunk-Y44VLEUH.mjs";
4
4
  import {
5
5
  __spreadProps,
6
6
  __spreadValues
@@ -27,4 +27,4 @@ function CopilotSidebar(props) {
27
27
  export {
28
28
  CopilotSidebar
29
29
  };
30
- //# sourceMappingURL=chunk-TW4LLLTE.mjs.map
30
+ //# sourceMappingURL=chunk-GBP47ONN.mjs.map
@@ -1,15 +1,3 @@
1
- import {
2
- RenderMessage
3
- } from "./chunk-JHUTTP5C.mjs";
4
- import {
5
- AssistantMessage
6
- } from "./chunk-GCKKSSBU.mjs";
7
- import {
8
- ImageRenderer
9
- } from "./chunk-DBKRAOH7.mjs";
10
- import {
11
- UserMessage
12
- } from "./chunk-VVL6JFCJ.mjs";
13
1
  import {
14
2
  Suggestions
15
3
  } from "./chunk-226ZMOE3.mjs";
@@ -21,7 +9,19 @@ import {
21
9
  } from "./chunk-DTRPPNSA.mjs";
22
10
  import {
23
11
  Messages
24
- } from "./chunk-U5ATIGWH.mjs";
12
+ } from "./chunk-BJHJBS5M.mjs";
13
+ import {
14
+ RenderMessage
15
+ } from "./chunk-T5QU6KSB.mjs";
16
+ import {
17
+ AssistantMessage
18
+ } from "./chunk-GCKKSSBU.mjs";
19
+ import {
20
+ ImageRenderer
21
+ } from "./chunk-DBKRAOH7.mjs";
22
+ import {
23
+ UserMessage
24
+ } from "./chunk-VVL6JFCJ.mjs";
25
25
  import {
26
26
  ChatContext,
27
27
  ChatContextProvider
@@ -76,7 +76,13 @@ function CopilotChat({
76
76
  inputFileAccept = "image/*",
77
77
  hideStopButton,
78
78
  observabilityHooks,
79
- renderError
79
+ renderError,
80
+ // Legacy props - deprecated
81
+ RenderTextMessage,
82
+ RenderActionExecutionMessage,
83
+ RenderAgentStateMessage,
84
+ RenderResultMessage,
85
+ RenderImageMessage
80
86
  }) {
81
87
  const { additionalInstructions, setChatInstructions, copilotApiConfig, setBannerError } = useCopilotContext();
82
88
  const { publicApiKey, chatApiEndpoint } = copilotApiConfig;
@@ -204,7 +210,7 @@ function CopilotChat({
204
210
  setChatInstructions(combinedAdditionalInstructions.join("\n") || "");
205
211
  }, [instructions, additionalInstructions]);
206
212
  const {
207
- visibleMessages,
213
+ messages,
208
214
  isLoading,
209
215
  sendMessage,
210
216
  stopGeneration,
@@ -313,7 +319,7 @@ function CopilotChat({
313
319
  AssistantMessage: AssistantMessage2,
314
320
  UserMessage: UserMessage2,
315
321
  RenderMessage: RenderMessage2,
316
- messages: visibleMessages,
322
+ messages,
317
323
  inProgress: isLoading,
318
324
  onRegenerate: handleRegenerate,
319
325
  onCopy: handleCopy,
@@ -321,6 +327,11 @@ function CopilotChat({
321
327
  onThumbsDown: handleThumbsDown,
322
328
  markdownTagRenderers,
323
329
  ImageRenderer: ImageRenderer2,
330
+ RenderTextMessage,
331
+ RenderActionExecutionMessage,
332
+ RenderAgentStateMessage,
333
+ RenderResultMessage,
334
+ RenderImageMessage,
324
335
  children: currentSuggestions.length > 0 && /* @__PURE__ */ jsx(
325
336
  RenderSuggestionsList,
326
337
  {
@@ -376,8 +387,8 @@ function WrappedCopilotChat({
376
387
  var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
377
388
  var _a;
378
389
  const {
379
- visibleMessages,
380
- appendMessage,
390
+ messages,
391
+ sendMessage,
381
392
  setMessages,
382
393
  reloadMessages: defaultReloadMessages,
383
394
  stopGeneration: defaultStopGeneration,
@@ -423,12 +434,12 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
423
434
  if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
424
435
  return;
425
436
  }
426
- if (visibleMessages.length === 0 && !hasGeneratedInitialSuggestions.current) {
437
+ if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {
427
438
  hasGeneratedInitialSuggestions.current = true;
428
439
  generateSuggestionsWithErrorHandling("initial");
429
440
  return;
430
441
  }
431
- if (visibleMessages.length > 0 && suggestions.length === 0) {
442
+ if (messages.length > 0 && suggestions.length === 0) {
432
443
  generateSuggestionsWithErrorHandling("post-message");
433
444
  return;
434
445
  }
@@ -436,7 +447,7 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
436
447
  chatSuggestions,
437
448
  isLoadingSuggestions,
438
449
  suggestionsFailed,
439
- visibleMessages.length,
450
+ messages.length,
440
451
  isLoading,
441
452
  suggestions.length,
442
453
  Object.keys(generalContext.chatSuggestionConfiguration).join(","),
@@ -466,7 +477,7 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
466
477
  useEffect(() => {
467
478
  onInProgress == null ? void 0 : onInProgress(isLoading);
468
479
  }, [onInProgress, isLoading]);
469
- const sendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
480
+ const safelySendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
470
481
  const images = imagesToUse || [];
471
482
  if (chatSuggestions === "auto" || chatSuggestions === "manual") {
472
483
  setSuggestions([]);
@@ -485,7 +496,7 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
485
496
  console.error("Error in onSubmitMessage:", error);
486
497
  }
487
498
  }
488
- yield appendMessage(textMessage, {
499
+ yield sendMessage(textMessage, {
489
500
  followUp: images.length === 0,
490
501
  clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
491
502
  });
@@ -503,7 +514,7 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
503
514
  bytes: images[i].bytes
504
515
  }
505
516
  };
506
- yield appendMessage(imageMessage, { followUp: i === images.length - 1 });
517
+ yield sendMessage(imageMessage, { followUp: i === images.length - 1 });
507
518
  if (!firstMessage) {
508
519
  firstMessage = imageMessage;
509
520
  }
@@ -514,7 +525,6 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
514
525
  }
515
526
  return firstMessage;
516
527
  });
517
- const messages = visibleMessages;
518
528
  const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
519
529
  const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
520
530
  if (generalContext.agentSession) {
@@ -539,7 +549,7 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
539
549
  generalContext.agentSession.agentName,
540
550
  stableContext,
541
551
  messagesContext.messages,
542
- appendMessage,
552
+ sendMessage,
543
553
  runChatCompletion
544
554
  );
545
555
  }
@@ -596,10 +606,9 @@ var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, onInProgress, onS
596
606
  }
597
607
  return {
598
608
  messages,
599
- visibleMessages,
600
609
  isLoading,
601
610
  suggestions,
602
- sendMessage,
611
+ sendMessage: safelySendMessage,
603
612
  stopGeneration,
604
613
  reloadMessages,
605
614
  resetSuggestions,
@@ -613,4 +622,4 @@ export {
613
622
  WrappedCopilotChat,
614
623
  useCopilotChatLogic
615
624
  };
616
- //# sourceMappingURL=chunk-2KG77MAY.mjs.map
625
+ //# sourceMappingURL=chunk-GJ4SX4JE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chat/Chat.tsx"],"sourcesContent":["/**\n * <br/>\n * <img src=\"https://cdn.copilotkit.ai/docs/copilotkit/images/CopilotChat.gif\" width=\"500\" />\n *\n * A chatbot panel component for the CopilotKit framework. The component allows for a high degree\n * of customization through various props and custom CSS.\n *\n * ## Install Dependencies\n *\n * This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.\n *\n * ```shell npm2yarn \\\"@copilotkit/react-ui\"\\\n * npm install @copilotkit/react-core @copilotkit/react-ui\n * ```\n *\n * ## Usage\n *\n * ```tsx\n * import { CopilotChat } from \"@copilotkit/react-ui\";\n * import \"@copilotkit/react-ui/styles.css\";\n *\n * <CopilotChat\n * labels={{\n * title: \"Your Assistant\",\n * initial: \"Hi! 👋 How can I assist you today?\",\n * }}\n * />\n * ```\n *\n * ### With Observability Hooks\n *\n * To monitor user interactions, provide the `observabilityHooks` prop.\n * **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.\n *\n * ```tsx\n * <CopilotKit publicApiKey=\"YOUR_PUBLIC_API_KEY\">\n * <CopilotChat\n * observabilityHooks={{\n * onMessageSent: (message) => {\n * console.log(\"Message sent:\", message);\n * },\n * }}\n * />\n * </CopilotKit>\n * ```\n *\n * ### Look & Feel\n *\n * By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:\n * ```tsx title=\"YourRootComponent.tsx\"\n * ...\n * import \"@copilotkit/react-ui/styles.css\"; // [!code highlight]\n *\n * export function YourRootComponent() {\n * return (\n * <CopilotKit>\n * ...\n * </CopilotKit>\n * );\n * }\n * ```\n * For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.\n */\n\nimport {\n ChatContext,\n ChatContextProvider,\n CopilotChatIcons,\n CopilotChatLabels,\n} from \"./ChatContext\";\nimport { Messages as DefaultMessages } from \"./Messages\";\nimport { Input as DefaultInput } from \"./Input\";\nimport { RenderMessage as DefaultRenderMessage } from \"./messages/RenderMessage\";\nimport { AssistantMessage as DefaultAssistantMessage } from \"./messages/AssistantMessage\";\nimport { UserMessage as DefaultUserMessage } from \"./messages/UserMessage\";\nimport { ImageRenderer as DefaultImageRenderer } from \"./messages/ImageRenderer\";\nimport React, { useEffect, useRef, useState, useCallback, useMemo } from \"react\";\nimport {\n SystemMessageFunction,\n useCopilotChatInternal as useCopilotChat,\n useCopilotContext,\n useCopilotMessagesContext,\n} from \"@copilotkit/react-core\";\nimport type { SuggestionItem } from \"@copilotkit/react-core\";\nimport {\n CopilotKitError,\n CopilotKitErrorCode,\n CopilotErrorEvent,\n Message,\n Severity,\n ErrorVisibility,\n styledConsole,\n} from \"@copilotkit/shared\";\nimport { randomId } from \"@copilotkit/shared\";\nimport {\n AssistantMessageProps,\n ComponentsMap,\n CopilotObservabilityHooks,\n ImageRendererProps,\n InputProps,\n MessagesProps,\n RenderMessageProps,\n RenderSuggestionsListProps,\n UserMessageProps,\n} from \"./props\";\n\nimport { HintFunction, runAgent, stopAgent } from \"@copilotkit/react-core\";\nimport { ImageUploadQueue } from \"./ImageUploadQueue\";\nimport { Suggestions as DefaultRenderSuggestionsList } from \"./Suggestions\";\n\n/**\n * The type of suggestions to use in the chat.\n *\n * `auto` - Suggestions are generated automatically.\n * `manual` - Suggestions are controlled programmatically.\n * `SuggestionItem[]` - Static suggestions array.\n */\nexport type ChatSuggestions = \"auto\" | \"manual\" | SuggestionItem[];\n\n/**\n * Props for CopilotChat component.\n */\nexport interface CopilotChatProps {\n /**\n * Custom instructions to be added to the system message. Use this property to\n * provide additional context or guidance to the language model, influencing\n * its responses. These instructions can include specific directions,\n * preferences, or criteria that the model should consider when generating\n * its output, thereby tailoring the conversation more precisely to the\n * user's needs or the application's requirements.\n */\n instructions?: string;\n\n /**\n * Controls the behavior of suggestions in the chat interface.\n *\n * `auto` (default) - Suggestions are generated automatically:\n * - When the chat is first opened (empty state)\n * - After each message exchange completes\n * - Uses configuration from `useCopilotChatSuggestions` hooks\n *\n * `manual` - Suggestions are controlled programmatically:\n * - Use `setSuggestions()` to set custom suggestions\n * - Use `generateSuggestions()` to trigger AI generation\n * - Access via `useCopilotChat` hook\n *\n * `SuggestionItem[]` - Static suggestions array:\n * - Always shows the same suggestions\n * - No AI generation involved\n */\n suggestions?: ChatSuggestions;\n\n /**\n * A callback that gets called when the in progress state changes.\n */\n onInProgress?: (inProgress: boolean) => void;\n\n /**\n * A callback that gets called when a new message it submitted.\n */\n onSubmitMessage?: (message: string) => void | Promise<void>;\n\n /**\n * A custom stop generation function.\n */\n onStopGeneration?: OnStopGeneration;\n\n /**\n * A custom reload messages function.\n */\n onReloadMessages?: OnReloadMessages;\n\n /**\n * A callback function to regenerate the assistant's response\n */\n onRegenerate?: (messageId: string) => void;\n\n /**\n * A callback function when the message is copied\n */\n onCopy?: (message: string) => void;\n\n /**\n * A callback function for thumbs up feedback\n */\n onThumbsUp?: (message: Message) => void;\n\n /**\n * A callback function for thumbs down feedback\n */\n onThumbsDown?: (message: Message) => void;\n\n /**\n * A list of markdown components to render in assistant message.\n * Useful when you want to render custom elements in the message (e.g a reference tag element)\n */\n markdownTagRenderers?: ComponentsMap;\n\n /**\n * Icons can be used to set custom icons for the chat window.\n */\n icons?: CopilotChatIcons;\n\n /**\n * Labels can be used to set custom labels for the chat window.\n */\n labels?: CopilotChatLabels;\n\n /**\n * Enable image upload button (image inputs only supported on some models)\n */\n imageUploadsEnabled?: boolean;\n\n /**\n * The 'accept' attribute for the file input used for image uploads.\n * Defaults to \"image/*\".\n */\n inputFileAccept?: string;\n\n /**\n * A function that takes in context string and instructions and returns\n * the system message to include in the chat request.\n * Use this to completely override the system message, when providing\n * instructions is not enough.\n */\n makeSystemMessage?: SystemMessageFunction;\n\n /**\n * A custom assistant message component to use instead of the default.\n */\n AssistantMessage?: React.ComponentType<AssistantMessageProps>;\n\n /**\n * A custom user message component to use instead of the default.\n */\n UserMessage?: React.ComponentType<UserMessageProps>;\n\n /**\n * A custom Messages component to use instead of the default.\n */\n Messages?: React.ComponentType<MessagesProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderTextMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderResultMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderImageMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * A custom RenderMessage component to use instead of the default.\n *\n * **Warning**: This is a break-glass solution to allow for custom\n * rendering of messages. You are most likely looking to swap out\n * the AssistantMessage and UserMessage components instead which\n * are also props.\n */\n RenderMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * A custom suggestions list component to use instead of the default.\n */\n RenderSuggestionsList?: React.ComponentType<RenderSuggestionsListProps>;\n\n /**\n * A custom Input component to use instead of the default.\n */\n Input?: React.ComponentType<InputProps>;\n\n /**\n * A custom image rendering component to use instead of the default.\n */\n ImageRenderer?: React.ComponentType<ImageRendererProps>;\n\n /**\n * A class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Children to render.\n */\n children?: React.ReactNode;\n\n hideStopButton?: boolean;\n\n /**\n * Event hooks for CopilotKit chat events.\n * These hooks only work when publicApiKey is provided.\n */\n observabilityHooks?: CopilotObservabilityHooks;\n\n /**\n * Custom error renderer for chat-specific errors.\n * When provided, errors will be displayed inline within the chat interface.\n */\n renderError?: (error: {\n message: string;\n operation?: string;\n timestamp: number;\n onDismiss: () => void;\n onRetry?: () => void;\n }) => React.ReactNode;\n}\n\ninterface OnStopGenerationArguments {\n /**\n * The name of the currently executing agent.\n */\n currentAgentName: string | undefined;\n\n /**\n * The messages in the chat.\n */\n messages: Message[];\n\n /**\n * Set the messages in the chat.\n */\n setMessages: (messages: Message[]) => void;\n\n /**\n * Stop chat generation.\n */\n stopGeneration: () => void;\n\n /**\n * Restart the currently executing agent.\n */\n restartCurrentAgent: () => void;\n\n /**\n * Stop the currently executing agent.\n */\n stopCurrentAgent: () => void;\n\n /**\n * Run the currently executing agent.\n */\n runCurrentAgent: (hint?: HintFunction) => Promise<void>;\n\n /**\n * Set the state of the currently executing agent.\n */\n setCurrentAgentState: (state: any) => void;\n}\n\nexport type OnReloadMessagesArguments = OnStopGenerationArguments & {\n /**\n * The message on which \"regenerate\" was pressed\n */\n messageId: string;\n};\n\nexport type OnStopGeneration = (args: OnStopGenerationArguments) => void;\n\nexport type OnReloadMessages = (args: OnReloadMessagesArguments) => void;\n\nexport type ImageUpload = {\n contentType: string;\n bytes: string;\n};\n\nexport function CopilotChat({\n instructions,\n suggestions = \"auto\",\n onSubmitMessage,\n makeSystemMessage,\n onInProgress,\n onStopGeneration,\n onReloadMessages,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n markdownTagRenderers,\n Messages = DefaultMessages,\n RenderMessage = DefaultRenderMessage,\n RenderSuggestionsList = DefaultRenderSuggestionsList,\n Input = DefaultInput,\n className,\n icons,\n labels,\n AssistantMessage = DefaultAssistantMessage,\n UserMessage = DefaultUserMessage,\n ImageRenderer = DefaultImageRenderer,\n imageUploadsEnabled,\n inputFileAccept = \"image/*\",\n hideStopButton,\n observabilityHooks,\n renderError,\n\n // Legacy props - deprecated\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n}: CopilotChatProps) {\n const { additionalInstructions, setChatInstructions, copilotApiConfig, setBannerError } =\n useCopilotContext();\n\n // Destructure stable values to avoid object reference changes\n const { publicApiKey, chatApiEndpoint } = copilotApiConfig;\n const [selectedImages, setSelectedImages] = useState<Array<ImageUpload>>([]);\n const [chatError, setChatError] = useState<{\n message: string;\n operation?: string;\n timestamp: number;\n } | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to trigger event hooks only if publicApiKey is provided\n const triggerObservabilityHook = useCallback(\n (hookName: keyof CopilotObservabilityHooks, ...args: any[]) => {\n if (publicApiKey && observabilityHooks?.[hookName]) {\n (observabilityHooks[hookName] as any)(...args);\n }\n if (observabilityHooks?.[hookName] && !publicApiKey) {\n setBannerError(\n new CopilotKitError({\n message: \"observabilityHooks requires a publicApiKey to function.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.CRITICAL,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.publicApiKeyRequired(\"observabilityHooks\");\n }\n },\n [publicApiKey, observabilityHooks, setBannerError],\n );\n\n // Helper function to trigger chat error and render error UI\n const triggerChatError = useCallback(\n (error: any, operation: string, originalError?: any) => {\n const errorMessage = error?.message || error?.toString() || \"An error occurred\";\n\n // Set chat error state for rendering\n setChatError({\n message: errorMessage,\n operation,\n timestamp: Date.now(),\n });\n\n // Also trigger observability hook if available\n if (publicApiKey && observabilityHooks?.onError) {\n const errorEvent: CopilotErrorEvent = {\n type: \"error\",\n timestamp: Date.now(),\n context: {\n source: \"ui\",\n request: {\n operation,\n url: chatApiEndpoint,\n startTime: Date.now(),\n },\n technical: {\n environment: \"browser\",\n userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : undefined,\n stackTrace: originalError instanceof Error ? originalError.stack : undefined,\n },\n },\n error,\n };\n observabilityHooks.onError(errorEvent);\n }\n\n // Show banner error if onError hook is used without publicApiKey\n if (observabilityHooks?.onError && !publicApiKey) {\n setBannerError(\n new CopilotKitError({\n message: \"observabilityHooks.onError requires a publicApiKey to function.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.CRITICAL,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.publicApiKeyRequired(\"observabilityHooks.onError\");\n }\n },\n [publicApiKey, chatApiEndpoint, observabilityHooks, setBannerError],\n );\n\n // Clipboard paste handler\n useEffect(() => {\n if (!imageUploadsEnabled) return;\n\n const handlePaste = async (e: ClipboardEvent) => {\n const target = e.target as HTMLElement;\n if (!target.parentElement?.classList.contains(\"copilotKitInput\")) return;\n\n const items = Array.from(e.clipboardData?.items || []);\n const imageItems = items.filter((item) => item.type.startsWith(\"image/\"));\n\n if (imageItems.length === 0) return;\n\n e.preventDefault(); // Prevent default paste behavior for images\n\n const imagePromises: Promise<ImageUpload | null>[] = imageItems.map((item) => {\n const file = item.getAsFile();\n if (!file) return Promise.resolve(null);\n\n return new Promise<ImageUpload | null>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64String = (e.target?.result as string)?.split(\",\")[1];\n if (base64String) {\n resolve({\n contentType: file.type,\n bytes: base64String,\n });\n } else {\n resolve(null);\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n });\n\n try {\n const loadedImages = (await Promise.all(imagePromises)).filter((img) => img !== null);\n setSelectedImages((prev) => [...prev, ...loadedImages]);\n } catch (error) {\n // Trigger chat-level error handler\n triggerChatError(error, \"processClipboardImages\", error);\n console.error(\"Error processing pasted images:\", error);\n }\n };\n\n document.addEventListener(\"paste\", handlePaste);\n return () => document.removeEventListener(\"paste\", handlePaste);\n }, [imageUploadsEnabled, triggerChatError]);\n\n useEffect(() => {\n if (!additionalInstructions?.length) {\n setChatInstructions(instructions || \"\");\n return;\n }\n\n /*\n Will result in a prompt like:\n\n You are a helpful assistant. \n Additionally, follow these instructions:\n - Do not answer questions about the weather.\n - Do not answer questions about the stock market.\"\n */\n const combinedAdditionalInstructions = [\n instructions,\n \"Additionally, follow these instructions:\",\n ...additionalInstructions.map((instruction) => `- ${instruction}`),\n ];\n\n setChatInstructions(combinedAdditionalInstructions.join(\"\\n\") || \"\");\n }, [instructions, additionalInstructions]);\n\n const {\n messages,\n isLoading,\n sendMessage,\n stopGeneration,\n reloadMessages,\n suggestions: currentSuggestions,\n } = useCopilotChatLogic(\n suggestions,\n makeSystemMessage,\n onInProgress,\n onSubmitMessage,\n onStopGeneration,\n onReloadMessages,\n );\n\n // Track loading state changes for chat start/stop events\n const prevIsLoading = useRef(isLoading);\n useEffect(() => {\n if (prevIsLoading.current !== isLoading) {\n if (isLoading) {\n triggerObservabilityHook(\"onChatStarted\");\n } else {\n triggerObservabilityHook(\"onChatStopped\");\n }\n prevIsLoading.current = isLoading;\n }\n }, [isLoading, triggerObservabilityHook]);\n\n // Wrapper for sendMessage to clear selected images\n const handleSendMessage = (text: string) => {\n const images = selectedImages;\n setSelectedImages([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n\n // Trigger message sent event\n triggerObservabilityHook(\"onMessageSent\", text);\n\n return sendMessage(text, images);\n };\n\n const chatContext = React.useContext(ChatContext);\n const isVisible = chatContext ? chatContext.open : true;\n\n const handleRegenerate = (messageId: string) => {\n if (onRegenerate) {\n onRegenerate(messageId);\n }\n\n // Trigger message regenerated event\n triggerObservabilityHook(\"onMessageRegenerated\", messageId);\n\n reloadMessages(messageId);\n };\n\n const handleCopy = (message: string) => {\n if (onCopy) {\n onCopy(message);\n }\n\n // Trigger message copied event\n triggerObservabilityHook(\"onMessageCopied\", message);\n };\n\n const handleImageUpload = async (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n\n const files = Array.from(event.target.files).filter((file) => file.type.startsWith(\"image/\"));\n if (files.length === 0) return;\n\n const fileReadPromises = files.map((file) => {\n return new Promise<{ contentType: string; bytes: string }>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64String = (e.target?.result as string)?.split(\",\")[1] || \"\";\n if (base64String) {\n resolve({\n contentType: file.type,\n bytes: base64String,\n });\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n });\n\n try {\n const loadedImages = await Promise.all(fileReadPromises);\n setSelectedImages((prev) => [...prev, ...loadedImages]);\n } catch (error) {\n // Trigger chat-level error handler\n triggerChatError(error, \"processUploadedImages\", error);\n console.error(\"Error reading files:\", error);\n }\n };\n\n const removeSelectedImage = (index: number) => {\n setSelectedImages((prev) => prev.filter((_, i) => i !== index));\n };\n\n const handleThumbsUp = (message: Message) => {\n if (onThumbsUp) {\n onThumbsUp(message);\n }\n\n // Trigger feedback given event\n triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsUp\");\n };\n\n const handleThumbsDown = (message: Message) => {\n if (onThumbsDown) {\n onThumbsDown(message);\n }\n\n // Trigger feedback given event\n triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsDown\");\n };\n\n return (\n <WrappedCopilotChat icons={icons} labels={labels} className={className}>\n {/* Render error above messages if present */}\n {chatError &&\n renderError &&\n renderError({\n ...chatError,\n onDismiss: () => setChatError(null),\n onRetry: () => {\n // Clear error and potentially retry based on operation\n setChatError(null);\n // TODO: Implement specific retry logic based on operation type\n },\n })}\n\n <Messages\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n RenderMessage={RenderMessage}\n messages={messages}\n inProgress={isLoading}\n onRegenerate={handleRegenerate}\n onCopy={handleCopy}\n onThumbsUp={handleThumbsUp}\n onThumbsDown={handleThumbsDown}\n markdownTagRenderers={markdownTagRenderers}\n ImageRenderer={ImageRenderer}\n // Legacy props - passed through to Messages component\n RenderTextMessage={RenderTextMessage}\n RenderActionExecutionMessage={RenderActionExecutionMessage}\n RenderAgentStateMessage={RenderAgentStateMessage}\n RenderResultMessage={RenderResultMessage}\n RenderImageMessage={RenderImageMessage}\n >\n {currentSuggestions.length > 0 && (\n <RenderSuggestionsList\n onSuggestionClick={handleSendMessage}\n suggestions={currentSuggestions}\n />\n )}\n </Messages>\n\n {imageUploadsEnabled && (\n <>\n <ImageUploadQueue images={selectedImages} onRemoveImage={removeSelectedImage} />\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n onChange={handleImageUpload}\n accept={inputFileAccept}\n style={{ display: \"none\" }}\n />\n </>\n )}\n <Input\n inProgress={isLoading}\n onSend={handleSendMessage}\n isVisible={isVisible}\n onStop={stopGeneration}\n onUpload={imageUploadsEnabled ? () => fileInputRef.current?.click() : undefined}\n hideStopButton={hideStopButton}\n />\n </WrappedCopilotChat>\n );\n}\n\nexport function WrappedCopilotChat({\n children,\n icons,\n labels,\n className,\n}: {\n children: React.ReactNode;\n icons?: CopilotChatIcons;\n labels?: CopilotChatLabels;\n className?: string;\n}) {\n const chatContext = React.useContext(ChatContext);\n if (!chatContext) {\n return (\n <ChatContextProvider icons={icons} labels={labels} open={true} setOpen={() => {}}>\n <div className={`copilotKitChat ${className ?? \"\"}`}>{children}</div>\n </ChatContextProvider>\n );\n }\n return <>{children}</>;\n}\n\nexport const useCopilotChatLogic = (\n chatSuggestions: ChatSuggestions,\n makeSystemMessage?: SystemMessageFunction,\n onInProgress?: (isLoading: boolean) => void,\n onSubmitMessage?: (messageContent: string) => Promise<void> | void,\n onStopGeneration?: OnStopGeneration,\n onReloadMessages?: OnReloadMessages,\n) => {\n const {\n messages,\n sendMessage,\n setMessages,\n reloadMessages: defaultReloadMessages,\n stopGeneration: defaultStopGeneration,\n runChatCompletion,\n isLoading,\n suggestions,\n setSuggestions,\n generateSuggestions,\n resetSuggestions: resetSuggestionsFromHook,\n isLoadingSuggestions,\n } = useCopilotChat({\n makeSystemMessage,\n });\n\n const generalContext = useCopilotContext();\n const messagesContext = useCopilotMessagesContext();\n\n // Get actions from context for message conversion\n const { actions } = generalContext;\n\n // Suggestion state management\n const [suggestionsFailed, setSuggestionsFailed] = useState(false);\n const hasGeneratedInitialSuggestions = useRef<boolean>(false);\n\n // Handle static suggestions (when suggestions prop is an array)\n useEffect(() => {\n if (Array.isArray(chatSuggestions)) {\n setSuggestions(chatSuggestions);\n hasGeneratedInitialSuggestions.current = true;\n }\n }, [JSON.stringify(chatSuggestions), setSuggestions]);\n\n // Error handling wrapper\n const generateSuggestionsWithErrorHandling = useCallback(\n async (context: string) => {\n try {\n await generateSuggestions();\n } catch (error) {\n console.error(\"Failed to generate suggestions:\", error);\n setSuggestionsFailed(true);\n }\n },\n [generateSuggestions],\n );\n\n // Automatic suggestion generation logic\n useEffect(() => {\n // Only proceed if in auto mode, not currently loading, and not failed\n if (chatSuggestions !== \"auto\" || isLoadingSuggestions || suggestionsFailed) {\n return;\n }\n\n // Don't run during chat loading (when the assistant is responding)\n if (isLoading) {\n return;\n }\n\n // Check if we have any configurations\n if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {\n return;\n }\n\n // Generate initial suggestions when chat is empty\n if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {\n hasGeneratedInitialSuggestions.current = true;\n generateSuggestionsWithErrorHandling(\"initial\");\n return;\n }\n\n // Generate post-message suggestions after assistant responds\n if (messages.length > 0 && suggestions.length === 0) {\n generateSuggestionsWithErrorHandling(\"post-message\");\n return;\n }\n }, [\n chatSuggestions,\n isLoadingSuggestions,\n suggestionsFailed,\n messages.length,\n isLoading,\n suggestions.length,\n Object.keys(generalContext.chatSuggestionConfiguration).join(\",\"), // Use stable string instead of object reference\n generateSuggestionsWithErrorHandling,\n ]);\n\n // Reset suggestion state when switching away from auto mode\n useEffect(() => {\n if (chatSuggestions !== \"auto\") {\n hasGeneratedInitialSuggestions.current = false;\n setSuggestionsFailed(false);\n }\n }, [chatSuggestions]);\n\n // Memoize context to prevent infinite re-renders\n const stableContext = useMemo(\n () => ({\n ...generalContext,\n ...messagesContext,\n }),\n [\n // Only include stable dependencies\n generalContext.actions,\n messagesContext.messages.length,\n generalContext.isLoading,\n ],\n );\n\n // Wrapper for resetSuggestions that also resets local state\n const resetSuggestions = useCallback(() => {\n resetSuggestionsFromHook();\n setSuggestionsFailed(false);\n hasGeneratedInitialSuggestions.current = false;\n }, [resetSuggestionsFromHook]);\n\n useEffect(() => {\n onInProgress?.(isLoading);\n }, [onInProgress, isLoading]);\n\n const safelySendMessage = async (\n messageContent: string,\n imagesToUse?: Array<{ contentType: string; bytes: string }>,\n ) => {\n const images = imagesToUse || [];\n\n // Clear existing suggestions when user sends a message\n // This prevents stale suggestions from remaining visible during new conversation flow\n if (chatSuggestions === \"auto\" || chatSuggestions === \"manual\") {\n setSuggestions([]);\n }\n\n let firstMessage: Message | null = null;\n\n // Send text message if content provided\n if (messageContent.trim().length > 0) {\n const textMessage: Message = {\n id: randomId(),\n role: \"user\",\n content: messageContent,\n };\n\n // Call user-provided submit handler if available\n if (onSubmitMessage) {\n try {\n await onSubmitMessage(messageContent);\n } catch (error) {\n console.error(\"Error in onSubmitMessage:\", error);\n }\n }\n\n // Send the message and clear suggestions for auto/manual modes\n await sendMessage(textMessage, {\n followUp: images.length === 0,\n clearSuggestions: chatSuggestions === \"auto\" || chatSuggestions === \"manual\",\n });\n\n if (!firstMessage) {\n firstMessage = textMessage;\n }\n }\n\n // Send image messages\n if (images.length > 0) {\n for (let i = 0; i < images.length; i++) {\n const imageMessage = {\n id: randomId(),\n role: \"user\" as const,\n image: {\n format: images[i].contentType.replace(\"image/\", \"\"),\n bytes: images[i].bytes,\n },\n } as unknown as Message;\n await sendMessage(imageMessage, { followUp: i === images.length - 1 });\n if (!firstMessage) {\n firstMessage = imageMessage;\n }\n }\n }\n\n if (!firstMessage) {\n // Should not happen if send button is properly disabled, but handle just in case\n return { role: \"user\", content: \"\", id: randomId() } as Message; // Return a dummy message\n }\n\n // The hook implicitly triggers API call on appendMessage.\n // We return the first message sent (either text or first image)\n return firstMessage;\n };\n\n const currentAgentName = generalContext.agentSession?.agentName;\n const restartCurrentAgent = async (hint?: HintFunction) => {\n if (generalContext.agentSession) {\n generalContext.setAgentSession({\n ...generalContext.agentSession,\n nodeName: undefined,\n threadId: undefined,\n });\n generalContext.setCoagentStates((prevAgentStates) => {\n return {\n ...prevAgentStates,\n [generalContext.agentSession!.agentName]: {\n ...prevAgentStates[generalContext.agentSession!.agentName],\n threadId: undefined,\n nodeName: undefined,\n runId: undefined,\n },\n };\n });\n }\n };\n const runCurrentAgent = async (hint?: HintFunction) => {\n if (generalContext.agentSession) {\n await runAgent(\n generalContext.agentSession.agentName,\n stableContext,\n messagesContext.messages,\n sendMessage,\n runChatCompletion,\n );\n }\n };\n const stopCurrentAgent = () => {\n if (generalContext.agentSession) {\n stopAgent(generalContext.agentSession.agentName, stableContext);\n }\n };\n const setCurrentAgentState = (state: any) => {\n if (generalContext.agentSession) {\n generalContext.setCoagentStates((prevAgentStates) => {\n return {\n ...prevAgentStates,\n [generalContext.agentSession!.agentName]: {\n state,\n },\n } as any;\n });\n }\n };\n\n function stopGeneration() {\n // Clear suggestions when stopping generation\n setSuggestions([]);\n\n if (onStopGeneration) {\n onStopGeneration({\n messages: messages,\n setMessages,\n stopGeneration: defaultStopGeneration,\n currentAgentName,\n restartCurrentAgent,\n stopCurrentAgent,\n runCurrentAgent,\n setCurrentAgentState,\n });\n } else {\n defaultStopGeneration();\n }\n }\n function reloadMessages(messageId: string) {\n if (onReloadMessages) {\n onReloadMessages({\n messages: messages,\n setMessages,\n stopGeneration: defaultStopGeneration,\n currentAgentName,\n restartCurrentAgent,\n stopCurrentAgent,\n runCurrentAgent,\n setCurrentAgentState,\n messageId,\n });\n } else {\n defaultReloadMessages(messageId);\n }\n }\n\n return {\n messages,\n isLoading,\n suggestions,\n sendMessage: safelySendMessage,\n stopGeneration,\n reloadMessages,\n resetSuggestions,\n context: stableContext,\n actions,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,OAAO,SAAS,WAAW,QAAQ,UAAU,aAAa,eAAe;AACzE;AAAA,EAEE,0BAA0B;AAAA,EAC1B;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AAazB,SAAuB,UAAU,iBAAiB;AAonBxC,SAQF,UARE,KAQF,YARE;AAjWH,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAAA,YAAW;AAAA,EACX,eAAAC,iBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,OAAAC,SAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC,oBAAmB;AAAA,EACnB,aAAAC,eAAc;AAAA,EACd,eAAAC,iBAAgB;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,wBAAwB,qBAAqB,kBAAkB,eAAe,IACpF,kBAAkB;AAGpB,QAAM,EAAE,cAAc,gBAAgB,IAAI;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAA6B,CAAC,CAAC;AAC3E,QAAM,CAAC,WAAW,YAAY,IAAI,SAIxB,IAAI;AACd,QAAM,eAAe,OAAyB,IAAI;AAGlD,QAAM,2BAA2B;AAAA,IAC/B,CAAC,aAA8C,SAAgB;AAC7D,UAAI,iBAAgB,yDAAqB,YAAW;AAClD,QAAC,mBAAmB,QAAQ,EAAU,GAAG,IAAI;AAAA,MAC/C;AACA,WAAI,yDAAqB,cAAa,CAAC,cAAc;AACnD;AAAA,UACE,IAAI,gBAAgB;AAAA,YAClB,SAAS;AAAA,YACT,MAAM,oBAAoB;AAAA,YAC1B,UAAU,SAAS;AAAA,YACnB,YAAY,gBAAgB;AAAA,UAC9B,CAAC;AAAA,QACH;AACA,sBAAc,qBAAqB,oBAAoB;AAAA,MACzD;AAAA,IACF;AAAA,IACA,CAAC,cAAc,oBAAoB,cAAc;AAAA,EACnD;AAGA,QAAM,mBAAmB;AAAA,IACvB,CAAC,OAAY,WAAmB,kBAAwB;AACtD,YAAM,gBAAe,+BAAO,aAAW,+BAAO,eAAc;AAG5D,mBAAa;AAAA,QACX,SAAS;AAAA,QACT;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAGD,UAAI,iBAAgB,yDAAoB,UAAS;AAC/C,cAAM,aAAgC;AAAA,UACpC,MAAM;AAAA,UACN,WAAW,KAAK,IAAI;AAAA,UACpB,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,cACP;AAAA,cACA,KAAK;AAAA,cACL,WAAW,KAAK,IAAI;AAAA,YACtB;AAAA,YACA,WAAW;AAAA,cACT,aAAa;AAAA,cACb,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,cACpE,YAAY,yBAAyB,QAAQ,cAAc,QAAQ;AAAA,YACrE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AACA,2BAAmB,QAAQ,UAAU;AAAA,MACvC;AAGA,WAAI,yDAAoB,YAAW,CAAC,cAAc;AAChD;AAAA,UACE,IAAI,gBAAgB;AAAA,YAClB,SAAS;AAAA,YACT,MAAM,oBAAoB;AAAA,YAC1B,UAAU,SAAS;AAAA,YACnB,YAAY,gBAAgB;AAAA,UAC9B,CAAC;AAAA,QACH;AACA,sBAAc,qBAAqB,4BAA4B;AAAA,MACjE;AAAA,IACF;AAAA,IACA,CAAC,cAAc,iBAAiB,oBAAoB,cAAc;AAAA,EACpE;AAGA,YAAU,MAAM;AACd,QAAI,CAAC;AAAqB;AAE1B,UAAM,cAAc,CAAO,MAAsB;AA1frD;AA2fM,YAAM,SAAS,EAAE;AACjB,UAAI,GAAC,YAAO,kBAAP,mBAAsB,UAAU,SAAS;AAAoB;AAElE,YAAM,QAAQ,MAAM,OAAK,OAAE,kBAAF,mBAAiB,UAAS,CAAC,CAAC;AACrD,YAAM,aAAa,MAAM,OAAO,CAAC,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC;AAExE,UAAI,WAAW,WAAW;AAAG;AAE7B,QAAE,eAAe;AAEjB,YAAM,gBAA+C,WAAW,IAAI,CAAC,SAAS;AAC5E,cAAM,OAAO,KAAK,UAAU;AAC5B,YAAI,CAAC;AAAM,iBAAO,QAAQ,QAAQ,IAAI;AAEtC,eAAO,IAAI,QAA4B,CAAC,SAAS,WAAW;AAC1D,gBAAM,SAAS,IAAI,WAAW;AAC9B,iBAAO,SAAS,CAACC,OAAM;AA3gBjC,gBAAAC,KAAAC;AA4gBY,kBAAM,gBAAgBA,OAAAD,MAAAD,GAAE,WAAF,gBAAAC,IAAU,WAAV,gBAAAC,IAA6B,MAAM,KAAK;AAC9D,gBAAI,cAAc;AAChB,sBAAQ;AAAA,gBACN,aAAa,KAAK;AAAA,gBAClB,OAAO;AAAA,cACT,CAAC;AAAA,YACH,OAAO;AACL,sBAAQ,IAAI;AAAA,YACd;AAAA,UACF;AACA,iBAAO,UAAU;AACjB,iBAAO,cAAc,IAAI;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AAED,UAAI;AACF,cAAM,gBAAgB,MAAM,QAAQ,IAAI,aAAa,GAAG,OAAO,CAAC,QAAQ,QAAQ,IAAI;AACpF,0BAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC;AAAA,MACxD,SAAS,OAAP;AAEA,yBAAiB,OAAO,0BAA0B,KAAK;AACvD,gBAAQ,MAAM,mCAAmC,KAAK;AAAA,MACxD;AAAA,IACF;AAEA,aAAS,iBAAiB,SAAS,WAAW;AAC9C,WAAO,MAAM,SAAS,oBAAoB,SAAS,WAAW;AAAA,EAChE,GAAG,CAAC,qBAAqB,gBAAgB,CAAC;AAE1C,YAAU,MAAM;AACd,QAAI,EAAC,iEAAwB,SAAQ;AACnC,0BAAoB,gBAAgB,EAAE;AACtC;AAAA,IACF;AAUA,UAAM,iCAAiC;AAAA,MACrC;AAAA,MACA;AAAA,MACA,GAAG,uBAAuB,IAAI,CAAC,gBAAgB,KAAK,aAAa;AAAA,IACnE;AAEA,wBAAoB,+BAA+B,KAAK,IAAI,KAAK,EAAE;AAAA,EACrE,GAAG,CAAC,cAAc,sBAAsB,CAAC;AAEzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,EACf,IAAI;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,SAAS;AACtC,YAAU,MAAM;AACd,QAAI,cAAc,YAAY,WAAW;AACvC,UAAI,WAAW;AACb,iCAAyB,eAAe;AAAA,MAC1C,OAAO;AACL,iCAAyB,eAAe;AAAA,MAC1C;AACA,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAW,wBAAwB,CAAC;AAGxC,QAAM,oBAAoB,CAAC,SAAiB;AAC1C,UAAM,SAAS;AACf,sBAAkB,CAAC,CAAC;AACpB,QAAI,aAAa,SAAS;AACxB,mBAAa,QAAQ,QAAQ;AAAA,IAC/B;AAGA,6BAAyB,iBAAiB,IAAI;AAE9C,WAAO,YAAY,MAAM,MAAM;AAAA,EACjC;AAEA,QAAM,cAAc,MAAM,WAAW,WAAW;AAChD,QAAM,YAAY,cAAc,YAAY,OAAO;AAEnD,QAAM,mBAAmB,CAAC,cAAsB;AAC9C,QAAI,cAAc;AAChB,mBAAa,SAAS;AAAA,IACxB;AAGA,6BAAyB,wBAAwB,SAAS;AAE1D,mBAAe,SAAS;AAAA,EAC1B;AAEA,QAAM,aAAa,CAAC,YAAoB;AACtC,QAAI,QAAQ;AACV,aAAO,OAAO;AAAA,IAChB;AAGA,6BAAyB,mBAAmB,OAAO;AAAA,EACrD;AAEA,QAAM,oBAAoB,CAAO,UAA+C;AAC9E,QAAI,CAAC,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM,WAAW,GAAG;AAC1D;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,KAAK,MAAM,OAAO,KAAK,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,WAAW,QAAQ,CAAC;AAC5F,QAAI,MAAM,WAAW;AAAG;AAExB,UAAM,mBAAmB,MAAM,IAAI,CAAC,SAAS;AAC3C,aAAO,IAAI,QAAgD,CAAC,SAAS,WAAW;AAC9E,cAAM,SAAS,IAAI,WAAW;AAC9B,eAAO,SAAS,CAAC,MAAM;AA7oB/B;AA8oBU,gBAAM,iBAAgB,aAAE,WAAF,mBAAU,WAAV,mBAA6B,MAAM,KAAK,OAAM;AACpE,cAAI,cAAc;AAChB,oBAAQ;AAAA,cACN,aAAa,KAAK;AAAA,cAClB,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF;AACA,eAAO,UAAU;AACjB,eAAO,cAAc,IAAI;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAED,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ,IAAI,gBAAgB;AACvD,wBAAkB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,YAAY,CAAC;AAAA,IACxD,SAAS,OAAP;AAEA,uBAAiB,OAAO,yBAAyB,KAAK;AACtD,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,sBAAsB,CAAC,UAAkB;AAC7C,sBAAkB,CAAC,SAAS,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC;AAAA,EAChE;AAEA,QAAM,iBAAiB,CAAC,YAAqB;AAC3C,QAAI,YAAY;AACd,iBAAW,OAAO;AAAA,IACpB;AAGA,6BAAyB,mBAAmB,QAAQ,IAAI,UAAU;AAAA,EACpE;AAEA,QAAM,mBAAmB,CAAC,YAAqB;AAC7C,QAAI,cAAc;AAChB,mBAAa,OAAO;AAAA,IACtB;AAGA,6BAAyB,mBAAmB,QAAQ,IAAI,YAAY;AAAA,EACtE;AAEA,SACE,qBAAC,sBAAmB,OAAc,QAAgB,WAE/C;AAAA,iBACC,eACA,YAAY,iCACP,YADO;AAAA,MAEV,WAAW,MAAM,aAAa,IAAI;AAAA,MAClC,SAAS,MAAM;AAEb,qBAAa,IAAI;AAAA,MAEnB;AAAA,IACF,EAAC;AAAA,IAEH;AAAA,MAACR;AAAA,MAAA;AAAA,QACC,kBAAkBG;AAAA,QAClB,aAAaC;AAAA,QACb,eAAeH;AAAA,QACf;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,cAAc;AAAA,QACd;AAAA,QACA,eAAeI;AAAA,QAEf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QAEC,6BAAmB,SAAS,KAC3B;AAAA,UAAC;AAAA;AAAA,YACC,mBAAmB;AAAA,YACnB,aAAa;AAAA;AAAA,QACf;AAAA;AAAA,IAEJ;AAAA,IAEC,uBACC,iCACE;AAAA,0BAAC,oBAAiB,QAAQ,gBAAgB,eAAe,qBAAqB;AAAA,MAC9E;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,UAAQ;AAAA,UACR,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,EAAE,SAAS,OAAO;AAAA;AAAA,MAC3B;AAAA,OACF;AAAA,IAEF;AAAA,MAACH;AAAA,MAAA;AAAA,QACC,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,sBAAsB,MAAG;AAvvB3C;AAuvB8C,oCAAa,YAAb,mBAAsB;AAAA,YAAU;AAAA,QACtE;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,cAAc,MAAM,WAAW,WAAW;AAChD,MAAI,CAAC,aAAa;AAChB,WACE,oBAAC,uBAAoB,OAAc,QAAgB,MAAM,MAAM,SAAS,MAAM;AAAA,IAAC,GAC7E,8BAAC,SAAI,WAAW,kBAAkB,gCAAa,MAAO,UAAS,GACjE;AAAA,EAEJ;AACA,SAAO,gCAAG,UAAS;AACrB;AAEO,IAAM,sBAAsB,CACjC,iBACA,mBACA,cACA,iBACA,kBACA,qBACG;AA3xBL;AA4xBE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,EACF,IAAI,eAAe;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,kBAAkB;AACzC,QAAM,kBAAkB,0BAA0B;AAGlD,QAAM,EAAE,QAAQ,IAAI;AAGpB,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAS,KAAK;AAChE,QAAM,iCAAiC,OAAgB,KAAK;AAG5D,YAAU,MAAM;AACd,QAAI,MAAM,QAAQ,eAAe,GAAG;AAClC,qBAAe,eAAe;AAC9B,qCAA+B,UAAU;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,KAAK,UAAU,eAAe,GAAG,cAAc,CAAC;AAGpD,QAAM,uCAAuC;AAAA,IAC3C,CAAO,YAAoB;AACzB,UAAI;AACF,cAAM,oBAAoB;AAAA,MAC5B,SAAS,OAAP;AACA,gBAAQ,MAAM,mCAAmC,KAAK;AACtD,6BAAqB,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAGA,YAAU,MAAM;AAEd,QAAI,oBAAoB,UAAU,wBAAwB,mBAAmB;AAC3E;AAAA,IACF;AAGA,QAAI,WAAW;AACb;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,eAAe,2BAA2B,EAAE,WAAW,GAAG;AACxE;AAAA,IACF;AAGA,QAAI,SAAS,WAAW,KAAK,CAAC,+BAA+B,SAAS;AACpE,qCAA+B,UAAU;AACzC,2CAAqC,SAAS;AAC9C;AAAA,IACF;AAGA,QAAI,SAAS,SAAS,KAAK,YAAY,WAAW,GAAG;AACnD,2CAAqC,cAAc;AACnD;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,OAAO,KAAK,eAAe,2BAA2B,EAAE,KAAK,GAAG;AAAA;AAAA,IAChE;AAAA,EACF,CAAC;AAGD,YAAU,MAAM;AACd,QAAI,oBAAoB,QAAQ;AAC9B,qCAA+B,UAAU;AACzC,2BAAqB,KAAK;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAGpB,QAAM,gBAAgB;AAAA,IACpB,MAAO,kCACF,iBACA;AAAA,IAEL;AAAA;AAAA,MAEE,eAAe;AAAA,MACf,gBAAgB,SAAS;AAAA,MACzB,eAAe;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,mBAAmB,YAAY,MAAM;AACzC,6BAAyB;AACzB,yBAAqB,KAAK;AAC1B,mCAA+B,UAAU;AAAA,EAC3C,GAAG,CAAC,wBAAwB,CAAC;AAE7B,YAAU,MAAM;AACd,iDAAe;AAAA,EACjB,GAAG,CAAC,cAAc,SAAS,CAAC;AAE5B,QAAM,oBAAoB,CACxB,gBACA,gBACG;AACH,UAAM,SAAS,eAAe,CAAC;AAI/B,QAAI,oBAAoB,UAAU,oBAAoB,UAAU;AAC9D,qBAAe,CAAC,CAAC;AAAA,IACnB;AAEA,QAAI,eAA+B;AAGnC,QAAI,eAAe,KAAK,EAAE,SAAS,GAAG;AACpC,YAAM,cAAuB;AAAA,QAC3B,IAAI,SAAS;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAGA,UAAI,iBAAiB;AACnB,YAAI;AACF,gBAAM,gBAAgB,cAAc;AAAA,QACtC,SAAS,OAAP;AACA,kBAAQ,MAAM,6BAA6B,KAAK;AAAA,QAClD;AAAA,MACF;AAGA,YAAM,YAAY,aAAa;AAAA,QAC7B,UAAU,OAAO,WAAW;AAAA,QAC5B,kBAAkB,oBAAoB,UAAU,oBAAoB;AAAA,MACtE,CAAC;AAED,UAAI,CAAC,cAAc;AACjB,uBAAe;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,GAAG;AACrB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,eAAe;AAAA,UACnB,IAAI,SAAS;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,YACL,QAAQ,OAAO,CAAC,EAAE,YAAY,QAAQ,UAAU,EAAE;AAAA,YAClD,OAAO,OAAO,CAAC,EAAE;AAAA,UACnB;AAAA,QACF;AACA,cAAM,YAAY,cAAc,EAAE,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC;AACrE,YAAI,CAAC,cAAc;AACjB,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AAEjB,aAAO,EAAE,MAAM,QAAQ,SAAS,IAAI,IAAI,SAAS,EAAE;AAAA,IACrD;AAIA,WAAO;AAAA,EACT;AAEA,QAAM,oBAAmB,oBAAe,iBAAf,mBAA6B;AACtD,QAAM,sBAAsB,CAAO,SAAwB;AACzD,QAAI,eAAe,cAAc;AAC/B,qBAAe,gBAAgB,iCAC1B,eAAe,eADW;AAAA,QAE7B,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,EAAC;AACD,qBAAe,iBAAiB,CAAC,oBAAoB;AACnD,eAAO,iCACF,kBADE;AAAA,UAEL,CAAC,eAAe,aAAc,SAAS,GAAG,iCACrC,gBAAgB,eAAe,aAAc,SAAS,IADjB;AAAA,YAExC,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,kBAAkB,CAAO,SAAwB;AACrD,QAAI,eAAe,cAAc;AAC/B,YAAM;AAAA,QACJ,eAAe,aAAa;AAAA,QAC5B;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,eAAe,cAAc;AAC/B,gBAAU,eAAe,aAAa,WAAW,aAAa;AAAA,IAChE;AAAA,EACF;AACA,QAAM,uBAAuB,CAAC,UAAe;AAC3C,QAAI,eAAe,cAAc;AAC/B,qBAAe,iBAAiB,CAAC,oBAAoB;AACnD,eAAO,iCACF,kBADE;AAAA,UAEL,CAAC,eAAe,aAAc,SAAS,GAAG;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,iBAAiB;AAExB,mBAAe,CAAC,CAAC;AAEjB,QAAI,kBAAkB;AACpB,uBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,4BAAsB;AAAA,IACxB;AAAA,EACF;AACA,WAAS,eAAe,WAAmB;AACzC,QAAI,kBAAkB;AACpB,uBAAiB;AAAA,QACf;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,4BAAsB,SAAS;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;","names":["Messages","RenderMessage","Input","AssistantMessage","UserMessage","ImageRenderer","e","_a","_b"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CopilotModal
3
- } from "./chunk-7K2X77PW.mjs";
3
+ } from "./chunk-Y44VLEUH.mjs";
4
4
  import {
5
5
  __spreadProps,
6
6
  __spreadValues
@@ -18,4 +18,4 @@ function CopilotPopup(props) {
18
18
  export {
19
19
  CopilotPopup
20
20
  };
21
- //# sourceMappingURL=chunk-6C3YVF5W.mjs.map
21
+ //# sourceMappingURL=chunk-J5ZZR6YB.mjs.map
@@ -0,0 +1,126 @@
1
+ import {
2
+ RenderMessage
3
+ } from "./chunk-T5QU6KSB.mjs";
4
+
5
+ // src/components/chat/messages/LegacyRenderMessage.tsx
6
+ import { aguiToGQL } from "@copilotkit/runtime-client-gql";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var LegacyRenderMessage = ({
9
+ message,
10
+ inProgress,
11
+ index,
12
+ isCurrentMessage,
13
+ actionResult,
14
+ AssistantMessage,
15
+ UserMessage,
16
+ ImageRenderer,
17
+ onRegenerate,
18
+ onCopy,
19
+ onThumbsUp,
20
+ onThumbsDown,
21
+ markdownTagRenderers,
22
+ legacyProps
23
+ }) => {
24
+ var _a;
25
+ const {
26
+ RenderTextMessage,
27
+ RenderActionExecutionMessage,
28
+ RenderAgentStateMessage,
29
+ RenderResultMessage,
30
+ RenderImageMessage
31
+ } = legacyProps;
32
+ const deprecatedMessage = (_a = aguiToGQL(message)[0]) != null ? _a : void 0;
33
+ if (deprecatedMessage.isTextMessage() && RenderTextMessage) {
34
+ return /* @__PURE__ */ jsx(
35
+ RenderTextMessage,
36
+ {
37
+ message,
38
+ inProgress,
39
+ index,
40
+ isCurrentMessage,
41
+ AssistantMessage,
42
+ UserMessage,
43
+ onRegenerate,
44
+ onCopy,
45
+ onThumbsUp,
46
+ onThumbsDown,
47
+ markdownTagRenderers
48
+ }
49
+ );
50
+ }
51
+ if (deprecatedMessage.isActionExecutionMessage() && RenderActionExecutionMessage) {
52
+ return /* @__PURE__ */ jsx(
53
+ RenderActionExecutionMessage,
54
+ {
55
+ message,
56
+ inProgress,
57
+ index,
58
+ isCurrentMessage,
59
+ actionResult,
60
+ AssistantMessage,
61
+ UserMessage
62
+ }
63
+ );
64
+ }
65
+ if (deprecatedMessage.isAgentStateMessage() && RenderAgentStateMessage) {
66
+ return /* @__PURE__ */ jsx(
67
+ RenderAgentStateMessage,
68
+ {
69
+ message,
70
+ inProgress,
71
+ index,
72
+ isCurrentMessage,
73
+ AssistantMessage,
74
+ UserMessage
75
+ }
76
+ );
77
+ }
78
+ if (deprecatedMessage.isResultMessage() && RenderResultMessage) {
79
+ return /* @__PURE__ */ jsx(
80
+ RenderResultMessage,
81
+ {
82
+ message,
83
+ inProgress,
84
+ index,
85
+ isCurrentMessage,
86
+ AssistantMessage,
87
+ UserMessage
88
+ }
89
+ );
90
+ }
91
+ if (deprecatedMessage.isImageMessage() && RenderImageMessage) {
92
+ return /* @__PURE__ */ jsx(
93
+ RenderImageMessage,
94
+ {
95
+ message,
96
+ inProgress,
97
+ index,
98
+ isCurrentMessage,
99
+ AssistantMessage,
100
+ UserMessage
101
+ }
102
+ );
103
+ }
104
+ return /* @__PURE__ */ jsx(
105
+ RenderMessage,
106
+ {
107
+ message,
108
+ inProgress,
109
+ index,
110
+ isCurrentMessage,
111
+ AssistantMessage,
112
+ UserMessage,
113
+ ImageRenderer,
114
+ onRegenerate,
115
+ onCopy,
116
+ onThumbsUp,
117
+ onThumbsDown,
118
+ markdownTagRenderers
119
+ }
120
+ );
121
+ };
122
+
123
+ export {
124
+ LegacyRenderMessage
125
+ };
126
+ //# sourceMappingURL=chunk-MIVUCSGO.mjs.map