@copilotkit/react-ui 1.7.2-next.0 → 1.7.2-next.2

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 (67) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/{chunk-AZU4QOV5.mjs → chunk-AELKLZSG.mjs} +5 -5
  3. package/dist/{chunk-3PJA5MFR.mjs → chunk-DLG7BZTA.mjs} +2 -2
  4. package/dist/chunk-EJG6RRSX.mjs +138 -0
  5. package/dist/chunk-EJG6RRSX.mjs.map +1 -0
  6. package/dist/chunk-MCO235PS.mjs +164 -0
  7. package/dist/chunk-MCO235PS.mjs.map +1 -0
  8. package/dist/chunk-MWC5OV7Z.mjs +1 -0
  9. package/dist/chunk-N7LTE54T.mjs +1 -0
  10. package/dist/chunk-N7LTE54T.mjs.map +1 -0
  11. package/dist/{chunk-2C3ANQCY.mjs → chunk-QXQDIFOC.mjs} +9 -9
  12. package/dist/{chunk-ADTTDBLB.mjs → chunk-R2O33F44.mjs} +2 -2
  13. package/dist/chunk-UCVCAGU7.mjs +1 -0
  14. package/dist/chunk-UCVCAGU7.mjs.map +1 -0
  15. package/dist/{chunk-22K5DDPF.mjs → chunk-ZIF5JJCH.mjs} +8 -8
  16. package/dist/components/chat/Chat.mjs +7 -7
  17. package/dist/components/chat/Modal.mjs +8 -8
  18. package/dist/components/chat/Popup.mjs +9 -9
  19. package/dist/components/chat/Sidebar.mjs +9 -9
  20. package/dist/components/chat/index.mjs +12 -12
  21. package/dist/components/crew/DefaultResponseRenderer.d.ts +110 -0
  22. package/dist/components/crew/DefaultResponseRenderer.js +175 -0
  23. package/dist/components/crew/DefaultResponseRenderer.js.map +1 -0
  24. package/dist/components/crew/DefaultResponseRenderer.mjs +10 -0
  25. package/dist/components/crew/DefaultResponseRenderer.mjs.map +1 -0
  26. package/dist/components/crew/DefaultStateRenderer.d.ts +88 -0
  27. package/dist/components/crew/DefaultStateRenderer.js +198 -0
  28. package/dist/components/crew/DefaultStateRenderer.js.map +1 -0
  29. package/dist/components/crew/DefaultStateRenderer.mjs +8 -0
  30. package/dist/components/crew/DefaultStateRenderer.mjs.map +1 -0
  31. package/dist/components/crew/index.d.ts +4 -0
  32. package/dist/components/crew/index.js +335 -0
  33. package/dist/components/crew/index.js.map +1 -0
  34. package/dist/components/crew/index.mjs +16 -0
  35. package/dist/components/crew/index.mjs.map +1 -0
  36. package/dist/components/crew/types.d.ts +340 -0
  37. package/dist/components/crew/types.js +19 -0
  38. package/dist/components/crew/types.js.map +1 -0
  39. package/dist/components/crew/types.mjs +2 -0
  40. package/dist/components/crew/types.mjs.map +1 -0
  41. package/dist/components/dev-console/console.mjs +3 -3
  42. package/dist/components/dev-console/index.mjs +4 -4
  43. package/dist/components/index.d.ts +3 -0
  44. package/dist/components/index.js +290 -0
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/index.mjs +26 -14
  47. package/dist/index.css +227 -0
  48. package/dist/index.css.map +1 -1
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.js +292 -2
  51. package/dist/index.js.map +1 -1
  52. package/dist/index.mjs +26 -14
  53. package/package.json +4 -4
  54. package/src/components/crew/DefaultResponseRenderer.tsx +298 -0
  55. package/src/components/crew/DefaultStateRenderer.tsx +326 -0
  56. package/src/components/crew/index.ts +3 -0
  57. package/src/components/crew/types.ts +398 -0
  58. package/src/components/index.ts +1 -0
  59. package/src/css/crew.css +277 -0
  60. package/src/styles.css +1 -0
  61. package/dist/chunk-MMVDU6DF.mjs +0 -1
  62. /package/dist/{chunk-AZU4QOV5.mjs.map → chunk-AELKLZSG.mjs.map} +0 -0
  63. /package/dist/{chunk-3PJA5MFR.mjs.map → chunk-DLG7BZTA.mjs.map} +0 -0
  64. /package/dist/{chunk-MMVDU6DF.mjs.map → chunk-MWC5OV7Z.mjs.map} +0 -0
  65. /package/dist/{chunk-2C3ANQCY.mjs.map → chunk-QXQDIFOC.mjs.map} +0 -0
  66. /package/dist/{chunk-ADTTDBLB.mjs.map → chunk-R2O33F44.mjs.map} +0 -0
  67. /package/dist/{chunk-22K5DDPF.mjs.map → chunk-ZIF5JJCH.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -85,8 +85,11 @@ __export(src_exports, {
85
85
  CopilotDevConsole: () => CopilotDevConsole,
86
86
  CopilotPopup: () => CopilotPopup,
87
87
  CopilotSidebar: () => CopilotSidebar,
88
+ DefaultResponseRenderer: () => DefaultResponseRenderer,
89
+ DefaultStateRenderer: () => DefaultStateRenderer,
88
90
  Markdown: () => Markdown,
89
91
  UserMessage: () => UserMessage,
92
+ createResponseCache: () => createResponseCache,
90
93
  shouldShowDevConsole: () => shouldShowDevConsole,
91
94
  useChatContext: () => useChatContext,
92
95
  useCopilotChatSuggestions: () => useCopilotChatSuggestions
@@ -2796,8 +2799,292 @@ function CopilotSidebar(props) {
2796
2799
  return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: `copilotKitSidebarContentWrapper ${expandedClassName}`, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CopilotModal, __spreadProps(__spreadValues(__spreadValues({}, props), { onSetOpen }), { children: props.children })) });
2797
2800
  }
2798
2801
 
2799
- // src/hooks/use-copilot-chat-suggestions.tsx
2802
+ // src/components/crew/DefaultResponseRenderer.tsx
2800
2803
  var import_react15 = require("react");
2804
+ var import_jsx_runtime27 = require("react/jsx-runtime");
2805
+ var createResponseCache = () => {
2806
+ const responseCache = /* @__PURE__ */ new Map();
2807
+ return {
2808
+ getResponse: (id) => responseCache.get(id),
2809
+ setResponse: (id, response) => responseCache.set(id, response)
2810
+ };
2811
+ };
2812
+ var useResponseCache = createResponseCache();
2813
+ var DefaultExpandIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2814
+ "svg",
2815
+ {
2816
+ className,
2817
+ width: "12",
2818
+ height: "12",
2819
+ viewBox: "0 0 24 24",
2820
+ fill: "none",
2821
+ stroke: "currentColor",
2822
+ strokeWidth: "2",
2823
+ strokeLinecap: "round",
2824
+ strokeLinejoin: "round",
2825
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("polyline", { points: "6 9 12 15 18 9" })
2826
+ }
2827
+ );
2828
+ var DefaultCollapseIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2829
+ "svg",
2830
+ {
2831
+ className,
2832
+ width: "12",
2833
+ height: "12",
2834
+ viewBox: "0 0 24 24",
2835
+ fill: "none",
2836
+ stroke: "currentColor",
2837
+ strokeWidth: "2",
2838
+ strokeLinecap: "round",
2839
+ strokeLinejoin: "round",
2840
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("polyline", { points: "18 15 12 9 6 15" })
2841
+ }
2842
+ );
2843
+ var DefaultContentRenderer = ({ content, className }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className, children: content });
2844
+ var DefaultFeedbackButton = ({ label, onClick, className }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("button", { onClick, className, children: label });
2845
+ var DefaultCompletedFeedback = ({ message, className }) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: message }) });
2846
+ var DefaultResponseRenderer = ({
2847
+ response,
2848
+ status,
2849
+ onRespond,
2850
+ icons,
2851
+ labels,
2852
+ ContentRenderer = DefaultContentRenderer,
2853
+ FeedbackButton = DefaultFeedbackButton,
2854
+ CompletedFeedback = DefaultCompletedFeedback,
2855
+ className = "copilotkit-response",
2856
+ contentClassName = "copilotkit-response-content",
2857
+ actionsClassName = "copilotkit-response-actions",
2858
+ buttonClassName = "copilotkit-response-button",
2859
+ completedFeedbackClassName = "copilotkit-response-completed-feedback"
2860
+ }) => {
2861
+ const [isExpanded, setIsExpanded] = (0, import_react15.useState)(true);
2862
+ const defaultLabels = {
2863
+ responseLabel: "Response",
2864
+ approveLabel: "Approve",
2865
+ rejectLabel: "Reject",
2866
+ approvedMessage: "Approved",
2867
+ rejectedMessage: "Rejected",
2868
+ feedbackSubmittedMessage: "Feedback submitted"
2869
+ };
2870
+ const mergedLabels = __spreadValues(__spreadValues({}, defaultLabels), labels);
2871
+ const renderFeedback = () => {
2872
+ if (status === "complete") {
2873
+ const cachedResponse = useResponseCache.getResponse(response.id);
2874
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2875
+ CompletedFeedback,
2876
+ {
2877
+ message: (cachedResponse == null ? void 0 : cachedResponse.__feedback__) ? cachedResponse.__feedback__ === mergedLabels.approvedMessage ? mergedLabels.approvedMessage : mergedLabels.rejectedMessage : mergedLabels.feedbackSubmittedMessage,
2878
+ className: completedFeedbackClassName
2879
+ }
2880
+ );
2881
+ }
2882
+ if (status === "inProgress" || status === "executing") {
2883
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
2884
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2885
+ FeedbackButton,
2886
+ {
2887
+ label: mergedLabels.approveLabel,
2888
+ onClick: () => {
2889
+ setIsExpanded(false);
2890
+ onRespond == null ? void 0 : onRespond(mergedLabels.approveLabel);
2891
+ useResponseCache.setResponse(response.id, __spreadProps(__spreadValues({}, response), {
2892
+ __feedback__: mergedLabels.approvedMessage
2893
+ }));
2894
+ },
2895
+ className: buttonClassName
2896
+ }
2897
+ ),
2898
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2899
+ FeedbackButton,
2900
+ {
2901
+ label: mergedLabels.rejectLabel,
2902
+ onClick: () => {
2903
+ setIsExpanded(false);
2904
+ useResponseCache.setResponse(response.id, __spreadProps(__spreadValues({}, response), {
2905
+ __feedback__: mergedLabels.rejectedMessage
2906
+ }));
2907
+ onRespond == null ? void 0 : onRespond(mergedLabels.rejectLabel);
2908
+ },
2909
+ className: buttonClassName
2910
+ }
2911
+ )
2912
+ ] });
2913
+ }
2914
+ return null;
2915
+ };
2916
+ const ExpandIcon = (icons == null ? void 0 : icons.expand) || DefaultExpandIcon;
2917
+ const CollapseIcon = (icons == null ? void 0 : icons.collapse) || DefaultCollapseIcon;
2918
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className, children: [
2919
+ isExpanded && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ContentRenderer, { content: response.content, className: contentClassName }),
2920
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: actionsClassName, children: [
2921
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "copilotkit-response-label", children: [
2922
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("button", { onClick: () => setIsExpanded(!isExpanded), className: "copilotkit-toggle-button", children: isExpanded ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(CollapseIcon, { className: "copilotkit-icon" }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ExpandIcon, { className: "copilotkit-icon" }) }),
2923
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: mergedLabels.responseLabel })
2924
+ ] }),
2925
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "copilotkit-response-buttons", children: renderFeedback() })
2926
+ ] })
2927
+ ] });
2928
+ };
2929
+
2930
+ // src/components/crew/DefaultStateRenderer.tsx
2931
+ var import_react16 = require("react");
2932
+ var import_jsx_runtime28 = require("react/jsx-runtime");
2933
+ var DefaultExpandIcon2 = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
2934
+ "svg",
2935
+ {
2936
+ className,
2937
+ width: "16",
2938
+ height: "16",
2939
+ viewBox: "0 0 24 24",
2940
+ fill: "none",
2941
+ stroke: "currentColor",
2942
+ strokeWidth: "2",
2943
+ strokeLinecap: "round",
2944
+ strokeLinejoin: "round",
2945
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("polyline", { points: "6 9 12 15 18 9" })
2946
+ }
2947
+ );
2948
+ var DefaultCollapseIcon2 = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
2949
+ "svg",
2950
+ {
2951
+ className,
2952
+ width: "16",
2953
+ height: "16",
2954
+ viewBox: "0 0 24 24",
2955
+ fill: "none",
2956
+ stroke: "currentColor",
2957
+ strokeWidth: "2",
2958
+ strokeLinecap: "round",
2959
+ strokeLinejoin: "round",
2960
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("polyline", { points: "18 15 12 9 6 15" })
2961
+ }
2962
+ );
2963
+ var DefaultLoaderIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
2964
+ "svg",
2965
+ {
2966
+ className: `${className} copilotkit-spinner`,
2967
+ width: "16",
2968
+ height: "16",
2969
+ viewBox: "0 0 24 24",
2970
+ fill: "none",
2971
+ stroke: "currentColor",
2972
+ strokeWidth: "2",
2973
+ strokeLinecap: "round",
2974
+ strokeLinejoin: "round",
2975
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
2976
+ }
2977
+ );
2978
+ var formatContent = (result) => {
2979
+ if (result === null || result === void 0)
2980
+ return "";
2981
+ return typeof result === "string" ? result : JSON.stringify(result, null, 2);
2982
+ };
2983
+ var DefaultSkeletonLoader = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: className || "copilotkit-skeleton", children: [
2984
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "copilotkit-skeleton-header", children: [
2985
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-skeleton-title" }),
2986
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-skeleton-subtitle" })
2987
+ ] }),
2988
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-skeleton-content" })
2989
+ ] });
2990
+ var DefaultStateItemRenderer = ({
2991
+ item,
2992
+ isNewest,
2993
+ className
2994
+ }) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
2995
+ "div",
2996
+ {
2997
+ className: `${className || "copilotkit-state-item"} ${isNewest ? "copilotkit-state-item-newest" : ""}`,
2998
+ children: [
2999
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-item-header", children: "tool" in item ? item.tool : item.name }),
3000
+ "thought" in item && item.thought && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-item-thought", children: item.thought }),
3001
+ "result" in item && item.result !== void 0 && item.result !== null && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-item-result", children: formatContent(item.result) }),
3002
+ "description" in item && item.description && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-item-description", children: item.description })
3003
+ ]
3004
+ }
3005
+ );
3006
+ var DefaultStateRenderer = ({
3007
+ state,
3008
+ status,
3009
+ StateItemRenderer = DefaultStateItemRenderer,
3010
+ SkeletonLoader = DefaultSkeletonLoader,
3011
+ labels,
3012
+ icons,
3013
+ className = "copilotkit-state",
3014
+ contentClassName = "copilotkit-state-content",
3015
+ itemClassName = "copilotkit-state-item",
3016
+ maxHeight = "250px",
3017
+ defaultCollapsed = true
3018
+ }) => {
3019
+ const [isCollapsed, setIsCollapsed] = (0, import_react16.useState)(defaultCollapsed);
3020
+ const contentRef = (0, import_react16.useRef)(null);
3021
+ const prevItemsLengthRef = (0, import_react16.useRef)(0);
3022
+ const [newestItemId, setNewestItemId] = (0, import_react16.useState)(null);
3023
+ const defaultLabels = {
3024
+ inProgressLabel: "Analyzing",
3025
+ completeLabel: "Analyzed",
3026
+ emptyLabel: "No activity"
3027
+ };
3028
+ const mergedLabels = __spreadValues(__spreadValues({}, defaultLabels), labels);
3029
+ const ExpandIcon = (icons == null ? void 0 : icons.expand) || DefaultExpandIcon2;
3030
+ const CollapseIcon = (icons == null ? void 0 : icons.collapse) || DefaultCollapseIcon2;
3031
+ const items = (0, import_react16.useMemo)(() => {
3032
+ var _a;
3033
+ return state ? [...((_a = state.steps) == null ? void 0 : _a.filter((s) => s.tool)) || [], ...state.tasks || []].sort(
3034
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()
3035
+ ) : [];
3036
+ }, [state]);
3037
+ const isThinking = status === "inProgress" && items.length === 0;
3038
+ (0, import_react16.useEffect)(() => {
3039
+ if (!state)
3040
+ return;
3041
+ if (items.length > prevItemsLengthRef.current) {
3042
+ if (items.length > 0) {
3043
+ const newest = items[items.length - 1];
3044
+ setNewestItemId(newest.id);
3045
+ setTimeout(() => {
3046
+ setNewestItemId(null);
3047
+ }, 1500);
3048
+ }
3049
+ if (contentRef.current && !isCollapsed) {
3050
+ contentRef.current.scrollTop = contentRef.current.scrollHeight;
3051
+ }
3052
+ }
3053
+ prevItemsLengthRef.current = items.length;
3054
+ }, [items, isCollapsed, state]);
3055
+ if (!state) {
3056
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(DefaultLoaderIcon, { className: "copilotkit-loader" }) });
3057
+ }
3058
+ if (isCollapsed && items.length === 0 && !isThinking)
3059
+ return null;
3060
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className, children: [
3061
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "copilotkit-state-header", onClick: () => setIsCollapsed(!isCollapsed), children: [
3062
+ isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ExpandIcon, { className: "copilotkit-icon" }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(CollapseIcon, { className: "copilotkit-icon" }),
3063
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-label", children: status === "inProgress" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "copilotkit-state-label-loading", children: mergedLabels.inProgressLabel }) : mergedLabels.completeLabel })
3064
+ ] }),
3065
+ !isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { ref: contentRef, className: contentClassName, style: { maxHeight }, children: items.length > 0 ? items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3066
+ StateItemRenderer,
3067
+ {
3068
+ item,
3069
+ isNewest: item.id === newestItemId,
3070
+ className: itemClassName
3071
+ },
3072
+ item.id
3073
+ )) : isThinking ? (
3074
+ // Show skeleton loader while thinking
3075
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
3076
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SkeletonLoader, {}),
3077
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SkeletonLoader, {})
3078
+ ] })
3079
+ ) : (
3080
+ // Empty state
3081
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "copilotkit-state-empty", children: mergedLabels.emptyLabel })
3082
+ ) })
3083
+ ] });
3084
+ };
3085
+
3086
+ // src/hooks/use-copilot-chat-suggestions.tsx
3087
+ var import_react17 = require("react");
2801
3088
  var import_react_core11 = require("@copilotkit/react-core");
2802
3089
  var import_shared4 = require("@copilotkit/shared");
2803
3090
  function useCopilotChatSuggestions({
@@ -2808,7 +3095,7 @@ function useCopilotChatSuggestions({
2808
3095
  maxSuggestions = 3
2809
3096
  }, dependencies = []) {
2810
3097
  const context = (0, import_react_core11.useCopilotContext)();
2811
- (0, import_react15.useEffect)(() => {
3098
+ (0, import_react17.useEffect)(() => {
2812
3099
  if (available === "disabled")
2813
3100
  return;
2814
3101
  const id = (0, import_shared4.randomId)();
@@ -2830,8 +3117,11 @@ function useCopilotChatSuggestions({
2830
3117
  CopilotDevConsole,
2831
3118
  CopilotPopup,
2832
3119
  CopilotSidebar,
3120
+ DefaultResponseRenderer,
3121
+ DefaultStateRenderer,
2833
3122
  Markdown,
2834
3123
  UserMessage,
3124
+ createResponseCache,
2835
3125
  shouldShowDevConsole,
2836
3126
  useChatContext,
2837
3127
  useCopilotChatSuggestions