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