@copilotkit/react-ui 1.10.6 → 1.50.0-beta.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 (122) hide show
  1. package/dist/{chunk-H5Y4W7DM.mjs → chunk-3JYVJHL5.mjs} +6 -6
  2. package/dist/chunk-3YWFGNSM.mjs +32 -0
  3. package/dist/chunk-3YWFGNSM.mjs.map +1 -0
  4. package/dist/{chunk-BAD2NFZ7.mjs → chunk-CQ2WALZ7.mjs} +2 -2
  5. package/dist/{chunk-W7ONZTSW.mjs → chunk-E6WVAOQA.mjs} +11 -5
  6. package/dist/chunk-E6WVAOQA.mjs.map +1 -0
  7. package/dist/{chunk-ME2WM7IP.mjs → chunk-G35HUUDA.mjs} +36 -260
  8. package/dist/chunk-G35HUUDA.mjs.map +1 -0
  9. package/dist/{chunk-EZQA3UPQ.mjs → chunk-HBZW7E5Z.mjs} +16 -13
  10. package/dist/chunk-HBZW7E5Z.mjs.map +1 -0
  11. package/dist/{chunk-3QYTKBWC.mjs → chunk-IHFR6PYG.mjs} +8 -5
  12. package/dist/chunk-IHFR6PYG.mjs.map +1 -0
  13. package/dist/{chunk-5XLGXUQI.mjs → chunk-MPF6BJUF.mjs} +7 -3
  14. package/dist/chunk-MPF6BJUF.mjs.map +1 -0
  15. package/dist/{chunk-W26XFBEG.mjs → chunk-NGJ32FAP.mjs} +3 -3
  16. package/dist/chunk-NGJ32FAP.mjs.map +1 -0
  17. package/dist/{chunk-2LIO4Z3E.mjs → chunk-ODEHR7KI.mjs} +9 -2
  18. package/dist/chunk-ODEHR7KI.mjs.map +1 -0
  19. package/dist/chunk-OYRZ4VLU.mjs +12 -0
  20. package/dist/chunk-OYRZ4VLU.mjs.map +1 -0
  21. package/dist/chunk-QB3GUN2N.mjs +31 -0
  22. package/dist/chunk-QB3GUN2N.mjs.map +1 -0
  23. package/dist/{chunk-7RDGZ5JL.mjs → chunk-SOB5EIL7.mjs} +2 -2
  24. package/dist/components/chat/Chat.d.ts +3 -98
  25. package/dist/components/chat/Chat.js +100 -279
  26. package/dist/components/chat/Chat.js.map +1 -1
  27. package/dist/components/chat/Chat.mjs +12 -14
  28. package/dist/components/chat/Input.d.ts +1 -1
  29. package/dist/components/chat/Input.js +11 -8
  30. package/dist/components/chat/Input.js.map +1 -1
  31. package/dist/components/chat/Input.mjs +2 -2
  32. package/dist/components/chat/Messages.d.ts +4 -4
  33. package/dist/components/chat/Messages.js +44 -8
  34. package/dist/components/chat/Messages.js.map +1 -1
  35. package/dist/components/chat/Messages.mjs +5 -5
  36. package/dist/components/chat/Modal.d.ts +1 -6
  37. package/dist/components/chat/Modal.js +106 -283
  38. package/dist/components/chat/Modal.js.map +1 -1
  39. package/dist/components/chat/Modal.mjs +11 -11
  40. package/dist/components/chat/Popup.d.ts +1 -6
  41. package/dist/components/chat/Popup.js +106 -283
  42. package/dist/components/chat/Popup.js.map +1 -1
  43. package/dist/components/chat/Popup.mjs +12 -12
  44. package/dist/components/chat/Sidebar.d.ts +1 -6
  45. package/dist/components/chat/Sidebar.js +106 -283
  46. package/dist/components/chat/Sidebar.js.map +1 -1
  47. package/dist/components/chat/Sidebar.mjs +12 -12
  48. package/dist/components/chat/Suggestion.js.map +1 -1
  49. package/dist/components/chat/Suggestion.mjs +1 -1
  50. package/dist/components/chat/Suggestions.d.ts +1 -1
  51. package/dist/components/chat/Suggestions.js +19 -12
  52. package/dist/components/chat/Suggestions.js.map +1 -1
  53. package/dist/components/chat/Suggestions.mjs +2 -2
  54. package/dist/components/chat/index.d.ts +0 -5
  55. package/dist/components/chat/index.js +106 -283
  56. package/dist/components/chat/index.js.map +1 -1
  57. package/dist/components/chat/index.mjs +13 -13
  58. package/dist/components/chat/messages/AssistantMessage.js +7 -4
  59. package/dist/components/chat/messages/AssistantMessage.js.map +1 -1
  60. package/dist/components/chat/messages/AssistantMessage.mjs +1 -1
  61. package/dist/components/chat/messages/LegacyRenderMessage.js +37 -7
  62. package/dist/components/chat/messages/LegacyRenderMessage.js.map +1 -1
  63. package/dist/components/chat/messages/LegacyRenderMessage.mjs +4 -4
  64. package/dist/components/chat/messages/RenderMessage.js +30 -7
  65. package/dist/components/chat/messages/RenderMessage.js.map +1 -1
  66. package/dist/components/chat/messages/RenderMessage.mjs +3 -3
  67. package/dist/components/chat/messages/UserMessage.js +19 -3
  68. package/dist/components/chat/messages/UserMessage.js.map +1 -1
  69. package/dist/components/chat/messages/UserMessage.mjs +1 -1
  70. package/dist/components/chat/props.d.ts +16 -0
  71. package/dist/components/chat/props.js.map +1 -1
  72. package/dist/components/index.d.ts +0 -5
  73. package/dist/components/index.js +106 -283
  74. package/dist/components/index.js.map +1 -1
  75. package/dist/components/index.mjs +13 -13
  76. package/dist/hooks/index.d.ts +1 -0
  77. package/dist/hooks/index.js +2 -24
  78. package/dist/hooks/index.js.map +1 -1
  79. package/dist/hooks/index.mjs +1 -1
  80. package/dist/hooks/use-copilot-chat-suggestions.d.ts +4 -26
  81. package/dist/hooks/use-copilot-chat-suggestions.js +2 -24
  82. package/dist/hooks/use-copilot-chat-suggestions.js.map +1 -1
  83. package/dist/hooks/use-copilot-chat-suggestions.mjs +1 -1
  84. package/dist/index.css +8 -1
  85. package/dist/index.css.map +1 -1
  86. package/dist/index.d.ts +0 -5
  87. package/dist/index.js +109 -308
  88. package/dist/index.js.map +1 -1
  89. package/dist/index.mjs +14 -14
  90. package/dist/types/suggestions.d.ts +1 -0
  91. package/dist/types/suggestions.js.map +1 -1
  92. package/package.json +23 -22
  93. package/src/components/chat/Chat.tsx +40 -325
  94. package/src/components/chat/Input.tsx +13 -12
  95. package/src/components/chat/Messages.tsx +10 -4
  96. package/src/components/chat/Suggestion.tsx +2 -2
  97. package/src/components/chat/Suggestions.tsx +6 -2
  98. package/src/components/chat/messages/AssistantMessage.tsx +14 -4
  99. package/src/components/chat/messages/LegacyRenderMessage.tsx +7 -0
  100. package/src/components/chat/messages/RenderMessage.tsx +4 -0
  101. package/src/components/chat/messages/UserMessage.tsx +30 -6
  102. package/src/components/chat/props.ts +19 -0
  103. package/src/css/messages.css +10 -1
  104. package/src/hooks/use-copilot-chat-suggestions.tsx +6 -57
  105. package/src/types/suggestions.ts +1 -0
  106. package/tsup.config.ts +1 -1
  107. package/dist/chunk-226ZMOE3.mjs +0 -24
  108. package/dist/chunk-226ZMOE3.mjs.map +0 -1
  109. package/dist/chunk-2LIO4Z3E.mjs.map +0 -1
  110. package/dist/chunk-3QYTKBWC.mjs.map +0 -1
  111. package/dist/chunk-5XLGXUQI.mjs.map +0 -1
  112. package/dist/chunk-EYRKZDP5.mjs +0 -32
  113. package/dist/chunk-EYRKZDP5.mjs.map +0 -1
  114. package/dist/chunk-EZQA3UPQ.mjs.map +0 -1
  115. package/dist/chunk-ME2WM7IP.mjs.map +0 -1
  116. package/dist/chunk-VVL6JFCJ.mjs +0 -16
  117. package/dist/chunk-VVL6JFCJ.mjs.map +0 -1
  118. package/dist/chunk-W26XFBEG.mjs.map +0 -1
  119. package/dist/chunk-W7ONZTSW.mjs.map +0 -1
  120. /package/dist/{chunk-H5Y4W7DM.mjs.map → chunk-3JYVJHL5.mjs.map} +0 -0
  121. /package/dist/{chunk-BAD2NFZ7.mjs.map → chunk-CQ2WALZ7.mjs.map} +0 -0
  122. /package/dist/{chunk-7RDGZ5JL.mjs.map → chunk-SOB5EIL7.mjs.map} +0 -0
@@ -1039,14 +1039,30 @@ var import_react_core5 = require("@copilotkit/react-core");
1039
1039
 
1040
1040
  // src/components/chat/messages/UserMessage.tsx
1041
1041
  var import_jsx_runtime10 = require("react/jsx-runtime");
1042
+ var getTextContent = (content) => {
1043
+ if (typeof content === "undefined") {
1044
+ return void 0;
1045
+ }
1046
+ if (typeof content === "string") {
1047
+ return content;
1048
+ }
1049
+ return content.map((part) => {
1050
+ if (part.type === "text") {
1051
+ return part.text;
1052
+ }
1053
+ return void 0;
1054
+ }).filter((value) => typeof value === "string" && value.length > 0).join(" ").trim() || void 0;
1055
+ };
1042
1056
  var UserMessage = (props) => {
1043
1057
  const { message, ImageRenderer: ImageRenderer2 } = props;
1044
- const isImageMessage = message && "image" in message && message.image;
1058
+ const isImageMessage = message && "image" in message && Boolean(message.image);
1045
1059
  if (isImageMessage) {
1046
1060
  const imageMessage = message;
1047
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ImageRenderer2, { image: imageMessage.image, content: imageMessage.content }) });
1061
+ const content2 = getTextContent(imageMessage == null ? void 0 : imageMessage.content);
1062
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ImageRenderer2, { image: imageMessage.image, content: content2 }) });
1048
1063
  }
1049
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: message == null ? void 0 : message.content });
1064
+ const content = getTextContent(message == null ? void 0 : message.content);
1065
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: content });
1050
1066
  };
1051
1067
 
1052
1068
  // src/components/chat/Markdown.tsx
@@ -1589,6 +1605,7 @@ var AssistantMessage = (props) => {
1589
1605
  onThumbsUp,
1590
1606
  onThumbsDown,
1591
1607
  isCurrentMessage,
1608
+ feedback,
1592
1609
  markdownTagRenderers
1593
1610
  } = props;
1594
1611
  const [copied, setCopied] = (0, import_react8.useState)(false);
@@ -1610,12 +1627,14 @@ var AssistantMessage = (props) => {
1610
1627
  onRegenerate();
1611
1628
  };
1612
1629
  const handleThumbsUp = () => {
1613
- if (onThumbsUp && message)
1630
+ if (onThumbsUp && message) {
1614
1631
  onThumbsUp(message);
1632
+ }
1615
1633
  };
1616
1634
  const handleThumbsDown = () => {
1617
- if (onThumbsDown && message)
1635
+ if (onThumbsDown && message) {
1618
1636
  onThumbsDown(message);
1637
+ }
1619
1638
  };
1620
1639
  const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: icons.activityIcon });
1621
1640
  const content = (message == null ? void 0 : message.content) || "";
@@ -1651,7 +1670,7 @@ var AssistantMessage = (props) => {
1651
1670
  onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1652
1671
  "button",
1653
1672
  {
1654
- className: "copilotKitMessageControlButton",
1673
+ className: `copilotKitMessageControlButton ${feedback === "thumbsUp" ? "active" : ""}`,
1655
1674
  onClick: handleThumbsUp,
1656
1675
  "aria-label": labels.thumbsUp,
1657
1676
  title: labels.thumbsUp,
@@ -1661,7 +1680,7 @@ var AssistantMessage = (props) => {
1661
1680
  onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1662
1681
  "button",
1663
1682
  {
1664
- className: "copilotKitMessageControlButton",
1683
+ className: `copilotKitMessageControlButton ${feedback === "thumbsDown" ? "active" : ""}`,
1665
1684
  onClick: handleThumbsDown,
1666
1685
  "aria-label": labels.thumbsDown,
1667
1686
  title: labels.thumbsDown,
@@ -1722,6 +1741,7 @@ function RenderMessage(_a) {
1722
1741
  var _a2;
1723
1742
  const {
1724
1743
  message,
1744
+ messages,
1725
1745
  inProgress,
1726
1746
  index,
1727
1747
  isCurrentMessage,
@@ -1729,6 +1749,7 @@ function RenderMessage(_a) {
1729
1749
  onCopy,
1730
1750
  onThumbsUp,
1731
1751
  onThumbsDown,
1752
+ messageFeedback,
1732
1753
  markdownTagRenderers
1733
1754
  } = props;
1734
1755
  switch (message.role) {
@@ -1751,6 +1772,7 @@ function RenderMessage(_a) {
1751
1772
  subComponent: (_a2 = message.generativeUI) == null ? void 0 : _a2.call(message),
1752
1773
  rawData: message,
1753
1774
  message,
1775
+ messages,
1754
1776
  isLoading: inProgress && isCurrentMessage && !message.content,
1755
1777
  isGenerating: inProgress && isCurrentMessage && !!message.content,
1756
1778
  isCurrentMessage,
@@ -1758,6 +1780,7 @@ function RenderMessage(_a) {
1758
1780
  onCopy,
1759
1781
  onThumbsUp,
1760
1782
  onThumbsDown,
1783
+ feedback: (messageFeedback == null ? void 0 : messageFeedback[message.id]) || null,
1761
1784
  markdownTagRenderers,
1762
1785
  ImageRenderer: ImageRenderer2
1763
1786
  },
@@ -1771,6 +1794,7 @@ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1771
1794
  var import_jsx_runtime16 = require("react/jsx-runtime");
1772
1795
  var LegacyRenderMessage = ({
1773
1796
  message,
1797
+ messages,
1774
1798
  inProgress,
1775
1799
  index,
1776
1800
  isCurrentMessage,
@@ -1799,6 +1823,7 @@ var LegacyRenderMessage = ({
1799
1823
  RenderTextMessage,
1800
1824
  {
1801
1825
  message,
1826
+ messages,
1802
1827
  inProgress,
1803
1828
  index,
1804
1829
  isCurrentMessage,
@@ -1816,6 +1841,7 @@ var LegacyRenderMessage = ({
1816
1841
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1817
1842
  RenderActionExecutionMessage,
1818
1843
  {
1844
+ messages,
1819
1845
  message,
1820
1846
  inProgress,
1821
1847
  index,
@@ -1830,6 +1856,7 @@ var LegacyRenderMessage = ({
1830
1856
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1831
1857
  RenderAgentStateMessage,
1832
1858
  {
1859
+ messages,
1833
1860
  message,
1834
1861
  inProgress,
1835
1862
  index,
@@ -1843,6 +1870,7 @@ var LegacyRenderMessage = ({
1843
1870
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1844
1871
  RenderResultMessage,
1845
1872
  {
1873
+ messages,
1846
1874
  message,
1847
1875
  inProgress,
1848
1876
  index,
@@ -1856,6 +1884,7 @@ var LegacyRenderMessage = ({
1856
1884
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1857
1885
  RenderImageMessage,
1858
1886
  {
1887
+ messages,
1859
1888
  message,
1860
1889
  inProgress,
1861
1890
  index,
@@ -1868,6 +1897,7 @@ var LegacyRenderMessage = ({
1868
1897
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1869
1898
  RenderMessage,
1870
1899
  {
1900
+ messages,
1871
1901
  message,
1872
1902
  inProgress,
1873
1903
  index,
@@ -1898,6 +1928,7 @@ var Messages = ({
1898
1928
  onCopy,
1899
1929
  onThumbsUp,
1900
1930
  onThumbsDown,
1931
+ messageFeedback,
1901
1932
  markdownTagRenderers,
1902
1933
  chatError,
1903
1934
  // Legacy props
@@ -1907,7 +1938,8 @@ var Messages = ({
1907
1938
  RenderResultMessage,
1908
1939
  RenderImageMessage
1909
1940
  }) => {
1910
- const { labels } = useChatContext();
1941
+ var _a;
1942
+ const { labels, icons } = useChatContext();
1911
1943
  const { messages: visibleMessages, interrupt } = (0, import_react_core5.useCopilotChatInternal)();
1912
1944
  const initialMessages = (0, import_react10.useMemo)(() => makeInitialMessages(labels.initial), [labels.initial]);
1913
1945
  const messages = [...initialMessages, ...visibleMessages];
@@ -1937,6 +1969,7 @@ var Messages = ({
1937
1969
  ]
1938
1970
  );
1939
1971
  const MessageRenderer = hasLegacyProps ? (props) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LegacyRenderMessage, __spreadProps(__spreadValues({}, props), { legacyProps })) : RenderMessage2;
1972
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: icons.activityIcon });
1940
1973
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1941
1974
  /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1942
1975
  messages.map((message, index) => {
@@ -1945,6 +1978,7 @@ var Messages = ({
1945
1978
  MessageRenderer,
1946
1979
  {
1947
1980
  message,
1981
+ messages,
1948
1982
  inProgress,
1949
1983
  index,
1950
1984
  isCurrentMessage,
@@ -1955,11 +1989,13 @@ var Messages = ({
1955
1989
  onCopy,
1956
1990
  onThumbsUp,
1957
1991
  onThumbsDown,
1992
+ messageFeedback,
1958
1993
  markdownTagRenderers
1959
1994
  },
1960
1995
  index
1961
1996
  );
1962
1997
  }),
1998
+ ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) === "user" && inProgress && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {}),
1963
1999
  interrupt,
1964
2000
  chatError && ErrorMessage && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ErrorMessage, { error: chatError, isCurrentMessage: true })
1965
2001
  ] }),
@@ -2253,12 +2289,12 @@ var MAX_NEWLINES = 6;
2253
2289
  var Input = ({
2254
2290
  inProgress,
2255
2291
  onSend,
2256
- isVisible = false,
2292
+ chatReady = true,
2257
2293
  onStop,
2258
2294
  onUpload,
2259
2295
  hideStopButton = false
2260
2296
  }) => {
2261
- var _a, _b;
2297
+ var _a;
2262
2298
  const context = useChatContext();
2263
2299
  const copilotContext = (0, import_react_core7.useCopilotContext)();
2264
2300
  const showPoweredBy = !((_a = copilotContext.copilotApiConfig) == null ? void 0 : _a.publicApiKey);
@@ -2288,14 +2324,16 @@ var Input = ({
2288
2324
  inProgress
2289
2325
  });
2290
2326
  const isInProgress = inProgress || pushToTalkState === "transcribing";
2291
- const buttonIcon = isInProgress && !hideStopButton ? context.icons.stopIcon : context.icons.sendIcon;
2327
+ const { buttonIcon, buttonAlt } = (0, import_react14.useMemo)(() => {
2328
+ if (!chatReady)
2329
+ return { buttonIcon: context.icons.spinnerIcon, buttonAlt: "Loading" };
2330
+ return isInProgress && !hideStopButton ? { buttonIcon: context.icons.stopIcon, buttonAlt: "Stop" } : { buttonIcon: context.icons.sendIcon, buttonAlt: "Send" };
2331
+ }, [isInProgress, chatReady, hideStopButton, context.icons.stopIcon, context.icons.sendIcon]);
2292
2332
  const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
2333
+ const { interrupt } = (0, import_react_core7.useCopilotChatInternal)();
2293
2334
  const canSend = (0, import_react14.useMemo)(() => {
2294
- var _a2;
2295
- const interruptEvent = (_a2 = copilotContext.langGraphInterruptAction) == null ? void 0 : _a2.event;
2296
- const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
2297
- return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
2298
- }, [(_b = copilotContext.langGraphInterruptAction) == null ? void 0 : _b.event, isInProgress, text, pushToTalkState]);
2335
+ return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interrupt;
2336
+ }, [interrupt, isInProgress, text, pushToTalkState]);
2299
2337
  const canStop = (0, import_react14.useMemo)(() => {
2300
2338
  return isInProgress && !hideStopButton;
2301
2339
  }, [isInProgress, hideStopButton]);
@@ -2342,6 +2380,7 @@ var Input = ({
2342
2380
  "data-copilotkit-in-progress": inProgress,
2343
2381
  "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
2344
2382
  className: "copilotKitInputControlButton",
2383
+ "aria-label": buttonAlt,
2345
2384
  children: buttonIcon
2346
2385
  }
2347
2386
  )
@@ -2355,8 +2394,6 @@ var Input = ({
2355
2394
  var import_react15 = __toESM(require("react"));
2356
2395
  var import_react_core9 = require("@copilotkit/react-core");
2357
2396
  var import_shared3 = require("@copilotkit/shared");
2358
- var import_shared4 = require("@copilotkit/shared");
2359
- var import_react_core10 = require("@copilotkit/react-core");
2360
2397
 
2361
2398
  // src/components/chat/ImageUploadQueue.tsx
2362
2399
  var import_jsx_runtime21 = require("react/jsx-runtime");
@@ -2460,18 +2497,25 @@ function Suggestion({ title, onClick, partial, className }) {
2460
2497
 
2461
2498
  // src/components/chat/Suggestions.tsx
2462
2499
  var import_jsx_runtime23 = require("react/jsx-runtime");
2463
- function Suggestions({ suggestions, onSuggestionClick }) {
2464
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2465
- Suggestion,
2466
- {
2467
- title: suggestion.title,
2468
- message: suggestion.message,
2469
- partial: suggestion.partial,
2470
- className: suggestion.className,
2471
- onClick: () => onSuggestionClick(suggestion.message)
2472
- },
2473
- index
2474
- )) });
2500
+ function Suggestions({
2501
+ suggestions,
2502
+ onSuggestionClick,
2503
+ isLoading
2504
+ }) {
2505
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => {
2506
+ var _a, _b;
2507
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2508
+ Suggestion,
2509
+ {
2510
+ title: suggestion.title,
2511
+ message: suggestion.message,
2512
+ partial: (_b = (_a = suggestion.isLoading) != null ? _a : suggestion.partial) != null ? _b : isLoading,
2513
+ className: suggestion.className,
2514
+ onClick: () => onSuggestionClick(suggestion.message)
2515
+ },
2516
+ index
2517
+ );
2518
+ }) });
2475
2519
  }
2476
2520
 
2477
2521
  // src/components/chat/Chat.tsx
@@ -2525,6 +2569,9 @@ function CopilotChat({
2525
2569
  const { publicApiKey, chatApiEndpoint } = copilotApiConfig;
2526
2570
  const [selectedImages, setSelectedImages] = (0, import_react15.useState)([]);
2527
2571
  const [chatError, setChatError] = (0, import_react15.useState)(null);
2572
+ const [messageFeedback, setMessageFeedback] = (0, import_react15.useState)(
2573
+ {}
2574
+ );
2528
2575
  const fileInputRef = (0, import_react15.useRef)(null);
2529
2576
  const triggerObservabilityHook = (0, import_react15.useCallback)(
2530
2577
  (hookName, ...args) => {
@@ -2668,16 +2715,12 @@ function CopilotChat({
2668
2715
  sendMessage,
2669
2716
  stopGeneration,
2670
2717
  reloadMessages,
2671
- suggestions: currentSuggestions
2672
- } = useCopilotChatLogic(
2673
- suggestions,
2674
- makeSystemMessage,
2675
- disableSystemMessage,
2676
- onInProgress,
2677
- onSubmitMessage,
2678
- onStopGeneration,
2679
- onReloadMessages
2680
- );
2718
+ suggestions: currentSuggestions,
2719
+ isLoadingSuggestions,
2720
+ agent
2721
+ } = (0, import_react_core9.useCopilotChatInternal)({
2722
+ suggestions
2723
+ });
2681
2724
  const prevIsLoading = (0, import_react15.useRef)(isLoading);
2682
2725
  (0, import_react15.useEffect)(() => {
2683
2726
  if (prevIsLoading.current !== isLoading) {
@@ -2696,7 +2739,11 @@ function CopilotChat({
2696
2739
  fileInputRef.current.value = "";
2697
2740
  }
2698
2741
  triggerObservabilityHook("onMessageSent", text);
2699
- return sendMessage(text, images);
2742
+ return sendMessage({
2743
+ id: (0, import_shared3.randomUUID)(),
2744
+ content: text,
2745
+ role: "user"
2746
+ });
2700
2747
  };
2701
2748
  const chatContext = import_react15.default.useContext(ChatContext);
2702
2749
  const isVisible = chatContext ? chatContext.open : true;
@@ -2752,12 +2799,18 @@ function CopilotChat({
2752
2799
  if (onThumbsUp) {
2753
2800
  onThumbsUp(message);
2754
2801
  }
2802
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2803
+ [message.id]: "thumbsUp"
2804
+ }));
2755
2805
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsUp");
2756
2806
  };
2757
2807
  const handleThumbsDown = (message) => {
2758
2808
  if (onThumbsDown) {
2759
2809
  onThumbsDown(message);
2760
2810
  }
2811
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2812
+ [message.id]: "thumbsDown"
2813
+ }));
2761
2814
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsDown");
2762
2815
  };
2763
2816
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
@@ -2779,6 +2832,7 @@ function CopilotChat({
2779
2832
  onCopy: handleCopy,
2780
2833
  onThumbsUp: handleThumbsUp,
2781
2834
  onThumbsDown: handleThumbsDown,
2835
+ messageFeedback,
2782
2836
  markdownTagRenderers,
2783
2837
  ImageRenderer: ImageRenderer2,
2784
2838
  ErrorMessage,
@@ -2792,7 +2846,8 @@ function CopilotChat({
2792
2846
  RenderSuggestionsList,
2793
2847
  {
2794
2848
  onSuggestionClick: handleSendMessage,
2795
- suggestions: currentSuggestions
2849
+ suggestions: currentSuggestions,
2850
+ isLoading: isLoadingSuggestions
2796
2851
  }
2797
2852
  )
2798
2853
  }
@@ -2815,6 +2870,7 @@ function CopilotChat({
2815
2870
  Input2,
2816
2871
  {
2817
2872
  inProgress: isLoading,
2873
+ chatReady: Boolean(agent),
2818
2874
  onSend: handleSendMessage,
2819
2875
  isVisible,
2820
2876
  onStop: stopGeneration,
@@ -2840,243 +2896,10 @@ function WrappedCopilotChat({
2840
2896
  }
2841
2897
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children });
2842
2898
  }
2843
- var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, disableSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2844
- var _a;
2845
- const {
2846
- messages,
2847
- sendMessage,
2848
- setMessages,
2849
- reloadMessages: defaultReloadMessages,
2850
- stopGeneration: defaultStopGeneration,
2851
- runChatCompletion,
2852
- isLoading,
2853
- suggestions,
2854
- setSuggestions,
2855
- generateSuggestions,
2856
- resetSuggestions: resetSuggestionsFromHook,
2857
- isLoadingSuggestions
2858
- } = (0, import_react_core9.useCopilotChatInternal)({
2859
- makeSystemMessage,
2860
- disableSystemMessage
2861
- });
2862
- const generalContext = (0, import_react_core9.useCopilotContext)();
2863
- const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
2864
- const { actions } = generalContext;
2865
- const [suggestionsFailed, setSuggestionsFailed] = (0, import_react15.useState)(false);
2866
- const hasGeneratedInitialSuggestions = (0, import_react15.useRef)(false);
2867
- (0, import_react15.useEffect)(() => {
2868
- if (Array.isArray(chatSuggestions)) {
2869
- setSuggestions(chatSuggestions);
2870
- hasGeneratedInitialSuggestions.current = true;
2871
- }
2872
- }, [JSON.stringify(chatSuggestions), setSuggestions]);
2873
- const generateSuggestionsWithErrorHandling = (0, import_react15.useCallback)(
2874
- (context) => __async(void 0, null, function* () {
2875
- try {
2876
- yield generateSuggestions();
2877
- } catch (error) {
2878
- console.error("Failed to generate suggestions:", error);
2879
- setSuggestionsFailed(true);
2880
- }
2881
- }),
2882
- [generateSuggestions]
2883
- );
2884
- (0, import_react15.useEffect)(() => {
2885
- if (chatSuggestions !== "auto" || isLoadingSuggestions || suggestionsFailed) {
2886
- return;
2887
- }
2888
- if (isLoading) {
2889
- return;
2890
- }
2891
- if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
2892
- return;
2893
- }
2894
- if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {
2895
- hasGeneratedInitialSuggestions.current = true;
2896
- generateSuggestionsWithErrorHandling("initial");
2897
- return;
2898
- }
2899
- if (messages.length > 0 && suggestions.length === 0) {
2900
- generateSuggestionsWithErrorHandling("post-message");
2901
- return;
2902
- }
2903
- }, [
2904
- chatSuggestions,
2905
- isLoadingSuggestions,
2906
- suggestionsFailed,
2907
- messages.length,
2908
- isLoading,
2909
- suggestions.length,
2910
- Object.keys(generalContext.chatSuggestionConfiguration).join(","),
2911
- // Use stable string instead of object reference
2912
- generateSuggestionsWithErrorHandling
2913
- ]);
2914
- (0, import_react15.useEffect)(() => {
2915
- if (chatSuggestions !== "auto") {
2916
- hasGeneratedInitialSuggestions.current = false;
2917
- setSuggestionsFailed(false);
2918
- }
2919
- }, [chatSuggestions]);
2920
- const stableContext = (0, import_react15.useMemo)(
2921
- () => __spreadValues(__spreadValues({}, generalContext), messagesContext),
2922
- [
2923
- // Only include stable dependencies
2924
- generalContext.actions,
2925
- messagesContext.messages.length,
2926
- generalContext.isLoading
2927
- ]
2928
- );
2929
- const resetSuggestions = (0, import_react15.useCallback)(() => {
2930
- resetSuggestionsFromHook();
2931
- setSuggestionsFailed(false);
2932
- hasGeneratedInitialSuggestions.current = false;
2933
- }, [resetSuggestionsFromHook]);
2934
- (0, import_react15.useEffect)(() => {
2935
- onInProgress == null ? void 0 : onInProgress(isLoading);
2936
- }, [onInProgress, isLoading]);
2937
- const safelySendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2938
- const images = imagesToUse || [];
2939
- if (chatSuggestions === "auto" || chatSuggestions === "manual") {
2940
- setSuggestions([]);
2941
- }
2942
- let firstMessage = null;
2943
- if (messageContent.trim().length > 0) {
2944
- const textMessage = {
2945
- id: (0, import_shared4.randomId)(),
2946
- role: "user",
2947
- content: messageContent
2948
- };
2949
- if (onSubmitMessage) {
2950
- try {
2951
- yield onSubmitMessage(messageContent);
2952
- } catch (error) {
2953
- console.error("Error in onSubmitMessage:", error);
2954
- }
2955
- }
2956
- yield sendMessage(textMessage, {
2957
- followUp: images.length === 0,
2958
- clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
2959
- });
2960
- if (!firstMessage) {
2961
- firstMessage = textMessage;
2962
- }
2963
- }
2964
- if (images.length > 0) {
2965
- for (let i = 0; i < images.length; i++) {
2966
- const imageMessage = {
2967
- id: (0, import_shared4.randomId)(),
2968
- role: "user",
2969
- image: {
2970
- format: images[i].contentType.replace("image/", ""),
2971
- bytes: images[i].bytes
2972
- }
2973
- };
2974
- yield sendMessage(imageMessage, { followUp: i === images.length - 1 });
2975
- if (!firstMessage) {
2976
- firstMessage = imageMessage;
2977
- }
2978
- }
2979
- }
2980
- if (!firstMessage) {
2981
- return { role: "user", content: "", id: (0, import_shared4.randomId)() };
2982
- }
2983
- return firstMessage;
2984
- });
2985
- const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
2986
- const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
2987
- if (generalContext.agentSession) {
2988
- generalContext.setAgentSession(__spreadProps(__spreadValues({}, generalContext.agentSession), {
2989
- nodeName: void 0,
2990
- threadId: void 0
2991
- }));
2992
- generalContext.setCoagentStates((prevAgentStates) => {
2993
- return __spreadProps(__spreadValues({}, prevAgentStates), {
2994
- [generalContext.agentSession.agentName]: __spreadProps(__spreadValues({}, prevAgentStates[generalContext.agentSession.agentName]), {
2995
- threadId: void 0,
2996
- nodeName: void 0,
2997
- runId: void 0
2998
- })
2999
- });
3000
- });
3001
- }
3002
- });
3003
- const runCurrentAgent = (hint) => __async(void 0, null, function* () {
3004
- if (generalContext.agentSession) {
3005
- yield (0, import_react_core10.runAgent)(
3006
- generalContext.agentSession.agentName,
3007
- stableContext,
3008
- messagesContext.messages,
3009
- sendMessage,
3010
- runChatCompletion
3011
- );
3012
- }
3013
- });
3014
- const stopCurrentAgent = () => {
3015
- if (generalContext.agentSession) {
3016
- (0, import_react_core10.stopAgent)(generalContext.agentSession.agentName, stableContext);
3017
- }
3018
- };
3019
- const setCurrentAgentState = (state) => {
3020
- if (generalContext.agentSession) {
3021
- generalContext.setCoagentStates((prevAgentStates) => {
3022
- return __spreadProps(__spreadValues({}, prevAgentStates), {
3023
- [generalContext.agentSession.agentName]: {
3024
- state
3025
- }
3026
- });
3027
- });
3028
- }
3029
- };
3030
- function stopGeneration() {
3031
- setSuggestions([]);
3032
- if (onStopGeneration) {
3033
- onStopGeneration({
3034
- messages,
3035
- setMessages,
3036
- stopGeneration: defaultStopGeneration,
3037
- currentAgentName,
3038
- restartCurrentAgent,
3039
- stopCurrentAgent,
3040
- runCurrentAgent,
3041
- setCurrentAgentState
3042
- });
3043
- } else {
3044
- defaultStopGeneration();
3045
- }
3046
- }
3047
- function reloadMessages(messageId) {
3048
- if (onReloadMessages) {
3049
- onReloadMessages({
3050
- messages,
3051
- setMessages,
3052
- stopGeneration: defaultStopGeneration,
3053
- currentAgentName,
3054
- restartCurrentAgent,
3055
- stopCurrentAgent,
3056
- runCurrentAgent,
3057
- setCurrentAgentState,
3058
- messageId
3059
- });
3060
- } else {
3061
- defaultReloadMessages(messageId);
3062
- }
3063
- }
3064
- return {
3065
- messages,
3066
- isLoading,
3067
- suggestions,
3068
- sendMessage: safelySendMessage,
3069
- stopGeneration,
3070
- reloadMessages,
3071
- resetSuggestions,
3072
- context: stableContext,
3073
- actions
3074
- };
3075
- };
3076
2899
 
3077
2900
  // src/components/chat/Modal.tsx
3078
- var import_react_core11 = require("@copilotkit/react-core");
3079
- var import_shared5 = require("@copilotkit/shared");
2901
+ var import_react_core10 = require("@copilotkit/react-core");
2902
+ var import_shared4 = require("@copilotkit/shared");
3080
2903
  var import_jsx_runtime25 = require("react/jsx-runtime");
3081
2904
  var CopilotModalInner = (_a) => {
3082
2905
  var _b = _a, {
@@ -3102,7 +2925,7 @@ var CopilotModalInner = (_a) => {
3102
2925
  "Button",
3103
2926
  "Header"
3104
2927
  ]);
3105
- const { copilotApiConfig, setBannerError } = (0, import_react_core11.useCopilotContext)();
2928
+ const { copilotApiConfig, setBannerError } = (0, import_react_core10.useCopilotContext)();
3106
2929
  const { publicApiKey } = copilotApiConfig;
3107
2930
  const triggerObservabilityHook = (0, import_react16.useCallback)(
3108
2931
  (hookName, ...args) => {
@@ -3111,14 +2934,14 @@ var CopilotModalInner = (_a) => {
3111
2934
  }
3112
2935
  if ((observabilityHooks == null ? void 0 : observabilityHooks[hookName]) && !publicApiKey) {
3113
2936
  setBannerError(
3114
- new import_shared5.CopilotKitError({
2937
+ new import_shared4.CopilotKitError({
3115
2938
  message: "observabilityHooks requires a publicApiKey to function.",
3116
- code: import_shared5.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
3117
- severity: import_shared5.Severity.CRITICAL,
3118
- visibility: import_shared5.ErrorVisibility.BANNER
2939
+ code: import_shared4.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
2940
+ severity: import_shared4.Severity.CRITICAL,
2941
+ visibility: import_shared4.ErrorVisibility.BANNER
3119
2942
  })
3120
2943
  );
3121
- import_shared5.styledConsole.publicApiKeyRequired("observabilityHooks");
2944
+ import_shared4.styledConsole.publicApiKeyRequired("observabilityHooks");
3122
2945
  }
3123
2946
  },
3124
2947
  [publicApiKey, observabilityHooks, setBannerError]