@copilotkit/react-core 1.4.8-no-pino-redact.1 → 1.5.0-coagents-v0-3.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 (141) hide show
  1. package/CHANGELOG.md +22 -3
  2. package/dist/{chunk-JHEAUB3Z.mjs → chunk-35EN6BG4.mjs} +2 -2
  3. package/dist/{chunk-JHEAUB3Z.mjs.map → chunk-35EN6BG4.mjs.map} +1 -1
  4. package/dist/{chunk-O22KGHOQ.mjs → chunk-42N5VKIX.mjs} +38 -16
  5. package/dist/chunk-42N5VKIX.mjs.map +1 -0
  6. package/dist/{chunk-AG7FH7OD.mjs → chunk-5FYKUKG3.mjs} +2 -2
  7. package/dist/{chunk-ODN4H66E.mjs → chunk-7LRDVJH5.mjs} +6 -2
  8. package/dist/chunk-7LRDVJH5.mjs.map +1 -0
  9. package/dist/{chunk-Y7MI4PBB.mjs → chunk-ALR5W5JK.mjs} +22 -10
  10. package/dist/chunk-ALR5W5JK.mjs.map +1 -0
  11. package/dist/{chunk-XBVKTDXP.mjs → chunk-BT6WK2JZ.mjs} +57 -17
  12. package/dist/chunk-BT6WK2JZ.mjs.map +1 -0
  13. package/dist/chunk-QCUP6HLK.mjs +37 -0
  14. package/dist/chunk-QCUP6HLK.mjs.map +1 -0
  15. package/dist/chunk-QTDCEDOC.mjs +392 -0
  16. package/dist/chunk-QTDCEDOC.mjs.map +1 -0
  17. package/dist/{chunk-OT67R4NB.mjs → chunk-QX6V774L.mjs} +6 -8
  18. package/dist/chunk-QX6V774L.mjs.map +1 -0
  19. package/dist/{chunk-2KCEHGSI.mjs → chunk-SFPANIOY.mjs} +99 -49
  20. package/dist/chunk-SFPANIOY.mjs.map +1 -0
  21. package/dist/{chunk-XQFVXX6R.mjs → chunk-TQN3EZWQ.mjs} +10 -2
  22. package/dist/chunk-TQN3EZWQ.mjs.map +1 -0
  23. package/dist/{chunk-UOVONDR6.mjs → chunk-V3PFWGIY.mjs} +2 -2
  24. package/dist/{chunk-DHGXL5PC.mjs → chunk-VMP6JWBB.mjs} +18 -6
  25. package/dist/chunk-VMP6JWBB.mjs.map +1 -0
  26. package/dist/chunk-XERJQUHA.mjs +31 -0
  27. package/dist/chunk-XERJQUHA.mjs.map +1 -0
  28. package/dist/components/copilot-provider/copilotkit.js +175 -93
  29. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  30. package/dist/components/copilot-provider/copilotkit.mjs +5 -4
  31. package/dist/components/copilot-provider/index.js +175 -93
  32. package/dist/components/copilot-provider/index.js.map +1 -1
  33. package/dist/components/copilot-provider/index.mjs +5 -4
  34. package/dist/components/error-boundary/error-boundary.d.ts +22 -0
  35. package/dist/components/error-boundary/error-boundary.js +183 -0
  36. package/dist/components/error-boundary/error-boundary.js.map +1 -0
  37. package/dist/components/error-boundary/error-boundary.mjs +12 -0
  38. package/dist/components/error-boundary/error-boundary.mjs.map +1 -0
  39. package/dist/components/error-boundary/error-utils.d.ts +11 -0
  40. package/dist/components/error-boundary/error-utils.js +177 -0
  41. package/dist/components/error-boundary/error-utils.js.map +1 -0
  42. package/dist/components/error-boundary/error-utils.mjs +13 -0
  43. package/dist/components/error-boundary/error-utils.mjs.map +1 -0
  44. package/dist/components/index.js +175 -93
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/index.mjs +5 -4
  47. package/dist/components/toast/toast-provider.d.ts +2 -1
  48. package/dist/components/toast/toast-provider.js +76 -62
  49. package/dist/components/toast/toast-provider.js.map +1 -1
  50. package/dist/components/toast/toast-provider.mjs +1 -1
  51. package/dist/context/copilot-context.d.ts +8 -2
  52. package/dist/context/copilot-context.js +9 -1
  53. package/dist/context/copilot-context.js.map +1 -1
  54. package/dist/context/copilot-context.mjs +1 -1
  55. package/dist/context/index.d.ts +1 -1
  56. package/dist/context/index.js +9 -1
  57. package/dist/context/index.js.map +1 -1
  58. package/dist/context/index.mjs +1 -1
  59. package/dist/hooks/index.d.ts +2 -1
  60. package/dist/hooks/index.js +584 -270
  61. package/dist/hooks/index.js.map +1 -1
  62. package/dist/hooks/index.mjs +19 -11
  63. package/dist/hooks/use-chat.d.ts +20 -0
  64. package/dist/hooks/use-chat.js +438 -200
  65. package/dist/hooks/use-chat.js.map +1 -1
  66. package/dist/hooks/use-chat.mjs +4 -3
  67. package/dist/hooks/use-coagent-state-render.d.ts +2 -2
  68. package/dist/hooks/use-coagent-state-render.js +9 -1
  69. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  70. package/dist/hooks/use-coagent-state-render.mjs +2 -2
  71. package/dist/hooks/use-coagent.d.ts +14 -1
  72. package/dist/hooks/use-coagent.js +547 -242
  73. package/dist/hooks/use-coagent.js.map +1 -1
  74. package/dist/hooks/use-coagent.mjs +15 -7
  75. package/dist/hooks/use-copilot-action.d.ts +12 -2
  76. package/dist/hooks/use-copilot-action.js +156 -14
  77. package/dist/hooks/use-copilot-action.js.map +1 -1
  78. package/dist/hooks/use-copilot-action.mjs +4 -2
  79. package/dist/hooks/use-copilot-chat.d.ts +1 -0
  80. package/dist/hooks/use-copilot-chat.js +514 -231
  81. package/dist/hooks/use-copilot-chat.js.map +1 -1
  82. package/dist/hooks/use-copilot-chat.mjs +8 -6
  83. package/dist/hooks/use-copilot-readable.js +9 -1
  84. package/dist/hooks/use-copilot-readable.js.map +1 -1
  85. package/dist/hooks/use-copilot-readable.mjs +2 -2
  86. package/dist/hooks/use-copilot-runtime-client.js +110 -4
  87. package/dist/hooks/use-copilot-runtime-client.js.map +1 -1
  88. package/dist/hooks/use-copilot-runtime-client.mjs +2 -2
  89. package/dist/hooks/use-make-copilot-document-readable.js +9 -1
  90. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  91. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.js +642 -363
  94. package/dist/index.js.map +1 -1
  95. package/dist/index.mjs +20 -12
  96. package/dist/lib/copilot-task.d.ts +1 -1
  97. package/dist/lib/copilot-task.js +33 -13
  98. package/dist/lib/copilot-task.js.map +1 -1
  99. package/dist/lib/copilot-task.mjs +7 -5
  100. package/dist/lib/index.d.ts +1 -1
  101. package/dist/lib/index.js +33 -13
  102. package/dist/lib/index.js.map +1 -1
  103. package/dist/lib/index.mjs +7 -5
  104. package/dist/types/frontend-action.d.ts +21 -2
  105. package/dist/types/frontend-action.js +34 -0
  106. package/dist/types/frontend-action.js.map +1 -1
  107. package/dist/types/frontend-action.mjs +7 -0
  108. package/dist/types/index.d.ts +2 -1
  109. package/dist/types/index.js.map +1 -1
  110. package/dist/utils/extract.js.map +1 -1
  111. package/dist/utils/extract.mjs +5 -4
  112. package/dist/utils/index.js.map +1 -1
  113. package/dist/utils/index.mjs +5 -4
  114. package/package.json +3 -3
  115. package/src/components/copilot-provider/copilotkit.tsx +14 -1
  116. package/src/components/error-boundary/error-boundary.tsx +42 -0
  117. package/src/components/error-boundary/error-utils.tsx +95 -0
  118. package/src/components/toast/toast-provider.tsx +10 -49
  119. package/src/context/copilot-context.tsx +30 -2
  120. package/src/hooks/index.ts +1 -1
  121. package/src/hooks/use-chat.ts +391 -256
  122. package/src/hooks/use-coagent-state-render.ts +2 -2
  123. package/src/hooks/use-coagent.ts +35 -15
  124. package/src/hooks/use-copilot-action.ts +41 -12
  125. package/src/hooks/use-copilot-chat.ts +52 -11
  126. package/src/hooks/use-copilot-runtime-client.ts +4 -0
  127. package/src/lib/copilot-task.ts +2 -8
  128. package/src/types/frontend-action.ts +55 -2
  129. package/src/types/index.ts +5 -1
  130. package/dist/chunk-2KCEHGSI.mjs.map +0 -1
  131. package/dist/chunk-DHGXL5PC.mjs.map +0 -1
  132. package/dist/chunk-EUIBVFV6.mjs +0 -294
  133. package/dist/chunk-EUIBVFV6.mjs.map +0 -1
  134. package/dist/chunk-O22KGHOQ.mjs.map +0 -1
  135. package/dist/chunk-ODN4H66E.mjs.map +0 -1
  136. package/dist/chunk-OT67R4NB.mjs.map +0 -1
  137. package/dist/chunk-XBVKTDXP.mjs.map +0 -1
  138. package/dist/chunk-XQFVXX6R.mjs.map +0 -1
  139. package/dist/chunk-Y7MI4PBB.mjs.map +0 -1
  140. /package/dist/{chunk-AG7FH7OD.mjs.map → chunk-5FYKUKG3.mjs.map} +0 -0
  141. /package/dist/{chunk-UOVONDR6.mjs.map → chunk-V3PFWGIY.mjs.map} +0 -0
@@ -79,6 +79,9 @@ var __async = (__this, __arguments, generator) => {
79
79
  // src/hooks/index.ts
80
80
  var hooks_exports = {};
81
81
  __export(hooks_exports, {
82
+ runAgent: () => runAgent,
83
+ startAgent: () => startAgent,
84
+ stopAgent: () => stopAgent,
82
85
  useCoAgent: () => useCoAgent,
83
86
  useCoAgentStateRender: () => useCoAgentStateRender,
84
87
  useCopilotAction: () => useCopilotAction,
@@ -90,7 +93,7 @@ __export(hooks_exports, {
90
93
  module.exports = __toCommonJS(hooks_exports);
91
94
 
92
95
  // src/hooks/use-copilot-chat.ts
93
- var import_react7 = require("react");
96
+ var import_react8 = require("react");
94
97
 
95
98
  // src/context/copilot-context.tsx
96
99
  var import_react = __toESM(require("react"));
@@ -146,7 +149,15 @@ var emptyCopilotContext = {
146
149
  },
147
150
  agentSession: null,
148
151
  setAgentSession: () => {
149
- }
152
+ },
153
+ agentLock: null,
154
+ threadId: null,
155
+ setThreadId: () => {
156
+ },
157
+ runId: null,
158
+ setRunId: () => {
159
+ },
160
+ chatAbortControllerRef: { current: null }
150
161
  };
151
162
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
152
163
  function useCopilotContext() {
@@ -162,19 +173,159 @@ function returnAndThrowInDebug(value) {
162
173
  }
163
174
 
164
175
  // src/hooks/use-copilot-chat.ts
165
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
176
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
166
177
 
167
178
  // src/hooks/use-chat.ts
168
- var import_react4 = require("react");
179
+ var import_react5 = require("react");
180
+ var import_shared2 = require("@copilotkit/shared");
181
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
182
+
183
+ // src/types/frontend-action.ts
184
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
169
185
  var import_shared = require("@copilotkit/shared");
170
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
186
+ function processActionsForRuntimeRequest(actions) {
187
+ const filteredActions = actions.filter(
188
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
189
+ ).map((action) => {
190
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
191
+ if (action.disabled) {
192
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
193
+ } else if (action.available === "disabled") {
194
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
195
+ } else if (action.available === "remote") {
196
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
197
+ }
198
+ return {
199
+ name: action.name,
200
+ description: action.description || "",
201
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
202
+ available
203
+ };
204
+ });
205
+ return filteredActions;
206
+ }
171
207
 
172
208
  // src/components/toast/toast-provider.tsx
209
+ var import_react3 = require("react");
210
+
211
+ // src/components/error-boundary/error-utils.tsx
173
212
  var import_react2 = require("react");
213
+
214
+ // src/components/toast/exclamation-mark-icon.tsx
174
215
  var import_jsx_runtime = require("react/jsx-runtime");
175
- var ToastContext = (0, import_react2.createContext)(void 0);
216
+ var ExclamationMarkIcon = ({
217
+ className,
218
+ style
219
+ }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
220
+ "svg",
221
+ {
222
+ xmlns: "http://www.w3.org/2000/svg",
223
+ width: "24",
224
+ height: "24",
225
+ viewBox: "0 0 24 24",
226
+ fill: "none",
227
+ stroke: "currentColor",
228
+ strokeWidth: "2",
229
+ strokeLinecap: "round",
230
+ strokeLinejoin: "round",
231
+ className: `lucide lucide-circle-alert ${className ? className : ""}`,
232
+ style,
233
+ children: [
234
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
235
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", x2: "12", y1: "8", y2: "12" }),
236
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", x2: "12.01", y1: "16", y2: "16" })
237
+ ]
238
+ }
239
+ );
240
+
241
+ // src/components/error-boundary/error-utils.tsx
242
+ var import_jsx_runtime2 = require("react/jsx-runtime");
243
+ function ErrorToast({ errors }) {
244
+ const errorsToRender = errors.map((error, idx) => {
245
+ var _a, _b, _c;
246
+ const message = "extensions" in error ? (_b = (_a = error.extensions) == null ? void 0 : _a.originalError) == null ? void 0 : _b.message : error.message;
247
+ const code = "extensions" in error ? (_c = error.extensions) == null ? void 0 : _c.code : null;
248
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
249
+ "div",
250
+ {
251
+ style: {
252
+ marginTop: idx === 0 ? 0 : 10,
253
+ marginBottom: 14
254
+ },
255
+ children: [
256
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ExclamationMarkIcon, { style: { marginBottom: 4 } }),
257
+ code && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
258
+ "div",
259
+ {
260
+ style: {
261
+ fontWeight: "600",
262
+ marginBottom: 4
263
+ },
264
+ children: [
265
+ "Copilot Cloud Error:",
266
+ " ",
267
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontFamily: "monospace", fontWeight: "normal" }, children: code })
268
+ ]
269
+ }
270
+ ),
271
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: message })
272
+ ]
273
+ },
274
+ idx
275
+ );
276
+ });
277
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
278
+ "div",
279
+ {
280
+ style: {
281
+ fontSize: "13px",
282
+ maxWidth: "600px"
283
+ },
284
+ children: [
285
+ errorsToRender,
286
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: "11px", opacity: 0.75 }, children: "NOTE: This error only displays during local development." })
287
+ ]
288
+ }
289
+ );
290
+ }
291
+ function useErrorToast() {
292
+ const { addToast } = useToast();
293
+ return (0, import_react2.useCallback)(
294
+ (error) => {
295
+ const errorId = error.map((err) => {
296
+ var _a, _b;
297
+ const message = "extensions" in err ? ((_b = (_a = err.extensions) == null ? void 0 : _a.originalError) == null ? void 0 : _b.message) || err.message : err.message;
298
+ const stack = err.stack || "";
299
+ return btoa(message + stack).slice(0, 32);
300
+ }).join("|");
301
+ addToast({
302
+ type: "error",
303
+ id: errorId,
304
+ // Toast libraries typically dedupe by id
305
+ message: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ErrorToast, { errors: error })
306
+ });
307
+ },
308
+ [addToast]
309
+ );
310
+ }
311
+ function useAsyncCallback(callback, deps) {
312
+ const addErrorToast = useErrorToast();
313
+ return (0, import_react2.useCallback)((...args) => __async(this, null, function* () {
314
+ try {
315
+ return yield callback(...args);
316
+ } catch (error) {
317
+ console.error("Error in async callback:", error);
318
+ addErrorToast([error]);
319
+ throw error;
320
+ }
321
+ }), deps);
322
+ }
323
+
324
+ // src/components/toast/toast-provider.tsx
325
+ var import_jsx_runtime3 = require("react/jsx-runtime");
326
+ var ToastContext = (0, import_react3.createContext)(void 0);
176
327
  function useToast() {
177
- const context = (0, import_react2.useContext)(ToastContext);
328
+ const context = (0, import_react3.useContext)(ToastContext);
178
329
  if (!context) {
179
330
  throw new Error("useToast must be used within a ToastProvider");
180
331
  }
@@ -182,15 +333,18 @@ function useToast() {
182
333
  }
183
334
 
184
335
  // src/hooks/use-copilot-runtime-client.ts
185
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
186
- var import_react3 = require("react");
336
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
337
+ var import_react4 = require("react");
187
338
  var useCopilotRuntimeClient = (options) => {
188
339
  const { addGraphQLErrorsToast } = useToast();
189
- const runtimeClient = (0, import_react3.useMemo)(() => {
190
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
340
+ const addErrorToast = useErrorToast();
341
+ const runtimeClient = (0, import_react4.useMemo)(() => {
342
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
191
343
  handleGQLErrors: (error) => {
192
344
  if (error.graphQLErrors.length) {
193
345
  addGraphQLErrorsToast(error.graphQLErrors);
346
+ } else {
347
+ addErrorToast([error]);
194
348
  }
195
349
  }
196
350
  }));
@@ -214,227 +368,305 @@ function useChat(options) {
214
368
  setCoagentStatesWithRef,
215
369
  coagentStatesRef,
216
370
  agentSession,
217
- setAgentSession
371
+ setAgentSession,
372
+ threadId,
373
+ setThreadId,
374
+ runId,
375
+ setRunId,
376
+ chatAbortControllerRef
218
377
  } = options;
219
- const abortControllerRef = (0, import_react4.useRef)();
220
- const threadIdRef = (0, import_react4.useRef)(null);
221
- const runIdRef = (0, import_react4.useRef)(null);
222
378
  const { addGraphQLErrorsToast } = useToast();
223
- const runChatCompletionRef = (0, import_react4.useRef)();
224
- const agentSessionRef = (0, import_react4.useRef)(agentSession);
379
+ const runChatCompletionRef = (0, import_react5.useRef)();
380
+ const agentSessionRef = (0, import_react5.useRef)(agentSession);
225
381
  agentSessionRef.current = agentSession;
382
+ const threadIdRef = (0, import_react5.useRef)(threadId);
383
+ threadIdRef.current = threadId;
384
+ const runIdRef = (0, import_react5.useRef)(runId);
385
+ runIdRef.current = runId;
226
386
  const publicApiKey = copilotConfig.publicApiKey;
227
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
387
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
228
388
  const runtimeClient = useCopilotRuntimeClient({
229
389
  url: copilotConfig.chatApiEndpoint,
230
390
  publicApiKey: copilotConfig.publicApiKey,
231
391
  headers,
232
392
  credentials: copilotConfig.credentials
233
393
  });
234
- const runChatCompletion = (previousMessages) => __async(this, null, function* () {
235
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
236
- setIsLoading(true);
237
- let newMessages = [
238
- new import_runtime_client_gql2.TextMessage({
239
- content: "",
240
- role: import_runtime_client_gql2.Role.Assistant
241
- })
242
- ];
243
- const abortController = new AbortController();
244
- abortControllerRef.current = abortController;
245
- setMessages([...previousMessages, ...newMessages]);
246
- const systemMessage = makeSystemMessageCallback();
247
- const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
248
- const stream = runtimeClient.asStream(
249
- runtimeClient.generateCopilotResponse({
250
- data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
251
- frontend: {
252
- actions: actions.filter(
253
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
254
- ).map((action) => {
255
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
256
- if (action.disabled) {
257
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
258
- } else if (action.available === "disabled") {
259
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
260
- } else if (action.available === "remote") {
261
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
262
- }
263
- return {
264
- name: action.name,
265
- description: action.description || "",
266
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
267
- available
268
- };
269
- }),
270
- url: window.location.href
271
- },
272
- threadId: threadIdRef.current,
273
- runId: runIdRef.current,
274
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
275
- }, copilotConfig.cloud ? {
276
- cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
277
- guardrails: {
278
- inputValidationRules: {
279
- allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
280
- denyList: copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics
394
+ const runChatCompletion = useAsyncCallback(
395
+ (previousMessages) => __async(this, null, function* () {
396
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
397
+ setIsLoading(true);
398
+ let newMessages = [
399
+ new import_runtime_client_gql3.TextMessage({
400
+ content: "",
401
+ role: import_runtime_client_gql3.Role.Assistant
402
+ })
403
+ ];
404
+ chatAbortControllerRef.current = new AbortController();
405
+ setMessages([...previousMessages, ...newMessages]);
406
+ const systemMessage = makeSystemMessageCallback();
407
+ const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
408
+ const isAgentRun = agentSessionRef.current !== null;
409
+ const stream = runtimeClient.asStream(
410
+ runtimeClient.generateCopilotResponse({
411
+ data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
412
+ frontend: {
413
+ actions: processActionsForRuntimeRequest(actions),
414
+ url: window.location.href
415
+ },
416
+ threadId: threadIdRef.current,
417
+ runId: runIdRef.current,
418
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
419
+ }, copilotConfig.cloud ? {
420
+ cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
421
+ guardrails: {
422
+ inputValidationRules: {
423
+ allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
424
+ denyList: copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics
425
+ }
281
426
  }
427
+ } : {})
428
+ } : {}), {
429
+ metadata: {
430
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
282
431
  }
283
- } : {})
284
- } : {}), {
285
- metadata: {
286
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
432
+ }), agentSessionRef.current ? {
433
+ agentSession: agentSessionRef.current
434
+ } : {}), {
435
+ agentStates: Object.values(coagentStatesRef.current).map((state) => ({
436
+ agentName: state.name,
437
+ state: JSON.stringify(state.state)
438
+ }))
439
+ }),
440
+ properties: copilotConfig.properties,
441
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
442
+ })
443
+ );
444
+ const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
445
+ const reader = stream.getReader();
446
+ let executedCoAgentStateRenders = [];
447
+ let followUp = void 0;
448
+ let messages2 = [];
449
+ let syncedMessages = [];
450
+ try {
451
+ while (true) {
452
+ let done, value;
453
+ try {
454
+ const readResult = yield reader.read();
455
+ done = readResult.done;
456
+ value = readResult.value;
457
+ } catch (readError) {
458
+ break;
287
459
  }
288
- }), agentSessionRef.current ? {
289
- agentSession: agentSessionRef.current
290
- } : {}), {
291
- agentStates: Object.values(coagentStatesRef.current).map((state) => ({
292
- agentName: state.name,
293
- state: JSON.stringify(state.state)
294
- }))
295
- }),
296
- properties: copilotConfig.properties,
297
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
298
- })
299
- );
300
- const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
301
- const reader = stream.getReader();
302
- let actionResults = {};
303
- let executedCoAgentStateRenders = [];
304
- let followUp = void 0;
305
- try {
306
- while (true) {
307
- let done, value;
308
- try {
309
- const readResult = yield reader.read();
310
- done = readResult.done;
311
- value = readResult.value;
312
- } catch (readError) {
313
- break;
314
- }
315
- if (done) {
316
- break;
317
- }
318
- if (!(value == null ? void 0 : value.generateCopilotResponse)) {
319
- continue;
320
- }
321
- threadIdRef.current = value.generateCopilotResponse.threadId || null;
322
- runIdRef.current = value.generateCopilotResponse.runId || null;
323
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
324
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
325
- );
326
- if (messages2.length === 0) {
327
- continue;
328
- }
329
- newMessages = [];
330
- if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
331
- newMessages = [
332
- new import_runtime_client_gql2.TextMessage({
333
- role: import_runtime_client_gql2.MessageRole.Assistant,
334
- content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
335
- })
336
- ];
337
- } else {
338
- for (const message of messages2) {
339
- newMessages.push(message);
340
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
341
- if (!(message.id in actionResults)) {
460
+ if (done) {
461
+ if (chatAbortControllerRef.current.signal.aborted) {
462
+ return [];
463
+ }
464
+ break;
465
+ }
466
+ if (!(value == null ? void 0 : value.generateCopilotResponse)) {
467
+ continue;
468
+ }
469
+ threadIdRef.current = value.generateCopilotResponse.threadId || null;
470
+ runIdRef.current = value.generateCopilotResponse.runId || null;
471
+ setThreadId(threadIdRef.current);
472
+ setRunId(runIdRef.current);
473
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
474
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
475
+ );
476
+ if (messages2.length === 0) {
477
+ continue;
478
+ }
479
+ newMessages = [];
480
+ if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
481
+ newMessages = [
482
+ new import_runtime_client_gql3.TextMessage({
483
+ role: import_runtime_client_gql3.MessageRole.Assistant,
484
+ content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
485
+ })
486
+ ];
487
+ setMessages([...previousMessages, ...newMessages]);
488
+ break;
489
+ } else {
490
+ newMessages = [...messages2];
491
+ for (const message of messages2) {
492
+ if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
342
493
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
343
494
  break;
344
495
  }
345
- try {
346
- setMessages([...previousMessages, ...newMessages]);
347
- const action = actions.find((action2) => action2.name === message.name);
348
- if (action) {
349
- followUp = action.followUp;
350
- }
351
- const result = yield onFunctionCall({
496
+ yield onCoAgentStateRender({
497
+ name: message.agentName,
498
+ nodeName: message.nodeName,
499
+ state: message.state
500
+ });
501
+ executedCoAgentStateRenders.push(message.id);
502
+ }
503
+ }
504
+ const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
505
+ if (lastAgentStateMessage) {
506
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
507
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
508
+ lastAgentStateMessage.state.messages
509
+ );
510
+ }
511
+ setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
512
+ [lastAgentStateMessage.agentName]: {
513
+ name: lastAgentStateMessage.agentName,
514
+ state: lastAgentStateMessage.state,
515
+ running: lastAgentStateMessage.running,
516
+ active: lastAgentStateMessage.active,
517
+ threadId: lastAgentStateMessage.threadId,
518
+ nodeName: lastAgentStateMessage.nodeName,
519
+ runId: lastAgentStateMessage.runId
520
+ }
521
+ }));
522
+ if (lastAgentStateMessage.running) {
523
+ setAgentSession({
524
+ threadId: lastAgentStateMessage.threadId,
525
+ agentName: lastAgentStateMessage.agentName,
526
+ nodeName: lastAgentStateMessage.nodeName
527
+ });
528
+ } else {
529
+ setAgentSession(null);
530
+ }
531
+ }
532
+ }
533
+ if (newMessages.length > 0) {
534
+ setMessages([...previousMessages, ...newMessages]);
535
+ }
536
+ }
537
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
538
+ let didExecuteAction = false;
539
+ if (onFunctionCall) {
540
+ const lastMessages = [];
541
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
542
+ const message = finalMessages[i];
543
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
544
+ lastMessages.unshift(message);
545
+ } else {
546
+ break;
547
+ }
548
+ }
549
+ for (const message of lastMessages) {
550
+ setMessages(finalMessages);
551
+ const action = actions.find((action2) => action2.name === message.name);
552
+ if (action) {
553
+ followUp = action.followUp;
554
+ let result;
555
+ try {
556
+ result = yield Promise.race([
557
+ onFunctionCall({
352
558
  messages: previousMessages,
353
559
  name: message.name,
354
560
  args: message.arguments
355
- });
356
- actionResults[message.id] = result;
357
- } catch (e) {
358
- actionResults[message.id] = `Failed to execute action ${message.name}`;
359
- console.error(`Failed to execute action ${message.name}: ${e}`);
360
- }
561
+ }),
562
+ new Promise(
563
+ (resolve) => {
564
+ var _a2;
565
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
566
+ "abort",
567
+ () => resolve("Operation was aborted by the user")
568
+ );
569
+ }
570
+ ),
571
+ // if the user stopped generation, we also abort consecutive actions
572
+ new Promise((resolve) => {
573
+ var _a2;
574
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
575
+ resolve("Operation was aborted by the user");
576
+ }
577
+ })
578
+ ]);
579
+ } catch (e) {
580
+ result = `Failed to execute action ${message.name}`;
581
+ console.error(`Failed to execute action ${message.name}: ${e}`);
361
582
  }
362
- newMessages.push(
363
- new import_runtime_client_gql2.ResultMessage({
364
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
583
+ didExecuteAction = true;
584
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
585
+ finalMessages.splice(
586
+ messageIndex + 1,
587
+ 0,
588
+ new import_runtime_client_gql3.ResultMessage({
589
+ id: "result-" + message.id,
590
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
365
591
  actionExecutionId: message.id,
366
592
  actionName: message.name
367
593
  })
368
594
  );
369
595
  }
370
- if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
371
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
372
- break;
373
- }
374
- yield onCoAgentStateRender({
375
- name: message.agentName,
376
- nodeName: message.nodeName,
377
- state: message.state
378
- });
379
- executedCoAgentStateRenders.push(message.id);
380
- }
381
596
  }
382
- const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
383
- if (lastAgentStateMessage) {
384
- setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
385
- [lastAgentStateMessage.agentName]: {
386
- name: lastAgentStateMessage.agentName,
387
- state: lastAgentStateMessage.state,
388
- running: lastAgentStateMessage.running,
389
- active: lastAgentStateMessage.active,
390
- threadId: lastAgentStateMessage.threadId,
391
- nodeName: lastAgentStateMessage.nodeName,
392
- runId: lastAgentStateMessage.runId
393
- }
394
- }));
395
- if (lastAgentStateMessage.running) {
396
- setAgentSession({
397
- threadId: lastAgentStateMessage.threadId,
398
- agentName: lastAgentStateMessage.agentName,
399
- nodeName: lastAgentStateMessage.nodeName
400
- });
401
- } else {
402
- setAgentSession(null);
597
+ setMessages(finalMessages);
598
+ }
599
+ if (
600
+ // if followUp is not explicitly false
601
+ followUp !== false && // and we executed an action
602
+ (didExecuteAction || // the last message is a server side result
603
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
604
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
605
+ ) {
606
+ yield new Promise((resolve) => setTimeout(resolve, 10));
607
+ return yield runChatCompletionRef.current(finalMessages);
608
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
609
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
610
+ if (message.isActionExecutionMessage()) {
611
+ return finalMessages.find(
612
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
613
+ );
403
614
  }
615
+ return true;
616
+ });
617
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
618
+ setMessages(repairedMessages);
619
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
620
+ setAgentSession({
621
+ threadId: agentSessionRef.current.threadId,
622
+ agentName: agentSessionRef.current.agentName,
623
+ nodeName: "__end__"
624
+ });
404
625
  }
626
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
627
+ } else {
628
+ return newMessages.slice();
405
629
  }
406
- if (newMessages.length > 0) {
407
- setMessages([...previousMessages, ...newMessages]);
408
- }
409
- }
410
- if (
411
- // if followUp is not explicitly false
412
- followUp !== false && // if we have client side results
413
- (Object.values(actionResults).length || // or the last message we received is a result
414
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
415
- ) {
416
- yield new Promise((resolve) => setTimeout(resolve, 10));
417
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
418
- } else {
419
- return newMessages.slice();
630
+ } finally {
631
+ setIsLoading(false);
420
632
  }
421
- } finally {
422
- setIsLoading(false);
423
- }
424
- });
633
+ }),
634
+ [
635
+ messages,
636
+ setMessages,
637
+ makeSystemMessageCallback,
638
+ copilotConfig,
639
+ setIsLoading,
640
+ initialMessages,
641
+ isLoading,
642
+ actions,
643
+ onFunctionCall,
644
+ onCoAgentStateRender,
645
+ setCoagentStatesWithRef,
646
+ coagentStatesRef,
647
+ agentSession,
648
+ setAgentSession
649
+ ]
650
+ );
425
651
  runChatCompletionRef.current = runChatCompletion;
426
- const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
427
- yield runChatCompletionRef.current(messages2);
428
- });
429
- const append = (message) => __async(this, null, function* () {
430
- if (isLoading) {
431
- return;
432
- }
433
- const newMessages = [...messages, message];
434
- setMessages(newMessages);
435
- return runChatCompletionAndHandleFunctionCall(newMessages);
436
- });
437
- const reload = () => __async(this, null, function* () {
652
+ const runChatCompletionAndHandleFunctionCall = useAsyncCallback(
653
+ (messages2) => __async(this, null, function* () {
654
+ yield runChatCompletionRef.current(messages2);
655
+ }),
656
+ [messages]
657
+ );
658
+ const append = useAsyncCallback(
659
+ (message) => __async(this, null, function* () {
660
+ if (isLoading) {
661
+ return;
662
+ }
663
+ const newMessages = [...messages, message];
664
+ setMessages(newMessages);
665
+ return runChatCompletionAndHandleFunctionCall(newMessages);
666
+ }),
667
+ [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]
668
+ );
669
+ const reload = useAsyncCallback(() => __async(this, null, function* () {
438
670
  if (isLoading || messages.length === 0) {
439
671
  return;
440
672
  }
@@ -445,10 +677,10 @@ function useChat(options) {
445
677
  }
446
678
  setMessages(newMessages);
447
679
  return runChatCompletionAndHandleFunctionCall(newMessages);
448
- });
680
+ }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
449
681
  const stop = () => {
450
682
  var _a;
451
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
683
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
452
684
  };
453
685
  return {
454
686
  append,
@@ -457,21 +689,38 @@ function useChat(options) {
457
689
  runChatCompletion: () => runChatCompletionRef.current(messages)
458
690
  };
459
691
  }
692
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
693
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
694
+ if (syncedMessages.length > 0) {
695
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
696
+ let previousMessageId = void 0;
697
+ for (const message of messagesWithAgentState) {
698
+ if (message.isAgentStateMessage()) {
699
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
700
+ if (index !== -1) {
701
+ finalMessages.splice(index + 1, 0, message);
702
+ }
703
+ }
704
+ previousMessageId = message.id;
705
+ }
706
+ }
707
+ return finalMessages;
708
+ }
460
709
 
461
710
  // src/components/copilot-provider/copilotkit.tsx
462
- var import_react6 = require("react");
711
+ var import_react7 = require("react");
463
712
  var import_react_dom = require("react-dom");
464
- var import_shared2 = require("@copilotkit/shared");
713
+ var import_shared3 = require("@copilotkit/shared");
465
714
 
466
715
  // src/context/copilot-messages-context.tsx
467
- var import_react5 = __toESM(require("react"));
716
+ var import_react6 = __toESM(require("react"));
468
717
  var emptyCopilotContext2 = {
469
718
  messages: [],
470
719
  setMessages: () => []
471
720
  };
472
- var CopilotMessagesContext = import_react5.default.createContext(emptyCopilotContext2);
721
+ var CopilotMessagesContext = import_react6.default.createContext(emptyCopilotContext2);
473
722
  function useCopilotMessagesContext() {
474
- const context = import_react5.default.useContext(CopilotMessagesContext);
723
+ const context = import_react6.default.useContext(CopilotMessagesContext);
475
724
  if (context === emptyCopilotContext2) {
476
725
  throw new Error(
477
726
  "A messages consuming component was not wrapped with `<CopilotMessages> {...} </CopilotMessages>`"
@@ -481,7 +730,7 @@ function useCopilotMessagesContext() {
481
730
  }
482
731
 
483
732
  // src/components/copilot-provider/copilotkit.tsx
484
- var import_jsx_runtime2 = require("react/jsx-runtime");
733
+ var import_jsx_runtime4 = require("react/jsx-runtime");
485
734
  var defaultCopilotContextCategories = ["global"];
486
735
 
487
736
  // src/hooks/use-copilot-chat.ts
@@ -503,25 +752,31 @@ function useCopilotChat(_a = {}) {
503
752
  setCoagentStatesWithRef,
504
753
  coAgentStateRenders,
505
754
  agentSession,
506
- setAgentSession
755
+ setAgentSession,
756
+ agentLock,
757
+ threadId,
758
+ setThreadId,
759
+ runId,
760
+ setRunId,
761
+ chatAbortControllerRef
507
762
  } = useCopilotContext();
508
763
  const { messages, setMessages } = useCopilotMessagesContext();
509
764
  const latestGetContextString = useUpdatedRef(getContextString);
510
- const deleteMessage = (0, import_react7.useCallback)(
765
+ const deleteMessage = (0, import_react8.useCallback)(
511
766
  (messageId) => {
512
767
  setMessages((prev) => prev.filter((message) => message.id !== messageId));
513
768
  },
514
769
  [setMessages]
515
770
  );
516
- const makeSystemMessageCallback = (0, import_react7.useCallback)(() => {
771
+ const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
517
772
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
518
773
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
519
- return new import_runtime_client_gql3.TextMessage({
774
+ return new import_runtime_client_gql4.TextMessage({
520
775
  content: systemMessageMaker(contextString, chatInstructions),
521
- role: import_runtime_client_gql3.Role.System
776
+ role: import_runtime_client_gql4.Role.System
522
777
  });
523
778
  }, [getContextString, makeSystemMessage, chatInstructions]);
524
- const onCoAgentStateRender = (0, import_react7.useCallback)(
779
+ const onCoAgentStateRender = useAsyncCallback(
525
780
  (args) => __async(this, null, function* () {
526
781
  var _a2;
527
782
  const { name, nodeName, state } = args;
@@ -553,55 +808,86 @@ function useCopilotChat(_a = {}) {
553
808
  coagentStatesRef,
554
809
  setCoagentStatesWithRef,
555
810
  agentSession,
556
- setAgentSession
811
+ setAgentSession,
812
+ threadId,
813
+ setThreadId,
814
+ runId,
815
+ setRunId,
816
+ chatAbortControllerRef
557
817
  }));
558
818
  const latestAppend = useUpdatedRef(append);
559
- const latestAppendFunc = (0, import_react7.useCallback)(
560
- (message) => {
561
- return latestAppend.current(message);
562
- },
819
+ const latestAppendFunc = useAsyncCallback(
820
+ (message) => __async(this, null, function* () {
821
+ return yield latestAppend.current(message);
822
+ }),
563
823
  [latestAppend]
564
824
  );
565
825
  const latestReload = useUpdatedRef(reload);
566
- const latestReloadFunc = (0, import_react7.useCallback)(() => {
567
- return latestReload.current();
568
- }, [latestReload]);
826
+ const latestReloadFunc = useAsyncCallback(() => __async(this, null, function* () {
827
+ return yield latestReload.current();
828
+ }), [latestReload]);
569
829
  const latestStop = useUpdatedRef(stop);
570
- const latestStopFunc = (0, import_react7.useCallback)(() => {
830
+ const latestStopFunc = (0, import_react8.useCallback)(() => {
571
831
  return latestStop.current();
572
832
  }, [latestStop]);
573
833
  const latestDelete = useUpdatedRef(deleteMessage);
574
- const latestDeleteFunc = (0, import_react7.useCallback)(
834
+ const latestDeleteFunc = (0, import_react8.useCallback)(
575
835
  (messageId) => {
576
836
  return latestDelete.current(messageId);
577
837
  },
578
838
  [latestDelete]
579
839
  );
580
840
  const latestSetMessages = useUpdatedRef(setMessages);
581
- const latestSetMessagesFunc = (0, import_react7.useCallback)(
841
+ const latestSetMessagesFunc = (0, import_react8.useCallback)(
582
842
  (messages2) => {
583
843
  return latestSetMessages.current(messages2);
584
844
  },
585
845
  [latestSetMessages]
586
846
  );
587
847
  const latestRunChatCompletion = useUpdatedRef(runChatCompletion);
588
- const latestRunChatCompletionFunc = (0, import_react7.useCallback)(() => {
589
- return latestRunChatCompletion.current();
590
- }, [latestRunChatCompletion]);
848
+ const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
849
+ return yield latestRunChatCompletion.current();
850
+ }), [latestRunChatCompletion]);
851
+ const reset = (0, import_react8.useCallback)(() => {
852
+ latestStopFunc();
853
+ setMessages([]);
854
+ setThreadId(null);
855
+ setRunId(null);
856
+ setCoagentStatesWithRef({});
857
+ let initialAgentSession = null;
858
+ if (agentLock) {
859
+ initialAgentSession = {
860
+ agentName: agentLock
861
+ };
862
+ }
863
+ setAgentSession(initialAgentSession);
864
+ }, [
865
+ latestStopFunc,
866
+ setMessages,
867
+ setThreadId,
868
+ setCoagentStatesWithRef,
869
+ setAgentSession,
870
+ agentLock
871
+ ]);
872
+ const latestReset = useUpdatedRef(reset);
873
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
874
+ return latestReset.current();
875
+ }, [latestReset]);
591
876
  return {
592
877
  visibleMessages: messages,
593
878
  appendMessage: latestAppendFunc,
594
879
  setMessages: latestSetMessagesFunc,
595
880
  reloadMessages: latestReloadFunc,
596
881
  stopGeneration: latestStopFunc,
882
+ reset: latestResetFunc,
597
883
  deleteMessage: latestDeleteFunc,
598
884
  runChatCompletion: latestRunChatCompletionFunc,
599
885
  isLoading
600
886
  };
601
887
  }
602
888
  function useUpdatedRef(value) {
603
- const ref = (0, import_react7.useRef)(value);
604
- (0, import_react7.useEffect)(() => {
889
+ const ref = (0, import_react8.useRef)(value);
890
+ (0, import_react8.useEffect)(() => {
605
891
  ref.current = value;
606
892
  }, [value]);
607
893
  return ref;
@@ -631,18 +917,22 @@ ${additionalInstructions}` : "");
631
917
  }
632
918
 
633
919
  // src/hooks/use-copilot-action.ts
634
- var import_shared3 = require("@copilotkit/shared");
635
- var import_react8 = require("react");
920
+ var import_shared4 = require("@copilotkit/shared");
921
+ var import_react9 = require("react");
636
922
  function useCopilotAction(action, dependencies) {
637
923
  const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
638
- const idRef = (0, import_react8.useRef)((0, import_shared3.randomId)());
639
- const renderAndWaitRef = (0, import_react8.useRef)(null);
924
+ const idRef = (0, import_react9.useRef)((0, import_shared4.randomId)());
925
+ const renderAndWaitRef = (0, import_react9.useRef)(null);
640
926
  action = __spreadValues({}, action);
641
- if (action.renderAndWait || action.renderAndWaitForResponse) {
927
+ if (
928
+ // renderAndWaitForResponse is not available for catch all actions
929
+ isFrontendAction(action) && // check if renderAndWaitForResponse is set
930
+ (action.renderAndWait || action.renderAndWaitForResponse)
931
+ ) {
642
932
  const renderAndWait = action.renderAndWait || action.renderAndWaitForResponse;
643
933
  action.renderAndWait = void 0;
644
934
  action.renderAndWaitForResponse = void 0;
645
- action.handler = () => __async(this, null, function* () {
935
+ action.handler = useAsyncCallback(() => __async(this, null, function* () {
646
936
  let resolve;
647
937
  let reject;
648
938
  const promise = new Promise((resolvePromise, rejectPromise) => {
@@ -651,7 +941,7 @@ function useCopilotAction(action, dependencies) {
651
941
  });
652
942
  renderAndWaitRef.current = { promise, resolve, reject };
653
943
  return yield promise;
654
- });
944
+ }), []);
655
945
  action.render = (props) => {
656
946
  const waitProps = {
657
947
  status: props.status,
@@ -671,12 +961,14 @@ function useCopilotAction(action, dependencies) {
671
961
  return renderAndWait(waitProps);
672
962
  }
673
963
  }
674
- return (0, import_react8.createElement)(import_react8.Fragment);
964
+ return (0, import_react9.createElement)(import_react9.Fragment);
675
965
  };
676
966
  }
677
967
  if (dependencies === void 0) {
678
968
  if (actions[idRef.current]) {
679
- actions[idRef.current].handler = action.handler;
969
+ if (isFrontendAction(action)) {
970
+ actions[idRef.current].handler = action.handler;
971
+ }
680
972
  if (typeof action.render === "function") {
681
973
  if (chatComponentsCache.current !== null) {
682
974
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -684,7 +976,7 @@ function useCopilotAction(action, dependencies) {
684
976
  }
685
977
  }
686
978
  }
687
- (0, import_react8.useEffect)(() => {
979
+ (0, import_react9.useEffect)(() => {
688
980
  setAction(idRef.current, action);
689
981
  if (chatComponentsCache.current !== null && action.render !== void 0) {
690
982
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -695,31 +987,34 @@ function useCopilotAction(action, dependencies) {
695
987
  }, [
696
988
  setAction,
697
989
  removeAction,
698
- action.description,
990
+ isFrontendAction(action) ? action.description : void 0,
699
991
  action.name,
700
- action.disabled,
701
- action.available,
992
+ isFrontendAction(action) ? action.disabled : void 0,
993
+ isFrontendAction(action) ? action.available : void 0,
702
994
  // This should be faster than deep equality checking
703
995
  // In addition, all major JS engines guarantee the order of object keys
704
- JSON.stringify(action.parameters),
996
+ JSON.stringify(isFrontendAction(action) ? action.parameters : []),
705
997
  // include render only if it's a string
706
998
  typeof action.render === "string" ? action.render : void 0,
707
999
  // dependencies set by the developer
708
1000
  ...dependencies || []
709
1001
  ]);
710
1002
  }
1003
+ function isFrontendAction(action) {
1004
+ return action.name !== "*";
1005
+ }
711
1006
 
712
1007
  // src/hooks/use-coagent-state-render.ts
713
- var import_react9 = require("react");
714
- var import_shared4 = require("@copilotkit/shared");
1008
+ var import_react10 = require("react");
1009
+ var import_shared5 = require("@copilotkit/shared");
715
1010
  function useCoAgentStateRender(action, dependencies) {
716
1011
  const {
717
1012
  setCoAgentStateRender,
718
1013
  removeCoAgentStateRender,
719
1014
  coAgentStateRenders,
720
1015
  chatComponentsCache
721
- } = (0, import_react9.useContext)(CopilotContext);
722
- const idRef = (0, import_react9.useRef)((0, import_shared4.randomId)());
1016
+ } = (0, import_react10.useContext)(CopilotContext);
1017
+ const idRef = (0, import_react10.useRef)((0, import_shared5.randomId)());
723
1018
  const key = `${action.name}-${action.nodeName || "global"}`;
724
1019
  if (dependencies === void 0) {
725
1020
  if (coAgentStateRenders[idRef.current]) {
@@ -731,7 +1026,7 @@ function useCoAgentStateRender(action, dependencies) {
731
1026
  }
732
1027
  }
733
1028
  }
734
- (0, import_react9.useEffect)(() => {
1029
+ (0, import_react10.useEffect)(() => {
735
1030
  setCoAgentStateRender(idRef.current, action);
736
1031
  if (chatComponentsCache.current !== null && action.render !== void 0) {
737
1032
  chatComponentsCache.current.coAgentStateRenders[key] = action.render;
@@ -751,11 +1046,11 @@ function useCoAgentStateRender(action, dependencies) {
751
1046
  }
752
1047
 
753
1048
  // src/hooks/use-make-copilot-document-readable.ts
754
- var import_react10 = require("react");
1049
+ var import_react11 = require("react");
755
1050
  function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
756
1051
  const { addDocumentContext, removeDocumentContext } = useCopilotContext();
757
- const idRef = (0, import_react10.useRef)();
758
- (0, import_react10.useEffect)(() => {
1052
+ const idRef = (0, import_react11.useRef)();
1053
+ (0, import_react11.useEffect)(() => {
759
1054
  const id = addDocumentContext(document, categories);
760
1055
  idRef.current = id;
761
1056
  return () => {
@@ -766,16 +1061,16 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
766
1061
  }
767
1062
 
768
1063
  // src/hooks/use-copilot-readable.ts
769
- var import_react11 = require("react");
1064
+ var import_react12 = require("react");
770
1065
  function convertToJSON(description, value) {
771
1066
  return `${description}: ${typeof value === "string" ? value : JSON.stringify(value)}`;
772
1067
  }
773
1068
  function useCopilotReadable({ description, value, parentId, categories, convert }, dependencies) {
774
1069
  const { addContext, removeContext } = useCopilotContext();
775
- const idRef = (0, import_react11.useRef)();
1070
+ const idRef = (0, import_react12.useRef)();
776
1071
  convert = convert || convertToJSON;
777
1072
  const information = convert(description, value);
778
- (0, import_react11.useEffect)(() => {
1073
+ (0, import_react12.useEffect)(() => {
779
1074
  const id = addContext(information, parentId, categories);
780
1075
  idRef.current = id;
781
1076
  return () => {
@@ -786,7 +1081,7 @@ function useCopilotReadable({ description, value, parentId, categories, convert
786
1081
  }
787
1082
 
788
1083
  // src/hooks/use-coagent.ts
789
- var import_react12 = require("react");
1084
+ var import_react13 = require("react");
790
1085
  function useCoAgent(options) {
791
1086
  const isExternalStateManagement = (options2) => {
792
1087
  return "state" in options2 && "setState" in options2;
@@ -826,28 +1121,33 @@ function useCoAgent(options) {
826
1121
  };
827
1122
  const coagentState = getCoagentState(coagentStates, name);
828
1123
  const state = isExternalStateManagement(options) ? options.state : coagentState.state;
829
- (0, import_react12.useEffect)(() => {
1124
+ (0, import_react13.useEffect)(() => {
830
1125
  if (isExternalStateManagement(options)) {
831
1126
  setState(options.state);
832
1127
  } else if (coagentStates[name] === void 0) {
833
1128
  setState(options.initialState === void 0 ? {} : options.initialState);
834
1129
  }
835
- }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
1130
+ }, [
1131
+ isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
1132
+ // reset initialstate on reset
1133
+ coagentStates[name] === void 0
1134
+ ]);
1135
+ const runAgentCallback = useAsyncCallback(
1136
+ (hint) => __async(this, null, function* () {
1137
+ yield runAgent(name, context, appendMessage, runChatCompletion, hint);
1138
+ }),
1139
+ [name, context, appendMessage, runChatCompletion]
1140
+ );
836
1141
  return {
837
1142
  name,
838
1143
  nodeName: coagentState.nodeName,
839
- state,
840
- setState,
1144
+ threadId: coagentState.threadId,
841
1145
  running: coagentState.running,
842
- start: () => {
843
- startAgent(name, context);
844
- },
845
- stop: () => {
846
- stopAgent(name, context);
847
- },
848
- run: (hint) => {
849
- return runAgent(name, context, appendMessage, runChatCompletion, hint);
850
- }
1146
+ state: coagentState.state,
1147
+ setState: isExternalStateManagement(options) ? options.setState : setState,
1148
+ start: () => startAgent(name, context),
1149
+ stop: () => stopAgent(name, context),
1150
+ run: runAgentCallback
851
1151
  };
852
1152
  }
853
1153
  function startAgent(name, context) {
@@ -860,6 +1160,17 @@ function stopAgent(name, context) {
860
1160
  const { agentSession, setAgentSession } = context;
861
1161
  if (agentSession && agentSession.agentName === name) {
862
1162
  setAgentSession(null);
1163
+ context.setCoagentStates((prevAgentStates) => {
1164
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
1165
+ [name]: __spreadProps(__spreadValues({}, prevAgentStates[name]), {
1166
+ running: false,
1167
+ active: false,
1168
+ threadId: void 0,
1169
+ nodeName: void 0,
1170
+ runId: void 0
1171
+ })
1172
+ });
1173
+ });
863
1174
  } else {
864
1175
  console.warn(`No agent session found for ${name}`);
865
1176
  }
@@ -895,6 +1206,9 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
895
1206
  }
896
1207
  // Annotate the CommonJS export names for ESM import in node:
897
1208
  0 && (module.exports = {
1209
+ runAgent,
1210
+ startAgent,
1211
+ stopAgent,
898
1212
  useCoAgent,
899
1213
  useCoAgentStateRender,
900
1214
  useCopilotAction,