@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
@@ -1041,14 +1041,30 @@ var import_react_core5 = require("@copilotkit/react-core");
1041
1041
 
1042
1042
  // src/components/chat/messages/UserMessage.tsx
1043
1043
  var import_jsx_runtime10 = require("react/jsx-runtime");
1044
+ var getTextContent = (content) => {
1045
+ if (typeof content === "undefined") {
1046
+ return void 0;
1047
+ }
1048
+ if (typeof content === "string") {
1049
+ return content;
1050
+ }
1051
+ return content.map((part) => {
1052
+ if (part.type === "text") {
1053
+ return part.text;
1054
+ }
1055
+ return void 0;
1056
+ }).filter((value) => typeof value === "string" && value.length > 0).join(" ").trim() || void 0;
1057
+ };
1044
1058
  var UserMessage = (props) => {
1045
1059
  const { message, ImageRenderer: ImageRenderer2 } = props;
1046
- const isImageMessage = message && "image" in message && message.image;
1060
+ const isImageMessage = message && "image" in message && Boolean(message.image);
1047
1061
  if (isImageMessage) {
1048
1062
  const imageMessage = message;
1049
- 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 }) });
1063
+ const content2 = getTextContent(imageMessage == null ? void 0 : imageMessage.content);
1064
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ImageRenderer2, { image: imageMessage.image, content: content2 }) });
1050
1065
  }
1051
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: message == null ? void 0 : message.content });
1066
+ const content = getTextContent(message == null ? void 0 : message.content);
1067
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: content });
1052
1068
  };
1053
1069
 
1054
1070
  // src/components/chat/Markdown.tsx
@@ -1591,6 +1607,7 @@ var AssistantMessage = (props) => {
1591
1607
  onThumbsUp,
1592
1608
  onThumbsDown,
1593
1609
  isCurrentMessage,
1610
+ feedback,
1594
1611
  markdownTagRenderers
1595
1612
  } = props;
1596
1613
  const [copied, setCopied] = (0, import_react8.useState)(false);
@@ -1612,12 +1629,14 @@ var AssistantMessage = (props) => {
1612
1629
  onRegenerate();
1613
1630
  };
1614
1631
  const handleThumbsUp = () => {
1615
- if (onThumbsUp && message)
1632
+ if (onThumbsUp && message) {
1616
1633
  onThumbsUp(message);
1634
+ }
1617
1635
  };
1618
1636
  const handleThumbsDown = () => {
1619
- if (onThumbsDown && message)
1637
+ if (onThumbsDown && message) {
1620
1638
  onThumbsDown(message);
1639
+ }
1621
1640
  };
1622
1641
  const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: icons.activityIcon });
1623
1642
  const content = (message == null ? void 0 : message.content) || "";
@@ -1653,7 +1672,7 @@ var AssistantMessage = (props) => {
1653
1672
  onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1654
1673
  "button",
1655
1674
  {
1656
- className: "copilotKitMessageControlButton",
1675
+ className: `copilotKitMessageControlButton ${feedback === "thumbsUp" ? "active" : ""}`,
1657
1676
  onClick: handleThumbsUp,
1658
1677
  "aria-label": labels.thumbsUp,
1659
1678
  title: labels.thumbsUp,
@@ -1663,7 +1682,7 @@ var AssistantMessage = (props) => {
1663
1682
  onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1664
1683
  "button",
1665
1684
  {
1666
- className: "copilotKitMessageControlButton",
1685
+ className: `copilotKitMessageControlButton ${feedback === "thumbsDown" ? "active" : ""}`,
1667
1686
  onClick: handleThumbsDown,
1668
1687
  "aria-label": labels.thumbsDown,
1669
1688
  title: labels.thumbsDown,
@@ -1724,6 +1743,7 @@ function RenderMessage(_a) {
1724
1743
  var _a2;
1725
1744
  const {
1726
1745
  message,
1746
+ messages,
1727
1747
  inProgress,
1728
1748
  index,
1729
1749
  isCurrentMessage,
@@ -1731,6 +1751,7 @@ function RenderMessage(_a) {
1731
1751
  onCopy,
1732
1752
  onThumbsUp,
1733
1753
  onThumbsDown,
1754
+ messageFeedback,
1734
1755
  markdownTagRenderers
1735
1756
  } = props;
1736
1757
  switch (message.role) {
@@ -1753,6 +1774,7 @@ function RenderMessage(_a) {
1753
1774
  subComponent: (_a2 = message.generativeUI) == null ? void 0 : _a2.call(message),
1754
1775
  rawData: message,
1755
1776
  message,
1777
+ messages,
1756
1778
  isLoading: inProgress && isCurrentMessage && !message.content,
1757
1779
  isGenerating: inProgress && isCurrentMessage && !!message.content,
1758
1780
  isCurrentMessage,
@@ -1760,6 +1782,7 @@ function RenderMessage(_a) {
1760
1782
  onCopy,
1761
1783
  onThumbsUp,
1762
1784
  onThumbsDown,
1785
+ feedback: (messageFeedback == null ? void 0 : messageFeedback[message.id]) || null,
1763
1786
  markdownTagRenderers,
1764
1787
  ImageRenderer: ImageRenderer2
1765
1788
  },
@@ -1773,6 +1796,7 @@ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1773
1796
  var import_jsx_runtime16 = require("react/jsx-runtime");
1774
1797
  var LegacyRenderMessage = ({
1775
1798
  message,
1799
+ messages,
1776
1800
  inProgress,
1777
1801
  index,
1778
1802
  isCurrentMessage,
@@ -1801,6 +1825,7 @@ var LegacyRenderMessage = ({
1801
1825
  RenderTextMessage,
1802
1826
  {
1803
1827
  message,
1828
+ messages,
1804
1829
  inProgress,
1805
1830
  index,
1806
1831
  isCurrentMessage,
@@ -1818,6 +1843,7 @@ var LegacyRenderMessage = ({
1818
1843
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1819
1844
  RenderActionExecutionMessage,
1820
1845
  {
1846
+ messages,
1821
1847
  message,
1822
1848
  inProgress,
1823
1849
  index,
@@ -1832,6 +1858,7 @@ var LegacyRenderMessage = ({
1832
1858
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1833
1859
  RenderAgentStateMessage,
1834
1860
  {
1861
+ messages,
1835
1862
  message,
1836
1863
  inProgress,
1837
1864
  index,
@@ -1845,6 +1872,7 @@ var LegacyRenderMessage = ({
1845
1872
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1846
1873
  RenderResultMessage,
1847
1874
  {
1875
+ messages,
1848
1876
  message,
1849
1877
  inProgress,
1850
1878
  index,
@@ -1858,6 +1886,7 @@ var LegacyRenderMessage = ({
1858
1886
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1859
1887
  RenderImageMessage,
1860
1888
  {
1889
+ messages,
1861
1890
  message,
1862
1891
  inProgress,
1863
1892
  index,
@@ -1870,6 +1899,7 @@ var LegacyRenderMessage = ({
1870
1899
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1871
1900
  RenderMessage,
1872
1901
  {
1902
+ messages,
1873
1903
  message,
1874
1904
  inProgress,
1875
1905
  index,
@@ -1900,6 +1930,7 @@ var Messages = ({
1900
1930
  onCopy,
1901
1931
  onThumbsUp,
1902
1932
  onThumbsDown,
1933
+ messageFeedback,
1903
1934
  markdownTagRenderers,
1904
1935
  chatError,
1905
1936
  // Legacy props
@@ -1909,7 +1940,8 @@ var Messages = ({
1909
1940
  RenderResultMessage,
1910
1941
  RenderImageMessage
1911
1942
  }) => {
1912
- const { labels } = useChatContext();
1943
+ var _a;
1944
+ const { labels, icons } = useChatContext();
1913
1945
  const { messages: visibleMessages, interrupt } = (0, import_react_core5.useCopilotChatInternal)();
1914
1946
  const initialMessages = (0, import_react10.useMemo)(() => makeInitialMessages(labels.initial), [labels.initial]);
1915
1947
  const messages = [...initialMessages, ...visibleMessages];
@@ -1939,6 +1971,7 @@ var Messages = ({
1939
1971
  ]
1940
1972
  );
1941
1973
  const MessageRenderer = hasLegacyProps ? (props) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LegacyRenderMessage, __spreadProps(__spreadValues({}, props), { legacyProps })) : RenderMessage2;
1974
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: icons.activityIcon });
1942
1975
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1943
1976
  /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1944
1977
  messages.map((message, index) => {
@@ -1947,6 +1980,7 @@ var Messages = ({
1947
1980
  MessageRenderer,
1948
1981
  {
1949
1982
  message,
1983
+ messages,
1950
1984
  inProgress,
1951
1985
  index,
1952
1986
  isCurrentMessage,
@@ -1957,11 +1991,13 @@ var Messages = ({
1957
1991
  onCopy,
1958
1992
  onThumbsUp,
1959
1993
  onThumbsDown,
1994
+ messageFeedback,
1960
1995
  markdownTagRenderers
1961
1996
  },
1962
1997
  index
1963
1998
  );
1964
1999
  }),
2000
+ ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) === "user" && inProgress && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {}),
1965
2001
  interrupt,
1966
2002
  chatError && ErrorMessage && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ErrorMessage, { error: chatError, isCurrentMessage: true })
1967
2003
  ] }),
@@ -2255,12 +2291,12 @@ var MAX_NEWLINES = 6;
2255
2291
  var Input = ({
2256
2292
  inProgress,
2257
2293
  onSend,
2258
- isVisible = false,
2294
+ chatReady = true,
2259
2295
  onStop,
2260
2296
  onUpload,
2261
2297
  hideStopButton = false
2262
2298
  }) => {
2263
- var _a, _b;
2299
+ var _a;
2264
2300
  const context = useChatContext();
2265
2301
  const copilotContext = (0, import_react_core7.useCopilotContext)();
2266
2302
  const showPoweredBy = !((_a = copilotContext.copilotApiConfig) == null ? void 0 : _a.publicApiKey);
@@ -2290,14 +2326,16 @@ var Input = ({
2290
2326
  inProgress
2291
2327
  });
2292
2328
  const isInProgress = inProgress || pushToTalkState === "transcribing";
2293
- const buttonIcon = isInProgress && !hideStopButton ? context.icons.stopIcon : context.icons.sendIcon;
2329
+ const { buttonIcon, buttonAlt } = (0, import_react14.useMemo)(() => {
2330
+ if (!chatReady)
2331
+ return { buttonIcon: context.icons.spinnerIcon, buttonAlt: "Loading" };
2332
+ return isInProgress && !hideStopButton ? { buttonIcon: context.icons.stopIcon, buttonAlt: "Stop" } : { buttonIcon: context.icons.sendIcon, buttonAlt: "Send" };
2333
+ }, [isInProgress, chatReady, hideStopButton, context.icons.stopIcon, context.icons.sendIcon]);
2294
2334
  const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
2335
+ const { interrupt } = (0, import_react_core7.useCopilotChatInternal)();
2295
2336
  const canSend = (0, import_react14.useMemo)(() => {
2296
- var _a2;
2297
- const interruptEvent = (_a2 = copilotContext.langGraphInterruptAction) == null ? void 0 : _a2.event;
2298
- const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
2299
- return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
2300
- }, [(_b = copilotContext.langGraphInterruptAction) == null ? void 0 : _b.event, isInProgress, text, pushToTalkState]);
2337
+ return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interrupt;
2338
+ }, [interrupt, isInProgress, text, pushToTalkState]);
2301
2339
  const canStop = (0, import_react14.useMemo)(() => {
2302
2340
  return isInProgress && !hideStopButton;
2303
2341
  }, [isInProgress, hideStopButton]);
@@ -2344,6 +2382,7 @@ var Input = ({
2344
2382
  "data-copilotkit-in-progress": inProgress,
2345
2383
  "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
2346
2384
  className: "copilotKitInputControlButton",
2385
+ "aria-label": buttonAlt,
2347
2386
  children: buttonIcon
2348
2387
  }
2349
2388
  )
@@ -2357,8 +2396,6 @@ var Input = ({
2357
2396
  var import_react15 = __toESM(require("react"));
2358
2397
  var import_react_core9 = require("@copilotkit/react-core");
2359
2398
  var import_shared3 = require("@copilotkit/shared");
2360
- var import_shared4 = require("@copilotkit/shared");
2361
- var import_react_core10 = require("@copilotkit/react-core");
2362
2399
 
2363
2400
  // src/components/chat/ImageUploadQueue.tsx
2364
2401
  var import_jsx_runtime21 = require("react/jsx-runtime");
@@ -2462,18 +2499,25 @@ function Suggestion({ title, onClick, partial, className }) {
2462
2499
 
2463
2500
  // src/components/chat/Suggestions.tsx
2464
2501
  var import_jsx_runtime23 = require("react/jsx-runtime");
2465
- function Suggestions({ suggestions, onSuggestionClick }) {
2466
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2467
- Suggestion,
2468
- {
2469
- title: suggestion.title,
2470
- message: suggestion.message,
2471
- partial: suggestion.partial,
2472
- className: suggestion.className,
2473
- onClick: () => onSuggestionClick(suggestion.message)
2474
- },
2475
- index
2476
- )) });
2502
+ function Suggestions({
2503
+ suggestions,
2504
+ onSuggestionClick,
2505
+ isLoading
2506
+ }) {
2507
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => {
2508
+ var _a, _b;
2509
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2510
+ Suggestion,
2511
+ {
2512
+ title: suggestion.title,
2513
+ message: suggestion.message,
2514
+ partial: (_b = (_a = suggestion.isLoading) != null ? _a : suggestion.partial) != null ? _b : isLoading,
2515
+ className: suggestion.className,
2516
+ onClick: () => onSuggestionClick(suggestion.message)
2517
+ },
2518
+ index
2519
+ );
2520
+ }) });
2477
2521
  }
2478
2522
 
2479
2523
  // src/components/chat/Chat.tsx
@@ -2527,6 +2571,9 @@ function CopilotChat({
2527
2571
  const { publicApiKey, chatApiEndpoint } = copilotApiConfig;
2528
2572
  const [selectedImages, setSelectedImages] = (0, import_react15.useState)([]);
2529
2573
  const [chatError, setChatError] = (0, import_react15.useState)(null);
2574
+ const [messageFeedback, setMessageFeedback] = (0, import_react15.useState)(
2575
+ {}
2576
+ );
2530
2577
  const fileInputRef = (0, import_react15.useRef)(null);
2531
2578
  const triggerObservabilityHook = (0, import_react15.useCallback)(
2532
2579
  (hookName, ...args) => {
@@ -2670,16 +2717,12 @@ function CopilotChat({
2670
2717
  sendMessage,
2671
2718
  stopGeneration,
2672
2719
  reloadMessages,
2673
- suggestions: currentSuggestions
2674
- } = useCopilotChatLogic(
2675
- suggestions,
2676
- makeSystemMessage,
2677
- disableSystemMessage,
2678
- onInProgress,
2679
- onSubmitMessage,
2680
- onStopGeneration,
2681
- onReloadMessages
2682
- );
2720
+ suggestions: currentSuggestions,
2721
+ isLoadingSuggestions,
2722
+ agent
2723
+ } = (0, import_react_core9.useCopilotChatInternal)({
2724
+ suggestions
2725
+ });
2683
2726
  const prevIsLoading = (0, import_react15.useRef)(isLoading);
2684
2727
  (0, import_react15.useEffect)(() => {
2685
2728
  if (prevIsLoading.current !== isLoading) {
@@ -2698,7 +2741,11 @@ function CopilotChat({
2698
2741
  fileInputRef.current.value = "";
2699
2742
  }
2700
2743
  triggerObservabilityHook("onMessageSent", text);
2701
- return sendMessage(text, images);
2744
+ return sendMessage({
2745
+ id: (0, import_shared3.randomUUID)(),
2746
+ content: text,
2747
+ role: "user"
2748
+ });
2702
2749
  };
2703
2750
  const chatContext = import_react15.default.useContext(ChatContext);
2704
2751
  const isVisible = chatContext ? chatContext.open : true;
@@ -2754,12 +2801,18 @@ function CopilotChat({
2754
2801
  if (onThumbsUp) {
2755
2802
  onThumbsUp(message);
2756
2803
  }
2804
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2805
+ [message.id]: "thumbsUp"
2806
+ }));
2757
2807
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsUp");
2758
2808
  };
2759
2809
  const handleThumbsDown = (message) => {
2760
2810
  if (onThumbsDown) {
2761
2811
  onThumbsDown(message);
2762
2812
  }
2813
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2814
+ [message.id]: "thumbsDown"
2815
+ }));
2763
2816
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsDown");
2764
2817
  };
2765
2818
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
@@ -2781,6 +2834,7 @@ function CopilotChat({
2781
2834
  onCopy: handleCopy,
2782
2835
  onThumbsUp: handleThumbsUp,
2783
2836
  onThumbsDown: handleThumbsDown,
2837
+ messageFeedback,
2784
2838
  markdownTagRenderers,
2785
2839
  ImageRenderer: ImageRenderer2,
2786
2840
  ErrorMessage,
@@ -2794,7 +2848,8 @@ function CopilotChat({
2794
2848
  RenderSuggestionsList,
2795
2849
  {
2796
2850
  onSuggestionClick: handleSendMessage,
2797
- suggestions: currentSuggestions
2851
+ suggestions: currentSuggestions,
2852
+ isLoading: isLoadingSuggestions
2798
2853
  }
2799
2854
  )
2800
2855
  }
@@ -2817,6 +2872,7 @@ function CopilotChat({
2817
2872
  Input2,
2818
2873
  {
2819
2874
  inProgress: isLoading,
2875
+ chatReady: Boolean(agent),
2820
2876
  onSend: handleSendMessage,
2821
2877
  isVisible,
2822
2878
  onStop: stopGeneration,
@@ -2842,243 +2898,10 @@ function WrappedCopilotChat({
2842
2898
  }
2843
2899
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children });
2844
2900
  }
2845
- var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, disableSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2846
- var _a;
2847
- const {
2848
- messages,
2849
- sendMessage,
2850
- setMessages,
2851
- reloadMessages: defaultReloadMessages,
2852
- stopGeneration: defaultStopGeneration,
2853
- runChatCompletion,
2854
- isLoading,
2855
- suggestions,
2856
- setSuggestions,
2857
- generateSuggestions,
2858
- resetSuggestions: resetSuggestionsFromHook,
2859
- isLoadingSuggestions
2860
- } = (0, import_react_core9.useCopilotChatInternal)({
2861
- makeSystemMessage,
2862
- disableSystemMessage
2863
- });
2864
- const generalContext = (0, import_react_core9.useCopilotContext)();
2865
- const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
2866
- const { actions } = generalContext;
2867
- const [suggestionsFailed, setSuggestionsFailed] = (0, import_react15.useState)(false);
2868
- const hasGeneratedInitialSuggestions = (0, import_react15.useRef)(false);
2869
- (0, import_react15.useEffect)(() => {
2870
- if (Array.isArray(chatSuggestions)) {
2871
- setSuggestions(chatSuggestions);
2872
- hasGeneratedInitialSuggestions.current = true;
2873
- }
2874
- }, [JSON.stringify(chatSuggestions), setSuggestions]);
2875
- const generateSuggestionsWithErrorHandling = (0, import_react15.useCallback)(
2876
- (context) => __async(void 0, null, function* () {
2877
- try {
2878
- yield generateSuggestions();
2879
- } catch (error) {
2880
- console.error("Failed to generate suggestions:", error);
2881
- setSuggestionsFailed(true);
2882
- }
2883
- }),
2884
- [generateSuggestions]
2885
- );
2886
- (0, import_react15.useEffect)(() => {
2887
- if (chatSuggestions !== "auto" || isLoadingSuggestions || suggestionsFailed) {
2888
- return;
2889
- }
2890
- if (isLoading) {
2891
- return;
2892
- }
2893
- if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
2894
- return;
2895
- }
2896
- if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {
2897
- hasGeneratedInitialSuggestions.current = true;
2898
- generateSuggestionsWithErrorHandling("initial");
2899
- return;
2900
- }
2901
- if (messages.length > 0 && suggestions.length === 0) {
2902
- generateSuggestionsWithErrorHandling("post-message");
2903
- return;
2904
- }
2905
- }, [
2906
- chatSuggestions,
2907
- isLoadingSuggestions,
2908
- suggestionsFailed,
2909
- messages.length,
2910
- isLoading,
2911
- suggestions.length,
2912
- Object.keys(generalContext.chatSuggestionConfiguration).join(","),
2913
- // Use stable string instead of object reference
2914
- generateSuggestionsWithErrorHandling
2915
- ]);
2916
- (0, import_react15.useEffect)(() => {
2917
- if (chatSuggestions !== "auto") {
2918
- hasGeneratedInitialSuggestions.current = false;
2919
- setSuggestionsFailed(false);
2920
- }
2921
- }, [chatSuggestions]);
2922
- const stableContext = (0, import_react15.useMemo)(
2923
- () => __spreadValues(__spreadValues({}, generalContext), messagesContext),
2924
- [
2925
- // Only include stable dependencies
2926
- generalContext.actions,
2927
- messagesContext.messages.length,
2928
- generalContext.isLoading
2929
- ]
2930
- );
2931
- const resetSuggestions = (0, import_react15.useCallback)(() => {
2932
- resetSuggestionsFromHook();
2933
- setSuggestionsFailed(false);
2934
- hasGeneratedInitialSuggestions.current = false;
2935
- }, [resetSuggestionsFromHook]);
2936
- (0, import_react15.useEffect)(() => {
2937
- onInProgress == null ? void 0 : onInProgress(isLoading);
2938
- }, [onInProgress, isLoading]);
2939
- const safelySendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2940
- const images = imagesToUse || [];
2941
- if (chatSuggestions === "auto" || chatSuggestions === "manual") {
2942
- setSuggestions([]);
2943
- }
2944
- let firstMessage = null;
2945
- if (messageContent.trim().length > 0) {
2946
- const textMessage = {
2947
- id: (0, import_shared4.randomId)(),
2948
- role: "user",
2949
- content: messageContent
2950
- };
2951
- if (onSubmitMessage) {
2952
- try {
2953
- yield onSubmitMessage(messageContent);
2954
- } catch (error) {
2955
- console.error("Error in onSubmitMessage:", error);
2956
- }
2957
- }
2958
- yield sendMessage(textMessage, {
2959
- followUp: images.length === 0,
2960
- clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
2961
- });
2962
- if (!firstMessage) {
2963
- firstMessage = textMessage;
2964
- }
2965
- }
2966
- if (images.length > 0) {
2967
- for (let i = 0; i < images.length; i++) {
2968
- const imageMessage = {
2969
- id: (0, import_shared4.randomId)(),
2970
- role: "user",
2971
- image: {
2972
- format: images[i].contentType.replace("image/", ""),
2973
- bytes: images[i].bytes
2974
- }
2975
- };
2976
- yield sendMessage(imageMessage, { followUp: i === images.length - 1 });
2977
- if (!firstMessage) {
2978
- firstMessage = imageMessage;
2979
- }
2980
- }
2981
- }
2982
- if (!firstMessage) {
2983
- return { role: "user", content: "", id: (0, import_shared4.randomId)() };
2984
- }
2985
- return firstMessage;
2986
- });
2987
- const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
2988
- const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
2989
- if (generalContext.agentSession) {
2990
- generalContext.setAgentSession(__spreadProps(__spreadValues({}, generalContext.agentSession), {
2991
- nodeName: void 0,
2992
- threadId: void 0
2993
- }));
2994
- generalContext.setCoagentStates((prevAgentStates) => {
2995
- return __spreadProps(__spreadValues({}, prevAgentStates), {
2996
- [generalContext.agentSession.agentName]: __spreadProps(__spreadValues({}, prevAgentStates[generalContext.agentSession.agentName]), {
2997
- threadId: void 0,
2998
- nodeName: void 0,
2999
- runId: void 0
3000
- })
3001
- });
3002
- });
3003
- }
3004
- });
3005
- const runCurrentAgent = (hint) => __async(void 0, null, function* () {
3006
- if (generalContext.agentSession) {
3007
- yield (0, import_react_core10.runAgent)(
3008
- generalContext.agentSession.agentName,
3009
- stableContext,
3010
- messagesContext.messages,
3011
- sendMessage,
3012
- runChatCompletion
3013
- );
3014
- }
3015
- });
3016
- const stopCurrentAgent = () => {
3017
- if (generalContext.agentSession) {
3018
- (0, import_react_core10.stopAgent)(generalContext.agentSession.agentName, stableContext);
3019
- }
3020
- };
3021
- const setCurrentAgentState = (state) => {
3022
- if (generalContext.agentSession) {
3023
- generalContext.setCoagentStates((prevAgentStates) => {
3024
- return __spreadProps(__spreadValues({}, prevAgentStates), {
3025
- [generalContext.agentSession.agentName]: {
3026
- state
3027
- }
3028
- });
3029
- });
3030
- }
3031
- };
3032
- function stopGeneration() {
3033
- setSuggestions([]);
3034
- if (onStopGeneration) {
3035
- onStopGeneration({
3036
- messages,
3037
- setMessages,
3038
- stopGeneration: defaultStopGeneration,
3039
- currentAgentName,
3040
- restartCurrentAgent,
3041
- stopCurrentAgent,
3042
- runCurrentAgent,
3043
- setCurrentAgentState
3044
- });
3045
- } else {
3046
- defaultStopGeneration();
3047
- }
3048
- }
3049
- function reloadMessages(messageId) {
3050
- if (onReloadMessages) {
3051
- onReloadMessages({
3052
- messages,
3053
- setMessages,
3054
- stopGeneration: defaultStopGeneration,
3055
- currentAgentName,
3056
- restartCurrentAgent,
3057
- stopCurrentAgent,
3058
- runCurrentAgent,
3059
- setCurrentAgentState,
3060
- messageId
3061
- });
3062
- } else {
3063
- defaultReloadMessages(messageId);
3064
- }
3065
- }
3066
- return {
3067
- messages,
3068
- isLoading,
3069
- suggestions,
3070
- sendMessage: safelySendMessage,
3071
- stopGeneration,
3072
- reloadMessages,
3073
- resetSuggestions,
3074
- context: stableContext,
3075
- actions
3076
- };
3077
- };
3078
2901
 
3079
2902
  // src/components/chat/Modal.tsx
3080
- var import_react_core11 = require("@copilotkit/react-core");
3081
- var import_shared5 = require("@copilotkit/shared");
2903
+ var import_react_core10 = require("@copilotkit/react-core");
2904
+ var import_shared4 = require("@copilotkit/shared");
3082
2905
  var import_jsx_runtime25 = require("react/jsx-runtime");
3083
2906
  var CopilotModalInner = (_a) => {
3084
2907
  var _b = _a, {
@@ -3104,7 +2927,7 @@ var CopilotModalInner = (_a) => {
3104
2927
  "Button",
3105
2928
  "Header"
3106
2929
  ]);
3107
- const { copilotApiConfig, setBannerError } = (0, import_react_core11.useCopilotContext)();
2930
+ const { copilotApiConfig, setBannerError } = (0, import_react_core10.useCopilotContext)();
3108
2931
  const { publicApiKey } = copilotApiConfig;
3109
2932
  const triggerObservabilityHook = (0, import_react16.useCallback)(
3110
2933
  (hookName, ...args) => {
@@ -3113,14 +2936,14 @@ var CopilotModalInner = (_a) => {
3113
2936
  }
3114
2937
  if ((observabilityHooks == null ? void 0 : observabilityHooks[hookName]) && !publicApiKey) {
3115
2938
  setBannerError(
3116
- new import_shared5.CopilotKitError({
2939
+ new import_shared4.CopilotKitError({
3117
2940
  message: "observabilityHooks requires a publicApiKey to function.",
3118
- code: import_shared5.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
3119
- severity: import_shared5.Severity.CRITICAL,
3120
- visibility: import_shared5.ErrorVisibility.BANNER
2941
+ code: import_shared4.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
2942
+ severity: import_shared4.Severity.CRITICAL,
2943
+ visibility: import_shared4.ErrorVisibility.BANNER
3121
2944
  })
3122
2945
  );
3123
- import_shared5.styledConsole.publicApiKeyRequired("observabilityHooks");
2946
+ import_shared4.styledConsole.publicApiKeyRequired("observabilityHooks");
3124
2947
  }
3125
2948
  },
3126
2949
  [publicApiKey, observabilityHooks, setBannerError]