@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
@@ -1028,14 +1028,30 @@ var import_react_core5 = require("@copilotkit/react-core");
1028
1028
 
1029
1029
  // src/components/chat/messages/UserMessage.tsx
1030
1030
  var import_jsx_runtime10 = require("react/jsx-runtime");
1031
+ var getTextContent = (content) => {
1032
+ if (typeof content === "undefined") {
1033
+ return void 0;
1034
+ }
1035
+ if (typeof content === "string") {
1036
+ return content;
1037
+ }
1038
+ return content.map((part) => {
1039
+ if (part.type === "text") {
1040
+ return part.text;
1041
+ }
1042
+ return void 0;
1043
+ }).filter((value) => typeof value === "string" && value.length > 0).join(" ").trim() || void 0;
1044
+ };
1031
1045
  var UserMessage = (props) => {
1032
1046
  const { message, ImageRenderer: ImageRenderer2 } = props;
1033
- const isImageMessage = message && "image" in message && message.image;
1047
+ const isImageMessage = message && "image" in message && Boolean(message.image);
1034
1048
  if (isImageMessage) {
1035
1049
  const imageMessage = message;
1036
- 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 }) });
1050
+ const content2 = getTextContent(imageMessage == null ? void 0 : imageMessage.content);
1051
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ImageRenderer2, { image: imageMessage.image, content: content2 }) });
1037
1052
  }
1038
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: message == null ? void 0 : message.content });
1053
+ const content = getTextContent(message == null ? void 0 : message.content);
1054
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "copilotKitMessage copilotKitUserMessage", children: content });
1039
1055
  };
1040
1056
 
1041
1057
  // src/components/chat/Markdown.tsx
@@ -1578,6 +1594,7 @@ var AssistantMessage = (props) => {
1578
1594
  onThumbsUp,
1579
1595
  onThumbsDown,
1580
1596
  isCurrentMessage,
1597
+ feedback,
1581
1598
  markdownTagRenderers
1582
1599
  } = props;
1583
1600
  const [copied, setCopied] = (0, import_react8.useState)(false);
@@ -1599,12 +1616,14 @@ var AssistantMessage = (props) => {
1599
1616
  onRegenerate();
1600
1617
  };
1601
1618
  const handleThumbsUp = () => {
1602
- if (onThumbsUp && message)
1619
+ if (onThumbsUp && message) {
1603
1620
  onThumbsUp(message);
1621
+ }
1604
1622
  };
1605
1623
  const handleThumbsDown = () => {
1606
- if (onThumbsDown && message)
1624
+ if (onThumbsDown && message) {
1607
1625
  onThumbsDown(message);
1626
+ }
1608
1627
  };
1609
1628
  const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: icons.activityIcon });
1610
1629
  const content = (message == null ? void 0 : message.content) || "";
@@ -1640,7 +1659,7 @@ var AssistantMessage = (props) => {
1640
1659
  onThumbsUp && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1641
1660
  "button",
1642
1661
  {
1643
- className: "copilotKitMessageControlButton",
1662
+ className: `copilotKitMessageControlButton ${feedback === "thumbsUp" ? "active" : ""}`,
1644
1663
  onClick: handleThumbsUp,
1645
1664
  "aria-label": labels.thumbsUp,
1646
1665
  title: labels.thumbsUp,
@@ -1650,7 +1669,7 @@ var AssistantMessage = (props) => {
1650
1669
  onThumbsDown && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1651
1670
  "button",
1652
1671
  {
1653
- className: "copilotKitMessageControlButton",
1672
+ className: `copilotKitMessageControlButton ${feedback === "thumbsDown" ? "active" : ""}`,
1654
1673
  onClick: handleThumbsDown,
1655
1674
  "aria-label": labels.thumbsDown,
1656
1675
  title: labels.thumbsDown,
@@ -1711,6 +1730,7 @@ function RenderMessage(_a) {
1711
1730
  var _a2;
1712
1731
  const {
1713
1732
  message,
1733
+ messages,
1714
1734
  inProgress,
1715
1735
  index,
1716
1736
  isCurrentMessage,
@@ -1718,6 +1738,7 @@ function RenderMessage(_a) {
1718
1738
  onCopy,
1719
1739
  onThumbsUp,
1720
1740
  onThumbsDown,
1741
+ messageFeedback,
1721
1742
  markdownTagRenderers
1722
1743
  } = props;
1723
1744
  switch (message.role) {
@@ -1740,6 +1761,7 @@ function RenderMessage(_a) {
1740
1761
  subComponent: (_a2 = message.generativeUI) == null ? void 0 : _a2.call(message),
1741
1762
  rawData: message,
1742
1763
  message,
1764
+ messages,
1743
1765
  isLoading: inProgress && isCurrentMessage && !message.content,
1744
1766
  isGenerating: inProgress && isCurrentMessage && !!message.content,
1745
1767
  isCurrentMessage,
@@ -1747,6 +1769,7 @@ function RenderMessage(_a) {
1747
1769
  onCopy,
1748
1770
  onThumbsUp,
1749
1771
  onThumbsDown,
1772
+ feedback: (messageFeedback == null ? void 0 : messageFeedback[message.id]) || null,
1750
1773
  markdownTagRenderers,
1751
1774
  ImageRenderer: ImageRenderer2
1752
1775
  },
@@ -1760,6 +1783,7 @@ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
1760
1783
  var import_jsx_runtime16 = require("react/jsx-runtime");
1761
1784
  var LegacyRenderMessage = ({
1762
1785
  message,
1786
+ messages,
1763
1787
  inProgress,
1764
1788
  index,
1765
1789
  isCurrentMessage,
@@ -1788,6 +1812,7 @@ var LegacyRenderMessage = ({
1788
1812
  RenderTextMessage,
1789
1813
  {
1790
1814
  message,
1815
+ messages,
1791
1816
  inProgress,
1792
1817
  index,
1793
1818
  isCurrentMessage,
@@ -1805,6 +1830,7 @@ var LegacyRenderMessage = ({
1805
1830
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1806
1831
  RenderActionExecutionMessage,
1807
1832
  {
1833
+ messages,
1808
1834
  message,
1809
1835
  inProgress,
1810
1836
  index,
@@ -1819,6 +1845,7 @@ var LegacyRenderMessage = ({
1819
1845
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1820
1846
  RenderAgentStateMessage,
1821
1847
  {
1848
+ messages,
1822
1849
  message,
1823
1850
  inProgress,
1824
1851
  index,
@@ -1832,6 +1859,7 @@ var LegacyRenderMessage = ({
1832
1859
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1833
1860
  RenderResultMessage,
1834
1861
  {
1862
+ messages,
1835
1863
  message,
1836
1864
  inProgress,
1837
1865
  index,
@@ -1845,6 +1873,7 @@ var LegacyRenderMessage = ({
1845
1873
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1846
1874
  RenderImageMessage,
1847
1875
  {
1876
+ messages,
1848
1877
  message,
1849
1878
  inProgress,
1850
1879
  index,
@@ -1857,6 +1886,7 @@ var LegacyRenderMessage = ({
1857
1886
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1858
1887
  RenderMessage,
1859
1888
  {
1889
+ messages,
1860
1890
  message,
1861
1891
  inProgress,
1862
1892
  index,
@@ -1887,6 +1917,7 @@ var Messages = ({
1887
1917
  onCopy,
1888
1918
  onThumbsUp,
1889
1919
  onThumbsDown,
1920
+ messageFeedback,
1890
1921
  markdownTagRenderers,
1891
1922
  chatError,
1892
1923
  // Legacy props
@@ -1896,7 +1927,8 @@ var Messages = ({
1896
1927
  RenderResultMessage,
1897
1928
  RenderImageMessage
1898
1929
  }) => {
1899
- const { labels } = useChatContext();
1930
+ var _a;
1931
+ const { labels, icons } = useChatContext();
1900
1932
  const { messages: visibleMessages, interrupt } = (0, import_react_core5.useCopilotChatInternal)();
1901
1933
  const initialMessages = (0, import_react10.useMemo)(() => makeInitialMessages(labels.initial), [labels.initial]);
1902
1934
  const messages = [...initialMessages, ...visibleMessages];
@@ -1926,6 +1958,7 @@ var Messages = ({
1926
1958
  ]
1927
1959
  );
1928
1960
  const MessageRenderer = hasLegacyProps ? (props) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LegacyRenderMessage, __spreadProps(__spreadValues({}, props), { legacyProps })) : RenderMessage2;
1961
+ const LoadingIcon = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: icons.activityIcon });
1929
1962
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessages", ref: messagesContainerRef, children: [
1930
1963
  /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "copilotKitMessagesContainer", children: [
1931
1964
  messages.map((message, index) => {
@@ -1934,6 +1967,7 @@ var Messages = ({
1934
1967
  MessageRenderer,
1935
1968
  {
1936
1969
  message,
1970
+ messages,
1937
1971
  inProgress,
1938
1972
  index,
1939
1973
  isCurrentMessage,
@@ -1944,11 +1978,13 @@ var Messages = ({
1944
1978
  onCopy,
1945
1979
  onThumbsUp,
1946
1980
  onThumbsDown,
1981
+ messageFeedback,
1947
1982
  markdownTagRenderers
1948
1983
  },
1949
1984
  index
1950
1985
  );
1951
1986
  }),
1987
+ ((_a = messages[messages.length - 1]) == null ? void 0 : _a.role) === "user" && inProgress && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingIcon, {}),
1952
1988
  interrupt,
1953
1989
  chatError && ErrorMessage && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ErrorMessage, { error: chatError, isCurrentMessage: true })
1954
1990
  ] }),
@@ -2242,12 +2278,12 @@ var MAX_NEWLINES = 6;
2242
2278
  var Input = ({
2243
2279
  inProgress,
2244
2280
  onSend,
2245
- isVisible = false,
2281
+ chatReady = true,
2246
2282
  onStop,
2247
2283
  onUpload,
2248
2284
  hideStopButton = false
2249
2285
  }) => {
2250
- var _a, _b;
2286
+ var _a;
2251
2287
  const context = useChatContext();
2252
2288
  const copilotContext = (0, import_react_core7.useCopilotContext)();
2253
2289
  const showPoweredBy = !((_a = copilotContext.copilotApiConfig) == null ? void 0 : _a.publicApiKey);
@@ -2277,14 +2313,16 @@ var Input = ({
2277
2313
  inProgress
2278
2314
  });
2279
2315
  const isInProgress = inProgress || pushToTalkState === "transcribing";
2280
- const buttonIcon = isInProgress && !hideStopButton ? context.icons.stopIcon : context.icons.sendIcon;
2316
+ const { buttonIcon, buttonAlt } = (0, import_react14.useMemo)(() => {
2317
+ if (!chatReady)
2318
+ return { buttonIcon: context.icons.spinnerIcon, buttonAlt: "Loading" };
2319
+ return isInProgress && !hideStopButton ? { buttonIcon: context.icons.stopIcon, buttonAlt: "Stop" } : { buttonIcon: context.icons.sendIcon, buttonAlt: "Send" };
2320
+ }, [isInProgress, chatReady, hideStopButton, context.icons.stopIcon, context.icons.sendIcon]);
2281
2321
  const showPushToTalk = pushToTalkConfigured && (pushToTalkState === "idle" || pushToTalkState === "recording") && !inProgress;
2322
+ const { interrupt } = (0, import_react_core7.useCopilotChatInternal)();
2282
2323
  const canSend = (0, import_react14.useMemo)(() => {
2283
- var _a2;
2284
- const interruptEvent = (_a2 = copilotContext.langGraphInterruptAction) == null ? void 0 : _a2.event;
2285
- const interruptInProgress = (interruptEvent == null ? void 0 : interruptEvent.name) === "LangGraphInterruptEvent" && !(interruptEvent == null ? void 0 : interruptEvent.response);
2286
- return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interruptInProgress;
2287
- }, [(_b = copilotContext.langGraphInterruptAction) == null ? void 0 : _b.event, isInProgress, text, pushToTalkState]);
2324
+ return !isInProgress && text.trim().length > 0 && pushToTalkState === "idle" && !interrupt;
2325
+ }, [interrupt, isInProgress, text, pushToTalkState]);
2288
2326
  const canStop = (0, import_react14.useMemo)(() => {
2289
2327
  return isInProgress && !hideStopButton;
2290
2328
  }, [isInProgress, hideStopButton]);
@@ -2331,6 +2369,7 @@ var Input = ({
2331
2369
  "data-copilotkit-in-progress": inProgress,
2332
2370
  "data-test-id": inProgress ? "copilot-chat-request-in-progress" : "copilot-chat-ready",
2333
2371
  className: "copilotKitInputControlButton",
2372
+ "aria-label": buttonAlt,
2334
2373
  children: buttonIcon
2335
2374
  }
2336
2375
  )
@@ -2344,8 +2383,6 @@ var Input = ({
2344
2383
  var import_react15 = __toESM(require("react"));
2345
2384
  var import_react_core9 = require("@copilotkit/react-core");
2346
2385
  var import_shared3 = require("@copilotkit/shared");
2347
- var import_shared4 = require("@copilotkit/shared");
2348
- var import_react_core10 = require("@copilotkit/react-core");
2349
2386
 
2350
2387
  // src/components/chat/ImageUploadQueue.tsx
2351
2388
  var import_jsx_runtime21 = require("react/jsx-runtime");
@@ -2449,18 +2486,25 @@ function Suggestion({ title, onClick, partial, className }) {
2449
2486
 
2450
2487
  // src/components/chat/Suggestions.tsx
2451
2488
  var import_jsx_runtime23 = require("react/jsx-runtime");
2452
- function Suggestions({ suggestions, onSuggestionClick }) {
2453
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2454
- Suggestion,
2455
- {
2456
- title: suggestion.title,
2457
- message: suggestion.message,
2458
- partial: suggestion.partial,
2459
- className: suggestion.className,
2460
- onClick: () => onSuggestionClick(suggestion.message)
2461
- },
2462
- index
2463
- )) });
2489
+ function Suggestions({
2490
+ suggestions,
2491
+ onSuggestionClick,
2492
+ isLoading
2493
+ }) {
2494
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "suggestions", children: suggestions.map((suggestion, index) => {
2495
+ var _a, _b;
2496
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2497
+ Suggestion,
2498
+ {
2499
+ title: suggestion.title,
2500
+ message: suggestion.message,
2501
+ partial: (_b = (_a = suggestion.isLoading) != null ? _a : suggestion.partial) != null ? _b : isLoading,
2502
+ className: suggestion.className,
2503
+ onClick: () => onSuggestionClick(suggestion.message)
2504
+ },
2505
+ index
2506
+ );
2507
+ }) });
2464
2508
  }
2465
2509
 
2466
2510
  // src/components/chat/Chat.tsx
@@ -2514,6 +2558,9 @@ function CopilotChat({
2514
2558
  const { publicApiKey, chatApiEndpoint } = copilotApiConfig;
2515
2559
  const [selectedImages, setSelectedImages] = (0, import_react15.useState)([]);
2516
2560
  const [chatError, setChatError] = (0, import_react15.useState)(null);
2561
+ const [messageFeedback, setMessageFeedback] = (0, import_react15.useState)(
2562
+ {}
2563
+ );
2517
2564
  const fileInputRef = (0, import_react15.useRef)(null);
2518
2565
  const triggerObservabilityHook = (0, import_react15.useCallback)(
2519
2566
  (hookName, ...args) => {
@@ -2657,16 +2704,12 @@ function CopilotChat({
2657
2704
  sendMessage,
2658
2705
  stopGeneration,
2659
2706
  reloadMessages,
2660
- suggestions: currentSuggestions
2661
- } = useCopilotChatLogic(
2662
- suggestions,
2663
- makeSystemMessage,
2664
- disableSystemMessage,
2665
- onInProgress,
2666
- onSubmitMessage,
2667
- onStopGeneration,
2668
- onReloadMessages
2669
- );
2707
+ suggestions: currentSuggestions,
2708
+ isLoadingSuggestions,
2709
+ agent
2710
+ } = (0, import_react_core9.useCopilotChatInternal)({
2711
+ suggestions
2712
+ });
2670
2713
  const prevIsLoading = (0, import_react15.useRef)(isLoading);
2671
2714
  (0, import_react15.useEffect)(() => {
2672
2715
  if (prevIsLoading.current !== isLoading) {
@@ -2685,7 +2728,11 @@ function CopilotChat({
2685
2728
  fileInputRef.current.value = "";
2686
2729
  }
2687
2730
  triggerObservabilityHook("onMessageSent", text);
2688
- return sendMessage(text, images);
2731
+ return sendMessage({
2732
+ id: (0, import_shared3.randomUUID)(),
2733
+ content: text,
2734
+ role: "user"
2735
+ });
2689
2736
  };
2690
2737
  const chatContext = import_react15.default.useContext(ChatContext);
2691
2738
  const isVisible = chatContext ? chatContext.open : true;
@@ -2741,12 +2788,18 @@ function CopilotChat({
2741
2788
  if (onThumbsUp) {
2742
2789
  onThumbsUp(message);
2743
2790
  }
2791
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2792
+ [message.id]: "thumbsUp"
2793
+ }));
2744
2794
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsUp");
2745
2795
  };
2746
2796
  const handleThumbsDown = (message) => {
2747
2797
  if (onThumbsDown) {
2748
2798
  onThumbsDown(message);
2749
2799
  }
2800
+ setMessageFeedback((prev) => __spreadProps(__spreadValues({}, prev), {
2801
+ [message.id]: "thumbsDown"
2802
+ }));
2750
2803
  triggerObservabilityHook("onFeedbackGiven", message.id, "thumbsDown");
2751
2804
  };
2752
2805
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(WrappedCopilotChat, { icons, labels, className, children: [
@@ -2768,6 +2821,7 @@ function CopilotChat({
2768
2821
  onCopy: handleCopy,
2769
2822
  onThumbsUp: handleThumbsUp,
2770
2823
  onThumbsDown: handleThumbsDown,
2824
+ messageFeedback,
2771
2825
  markdownTagRenderers,
2772
2826
  ImageRenderer: ImageRenderer2,
2773
2827
  ErrorMessage,
@@ -2781,7 +2835,8 @@ function CopilotChat({
2781
2835
  RenderSuggestionsList,
2782
2836
  {
2783
2837
  onSuggestionClick: handleSendMessage,
2784
- suggestions: currentSuggestions
2838
+ suggestions: currentSuggestions,
2839
+ isLoading: isLoadingSuggestions
2785
2840
  }
2786
2841
  )
2787
2842
  }
@@ -2804,6 +2859,7 @@ function CopilotChat({
2804
2859
  Input2,
2805
2860
  {
2806
2861
  inProgress: isLoading,
2862
+ chatReady: Boolean(agent),
2807
2863
  onSend: handleSendMessage,
2808
2864
  isVisible,
2809
2865
  onStop: stopGeneration,
@@ -2829,243 +2885,10 @@ function WrappedCopilotChat({
2829
2885
  }
2830
2886
  return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_jsx_runtime24.Fragment, { children });
2831
2887
  }
2832
- var useCopilotChatLogic = (chatSuggestions, makeSystemMessage, disableSystemMessage, onInProgress, onSubmitMessage, onStopGeneration, onReloadMessages) => {
2833
- var _a;
2834
- const {
2835
- messages,
2836
- sendMessage,
2837
- setMessages,
2838
- reloadMessages: defaultReloadMessages,
2839
- stopGeneration: defaultStopGeneration,
2840
- runChatCompletion,
2841
- isLoading,
2842
- suggestions,
2843
- setSuggestions,
2844
- generateSuggestions,
2845
- resetSuggestions: resetSuggestionsFromHook,
2846
- isLoadingSuggestions
2847
- } = (0, import_react_core9.useCopilotChatInternal)({
2848
- makeSystemMessage,
2849
- disableSystemMessage
2850
- });
2851
- const generalContext = (0, import_react_core9.useCopilotContext)();
2852
- const messagesContext = (0, import_react_core9.useCopilotMessagesContext)();
2853
- const { actions } = generalContext;
2854
- const [suggestionsFailed, setSuggestionsFailed] = (0, import_react15.useState)(false);
2855
- const hasGeneratedInitialSuggestions = (0, import_react15.useRef)(false);
2856
- (0, import_react15.useEffect)(() => {
2857
- if (Array.isArray(chatSuggestions)) {
2858
- setSuggestions(chatSuggestions);
2859
- hasGeneratedInitialSuggestions.current = true;
2860
- }
2861
- }, [JSON.stringify(chatSuggestions), setSuggestions]);
2862
- const generateSuggestionsWithErrorHandling = (0, import_react15.useCallback)(
2863
- (context) => __async(void 0, null, function* () {
2864
- try {
2865
- yield generateSuggestions();
2866
- } catch (error) {
2867
- console.error("Failed to generate suggestions:", error);
2868
- setSuggestionsFailed(true);
2869
- }
2870
- }),
2871
- [generateSuggestions]
2872
- );
2873
- (0, import_react15.useEffect)(() => {
2874
- if (chatSuggestions !== "auto" || isLoadingSuggestions || suggestionsFailed) {
2875
- return;
2876
- }
2877
- if (isLoading) {
2878
- return;
2879
- }
2880
- if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {
2881
- return;
2882
- }
2883
- if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {
2884
- hasGeneratedInitialSuggestions.current = true;
2885
- generateSuggestionsWithErrorHandling("initial");
2886
- return;
2887
- }
2888
- if (messages.length > 0 && suggestions.length === 0) {
2889
- generateSuggestionsWithErrorHandling("post-message");
2890
- return;
2891
- }
2892
- }, [
2893
- chatSuggestions,
2894
- isLoadingSuggestions,
2895
- suggestionsFailed,
2896
- messages.length,
2897
- isLoading,
2898
- suggestions.length,
2899
- Object.keys(generalContext.chatSuggestionConfiguration).join(","),
2900
- // Use stable string instead of object reference
2901
- generateSuggestionsWithErrorHandling
2902
- ]);
2903
- (0, import_react15.useEffect)(() => {
2904
- if (chatSuggestions !== "auto") {
2905
- hasGeneratedInitialSuggestions.current = false;
2906
- setSuggestionsFailed(false);
2907
- }
2908
- }, [chatSuggestions]);
2909
- const stableContext = (0, import_react15.useMemo)(
2910
- () => __spreadValues(__spreadValues({}, generalContext), messagesContext),
2911
- [
2912
- // Only include stable dependencies
2913
- generalContext.actions,
2914
- messagesContext.messages.length,
2915
- generalContext.isLoading
2916
- ]
2917
- );
2918
- const resetSuggestions = (0, import_react15.useCallback)(() => {
2919
- resetSuggestionsFromHook();
2920
- setSuggestionsFailed(false);
2921
- hasGeneratedInitialSuggestions.current = false;
2922
- }, [resetSuggestionsFromHook]);
2923
- (0, import_react15.useEffect)(() => {
2924
- onInProgress == null ? void 0 : onInProgress(isLoading);
2925
- }, [onInProgress, isLoading]);
2926
- const safelySendMessage = (messageContent, imagesToUse) => __async(void 0, null, function* () {
2927
- const images = imagesToUse || [];
2928
- if (chatSuggestions === "auto" || chatSuggestions === "manual") {
2929
- setSuggestions([]);
2930
- }
2931
- let firstMessage = null;
2932
- if (messageContent.trim().length > 0) {
2933
- const textMessage = {
2934
- id: (0, import_shared4.randomId)(),
2935
- role: "user",
2936
- content: messageContent
2937
- };
2938
- if (onSubmitMessage) {
2939
- try {
2940
- yield onSubmitMessage(messageContent);
2941
- } catch (error) {
2942
- console.error("Error in onSubmitMessage:", error);
2943
- }
2944
- }
2945
- yield sendMessage(textMessage, {
2946
- followUp: images.length === 0,
2947
- clearSuggestions: chatSuggestions === "auto" || chatSuggestions === "manual"
2948
- });
2949
- if (!firstMessage) {
2950
- firstMessage = textMessage;
2951
- }
2952
- }
2953
- if (images.length > 0) {
2954
- for (let i = 0; i < images.length; i++) {
2955
- const imageMessage = {
2956
- id: (0, import_shared4.randomId)(),
2957
- role: "user",
2958
- image: {
2959
- format: images[i].contentType.replace("image/", ""),
2960
- bytes: images[i].bytes
2961
- }
2962
- };
2963
- yield sendMessage(imageMessage, { followUp: i === images.length - 1 });
2964
- if (!firstMessage) {
2965
- firstMessage = imageMessage;
2966
- }
2967
- }
2968
- }
2969
- if (!firstMessage) {
2970
- return { role: "user", content: "", id: (0, import_shared4.randomId)() };
2971
- }
2972
- return firstMessage;
2973
- });
2974
- const currentAgentName = (_a = generalContext.agentSession) == null ? void 0 : _a.agentName;
2975
- const restartCurrentAgent = (hint) => __async(void 0, null, function* () {
2976
- if (generalContext.agentSession) {
2977
- generalContext.setAgentSession(__spreadProps(__spreadValues({}, generalContext.agentSession), {
2978
- nodeName: void 0,
2979
- threadId: void 0
2980
- }));
2981
- generalContext.setCoagentStates((prevAgentStates) => {
2982
- return __spreadProps(__spreadValues({}, prevAgentStates), {
2983
- [generalContext.agentSession.agentName]: __spreadProps(__spreadValues({}, prevAgentStates[generalContext.agentSession.agentName]), {
2984
- threadId: void 0,
2985
- nodeName: void 0,
2986
- runId: void 0
2987
- })
2988
- });
2989
- });
2990
- }
2991
- });
2992
- const runCurrentAgent = (hint) => __async(void 0, null, function* () {
2993
- if (generalContext.agentSession) {
2994
- yield (0, import_react_core10.runAgent)(
2995
- generalContext.agentSession.agentName,
2996
- stableContext,
2997
- messagesContext.messages,
2998
- sendMessage,
2999
- runChatCompletion
3000
- );
3001
- }
3002
- });
3003
- const stopCurrentAgent = () => {
3004
- if (generalContext.agentSession) {
3005
- (0, import_react_core10.stopAgent)(generalContext.agentSession.agentName, stableContext);
3006
- }
3007
- };
3008
- const setCurrentAgentState = (state) => {
3009
- if (generalContext.agentSession) {
3010
- generalContext.setCoagentStates((prevAgentStates) => {
3011
- return __spreadProps(__spreadValues({}, prevAgentStates), {
3012
- [generalContext.agentSession.agentName]: {
3013
- state
3014
- }
3015
- });
3016
- });
3017
- }
3018
- };
3019
- function stopGeneration() {
3020
- setSuggestions([]);
3021
- if (onStopGeneration) {
3022
- onStopGeneration({
3023
- messages,
3024
- setMessages,
3025
- stopGeneration: defaultStopGeneration,
3026
- currentAgentName,
3027
- restartCurrentAgent,
3028
- stopCurrentAgent,
3029
- runCurrentAgent,
3030
- setCurrentAgentState
3031
- });
3032
- } else {
3033
- defaultStopGeneration();
3034
- }
3035
- }
3036
- function reloadMessages(messageId) {
3037
- if (onReloadMessages) {
3038
- onReloadMessages({
3039
- messages,
3040
- setMessages,
3041
- stopGeneration: defaultStopGeneration,
3042
- currentAgentName,
3043
- restartCurrentAgent,
3044
- stopCurrentAgent,
3045
- runCurrentAgent,
3046
- setCurrentAgentState,
3047
- messageId
3048
- });
3049
- } else {
3050
- defaultReloadMessages(messageId);
3051
- }
3052
- }
3053
- return {
3054
- messages,
3055
- isLoading,
3056
- suggestions,
3057
- sendMessage: safelySendMessage,
3058
- stopGeneration,
3059
- reloadMessages,
3060
- resetSuggestions,
3061
- context: stableContext,
3062
- actions
3063
- };
3064
- };
3065
2888
 
3066
2889
  // src/components/chat/Modal.tsx
3067
- var import_react_core11 = require("@copilotkit/react-core");
3068
- var import_shared5 = require("@copilotkit/shared");
2890
+ var import_react_core10 = require("@copilotkit/react-core");
2891
+ var import_shared4 = require("@copilotkit/shared");
3069
2892
  var import_jsx_runtime25 = require("react/jsx-runtime");
3070
2893
  var CopilotModalInner = (_a) => {
3071
2894
  var _b = _a, {
@@ -3091,7 +2914,7 @@ var CopilotModalInner = (_a) => {
3091
2914
  "Button",
3092
2915
  "Header"
3093
2916
  ]);
3094
- const { copilotApiConfig, setBannerError } = (0, import_react_core11.useCopilotContext)();
2917
+ const { copilotApiConfig, setBannerError } = (0, import_react_core10.useCopilotContext)();
3095
2918
  const { publicApiKey } = copilotApiConfig;
3096
2919
  const triggerObservabilityHook = (0, import_react16.useCallback)(
3097
2920
  (hookName, ...args) => {
@@ -3100,14 +2923,14 @@ var CopilotModalInner = (_a) => {
3100
2923
  }
3101
2924
  if ((observabilityHooks == null ? void 0 : observabilityHooks[hookName]) && !publicApiKey) {
3102
2925
  setBannerError(
3103
- new import_shared5.CopilotKitError({
2926
+ new import_shared4.CopilotKitError({
3104
2927
  message: "observabilityHooks requires a publicApiKey to function.",
3105
- code: import_shared5.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
3106
- severity: import_shared5.Severity.CRITICAL,
3107
- visibility: import_shared5.ErrorVisibility.BANNER
2928
+ code: import_shared4.CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
2929
+ severity: import_shared4.Severity.CRITICAL,
2930
+ visibility: import_shared4.ErrorVisibility.BANNER
3108
2931
  })
3109
2932
  );
3110
- import_shared5.styledConsole.publicApiKeyRequired("observabilityHooks");
2933
+ import_shared4.styledConsole.publicApiKeyRequired("observabilityHooks");
3111
2934
  }
3112
2935
  },
3113
2936
  [publicApiKey, observabilityHooks, setBannerError]