@copilotkit/runtime-client-gql 1.9.3-next.4 → 1.10.0-next.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 (72) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/chunk-2R7M2FWR.mjs +17765 -0
  3. package/dist/chunk-2R7M2FWR.mjs.map +1 -0
  4. package/dist/chunk-CA4VMP2C.mjs +1 -0
  5. package/dist/chunk-CA4VMP2C.mjs.map +1 -0
  6. package/dist/chunk-DELDZXUX.mjs +31 -0
  7. package/dist/chunk-DELDZXUX.mjs.map +1 -0
  8. package/dist/chunk-MTD2RJDJ.mjs +187 -0
  9. package/dist/chunk-MTD2RJDJ.mjs.map +1 -0
  10. package/dist/{chunk-MCVCTWSF.mjs → chunk-UQACSQNW.mjs} +5 -5
  11. package/dist/{chunk-MCVCTWSF.mjs.map → chunk-UQACSQNW.mjs.map} +1 -1
  12. package/dist/chunk-YNQMTL2P.mjs +191 -0
  13. package/dist/chunk-YNQMTL2P.mjs.map +1 -0
  14. package/dist/client/CopilotRuntimeClient.js +1 -1
  15. package/dist/client/CopilotRuntimeClient.js.map +1 -1
  16. package/dist/client/CopilotRuntimeClient.mjs +3 -2
  17. package/dist/client/conversion.mjs +1 -0
  18. package/dist/client/index.d.ts +2 -2
  19. package/dist/client/index.js +1 -1
  20. package/dist/client/index.js.map +1 -1
  21. package/dist/client/index.mjs +5 -4
  22. package/dist/client/types.mjs +1 -0
  23. package/dist/graphql/@generated/fragment-masking.mjs +1 -0
  24. package/dist/graphql/@generated/gql.mjs +1 -0
  25. package/dist/graphql/@generated/graphql.mjs +1 -0
  26. package/dist/graphql/@generated/index.mjs +5 -4
  27. package/dist/graphql/definitions/mutations.mjs +1 -0
  28. package/dist/graphql/definitions/queries.mjs +1 -0
  29. package/dist/index.d.ts +3 -0
  30. package/dist/index.js +370 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +30 -4
  33. package/dist/magic-string.es-O42ACB6H.mjs +1373 -0
  34. package/dist/magic-string.es-O42ACB6H.mjs.map +1 -0
  35. package/dist/message-conversion/agui-to-gql.d.ts +13 -0
  36. package/dist/message-conversion/agui-to-gql.js +293 -0
  37. package/dist/message-conversion/agui-to-gql.js.map +1 -0
  38. package/dist/message-conversion/agui-to-gql.mjs +26 -0
  39. package/dist/message-conversion/agui-to-gql.mjs.map +1 -0
  40. package/dist/message-conversion/agui-to-gql.test.d.ts +2 -0
  41. package/dist/message-conversion/agui-to-gql.test.js +19958 -0
  42. package/dist/message-conversion/agui-to-gql.test.js.map +1 -0
  43. package/dist/message-conversion/agui-to-gql.test.mjs +565 -0
  44. package/dist/message-conversion/agui-to-gql.test.mjs.map +1 -0
  45. package/dist/message-conversion/gql-to-agui.d.ts +11 -0
  46. package/dist/message-conversion/gql-to-agui.js +227 -0
  47. package/dist/message-conversion/gql-to-agui.js.map +1 -0
  48. package/dist/message-conversion/gql-to-agui.mjs +22 -0
  49. package/dist/message-conversion/gql-to-agui.mjs.map +1 -0
  50. package/dist/message-conversion/gql-to-agui.test.d.ts +2 -0
  51. package/dist/message-conversion/gql-to-agui.test.js +20134 -0
  52. package/dist/message-conversion/gql-to-agui.test.js.map +1 -0
  53. package/dist/message-conversion/gql-to-agui.test.mjs +737 -0
  54. package/dist/message-conversion/gql-to-agui.test.mjs.map +1 -0
  55. package/dist/message-conversion/index.d.ts +6 -0
  56. package/dist/message-conversion/index.js +477 -0
  57. package/dist/message-conversion/index.js.map +1 -0
  58. package/dist/message-conversion/index.mjs +37 -0
  59. package/dist/message-conversion/index.mjs.map +1 -0
  60. package/dist/message-conversion/roundtrip-conversion.test.d.ts +2 -0
  61. package/dist/message-conversion/roundtrip-conversion.test.js +19768 -0
  62. package/dist/message-conversion/roundtrip-conversion.test.js.map +1 -0
  63. package/dist/message-conversion/roundtrip-conversion.test.mjs +219 -0
  64. package/dist/message-conversion/roundtrip-conversion.test.mjs.map +1 -0
  65. package/package.json +7 -5
  66. package/src/index.ts +1 -0
  67. package/src/message-conversion/agui-to-gql.test.ts +640 -0
  68. package/src/message-conversion/agui-to-gql.ts +255 -0
  69. package/src/message-conversion/gql-to-agui.test.ts +844 -0
  70. package/src/message-conversion/gql-to-agui.ts +237 -0
  71. package/src/message-conversion/index.ts +2 -0
  72. package/src/message-conversion/roundtrip-conversion.test.ts +212 -0
@@ -0,0 +1,255 @@
1
+ import * as gql from "../client";
2
+ import { MessageRole } from "../graphql/@generated/graphql";
3
+ import agui from "@copilotkit/shared"; // named agui for clarity, but this only includes agui message types
4
+
5
+ // Helper function to extract agent name from message
6
+ function extractAgentName(message: agui.Message): string {
7
+ if (message.role !== "assistant") {
8
+ throw new Error(`Cannot extract agent name from message with role ${message.role}`);
9
+ }
10
+
11
+ return message.agentName || "unknown";
12
+ }
13
+
14
+ // Type guard for agent state message
15
+ function isAgentStateMessage(message: agui.Message): boolean {
16
+ return message.role === "assistant" && "agentName" in message && "state" in message;
17
+ }
18
+
19
+ // Type guard for messages with image property
20
+ function hasImageProperty(message: agui.Message): boolean {
21
+ const canContainImage = message.role === "assistant" || message.role === "user";
22
+ if (!canContainImage || message.image === undefined) {
23
+ return false;
24
+ }
25
+
26
+ const isMalformed = message.image.format === undefined || message.image.bytes === undefined;
27
+ if (isMalformed) {
28
+ return false;
29
+ }
30
+
31
+ return true;
32
+ }
33
+
34
+ /*
35
+ ----------------------------
36
+ AGUI Message -> GQL Message
37
+ ----------------------------
38
+ */
39
+ export function aguiToGQL(
40
+ messages: agui.Message[] | agui.Message,
41
+ actions?: Record<string, any>,
42
+ coAgentStateRenders?: Record<string, any>,
43
+ ): gql.Message[] {
44
+ const gqlMessages: gql.Message[] = [];
45
+ messages = Array.isArray(messages) ? messages : [messages];
46
+
47
+ // Track tool call names by their IDs for use in result messages
48
+ const toolCallNames: Record<string, string> = {};
49
+
50
+ for (const message of messages) {
51
+ // Agent state message support
52
+ if (isAgentStateMessage(message)) {
53
+ const agentName = extractAgentName(message);
54
+ const state = "state" in message && message.state ? message.state : {};
55
+ gqlMessages.push(
56
+ new gql.AgentStateMessage({
57
+ id: message.id,
58
+ agentName,
59
+ state,
60
+ role: gql.Role.Assistant,
61
+ }),
62
+ );
63
+ // Optionally preserve render function
64
+ if ("generativeUI" in message && message.generativeUI && coAgentStateRenders) {
65
+ coAgentStateRenders[agentName] = {
66
+ name: agentName,
67
+ render: message.generativeUI,
68
+ };
69
+ }
70
+ continue;
71
+ }
72
+
73
+ if (hasImageProperty(message)) {
74
+ gqlMessages.push(aguiMessageWithImageToGQLMessage(message));
75
+ continue;
76
+ }
77
+
78
+ // Action execution message support
79
+ if (message.role === "assistant" && message.toolCalls) {
80
+ gqlMessages.push(aguiTextMessageToGQLMessage(message));
81
+ for (const toolCall of message.toolCalls) {
82
+ // Track the tool call name by its ID
83
+ toolCallNames[toolCall.id] = toolCall.function.name;
84
+
85
+ const actionExecMsg = aguiToolCallToGQLActionExecution(toolCall, message.id);
86
+ // Preserve render function in actions context
87
+ if ("generativeUI" in message && message.generativeUI && actions) {
88
+ const actionName = toolCall.function.name;
89
+ if (actions[actionName]) {
90
+ actions[actionName].render = message.generativeUI;
91
+ }
92
+ }
93
+ gqlMessages.push(actionExecMsg);
94
+ }
95
+ continue;
96
+ }
97
+ // Regular text messages
98
+ if (
99
+ message.role === "developer" ||
100
+ message.role === "system" ||
101
+ message.role === "assistant" ||
102
+ message.role === "user"
103
+ ) {
104
+ gqlMessages.push(aguiTextMessageToGQLMessage(message));
105
+ continue;
106
+ }
107
+ // Tool result message
108
+ if (message.role === "tool") {
109
+ gqlMessages.push(aguiToolMessageToGQLResultMessage(message, toolCallNames));
110
+ continue;
111
+ }
112
+ throw new Error(
113
+ `Unknown message role: "${(message as any).role}" in message with id: ${(message as any).id}`,
114
+ );
115
+ }
116
+
117
+ return gqlMessages;
118
+ }
119
+
120
+ export function aguiTextMessageToGQLMessage(message: agui.Message): gql.TextMessage {
121
+ if (
122
+ message.role !== "developer" &&
123
+ message.role !== "system" &&
124
+ message.role !== "assistant" &&
125
+ message.role !== "user"
126
+ ) {
127
+ throw new Error(`Cannot convert message with role ${message.role} to TextMessage`);
128
+ }
129
+
130
+ let roleValue: MessageRole;
131
+
132
+ if (message.role === "developer") {
133
+ roleValue = gql.Role.Developer;
134
+ } else if (message.role === "system") {
135
+ roleValue = gql.Role.System;
136
+ } else if (message.role === "assistant") {
137
+ roleValue = gql.Role.Assistant;
138
+ } else {
139
+ roleValue = gql.Role.User;
140
+ }
141
+
142
+ return new gql.TextMessage({
143
+ id: message.id,
144
+ content: message.content || "",
145
+ role: roleValue,
146
+ });
147
+ }
148
+
149
+ export function aguiToolCallToGQLActionExecution(
150
+ toolCall: agui.ToolCall,
151
+ parentMessageId: string,
152
+ ): gql.ActionExecutionMessage {
153
+ if (toolCall.type !== "function") {
154
+ throw new Error(`Unsupported tool call type: ${toolCall.type}`);
155
+ }
156
+
157
+ // Parse arguments with error handling
158
+ let argumentsObj: any;
159
+ try {
160
+ argumentsObj = JSON.parse(toolCall.function.arguments);
161
+ } catch (error) {
162
+ console.warn(`Failed to parse tool call arguments for ${toolCall.function.name}:`, error);
163
+ // Provide fallback empty object to prevent application crash
164
+ argumentsObj = {};
165
+ }
166
+
167
+ // Always include name and arguments
168
+ return new gql.ActionExecutionMessage({
169
+ id: toolCall.id,
170
+ name: toolCall.function.name,
171
+ arguments: argumentsObj,
172
+ parentMessageId: parentMessageId,
173
+ });
174
+ }
175
+
176
+ export function aguiToolMessageToGQLResultMessage(
177
+ message: agui.Message,
178
+ toolCallNames: Record<string, string>,
179
+ ): gql.ResultMessage {
180
+ if (message.role !== "tool") {
181
+ throw new Error(`Cannot convert message with role ${message.role} to ResultMessage`);
182
+ }
183
+
184
+ if (!message.toolCallId) {
185
+ throw new Error("Tool message must have a toolCallId");
186
+ }
187
+
188
+ const actionName = toolCallNames[message.toolCallId] || "unknown";
189
+
190
+ return new gql.ResultMessage({
191
+ id: message.id,
192
+ result: message.content || "",
193
+ actionExecutionId: message.toolCallId,
194
+ actionName: message.toolName || actionName,
195
+ });
196
+ }
197
+
198
+ // New function to handle AGUI messages with render functions
199
+ export function aguiMessageWithRenderToGQL(
200
+ message: agui.Message,
201
+ actions?: Record<string, any>,
202
+ coAgentStateRenders?: Record<string, any>,
203
+ ): gql.Message[] {
204
+ // Handle the special case: assistant messages with render function but no tool calls
205
+ if (
206
+ message.role === "assistant" &&
207
+ "generativeUI" in message &&
208
+ message.generativeUI &&
209
+ !message.toolCalls
210
+ ) {
211
+ const gqlMessages: gql.Message[] = [];
212
+ gqlMessages.push(
213
+ new gql.AgentStateMessage({
214
+ id: message.id,
215
+ agentName: "unknown",
216
+ state: {},
217
+ role: gql.Role.Assistant,
218
+ }),
219
+ );
220
+ if (coAgentStateRenders) {
221
+ coAgentStateRenders.unknown = {
222
+ name: "unknown",
223
+ render: message.generativeUI,
224
+ };
225
+ }
226
+ return gqlMessages;
227
+ }
228
+
229
+ // For all other cases, delegate to aguiToGQL
230
+ return aguiToGQL([message], actions, coAgentStateRenders);
231
+ }
232
+
233
+ export function aguiMessageWithImageToGQLMessage(message: agui.Message): gql.ImageMessage {
234
+ if (!hasImageProperty(message)) {
235
+ throw new Error(`Cannot convert message to ImageMessage: missing format or bytes`);
236
+ }
237
+
238
+ let roleValue: MessageRole;
239
+ if (message.role === "assistant") {
240
+ roleValue = gql.Role.Assistant;
241
+ } else {
242
+ roleValue = gql.Role.User;
243
+ }
244
+
245
+ if (message.role !== "assistant" && message.role !== "user") {
246
+ throw new Error(`Cannot convert message with role ${message.role} to ImageMessage`);
247
+ }
248
+
249
+ return new gql.ImageMessage({
250
+ id: message.id,
251
+ format: message.image!.format,
252
+ bytes: message.image!.bytes,
253
+ role: roleValue,
254
+ });
255
+ }