@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
@@ -85,7 +85,7 @@ __export(use_coagent_exports, {
85
85
  useCoAgent: () => useCoAgent
86
86
  });
87
87
  module.exports = __toCommonJS(use_coagent_exports);
88
- var import_react8 = require("react");
88
+ var import_react9 = require("react");
89
89
 
90
90
  // src/context/copilot-context.tsx
91
91
  var import_react = __toESM(require("react"));
@@ -136,6 +136,9 @@ var emptyCopilotContext = {
136
136
  coagentStates: {},
137
137
  setCoagentStates: () => {
138
138
  },
139
+ coagentStatesRef: { current: {} },
140
+ setCoagentStatesWithRef: () => {
141
+ },
139
142
  agentSession: null,
140
143
  setAgentSession: () => {
141
144
  },
@@ -179,20 +182,160 @@ function useCopilotMessagesContext() {
179
182
  }
180
183
 
181
184
  // src/hooks/use-copilot-chat.ts
182
- var import_react7 = require("react");
183
- var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
185
+ var import_react8 = require("react");
186
+ var import_runtime_client_gql4 = require("@copilotkit/runtime-client-gql");
184
187
 
185
188
  // src/hooks/use-chat.ts
186
- var import_react5 = require("react");
189
+ var import_react6 = require("react");
190
+ var import_shared2 = require("@copilotkit/shared");
191
+ var import_runtime_client_gql3 = require("@copilotkit/runtime-client-gql");
192
+
193
+ // src/types/frontend-action.ts
194
+ var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
187
195
  var import_shared = require("@copilotkit/shared");
188
- var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
196
+ function processActionsForRuntimeRequest(actions) {
197
+ const filteredActions = actions.filter(
198
+ (action) => action.available !== import_runtime_client_gql.ActionInputAvailability.Disabled && action.disabled !== true && action.name !== "*"
199
+ ).map((action) => {
200
+ let available = import_runtime_client_gql.ActionInputAvailability.Enabled;
201
+ if (action.disabled) {
202
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
203
+ } else if (action.available === "disabled") {
204
+ available = import_runtime_client_gql.ActionInputAvailability.Disabled;
205
+ } else if (action.available === "remote") {
206
+ available = import_runtime_client_gql.ActionInputAvailability.Remote;
207
+ }
208
+ return {
209
+ name: action.name,
210
+ description: action.description || "",
211
+ jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
212
+ available
213
+ };
214
+ });
215
+ return filteredActions;
216
+ }
189
217
 
190
218
  // src/components/toast/toast-provider.tsx
219
+ var import_react4 = require("react");
220
+
221
+ // src/components/error-boundary/error-utils.tsx
191
222
  var import_react3 = require("react");
223
+
224
+ // src/components/toast/exclamation-mark-icon.tsx
192
225
  var import_jsx_runtime = require("react/jsx-runtime");
193
- var ToastContext = (0, import_react3.createContext)(void 0);
226
+ var ExclamationMarkIcon = ({
227
+ className,
228
+ style
229
+ }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
230
+ "svg",
231
+ {
232
+ xmlns: "http://www.w3.org/2000/svg",
233
+ width: "24",
234
+ height: "24",
235
+ viewBox: "0 0 24 24",
236
+ fill: "none",
237
+ stroke: "currentColor",
238
+ strokeWidth: "2",
239
+ strokeLinecap: "round",
240
+ strokeLinejoin: "round",
241
+ className: `lucide lucide-circle-alert ${className ? className : ""}`,
242
+ style,
243
+ children: [
244
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "12", cy: "12", r: "10" }),
245
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", x2: "12", y1: "8", y2: "12" }),
246
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("line", { x1: "12", x2: "12.01", y1: "16", y2: "16" })
247
+ ]
248
+ }
249
+ );
250
+
251
+ // src/components/error-boundary/error-utils.tsx
252
+ var import_jsx_runtime2 = require("react/jsx-runtime");
253
+ function ErrorToast({ errors }) {
254
+ const errorsToRender = errors.map((error, idx) => {
255
+ var _a, _b, _c;
256
+ const message = "extensions" in error ? (_b = (_a = error.extensions) == null ? void 0 : _a.originalError) == null ? void 0 : _b.message : error.message;
257
+ const code = "extensions" in error ? (_c = error.extensions) == null ? void 0 : _c.code : null;
258
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
259
+ "div",
260
+ {
261
+ style: {
262
+ marginTop: idx === 0 ? 0 : 10,
263
+ marginBottom: 14
264
+ },
265
+ children: [
266
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ExclamationMarkIcon, { style: { marginBottom: 4 } }),
267
+ code && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
268
+ "div",
269
+ {
270
+ style: {
271
+ fontWeight: "600",
272
+ marginBottom: 4
273
+ },
274
+ children: [
275
+ "Copilot Cloud Error:",
276
+ " ",
277
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { fontFamily: "monospace", fontWeight: "normal" }, children: code })
278
+ ]
279
+ }
280
+ ),
281
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { children: message })
282
+ ]
283
+ },
284
+ idx
285
+ );
286
+ });
287
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
288
+ "div",
289
+ {
290
+ style: {
291
+ fontSize: "13px",
292
+ maxWidth: "600px"
293
+ },
294
+ children: [
295
+ errorsToRender,
296
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { style: { fontSize: "11px", opacity: 0.75 }, children: "NOTE: This error only displays during local development." })
297
+ ]
298
+ }
299
+ );
300
+ }
301
+ function useErrorToast() {
302
+ const { addToast } = useToast();
303
+ return (0, import_react3.useCallback)(
304
+ (error) => {
305
+ const errorId = error.map((err) => {
306
+ var _a, _b;
307
+ const message = "extensions" in err ? ((_b = (_a = err.extensions) == null ? void 0 : _a.originalError) == null ? void 0 : _b.message) || err.message : err.message;
308
+ const stack = err.stack || "";
309
+ return btoa(message + stack).slice(0, 32);
310
+ }).join("|");
311
+ addToast({
312
+ type: "error",
313
+ id: errorId,
314
+ // Toast libraries typically dedupe by id
315
+ message: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ErrorToast, { errors: error })
316
+ });
317
+ },
318
+ [addToast]
319
+ );
320
+ }
321
+ function useAsyncCallback(callback, deps) {
322
+ const addErrorToast = useErrorToast();
323
+ return (0, import_react3.useCallback)((...args) => __async(this, null, function* () {
324
+ try {
325
+ return yield callback(...args);
326
+ } catch (error) {
327
+ console.error("Error in async callback:", error);
328
+ addErrorToast([error]);
329
+ throw error;
330
+ }
331
+ }), deps);
332
+ }
333
+
334
+ // src/components/toast/toast-provider.tsx
335
+ var import_jsx_runtime3 = require("react/jsx-runtime");
336
+ var ToastContext = (0, import_react4.createContext)(void 0);
194
337
  function useToast() {
195
- const context = (0, import_react3.useContext)(ToastContext);
338
+ const context = (0, import_react4.useContext)(ToastContext);
196
339
  if (!context) {
197
340
  throw new Error("useToast must be used within a ToastProvider");
198
341
  }
@@ -200,15 +343,18 @@ function useToast() {
200
343
  }
201
344
 
202
345
  // src/hooks/use-copilot-runtime-client.ts
203
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
204
- var import_react4 = require("react");
346
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
347
+ var import_react5 = require("react");
205
348
  var useCopilotRuntimeClient = (options) => {
206
349
  const { addGraphQLErrorsToast } = useToast();
207
- const runtimeClient = (0, import_react4.useMemo)(() => {
208
- return new import_runtime_client_gql.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
350
+ const addErrorToast = useErrorToast();
351
+ const runtimeClient = (0, import_react5.useMemo)(() => {
352
+ return new import_runtime_client_gql2.CopilotRuntimeClient(__spreadProps(__spreadValues({}, options), {
209
353
  handleGQLErrors: (error) => {
210
354
  if (error.graphQLErrors.length) {
211
355
  addGraphQLErrorsToast(error.graphQLErrors);
356
+ } else {
357
+ addErrorToast([error]);
212
358
  }
213
359
  }
214
360
  }));
@@ -229,8 +375,8 @@ function useChat(options) {
229
375
  actions,
230
376
  onFunctionCall,
231
377
  onCoAgentStateRender,
232
- setCoagentStates,
233
- coagentStates,
378
+ setCoagentStatesWithRef,
379
+ coagentStatesRef,
234
380
  agentSession,
235
381
  setAgentSession,
236
382
  threadId,
@@ -239,244 +385,298 @@ function useChat(options) {
239
385
  setRunId,
240
386
  chatAbortControllerRef
241
387
  } = options;
242
- const abortController = new AbortController();
243
- chatAbortControllerRef.current = abortController;
244
388
  const { addGraphQLErrorsToast } = useToast();
245
- const runChatCompletionRef = (0, import_react5.useRef)();
246
- const coagentStatesRef = (0, import_react5.useRef)(coagentStates);
247
- coagentStatesRef.current = coagentStates;
248
- const agentSessionRef = (0, import_react5.useRef)(agentSession);
389
+ const runChatCompletionRef = (0, import_react6.useRef)();
390
+ const agentSessionRef = (0, import_react6.useRef)(agentSession);
249
391
  agentSessionRef.current = agentSession;
250
- const threadIdRef = (0, import_react5.useRef)(threadId);
392
+ const threadIdRef = (0, import_react6.useRef)(threadId);
251
393
  threadIdRef.current = threadId;
252
- const runIdRef = (0, import_react5.useRef)(runId);
394
+ const runIdRef = (0, import_react6.useRef)(runId);
253
395
  runIdRef.current = runId;
254
396
  const publicApiKey = copilotConfig.publicApiKey;
255
- const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
397
+ const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [import_shared2.COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
256
398
  const runtimeClient = useCopilotRuntimeClient({
257
399
  url: copilotConfig.chatApiEndpoint,
258
400
  publicApiKey: copilotConfig.publicApiKey,
259
401
  headers,
260
402
  credentials: copilotConfig.credentials
261
403
  });
262
- const runChatCompletion = (previousMessages) => __async(this, null, function* () {
263
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
264
- setIsLoading(true);
265
- let newMessages = [
266
- new import_runtime_client_gql2.TextMessage({
267
- content: "",
268
- role: import_runtime_client_gql2.Role.Assistant
269
- })
270
- ];
271
- chatAbortControllerRef.current = new AbortController();
272
- setMessages([...previousMessages, ...newMessages]);
273
- const systemMessage = makeSystemMessageCallback();
274
- const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
275
- const stream = runtimeClient.asStream(
276
- runtimeClient.generateCopilotResponse({
277
- data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
278
- frontend: {
279
- actions: actions.filter(
280
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
281
- ).map((action) => {
282
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
283
- if (action.disabled) {
284
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
285
- } else if (action.available === "disabled") {
286
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
287
- } else if (action.available === "remote") {
288
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
289
- }
290
- return {
291
- name: action.name,
292
- description: action.description || "",
293
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
294
- available
295
- };
296
- }),
297
- url: window.location.href
298
- },
299
- threadId: threadIdRef.current,
300
- runId: runIdRef.current,
301
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
302
- }, copilotConfig.cloud ? {
303
- cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
304
- guardrails: {
305
- inputValidationRules: {
306
- allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
307
- denyList: copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics
404
+ const runChatCompletion = useAsyncCallback(
405
+ (previousMessages) => __async(this, null, function* () {
406
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
407
+ setIsLoading(true);
408
+ let newMessages = [
409
+ new import_runtime_client_gql3.TextMessage({
410
+ content: "",
411
+ role: import_runtime_client_gql3.Role.Assistant
412
+ })
413
+ ];
414
+ chatAbortControllerRef.current = new AbortController();
415
+ setMessages([...previousMessages, ...newMessages]);
416
+ const systemMessage = makeSystemMessageCallback();
417
+ const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
418
+ const isAgentRun = agentSessionRef.current !== null;
419
+ const stream = runtimeClient.asStream(
420
+ runtimeClient.generateCopilotResponse({
421
+ data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
422
+ frontend: {
423
+ actions: processActionsForRuntimeRequest(actions),
424
+ url: window.location.href
425
+ },
426
+ threadId: threadIdRef.current,
427
+ runId: runIdRef.current,
428
+ messages: (0, import_runtime_client_gql3.convertMessagesToGqlInput)((0, import_runtime_client_gql3.filterAgentStateMessages)(messagesWithContext))
429
+ }, copilotConfig.cloud ? {
430
+ cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
431
+ guardrails: {
432
+ inputValidationRules: {
433
+ allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
434
+ denyList: copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics
435
+ }
308
436
  }
437
+ } : {})
438
+ } : {}), {
439
+ metadata: {
440
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
309
441
  }
310
- } : {})
311
- } : {}), {
312
- metadata: {
313
- requestType: import_runtime_client_gql2.CopilotRequestType.Chat
442
+ }), agentSessionRef.current ? {
443
+ agentSession: agentSessionRef.current
444
+ } : {}), {
445
+ agentStates: Object.values(coagentStatesRef.current).map((state) => ({
446
+ agentName: state.name,
447
+ state: JSON.stringify(state.state)
448
+ }))
449
+ }),
450
+ properties: copilotConfig.properties,
451
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
452
+ })
453
+ );
454
+ const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
455
+ const reader = stream.getReader();
456
+ let executedCoAgentStateRenders = [];
457
+ let followUp = void 0;
458
+ let messages2 = [];
459
+ let syncedMessages = [];
460
+ try {
461
+ while (true) {
462
+ let done, value;
463
+ try {
464
+ const readResult = yield reader.read();
465
+ done = readResult.done;
466
+ value = readResult.value;
467
+ } catch (readError) {
468
+ break;
314
469
  }
315
- }), agentSessionRef.current ? {
316
- agentSession: agentSessionRef.current
317
- } : {}), {
318
- agentStates: Object.values(coagentStatesRef.current).map((state) => ({
319
- agentName: state.name,
320
- state: JSON.stringify(state.state)
321
- }))
322
- }),
323
- properties: copilotConfig.properties,
324
- signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
325
- })
326
- );
327
- const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
328
- const reader = stream.getReader();
329
- let actionResults = {};
330
- let executedCoAgentStateRenders = [];
331
- let followUp = void 0;
332
- try {
333
- while (true) {
334
- let done, value;
335
- try {
336
- const readResult = yield reader.read();
337
- done = readResult.done;
338
- value = readResult.value;
339
- } catch (readError) {
340
- break;
341
- }
342
- if (done) {
343
- if (chatAbortControllerRef.current.signal.aborted) {
344
- return newMessages.slice();
470
+ if (done) {
471
+ if (chatAbortControllerRef.current.signal.aborted) {
472
+ return [];
473
+ }
474
+ break;
345
475
  }
346
- break;
347
- }
348
- if (!(value == null ? void 0 : value.generateCopilotResponse)) {
349
- continue;
350
- }
351
- threadIdRef.current = value.generateCopilotResponse.threadId || null;
352
- runIdRef.current = value.generateCopilotResponse.runId || null;
353
- setThreadId(threadIdRef.current);
354
- setRunId(runIdRef.current);
355
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
356
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
357
- );
358
- if (messages2.length === 0) {
359
- continue;
360
- }
361
- newMessages = [];
362
- if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
363
- newMessages = [
364
- new import_runtime_client_gql2.TextMessage({
365
- role: import_runtime_client_gql2.MessageRole.Assistant,
366
- content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
367
- })
368
- ];
369
- } else {
370
- for (const message of messages2) {
371
- newMessages.push(message);
372
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
373
- if (!(message.id in actionResults)) {
476
+ if (!(value == null ? void 0 : value.generateCopilotResponse)) {
477
+ continue;
478
+ }
479
+ threadIdRef.current = value.generateCopilotResponse.threadId || null;
480
+ runIdRef.current = value.generateCopilotResponse.runId || null;
481
+ setThreadId(threadIdRef.current);
482
+ setRunId(runIdRef.current);
483
+ messages2 = (0, import_runtime_client_gql3.convertGqlOutputToMessages)(
484
+ (0, import_runtime_client_gql3.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
485
+ );
486
+ if (messages2.length === 0) {
487
+ continue;
488
+ }
489
+ newMessages = [];
490
+ if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
491
+ newMessages = [
492
+ new import_runtime_client_gql3.TextMessage({
493
+ role: import_runtime_client_gql3.MessageRole.Assistant,
494
+ content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
495
+ })
496
+ ];
497
+ setMessages([...previousMessages, ...newMessages]);
498
+ break;
499
+ } else {
500
+ newMessages = [...messages2];
501
+ for (const message of messages2) {
502
+ if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
374
503
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
375
504
  break;
376
505
  }
377
- try {
378
- setMessages([...previousMessages, ...newMessages]);
379
- const action = actions.find((action2) => action2.name === message.name);
380
- if (action) {
381
- followUp = action.followUp;
382
- }
383
- const result = yield Promise.race([
384
- onFunctionCall({
385
- messages: previousMessages,
386
- name: message.name,
387
- args: message.arguments
388
- }),
389
- new Promise((_, reject) => {
390
- var _a2;
391
- return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener("abort", () => reject(new Error("Operation was aborted")));
392
- })
393
- ]);
394
- if (chatAbortControllerRef.current.signal.aborted) {
395
- actionResults[message.id] = "";
396
- } else {
397
- actionResults[message.id] = result;
398
- }
399
- } catch (e) {
400
- actionResults[message.id] = `Failed to execute action ${message.name}`;
401
- console.error(`Failed to execute action ${message.name}: ${e}`);
506
+ yield onCoAgentStateRender({
507
+ name: message.agentName,
508
+ nodeName: message.nodeName,
509
+ state: message.state
510
+ });
511
+ executedCoAgentStateRenders.push(message.id);
512
+ }
513
+ }
514
+ const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
515
+ if (lastAgentStateMessage) {
516
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
517
+ syncedMessages = (0, import_runtime_client_gql3.loadMessagesFromJsonRepresentation)(
518
+ lastAgentStateMessage.state.messages
519
+ );
520
+ }
521
+ setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
522
+ [lastAgentStateMessage.agentName]: {
523
+ name: lastAgentStateMessage.agentName,
524
+ state: lastAgentStateMessage.state,
525
+ running: lastAgentStateMessage.running,
526
+ active: lastAgentStateMessage.active,
527
+ threadId: lastAgentStateMessage.threadId,
528
+ nodeName: lastAgentStateMessage.nodeName,
529
+ runId: lastAgentStateMessage.runId
402
530
  }
531
+ }));
532
+ if (lastAgentStateMessage.running) {
533
+ setAgentSession({
534
+ threadId: lastAgentStateMessage.threadId,
535
+ agentName: lastAgentStateMessage.agentName,
536
+ nodeName: lastAgentStateMessage.nodeName
537
+ });
538
+ } else {
539
+ setAgentSession(null);
403
540
  }
404
- newMessages.push(
405
- new import_runtime_client_gql2.ResultMessage({
406
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
541
+ }
542
+ }
543
+ if (newMessages.length > 0) {
544
+ setMessages([...previousMessages, ...newMessages]);
545
+ }
546
+ }
547
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
548
+ let didExecuteAction = false;
549
+ if (onFunctionCall) {
550
+ const lastMessages = [];
551
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
552
+ const message = finalMessages[i];
553
+ if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql3.MessageStatusCode.Pending) {
554
+ lastMessages.unshift(message);
555
+ } else {
556
+ break;
557
+ }
558
+ }
559
+ for (const message of lastMessages) {
560
+ setMessages(finalMessages);
561
+ const action = actions.find((action2) => action2.name === message.name);
562
+ if (action) {
563
+ followUp = action.followUp;
564
+ let result;
565
+ try {
566
+ result = yield Promise.race([
567
+ onFunctionCall({
568
+ messages: previousMessages,
569
+ name: message.name,
570
+ args: message.arguments
571
+ }),
572
+ new Promise(
573
+ (resolve) => {
574
+ var _a2;
575
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
576
+ "abort",
577
+ () => resolve("Operation was aborted by the user")
578
+ );
579
+ }
580
+ ),
581
+ // if the user stopped generation, we also abort consecutive actions
582
+ new Promise((resolve) => {
583
+ var _a2;
584
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
585
+ resolve("Operation was aborted by the user");
586
+ }
587
+ })
588
+ ]);
589
+ } catch (e) {
590
+ result = `Failed to execute action ${message.name}`;
591
+ console.error(`Failed to execute action ${message.name}: ${e}`);
592
+ }
593
+ didExecuteAction = true;
594
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
595
+ finalMessages.splice(
596
+ messageIndex + 1,
597
+ 0,
598
+ new import_runtime_client_gql3.ResultMessage({
599
+ id: "result-" + message.id,
600
+ result: import_runtime_client_gql3.ResultMessage.encodeResult(result),
407
601
  actionExecutionId: message.id,
408
602
  actionName: message.name
409
603
  })
410
604
  );
411
605
  }
412
- if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
413
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
414
- break;
415
- }
416
- yield onCoAgentStateRender({
417
- name: message.agentName,
418
- nodeName: message.nodeName,
419
- state: message.state
420
- });
421
- executedCoAgentStateRenders.push(message.id);
422
- }
423
606
  }
424
- const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
425
- if (lastAgentStateMessage) {
426
- setCoagentStates((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
427
- [lastAgentStateMessage.agentName]: {
428
- name: lastAgentStateMessage.agentName,
429
- state: lastAgentStateMessage.state,
430
- running: lastAgentStateMessage.running,
431
- active: lastAgentStateMessage.active,
432
- threadId: lastAgentStateMessage.threadId,
433
- nodeName: lastAgentStateMessage.nodeName,
434
- runId: lastAgentStateMessage.runId
435
- }
436
- }));
437
- if (lastAgentStateMessage.running) {
438
- setAgentSession({
439
- threadId: lastAgentStateMessage.threadId,
440
- agentName: lastAgentStateMessage.agentName,
441
- nodeName: lastAgentStateMessage.nodeName
442
- });
443
- } else {
444
- setAgentSession(null);
607
+ setMessages(finalMessages);
608
+ }
609
+ if (
610
+ // if followUp is not explicitly false
611
+ followUp !== false && // and we executed an action
612
+ (didExecuteAction || // the last message is a server side result
613
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
614
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
615
+ ) {
616
+ yield new Promise((resolve) => setTimeout(resolve, 10));
617
+ return yield runChatCompletionRef.current(finalMessages);
618
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
619
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
620
+ if (message.isActionExecutionMessage()) {
621
+ return finalMessages.find(
622
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
623
+ );
445
624
  }
625
+ return true;
626
+ });
627
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
628
+ setMessages(repairedMessages);
629
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
630
+ setAgentSession({
631
+ threadId: agentSessionRef.current.threadId,
632
+ agentName: agentSessionRef.current.agentName,
633
+ nodeName: "__end__"
634
+ });
446
635
  }
636
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
637
+ } else {
638
+ return newMessages.slice();
447
639
  }
448
- if (newMessages.length > 0) {
449
- setMessages([...previousMessages, ...newMessages]);
450
- }
640
+ } finally {
641
+ setIsLoading(false);
451
642
  }
452
- if (
453
- // if followUp is not explicitly false
454
- followUp !== false && // if we have client side results
455
- (Object.values(actionResults).length || // or the last message we received is a result
456
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
457
- ) {
458
- yield new Promise((resolve) => setTimeout(resolve, 10));
459
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
460
- } else {
461
- return newMessages.slice();
462
- }
463
- } finally {
464
- setIsLoading(false);
465
- }
466
- });
643
+ }),
644
+ [
645
+ messages,
646
+ setMessages,
647
+ makeSystemMessageCallback,
648
+ copilotConfig,
649
+ setIsLoading,
650
+ initialMessages,
651
+ isLoading,
652
+ actions,
653
+ onFunctionCall,
654
+ onCoAgentStateRender,
655
+ setCoagentStatesWithRef,
656
+ coagentStatesRef,
657
+ agentSession,
658
+ setAgentSession
659
+ ]
660
+ );
467
661
  runChatCompletionRef.current = runChatCompletion;
468
- const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
469
- yield runChatCompletionRef.current(messages2);
470
- });
471
- const append = (message) => __async(this, null, function* () {
472
- if (isLoading) {
473
- return;
474
- }
475
- const newMessages = [...messages, message];
476
- setMessages(newMessages);
477
- return runChatCompletionAndHandleFunctionCall(newMessages);
478
- });
479
- const reload = () => __async(this, null, function* () {
662
+ const runChatCompletionAndHandleFunctionCall = useAsyncCallback(
663
+ (messages2) => __async(this, null, function* () {
664
+ yield runChatCompletionRef.current(messages2);
665
+ }),
666
+ [messages]
667
+ );
668
+ const append = useAsyncCallback(
669
+ (message) => __async(this, null, function* () {
670
+ if (isLoading) {
671
+ return;
672
+ }
673
+ const newMessages = [...messages, message];
674
+ setMessages(newMessages);
675
+ return runChatCompletionAndHandleFunctionCall(newMessages);
676
+ }),
677
+ [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]
678
+ );
679
+ const reload = useAsyncCallback(() => __async(this, null, function* () {
480
680
  if (isLoading || messages.length === 0) {
481
681
  return;
482
682
  }
@@ -487,7 +687,7 @@ function useChat(options) {
487
687
  }
488
688
  setMessages(newMessages);
489
689
  return runChatCompletionAndHandleFunctionCall(newMessages);
490
- });
690
+ }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
491
691
  const stop = () => {
492
692
  var _a;
493
693
  (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
@@ -495,15 +695,33 @@ function useChat(options) {
495
695
  return {
496
696
  append,
497
697
  reload,
498
- stop
698
+ stop,
699
+ runChatCompletion: () => runChatCompletionRef.current(messages)
499
700
  };
500
701
  }
702
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
703
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
704
+ if (syncedMessages.length > 0) {
705
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
706
+ let previousMessageId = void 0;
707
+ for (const message of messagesWithAgentState) {
708
+ if (message.isAgentStateMessage()) {
709
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
710
+ if (index !== -1) {
711
+ finalMessages.splice(index + 1, 0, message);
712
+ }
713
+ }
714
+ previousMessageId = message.id;
715
+ }
716
+ }
717
+ return finalMessages;
718
+ }
501
719
 
502
720
  // src/components/copilot-provider/copilotkit.tsx
503
- var import_react6 = require("react");
721
+ var import_react7 = require("react");
504
722
  var import_react_dom = require("react-dom");
505
- var import_shared2 = require("@copilotkit/shared");
506
- var import_jsx_runtime2 = require("react/jsx-runtime");
723
+ var import_shared3 = require("@copilotkit/shared");
724
+ var import_jsx_runtime4 = require("react/jsx-runtime");
507
725
  var defaultCopilotContextCategories = ["global"];
508
726
 
509
727
  // src/hooks/use-copilot-chat.ts
@@ -521,8 +739,8 @@ function useCopilotChat(_a = {}) {
521
739
  setIsLoading,
522
740
  chatInstructions,
523
741
  actions,
524
- coagentStates,
525
- setCoagentStates,
742
+ coagentStatesRef,
743
+ setCoagentStatesWithRef,
526
744
  coAgentStateRenders,
527
745
  agentSession,
528
746
  setAgentSession,
@@ -535,21 +753,21 @@ function useCopilotChat(_a = {}) {
535
753
  } = useCopilotContext();
536
754
  const { messages, setMessages } = useCopilotMessagesContext();
537
755
  const latestGetContextString = useUpdatedRef(getContextString);
538
- const deleteMessage = (0, import_react7.useCallback)(
756
+ const deleteMessage = (0, import_react8.useCallback)(
539
757
  (messageId) => {
540
758
  setMessages((prev) => prev.filter((message) => message.id !== messageId));
541
759
  },
542
760
  [setMessages]
543
761
  );
544
- const makeSystemMessageCallback = (0, import_react7.useCallback)(() => {
762
+ const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
545
763
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
546
764
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
547
- return new import_runtime_client_gql3.TextMessage({
765
+ return new import_runtime_client_gql4.TextMessage({
548
766
  content: systemMessageMaker(contextString, chatInstructions),
549
- role: import_runtime_client_gql3.Role.System
767
+ role: import_runtime_client_gql4.Role.System
550
768
  });
551
769
  }, [getContextString, makeSystemMessage, chatInstructions]);
552
- const onCoAgentStateRender = (0, import_react7.useCallback)(
770
+ const onCoAgentStateRender = useAsyncCallback(
553
771
  (args) => __async(this, null, function* () {
554
772
  var _a2;
555
773
  const { name, nodeName, state } = args;
@@ -567,7 +785,7 @@ function useCopilotChat(_a = {}) {
567
785
  }),
568
786
  [coAgentStateRenders]
569
787
  );
570
- const { append, reload, stop } = useChat(__spreadProps(__spreadValues({}, options), {
788
+ const { append, reload, stop, runChatCompletion } = useChat(__spreadProps(__spreadValues({}, options), {
571
789
  actions: Object.values(actions),
572
790
  copilotConfig: copilotApiConfig,
573
791
  initialMessages: options.initialMessages || [],
@@ -578,8 +796,8 @@ function useCopilotChat(_a = {}) {
578
796
  makeSystemMessageCallback,
579
797
  isLoading,
580
798
  setIsLoading,
581
- coagentStates,
582
- setCoagentStates,
799
+ coagentStatesRef,
800
+ setCoagentStatesWithRef,
583
801
  agentSession,
584
802
  setAgentSession,
585
803
  threadId,
@@ -589,40 +807,44 @@ function useCopilotChat(_a = {}) {
589
807
  chatAbortControllerRef
590
808
  }));
591
809
  const latestAppend = useUpdatedRef(append);
592
- const latestAppendFunc = (0, import_react7.useCallback)(
593
- (message) => {
594
- return latestAppend.current(message);
595
- },
810
+ const latestAppendFunc = useAsyncCallback(
811
+ (message) => __async(this, null, function* () {
812
+ return yield latestAppend.current(message);
813
+ }),
596
814
  [latestAppend]
597
815
  );
598
816
  const latestReload = useUpdatedRef(reload);
599
- const latestReloadFunc = (0, import_react7.useCallback)(() => {
600
- return latestReload.current();
601
- }, [latestReload]);
817
+ const latestReloadFunc = useAsyncCallback(() => __async(this, null, function* () {
818
+ return yield latestReload.current();
819
+ }), [latestReload]);
602
820
  const latestStop = useUpdatedRef(stop);
603
- const latestStopFunc = (0, import_react7.useCallback)(() => {
821
+ const latestStopFunc = (0, import_react8.useCallback)(() => {
604
822
  return latestStop.current();
605
823
  }, [latestStop]);
606
824
  const latestDelete = useUpdatedRef(deleteMessage);
607
- const latestDeleteFunc = (0, import_react7.useCallback)(
825
+ const latestDeleteFunc = (0, import_react8.useCallback)(
608
826
  (messageId) => {
609
827
  return latestDelete.current(messageId);
610
828
  },
611
829
  [latestDelete]
612
830
  );
613
831
  const latestSetMessages = useUpdatedRef(setMessages);
614
- const latestSetMessagesFunc = (0, import_react7.useCallback)(
832
+ const latestSetMessagesFunc = (0, import_react8.useCallback)(
615
833
  (messages2) => {
616
834
  return latestSetMessages.current(messages2);
617
835
  },
618
836
  [latestSetMessages]
619
837
  );
620
- const reset = (0, import_react7.useCallback)(() => {
838
+ const latestRunChatCompletion = useUpdatedRef(runChatCompletion);
839
+ const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
840
+ return yield latestRunChatCompletion.current();
841
+ }), [latestRunChatCompletion]);
842
+ const reset = (0, import_react8.useCallback)(() => {
621
843
  latestStopFunc();
622
844
  setMessages([]);
623
845
  setThreadId(null);
624
846
  setRunId(null);
625
- setCoagentStates({});
847
+ setCoagentStatesWithRef({});
626
848
  let initialAgentSession = null;
627
849
  if (agentLock) {
628
850
  initialAgentSession = {
@@ -630,9 +852,16 @@ function useCopilotChat(_a = {}) {
630
852
  };
631
853
  }
632
854
  setAgentSession(initialAgentSession);
633
- }, [latestStopFunc, setMessages, setThreadId, setCoagentStates, setAgentSession, agentLock]);
855
+ }, [
856
+ latestStopFunc,
857
+ setMessages,
858
+ setThreadId,
859
+ setCoagentStatesWithRef,
860
+ setAgentSession,
861
+ agentLock
862
+ ]);
634
863
  const latestReset = useUpdatedRef(reset);
635
- const latestResetFunc = (0, import_react7.useCallback)(() => {
864
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
636
865
  return latestReset.current();
637
866
  }, [latestReset]);
638
867
  return {
@@ -643,12 +872,13 @@ function useCopilotChat(_a = {}) {
643
872
  stopGeneration: latestStopFunc,
644
873
  reset: latestResetFunc,
645
874
  deleteMessage: latestDeleteFunc,
875
+ runChatCompletion: latestRunChatCompletionFunc,
646
876
  isLoading
647
877
  };
648
878
  }
649
879
  function useUpdatedRef(value) {
650
- const ref = (0, import_react7.useRef)(value);
651
- (0, import_react7.useEffect)(() => {
880
+ const ref = (0, import_react8.useRef)(value);
881
+ (0, import_react8.useEffect)(() => {
652
882
  ref.current = value;
653
883
  }, [value]);
654
884
  return ref;
@@ -689,8 +919,8 @@ function useCoAgent(options) {
689
919
  const generalContext = useCopilotContext();
690
920
  const messagesContext = useCopilotMessagesContext();
691
921
  const context = __spreadValues(__spreadValues({}, generalContext), messagesContext);
692
- const { coagentStates, setCoagentStates } = context;
693
- const { appendMessage } = useCopilotChat();
922
+ const { coagentStates, coagentStatesRef, setCoagentStatesWithRef } = context;
923
+ const { appendMessage, runChatCompletion } = useCopilotChat();
694
924
  const getCoagentState = (coagentStates2, name2) => {
695
925
  if (coagentStates2[name2]) {
696
926
  return coagentStates2[name2];
@@ -707,19 +937,17 @@ function useCoAgent(options) {
707
937
  }
708
938
  };
709
939
  const setState = (newState) => {
710
- setCoagentStates((prevAgentStates) => {
711
- let coagentState2 = getCoagentState(prevAgentStates, name);
712
- const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
713
- return __spreadProps(__spreadValues({}, prevAgentStates), {
714
- [name]: __spreadProps(__spreadValues({}, coagentState2), {
715
- state: updatedState
716
- })
717
- });
718
- });
940
+ let coagentState2 = getCoagentState(coagentStatesRef.current || {}, name);
941
+ const updatedState = typeof newState === "function" ? newState(coagentState2.state) : newState;
942
+ setCoagentStatesWithRef(__spreadProps(__spreadValues({}, coagentStatesRef.current), {
943
+ [name]: __spreadProps(__spreadValues({}, coagentState2), {
944
+ state: updatedState
945
+ })
946
+ }));
719
947
  };
720
948
  const coagentState = getCoagentState(coagentStates, name);
721
949
  const state = isExternalStateManagement(options) ? options.state : coagentState.state;
722
- (0, import_react8.useEffect)(() => {
950
+ (0, import_react9.useEffect)(() => {
723
951
  if (isExternalStateManagement(options)) {
724
952
  setState(options.state);
725
953
  } else if (coagentStates[name] === void 0) {
@@ -728,23 +956,24 @@ function useCoAgent(options) {
728
956
  }, [
729
957
  isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
730
958
  // reset initialstate on reset
731
- coagentStates === void 0
959
+ coagentStates[name] === void 0
732
960
  ]);
961
+ const runAgentCallback = useAsyncCallback(
962
+ (hint) => __async(this, null, function* () {
963
+ yield runAgent(name, context, appendMessage, runChatCompletion, hint);
964
+ }),
965
+ [name, context, appendMessage, runChatCompletion]
966
+ );
733
967
  return {
734
968
  name,
735
969
  nodeName: coagentState.nodeName,
736
- state,
737
- setState,
970
+ threadId: coagentState.threadId,
738
971
  running: coagentState.running,
739
- start: () => {
740
- startAgent(name, context);
741
- },
742
- stop: () => {
743
- stopAgent(name, context);
744
- },
745
- run: (hint) => {
746
- return runAgent(name, context, appendMessage, hint);
747
- }
972
+ state: coagentState.state,
973
+ setState: isExternalStateManagement(options) ? options.setState : setState,
974
+ start: () => startAgent(name, context),
975
+ stop: () => stopAgent(name, context),
976
+ run: runAgentCallback
748
977
  };
749
978
  }
750
979
  function startAgent(name, context) {
@@ -772,7 +1001,7 @@ function stopAgent(name, context) {
772
1001
  console.warn(`No agent session found for ${name}`);
773
1002
  }
774
1003
  }
775
- function runAgent(name, context, appendMessage, hint) {
1004
+ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
776
1005
  return __async(this, null, function* () {
777
1006
  var _a, _b;
778
1007
  const { agentSession, setAgentSession } = context;
@@ -788,12 +1017,16 @@ function runAgent(name, context, appendMessage, hint) {
788
1017
  previousState = message.state;
789
1018
  }
790
1019
  }
791
- let state = ((_b = (_a = context.coagentStates) == null ? void 0 : _a[name]) == null ? void 0 : _b.state) || {};
1020
+ let state = ((_b = (_a = context.coagentStatesRef.current) == null ? void 0 : _a[name]) == null ? void 0 : _b.state) || {};
792
1021
  if (hint) {
793
1022
  const hintMessage = hint({ previousState, currentState: state });
794
1023
  if (hintMessage) {
795
1024
  yield appendMessage(hintMessage);
1025
+ } else {
1026
+ yield runChatCompletion();
796
1027
  }
1028
+ } else {
1029
+ yield runChatCompletion();
797
1030
  }
798
1031
  });
799
1032
  }