@copilotkit/react-core 1.5.0-tyler-reset-chat.0 → 1.5.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 (140) hide show
  1. package/CHANGELOG.md +158 -4
  2. package/README.md +2 -0
  3. package/dist/{chunk-3AYELZJS.mjs → chunk-35EN6BG4.mjs} +2 -2
  4. package/dist/{chunk-3AYELZJS.mjs.map → chunk-35EN6BG4.mjs.map} +1 -1
  5. package/dist/{chunk-SEPYQHH7.mjs → chunk-42N5VKIX.mjs} +34 -28
  6. package/dist/chunk-42N5VKIX.mjs.map +1 -0
  7. package/dist/{chunk-USL3EHJB.mjs → chunk-5FYKUKG3.mjs} +2 -2
  8. package/dist/{chunk-ODN4H66E.mjs → chunk-7LRDVJH5.mjs} +6 -2
  9. package/dist/chunk-7LRDVJH5.mjs.map +1 -0
  10. package/dist/{chunk-CZMEZR6F.mjs → chunk-BT6WK2JZ.mjs} +34 -19
  11. package/dist/chunk-BT6WK2JZ.mjs.map +1 -0
  12. package/dist/{chunk-3R4J2TPH.mjs → chunk-EUU6NNYU.mjs} +29 -13
  13. package/dist/chunk-EUU6NNYU.mjs.map +1 -0
  14. package/dist/chunk-QCUP6HLK.mjs +37 -0
  15. package/dist/chunk-QCUP6HLK.mjs.map +1 -0
  16. package/dist/chunk-QTDCEDOC.mjs +392 -0
  17. package/dist/chunk-QTDCEDOC.mjs.map +1 -0
  18. package/dist/{chunk-JR55I3FL.mjs → chunk-QX6V774L.mjs} +6 -8
  19. package/dist/chunk-QX6V774L.mjs.map +1 -0
  20. package/dist/{chunk-2KCEHGSI.mjs → chunk-SFPANIOY.mjs} +99 -49
  21. package/dist/chunk-SFPANIOY.mjs.map +1 -0
  22. package/dist/{chunk-2JP64U3A.mjs → chunk-TQN3EZWQ.mjs} +4 -1
  23. package/dist/chunk-TQN3EZWQ.mjs.map +1 -0
  24. package/dist/{chunk-XUPO37VH.mjs → chunk-V3PFWGIY.mjs} +2 -2
  25. package/dist/{chunk-6QKA3SNN.mjs → chunk-VMP6JWBB.mjs} +21 -5
  26. package/dist/chunk-VMP6JWBB.mjs.map +1 -0
  27. package/dist/chunk-XERJQUHA.mjs +31 -0
  28. package/dist/chunk-XERJQUHA.mjs.map +1 -0
  29. package/dist/components/copilot-provider/copilotkit.js +173 -92
  30. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  31. package/dist/components/copilot-provider/copilotkit.mjs +5 -4
  32. package/dist/components/copilot-provider/index.js +173 -92
  33. package/dist/components/copilot-provider/index.js.map +1 -1
  34. package/dist/components/copilot-provider/index.mjs +5 -4
  35. package/dist/components/error-boundary/error-boundary.d.ts +22 -0
  36. package/dist/components/error-boundary/error-boundary.js +183 -0
  37. package/dist/components/error-boundary/error-boundary.js.map +1 -0
  38. package/dist/components/error-boundary/error-boundary.mjs +12 -0
  39. package/dist/components/error-boundary/error-boundary.mjs.map +1 -0
  40. package/dist/components/error-boundary/error-utils.d.ts +11 -0
  41. package/dist/components/error-boundary/error-utils.js +177 -0
  42. package/dist/components/error-boundary/error-utils.js.map +1 -0
  43. package/dist/components/error-boundary/error-utils.mjs +13 -0
  44. package/dist/components/error-boundary/error-utils.mjs.map +1 -0
  45. package/dist/components/index.js +173 -92
  46. package/dist/components/index.js.map +1 -1
  47. package/dist/components/index.mjs +5 -4
  48. package/dist/components/toast/toast-provider.d.ts +2 -1
  49. package/dist/components/toast/toast-provider.js +76 -62
  50. package/dist/components/toast/toast-provider.js.map +1 -1
  51. package/dist/components/toast/toast-provider.mjs +1 -1
  52. package/dist/context/copilot-context.d.ts +4 -2
  53. package/dist/context/copilot-context.js +3 -0
  54. package/dist/context/copilot-context.js.map +1 -1
  55. package/dist/context/copilot-context.mjs +1 -1
  56. package/dist/context/index.d.ts +1 -1
  57. package/dist/context/index.js +3 -0
  58. package/dist/context/index.js.map +1 -1
  59. package/dist/context/index.mjs +1 -1
  60. package/dist/hooks/index.js +554 -308
  61. package/dist/hooks/index.js.map +1 -1
  62. package/dist/hooks/index.mjs +13 -11
  63. package/dist/hooks/use-chat.d.ts +6 -2
  64. package/dist/hooks/use-chat.js +434 -219
  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 +3 -0
  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 +1 -1
  72. package/dist/hooks/use-coagent.js +510 -277
  73. package/dist/hooks/use-coagent.js.map +1 -1
  74. package/dist/hooks/use-coagent.mjs +9 -7
  75. package/dist/hooks/use-copilot-action.d.ts +12 -2
  76. package/dist/hooks/use-copilot-action.js +157 -16
  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 +483 -253
  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 +3 -0
  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 +3 -0
  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 +1 -1
  93. package/dist/index.js +616 -401
  94. package/dist/index.js.map +1 -1
  95. package/dist/index.mjs +14 -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 +5 -5
  115. package/src/components/copilot-provider/copilotkit.tsx +22 -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 +17 -2
  120. package/src/hooks/use-chat.ts +375 -279
  121. package/src/hooks/use-coagent-state-render.ts +2 -2
  122. package/src/hooks/use-coagent.ts +34 -28
  123. package/src/hooks/use-copilot-action.ts +50 -15
  124. package/src/hooks/use-copilot-chat.ts +28 -14
  125. package/src/hooks/use-copilot-runtime-client.ts +4 -0
  126. package/src/lib/copilot-task.ts +2 -8
  127. package/src/types/frontend-action.ts +55 -2
  128. package/src/types/index.ts +5 -1
  129. package/dist/chunk-2JP64U3A.mjs.map +0 -1
  130. package/dist/chunk-2KCEHGSI.mjs.map +0 -1
  131. package/dist/chunk-3R4J2TPH.mjs.map +0 -1
  132. package/dist/chunk-6EN7J4V2.mjs +0 -317
  133. package/dist/chunk-6EN7J4V2.mjs.map +0 -1
  134. package/dist/chunk-6QKA3SNN.mjs.map +0 -1
  135. package/dist/chunk-CZMEZR6F.mjs.map +0 -1
  136. package/dist/chunk-JR55I3FL.mjs.map +0 -1
  137. package/dist/chunk-ODN4H66E.mjs.map +0 -1
  138. package/dist/chunk-SEPYQHH7.mjs.map +0 -1
  139. /package/dist/{chunk-USL3EHJB.mjs.map → chunk-5FYKUKG3.mjs.map} +0 -0
  140. /package/dist/{chunk-XUPO37VH.mjs.map → chunk-V3PFWGIY.mjs.map} +0 -0
@@ -93,7 +93,7 @@ __export(hooks_exports, {
93
93
  module.exports = __toCommonJS(hooks_exports);
94
94
 
95
95
  // src/hooks/use-copilot-chat.ts
96
- var import_react7 = require("react");
96
+ var import_react8 = require("react");
97
97
 
98
98
  // src/context/copilot-context.tsx
99
99
  var import_react = __toESM(require("react"));
@@ -144,6 +144,9 @@ var emptyCopilotContext = {
144
144
  coagentStates: {},
145
145
  setCoagentStates: () => {
146
146
  },
147
+ coagentStatesRef: { current: {} },
148
+ setCoagentStatesWithRef: () => {
149
+ },
147
150
  agentSession: null,
148
151
  setAgentSession: () => {
149
152
  },
@@ -170,19 +173,159 @@ function returnAndThrowInDebug(value) {
170
173
  }
171
174
 
172
175
  // src/hooks/use-copilot-chat.ts
173
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
176
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
174
177
 
175
178
  // src/hooks/use-chat.ts
176
- 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");
177
185
  var import_shared = require("@copilotkit/shared");
178
- 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
+ }
179
207
 
180
208
  // src/components/toast/toast-provider.tsx
209
+ var import_react3 = require("react");
210
+
211
+ // src/components/error-boundary/error-utils.tsx
181
212
  var import_react2 = require("react");
213
+
214
+ // src/components/toast/exclamation-mark-icon.tsx
182
215
  var import_jsx_runtime = require("react/jsx-runtime");
183
- 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);
184
327
  function useToast() {
185
- const context = (0, import_react2.useContext)(ToastContext);
328
+ const context = (0, import_react3.useContext)(ToastContext);
186
329
  if (!context) {
187
330
  throw new Error("useToast must be used within a ToastProvider");
188
331
  }
@@ -190,15 +333,18 @@ function useToast() {
190
333
  }
191
334
 
192
335
  // src/hooks/use-copilot-runtime-client.ts
193
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
194
- var import_react3 = require("react");
336
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
337
+ var import_react4 = require("react");
195
338
  var useCopilotRuntimeClient = (options) => {
196
339
  const { addGraphQLErrorsToast } = useToast();
197
- const runtimeClient = (0, import_react3.useMemo)(() => {
198
- 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), {
199
343
  handleGQLErrors: (error) => {
200
344
  if (error.graphQLErrors.length) {
201
345
  addGraphQLErrorsToast(error.graphQLErrors);
346
+ } else {
347
+ addErrorToast([error]);
202
348
  }
203
349
  }
204
350
  }));
@@ -219,8 +365,8 @@ function useChat(options) {
219
365
  actions,
220
366
  onFunctionCall,
221
367
  onCoAgentStateRender,
222
- setCoagentStates,
223
- coagentStates,
368
+ setCoagentStatesWithRef,
369
+ coagentStatesRef,
224
370
  agentSession,
225
371
  setAgentSession,
226
372
  threadId,
@@ -229,244 +375,298 @@ function useChat(options) {
229
375
  setRunId,
230
376
  chatAbortControllerRef
231
377
  } = options;
232
- const abortController = new AbortController();
233
- chatAbortControllerRef.current = abortController;
234
378
  const { addGraphQLErrorsToast } = useToast();
235
- const runChatCompletionRef = (0, import_react4.useRef)();
236
- const coagentStatesRef = (0, import_react4.useRef)(coagentStates);
237
- coagentStatesRef.current = coagentStates;
238
- const agentSessionRef = (0, import_react4.useRef)(agentSession);
379
+ const runChatCompletionRef = (0, import_react5.useRef)();
380
+ const agentSessionRef = (0, import_react5.useRef)(agentSession);
239
381
  agentSessionRef.current = agentSession;
240
- const threadIdRef = (0, import_react4.useRef)(threadId);
382
+ const threadIdRef = (0, import_react5.useRef)(threadId);
241
383
  threadIdRef.current = threadId;
242
- const runIdRef = (0, import_react4.useRef)(runId);
384
+ const runIdRef = (0, import_react5.useRef)(runId);
243
385
  runIdRef.current = runId;
244
386
  const publicApiKey = copilotConfig.publicApiKey;
245
- 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 } : {});
246
388
  const runtimeClient = useCopilotRuntimeClient({
247
389
  url: copilotConfig.chatApiEndpoint,
248
390
  publicApiKey: copilotConfig.publicApiKey,
249
391
  headers,
250
392
  credentials: copilotConfig.credentials
251
393
  });
252
- const runChatCompletion = (previousMessages) => __async(this, null, function* () {
253
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
254
- setIsLoading(true);
255
- let newMessages = [
256
- new import_runtime_client_gql2.TextMessage({
257
- content: "",
258
- role: import_runtime_client_gql2.Role.Assistant
259
- })
260
- ];
261
- chatAbortControllerRef.current = new AbortController();
262
- setMessages([...previousMessages, ...newMessages]);
263
- const systemMessage = makeSystemMessageCallback();
264
- const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
265
- const stream = runtimeClient.asStream(
266
- runtimeClient.generateCopilotResponse({
267
- data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
268
- frontend: {
269
- actions: actions.filter(
270
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
271
- ).map((action) => {
272
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
273
- if (action.disabled) {
274
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
275
- } else if (action.available === "disabled") {
276
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
277
- } else if (action.available === "remote") {
278
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
279
- }
280
- return {
281
- name: action.name,
282
- description: action.description || "",
283
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
284
- available
285
- };
286
- }),
287
- url: window.location.href
288
- },
289
- threadId: threadIdRef.current,
290
- runId: runIdRef.current,
291
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
292
- }, copilotConfig.cloud ? {
293
- cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
294
- guardrails: {
295
- inputValidationRules: {
296
- allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
297
- 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
+ }
298
426
  }
427
+ } : {})
428
+ } : {}), {
429
+ metadata: {
430
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
299
431
  }
300
- } : {})
301
- } : {}), {
302
- metadata: {
303
- 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;
304
459
  }
305
- }), agentSessionRef.current ? {
306
- agentSession: agentSessionRef.current
307
- } : {}), {
308
- agentStates: Object.values(coagentStatesRef.current).map((state) => ({
309
- agentName: state.name,
310
- state: JSON.stringify(state.state)
311
- }))
312
- }),
313
- properties: copilotConfig.properties,
314
- signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
315
- })
316
- );
317
- const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
318
- const reader = stream.getReader();
319
- let actionResults = {};
320
- let executedCoAgentStateRenders = [];
321
- let followUp = void 0;
322
- try {
323
- while (true) {
324
- let done, value;
325
- try {
326
- const readResult = yield reader.read();
327
- done = readResult.done;
328
- value = readResult.value;
329
- } catch (readError) {
330
- break;
331
- }
332
- if (done) {
333
- if (chatAbortControllerRef.current.signal.aborted) {
334
- return newMessages.slice();
460
+ if (done) {
461
+ if (chatAbortControllerRef.current.signal.aborted) {
462
+ return [];
463
+ }
464
+ break;
335
465
  }
336
- break;
337
- }
338
- if (!(value == null ? void 0 : value.generateCopilotResponse)) {
339
- continue;
340
- }
341
- threadIdRef.current = value.generateCopilotResponse.threadId || null;
342
- runIdRef.current = value.generateCopilotResponse.runId || null;
343
- setThreadId(threadIdRef.current);
344
- setRunId(runIdRef.current);
345
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
346
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
347
- );
348
- if (messages2.length === 0) {
349
- continue;
350
- }
351
- newMessages = [];
352
- if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
353
- newMessages = [
354
- new import_runtime_client_gql2.TextMessage({
355
- role: import_runtime_client_gql2.MessageRole.Assistant,
356
- content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
357
- })
358
- ];
359
- } else {
360
- for (const message of messages2) {
361
- newMessages.push(message);
362
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
363
- if (!(message.id in actionResults)) {
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) {
364
493
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
365
494
  break;
366
495
  }
367
- try {
368
- setMessages([...previousMessages, ...newMessages]);
369
- const action = actions.find((action2) => action2.name === message.name);
370
- if (action) {
371
- followUp = action.followUp;
372
- }
373
- const result = yield Promise.race([
374
- onFunctionCall({
375
- messages: previousMessages,
376
- name: message.name,
377
- args: message.arguments
378
- }),
379
- new Promise((_, reject) => {
380
- var _a2;
381
- return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener("abort", () => reject(new Error("Operation was aborted")));
382
- })
383
- ]);
384
- if (chatAbortControllerRef.current.signal.aborted) {
385
- actionResults[message.id] = "";
386
- } else {
387
- actionResults[message.id] = result;
388
- }
389
- } catch (e) {
390
- actionResults[message.id] = `Failed to execute action ${message.name}`;
391
- console.error(`Failed to execute action ${message.name}: ${e}`);
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
392
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);
393
530
  }
394
- newMessages.push(
395
- new import_runtime_client_gql2.ResultMessage({
396
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
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({
558
+ messages: previousMessages,
559
+ name: message.name,
560
+ args: message.arguments
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}`);
582
+ }
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),
397
591
  actionExecutionId: message.id,
398
592
  actionName: message.name
399
593
  })
400
594
  );
401
595
  }
402
- if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
403
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
404
- break;
405
- }
406
- yield onCoAgentStateRender({
407
- name: message.agentName,
408
- nodeName: message.nodeName,
409
- state: message.state
410
- });
411
- executedCoAgentStateRenders.push(message.id);
412
- }
413
596
  }
414
- const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
415
- if (lastAgentStateMessage) {
416
- setCoagentStates((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
417
- [lastAgentStateMessage.agentName]: {
418
- name: lastAgentStateMessage.agentName,
419
- state: lastAgentStateMessage.state,
420
- running: lastAgentStateMessage.running,
421
- active: lastAgentStateMessage.active,
422
- threadId: lastAgentStateMessage.threadId,
423
- nodeName: lastAgentStateMessage.nodeName,
424
- runId: lastAgentStateMessage.runId
425
- }
426
- }));
427
- if (lastAgentStateMessage.running) {
428
- setAgentSession({
429
- threadId: lastAgentStateMessage.threadId,
430
- agentName: lastAgentStateMessage.agentName,
431
- nodeName: lastAgentStateMessage.nodeName
432
- });
433
- } else {
434
- 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
+ );
435
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
+ });
436
625
  }
626
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
627
+ } else {
628
+ return newMessages.slice();
437
629
  }
438
- if (newMessages.length > 0) {
439
- setMessages([...previousMessages, ...newMessages]);
440
- }
441
- }
442
- if (
443
- // if followUp is not explicitly false
444
- followUp !== false && // if we have client side results
445
- (Object.values(actionResults).length || // or the last message we received is a result
446
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
447
- ) {
448
- yield new Promise((resolve) => setTimeout(resolve, 10));
449
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
450
- } else {
451
- return newMessages.slice();
630
+ } finally {
631
+ setIsLoading(false);
452
632
  }
453
- } finally {
454
- setIsLoading(false);
455
- }
456
- });
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
+ );
457
651
  runChatCompletionRef.current = runChatCompletion;
458
- const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
459
- yield runChatCompletionRef.current(messages2);
460
- });
461
- const append = (message) => __async(this, null, function* () {
462
- if (isLoading) {
463
- return;
464
- }
465
- const newMessages = [...messages, message];
466
- setMessages(newMessages);
467
- return runChatCompletionAndHandleFunctionCall(newMessages);
468
- });
469
- 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* () {
470
670
  if (isLoading || messages.length === 0) {
471
671
  return;
472
672
  }
@@ -477,7 +677,7 @@ function useChat(options) {
477
677
  }
478
678
  setMessages(newMessages);
479
679
  return runChatCompletionAndHandleFunctionCall(newMessages);
480
- });
680
+ }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
481
681
  const stop = () => {
482
682
  var _a;
483
683
  (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
@@ -485,24 +685,42 @@ function useChat(options) {
485
685
  return {
486
686
  append,
487
687
  reload,
488
- stop
688
+ stop,
689
+ runChatCompletion: () => runChatCompletionRef.current(messages)
489
690
  };
490
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
+ }
491
709
 
492
710
  // src/components/copilot-provider/copilotkit.tsx
493
- var import_react6 = require("react");
711
+ var import_react7 = require("react");
494
712
  var import_react_dom = require("react-dom");
495
- var import_shared2 = require("@copilotkit/shared");
713
+ var import_shared3 = require("@copilotkit/shared");
496
714
 
497
715
  // src/context/copilot-messages-context.tsx
498
- var import_react5 = __toESM(require("react"));
716
+ var import_react6 = __toESM(require("react"));
499
717
  var emptyCopilotContext2 = {
500
718
  messages: [],
501
719
  setMessages: () => []
502
720
  };
503
- var CopilotMessagesContext = import_react5.default.createContext(emptyCopilotContext2);
721
+ var CopilotMessagesContext = import_react6.default.createContext(emptyCopilotContext2);
504
722
  function useCopilotMessagesContext() {
505
- const context = import_react5.default.useContext(CopilotMessagesContext);
723
+ const context = import_react6.default.useContext(CopilotMessagesContext);
506
724
  if (context === emptyCopilotContext2) {
507
725
  throw new Error(
508
726
  "A messages consuming component was not wrapped with `<CopilotMessages> {...} </CopilotMessages>`"
@@ -512,7 +730,7 @@ function useCopilotMessagesContext() {
512
730
  }
513
731
 
514
732
  // src/components/copilot-provider/copilotkit.tsx
515
- var import_jsx_runtime2 = require("react/jsx-runtime");
733
+ var import_jsx_runtime4 = require("react/jsx-runtime");
516
734
  var defaultCopilotContextCategories = ["global"];
517
735
 
518
736
  // src/hooks/use-copilot-chat.ts
@@ -530,8 +748,8 @@ function useCopilotChat(_a = {}) {
530
748
  setIsLoading,
531
749
  chatInstructions,
532
750
  actions,
533
- coagentStates,
534
- setCoagentStates,
751
+ coagentStatesRef,
752
+ setCoagentStatesWithRef,
535
753
  coAgentStateRenders,
536
754
  agentSession,
537
755
  setAgentSession,
@@ -544,21 +762,21 @@ function useCopilotChat(_a = {}) {
544
762
  } = useCopilotContext();
545
763
  const { messages, setMessages } = useCopilotMessagesContext();
546
764
  const latestGetContextString = useUpdatedRef(getContextString);
547
- const deleteMessage = (0, import_react7.useCallback)(
765
+ const deleteMessage = (0, import_react8.useCallback)(
548
766
  (messageId) => {
549
767
  setMessages((prev) => prev.filter((message) => message.id !== messageId));
550
768
  },
551
769
  [setMessages]
552
770
  );
553
- const makeSystemMessageCallback = (0, import_react7.useCallback)(() => {
771
+ const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
554
772
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
555
773
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
556
- return new import_runtime_client_gql3.TextMessage({
774
+ return new import_runtime_client_gql4.TextMessage({
557
775
  content: systemMessageMaker(contextString, chatInstructions),
558
- role: import_runtime_client_gql3.Role.System
776
+ role: import_runtime_client_gql4.Role.System
559
777
  });
560
778
  }, [getContextString, makeSystemMessage, chatInstructions]);
561
- const onCoAgentStateRender = (0, import_react7.useCallback)(
779
+ const onCoAgentStateRender = useAsyncCallback(
562
780
  (args) => __async(this, null, function* () {
563
781
  var _a2;
564
782
  const { name, nodeName, state } = args;
@@ -576,7 +794,7 @@ function useCopilotChat(_a = {}) {
576
794
  }),
577
795
  [coAgentStateRenders]
578
796
  );
579
- const { append, reload, stop } = useChat(__spreadProps(__spreadValues({}, options), {
797
+ const { append, reload, stop, runChatCompletion } = useChat(__spreadProps(__spreadValues({}, options), {
580
798
  actions: Object.values(actions),
581
799
  copilotConfig: copilotApiConfig,
582
800
  initialMessages: options.initialMessages || [],
@@ -587,8 +805,8 @@ function useCopilotChat(_a = {}) {
587
805
  makeSystemMessageCallback,
588
806
  isLoading,
589
807
  setIsLoading,
590
- coagentStates,
591
- setCoagentStates,
808
+ coagentStatesRef,
809
+ setCoagentStatesWithRef,
592
810
  agentSession,
593
811
  setAgentSession,
594
812
  threadId,
@@ -598,40 +816,44 @@ function useCopilotChat(_a = {}) {
598
816
  chatAbortControllerRef
599
817
  }));
600
818
  const latestAppend = useUpdatedRef(append);
601
- const latestAppendFunc = (0, import_react7.useCallback)(
602
- (message) => {
603
- return latestAppend.current(message);
604
- },
819
+ const latestAppendFunc = useAsyncCallback(
820
+ (message) => __async(this, null, function* () {
821
+ return yield latestAppend.current(message);
822
+ }),
605
823
  [latestAppend]
606
824
  );
607
825
  const latestReload = useUpdatedRef(reload);
608
- const latestReloadFunc = (0, import_react7.useCallback)(() => {
609
- return latestReload.current();
610
- }, [latestReload]);
826
+ const latestReloadFunc = useAsyncCallback(() => __async(this, null, function* () {
827
+ return yield latestReload.current();
828
+ }), [latestReload]);
611
829
  const latestStop = useUpdatedRef(stop);
612
- const latestStopFunc = (0, import_react7.useCallback)(() => {
830
+ const latestStopFunc = (0, import_react8.useCallback)(() => {
613
831
  return latestStop.current();
614
832
  }, [latestStop]);
615
833
  const latestDelete = useUpdatedRef(deleteMessage);
616
- const latestDeleteFunc = (0, import_react7.useCallback)(
834
+ const latestDeleteFunc = (0, import_react8.useCallback)(
617
835
  (messageId) => {
618
836
  return latestDelete.current(messageId);
619
837
  },
620
838
  [latestDelete]
621
839
  );
622
840
  const latestSetMessages = useUpdatedRef(setMessages);
623
- const latestSetMessagesFunc = (0, import_react7.useCallback)(
841
+ const latestSetMessagesFunc = (0, import_react8.useCallback)(
624
842
  (messages2) => {
625
843
  return latestSetMessages.current(messages2);
626
844
  },
627
845
  [latestSetMessages]
628
846
  );
629
- const reset = (0, import_react7.useCallback)(() => {
847
+ const latestRunChatCompletion = useUpdatedRef(runChatCompletion);
848
+ const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
849
+ return yield latestRunChatCompletion.current();
850
+ }), [latestRunChatCompletion]);
851
+ const reset = (0, import_react8.useCallback)(() => {
630
852
  latestStopFunc();
631
853
  setMessages([]);
632
854
  setThreadId(null);
633
855
  setRunId(null);
634
- setCoagentStates({});
856
+ setCoagentStatesWithRef({});
635
857
  let initialAgentSession = null;
636
858
  if (agentLock) {
637
859
  initialAgentSession = {
@@ -639,9 +861,16 @@ function useCopilotChat(_a = {}) {
639
861
  };
640
862
  }
641
863
  setAgentSession(initialAgentSession);
642
- }, [latestStopFunc, setMessages, setThreadId, setCoagentStates, setAgentSession, agentLock]);
864
+ }, [
865
+ latestStopFunc,
866
+ setMessages,
867
+ setThreadId,
868
+ setCoagentStatesWithRef,
869
+ setAgentSession,
870
+ agentLock
871
+ ]);
643
872
  const latestReset = useUpdatedRef(reset);
644
- const latestResetFunc = (0, import_react7.useCallback)(() => {
873
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
645
874
  return latestReset.current();
646
875
  }, [latestReset]);
647
876
  return {
@@ -652,12 +881,13 @@ function useCopilotChat(_a = {}) {
652
881
  stopGeneration: latestStopFunc,
653
882
  reset: latestResetFunc,
654
883
  deleteMessage: latestDeleteFunc,
884
+ runChatCompletion: latestRunChatCompletionFunc,
655
885
  isLoading
656
886
  };
657
887
  }
658
888
  function useUpdatedRef(value) {
659
- const ref = (0, import_react7.useRef)(value);
660
- (0, import_react7.useEffect)(() => {
889
+ const ref = (0, import_react8.useRef)(value);
890
+ (0, import_react8.useEffect)(() => {
661
891
  ref.current = value;
662
892
  }, [value]);
663
893
  return ref;
@@ -687,18 +917,22 @@ ${additionalInstructions}` : "");
687
917
  }
688
918
 
689
919
  // src/hooks/use-copilot-action.ts
690
- var import_shared3 = require("@copilotkit/shared");
691
- var import_react8 = require("react");
920
+ var import_shared4 = require("@copilotkit/shared");
921
+ var import_react9 = require("react");
692
922
  function useCopilotAction(action, dependencies) {
693
923
  const { setAction, removeAction, actions, chatComponentsCache } = useCopilotContext();
694
- const idRef = (0, import_react8.useRef)((0, import_shared3.randomId)());
695
- 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);
696
926
  action = __spreadValues({}, action);
697
- 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
+ ) {
698
932
  const renderAndWait = action.renderAndWait || action.renderAndWaitForResponse;
699
933
  action.renderAndWait = void 0;
700
934
  action.renderAndWaitForResponse = void 0;
701
- action.handler = () => __async(this, null, function* () {
935
+ action.handler = useAsyncCallback(() => __async(this, null, function* () {
702
936
  let resolve;
703
937
  let reject;
704
938
  const promise = new Promise((resolvePromise, rejectPromise) => {
@@ -707,14 +941,18 @@ function useCopilotAction(action, dependencies) {
707
941
  });
708
942
  renderAndWaitRef.current = { promise, resolve, reject };
709
943
  return yield promise;
710
- });
944
+ }), []);
711
945
  action.render = (props) => {
946
+ let status = props.status;
947
+ if (props.status === "executing" && !renderAndWaitRef.current) {
948
+ status = "inProgress";
949
+ }
712
950
  const waitProps = {
713
- status: props.status,
951
+ status,
714
952
  args: props.args,
715
953
  result: props.result,
716
- handler: props.status === "executing" ? renderAndWaitRef.current.resolve : void 0,
717
- respond: props.status === "executing" ? renderAndWaitRef.current.resolve : void 0
954
+ handler: status === "executing" ? renderAndWaitRef.current.resolve : void 0,
955
+ respond: status === "executing" ? renderAndWaitRef.current.resolve : void 0
718
956
  };
719
957
  const isNoArgsRenderWait = (_fn) => {
720
958
  var _a;
@@ -727,12 +965,14 @@ function useCopilotAction(action, dependencies) {
727
965
  return renderAndWait(waitProps);
728
966
  }
729
967
  }
730
- return (0, import_react8.createElement)(import_react8.Fragment);
968
+ return (0, import_react9.createElement)(import_react9.Fragment);
731
969
  };
732
970
  }
733
971
  if (dependencies === void 0) {
734
972
  if (actions[idRef.current]) {
735
- actions[idRef.current].handler = action.handler;
973
+ if (isFrontendAction(action)) {
974
+ actions[idRef.current].handler = action.handler;
975
+ }
736
976
  if (typeof action.render === "function") {
737
977
  if (chatComponentsCache.current !== null) {
738
978
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -740,7 +980,7 @@ function useCopilotAction(action, dependencies) {
740
980
  }
741
981
  }
742
982
  }
743
- (0, import_react8.useEffect)(() => {
983
+ (0, import_react9.useEffect)(() => {
744
984
  setAction(idRef.current, action);
745
985
  if (chatComponentsCache.current !== null && action.render !== void 0) {
746
986
  chatComponentsCache.current.actions[action.name] = action.render;
@@ -751,31 +991,34 @@ function useCopilotAction(action, dependencies) {
751
991
  }, [
752
992
  setAction,
753
993
  removeAction,
754
- action.description,
994
+ isFrontendAction(action) ? action.description : void 0,
755
995
  action.name,
756
- action.disabled,
757
- action.available,
996
+ isFrontendAction(action) ? action.disabled : void 0,
997
+ isFrontendAction(action) ? action.available : void 0,
758
998
  // This should be faster than deep equality checking
759
999
  // In addition, all major JS engines guarantee the order of object keys
760
- JSON.stringify(action.parameters),
1000
+ JSON.stringify(isFrontendAction(action) ? action.parameters : []),
761
1001
  // include render only if it's a string
762
1002
  typeof action.render === "string" ? action.render : void 0,
763
1003
  // dependencies set by the developer
764
1004
  ...dependencies || []
765
1005
  ]);
766
1006
  }
1007
+ function isFrontendAction(action) {
1008
+ return action.name !== "*";
1009
+ }
767
1010
 
768
1011
  // src/hooks/use-coagent-state-render.ts
769
- var import_react9 = require("react");
770
- var import_shared4 = require("@copilotkit/shared");
1012
+ var import_react10 = require("react");
1013
+ var import_shared5 = require("@copilotkit/shared");
771
1014
  function useCoAgentStateRender(action, dependencies) {
772
1015
  const {
773
1016
  setCoAgentStateRender,
774
1017
  removeCoAgentStateRender,
775
1018
  coAgentStateRenders,
776
1019
  chatComponentsCache
777
- } = (0, import_react9.useContext)(CopilotContext);
778
- const idRef = (0, import_react9.useRef)((0, import_shared4.randomId)());
1020
+ } = (0, import_react10.useContext)(CopilotContext);
1021
+ const idRef = (0, import_react10.useRef)((0, import_shared5.randomId)());
779
1022
  const key = `${action.name}-${action.nodeName || "global"}`;
780
1023
  if (dependencies === void 0) {
781
1024
  if (coAgentStateRenders[idRef.current]) {
@@ -787,7 +1030,7 @@ function useCoAgentStateRender(action, dependencies) {
787
1030
  }
788
1031
  }
789
1032
  }
790
- (0, import_react9.useEffect)(() => {
1033
+ (0, import_react10.useEffect)(() => {
791
1034
  setCoAgentStateRender(idRef.current, action);
792
1035
  if (chatComponentsCache.current !== null && action.render !== void 0) {
793
1036
  chatComponentsCache.current.coAgentStateRenders[key] = action.render;
@@ -807,11 +1050,11 @@ function useCoAgentStateRender(action, dependencies) {
807
1050
  }
808
1051
 
809
1052
  // src/hooks/use-make-copilot-document-readable.ts
810
- var import_react10 = require("react");
1053
+ var import_react11 = require("react");
811
1054
  function useMakeCopilotDocumentReadable(document, categories, dependencies = []) {
812
1055
  const { addDocumentContext, removeDocumentContext } = useCopilotContext();
813
- const idRef = (0, import_react10.useRef)();
814
- (0, import_react10.useEffect)(() => {
1056
+ const idRef = (0, import_react11.useRef)();
1057
+ (0, import_react11.useEffect)(() => {
815
1058
  const id = addDocumentContext(document, categories);
816
1059
  idRef.current = id;
817
1060
  return () => {
@@ -822,16 +1065,16 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
822
1065
  }
823
1066
 
824
1067
  // src/hooks/use-copilot-readable.ts
825
- var import_react11 = require("react");
1068
+ var import_react12 = require("react");
826
1069
  function convertToJSON(description, value) {
827
1070
  return `${description}: ${typeof value === "string" ? value : JSON.stringify(value)}`;
828
1071
  }
829
1072
  function useCopilotReadable({ description, value, parentId, categories, convert }, dependencies) {
830
1073
  const { addContext, removeContext } = useCopilotContext();
831
- const idRef = (0, import_react11.useRef)();
1074
+ const idRef = (0, import_react12.useRef)();
832
1075
  convert = convert || convertToJSON;
833
1076
  const information = convert(description, value);
834
- (0, import_react11.useEffect)(() => {
1077
+ (0, import_react12.useEffect)(() => {
835
1078
  const id = addContext(information, parentId, categories);
836
1079
  idRef.current = id;
837
1080
  return () => {
@@ -842,7 +1085,7 @@ function useCopilotReadable({ description, value, parentId, categories, convert
842
1085
  }
843
1086
 
844
1087
  // src/hooks/use-coagent.ts
845
- var import_react12 = require("react");
1088
+ var import_react13 = require("react");
846
1089
  function useCoAgent(options) {
847
1090
  const isExternalStateManagement = (options2) => {
848
1091
  return "state" in options2 && "setState" in options2;
@@ -854,8 +1097,8 @@ function useCoAgent(options) {
854
1097
  const generalContext = useCopilotContext();
855
1098
  const messagesContext = useCopilotMessagesContext();
856
1099
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
857
- const { coagentStates, setCoagentStates } = context;
858
- const { appendMessage } = useCopilotChat();
1100
+ const { coagentStates, coagentStatesRef, setCoagentStatesWithRef } = context;
1101
+ const { appendMessage, runChatCompletion } = useCopilotChat();
859
1102
  const getCoagentState = (coagentStates2, name2) => {
860
1103
  if (coagentStates2[name2]) {
861
1104
  return coagentStates2[name2];
@@ -872,19 +1115,17 @@ function useCoAgent(options) {
872
1115
  }
873
1116
  };
874
1117
  const setState = (newState) => {
875
- setCoagentStates((prevAgentStates) => {
876
- let coagentState2 = getCoagentState(prevAgentStates, name);
877
- const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
878
- return __spreadProps(__spreadValues({}, prevAgentStates), {
879
- [name]: __spreadProps(__spreadValues({}, coagentState2), {
880
- state: updatedState
881
- })
882
- });
883
- });
1118
+ let coagentState2 = getCoagentState(coagentStatesRef.current || {}, name);
1119
+ const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
1120
+ setCoagentStatesWithRef(__spreadProps(__spreadValues({}, coagentStatesRef.current), {
1121
+ [name]: __spreadProps(__spreadValues({}, coagentState2), {
1122
+ state: updatedState
1123
+ })
1124
+ }));
884
1125
  };
885
1126
  const coagentState = getCoagentState(coagentStates, name);
886
1127
  const state = isExternalStateManagement(options) ? options.state : coagentState.state;
887
- (0, import_react12.useEffect)(() => {
1128
+ (0, import_react13.useEffect)(() => {
888
1129
  if (isExternalStateManagement(options)) {
889
1130
  setState(options.state);
890
1131
  } else if (coagentStates[name] === void 0) {
@@ -893,23 +1134,24 @@ function useCoAgent(options) {
893
1134
  }, [
894
1135
  isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
895
1136
  // reset initialstate on reset
896
- coagentStates === void 0
1137
+ coagentStates[name] === void 0
897
1138
  ]);
1139
+ const runAgentCallback = useAsyncCallback(
1140
+ (hint) => __async(this, null, function* () {
1141
+ yield runAgent(name, context, appendMessage, runChatCompletion, hint);
1142
+ }),
1143
+ [name, context, appendMessage, runChatCompletion]
1144
+ );
898
1145
  return {
899
1146
  name,
900
1147
  nodeName: coagentState.nodeName,
901
- state,
902
- setState,
1148
+ threadId: coagentState.threadId,
903
1149
  running: coagentState.running,
904
- start: () => {
905
- startAgent(name, context);
906
- },
907
- stop: () => {
908
- stopAgent(name, context);
909
- },
910
- run: (hint) => {
911
- return runAgent(name, context, appendMessage, hint);
912
- }
1150
+ state: coagentState.state,
1151
+ setState: isExternalStateManagement(options) ? options.setState : setState,
1152
+ start: () => startAgent(name, context),
1153
+ stop: () => stopAgent(name, context),
1154
+ run: runAgentCallback
913
1155
  };
914
1156
  }
915
1157
  function startAgent(name, context) {
@@ -937,7 +1179,7 @@ function stopAgent(name, context) {
937
1179
  console.warn(`No agent session found for ${name}`);
938
1180
  }
939
1181
  }
940
- function runAgent(name, context, appendMessage, hint) {
1182
+ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
941
1183
  return __async(this, null, function* () {
942
1184
  var _a, _b;
943
1185
  const { agentSession, setAgentSession } = context;
@@ -953,12 +1195,16 @@ function runAgent(name, context, appendMessage, hint) {
953
1195
  previousState = message.state;
954
1196
  }
955
1197
  }
956
- let state = ((_b = (_a = context.coagentStates) == null ? void 0 : _a[name]) == null ? void 0 : _b.state) || {};
1198
+ let state = ((_b = (_a = context.coagentStatesRef.current) == null ? void 0 : _a[name]) == null ? void 0 : _b.state) || {};
957
1199
  if (hint) {
958
1200
  const hintMessage = hint({ previousState, currentState: state });
959
1201
  if (hintMessage) {
960
1202
  yield appendMessage(hintMessage);
1203
+ } else {
1204
+ yield runChatCompletion();
961
1205
  }
1206
+ } else {
1207
+ yield runChatCompletion();
962
1208
  }
963
1209
  });
964
1210
  }