@copilotkit/react-core 1.4.8 → 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 (107) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{chunk-X6ZF5WAX.mjs → chunk-35EN6BG4.mjs} +2 -2
  3. package/dist/{chunk-FSC4A3JN.mjs → chunk-42N5VKIX.mjs} +23 -5
  4. package/dist/{chunk-FSC4A3JN.mjs.map → chunk-42N5VKIX.mjs.map} +1 -1
  5. package/dist/{chunk-AG7FH7OD.mjs → chunk-5FYKUKG3.mjs} +2 -2
  6. package/dist/{chunk-YUY5ZAST.mjs → chunk-ALR5W5JK.mjs} +17 -8
  7. package/dist/chunk-ALR5W5JK.mjs.map +1 -0
  8. package/dist/{chunk-6EMLM6WX.mjs → chunk-BT6WK2JZ.mjs} +43 -6
  9. package/dist/chunk-BT6WK2JZ.mjs.map +1 -0
  10. package/dist/{chunk-NTLCOVE5.mjs → chunk-QTDCEDOC.mjs} +141 -70
  11. package/dist/chunk-QTDCEDOC.mjs.map +1 -0
  12. package/dist/{chunk-IFTHM7LF.mjs → chunk-QX6V774L.mjs} +6 -8
  13. package/dist/chunk-QX6V774L.mjs.map +1 -0
  14. package/dist/{chunk-XQFVXX6R.mjs → chunk-TQN3EZWQ.mjs} +10 -2
  15. package/dist/chunk-TQN3EZWQ.mjs.map +1 -0
  16. package/dist/{chunk-UOVONDR6.mjs → chunk-V3PFWGIY.mjs} +2 -2
  17. package/dist/{chunk-IVYL7JRC.mjs → chunk-VMP6JWBB.mjs} +12 -3
  18. package/dist/{chunk-IVYL7JRC.mjs.map → chunk-VMP6JWBB.mjs.map} +1 -1
  19. package/dist/chunk-XERJQUHA.mjs +31 -0
  20. package/dist/chunk-XERJQUHA.mjs.map +1 -0
  21. package/dist/components/copilot-provider/copilotkit.js +19 -2
  22. package/dist/components/copilot-provider/copilotkit.js.map +1 -1
  23. package/dist/components/copilot-provider/copilotkit.mjs +2 -2
  24. package/dist/components/copilot-provider/index.js +19 -2
  25. package/dist/components/copilot-provider/index.js.map +1 -1
  26. package/dist/components/copilot-provider/index.mjs +2 -2
  27. package/dist/components/index.js +19 -2
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/components/index.mjs +2 -2
  30. package/dist/context/copilot-context.d.ts +8 -2
  31. package/dist/context/copilot-context.js +9 -1
  32. package/dist/context/copilot-context.js.map +1 -1
  33. package/dist/context/copilot-context.mjs +1 -1
  34. package/dist/context/index.d.ts +1 -1
  35. package/dist/context/index.js +9 -1
  36. package/dist/context/index.js.map +1 -1
  37. package/dist/context/index.mjs +1 -1
  38. package/dist/hooks/index.d.ts +2 -1
  39. package/dist/hooks/index.js +264 -95
  40. package/dist/hooks/index.js.map +1 -1
  41. package/dist/hooks/index.mjs +16 -9
  42. package/dist/hooks/use-chat.d.ts +20 -0
  43. package/dist/hooks/use-chat.js +171 -77
  44. package/dist/hooks/use-chat.js.map +1 -1
  45. package/dist/hooks/use-chat.mjs +2 -1
  46. package/dist/hooks/use-coagent-state-render.js +9 -1
  47. package/dist/hooks/use-coagent-state-render.js.map +1 -1
  48. package/dist/hooks/use-coagent-state-render.mjs +2 -2
  49. package/dist/hooks/use-coagent.d.ts +14 -1
  50. package/dist/hooks/use-coagent.js +245 -85
  51. package/dist/hooks/use-coagent.js.map +1 -1
  52. package/dist/hooks/use-coagent.mjs +12 -5
  53. package/dist/hooks/use-copilot-action.d.ts +12 -2
  54. package/dist/hooks/use-copilot-action.js +24 -7
  55. package/dist/hooks/use-copilot-action.js.map +1 -1
  56. package/dist/hooks/use-copilot-action.mjs +2 -2
  57. package/dist/hooks/use-copilot-chat.d.ts +1 -0
  58. package/dist/hooks/use-copilot-chat.js +223 -84
  59. package/dist/hooks/use-copilot-chat.js.map +1 -1
  60. package/dist/hooks/use-copilot-chat.mjs +5 -4
  61. package/dist/hooks/use-copilot-readable.js +9 -1
  62. package/dist/hooks/use-copilot-readable.js.map +1 -1
  63. package/dist/hooks/use-copilot-readable.mjs +2 -2
  64. package/dist/hooks/use-make-copilot-document-readable.js +9 -1
  65. package/dist/hooks/use-make-copilot-document-readable.js.map +1 -1
  66. package/dist/hooks/use-make-copilot-document-readable.mjs +2 -2
  67. package/dist/index.d.ts +2 -2
  68. package/dist/index.js +281 -106
  69. package/dist/index.js.map +1 -1
  70. package/dist/index.mjs +17 -10
  71. package/dist/lib/copilot-task.d.ts +1 -1
  72. package/dist/lib/copilot-task.js +33 -13
  73. package/dist/lib/copilot-task.js.map +1 -1
  74. package/dist/lib/copilot-task.mjs +4 -3
  75. package/dist/lib/index.d.ts +1 -1
  76. package/dist/lib/index.js +33 -13
  77. package/dist/lib/index.js.map +1 -1
  78. package/dist/lib/index.mjs +4 -3
  79. package/dist/types/frontend-action.d.ts +21 -2
  80. package/dist/types/frontend-action.js +34 -0
  81. package/dist/types/frontend-action.js.map +1 -1
  82. package/dist/types/frontend-action.mjs +7 -0
  83. package/dist/types/index.d.ts +2 -1
  84. package/dist/types/index.js.map +1 -1
  85. package/dist/utils/extract.js.map +1 -1
  86. package/dist/utils/extract.mjs +2 -2
  87. package/dist/utils/index.js.map +1 -1
  88. package/dist/utils/index.mjs +2 -2
  89. package/package.json +3 -3
  90. package/src/components/copilot-provider/copilotkit.tsx +10 -0
  91. package/src/context/copilot-context.tsx +30 -2
  92. package/src/hooks/index.ts +1 -1
  93. package/src/hooks/use-chat.ts +196 -88
  94. package/src/hooks/use-coagent.ts +21 -4
  95. package/src/hooks/use-copilot-action.ts +38 -10
  96. package/src/hooks/use-copilot-chat.ts +43 -3
  97. package/src/lib/copilot-task.ts +2 -8
  98. package/src/types/frontend-action.ts +55 -2
  99. package/src/types/index.ts +5 -1
  100. package/dist/chunk-6EMLM6WX.mjs.map +0 -1
  101. package/dist/chunk-IFTHM7LF.mjs.map +0 -1
  102. package/dist/chunk-NTLCOVE5.mjs.map +0 -1
  103. package/dist/chunk-XQFVXX6R.mjs.map +0 -1
  104. package/dist/chunk-YUY5ZAST.mjs.map +0 -1
  105. /package/dist/{chunk-X6ZF5WAX.mjs.map → chunk-35EN6BG4.mjs.map} +0 -0
  106. /package/dist/{chunk-AG7FH7OD.mjs.map → chunk-5FYKUKG3.mjs.map} +0 -0
  107. /package/dist/{chunk-UOVONDR6.mjs.map → chunk-V3PFWGIY.mjs.map} +0 -0
@@ -1,3 +1,6 @@
1
+ import {
2
+ processActionsForRuntimeRequest
3
+ } from "./chunk-XERJQUHA.mjs";
1
4
  import {
2
5
  useCopilotRuntimeClient
3
6
  } from "./chunk-7LRDVJH5.mjs";
@@ -14,8 +17,7 @@ import {
14
17
  // src/hooks/use-chat.ts
15
18
  import { useRef } from "react";
16
19
  import {
17
- COPILOT_CLOUD_PUBLIC_API_KEY_HEADER,
18
- actionParametersToJsonSchema
20
+ COPILOT_CLOUD_PUBLIC_API_KEY_HEADER
19
21
  } from "@copilotkit/shared";
20
22
  import {
21
23
  TextMessage,
@@ -28,7 +30,7 @@ import {
28
30
  MessageRole,
29
31
  Role,
30
32
  CopilotRequestType,
31
- ActionInputAvailability
33
+ loadMessagesFromJsonRepresentation
32
34
  } from "@copilotkit/runtime-client-gql";
33
35
  function useChat(options) {
34
36
  const {
@@ -45,15 +47,21 @@ function useChat(options) {
45
47
  setCoagentStatesWithRef,
46
48
  coagentStatesRef,
47
49
  agentSession,
48
- setAgentSession
50
+ setAgentSession,
51
+ threadId,
52
+ setThreadId,
53
+ runId,
54
+ setRunId,
55
+ chatAbortControllerRef
49
56
  } = options;
50
- const abortControllerRef = useRef();
51
- const threadIdRef = useRef(null);
52
- const runIdRef = useRef(null);
53
57
  const { addGraphQLErrorsToast } = useToast();
54
58
  const runChatCompletionRef = useRef();
55
59
  const agentSessionRef = useRef(agentSession);
56
60
  agentSessionRef.current = agentSession;
61
+ const threadIdRef = useRef(threadId);
62
+ threadIdRef.current = threadId;
63
+ const runIdRef = useRef(runId);
64
+ runIdRef.current = runId;
57
65
  const publicApiKey = copilotConfig.publicApiKey;
58
66
  const headers = __spreadValues(__spreadValues({}, copilotConfig.headers || {}), publicApiKey ? { [COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {});
59
67
  const runtimeClient = useCopilotRuntimeClient({
@@ -64,7 +72,7 @@ function useChat(options) {
64
72
  });
65
73
  const runChatCompletion = useAsyncCallback(
66
74
  (previousMessages) => __async(this, null, function* () {
67
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
75
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
68
76
  setIsLoading(true);
69
77
  let newMessages = [
70
78
  new TextMessage({
@@ -72,35 +80,16 @@ function useChat(options) {
72
80
  role: Role.Assistant
73
81
  })
74
82
  ];
75
- const abortController = new AbortController();
76
- abortControllerRef.current = abortController;
83
+ chatAbortControllerRef.current = new AbortController();
77
84
  setMessages([...previousMessages, ...newMessages]);
78
85
  const systemMessage = makeSystemMessageCallback();
79
86
  const messagesWithContext = [systemMessage, ...initialMessages || [], ...previousMessages];
87
+ const isAgentRun = agentSessionRef.current !== null;
80
88
  const stream = runtimeClient.asStream(
81
89
  runtimeClient.generateCopilotResponse({
82
90
  data: __spreadProps(__spreadValues(__spreadProps(__spreadValues({
83
91
  frontend: {
84
- actions: actions.filter(
85
- (action) => action.available !== ActionInputAvailability.Disabled || !action.disabled
86
- ).map((action) => {
87
- let available = ActionInputAvailability.Enabled;
88
- if (action.disabled) {
89
- available = ActionInputAvailability.Disabled;
90
- } else if (action.available === "disabled") {
91
- available = ActionInputAvailability.Disabled;
92
- } else if (action.available === "remote") {
93
- available = ActionInputAvailability.Remote;
94
- }
95
- return {
96
- name: action.name,
97
- description: action.description || "",
98
- jsonSchema: JSON.stringify(
99
- actionParametersToJsonSchema(action.parameters || [])
100
- ),
101
- available
102
- };
103
- }),
92
+ actions: processActionsForRuntimeRequest(actions),
104
93
  url: window.location.href
105
94
  },
106
95
  threadId: threadIdRef.current,
@@ -128,14 +117,15 @@ function useChat(options) {
128
117
  }))
129
118
  }),
130
119
  properties: copilotConfig.properties,
131
- signal: (_d = abortControllerRef.current) == null ? void 0 : _d.signal
120
+ signal: (_d = chatAbortControllerRef.current) == null ? void 0 : _d.signal
132
121
  })
133
122
  );
134
123
  const guardrailsEnabled = ((_g = (_f = (_e = copilotConfig.cloud) == null ? void 0 : _e.guardrails) == null ? void 0 : _f.input) == null ? void 0 : _g.restrictToTopic.enabled) || false;
135
124
  const reader = stream.getReader();
136
- let actionResults = {};
137
125
  let executedCoAgentStateRenders = [];
138
126
  let followUp = void 0;
127
+ let messages2 = [];
128
+ let syncedMessages = [];
139
129
  try {
140
130
  while (true) {
141
131
  let done, value;
@@ -147,6 +137,9 @@ function useChat(options) {
147
137
  break;
148
138
  }
149
139
  if (done) {
140
+ if (chatAbortControllerRef.current.signal.aborted) {
141
+ return [];
142
+ }
150
143
  break;
151
144
  }
152
145
  if (!(value == null ? void 0 : value.generateCopilotResponse)) {
@@ -154,7 +147,9 @@ function useChat(options) {
154
147
  }
155
148
  threadIdRef.current = value.generateCopilotResponse.threadId || null;
156
149
  runIdRef.current = value.generateCopilotResponse.runId || null;
157
- const messages2 = convertGqlOutputToMessages(
150
+ setThreadId(threadIdRef.current);
151
+ setRunId(runIdRef.current);
152
+ messages2 = convertGqlOutputToMessages(
158
153
  filterAdjacentAgentStateMessages(value.generateCopilotResponse.messages)
159
154
  );
160
155
  if (messages2.length === 0) {
@@ -168,39 +163,11 @@ function useChat(options) {
168
163
  content: ((_i = value.generateCopilotResponse.status.details) == null ? void 0 : _i.guardrailsReason) || ""
169
164
  })
170
165
  ];
166
+ setMessages([...previousMessages, ...newMessages]);
167
+ break;
171
168
  } else {
169
+ newMessages = [...messages2];
172
170
  for (const message of messages2) {
173
- newMessages.push(message);
174
- if (message.isActionExecutionMessage() && message.status.code !== MessageStatusCode.Pending && message.scope === "client" && onFunctionCall) {
175
- if (!(message.id in actionResults)) {
176
- if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
177
- break;
178
- }
179
- try {
180
- setMessages([...previousMessages, ...newMessages]);
181
- const action = actions.find((action2) => action2.name === message.name);
182
- if (action) {
183
- followUp = action.followUp;
184
- }
185
- const result = yield onFunctionCall({
186
- messages: previousMessages,
187
- name: message.name,
188
- args: message.arguments
189
- });
190
- actionResults[message.id] = result;
191
- } catch (e) {
192
- actionResults[message.id] = `Failed to execute action ${message.name}`;
193
- console.error(`Failed to execute action ${message.name}: ${e}`);
194
- }
195
- }
196
- newMessages.push(
197
- new ResultMessage({
198
- result: ResultMessage.encodeResult(actionResults[message.id]),
199
- actionExecutionId: message.id,
200
- actionName: message.name
201
- })
202
- );
203
- }
204
171
  if (message.isAgentStateMessage() && !message.active && !executedCoAgentStateRenders.includes(message.id) && onCoAgentStateRender) {
205
172
  if (guardrailsEnabled && value.generateCopilotResponse.status === void 0) {
206
173
  break;
@@ -215,6 +182,11 @@ function useChat(options) {
215
182
  }
216
183
  const lastAgentStateMessage = [...messages2].reverse().find((message) => message.isAgentStateMessage());
217
184
  if (lastAgentStateMessage) {
185
+ if (lastAgentStateMessage.state.messages && lastAgentStateMessage.state.messages.length > 0) {
186
+ syncedMessages = loadMessagesFromJsonRepresentation(
187
+ lastAgentStateMessage.state.messages
188
+ );
189
+ }
218
190
  setCoagentStatesWithRef((prevAgentStates) => __spreadProps(__spreadValues({}, prevAgentStates), {
219
191
  [lastAgentStateMessage.agentName]: {
220
192
  name: lastAgentStateMessage.agentName,
@@ -241,14 +213,96 @@ function useChat(options) {
241
213
  setMessages([...previousMessages, ...newMessages]);
242
214
  }
243
215
  }
216
+ const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);
217
+ let didExecuteAction = false;
218
+ if (onFunctionCall) {
219
+ const lastMessages = [];
220
+ for (let i = finalMessages.length - 1; i >= 0; i--) {
221
+ const message = finalMessages[i];
222
+ if (message.isActionExecutionMessage() && message.status.code !== MessageStatusCode.Pending) {
223
+ lastMessages.unshift(message);
224
+ } else {
225
+ break;
226
+ }
227
+ }
228
+ for (const message of lastMessages) {
229
+ setMessages(finalMessages);
230
+ const action = actions.find((action2) => action2.name === message.name);
231
+ if (action) {
232
+ followUp = action.followUp;
233
+ let result;
234
+ try {
235
+ result = yield Promise.race([
236
+ onFunctionCall({
237
+ messages: previousMessages,
238
+ name: message.name,
239
+ args: message.arguments
240
+ }),
241
+ new Promise(
242
+ (resolve) => {
243
+ var _a2;
244
+ return (_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.addEventListener(
245
+ "abort",
246
+ () => resolve("Operation was aborted by the user")
247
+ );
248
+ }
249
+ ),
250
+ // if the user stopped generation, we also abort consecutive actions
251
+ new Promise((resolve) => {
252
+ var _a2;
253
+ if ((_a2 = chatAbortControllerRef.current) == null ? void 0 : _a2.signal.aborted) {
254
+ resolve("Operation was aborted by the user");
255
+ }
256
+ })
257
+ ]);
258
+ } catch (e) {
259
+ result = `Failed to execute action ${message.name}`;
260
+ console.error(`Failed to execute action ${message.name}: ${e}`);
261
+ }
262
+ didExecuteAction = true;
263
+ const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);
264
+ finalMessages.splice(
265
+ messageIndex + 1,
266
+ 0,
267
+ new ResultMessage({
268
+ id: "result-" + message.id,
269
+ result: ResultMessage.encodeResult(result),
270
+ actionExecutionId: message.id,
271
+ actionName: message.name
272
+ })
273
+ );
274
+ }
275
+ }
276
+ setMessages(finalMessages);
277
+ }
244
278
  if (
245
279
  // if followUp is not explicitly false
246
- followUp !== false && // if we have client side results
247
- (Object.values(actionResults).length || // or the last message we received is a result
248
- newMessages.length && newMessages[newMessages.length - 1].isResultMessage())
280
+ followUp !== false && // and we executed an action
281
+ (didExecuteAction || // the last message is a server side result
282
+ !isAgentRun && finalMessages.length && finalMessages[finalMessages.length - 1].isResultMessage()) && // the user did not stop generation
283
+ !((_j = chatAbortControllerRef.current) == null ? void 0 : _j.signal.aborted)
249
284
  ) {
250
285
  yield new Promise((resolve) => setTimeout(resolve, 10));
251
- return yield runChatCompletionRef.current([...previousMessages, ...newMessages]);
286
+ return yield runChatCompletionRef.current(finalMessages);
287
+ } else if ((_k = chatAbortControllerRef.current) == null ? void 0 : _k.signal.aborted) {
288
+ const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {
289
+ if (message.isActionExecutionMessage()) {
290
+ return finalMessages.find(
291
+ (msg, resultIndex) => msg.isResultMessage() && msg.actionExecutionId === message.id && resultIndex === actionExecutionIndex + 1
292
+ );
293
+ }
294
+ return true;
295
+ });
296
+ const repairedMessageIds = repairedMessages.map((message) => message.id);
297
+ setMessages(repairedMessages);
298
+ if ((_l = agentSessionRef.current) == null ? void 0 : _l.nodeName) {
299
+ setAgentSession({
300
+ threadId: agentSessionRef.current.threadId,
301
+ agentName: agentSessionRef.current.agentName,
302
+ nodeName: "__end__"
303
+ });
304
+ }
305
+ return newMessages.filter((message) => repairedMessageIds.includes(message.id));
252
306
  } else {
253
307
  return newMessages.slice();
254
308
  }
@@ -305,7 +359,7 @@ function useChat(options) {
305
359
  }), [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);
306
360
  const stop = () => {
307
361
  var _a;
308
- (_a = abortControllerRef.current) == null ? void 0 : _a.abort();
362
+ (_a = chatAbortControllerRef.current) == null ? void 0 : _a.abort("Stop was called");
309
363
  };
310
364
  return {
311
365
  append,
@@ -314,8 +368,25 @@ function useChat(options) {
314
368
  runChatCompletion: () => runChatCompletionRef.current(messages)
315
369
  };
316
370
  }
371
+ function constructFinalMessages(syncedMessages, previousMessages, newMessages) {
372
+ const finalMessages = syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];
373
+ if (syncedMessages.length > 0) {
374
+ const messagesWithAgentState = [...previousMessages, ...newMessages];
375
+ let previousMessageId = void 0;
376
+ for (const message of messagesWithAgentState) {
377
+ if (message.isAgentStateMessage()) {
378
+ const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);
379
+ if (index !== -1) {
380
+ finalMessages.splice(index + 1, 0, message);
381
+ }
382
+ }
383
+ previousMessageId = message.id;
384
+ }
385
+ }
386
+ return finalMessages;
387
+ }
317
388
 
318
389
  export {
319
390
  useChat
320
391
  };
321
- //# sourceMappingURL=chunk-NTLCOVE5.mjs.map
392
+ //# sourceMappingURL=chunk-QTDCEDOC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-chat.ts"],"sourcesContent":["import { useRef } from \"react\";\nimport {\n FunctionCallHandler,\n COPILOT_CLOUD_PUBLIC_API_KEY_HEADER,\n actionParametersToJsonSchema,\n CoAgentStateRenderHandler,\n} from \"@copilotkit/shared\";\nimport {\n Message,\n TextMessage,\n ResultMessage,\n convertMessagesToGqlInput,\n filterAdjacentAgentStateMessages,\n filterAgentStateMessages,\n convertGqlOutputToMessages,\n MessageStatusCode,\n MessageRole,\n Role,\n CopilotRequestType,\n ActionInputAvailability,\n loadMessagesFromJsonRepresentation,\n} from \"@copilotkit/runtime-client-gql\";\n\nimport { CopilotApiConfig } from \"../context\";\nimport { FrontendAction, processActionsForRuntimeRequest } from \"../types/frontend-action\";\nimport { CoagentState } from \"../types/coagent-state\";\nimport { AgentSession } from \"../context/copilot-context\";\nimport { useToast } from \"../components/toast/toast-provider\";\nimport { useCopilotRuntimeClient } from \"./use-copilot-runtime-client\";\nimport { useAsyncCallback } from \"../components/error-boundary/error-utils\";\n\nexport type UseChatOptions = {\n /**\n * System messages of the chat. Defaults to an empty array.\n */\n initialMessages?: Message[];\n /**\n * Callback function to be called when a function call is received.\n * If the function returns a `ChatRequest` object, the request will be sent\n * automatically to the API and will be used to update the chat.\n */\n onFunctionCall?: FunctionCallHandler;\n\n /**\n * Callback function to be called when a coagent action is received.\n */\n onCoAgentStateRender?: CoAgentStateRenderHandler;\n\n /**\n * Function definitions to be sent to the API.\n */\n actions: FrontendAction<any>[];\n\n /**\n * The CopilotKit API configuration.\n */\n copilotConfig: CopilotApiConfig;\n\n /**\n * The current list of messages in the chat.\n */\n messages: Message[];\n /**\n * The setState-powered method to update the chat messages.\n */\n setMessages: React.Dispatch<React.SetStateAction<Message[]>>;\n\n /**\n * A callback to get the latest system message.\n */\n makeSystemMessageCallback: () => TextMessage;\n\n /**\n * Whether the API request is in progress\n */\n isLoading: boolean;\n\n /**\n * setState-powered method to update the isChatLoading value\n */\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\n\n /**\n * The current list of coagent states.\n */\n coagentStatesRef: React.RefObject<Record<string, CoagentState>>;\n\n /**\n * setState-powered method to update the agent states\n */\n setCoagentStatesWithRef: React.Dispatch<React.SetStateAction<Record<string, CoagentState>>>;\n\n /**\n * The current agent session.\n */\n agentSession: AgentSession | null;\n\n /**\n * setState-powered method to update the agent session\n */\n setAgentSession: React.Dispatch<React.SetStateAction<AgentSession | null>>;\n\n /**\n * The current thread ID.\n */\n threadId: string | null;\n /**\n * set the current thread ID\n */\n setThreadId: (threadId: string | null) => void;\n /**\n * The current run ID.\n */\n runId: string | null;\n /**\n * set the current run ID\n */\n setRunId: (runId: string | null) => void;\n /**\n * The global chat abort controller.\n */\n chatAbortControllerRef: React.MutableRefObject<AbortController | null>;\n};\n\nexport type UseChatHelpers = {\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n * @param message The message to append\n */\n append: (message: Message) => Promise<void>;\n /**\n * Reload the last AI chat response for the given chat history. If the last\n * message isn't from the assistant, it will request the API to generate a\n * new response.\n */\n reload: () => Promise<void>;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n\n /**\n * Run the chat completion.\n */\n runChatCompletion: () => Promise<Message[]>;\n};\n\nexport function useChat(options: UseChatOptions): UseChatHelpers {\n const {\n messages,\n setMessages,\n makeSystemMessageCallback,\n copilotConfig,\n setIsLoading,\n initialMessages,\n isLoading,\n actions,\n onFunctionCall,\n onCoAgentStateRender,\n setCoagentStatesWithRef,\n coagentStatesRef,\n agentSession,\n setAgentSession,\n threadId,\n setThreadId,\n runId,\n setRunId,\n chatAbortControllerRef,\n } = options;\n const { addGraphQLErrorsToast } = useToast();\n const runChatCompletionRef = useRef<(previousMessages: Message[]) => Promise<Message[]>>();\n // We need to keep a ref of coagent states and session because of renderAndWait - making sure\n // the latest state is sent to the API\n // This is a workaround and needs to be addressed in the future\n const agentSessionRef = useRef<AgentSession | null>(agentSession);\n agentSessionRef.current = agentSession;\n const threadIdRef = useRef<string | null>(threadId);\n threadIdRef.current = threadId;\n const runIdRef = useRef<string | null>(runId);\n runIdRef.current = runId;\n\n const publicApiKey = copilotConfig.publicApiKey;\n\n const headers = {\n ...(copilotConfig.headers || {}),\n ...(publicApiKey ? { [COPILOT_CLOUD_PUBLIC_API_KEY_HEADER]: publicApiKey } : {}),\n };\n\n const runtimeClient = useCopilotRuntimeClient({\n url: copilotConfig.chatApiEndpoint,\n publicApiKey: copilotConfig.publicApiKey,\n headers,\n credentials: copilotConfig.credentials,\n });\n\n const runChatCompletion = useAsyncCallback(\n async (previousMessages: Message[]): Promise<Message[]> => {\n setIsLoading(true);\n\n // this message is just a placeholder. It will disappear once the first real message\n // is received\n let newMessages: Message[] = [\n new TextMessage({\n content: \"\",\n role: Role.Assistant,\n }),\n ];\n\n chatAbortControllerRef.current = new AbortController();\n\n setMessages([...previousMessages, ...newMessages]);\n\n const systemMessage = makeSystemMessageCallback();\n\n const messagesWithContext = [systemMessage, ...(initialMessages || []), ...previousMessages];\n\n const isAgentRun = agentSessionRef.current !== null;\n\n const stream = runtimeClient.asStream(\n runtimeClient.generateCopilotResponse({\n data: {\n frontend: {\n actions: processActionsForRuntimeRequest(actions),\n url: window.location.href,\n },\n threadId: threadIdRef.current,\n runId: runIdRef.current,\n messages: convertMessagesToGqlInput(filterAgentStateMessages(messagesWithContext)),\n ...(copilotConfig.cloud\n ? {\n cloud: {\n ...(copilotConfig.cloud.guardrails?.input?.restrictToTopic?.enabled\n ? {\n guardrails: {\n inputValidationRules: {\n allowList:\n copilotConfig.cloud.guardrails.input.restrictToTopic.validTopics,\n denyList:\n copilotConfig.cloud.guardrails.input.restrictToTopic.invalidTopics,\n },\n },\n }\n : {}),\n },\n }\n : {}),\n metadata: {\n requestType: CopilotRequestType.Chat,\n },\n ...(agentSessionRef.current\n ? {\n agentSession: agentSessionRef.current,\n }\n : {}),\n agentStates: Object.values(coagentStatesRef.current!).map((state) => ({\n agentName: state.name,\n state: JSON.stringify(state.state),\n })),\n },\n properties: copilotConfig.properties,\n signal: chatAbortControllerRef.current?.signal,\n }),\n );\n\n const guardrailsEnabled =\n copilotConfig.cloud?.guardrails?.input?.restrictToTopic.enabled || false;\n\n const reader = stream.getReader();\n\n let executedCoAgentStateRenders: string[] = [];\n let followUp: FrontendAction[\"followUp\"] = undefined;\n\n let messages: Message[] = [];\n let syncedMessages: Message[] = [];\n\n try {\n while (true) {\n let done, value;\n\n try {\n const readResult = await reader.read();\n done = readResult.done;\n value = readResult.value;\n } catch (readError) {\n break;\n }\n\n if (done) {\n if (chatAbortControllerRef.current.signal.aborted) {\n return [];\n }\n break;\n }\n\n if (!value?.generateCopilotResponse) {\n continue;\n }\n\n threadIdRef.current = value.generateCopilotResponse.threadId || null;\n runIdRef.current = value.generateCopilotResponse.runId || null;\n\n setThreadId(threadIdRef.current);\n setRunId(runIdRef.current);\n\n messages = convertGqlOutputToMessages(\n filterAdjacentAgentStateMessages(value.generateCopilotResponse.messages),\n );\n\n if (messages.length === 0) {\n continue;\n }\n\n newMessages = [];\n\n // request failed, display error message and quit\n if (\n value.generateCopilotResponse.status?.__typename === \"FailedResponseStatus\" &&\n value.generateCopilotResponse.status.reason === \"GUARDRAILS_VALIDATION_FAILED\"\n ) {\n newMessages = [\n new TextMessage({\n role: MessageRole.Assistant,\n content: value.generateCopilotResponse.status.details?.guardrailsReason || \"\",\n }),\n ];\n setMessages([...previousMessages, ...newMessages]);\n break;\n }\n\n // add messages to the chat\n else {\n newMessages = [...messages];\n\n for (const message of messages) {\n // execute onCoAgentStateRender handler\n if (\n message.isAgentStateMessage() &&\n !message.active &&\n !executedCoAgentStateRenders.includes(message.id) &&\n onCoAgentStateRender\n ) {\n // Do not execute a coagent action if guardrails are enabled but the status is not known\n if (guardrailsEnabled && value.generateCopilotResponse.status === undefined) {\n break;\n }\n // execute coagent action\n await onCoAgentStateRender({\n name: message.agentName,\n nodeName: message.nodeName,\n state: message.state,\n });\n executedCoAgentStateRenders.push(message.id);\n }\n }\n\n const lastAgentStateMessage = [...messages]\n .reverse()\n .find((message) => message.isAgentStateMessage());\n\n if (lastAgentStateMessage) {\n if (\n lastAgentStateMessage.state.messages &&\n lastAgentStateMessage.state.messages.length > 0\n ) {\n syncedMessages = loadMessagesFromJsonRepresentation(\n lastAgentStateMessage.state.messages,\n );\n }\n setCoagentStatesWithRef((prevAgentStates) => ({\n ...prevAgentStates,\n [lastAgentStateMessage.agentName]: {\n name: lastAgentStateMessage.agentName,\n state: lastAgentStateMessage.state,\n running: lastAgentStateMessage.running,\n active: lastAgentStateMessage.active,\n threadId: lastAgentStateMessage.threadId,\n nodeName: lastAgentStateMessage.nodeName,\n runId: lastAgentStateMessage.runId,\n },\n }));\n if (lastAgentStateMessage.running) {\n setAgentSession({\n threadId: lastAgentStateMessage.threadId,\n agentName: lastAgentStateMessage.agentName,\n nodeName: lastAgentStateMessage.nodeName,\n });\n } else {\n setAgentSession(null);\n }\n }\n }\n\n if (newMessages.length > 0) {\n // Update message state\n setMessages([...previousMessages, ...newMessages]);\n }\n }\n const finalMessages = constructFinalMessages(syncedMessages, previousMessages, newMessages);\n\n let didExecuteAction = false;\n\n // execute regular action executions that are specific to the frontend (last actions)\n if (onFunctionCall) {\n // Find consecutive action execution messages at the end\n const lastMessages = [];\n for (let i = finalMessages.length - 1; i >= 0; i--) {\n const message = finalMessages[i];\n if (\n message.isActionExecutionMessage() &&\n message.status.code !== MessageStatusCode.Pending\n ) {\n lastMessages.unshift(message);\n } else {\n break;\n }\n }\n\n for (const message of lastMessages) {\n // We update the message state before calling the handler so that the render\n // function can be called with `executing` state\n setMessages(finalMessages);\n\n const action = actions.find((action) => action.name === message.name);\n\n if (action) {\n followUp = action.followUp;\n let result: any;\n try {\n result = await Promise.race([\n onFunctionCall({\n messages: previousMessages,\n name: message.name,\n args: message.arguments,\n }),\n new Promise((resolve) =>\n chatAbortControllerRef.current?.signal.addEventListener(\"abort\", () =>\n resolve(\"Operation was aborted by the user\"),\n ),\n ),\n // if the user stopped generation, we also abort consecutive actions\n new Promise((resolve) => {\n if (chatAbortControllerRef.current?.signal.aborted) {\n resolve(\"Operation was aborted by the user\");\n }\n }),\n ]);\n } catch (e) {\n result = `Failed to execute action ${message.name}`;\n console.error(`Failed to execute action ${message.name}: ${e}`);\n }\n didExecuteAction = true;\n const messageIndex = finalMessages.findIndex((msg) => msg.id === message.id);\n finalMessages.splice(\n messageIndex + 1,\n 0,\n new ResultMessage({\n id: \"result-\" + message.id,\n result: ResultMessage.encodeResult(result),\n actionExecutionId: message.id,\n actionName: message.name,\n }),\n );\n }\n }\n\n setMessages(finalMessages);\n }\n\n if (\n // if followUp is not explicitly false\n followUp !== false &&\n // and we executed an action\n (didExecuteAction ||\n // the last message is a server side result\n (!isAgentRun &&\n finalMessages.length &&\n finalMessages[finalMessages.length - 1].isResultMessage())) &&\n // the user did not stop generation\n !chatAbortControllerRef.current?.signal.aborted\n ) {\n // run the completion again and return the result\n\n // wait for next tick to make sure all the react state updates\n // - tried using react-dom's flushSync, but it did not work\n await new Promise((resolve) => setTimeout(resolve, 10));\n\n return await runChatCompletionRef.current!(finalMessages);\n } else if (chatAbortControllerRef.current?.signal.aborted) {\n // filter out all the action execution messages that do not have a consecutive matching result message\n const repairedMessages = finalMessages.filter((message, actionExecutionIndex) => {\n if (message.isActionExecutionMessage()) {\n return finalMessages.find(\n (msg, resultIndex) =>\n msg.isResultMessage() &&\n msg.actionExecutionId === message.id &&\n resultIndex === actionExecutionIndex + 1,\n );\n }\n return true;\n });\n const repairedMessageIds = repairedMessages.map((message) => message.id);\n setMessages(repairedMessages);\n\n if (agentSessionRef.current?.nodeName) {\n setAgentSession({\n threadId: agentSessionRef.current.threadId,\n agentName: agentSessionRef.current.agentName,\n nodeName: \"__end__\",\n });\n }\n // only return new messages that were not filtered out\n return newMessages.filter((message) => repairedMessageIds.includes(message.id));\n } else {\n return newMessages.slice();\n }\n } finally {\n setIsLoading(false);\n }\n },\n [\n messages,\n setMessages,\n makeSystemMessageCallback,\n copilotConfig,\n setIsLoading,\n initialMessages,\n isLoading,\n actions,\n onFunctionCall,\n onCoAgentStateRender,\n setCoagentStatesWithRef,\n coagentStatesRef,\n agentSession,\n setAgentSession,\n ],\n );\n\n runChatCompletionRef.current = runChatCompletion;\n\n const runChatCompletionAndHandleFunctionCall = useAsyncCallback(\n async (messages: Message[]): Promise<void> => {\n await runChatCompletionRef.current!(messages);\n },\n [messages],\n );\n\n const append = useAsyncCallback(\n async (message: Message): Promise<void> => {\n if (isLoading) {\n return;\n }\n\n const newMessages = [...messages, message];\n setMessages(newMessages);\n return runChatCompletionAndHandleFunctionCall(newMessages);\n },\n [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall],\n );\n\n const reload = useAsyncCallback(async (): Promise<void> => {\n if (isLoading || messages.length === 0) {\n return;\n }\n let newMessages = [...messages];\n const lastMessage = messages[messages.length - 1];\n\n if (lastMessage.isTextMessage() && lastMessage.role === \"assistant\") {\n newMessages = newMessages.slice(0, -1);\n }\n\n setMessages(newMessages);\n\n return runChatCompletionAndHandleFunctionCall(newMessages);\n }, [isLoading, messages, setMessages, runChatCompletionAndHandleFunctionCall]);\n\n const stop = (): void => {\n chatAbortControllerRef.current?.abort(\"Stop was called\");\n };\n\n return {\n append,\n reload,\n stop,\n runChatCompletion: () => runChatCompletionRef.current!(messages),\n };\n}\n\nfunction constructFinalMessages(\n syncedMessages: Message[],\n previousMessages: Message[],\n newMessages: Message[],\n): Message[] {\n const finalMessages =\n syncedMessages.length > 0 ? [...syncedMessages] : [...previousMessages, ...newMessages];\n\n if (syncedMessages.length > 0) {\n const messagesWithAgentState = [...previousMessages, ...newMessages];\n\n let previousMessageId: string | undefined = undefined;\n\n for (const message of messagesWithAgentState) {\n if (message.isAgentStateMessage()) {\n // insert this message into finalMessages after the position of previousMessageId\n const index = finalMessages.findIndex((msg) => msg.id === previousMessageId);\n if (index !== -1) {\n finalMessages.splice(index + 1, 0, message);\n }\n }\n\n previousMessageId = message.id;\n }\n }\n\n return finalMessages;\n}\n"],"mappings":"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","names":["messages","action","_a"]}
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  defaultCopilotContextCategories
3
- } from "./chunk-IVYL7JRC.mjs";
3
+ } from "./chunk-VMP6JWBB.mjs";
4
+ import {
5
+ processActionsForRuntimeRequest
6
+ } from "./chunk-XERJQUHA.mjs";
4
7
  import {
5
8
  __async
6
9
  } from "./chunk-SKC7AJIV.mjs";
@@ -15,7 +18,6 @@ import {
15
18
  filterAgentStateMessages,
16
19
  CopilotRequestType
17
20
  } from "@copilotkit/runtime-client-gql";
18
- import { actionParametersToJsonSchema } from "@copilotkit/shared";
19
21
  var CopilotTask = class {
20
22
  constructor(config) {
21
23
  this.instructions = config.instructions;
@@ -56,11 +58,7 @@ var CopilotTask = class {
56
58
  const response = yield runtimeClient.generateCopilotResponse({
57
59
  data: {
58
60
  frontend: {
59
- actions: Object.values(actions).map((action) => ({
60
- name: action.name,
61
- description: action.description || "",
62
- jsonSchema: JSON.stringify(actionParametersToJsonSchema(action.parameters || []))
63
- })),
61
+ actions: processActionsForRuntimeRequest(Object.values(actions)),
64
62
  url: window.location.href
65
63
  },
66
64
  messages: convertMessagesToGqlInput(filterAgentStateMessages(messages)),
@@ -116,4 +114,4 @@ ${instructions}
116
114
  export {
117
115
  CopilotTask
118
116
  };
119
- //# sourceMappingURL=chunk-IFTHM7LF.mjs.map
117
+ //# sourceMappingURL=chunk-QX6V774L.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/copilot-task.ts"],"sourcesContent":["/**\n * This class is used to execute one-off tasks, for example on button press. It can use the context available via [useCopilotReadable](/reference/hooks/useCopilotReadable) and the actions provided by [useCopilotAction](/reference/hooks/useCopilotAction), or you can provide your own context and actions.\n *\n * ## Example\n * In the simplest case, use CopilotTask in the context of your app by giving it instructions on what to do.\n *\n * ```tsx\n * import { CopilotTask, useCopilotContext } from \"@copilotkit/react-core\";\n *\n * export function MyComponent() {\n * const context = useCopilotContext();\n *\n * const task = new CopilotTask({\n * instructions: \"Set a random message\",\n * actions: [\n * {\n * name: \"setMessage\",\n * description: \"Set the message.\",\n * argumentAnnotations: [\n * {\n * name: \"message\",\n * type: \"string\",\n * description:\n * \"A message to display.\",\n * required: true,\n * },\n * ],\n * }\n * ]\n * });\n *\n * const executeTask = async () => {\n * await task.run(context, action);\n * }\n *\n * return (\n * <>\n * <button onClick={executeTask}>\n * Execute task\n * </button>\n * </>\n * )\n * }\n * ```\n *\n * Have a look at the [Presentation Example App](https://github.com/CopilotKit/CopilotKit/blob/main/CopilotKit/examples/next-openai/src/app/presentation/page.tsx) for a more complete example.\n */\n\nimport {\n ActionExecutionMessage,\n CopilotRuntimeClient,\n Message,\n Role,\n TextMessage,\n convertGqlOutputToMessages,\n convertMessagesToGqlInput,\n filterAgentStateMessages,\n CopilotRequestType,\n} from \"@copilotkit/runtime-client-gql\";\nimport { FrontendAction, processActionsForRuntimeRequest } from \"../types/frontend-action\";\nimport { CopilotContextParams } from \"../context\";\nimport { defaultCopilotContextCategories } from \"../components\";\n\nexport interface CopilotTaskConfig {\n /**\n * The instructions to be given to the assistant.\n */\n instructions: string;\n /**\n * An array of action definitions that can be called.\n */\n actions?: FrontendAction<any>[];\n /**\n * Whether to include the copilot readable context in the task.\n */\n includeCopilotReadable?: boolean;\n\n /**\n * Whether to include actions defined via useCopilotAction in the task.\n */\n includeCopilotActions?: boolean;\n}\n\nexport class CopilotTask<T = any> {\n private instructions: string;\n private actions: FrontendAction<any>[];\n private includeCopilotReadable: boolean;\n private includeCopilotActions: boolean;\n\n constructor(config: CopilotTaskConfig) {\n this.instructions = config.instructions;\n this.actions = config.actions || [];\n this.includeCopilotReadable = config.includeCopilotReadable !== false;\n this.includeCopilotActions = config.includeCopilotActions !== false;\n }\n\n /**\n * Run the task.\n * @param context The CopilotContext to use for the task. Use `useCopilotContext` to obtain the current context.\n * @param data The data to use for the task.\n */\n async run(context: CopilotContextParams, data?: T): Promise<void> {\n const actions = this.includeCopilotActions ? Object.assign({}, context.actions) : {};\n\n // merge functions into entry points\n for (const fn of this.actions) {\n actions[fn.name] = fn;\n }\n\n let contextString = \"\";\n\n if (data) {\n contextString = (typeof data === \"string\" ? data : JSON.stringify(data)) + \"\\n\\n\";\n }\n\n if (this.includeCopilotReadable) {\n contextString += context.getContextString([], defaultCopilotContextCategories);\n }\n\n const systemMessage = new TextMessage({\n content: taskSystemMessage(contextString, this.instructions),\n role: Role.System,\n });\n\n const messages: Message[] = [systemMessage];\n\n const runtimeClient = new CopilotRuntimeClient({\n url: context.copilotApiConfig.chatApiEndpoint,\n publicApiKey: context.copilotApiConfig.publicApiKey,\n headers: context.copilotApiConfig.headers,\n credentials: context.copilotApiConfig.credentials,\n });\n\n const response = await runtimeClient\n .generateCopilotResponse({\n data: {\n frontend: {\n actions: processActionsForRuntimeRequest(Object.values(actions)),\n url: window.location.href,\n },\n messages: convertMessagesToGqlInput(filterAgentStateMessages(messages)),\n metadata: {\n requestType: CopilotRequestType.Task,\n },\n forwardedParameters: {\n toolChoice: \"required\",\n },\n },\n properties: context.copilotApiConfig.properties,\n })\n .toPromise();\n\n const functionCallHandler = context.getFunctionCallHandler(actions);\n const functionCalls = convertGqlOutputToMessages(\n response.data?.generateCopilotResponse?.messages || [],\n ).filter((m): m is ActionExecutionMessage => m.isActionExecutionMessage());\n\n for (const functionCall of functionCalls) {\n await functionCallHandler({\n messages,\n name: functionCall.name,\n args: functionCall.arguments,\n });\n }\n }\n}\n\nfunction taskSystemMessage(contextString: string, instructions: string): string {\n return `\nPlease act as an efficient, competent, conscientious, and industrious professional assistant.\n\nHelp the user achieve their goals, and you do so in a way that is as efficient as possible, without unnecessary fluff, but also without sacrificing professionalism.\nAlways be polite and respectful, and prefer brevity over verbosity.\n\nThe user has provided you with the following context:\n\\`\\`\\`\n${contextString}\n\\`\\`\\`\n\nThey have also provided you with functions you can call to initiate actions on their behalf.\n\nPlease assist them as best you can.\n\nThis is not a conversation, so please do not ask questions. Just call a function without saying anything else.\n\nThe user has given you the following task to complete:\n\n\\`\\`\\`\n${instructions}\n\\`\\`\\`\n`;\n}\n"],"mappings":";;;;;;;;;;;AAgDA;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAyBA,IAAM,cAAN,MAA2B;AAAA,EAMhC,YAAY,QAA2B;AACrC,SAAK,eAAe,OAAO;AAC3B,SAAK,UAAU,OAAO,WAAW,CAAC;AAClC,SAAK,yBAAyB,OAAO,2BAA2B;AAChE,SAAK,wBAAwB,OAAO,0BAA0B;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,IAAI,SAA+B,MAAyB;AAAA;AArGpE;AAsGI,YAAM,UAAU,KAAK,wBAAwB,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,IAAI,CAAC;AAGnF,iBAAW,MAAM,KAAK,SAAS;AAC7B,gBAAQ,GAAG,IAAI,IAAI;AAAA,MACrB;AAEA,UAAI,gBAAgB;AAEpB,UAAI,MAAM;AACR,yBAAiB,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI,KAAK;AAAA,MAC7E;AAEA,UAAI,KAAK,wBAAwB;AAC/B,yBAAiB,QAAQ,iBAAiB,CAAC,GAAG,+BAA+B;AAAA,MAC/E;AAEA,YAAM,gBAAgB,IAAI,YAAY;AAAA,QACpC,SAAS,kBAAkB,eAAe,KAAK,YAAY;AAAA,QAC3D,MAAM,KAAK;AAAA,MACb,CAAC;AAED,YAAM,WAAsB,CAAC,aAAa;AAE1C,YAAM,gBAAgB,IAAI,qBAAqB;AAAA,QAC7C,KAAK,QAAQ,iBAAiB;AAAA,QAC9B,cAAc,QAAQ,iBAAiB;AAAA,QACvC,SAAS,QAAQ,iBAAiB;AAAA,QAClC,aAAa,QAAQ,iBAAiB;AAAA,MACxC,CAAC;AAED,YAAM,WAAW,MAAM,cACpB,wBAAwB;AAAA,QACvB,MAAM;AAAA,UACJ,UAAU;AAAA,YACR,SAAS,gCAAgC,OAAO,OAAO,OAAO,CAAC;AAAA,YAC/D,KAAK,OAAO,SAAS;AAAA,UACvB;AAAA,UACA,UAAU,0BAA0B,yBAAyB,QAAQ,CAAC;AAAA,UACtE,UAAU;AAAA,YACR,aAAa,mBAAmB;AAAA,UAClC;AAAA,UACA,qBAAqB;AAAA,YACnB,YAAY;AAAA,UACd;AAAA,QACF;AAAA,QACA,YAAY,QAAQ,iBAAiB;AAAA,MACvC,CAAC,EACA,UAAU;AAEb,YAAM,sBAAsB,QAAQ,uBAAuB,OAAO;AAClE,YAAM,gBAAgB;AAAA,UACpB,oBAAS,SAAT,mBAAe,4BAAf,mBAAwC,aAAY,CAAC;AAAA,MACvD,EAAE,OAAO,CAAC,MAAmC,EAAE,yBAAyB,CAAC;AAEzE,iBAAW,gBAAgB,eAAe;AACxC,cAAM,oBAAoB;AAAA,UACxB;AAAA,UACA,MAAM,aAAa;AAAA,UACnB,MAAM,aAAa;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AACF;AAEA,SAAS,kBAAkB,eAAuB,cAA8B;AAC9E,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA;AAAA;AAGF;","names":[]}
@@ -56,7 +56,15 @@ var emptyCopilotContext = {
56
56
  },
57
57
  agentSession: null,
58
58
  setAgentSession: () => {
59
- }
59
+ },
60
+ agentLock: null,
61
+ threadId: null,
62
+ setThreadId: () => {
63
+ },
64
+ runId: null,
65
+ setRunId: () => {
66
+ },
67
+ chatAbortControllerRef: { current: null }
60
68
  };
61
69
  var CopilotContext = React.createContext(emptyCopilotContext);
62
70
  function useCopilotContext() {
@@ -75,4 +83,4 @@ export {
75
83
  CopilotContext,
76
84
  useCopilotContext
77
85
  };
78
- //# sourceMappingURL=chunk-XQFVXX6R.mjs.map
86
+ //# sourceMappingURL=chunk-TQN3EZWQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/copilot-context.tsx"],"sourcesContent":["import { CopilotCloudConfig, FunctionCallHandler } from \"@copilotkit/shared\";\nimport {\n ActionRenderProps,\n CatchAllActionRenderProps,\n FrontendAction,\n} from \"../types/frontend-action\";\nimport React from \"react\";\nimport { TreeNodeId } from \"../hooks/use-tree\";\nimport { DocumentPointer } from \"../types\";\nimport { CopilotChatSuggestionConfiguration } from \"../types/chat-suggestion-configuration\";\nimport { CoAgentStateRender, CoAgentStateRenderProps } from \"../types/coagent-action\";\nimport { CoagentState } from \"../types/coagent-state\";\nimport { CopilotRuntimeClient } from \"@copilotkit/runtime-client-gql\";\n\n/**\n * Interface for the configuration of the Copilot API.\n */\nexport interface CopilotApiConfig {\n /**\n * The public API key for Copilot Cloud.\n */\n publicApiKey?: string;\n\n /**\n * The configuration for Copilot Cloud.\n */\n cloud?: CopilotCloudConfig;\n\n /**\n * The endpoint for the chat API.\n */\n chatApiEndpoint: string;\n\n /**\n * The endpoint for the Copilot transcribe audio service.\n */\n transcribeAudioUrl?: string;\n\n /**\n * The endpoint for the Copilot text to speech service.\n */\n textToSpeechUrl?: string;\n\n /**\n * additional headers to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'Authorization': 'Bearer your_token_here'\n * }\n * ```\n */\n headers: Record<string, string>;\n\n /**\n * Custom properties to be sent with the request\n * @default {}\n * @example\n * ```\n * {\n * 'user_id': 'user_id'\n * }\n * ```\n */\n properties?: Record<string, any>;\n\n /**\n * Indicates whether the user agent should send or receive cookies from the other domain\n * in the case of cross-origin requests.\n */\n credentials?: RequestCredentials;\n}\n\nexport type InChatRenderFunction = (\n props: ActionRenderProps<any> | CatchAllActionRenderProps<any>,\n) => string | JSX.Element;\nexport type CoagentInChatRenderFunction = (\n props: CoAgentStateRenderProps<any>,\n) => string | JSX.Element | undefined | null;\n\nexport interface ChatComponentsCache {\n actions: Record<string, InChatRenderFunction | string>;\n coAgentStateRenders: Record<string, CoagentInChatRenderFunction | string>;\n}\n\nexport interface AgentSession {\n agentName: string;\n threadId?: string;\n nodeName?: string;\n}\n\nexport interface CopilotContextParams {\n // function-calling\n actions: Record<string, FrontendAction<any>>;\n setAction: (id: string, action: FrontendAction<any>) => void;\n removeAction: (id: string) => void;\n\n // coagent actions\n coAgentStateRenders: Record<string, CoAgentStateRender<any>>;\n setCoAgentStateRender: (id: string, stateRender: CoAgentStateRender<any>) => void;\n removeCoAgentStateRender: (id: string) => void;\n\n chatComponentsCache: React.RefObject<ChatComponentsCache>;\n\n getFunctionCallHandler: (\n customEntryPoints?: Record<string, FrontendAction<any>>,\n ) => FunctionCallHandler;\n\n // text context\n addContext: (context: string, parentId?: string, categories?: string[]) => TreeNodeId;\n removeContext: (id: TreeNodeId) => void;\n getContextString: (documents: DocumentPointer[], categories: string[]) => string;\n\n // document context\n addDocumentContext: (documentPointer: DocumentPointer, categories?: string[]) => TreeNodeId;\n removeDocumentContext: (documentId: string) => void;\n getDocumentsContext: (categories: string[]) => DocumentPointer[];\n\n isLoading: boolean;\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>;\n\n chatSuggestionConfiguration: { [key: string]: CopilotChatSuggestionConfiguration };\n addChatSuggestionConfiguration: (\n id: string,\n suggestion: CopilotChatSuggestionConfiguration,\n ) => void;\n removeChatSuggestionConfiguration: (id: string) => void;\n\n chatInstructions: string;\n setChatInstructions: React.Dispatch<React.SetStateAction<string>>;\n\n // api endpoints\n copilotApiConfig: CopilotApiConfig;\n\n showDevConsole: boolean | \"auto\";\n\n // agents\n coagentStates: Record<string, CoagentState>;\n setCoagentStates: React.Dispatch<React.SetStateAction<Record<string, CoagentState>>>;\n coagentStatesRef: React.RefObject<Record<string, CoagentState>>;\n setCoagentStatesWithRef: (\n value:\n | Record<string, CoagentState>\n | ((prev: Record<string, CoagentState>) => Record<string, CoagentState>),\n ) => void;\n\n agentSession: AgentSession | null;\n setAgentSession: React.Dispatch<React.SetStateAction<AgentSession | null>>;\n\n agentLock: string | null;\n\n threadId: string | null;\n setThreadId: React.Dispatch<React.SetStateAction<string | null>>;\n\n runId: string | null;\n setRunId: React.Dispatch<React.SetStateAction<string | null>>;\n\n // The chat abort controller can be used to stop generation globally,\n // i.e. when using `stop()` from `useChat`\n chatAbortControllerRef: React.MutableRefObject<AbortController | null>;\n\n // runtime\n runtimeClient: CopilotRuntimeClient;\n}\n\nconst emptyCopilotContext: CopilotContextParams = {\n actions: {},\n setAction: () => {},\n removeAction: () => {},\n\n coAgentStateRenders: {},\n setCoAgentStateRender: () => {},\n removeCoAgentStateRender: () => {},\n\n chatComponentsCache: { current: { actions: {}, coAgentStateRenders: {} } },\n getContextString: (documents: DocumentPointer[], categories: string[]) =>\n returnAndThrowInDebug(\"\"),\n addContext: () => \"\",\n removeContext: () => {},\n\n getFunctionCallHandler: () => returnAndThrowInDebug(async () => {}),\n\n isLoading: false,\n setIsLoading: () => returnAndThrowInDebug(false),\n\n chatInstructions: \"\",\n setChatInstructions: () => returnAndThrowInDebug(\"\"),\n\n getDocumentsContext: (categories: string[]) => returnAndThrowInDebug([]),\n addDocumentContext: () => returnAndThrowInDebug(\"\"),\n removeDocumentContext: () => {},\n runtimeClient: {} as any,\n\n copilotApiConfig: new (class implements CopilotApiConfig {\n get chatApiEndpoint(): string {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n\n get headers(): Record<string, string> {\n return {};\n }\n get body(): Record<string, any> {\n return {};\n }\n })(),\n\n chatSuggestionConfiguration: {},\n addChatSuggestionConfiguration: () => {},\n removeChatSuggestionConfiguration: () => {},\n showDevConsole: \"auto\",\n coagentStates: {},\n setCoagentStates: () => {},\n coagentStatesRef: { current: {} },\n setCoagentStatesWithRef: () => {},\n\n agentSession: null,\n setAgentSession: () => {},\n\n agentLock: null,\n\n threadId: null,\n setThreadId: () => {},\n\n runId: null,\n setRunId: () => {},\n\n chatAbortControllerRef: { current: null },\n};\n\nexport const CopilotContext = React.createContext<CopilotContextParams>(emptyCopilotContext);\n\nexport function useCopilotContext(): CopilotContextParams {\n const context = React.useContext(CopilotContext);\n if (context === emptyCopilotContext) {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n }\n return context;\n}\n\nfunction returnAndThrowInDebug<T>(value: T): T {\n throw new Error(\"Remember to wrap your app in a `<CopilotKit> {...} </CopilotKit>` !!!\");\n return value;\n}\n"],"mappings":";;;;;AAMA,OAAO,WAAW;AAgKlB,IAAM,sBAA4C;AAAA,EAChD,SAAS,CAAC;AAAA,EACV,WAAW,MAAM;AAAA,EAAC;AAAA,EAClB,cAAc,MAAM;AAAA,EAAC;AAAA,EAErB,qBAAqB,CAAC;AAAA,EACtB,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAC9B,0BAA0B,MAAM;AAAA,EAAC;AAAA,EAEjC,qBAAqB,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,qBAAqB,CAAC,EAAE,EAAE;AAAA,EACzE,kBAAkB,CAAC,WAA8B,eAC/C,sBAAsB,EAAE;AAAA,EAC1B,YAAY,MAAM;AAAA,EAClB,eAAe,MAAM;AAAA,EAAC;AAAA,EAEtB,wBAAwB,MAAM,sBAAsB,MAAY;AAAA,EAAC,EAAC;AAAA,EAElE,WAAW;AAAA,EACX,cAAc,MAAM,sBAAsB,KAAK;AAAA,EAE/C,kBAAkB;AAAA,EAClB,qBAAqB,MAAM,sBAAsB,EAAE;AAAA,EAEnD,qBAAqB,CAAC,eAAyB,sBAAsB,CAAC,CAAC;AAAA,EACvE,oBAAoB,MAAM,sBAAsB,EAAE;AAAA,EAClD,uBAAuB,MAAM;AAAA,EAAC;AAAA,EAC9B,eAAe,CAAC;AAAA,EAEhB,kBAAkB,IAAK,MAAkC;AAAA,IACvD,IAAI,kBAA0B;AAC5B,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAAA,IAEA,IAAI,UAAkC;AACpC,aAAO,CAAC;AAAA,IACV;AAAA,IACA,IAAI,OAA4B;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,EACF,EAAG;AAAA,EAEH,6BAA6B,CAAC;AAAA,EAC9B,gCAAgC,MAAM;AAAA,EAAC;AAAA,EACvC,mCAAmC,MAAM;AAAA,EAAC;AAAA,EAC1C,gBAAgB;AAAA,EAChB,eAAe,CAAC;AAAA,EAChB,kBAAkB,MAAM;AAAA,EAAC;AAAA,EACzB,kBAAkB,EAAE,SAAS,CAAC,EAAE;AAAA,EAChC,yBAAyB,MAAM;AAAA,EAAC;AAAA,EAEhC,cAAc;AAAA,EACd,iBAAiB,MAAM;AAAA,EAAC;AAAA,EAExB,WAAW;AAAA,EAEX,UAAU;AAAA,EACV,aAAa,MAAM;AAAA,EAAC;AAAA,EAEpB,OAAO;AAAA,EACP,UAAU,MAAM;AAAA,EAAC;AAAA,EAEjB,wBAAwB,EAAE,SAAS,KAAK;AAC1C;AAEO,IAAM,iBAAiB,MAAM,cAAoC,mBAAmB;AAEpF,SAAS,oBAA0C;AACxD,QAAM,UAAU,MAAM,WAAW,cAAc;AAC/C,MAAI,YAAY,qBAAqB;AACnC,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,sBAAyB,OAAa;AAC7C,QAAM,IAAI,MAAM,uEAAuE;AACvF,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCopilotContext
3
- } from "./chunk-XQFVXX6R.mjs";
3
+ } from "./chunk-TQN3EZWQ.mjs";
4
4
 
5
5
  // src/hooks/use-make-copilot-document-readable.ts
6
6
  import { useEffect, useRef } from "react";
@@ -20,4 +20,4 @@ function useMakeCopilotDocumentReadable(document, categories, dependencies = [])
20
20
  export {
21
21
  useMakeCopilotDocumentReadable
22
22
  };
23
- //# sourceMappingURL=chunk-UOVONDR6.mjs.map
23
+ //# sourceMappingURL=chunk-V3PFWGIY.mjs.map
@@ -21,7 +21,7 @@ import {
21
21
  } from "./chunk-SFPANIOY.mjs";
22
22
  import {
23
23
  CopilotContext
24
- } from "./chunk-XQFVXX6R.mjs";
24
+ } from "./chunk-TQN3EZWQ.mjs";
25
25
  import {
26
26
  __async,
27
27
  __objRest,
@@ -232,6 +232,9 @@ ${nonDocumentStrings}`;
232
232
  };
233
233
  }
234
234
  const [agentSession, setAgentSession] = useState(initialAgentSession);
235
+ const [threadId, setThreadId] = useState(null);
236
+ const [runId, setRunId] = useState(null);
237
+ const chatAbortControllerRef = useRef(null);
235
238
  const showDevConsole = props.showDevConsole === void 0 ? "auto" : props.showDevConsole;
236
239
  return /* @__PURE__ */ jsx(
237
240
  CopilotContext.Provider,
@@ -266,7 +269,13 @@ ${nonDocumentStrings}`;
266
269
  setCoagentStatesWithRef,
267
270
  agentSession,
268
271
  setAgentSession,
269
- runtimeClient
272
+ runtimeClient,
273
+ agentLock: props.agent || null,
274
+ threadId,
275
+ setThreadId,
276
+ runId,
277
+ setRunId,
278
+ chatAbortControllerRef
270
279
  },
271
280
  children: /* @__PURE__ */ jsx(CopilotMessages, { children })
272
281
  }
@@ -439,4 +448,4 @@ export {
439
448
  CopilotKitInternal,
440
449
  defaultCopilotContextCategories
441
450
  };
442
- //# sourceMappingURL=chunk-IVYL7JRC.mjs.map
451
+ //# sourceMappingURL=chunk-VMP6JWBB.mjs.map