@copilotkit/runtime-client-gql 1.51.4-next.7 → 1.51.4

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 (94) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/codegen.ts +4 -1
  3. package/dist/{chunk-FTOMK35N.mjs → chunk-2XWNDVTL.mjs} +18 -7
  4. package/dist/chunk-2XWNDVTL.mjs.map +1 -0
  5. package/dist/{chunk-L6PM6AT3.mjs → chunk-A4INSSNE.mjs} +55 -55
  6. package/dist/chunk-A4INSSNE.mjs.map +1 -0
  7. package/dist/{chunk-KTA7QTTU.mjs → chunk-E5FOLXLN.mjs} +6 -3
  8. package/dist/chunk-E5FOLXLN.mjs.map +1 -0
  9. package/dist/{chunk-RNENVFJ3.mjs → chunk-LTVE64IE.mjs} +31 -11
  10. package/dist/chunk-LTVE64IE.mjs.map +1 -0
  11. package/dist/{chunk-AMFKR5ST.mjs → chunk-M4CK5HDR.mjs} +2 -2
  12. package/dist/chunk-M4CK5HDR.mjs.map +1 -0
  13. package/dist/{chunk-3ETRQN2E.mjs → chunk-QUH7QWUA.mjs} +2 -2
  14. package/dist/chunk-SDQPJXLL.mjs +20 -0
  15. package/dist/chunk-SDQPJXLL.mjs.map +1 -0
  16. package/dist/{chunk-NHOKFX55.mjs → chunk-UOAPP5IN.mjs} +6 -2
  17. package/dist/chunk-UOAPP5IN.mjs.map +1 -0
  18. package/dist/{chunk-EIPAWDCN.mjs → chunk-VIHKTLUA.mjs} +14 -6
  19. package/dist/chunk-VIHKTLUA.mjs.map +1 -0
  20. package/dist/client/CopilotRuntimeClient.js +20 -6
  21. package/dist/client/CopilotRuntimeClient.js.map +1 -1
  22. package/dist/client/CopilotRuntimeClient.mjs +4 -4
  23. package/dist/client/conversion.js.map +1 -1
  24. package/dist/client/conversion.mjs +2 -2
  25. package/dist/client/index.js +25 -7
  26. package/dist/client/index.js.map +1 -1
  27. package/dist/client/index.mjs +6 -6
  28. package/dist/client/types.js +5 -1
  29. package/dist/client/types.js.map +1 -1
  30. package/dist/client/types.mjs +1 -1
  31. package/dist/graphql/@generated/gql.d.ts +2 -2
  32. package/dist/graphql/@generated/gql.js +1 -1
  33. package/dist/graphql/@generated/gql.js.map +1 -1
  34. package/dist/graphql/@generated/gql.mjs +1 -1
  35. package/dist/graphql/@generated/index.js +1 -1
  36. package/dist/graphql/@generated/index.js.map +1 -1
  37. package/dist/graphql/@generated/index.mjs +1 -1
  38. package/dist/graphql/definitions/mutations.js +5 -2
  39. package/dist/graphql/definitions/mutations.js.map +1 -1
  40. package/dist/graphql/definitions/mutations.mjs +2 -2
  41. package/dist/graphql/definitions/queries.js +1 -1
  42. package/dist/graphql/definitions/queries.js.map +1 -1
  43. package/dist/graphql/definitions/queries.mjs +2 -2
  44. package/dist/index.js +66 -20
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.mjs +8 -8
  47. package/dist/index.umd.js +1 -1
  48. package/dist/index.umd.js.map +1 -1
  49. package/dist/{magic-string.es-26DP735G.mjs → magic-string.es-XBKSJO3K.mjs} +3 -3
  50. package/dist/magic-string.es-XBKSJO3K.mjs.map +1 -0
  51. package/dist/message-conversion/agui-to-gql.js +29 -9
  52. package/dist/message-conversion/agui-to-gql.js.map +1 -1
  53. package/dist/message-conversion/agui-to-gql.mjs +7 -7
  54. package/dist/message-conversion/agui-to-gql.test.js +133 -82
  55. package/dist/message-conversion/agui-to-gql.test.js.map +1 -1
  56. package/dist/message-conversion/agui-to-gql.test.mjs +55 -24
  57. package/dist/message-conversion/agui-to-gql.test.mjs.map +1 -1
  58. package/dist/message-conversion/gql-to-agui.js +12 -4
  59. package/dist/message-conversion/gql-to-agui.js.map +1 -1
  60. package/dist/message-conversion/gql-to-agui.mjs +7 -7
  61. package/dist/message-conversion/gql-to-agui.test.js +166 -85
  62. package/dist/message-conversion/gql-to-agui.test.js.map +1 -1
  63. package/dist/message-conversion/gql-to-agui.test.mjs +105 -32
  64. package/dist/message-conversion/gql-to-agui.test.mjs.map +1 -1
  65. package/dist/message-conversion/index.js +41 -13
  66. package/dist/message-conversion/index.js.map +1 -1
  67. package/dist/message-conversion/index.mjs +8 -8
  68. package/dist/message-conversion/roundtrip-conversion.test.js +149 -87
  69. package/dist/message-conversion/roundtrip-conversion.test.js.map +1 -1
  70. package/dist/message-conversion/roundtrip-conversion.test.mjs +60 -26
  71. package/dist/message-conversion/roundtrip-conversion.test.mjs.map +1 -1
  72. package/package.json +3 -4
  73. package/src/client/CopilotRuntimeClient.ts +21 -5
  74. package/src/client/conversion.ts +3 -1
  75. package/src/client/types.ts +34 -12
  76. package/src/graphql/@generated/gql.ts +3 -3
  77. package/src/graphql/definitions/mutations.ts +4 -1
  78. package/src/message-conversion/agui-to-gql.test.ts +49 -17
  79. package/src/message-conversion/agui-to-gql.ts +47 -15
  80. package/src/message-conversion/gql-to-agui.test.ts +101 -26
  81. package/src/message-conversion/gql-to-agui.ts +30 -11
  82. package/src/message-conversion/roundtrip-conversion.test.ts +53 -18
  83. package/tsconfig.json +1 -1
  84. package/dist/chunk-AMFKR5ST.mjs.map +0 -1
  85. package/dist/chunk-EIPAWDCN.mjs.map +0 -1
  86. package/dist/chunk-FTOMK35N.mjs.map +0 -1
  87. package/dist/chunk-KTA7QTTU.mjs.map +0 -1
  88. package/dist/chunk-L6PM6AT3.mjs.map +0 -1
  89. package/dist/chunk-M5LBGBWO.mjs +0 -20
  90. package/dist/chunk-M5LBGBWO.mjs.map +0 -1
  91. package/dist/chunk-NHOKFX55.mjs.map +0 -1
  92. package/dist/chunk-RNENVFJ3.mjs.map +0 -1
  93. package/dist/magic-string.es-26DP735G.mjs.map +0 -1
  94. /package/dist/{chunk-3ETRQN2E.mjs.map → chunk-QUH7QWUA.mjs.map} +0 -0
@@ -70,7 +70,9 @@ describe("roundtrip message conversion", () => {
70
70
  const gqlMsgs2 = aguiToGQL(aguiMsgs);
71
71
  expect(gqlMsgs2[0].id).toBe(gqlMsg.id);
72
72
  expect((gqlMsgs2[0] as any).result).toBe(gqlMsg.result);
73
- expect((gqlMsgs2[0] as any).actionExecutionId).toBe(gqlMsg.actionExecutionId);
73
+ expect((gqlMsgs2[0] as any).actionExecutionId).toBe(
74
+ gqlMsg.actionExecutionId,
75
+ );
74
76
  });
75
77
 
76
78
  test("action execution AGUI -> GQL -> AGUI", () => {
@@ -96,7 +98,9 @@ describe("roundtrip message conversion", () => {
96
98
  expect(aguiMsgs2[1].role).toBe("assistant");
97
99
  // Only check toolCalls if present
98
100
  if ("toolCalls" in aguiMsgs2[1]) {
99
- expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe("doSomething");
101
+ expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(
102
+ "doSomething",
103
+ );
100
104
  }
101
105
  });
102
106
 
@@ -148,14 +152,18 @@ describe("roundtrip message conversion", () => {
148
152
  ],
149
153
  generativeUI: mockRender,
150
154
  };
151
- const actions: Record<string, any> = { doSomething: { name: "doSomething" } };
155
+ const actions: Record<string, any> = {
156
+ doSomething: { name: "doSomething" },
157
+ };
152
158
  const gqlMsgs = aguiToGQL(aguiMsg, actions);
153
159
  const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);
154
160
  // The render function should be preserved in actions context
155
161
  expect(typeof actions.doSomething.render).toBe("function");
156
162
  // The roundtripped message should have the same tool call
157
163
  if ("toolCalls" in aguiMsgs2[1]) {
158
- expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe("doSomething");
164
+ expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(
165
+ "doSomething",
166
+ );
159
167
  }
160
168
  });
161
169
 
@@ -190,7 +198,9 @@ describe("roundtrip message conversion", () => {
190
198
  expect(aguiAssistantMsgs2[0].id).toBe(aguiAssistantImageMsg.id);
191
199
  expect(aguiAssistantMsgs2[0].role).toBe("assistant");
192
200
  expect((aguiAssistantMsgs2[0] as any).image.format).toBe("jpeg");
193
- expect((aguiAssistantMsgs2[0] as any).image.bytes).toBe("assistantbase64data");
201
+ expect((aguiAssistantMsgs2[0] as any).image.bytes).toBe(
202
+ "assistantbase64data",
203
+ );
194
204
 
195
205
  // User image message
196
206
  const aguiUserImageMsg: agui.Message = {
@@ -211,7 +221,9 @@ describe("roundtrip message conversion", () => {
211
221
  });
212
222
 
213
223
  test("wild card action roundtrip conversion", () => {
214
- const mockRender = vi.fn((props) => `Wildcard rendered: ${props.args.test}`);
224
+ const mockRender = vi.fn(
225
+ (props) => `Wildcard rendered: ${props.args.test}`,
226
+ );
215
227
  const aguiMsg: agui.Message = {
216
228
  id: "assistant-wildcard-1",
217
229
  role: "assistant",
@@ -248,7 +260,9 @@ describe("roundtrip message conversion", () => {
248
260
 
249
261
  // Check that the tool call is preserved
250
262
  if ("toolCalls" in aguiMsgs2[1]) {
251
- expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe("unknownAction");
263
+ expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(
264
+ "unknownAction",
265
+ );
252
266
  expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(
253
267
  '{"test":"wildcard-value"}',
254
268
  );
@@ -256,7 +270,9 @@ describe("roundtrip message conversion", () => {
256
270
  });
257
271
 
258
272
  test("wild card action with specific action priority roundtrip", () => {
259
- const mockRender = vi.fn((props) => `Specific action rendered: ${props.args.test}`);
273
+ const mockRender = vi.fn(
274
+ (props) => `Specific action rendered: ${props.args.test}`,
275
+ );
260
276
  const aguiMsg: agui.Message = {
261
277
  id: "assistant-priority-1",
262
278
  role: "assistant",
@@ -295,7 +311,9 @@ describe("roundtrip message conversion", () => {
295
311
 
296
312
  // Check that the tool call is preserved
297
313
  if ("toolCalls" in aguiMsgs2[1]) {
298
- expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe("specificAction");
314
+ expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(
315
+ "specificAction",
316
+ );
299
317
  expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(
300
318
  '{"test":"specific-value"}',
301
319
  );
@@ -329,7 +347,9 @@ describe("roundtrip message conversion", () => {
329
347
  expect((gqlMsgs2[0] as any).role).toBe(gql.Role.Assistant);
330
348
  expect(gqlMsgs2[1].id).toBe("wildcard-action-1");
331
349
  expect((gqlMsgs2[1] as any).name).toBe("unknownAction");
332
- expect((gqlMsgs2[1] as any).arguments).toEqual({ test: "wildcard-gql-value" });
350
+ expect((gqlMsgs2[1] as any).arguments).toEqual({
351
+ test: "wildcard-gql-value",
352
+ });
333
353
  });
334
354
 
335
355
  test("roundtrip conversion with result parsing edge cases", () => {
@@ -348,11 +368,15 @@ describe("roundtrip message conversion", () => {
348
368
 
349
369
  expect(gqlMsgs).toHaveLength(1);
350
370
  expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);
351
- expect((gqlMsgs[0] as any).result).toBe('{"status": "success", "data": {"value": 42}}');
371
+ expect((gqlMsgs[0] as any).result).toBe(
372
+ '{"status": "success", "data": {"value": 42}}',
373
+ );
352
374
 
353
375
  expect(aguiMsgs).toHaveLength(1);
354
376
  expect(aguiMsgs[0].role).toBe("tool");
355
- expect(aguiMsgs[0].content).toBe('{"status": "success", "data": {"value": 42}}');
377
+ expect(aguiMsgs[0].content).toBe(
378
+ '{"status": "success", "data": {"value": 42}}',
379
+ );
356
380
  });
357
381
 
358
382
  test("roundtrip conversion with object content in tool results", () => {
@@ -371,15 +395,21 @@ describe("roundtrip message conversion", () => {
371
395
 
372
396
  expect(gqlMsgs).toHaveLength(1);
373
397
  expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);
374
- expect((gqlMsgs[0] as any).result).toBe('{"status":"success","data":{"value":42}}');
398
+ expect((gqlMsgs[0] as any).result).toBe(
399
+ '{"status":"success","data":{"value":42}}',
400
+ );
375
401
 
376
402
  expect(aguiMsgs).toHaveLength(1);
377
403
  expect(aguiMsgs[0].role).toBe("tool");
378
- expect(aguiMsgs[0].content).toBe('{"status":"success","data":{"value":42}}');
404
+ expect(aguiMsgs[0].content).toBe(
405
+ '{"status":"success","data":{"value":42}}',
406
+ );
379
407
  });
380
408
 
381
409
  test("roundtrip conversion with action execution and result parsing", () => {
382
- const mockRender = vi.fn((props) => `Rendered: ${JSON.stringify(props.result)}`);
410
+ const mockRender = vi.fn(
411
+ (props) => `Rendered: ${JSON.stringify(props.result)}`,
412
+ );
383
413
 
384
414
  // Create action execution message
385
415
  const actionExecMsg = new gql.ActionExecutionMessage({
@@ -435,11 +465,15 @@ describe("roundtrip message conversion", () => {
435
465
 
436
466
  // Check that arguments roundtripped correctly
437
467
  expect((gqlMsgs2[1] as any).arguments).toEqual({ input: "test-value" });
438
- expect((gqlMsgs2[2] as any).result).toBe('{"output": "processed", "count": 5}');
468
+ expect((gqlMsgs2[2] as any).result).toBe(
469
+ '{"output": "processed", "count": 5}',
470
+ );
439
471
  });
440
472
 
441
473
  test("roundtrip conversion verifies correct property distribution for regular actions", () => {
442
- const mockRender = vi.fn((props) => `Regular action: ${JSON.stringify(props.args)}`);
474
+ const mockRender = vi.fn(
475
+ (props) => `Regular action: ${JSON.stringify(props.args)}`,
476
+ );
443
477
 
444
478
  const actionExecMsg = new gql.ActionExecutionMessage({
445
479
  id: "regular-action-test",
@@ -482,7 +516,8 @@ describe("roundtrip message conversion", () => {
482
516
 
483
517
  test("roundtrip conversion verifies correct property distribution for wildcard actions", () => {
484
518
  const mockRender = vi.fn(
485
- (props) => `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`,
519
+ (props) =>
520
+ `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`,
486
521
  );
487
522
 
488
523
  const actionExecMsg = new gql.ActionExecutionMessage({
package/tsconfig.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../utilities/tsconfig/base.json",
2
+ "extends": "../tsconfig/base.json",
3
3
  "compilerOptions": {
4
4
  "strictPropertyInitialization": false,
5
5
  "resolveJsonModule": true
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/conversion.ts"],"sourcesContent":["import {\n GenerateCopilotResponseMutation,\n MessageInput,\n MessageStatusCode,\n} from \"../graphql/@generated/graphql\";\nimport {\n ActionExecutionMessage,\n AgentStateMessage,\n Message,\n ResultMessage,\n TextMessage,\n ImageMessage,\n} from \"./types\";\n\nimport untruncateJson from \"untruncate-json\";\nimport { parseJson } from \"@copilotkit/shared\";\n\nexport function filterAgentStateMessages(messages: Message[]): Message[] {\n return messages.filter((message) => !message.isAgentStateMessage());\n}\n\nexport function convertMessagesToGqlInput(messages: Message[]): MessageInput[] {\n return messages.map((message) => {\n if (message.isTextMessage()) {\n return {\n id: message.id,\n createdAt: message.createdAt,\n textMessage: {\n content: message.content,\n role: message.role as any,\n parentMessageId: message.parentMessageId,\n },\n };\n } else if (message.isActionExecutionMessage()) {\n return {\n id: message.id,\n createdAt: message.createdAt,\n actionExecutionMessage: {\n name: message.name,\n arguments: JSON.stringify(message.arguments),\n parentMessageId: message.parentMessageId,\n },\n };\n } else if (message.isResultMessage()) {\n return {\n id: message.id,\n createdAt: message.createdAt,\n resultMessage: {\n result: message.result,\n actionExecutionId: message.actionExecutionId,\n actionName: message.actionName,\n },\n };\n } else if (message.isAgentStateMessage()) {\n return {\n id: message.id,\n createdAt: message.createdAt,\n agentStateMessage: {\n threadId: message.threadId,\n role: message.role,\n agentName: message.agentName,\n nodeName: message.nodeName,\n runId: message.runId,\n active: message.active,\n running: message.running,\n state: JSON.stringify(message.state),\n },\n };\n } else if (message.isImageMessage()) {\n return {\n id: message.id,\n createdAt: message.createdAt,\n imageMessage: {\n format: message.format,\n bytes: message.bytes,\n role: message.role as any,\n parentMessageId: message.parentMessageId,\n },\n };\n } else {\n throw new Error(\"Unknown message type\");\n }\n });\n}\n\nexport function filterAdjacentAgentStateMessages(\n messages: GenerateCopilotResponseMutation[\"generateCopilotResponse\"][\"messages\"],\n): GenerateCopilotResponseMutation[\"generateCopilotResponse\"][\"messages\"] {\n const filteredMessages: GenerateCopilotResponseMutation[\"generateCopilotResponse\"][\"messages\"] =\n [];\n\n messages.forEach((message, i) => {\n // keep all other message types\n if (message.__typename !== \"AgentStateMessageOutput\") {\n filteredMessages.push(message);\n } else {\n const prevAgentStateMessageIndex = filteredMessages.findIndex(\n // TODO: also check runId\n (m) => m.__typename === \"AgentStateMessageOutput\" && m.agentName === message.agentName,\n );\n if (prevAgentStateMessageIndex === -1) {\n filteredMessages.push(message);\n } else {\n filteredMessages[prevAgentStateMessageIndex] = message;\n }\n }\n });\n\n return filteredMessages;\n}\n\nexport function convertGqlOutputToMessages(\n messages: GenerateCopilotResponseMutation[\"generateCopilotResponse\"][\"messages\"],\n): Message[] {\n return messages.map((message) => {\n if (message.__typename === \"TextMessageOutput\") {\n return new TextMessage({\n id: message.id,\n role: message.role,\n content: message.content.join(\"\"),\n parentMessageId: message.parentMessageId,\n createdAt: new Date(),\n status: message.status || { code: MessageStatusCode.Pending },\n });\n } else if (message.__typename === \"ActionExecutionMessageOutput\") {\n return new ActionExecutionMessage({\n id: message.id,\n name: message.name,\n arguments: getPartialArguments(message.arguments),\n parentMessageId: message.parentMessageId,\n createdAt: new Date(),\n status: message.status || { code: MessageStatusCode.Pending },\n });\n } else if (message.__typename === \"ResultMessageOutput\") {\n return new ResultMessage({\n id: message.id,\n result: message.result,\n actionExecutionId: message.actionExecutionId,\n actionName: message.actionName,\n createdAt: new Date(),\n status: message.status || { code: MessageStatusCode.Pending },\n });\n } else if (message.__typename === \"AgentStateMessageOutput\") {\n return new AgentStateMessage({\n id: message.id,\n threadId: message.threadId,\n role: message.role,\n agentName: message.agentName,\n nodeName: message.nodeName,\n runId: message.runId,\n active: message.active,\n running: message.running,\n state: parseJson(message.state, {}),\n createdAt: new Date(),\n });\n } else if (message.__typename === \"ImageMessageOutput\") {\n return new ImageMessage({\n id: message.id,\n format: message.format,\n bytes: message.bytes,\n role: message.role,\n parentMessageId: message.parentMessageId,\n createdAt: new Date(),\n status: message.status || { code: MessageStatusCode.Pending },\n });\n }\n\n throw new Error(\"Unknown message type\");\n });\n}\n\nexport function loadMessagesFromJsonRepresentation(json: any[]): Message[] {\n const result: Message[] = [];\n for (const item of json) {\n if (\"content\" in item) {\n result.push(\n new TextMessage({\n id: item.id,\n role: item.role,\n content: item.content,\n parentMessageId: item.parentMessageId,\n createdAt: item.createdAt || new Date(),\n status: item.status || { code: MessageStatusCode.Success },\n }),\n );\n } else if (\"arguments\" in item) {\n result.push(\n new ActionExecutionMessage({\n id: item.id,\n name: item.name,\n arguments: item.arguments,\n parentMessageId: item.parentMessageId,\n createdAt: item.createdAt || new Date(),\n status: item.status || { code: MessageStatusCode.Success },\n }),\n );\n } else if (\"result\" in item) {\n result.push(\n new ResultMessage({\n id: item.id,\n result: item.result,\n actionExecutionId: item.actionExecutionId,\n actionName: item.actionName,\n createdAt: item.createdAt || new Date(),\n status: item.status || { code: MessageStatusCode.Success },\n }),\n );\n } else if (\"state\" in item) {\n result.push(\n new AgentStateMessage({\n id: item.id,\n threadId: item.threadId,\n role: item.role,\n agentName: item.agentName,\n nodeName: item.nodeName,\n runId: item.runId,\n active: item.active,\n running: item.running,\n state: item.state,\n createdAt: item.createdAt || new Date(),\n }),\n );\n } else if (\"format\" in item && \"bytes\" in item) {\n result.push(\n new ImageMessage({\n id: item.id,\n format: item.format,\n bytes: item.bytes,\n role: item.role,\n parentMessageId: item.parentMessageId,\n createdAt: item.createdAt || new Date(),\n status: item.status || { code: MessageStatusCode.Success },\n }),\n );\n }\n }\n return result;\n}\n\nfunction getPartialArguments(args: string[]) {\n try {\n if (!args.length) return {};\n\n return JSON.parse(untruncateJson(args.join(\"\")));\n } catch (e) {\n return {};\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/message-conversion/gql-to-agui.ts"],"sourcesContent":["import * as gql from \"../client\";\nimport agui from \"@copilotkit/shared\";\nimport { MessageStatusCode } from \"../graphql/@generated/graphql\";\n\n// Define valid image formats based on the supported formats in the codebase\nconst VALID_IMAGE_FORMATS = [\"jpeg\", \"png\", \"webp\", \"gif\"] as const;\ntype ValidImageFormat = (typeof VALID_IMAGE_FORMATS)[number];\n\n// Validation function for image format\nfunction validateImageFormat(format: string): format is ValidImageFormat {\n return VALID_IMAGE_FORMATS.includes(format as ValidImageFormat);\n}\n\n/*\n ----------------------------\n GQL Message -> AGUI Message\n ----------------------------\n*/\nexport function gqlToAGUI(\n messages: gql.Message[] | gql.Message,\n actions?: Record<string, any>,\n coAgentStateRenders?: Record<string, any>,\n): agui.Message[] {\n let aguiMessages: agui.Message[] = [];\n messages = Array.isArray(messages) ? messages : [messages];\n\n // Create a map of action execution ID to result for completed actions\n const actionResults = new Map<string, string>();\n for (const message of messages) {\n if (message.isResultMessage()) {\n actionResults.set(message.actionExecutionId, message.result);\n }\n }\n\n for (const message of messages) {\n if (message.isTextMessage()) {\n aguiMessages.push(gqlTextMessageToAGUIMessage(message));\n } else if (message.isResultMessage()) {\n aguiMessages.push(gqlResultMessageToAGUIMessage(message));\n } else if (message.isActionExecutionMessage()) {\n aguiMessages.push(gqlActionExecutionMessageToAGUIMessage(message, actions, actionResults));\n } else if (message.isAgentStateMessage()) {\n aguiMessages.push(gqlAgentStateMessageToAGUIMessage(message, coAgentStateRenders));\n } else if (message.isImageMessage()) {\n aguiMessages.push(gqlImageMessageToAGUIMessage(message));\n } else {\n throw new Error(\"Unknown message type\");\n }\n }\n\n return aguiMessages;\n}\n\nexport function gqlActionExecutionMessageToAGUIMessage(\n message: gql.ActionExecutionMessage,\n actions?: Record<string, any>,\n actionResults?: Map<string, string>,\n): agui.Message {\n // Check if we have actions and if there's a specific action or wild card action\n const hasSpecificAction =\n actions && Object.values(actions).some((action: any) => action.name === message.name);\n const hasWildcardAction =\n actions && Object.values(actions).some((action: any) => action.name === \"*\");\n\n if (!actions || (!hasSpecificAction && !hasWildcardAction)) {\n return {\n id: message.id,\n role: \"assistant\",\n toolCalls: [actionExecutionMessageToAGUIMessage(message)],\n name: message.name,\n };\n }\n\n // Find the specific action first, then fall back to wild card action\n const action =\n Object.values(actions).find((action: any) => action.name === message.name) ||\n Object.values(actions).find((action: any) => action.name === \"*\");\n\n // Create render function wrapper that provides proper props\n const createRenderWrapper = (originalRender: any) => {\n if (!originalRender) return undefined;\n\n return (props?: any) => {\n // Determine the correct status based on the same logic as RenderActionExecutionMessage\n let actionResult: any = actionResults?.get(message.id);\n let status: \"inProgress\" | \"executing\" | \"complete\" = \"inProgress\";\n\n if (actionResult !== undefined) {\n status = \"complete\";\n } else if (message.status?.code !== MessageStatusCode.Pending) {\n status = \"executing\";\n }\n\n // if props.result is a string, parse it as JSON but don't throw an error if it's not valid JSON\n if (typeof props?.result === \"string\") {\n try {\n props.result = JSON.parse(props.result);\n } catch (e) {\n /* do nothing */\n }\n }\n\n // if actionResult is a string, parse it as JSON but don't throw an error if it's not valid JSON\n if (typeof actionResult === \"string\") {\n try {\n actionResult = JSON.parse(actionResult);\n } catch (e) {\n /* do nothing */\n }\n }\n\n // Base props that all actions receive\n const baseProps = {\n status: props?.status || status,\n args: message.arguments || {},\n result: props?.result || actionResult || undefined,\n messageId: message.id,\n };\n\n // Add properties based on action type\n if (action.name === \"*\") {\n // Wildcard actions get the tool name; ensure it cannot be overridden by incoming props\n return originalRender({\n ...baseProps,\n ...props,\n name: message.name,\n });\n } else {\n // Regular actions get respond (defaulting to a no-op if not provided)\n const respond = props?.respond ?? (() => {});\n return originalRender({\n ...baseProps,\n ...props,\n respond,\n });\n }\n };\n };\n\n return {\n id: message.id,\n role: \"assistant\",\n content: \"\",\n toolCalls: [actionExecutionMessageToAGUIMessage(message)],\n generativeUI: createRenderWrapper(action.render),\n name: message.name,\n } as agui.AIMessage;\n}\n\nfunction gqlAgentStateMessageToAGUIMessage(\n message: gql.AgentStateMessage,\n coAgentStateRenders?: Record<string, any>,\n): agui.Message {\n if (\n coAgentStateRenders &&\n Object.values(coAgentStateRenders).some((render: any) => render.name === message.agentName)\n ) {\n const render = Object.values(coAgentStateRenders).find(\n (render: any) => render.name === message.agentName,\n );\n\n // Create render function wrapper that provides proper props\n const createRenderWrapper = (originalRender: any) => {\n if (!originalRender) return undefined;\n\n return (props?: any) => {\n // Determine the correct status based on the same logic as RenderActionExecutionMessage\n const state = message.state;\n\n // Provide the full props structure that the render function expects\n const renderProps = {\n state: state,\n };\n\n return originalRender(renderProps);\n };\n };\n\n return {\n id: message.id,\n role: \"assistant\",\n generativeUI: createRenderWrapper(render.render),\n agentName: message.agentName,\n state: message.state,\n };\n }\n\n return {\n id: message.id,\n role: \"assistant\",\n agentName: message.agentName,\n state: message.state,\n };\n}\n\nfunction actionExecutionMessageToAGUIMessage(\n actionExecutionMessage: gql.ActionExecutionMessage,\n): agui.ToolCall {\n return {\n id: actionExecutionMessage.id,\n function: {\n name: actionExecutionMessage.name,\n arguments: JSON.stringify(actionExecutionMessage.arguments),\n },\n type: \"function\",\n };\n}\n\nexport function gqlTextMessageToAGUIMessage(message: gql.TextMessage): agui.Message {\n switch (message.role) {\n case gql.Role.Developer:\n return {\n id: message.id,\n role: \"developer\",\n content: message.content,\n };\n case gql.Role.System:\n return {\n id: message.id,\n role: \"system\",\n content: message.content,\n };\n case gql.Role.Assistant:\n return {\n id: message.id,\n role: \"assistant\",\n content: message.content,\n };\n case gql.Role.User:\n return {\n id: message.id,\n role: \"user\",\n content: message.content,\n };\n default:\n throw new Error(\"Unknown message role\");\n }\n}\n\nexport function gqlResultMessageToAGUIMessage(message: gql.ResultMessage): agui.Message {\n return {\n id: message.id,\n role: \"tool\",\n content: message.result,\n toolCallId: message.actionExecutionId,\n toolName: message.actionName,\n };\n}\n\nexport function gqlImageMessageToAGUIMessage(message: gql.ImageMessage): agui.Message {\n // Validate image format\n if (!validateImageFormat(message.format)) {\n throw new Error(\n `Invalid image format: ${message.format}. Supported formats are: ${VALID_IMAGE_FORMATS.join(\", \")}`,\n );\n }\n\n // Validate that bytes is a non-empty string\n if (!message.bytes || typeof message.bytes !== \"string\" || message.bytes.trim() === \"\") {\n throw new Error(\"Image bytes must be a non-empty string\");\n }\n\n // Determine the role based on the message role\n const role = message.role === gql.Role.Assistant ? \"assistant\" : \"user\";\n\n // Create the image message with proper typing\n const imageMessage: agui.Message = {\n id: message.id,\n role,\n content: \"\",\n image: {\n format: message.format,\n bytes: message.bytes,\n },\n };\n\n return imageMessage;\n}\n"],"mappings":"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","names":["action","render"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client/CopilotRuntimeClient.ts","../package.json"],"sourcesContent":["import { Client, cacheExchange, fetchExchange } from \"@urql/core\";\nimport * as packageJson from \"../../package.json\";\nimport {\n AvailableAgentsQuery,\n GenerateCopilotResponseMutation,\n GenerateCopilotResponseMutationVariables,\n LoadAgentStateQuery,\n} from \"../graphql/@generated/graphql\";\nimport { generateCopilotResponseMutation } from \"../graphql/definitions/mutations\";\nimport { getAvailableAgentsQuery, loadAgentStateQuery } from \"../graphql/definitions/queries\";\nimport { OperationResultSource, OperationResult } from \"urql\";\nimport {\n ResolvedCopilotKitError,\n CopilotKitLowLevelError,\n CopilotKitError,\n CopilotKitVersionMismatchError,\n getPossibleVersionMismatch,\n} from \"@copilotkit/shared\";\n\nconst createFetchFn =\n (signal?: AbortSignal, handleGQLWarning?: (warning: string) => void) =>\n async (...args: Parameters<typeof fetch>) => {\n // @ts-expect-error -- since this is our own header, TS will not recognize\n const publicApiKey = args[1]?.headers?.[\"x-copilotcloud-public-api-key\"];\n try {\n const result = await fetch(args[0], { ...(args[1] ?? {}), signal });\n\n // No mismatch checking if cloud is being used\n const mismatch = publicApiKey\n ? null\n : await getPossibleVersionMismatch({\n runtimeVersion: result.headers.get(\"X-CopilotKit-Runtime-Version\")!,\n runtimeClientGqlVersion: packageJson.version,\n });\n if (result.status !== 200) {\n if (result.status >= 400 && result.status <= 500) {\n if (mismatch) {\n throw new CopilotKitVersionMismatchError(mismatch);\n }\n\n throw new ResolvedCopilotKitError({ status: result.status });\n }\n }\n\n if (mismatch && handleGQLWarning) {\n handleGQLWarning(mismatch.message);\n }\n\n return result;\n } catch (error) {\n // Let abort error pass through. It will be suppressed later\n if (\n (error as Error).message.includes(\"BodyStreamBuffer was aborted\") ||\n (error as Error).message.includes(\"signal is aborted without reason\")\n ) {\n throw error;\n }\n if (error instanceof CopilotKitError) {\n throw error;\n }\n throw new CopilotKitLowLevelError({ error: error as Error, url: args[0] as string });\n }\n };\n\nexport interface CopilotRuntimeClientOptions {\n url: string;\n publicApiKey?: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n handleGQLErrors?: (error: Error) => void;\n handleGQLWarning?: (warning: string) => void;\n}\n\nexport class CopilotRuntimeClient {\n client: Client;\n public handleGQLErrors?: (error: Error) => void;\n public handleGQLWarning?: (warning: string) => void;\n\n constructor(options: CopilotRuntimeClientOptions) {\n const headers: Record<string, string> = {};\n\n this.handleGQLErrors = options.handleGQLErrors;\n this.handleGQLWarning = options.handleGQLWarning;\n\n if (options.headers) {\n Object.assign(headers, options.headers);\n }\n\n if (options.publicApiKey) {\n headers[\"x-copilotcloud-public-api-key\"] = options.publicApiKey;\n }\n\n this.client = new Client({\n url: options.url,\n exchanges: [cacheExchange, fetchExchange],\n fetchOptions: {\n headers: {\n ...headers,\n \"X-CopilotKit-Runtime-Client-GQL-Version\": packageJson.version,\n },\n ...(options.credentials ? { credentials: options.credentials } : {}),\n },\n });\n }\n\n generateCopilotResponse({\n data,\n properties,\n signal,\n }: {\n data: GenerateCopilotResponseMutationVariables[\"data\"];\n properties?: GenerateCopilotResponseMutationVariables[\"properties\"];\n signal?: AbortSignal;\n }) {\n const fetchFn = createFetchFn(signal, this.handleGQLWarning);\n const result = this.client.mutation<\n GenerateCopilotResponseMutation,\n GenerateCopilotResponseMutationVariables\n >(generateCopilotResponseMutation, { data, properties }, { fetch: fetchFn });\n\n return result;\n }\n\n public asStream<S, T>(source: OperationResultSource<OperationResult<S, { data: T }>>) {\n const handleGQLErrors = this.handleGQLErrors;\n return new ReadableStream<S>({\n start(controller) {\n source.subscribe(({ data, hasNext, error }) => {\n if (error) {\n if (\n error.message.includes(\"BodyStreamBuffer was aborted\") ||\n error.message.includes(\"signal is aborted without reason\")\n ) {\n // close the stream if there is no next item\n if (!hasNext) controller.close();\n\n //suppress this specific error\n console.warn(\"Abort error suppressed\");\n return;\n }\n\n // Handle structured errors specially - check if it's a CopilotKitError with visibility\n if ((error as any).extensions?.visibility) {\n // Create a synthetic GraphQL error with the structured error info\n const syntheticError = {\n ...error,\n graphQLErrors: [\n {\n message: error.message,\n extensions: (error as any).extensions,\n },\n ],\n };\n\n if (handleGQLErrors) {\n handleGQLErrors(syntheticError);\n }\n return; // Don't close the stream for structured errors, let the error handler decide\n }\n\n controller.error(error);\n if (handleGQLErrors) {\n handleGQLErrors(error);\n }\n } else {\n controller.enqueue(data);\n if (!hasNext) {\n controller.close();\n }\n }\n });\n },\n });\n }\n\n availableAgents() {\n const fetchFn = createFetchFn();\n return this.client.query<AvailableAgentsQuery>(getAvailableAgentsQuery, {}, { fetch: fetchFn });\n }\n\n loadAgentState(data: { threadId: string; agentName: string }) {\n const fetchFn = createFetchFn();\n const result = this.client.query<LoadAgentStateQuery>(\n loadAgentStateQuery,\n { data },\n { fetch: fetchFn },\n );\n\n // Add error handling for GraphQL errors - similar to generateCopilotResponse\n result\n .toPromise()\n .then(({ error }) => {\n if (error && this.handleGQLErrors) {\n this.handleGQLErrors(error);\n }\n })\n .catch(() => {}); // Suppress promise rejection warnings\n\n return result;\n }\n\n static removeGraphQLTypename(data: any) {\n if (Array.isArray(data)) {\n data.forEach((item) => CopilotRuntimeClient.removeGraphQLTypename(item));\n } else if (typeof data === \"object\" && data !== null) {\n delete data.__typename;\n Object.keys(data).forEach((key) => {\n if (typeof data[key] === \"object\" && data[key] !== null) {\n CopilotRuntimeClient.removeGraphQLTypename(data[key]);\n }\n });\n }\n return data;\n }\n}\n","{\n \"name\": \"@copilotkit/runtime-client-gql\",\n \"private\": false,\n \"homepage\": \"https://github.com/CopilotKit/CopilotKit\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/CopilotKit/CopilotKit.git\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"version\": \"1.51.4-next.7\",\n \"sideEffects\": false,\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n }\n },\n \"unpkg\": \"./dist/index.umd.js\",\n \"jsdelivr\": \"./dist/index.umd.js\",\n \"types\": \"./dist/index.d.ts\",\n \"license\": \"MIT\",\n \"scripts\": {\n \"build\": \"pnpm run graphql-codegen && tsup --clean && rollup -c rollup.config.mjs\",\n \"dev\": \"concurrently \\\"pnpm run graphql-codegen:watch\\\" \\\"tsup --watch --no-splitting\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"check-types\": \"tsc --noEmit\",\n \"clean\": \"rm -rf .turbo && rm -rf node_modules && rm -rf ./src/graphql/@generated && rm -rf dist && rm -rf .next\",\n \"graphql-codegen\": \"graphql-codegen -c codegen.ts\",\n \"graphql-codegen:watch\": \"graphql-codegen -c codegen.ts --watch\",\n \"link:global\": \"pnpm link --global\",\n \"unlink:global\": \"pnpm unlink --global\"\n },\n \"peerDependencies\": {\n \"react\": \"^18 || ^19 || ^19.0.0-rc\"\n },\n \"devDependencies\": {\n \"@graphql-codegen/cli\": \"^5.0.2\",\n \"@graphql-codegen/client-preset\": \"^4.2.6\",\n \"@graphql-codegen/introspection\": \"^4.0.3\",\n \"@graphql-codegen/typescript\": \"^4.0.7\",\n \"@graphql-codegen/typescript-operations\": \"^4.2.1\",\n \"@graphql-codegen/typescript-urql\": \"^4.0.0\",\n \"@graphql-codegen/urql-introspection\": \"^3.0.0\",\n \"@graphql-typed-document-node/core\": \"^3.2.0\",\n \"@parcel/watcher\": \"^2.4.1\",\n \"@types/node\": \"^20.12.12\",\n \"concurrently\": \"^8.2.2\",\n \"esbuild\": \"^0.23.0\",\n \"graphql\": \"^16.8.1\",\n \"jest\": \"^29.6.4\",\n \"ts-jest\": \"^29.1.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^6.7.0\",\n \"typescript\": \"^5.4.5\",\n \"vitest\": \"^3.1.3\"\n },\n \"dependencies\": {\n \"@copilotkit/runtime\": \"workspace:*\",\n \"@copilotkit/shared\": \"workspace:*\",\n \"@urql/core\": \"^5.0.3\",\n \"untruncate-json\": \"^0.0.1\",\n \"urql\": \"^4.1.0\"\n },\n \"keywords\": [\n \"copilotkit\",\n \"copilot\",\n \"react\",\n \"nextjs\",\n \"nodejs\",\n \"ai\",\n \"assistant\",\n \"javascript\",\n \"automation\",\n \"textarea\"\n ]\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/graphql/definitions/mutations.ts"],"sourcesContent":["import { graphql } from \"../@generated/gql\";\n\nexport const generateCopilotResponseMutation = graphql(/** GraphQL **/ `\n mutation generateCopilotResponse($data: GenerateCopilotResponseInput!, $properties: JSONObject) {\n generateCopilotResponse(data: $data, properties: $properties) {\n threadId\n runId\n extensions {\n openaiAssistantAPI {\n runId\n threadId\n }\n }\n ... on CopilotResponse @defer {\n status {\n ... on BaseResponseStatus {\n code\n }\n ... on FailedResponseStatus {\n reason\n details\n }\n }\n }\n messages @stream {\n __typename\n ... on BaseMessageOutput {\n id\n createdAt\n }\n ... on BaseMessageOutput @defer {\n status {\n ... on SuccessMessageStatus {\n code\n }\n ... on FailedMessageStatus {\n code\n reason\n }\n ... on PendingMessageStatus {\n code\n }\n }\n }\n ... on TextMessageOutput {\n content @stream\n role\n parentMessageId\n }\n ... on ImageMessageOutput {\n format\n bytes\n role\n parentMessageId\n }\n ... on ActionExecutionMessageOutput {\n name\n arguments @stream\n parentMessageId\n }\n ... on ResultMessageOutput {\n result\n actionExecutionId\n actionName\n }\n ... on AgentStateMessageOutput {\n threadId\n state\n running\n agentName\n nodeName\n runId\n active\n role\n }\n }\n metaEvents @stream {\n ... on LangGraphInterruptEvent {\n type\n name\n value\n }\n\n ... on CopilotKitLangGraphInterruptEvent {\n type\n name\n data {\n messages {\n __typename\n ... on BaseMessageOutput {\n id\n createdAt\n }\n ... on BaseMessageOutput @defer {\n status {\n ... on SuccessMessageStatus {\n code\n }\n ... on FailedMessageStatus {\n code\n reason\n }\n ... on PendingMessageStatus {\n code\n }\n }\n }\n ... on TextMessageOutput {\n content\n role\n parentMessageId\n }\n ... on ActionExecutionMessageOutput {\n name\n arguments\n parentMessageId\n }\n ... on ResultMessageOutput {\n result\n actionExecutionId\n actionName\n }\n }\n value\n }\n }\n }\n }\n }\n`);\n"],"mappings":";;;;;AAEO,IAAM,kCAAkC;AAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HtE;","names":[]}