@copilotkit/react-core 1.4.8-no-pino-redact.1 → 1.5.0-coagents-v0-3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +22 -3
  2. package/dist/{chunk-JHEAUB3Z.mjs → chunk-35EN6BG4.mjs} +2 -2
  3. package/dist/{chunk-JHEAUB3Z.mjs.map → chunk-35EN6BG4.mjs.map} +1 -1
  4. package/dist/{chunk-O22KGHOQ.mjs → chunk-42N5VKIX.mjs} +38 -16
  5. package/dist/chunk-42N5VKIX.mjs.map +1 -0
  6. package/dist/{chunk-AG7FH7OD.mjs → chunk-5FYKUKG3.mjs} +2 -2
  7. package/dist/{chunk-ODN4H66E.mjs → chunk-7LRDVJH5.mjs} +6 -2
  8. package/dist/chunk-7LRDVJH5.mjs.map +1 -0
  9. package/dist/{chunk-Y7MI4PBB.mjs → chunk-ALR5W5JK.mjs} +22 -10
  10. package/dist/chunk-ALR5W5JK.mjs.map +1 -0
  11. package/dist/{chunk-XBVKTDXP.mjs → chunk-BT6WK2JZ.mjs} +57 -17
  12. package/dist/chunk-BT6WK2JZ.mjs.map +1 -0
  13. package/dist/chunk-QCUP6HLK.mjs +37 -0
  14. package/dist/chunk-QCUP6HLK.mjs.map +1 -0
  15. package/dist/chunk-QTDCEDOC.mjs +392 -0
  16. package/dist/chunk-QTDCEDOC.mjs.map +1 -0
  17. package/dist/{chunk-OT67R4NB.mjs → chunk-QX6V774L.mjs} +6 -8
  18. package/dist/chunk-QX6V774L.mjs.map +1 -0
  19. package/dist/{chunk-2KCEHGSI.mjs → chunk-SFPANIOY.mjs} +99 -49
  20. package/dist/chunk-SFPANIOY.mjs.map +1 -0
  21. package/dist/{chunk-XQFVXX6R.mjs → chunk-TQN3EZWQ.mjs} +10 -2
  22. package/dist/chunk-TQN3EZWQ.mjs.map +1 -0
  23. package/dist/{chunk-UOVONDR6.mjs → chunk-V3PFWGIY.mjs} +2 -2
  24. package/dist/{chunk-DHGXL5PC.mjs → chunk-VMP6JWBB.mjs} +18 -6
  25. package/dist/chunk-VMP6JWBB.mjs.map +1 -0
  26. package/dist/chunk-XERJQUHA.mjs +31 -0
  27. package/dist/chunk-XERJQUHA.mjs.map +1 -0
  28. package/dist/components/copilot-provider/copilotkit.js +175 -93
  29. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  30. package/dist/components/copilot-provider/copilotkit.mjs +5 -4
  31. package/dist/components/copilot-provider/index.js +175 -93
  32. package/dist/components/copilot-provider/index.js.map +1 -1
  33. package/dist/components/copilot-provider/index.mjs +5 -4
  34. package/dist/components/error-boundary/error-boundary.d.ts +22 -0
  35. package/dist/components/error-boundary/error-boundary.js +183 -0
  36. package/dist/components/error-boundary/error-boundary.js.map +1 -0
  37. package/dist/components/error-boundary/error-boundary.mjs +12 -0
  38. package/dist/components/error-boundary/error-boundary.mjs.map +1 -0
  39. package/dist/components/error-boundary/error-utils.d.ts +11 -0
  40. package/dist/components/error-boundary/error-utils.js +177 -0
  41. package/dist/components/error-boundary/error-utils.js.map +1 -0
  42. package/dist/components/error-boundary/error-utils.mjs +13 -0
  43. package/dist/components/error-boundary/error-utils.mjs.map +1 -0
  44. package/dist/components/index.js +175 -93
  45. package/dist/components/index.js.map +1 -1
  46. package/dist/components/index.mjs +5 -4
  47. package/dist/components/toast/toast-provider.d.ts +2 -1
  48. package/dist/components/toast/toast-provider.js +76 -62
  49. package/dist/components/toast/toast-provider.js.map +1 -1
  50. package/dist/components/toast/toast-provider.mjs +1 -1
  51. package/dist/context/copilot-context.d.ts +8 -2
  52. package/dist/context/copilot-context.js +9 -1
  53. package/dist/context/copilot-context.js.map +1 -1
  54. package/dist/context/copilot-context.mjs +1 -1
  55. package/dist/context/index.d.ts +1 -1
  56. package/dist/context/index.js +9 -1
  57. package/dist/context/index.js.map +1 -1
  58. package/dist/context/index.mjs +1 -1
  59. package/dist/hooks/index.d.ts +2 -1
  60. package/dist/hooks/index.js +584 -270
  61. package/dist/hooks/index.js.map +1 -1
  62. package/dist/hooks/index.mjs +19 -11
  63. package/dist/hooks/use-chat.d.ts +20 -0
  64. package/dist/hooks/use-chat.js +438 -200
  65. package/dist/hooks/use-chat.js.map +1 -1
  66. package/dist/hooks/use-chat.mjs +4 -3
  67. package/dist/hooks/use-coagent-state-render.d.ts +2 -2
  68. package/dist/hooks/use-coagent-state-render.js +9 -1
  69. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  70. package/dist/hooks/use-coagent-state-render.mjs +2 -2
  71. package/dist/hooks/use-coagent.d.ts +14 -1
  72. package/dist/hooks/use-coagent.js +547 -242
  73. package/dist/hooks/use-coagent.js.map +1 -1
  74. package/dist/hooks/use-coagent.mjs +15 -7
  75. package/dist/hooks/use-copilot-action.d.ts +12 -2
  76. package/dist/hooks/use-copilot-action.js +156 -14
  77. package/dist/hooks/use-copilot-action.js.map +1 -1
  78. package/dist/hooks/use-copilot-action.mjs +4 -2
  79. package/dist/hooks/use-copilot-chat.d.ts +1 -0
  80. package/dist/hooks/use-copilot-chat.js +514 -231
  81. package/dist/hooks/use-copilot-chat.js.map +1 -1
  82. package/dist/hooks/use-copilot-chat.mjs +8 -6
  83. package/dist/hooks/use-copilot-readable.js +9 -1
  84. package/dist/hooks/use-copilot-readable.js.map +1 -1
  85. package/dist/hooks/use-copilot-readable.mjs +2 -2
  86. package/dist/hooks/use-copilot-runtime-client.js +110 -4
  87. package/dist/hooks/use-copilot-runtime-client.js.map +1 -1
  88. package/dist/hooks/use-copilot-runtime-client.mjs +2 -2
  89. package/dist/hooks/use-make-copilot-document-readable.js +9 -1
  90. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  91. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.js +642 -363
  94. package/dist/index.js.map +1 -1
  95. package/dist/index.mjs +20 -12
  96. package/dist/lib/copilot-task.d.ts +1 -1
  97. package/dist/lib/copilot-task.js +33 -13
  98. package/dist/lib/copilot-task.js.map +1 -1
  99. package/dist/lib/copilot-task.mjs +7 -5
  100. package/dist/lib/index.d.ts +1 -1
  101. package/dist/lib/index.js +33 -13
  102. package/dist/lib/index.js.map +1 -1
  103. package/dist/lib/index.mjs +7 -5
  104. package/dist/types/frontend-action.d.ts +21 -2
  105. package/dist/types/frontend-action.js +34 -0
  106. package/dist/types/frontend-action.js.map +1 -1
  107. package/dist/types/frontend-action.mjs +7 -0
  108. package/dist/types/index.d.ts +2 -1
  109. package/dist/types/index.js.map +1 -1
  110. package/dist/utils/extract.js.map +1 -1
  111. package/dist/utils/extract.mjs +5 -4
  112. package/dist/utils/index.js.map +1 -1
  113. package/dist/utils/index.mjs +5 -4
  114. package/package.json +3 -3
  115. package/src/components/copilot-provider/copilotkit.tsx +14 -1
  116. package/src/components/error-boundary/error-boundary.tsx +42 -0
  117. package/src/components/error-boundary/error-utils.tsx +95 -0
  118. package/src/components/toast/toast-provider.tsx +10 -49
  119. package/src/context/copilot-context.tsx +30 -2
  120. package/src/hooks/index.ts +1 -1
  121. package/src/hooks/use-chat.ts +391 -256
  122. package/src/hooks/use-coagent-state-render.ts +2 -2
  123. package/src/hooks/use-coagent.ts +35 -15
  124. package/src/hooks/use-copilot-action.ts +41 -12
  125. package/src/hooks/use-copilot-chat.ts +52 -11
  126. package/src/hooks/use-copilot-runtime-client.ts +4 -0
  127. package/src/lib/copilot-task.ts +2 -8
  128. package/src/types/frontend-action.ts +55 -2
  129. package/src/types/index.ts +5 -1
  130. package/dist/chunk-2KCEHGSI.mjs.map +0 -1
  131. package/dist/chunk-DHGXL5PC.mjs.map +0 -1
  132. package/dist/chunk-EUIBVFV6.mjs +0 -294
  133. package/dist/chunk-EUIBVFV6.mjs.map +0 -1
  134. package/dist/chunk-O22KGHOQ.mjs.map +0 -1
  135. package/dist/chunk-ODN4H66E.mjs.map +0 -1
  136. package/dist/chunk-OT67R4NB.mjs.map +0 -1
  137. package/dist/chunk-XBVKTDXP.mjs.map +0 -1
  138. package/dist/chunk-XQFVXX6R.mjs.map +0 -1
  139. package/dist/chunk-Y7MI4PBB.mjs.map +0 -1
  140. /package/dist/{chunk-AG7FH7OD.mjs.map → chunk-5FYKUKG3.mjs.map} +0 -0
  141. /package/dist/{chunk-UOVONDR6.mjs.map → chunk-V3PFWGIY.mjs.map} +0 -0
@@ -79,10 +79,13 @@ var __async = (__this, __arguments, generator) => {
79
79
  // src/hooks/use-coagent.ts
80
80
  var use_coagent_exports = {};
81
81
  __export(use_coagent_exports, {
82
+ runAgent: () => runAgent,
83
+ startAgent: () => startAgent,
84
+ stopAgent: () => stopAgent,
82
85
  useCoAgent: () => useCoAgent
83
86
  });
84
87
  module.exports = __toCommonJS(use_coagent_exports);
85
- var import_react8 = require("react");
88
+ var import_react9 = require("react");
86
89
 
87
90
  // src/context/copilot-context.tsx
88
91
  var import_react = __toESM(require("react"));
@@ -138,7 +141,15 @@ var emptyCopilotContext = {
138
141
  },
139
142
  agentSession: null,
140
143
  setAgentSession: () => {
141
- }
144
+ },
145
+ agentLock: null,
146
+ threadId: null,
147
+ setThreadId: () => {
148
+ },
149
+ runId: null,
150
+ setRunId: () => {
151
+ },
152
+ chatAbortControllerRef: { current: null }
142
153
  };
143
154
  var CopilotContext = import_react.default.createContext(emptyCopilotContext);
144
155
  function useCopilotContext() {
@@ -171,20 +182,160 @@ function useCopilotMessagesContext() {
171
182
  }
172
183
 
173
184
  // src/hooks/use-copilot-chat.ts
174
- var import_react7 = require("react");
175
- 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");
176
187
 
177
188
  // src/hooks/use-chat.ts
178
- 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");
179
195
  var import_shared = require("@copilotkit/shared");
180
- 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
+ }
181
217
 
182
218
  // src/components/toast/toast-provider.tsx
219
+ var import_react4 = require("react");
220
+
221
+ // src/components/error-boundary/error-utils.tsx
183
222
  var import_react3 = require("react");
223
+
224
+ // src/components/toast/exclamation-mark-icon.tsx
184
225
  var import_jsx_runtime = require("react/jsx-runtime");
185
- 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);
186
337
  function useToast() {
187
- const context = (0, import_react3.useContext)(ToastContext);
338
+ const context = (0, import_react4.useContext)(ToastContext);
188
339
  if (!context) {
189
340
  throw new Error("useToast must be used within a ToastProvider");
190
341
  }
@@ -192,15 +343,18 @@ function useToast() {
192
343
  }
193
344
 
194
345
  // src/hooks/use-copilot-runtime-client.ts
195
- var import_runtime_client_gql = require("@copilotkit/runtime-client-gql");
196
- var import_react4 = require("react");
346
+ var import_runtime_client_gql2 = require("@copilotkit/runtime-client-gql");
347
+ var import_react5 = require("react");
197
348
  var useCopilotRuntimeClient = (options) => {
198
349
  const { addGraphQLErrorsToast } = useToast();
199
- const runtimeClient = (0, import_react4.useMemo)(() => {
200
- 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), {
201
353
  handleGQLErrors: (error) => {
202
354
  if (error.graphQLErrors.length) {
203
355
  addGraphQLErrorsToast(error.graphQLErrors);
356
+ } else {
357
+ addErrorToast([error]);
204
358
  }
205
359
  }
206
360
  }));
@@ -224,227 +378,305 @@ function useChat(options) {
224
378
  setCoagentStatesWithRef,
225
379
  coagentStatesRef,
226
380
  agentSession,
227
- setAgentSession
381
+ setAgentSession,
382
+ threadId,
383
+ setThreadId,
384
+ runId,
385
+ setRunId,
386
+ chatAbortControllerRef
228
387
  } = options;
229
- const abortControllerRef = (0, import_react5.useRef)();
230
- const threadIdRef = (0, import_react5.useRef)(null);
231
- const runIdRef = (0, import_react5.useRef)(null);
232
388
  const { addGraphQLErrorsToast } = useToast();
233
- const runChatCompletionRef = (0, import_react5.useRef)();
234
- const agentSessionRef = (0, import_react5.useRef)(agentSession);
389
+ const runChatCompletionRef = (0, import_react6.useRef)();
390
+ const agentSessionRef = (0, import_react6.useRef)(agentSession);
235
391
  agentSessionRef.current = agentSession;
392
+ const threadIdRef = (0, import_react6.useRef)(threadId);
393
+ threadIdRef.current = threadId;
394
+ const runIdRef = (0, import_react6.useRef)(runId);
395
+ runIdRef.current = runId;
236
396
  const publicApiKey = copilotConfig.publicApiKey;
237
- 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 } : {});
238
398
  const runtimeClient = useCopilotRuntimeClient({
239
399
  url: copilotConfig.chatApiEndpoint,
240
400
  publicApiKey: copilotConfig.publicApiKey,
241
401
  headers,
242
402
  credentials: copilotConfig.credentials
243
403
  });
244
- const runChatCompletion = (previousMessages) => __async(this, null, function* () {
245
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
246
- setIsLoading(true);
247
- let newMessages = [
248
- new import_runtime_client_gql2.TextMessage({
249
- content: "",
250
- role: import_runtime_client_gql2.Role.Assistant
251
- })
252
- ];
253
- const abortController = new AbortController();
254
- abortControllerRef.current = abortController;
255
- setMessages([...previousMessages, ...newMessages]);
256
- const systemMessage = makeSystemMessageCallback();
257
- const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
258
- const stream = runtimeClient.asStream(
259
- runtimeClient.generateCopilotResponse({
260
- data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
261
- frontend: {
262
- actions: actions.filter(
263
- (action) => action.available !== import_runtime_client_gql2.ActionInputAvailability.Disabled || !action.disabled
264
- ).map((action) => {
265
- let available = import_runtime_client_gql2.ActionInputAvailability.Enabled;
266
- if (action.disabled) {
267
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
268
- } else if (action.available === "disabled") {
269
- available = import_runtime_client_gql2.ActionInputAvailability.Disabled;
270
- } else if (action.available === "remote") {
271
- available = import_runtime_client_gql2.ActionInputAvailability.Remote;
272
- }
273
- return {
274
- name: action.name,
275
- description: action.description || "",
276
- jsonSchema: JSON.stringify((0, import_shared.actionParametersToJsonSchema)(action.parameters || [])),
277
- available
278
- };
279
- }),
280
- url: window.location.href
281
- },
282
- threadId: threadIdRef.current,
283
- runId: runIdRef.current,
284
- messages: (0, import_runtime_client_gql2.convertMessagesToGqlInput)((0, import_runtime_client_gql2.filterAgentStateMessages)(messagesWithContext))
285
- }, copilotConfig.cloud ? {
286
- cloud: __spreadValues({}, ((_c = (_b = (_a = copilotConfig.cloud.guardrails) == null ? void 0 : _a.input) == null ? void 0 : _b.restrictToTopic) == null ? void 0 : _c.enabled) ? {
287
- guardrails: {
288
- inputValidationRules: {
289
- allowList: copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,
290
- 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
+ }
291
436
  }
437
+ } : {})
438
+ } : {}), {
439
+ metadata: {
440
+ requestType: import_runtime_client_gql3.CopilotRequestType.Chat
292
441
  }
293
- } : {})
294
- } : {}), {
295
- metadata: {
296
- 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;
297
469
  }
298
- }), agentSessionRef.current ? {
299
- agentSession: agentSessionRef.current
300
- } : {}), {
301
- agentStates: Object.values(coagentStatesRef.current).map((state) => ({
302
- agentName: state.name,
303
- state: JSON.stringify(state.state)
304
- }))
305
- }),
306
- properties: copilotConfig.properties,
307
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
308
- })
309
- );
310
- const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
311
- const reader = stream.getReader();
312
- let actionResults = {};
313
- let executedCoAgentStateRenders = [];
314
- let followUp = void 0;
315
- try {
316
- while (true) {
317
- let done, value;
318
- try {
319
- const readResult = yield reader.read();
320
- done = readResult.done;
321
- value = readResult.value;
322
- } catch (readError) {
323
- break;
324
- }
325
- if (done) {
326
- break;
327
- }
328
- if (!(value == null ? void 0 : value.generateCopilotResponse)) {
329
- continue;
330
- }
331
- threadIdRef.current = value.generateCopilotResponse.threadId || null;
332
- runIdRef.current = value.generateCopilotResponse.runId || null;
333
- const messages2 = (0, import_runtime_client_gql2.convertGqlOutputToMessages)(
334
- (0, import_runtime_client_gql2.filterAdjacentAgentStateMessages)(value.generateCopilotResponse.messages)
335
- );
336
- if (messages2.length === 0) {
337
- continue;
338
- }
339
- newMessages = [];
340
- if (((_h = value.generateCopilotResponse.status) == null ? void 0 : _h.__typename) === "FailedResponseStatus" && value.generateCopilotResponse.status.reason === "GUARDRAILS_VALIDATION_FAILED") {
341
- newMessages = [
342
- new import_runtime_client_gql2.TextMessage({
343
- role: import_runtime_client_gql2.MessageRole.Assistant,
344
- content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
345
- })
346
- ];
347
- } else {
348
- for (const message of messages2) {
349
- newMessages.push(message);
350
- if (message.isActionExecutionMessage() && message.status.code !== import_runtime_client_gql2.MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
351
- if (!(message.id in actionResults)) {
470
+ if (done) {
471
+ if (chatAbortControllerRef.current.signal.aborted) {
472
+ return [];
473
+ }
474
+ break;
475
+ }
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) {
352
503
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
353
504
  break;
354
505
  }
355
- try {
356
- setMessages([...previousMessages, ...newMessages]);
357
- const action = actions.find((action2) => action2.name === message.name);
358
- if (action) {
359
- followUp = action.followUp;
360
- }
361
- const result = yield onFunctionCall({
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
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);
540
+ }
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({
362
568
  messages: previousMessages,
363
569
  name: message.name,
364
570
  args: message.arguments
365
- });
366
- actionResults[message.id] = result;
367
- } catch (e) {
368
- actionResults[message.id] = `Failed to execute action ${message.name}`;
369
- console.error(`Failed to execute action ${message.name}: ${e}`);
370
- }
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}`);
371
592
  }
372
- newMessages.push(
373
- new import_runtime_client_gql2.ResultMessage({
374
- result: import_runtime_client_gql2.ResultMessage.encodeResult(actionResults[message.id]),
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),
375
601
  actionExecutionId: message.id,
376
602
  actionName: message.name
377
603
  })
378
604
  );
379
605
  }
380
- if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
381
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
382
- break;
383
- }
384
- yield onCoAgentStateRender({
385
- name: message.agentName,
386
- nodeName: message.nodeName,
387
- state: message.state
388
- });
389
- executedCoAgentStateRenders.push(message.id);
390
- }
391
606
  }
392
- const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
393
- if (lastAgentStateMessage) {
394
- setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
395
- [lastAgentStateMessage.agentName]: {
396
- name: lastAgentStateMessage.agentName,
397
- state: lastAgentStateMessage.state,
398
- running: lastAgentStateMessage.running,
399
- active: lastAgentStateMessage.active,
400
- threadId: lastAgentStateMessage.threadId,
401
- nodeName: lastAgentStateMessage.nodeName,
402
- runId: lastAgentStateMessage.runId
403
- }
404
- }));
405
- if (lastAgentStateMessage.running) {
406
- setAgentSession({
407
- threadId: lastAgentStateMessage.threadId,
408
- agentName: lastAgentStateMessage.agentName,
409
- nodeName: lastAgentStateMessage.nodeName
410
- });
411
- } else {
412
- 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
+ );
413
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
+ });
414
635
  }
636
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
637
+ } else {
638
+ return newMessages.slice();
415
639
  }
416
- if (newMessages.length > 0) {
417
- setMessages([...previousMessages, ...newMessages]);
418
- }
640
+ } finally {
641
+ setIsLoading(false);
419
642
  }
420
- if (
421
- // if followUp is not explicitly false
422
- followUp !== false && // if we have client side results
423
- (Object.values(actionResults).length || // or the last message we received is a result
424
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
425
- ) {
426
- yield new Promise((resolve) => setTimeout(resolve, 10));
427
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
428
- } else {
429
- return newMessages.slice();
430
- }
431
- } finally {
432
- setIsLoading(false);
433
- }
434
- });
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
+ );
435
661
  runChatCompletionRef.current = runChatCompletion;
436
- const runChatCompletionAndHandleFunctionCall = (messages2) => __async(this, null, function* () {
437
- yield runChatCompletionRef.current(messages2);
438
- });
439
- const append = (message) => __async(this, null, function* () {
440
- if (isLoading) {
441
- return;
442
- }
443
- const newMessages = [...messages, message];
444
- setMessages(newMessages);
445
- return runChatCompletionAndHandleFunctionCall(newMessages);
446
- });
447
- 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* () {
448
680
  if (isLoading || messages.length === 0) {
449
681
  return;
450
682
  }
@@ -455,10 +687,10 @@ function useChat(options) {
455
687
  }
456
688
  setMessages(newMessages);
457
689
  return runChatCompletionAndHandleFunctionCall(newMessages);
458
- });
690
+ }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
459
691
  const stop = () => {
460
692
  var _a;
461
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
693
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
462
694
  };
463
695
  return {
464
696
  append,
@@ -467,12 +699,29 @@ function useChat(options) {
467
699
  runChatCompletion: () => runChatCompletionRef.current(messages)
468
700
  };
469
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
+ }
470
719
 
471
720
  // src/components/copilot-provider/copilotkit.tsx
472
- var import_react6 = require("react");
721
+ var import_react7 = require("react");
473
722
  var import_react_dom = require("react-dom");
474
- var import_shared2 = require("@copilotkit/shared");
475
- var import_jsx_runtime2 = require("react/jsx-runtime");
723
+ var import_shared3 = require("@copilotkit/shared");
724
+ var import_jsx_runtime4 = require("react/jsx-runtime");
476
725
  var defaultCopilotContextCategories = ["global"];
477
726
 
478
727
  // src/hooks/use-copilot-chat.ts
@@ -494,25 +743,31 @@ function useCopilotChat(_a = {}) {
494
743
  setCoagentStatesWithRef,
495
744
  coAgentStateRenders,
496
745
  agentSession,
497
- setAgentSession
746
+ setAgentSession,
747
+ agentLock,
748
+ threadId,
749
+ setThreadId,
750
+ runId,
751
+ setRunId,
752
+ chatAbortControllerRef
498
753
  } = useCopilotContext();
499
754
  const { messages, setMessages } = useCopilotMessagesContext();
500
755
  const latestGetContextString = useUpdatedRef(getContextString);
501
- const deleteMessage = (0, import_react7.useCallback)(
756
+ const deleteMessage = (0, import_react8.useCallback)(
502
757
  (messageId) => {
503
758
  setMessages((prev) => prev.filter((message) => message.id !== messageId));
504
759
  },
505
760
  [setMessages]
506
761
  );
507
- const makeSystemMessageCallback = (0, import_react7.useCallback)(() => {
762
+ const makeSystemMessageCallback = (0, import_react8.useCallback)(() => {
508
763
  const systemMessageMaker = makeSystemMessage || defaultSystemMessage;
509
764
  const contextString = latestGetContextString.current([], defaultCopilotContextCategories);
510
- return new import_runtime_client_gql3.TextMessage({
765
+ return new import_runtime_client_gql4.TextMessage({
511
766
  content: systemMessageMaker(contextString, chatInstructions),
512
- role: import_runtime_client_gql3.Role.System
767
+ role: import_runtime_client_gql4.Role.System
513
768
  });
514
769
  }, [getContextString, makeSystemMessage, chatInstructions]);
515
- const onCoAgentStateRender = (0, import_react7.useCallback)(
770
+ const onCoAgentStateRender = useAsyncCallback(
516
771
  (args) => __async(this, null, function* () {
517
772
  var _a2;
518
773
  const { name, nodeName, state } = args;
@@ -544,55 +799,86 @@ function useCopilotChat(_a = {}) {
544
799
  coagentStatesRef,
545
800
  setCoagentStatesWithRef,
546
801
  agentSession,
547
- setAgentSession
802
+ setAgentSession,
803
+ threadId,
804
+ setThreadId,
805
+ runId,
806
+ setRunId,
807
+ chatAbortControllerRef
548
808
  }));
549
809
  const latestAppend = useUpdatedRef(append);
550
- const latestAppendFunc = (0, import_react7.useCallback)(
551
- (message) => {
552
- return latestAppend.current(message);
553
- },
810
+ const latestAppendFunc = useAsyncCallback(
811
+ (message) => __async(this, null, function* () {
812
+ return yield latestAppend.current(message);
813
+ }),
554
814
  [latestAppend]
555
815
  );
556
816
  const latestReload = useUpdatedRef(reload);
557
- const latestReloadFunc = (0, import_react7.useCallback)(() => {
558
- return latestReload.current();
559
- }, [latestReload]);
817
+ const latestReloadFunc = useAsyncCallback(() => __async(this, null, function* () {
818
+ return yield latestReload.current();
819
+ }), [latestReload]);
560
820
  const latestStop = useUpdatedRef(stop);
561
- const latestStopFunc = (0, import_react7.useCallback)(() => {
821
+ const latestStopFunc = (0, import_react8.useCallback)(() => {
562
822
  return latestStop.current();
563
823
  }, [latestStop]);
564
824
  const latestDelete = useUpdatedRef(deleteMessage);
565
- const latestDeleteFunc = (0, import_react7.useCallback)(
825
+ const latestDeleteFunc = (0, import_react8.useCallback)(
566
826
  (messageId) => {
567
827
  return latestDelete.current(messageId);
568
828
  },
569
829
  [latestDelete]
570
830
  );
571
831
  const latestSetMessages = useUpdatedRef(setMessages);
572
- const latestSetMessagesFunc = (0, import_react7.useCallback)(
832
+ const latestSetMessagesFunc = (0, import_react8.useCallback)(
573
833
  (messages2) => {
574
834
  return latestSetMessages.current(messages2);
575
835
  },
576
836
  [latestSetMessages]
577
837
  );
578
838
  const latestRunChatCompletion = useUpdatedRef(runChatCompletion);
579
- const latestRunChatCompletionFunc = (0, import_react7.useCallback)(() => {
580
- return latestRunChatCompletion.current();
581
- }, [latestRunChatCompletion]);
839
+ const latestRunChatCompletionFunc = useAsyncCallback(() => __async(this, null, function* () {
840
+ return yield latestRunChatCompletion.current();
841
+ }), [latestRunChatCompletion]);
842
+ const reset = (0, import_react8.useCallback)(() => {
843
+ latestStopFunc();
844
+ setMessages([]);
845
+ setThreadId(null);
846
+ setRunId(null);
847
+ setCoagentStatesWithRef({});
848
+ let initialAgentSession = null;
849
+ if (agentLock) {
850
+ initialAgentSession = {
851
+ agentName: agentLock
852
+ };
853
+ }
854
+ setAgentSession(initialAgentSession);
855
+ }, [
856
+ latestStopFunc,
857
+ setMessages,
858
+ setThreadId,
859
+ setCoagentStatesWithRef,
860
+ setAgentSession,
861
+ agentLock
862
+ ]);
863
+ const latestReset = useUpdatedRef(reset);
864
+ const latestResetFunc = (0, import_react8.useCallback)(() => {
865
+ return latestReset.current();
866
+ }, [latestReset]);
582
867
  return {
583
868
  visibleMessages: messages,
584
869
  appendMessage: latestAppendFunc,
585
870
  setMessages: latestSetMessagesFunc,
586
871
  reloadMessages: latestReloadFunc,
587
872
  stopGeneration: latestStopFunc,
873
+ reset: latestResetFunc,
588
874
  deleteMessage: latestDeleteFunc,
589
875
  runChatCompletion: latestRunChatCompletionFunc,
590
876
  isLoading
591
877
  };
592
878
  }
593
879
  function useUpdatedRef(value) {
594
- const ref = (0, import_react7.useRef)(value);
595
- (0, import_react7.useEffect)(() => {
880
+ const ref = (0, import_react8.useRef)(value);
881
+ (0, import_react8.useEffect)(() => {
596
882
  ref.current = value;
597
883
  }, [value]);
598
884
  return ref;
@@ -661,28 +947,33 @@ function useCoAgent(options) {
661
947
  };
662
948
  const coagentState = getCoagentState(coagentStates, name);
663
949
  const state = isExternalStateManagement(options) ? options.state : coagentState.state;
664
- (0, import_react8.useEffect)(() => {
950
+ (0, import_react9.useEffect)(() => {
665
951
  if (isExternalStateManagement(options)) {
666
952
  setState(options.state);
667
953
  } else if (coagentStates[name] === void 0) {
668
954
  setState(options.initialState === void 0 ? {} : options.initialState);
669
955
  }
670
- }, [isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0]);
956
+ }, [
957
+ isExternalStateManagement(options) ? JSON.stringify(options.state) : void 0,
958
+ // reset initialstate on reset
959
+ coagentStates[name] === void 0
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
+ );
671
967
  return {
672
968
  name,
673
969
  nodeName: coagentState.nodeName,
674
- state,
675
- setState,
970
+ threadId: coagentState.threadId,
676
971
  running: coagentState.running,
677
- start: () => {
678
- startAgent(name, context);
679
- },
680
- stop: () => {
681
- stopAgent(name, context);
682
- },
683
- run: (hint) => {
684
- return runAgent(name, context, appendMessage, runChatCompletion, hint);
685
- }
972
+ state: coagentState.state,
973
+ setState: isExternalStateManagement(options) ? options.setState : setState,
974
+ start: () => startAgent(name, context),
975
+ stop: () => stopAgent(name, context),
976
+ run: runAgentCallback
686
977
  };
687
978
  }
688
979
  function startAgent(name, context) {
@@ -695,6 +986,17 @@ function stopAgent(name, context) {
695
986
  const { agentSession, setAgentSession } = context;
696
987
  if (agentSession && agentSession.agentName === name) {
697
988
  setAgentSession(null);
989
+ context.setCoagentStates((prevAgentStates) => {
990
+ return __spreadProps(__spreadValues({}, prevAgentStates), {
991
+ [name]: __spreadProps(__spreadValues({}, prevAgentStates[name]), {
992
+ running: false,
993
+ active: false,
994
+ threadId: void 0,
995
+ nodeName: void 0,
996
+ runId: void 0
997
+ })
998
+ });
999
+ });
698
1000
  } else {
699
1001
  console.warn(`No agent session found for ${name}`);
700
1002
  }
@@ -730,6 +1032,9 @@ function runAgent(name, context, appendMessage, runChatCompletion, hint) {
730
1032
  }
731
1033
  // Annotate the CommonJS export names for ESM import in node:
732
1034
  0 && (module.exports = {
1035
+ runAgent,
1036
+ startAgent,
1037
+ stopAgent,
733
1038
  useCoAgent
734
1039
  });
735
1040
  //# sourceMappingURL=use-coagent.js.map