@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.
- package/CHANGELOG.md +35 -0
- package/dist/chunk-2R7M2FWR.mjs +17765 -0
- package/dist/chunk-2R7M2FWR.mjs.map +1 -0
- package/dist/chunk-CA4VMP2C.mjs +1 -0
- package/dist/chunk-CA4VMP2C.mjs.map +1 -0
- package/dist/chunk-DELDZXUX.mjs +31 -0
- package/dist/chunk-DELDZXUX.mjs.map +1 -0
- package/dist/chunk-MTD2RJDJ.mjs +187 -0
- package/dist/chunk-MTD2RJDJ.mjs.map +1 -0
- package/dist/{chunk-MCVCTWSF.mjs → chunk-UQACSQNW.mjs} +5 -5
- package/dist/{chunk-MCVCTWSF.mjs.map → chunk-UQACSQNW.mjs.map} +1 -1
- package/dist/chunk-YNQMTL2P.mjs +191 -0
- package/dist/chunk-YNQMTL2P.mjs.map +1 -0
- package/dist/client/CopilotRuntimeClient.js +1 -1
- package/dist/client/CopilotRuntimeClient.js.map +1 -1
- package/dist/client/CopilotRuntimeClient.mjs +3 -2
- package/dist/client/conversion.mjs +1 -0
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +5 -4
- package/dist/client/types.mjs +1 -0
- package/dist/graphql/@generated/fragment-masking.mjs +1 -0
- package/dist/graphql/@generated/gql.mjs +1 -0
- package/dist/graphql/@generated/graphql.mjs +1 -0
- package/dist/graphql/@generated/index.mjs +5 -4
- package/dist/graphql/definitions/mutations.mjs +1 -0
- package/dist/graphql/definitions/queries.mjs +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +370 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -4
- package/dist/magic-string.es-O42ACB6H.mjs +1373 -0
- package/dist/magic-string.es-O42ACB6H.mjs.map +1 -0
- package/dist/message-conversion/agui-to-gql.d.ts +13 -0
- package/dist/message-conversion/agui-to-gql.js +293 -0
- package/dist/message-conversion/agui-to-gql.js.map +1 -0
- package/dist/message-conversion/agui-to-gql.mjs +26 -0
- package/dist/message-conversion/agui-to-gql.mjs.map +1 -0
- package/dist/message-conversion/agui-to-gql.test.d.ts +2 -0
- package/dist/message-conversion/agui-to-gql.test.js +19958 -0
- package/dist/message-conversion/agui-to-gql.test.js.map +1 -0
- package/dist/message-conversion/agui-to-gql.test.mjs +565 -0
- package/dist/message-conversion/agui-to-gql.test.mjs.map +1 -0
- package/dist/message-conversion/gql-to-agui.d.ts +11 -0
- package/dist/message-conversion/gql-to-agui.js +227 -0
- package/dist/message-conversion/gql-to-agui.js.map +1 -0
- package/dist/message-conversion/gql-to-agui.mjs +22 -0
- package/dist/message-conversion/gql-to-agui.mjs.map +1 -0
- package/dist/message-conversion/gql-to-agui.test.d.ts +2 -0
- package/dist/message-conversion/gql-to-agui.test.js +20134 -0
- package/dist/message-conversion/gql-to-agui.test.js.map +1 -0
- package/dist/message-conversion/gql-to-agui.test.mjs +737 -0
- package/dist/message-conversion/gql-to-agui.test.mjs.map +1 -0
- package/dist/message-conversion/index.d.ts +6 -0
- package/dist/message-conversion/index.js +477 -0
- package/dist/message-conversion/index.js.map +1 -0
- package/dist/message-conversion/index.mjs +37 -0
- package/dist/message-conversion/index.mjs.map +1 -0
- package/dist/message-conversion/roundtrip-conversion.test.d.ts +2 -0
- package/dist/message-conversion/roundtrip-conversion.test.js +19768 -0
- package/dist/message-conversion/roundtrip-conversion.test.js.map +1 -0
- package/dist/message-conversion/roundtrip-conversion.test.mjs +219 -0
- package/dist/message-conversion/roundtrip-conversion.test.mjs.map +1 -0
- package/package.json +7 -5
- package/src/index.ts +1 -0
- package/src/message-conversion/agui-to-gql.test.ts +640 -0
- package/src/message-conversion/agui-to-gql.ts +255 -0
- package/src/message-conversion/gql-to-agui.test.ts +844 -0
- package/src/message-conversion/gql-to-agui.ts +237 -0
- package/src/message-conversion/index.ts +2 -0
- 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
|
+
}
|