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