@copilotkit/runtime-client-gql 1.10.2-next.0 → 1.10.2
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 +6 -0
- package/dist/{chunk-ZYA32QXZ.mjs → chunk-WXA3UP7I.mjs} +18 -7
- package/dist/chunk-WXA3UP7I.mjs.map +1 -0
- package/dist/{chunk-6L3FIIJR.mjs → chunk-Y5FRUG6J.mjs} +2 -2
- package/dist/{chunk-6L3FIIJR.mjs.map → chunk-Y5FRUG6J.mjs.map} +1 -1
- package/dist/client/CopilotRuntimeClient.js +1 -1
- package/dist/client/CopilotRuntimeClient.js.map +1 -1
- package/dist/client/CopilotRuntimeClient.mjs +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/index.js +18 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/message-conversion/agui-to-gql.mjs +1 -1
- package/dist/message-conversion/agui-to-gql.test.js +48 -0
- package/dist/message-conversion/agui-to-gql.test.js.map +1 -1
- package/dist/message-conversion/agui-to-gql.test.mjs +51 -2
- package/dist/message-conversion/agui-to-gql.test.mjs.map +1 -1
- package/dist/message-conversion/gql-to-agui.js +17 -6
- package/dist/message-conversion/gql-to-agui.js.map +1 -1
- package/dist/message-conversion/gql-to-agui.mjs +2 -2
- package/dist/message-conversion/gql-to-agui.test.js +73 -6
- package/dist/message-conversion/gql-to-agui.test.js.map +1 -1
- package/dist/message-conversion/gql-to-agui.test.mjs +58 -2
- package/dist/message-conversion/gql-to-agui.test.mjs.map +1 -1
- package/dist/message-conversion/index.js +17 -6
- package/dist/message-conversion/index.js.map +1 -1
- package/dist/message-conversion/index.mjs +2 -2
- package/dist/message-conversion/roundtrip-conversion.test.js +82 -6
- package/dist/message-conversion/roundtrip-conversion.test.js.map +1 -1
- package/dist/message-conversion/roundtrip-conversion.test.mjs +67 -2
- package/dist/message-conversion/roundtrip-conversion.test.mjs.map +1 -1
- package/package.json +3 -3
- package/src/message-conversion/agui-to-gql.test.ts +58 -1
- package/src/message-conversion/gql-to-agui.test.ts +71 -0
- package/src/message-conversion/gql-to-agui.ts +19 -5
- package/src/message-conversion/roundtrip-conversion.test.ts +86 -0
- package/dist/chunk-ZYA32QXZ.mjs.map +0 -1
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "../chunk-SCACOKQX.mjs";
|
|
4
4
|
import {
|
|
5
5
|
gqlToAGUI
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-WXA3UP7I.mjs";
|
|
7
7
|
import {
|
|
8
8
|
describe,
|
|
9
9
|
globalExpect,
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
vi
|
|
12
12
|
} from "../chunk-2R7M2FWR.mjs";
|
|
13
13
|
import "../chunk-7ECCT6PK.mjs";
|
|
14
|
-
import "../chunk-
|
|
14
|
+
import "../chunk-Y5FRUG6J.mjs";
|
|
15
15
|
import "../chunk-X2UAP3QY.mjs";
|
|
16
16
|
import "../chunk-HEODM5TW.mjs";
|
|
17
17
|
import "../chunk-4KTMZMM2.mjs";
|
|
@@ -386,5 +386,70 @@ describe("roundtrip message conversion", () => {
|
|
|
386
386
|
globalExpect(gqlMsgs2[1].arguments).toEqual({ input: "test-value" });
|
|
387
387
|
globalExpect(gqlMsgs2[2].result).toBe('{"output": "processed", "count": 5}');
|
|
388
388
|
});
|
|
389
|
+
test("roundtrip conversion verifies correct property distribution for regular actions", () => {
|
|
390
|
+
const mockRender = vi.fn((props) => `Regular action: ${JSON.stringify(props.args)}`);
|
|
391
|
+
const actionExecMsg = new ActionExecutionMessage({
|
|
392
|
+
id: "regular-action-test",
|
|
393
|
+
name: "regularAction",
|
|
394
|
+
arguments: { test: "regular-value" },
|
|
395
|
+
parentMessageId: "parent-regular"
|
|
396
|
+
});
|
|
397
|
+
const actions = {
|
|
398
|
+
regularAction: {
|
|
399
|
+
name: "regularAction",
|
|
400
|
+
render: mockRender
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
const aguiMsgs = gqlToAGUI([actionExecMsg], actions);
|
|
404
|
+
const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);
|
|
405
|
+
globalExpect(gqlMsgs2).toHaveLength(2);
|
|
406
|
+
globalExpect(gqlMsgs2[1]).toBeInstanceOf(ActionExecutionMessage);
|
|
407
|
+
globalExpect(gqlMsgs2[1].name).toBe("regularAction");
|
|
408
|
+
if ("generativeUI" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {
|
|
409
|
+
aguiMsgs[0].generativeUI();
|
|
410
|
+
globalExpect(mockRender).toHaveBeenCalledWith(
|
|
411
|
+
globalExpect.objectContaining({
|
|
412
|
+
args: { test: "regular-value" }
|
|
413
|
+
// name property should NOT be present for regular actions
|
|
414
|
+
})
|
|
415
|
+
);
|
|
416
|
+
const callArgs = mockRender.mock.calls[0][0];
|
|
417
|
+
globalExpect(callArgs).not.toHaveProperty("name");
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
test("roundtrip conversion verifies correct property distribution for wildcard actions", () => {
|
|
421
|
+
const mockRender = vi.fn(
|
|
422
|
+
(props) => `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`
|
|
423
|
+
);
|
|
424
|
+
const actionExecMsg = new ActionExecutionMessage({
|
|
425
|
+
id: "wildcard-action-test",
|
|
426
|
+
name: "unknownAction",
|
|
427
|
+
arguments: { test: "wildcard-value" },
|
|
428
|
+
parentMessageId: "parent-wildcard"
|
|
429
|
+
});
|
|
430
|
+
const actions = {
|
|
431
|
+
"*": {
|
|
432
|
+
name: "*",
|
|
433
|
+
render: mockRender
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
const aguiMsgs = gqlToAGUI([actionExecMsg], actions);
|
|
437
|
+
const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);
|
|
438
|
+
globalExpect(gqlMsgs2).toHaveLength(2);
|
|
439
|
+
globalExpect(gqlMsgs2[1]).toBeInstanceOf(ActionExecutionMessage);
|
|
440
|
+
globalExpect(gqlMsgs2[1].name).toBe("unknownAction");
|
|
441
|
+
if ("generativeUI" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {
|
|
442
|
+
aguiMsgs[0].generativeUI();
|
|
443
|
+
globalExpect(mockRender).toHaveBeenCalledWith(
|
|
444
|
+
globalExpect.objectContaining({
|
|
445
|
+
args: { test: "wildcard-value" },
|
|
446
|
+
name: "unknownAction"
|
|
447
|
+
// name property SHOULD be present for wildcard actions
|
|
448
|
+
})
|
|
449
|
+
);
|
|
450
|
+
const callArgs = mockRender.mock.calls[0][0];
|
|
451
|
+
globalExpect(callArgs).toHaveProperty("name", "unknownAction");
|
|
452
|
+
}
|
|
453
|
+
});
|
|
389
454
|
});
|
|
390
455
|
//# sourceMappingURL=roundtrip-conversion.test.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/message-conversion/roundtrip-conversion.test.ts"],"sourcesContent":["import { describe, test, expect, vi } from \"vitest\";\nimport * as gql from \"../client\";\nimport agui from \"@copilotkit/shared\";\nimport { aguiToGQL } from \"./agui-to-gql\";\nimport { gqlToAGUI } from \"./gql-to-agui\";\n\n// Helper to strip functions for deep equality\nfunction stripFunctions(obj: any): any {\n if (typeof obj === \"function\") return undefined;\n if (Array.isArray(obj)) return obj.map(stripFunctions);\n if (obj && typeof obj === \"object\") {\n const out: any = {};\n for (const k in obj) {\n if (typeof obj[k] !== \"function\") {\n out[k] = stripFunctions(obj[k]);\n }\n }\n return out;\n }\n return obj;\n}\n\ndescribe(\"roundtrip message conversion\", () => {\n test(\"text message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"user-1\",\n role: \"user\",\n content: \"Hello!\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"text message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.TextMessage({\n id: \"assistant-1\",\n content: \"Hi!\",\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // Should be equivalent in content, id, and role\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).content).toBe(gqlMsg.content);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"tool message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"tool-1\",\n role: \"tool\",\n content: \"Tool result\",\n toolCallId: \"tool-call-1\",\n toolName: \"testAction\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"tool message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ResultMessage({\n id: \"tool-1\",\n result: \"Tool result\",\n actionExecutionId: \"tool-call-1\",\n actionName: \"testAction\",\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).result).toBe(gqlMsg.result);\n expect((gqlMsgs2[0] as any).actionExecutionId).toBe(gqlMsg.actionExecutionId);\n });\n\n test(\"action execution AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n // Should have an assistant message and an action execution message\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n // Only check toolCalls if present\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"action execution GQL -> AGUI -> GQL\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"tool-call-1\",\n name: \"doSomething\",\n arguments: { foo: \"bar\" },\n parentMessageId: \"assistant-1\",\n });\n const aguiMsgs = gqlToAGUI([actionExecMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // The ActionExecutionMessage is at index 1, not index 0\n expect(gqlMsgs2[1].id).toBe(\"tool-call-1\");\n // The name should be extracted from the toolCall function name\n expect((gqlMsgs2[1] as any).name).toBe(\"doSomething\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ foo: \"bar\" });\n });\n\n test(\"agent state GQL -> AGUI -> GQL\", () => {\n const agentStateMsg = new gql.AgentStateMessage({\n id: \"agent-state-1\",\n agentName: \"testAgent\",\n state: { status: \"running\" },\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI([agentStateMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(\"agent-state-1\");\n // The agentName should be preserved in the roundtrip\n expect((gqlMsgs2[0] as any).agentName).toBe(\"testAgent\");\n });\n\n test(\"action execution with render function roundtrip\", () => {\n const mockRender = vi.fn();\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n const actions: Record<string, any> = { doSomething: { name: \"doSomething\" } };\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n // The render function should be preserved in actions context\n expect(typeof actions.doSomething.render).toBe(\"function\");\n // The roundtripped message should have the same tool call\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"image message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ImageMessage({\n id: \"img-1\",\n format: \"jpeg\",\n bytes: \"somebase64string\",\n role: gql.Role.User,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).format).toBe(gqlMsg.format);\n expect((gqlMsgs2[0] as any).bytes).toBe(gqlMsg.bytes);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"image message AGUI -> GQL -> AGUI (assistant and user)\", () => {\n // Assistant image message\n const aguiAssistantImageMsg: agui.Message = {\n id: \"img-assistant-1\",\n role: \"assistant\",\n image: {\n format: \"jpeg\",\n bytes: \"assistantbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlAssistantMsgs = aguiToGQL(aguiAssistantImageMsg);\n const aguiAssistantMsgs2 = gqlToAGUI(gqlAssistantMsgs);\n expect(aguiAssistantMsgs2[0].id).toBe(aguiAssistantImageMsg.id);\n expect(aguiAssistantMsgs2[0].role).toBe(\"assistant\");\n expect((aguiAssistantMsgs2[0] as any).image.format).toBe(\"jpeg\");\n expect((aguiAssistantMsgs2[0] as any).image.bytes).toBe(\"assistantbase64data\");\n\n // User image message\n const aguiUserImageMsg: agui.Message = {\n id: \"img-user-1\",\n role: \"user\",\n image: {\n format: \"png\",\n bytes: \"userbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlUserMsgs = aguiToGQL(aguiUserImageMsg);\n const aguiUserMsgs2 = gqlToAGUI(gqlUserMsgs);\n expect(aguiUserMsgs2[0].id).toBe(aguiUserImageMsg.id);\n expect(aguiUserMsgs2[0].role).toBe(\"user\");\n expect((aguiUserMsgs2[0] as any).image.format).toBe(\"png\");\n expect((aguiUserMsgs2[0] as any).image.bytes).toBe(\"userbase64data\");\n });\n\n test(\"wild card action roundtrip conversion\", () => {\n const mockRender = vi.fn((props) => `Wildcard rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-wildcard-1\",\n role: \"assistant\",\n content: \"Running wild card action\",\n toolCalls: [\n {\n id: \"tool-call-wildcard-1\",\n type: \"function\",\n function: {\n name: \"unknownAction\",\n arguments: JSON.stringify({ test: \"wildcard-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the wild card action preserved the render function\n expect(typeof actions[\"*\"].render).toBe(\"function\");\n expect(actions[\"*\"].render).toBe(mockRender);\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"unknownAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"wildcard-value\"}',\n );\n }\n });\n\n test(\"wild card action with specific action priority roundtrip\", () => {\n const mockRender = vi.fn((props) => `Specific action rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-priority-1\",\n role: \"assistant\",\n content: \"Running specific action\",\n toolCalls: [\n {\n id: \"tool-call-priority-1\",\n type: \"function\",\n function: {\n name: \"specificAction\",\n arguments: JSON.stringify({ test: \"specific-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n specificAction: { name: \"specificAction\" },\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the specific action preserved the render function (not wild card)\n expect(typeof actions.specificAction.render).toBe(\"function\");\n expect(actions.specificAction.render).toBe(mockRender);\n expect(actions[\"*\"].render).toBeUndefined();\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"specificAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"specific-value\"}',\n );\n }\n });\n\n test(\"wild card action GQL -> AGUI -> GQL roundtrip\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"wildcard-action-1\",\n name: \"unknownAction\",\n arguments: { test: \"wildcard-gql-value\" },\n parentMessageId: \"assistant-1\",\n });\n\n const actions: Record<string, any> = {\n \"*\": {\n name: \"*\",\n render: vi.fn((props) => `GQL wildcard rendered: ${props.args.test}`),\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // When converting ActionExecutionMessage to AGUI and back, we get:\n // 1. A TextMessage (assistant message with toolCalls)\n // 2. An ActionExecutionMessage (the tool call itself)\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[0].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[0] as any).role).toBe(gql.Role.Assistant);\n expect(gqlMsgs2[1].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[1] as any).name).toBe(\"unknownAction\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ test: \"wildcard-gql-value\" });\n });\n\n test(\"roundtrip conversion with result parsing edge cases\", () => {\n // Test with a tool result that contains a JSON string\n const toolResultMsg: agui.Message = {\n id: \"tool-result-json\",\n role: \"tool\",\n content: '{\"status\": \"success\", \"data\": {\"value\": 42}}',\n toolCallId: \"tool-call-json\",\n toolName: \"jsonAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n });\n\n test(\"roundtrip conversion with object content in tool results\", () => {\n // Test with a tool result that has object content (edge case)\n const toolResultMsg: agui.Message = {\n id: \"tool-result-object\",\n role: \"tool\",\n content: { status: \"success\", data: { value: 42 } } as any,\n toolCallId: \"tool-call-object\",\n toolName: \"objectAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n });\n\n test(\"roundtrip conversion with action execution and result parsing\", () => {\n const mockRender = vi.fn((props) => `Rendered: ${JSON.stringify(props.result)}`);\n\n // Create action execution message\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"action-with-result\",\n name: \"testAction\",\n arguments: { input: \"test-value\" },\n parentMessageId: \"parent-result\",\n });\n\n // Create result message\n const resultMsg = new gql.ResultMessage({\n id: \"result-with-json\",\n result: '{\"output\": \"processed\", \"count\": 5}',\n actionExecutionId: \"action-with-result\",\n actionName: \"testAction\",\n });\n\n const actions = {\n testAction: {\n name: \"testAction\",\n render: mockRender,\n },\n };\n\n // Convert GQL -> AGUI\n const aguiMsgs = gqlToAGUI([actionExecMsg, resultMsg], actions);\n\n // The action execution should have a generativeUI function that parses string results\n expect(aguiMsgs).toHaveLength(2);\n expect(aguiMsgs[0].role).toBe(\"assistant\");\n expect(\"generativeUI\" in aguiMsgs[0]).toBe(true);\n expect(aguiMsgs[1].role).toBe(\"tool\");\n expect(aguiMsgs[1].content).toBe('{\"output\": \"processed\", \"count\": 5}');\n\n // Test that the render function receives parsed results\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI({ result: '{\"parsed\": true}' });\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n result: { parsed: true }, // Should be parsed from string\n }),\n );\n }\n\n // Convert back AGUI -> GQL\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Should have 3 messages: TextMessage, ActionExecutionMessage, ResultMessage\n expect(gqlMsgs2).toHaveLength(3);\n expect(gqlMsgs2[0]).toBeInstanceOf(gql.TextMessage);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect(gqlMsgs2[2]).toBeInstanceOf(gql.ResultMessage);\n\n // Check that arguments roundtripped correctly\n expect((gqlMsgs2[1] as any).arguments).toEqual({ input: \"test-value\" });\n expect((gqlMsgs2[2] as any).result).toBe('{\"output\": \"processed\", \"count\": 5}');\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,eAAe,KAAe;AACrC,MAAI,OAAO,QAAQ;AAAY,WAAO;AACtC,MAAI,MAAM,QAAQ,GAAG;AAAG,WAAO,IAAI,IAAI,cAAc;AACrD,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAM,MAAW,CAAC;AAClB,eAAW,KAAK,KAAK;AACnB,UAAI,OAAO,IAAI,CAAC,MAAM,YAAY;AAChC,YAAI,CAAC,IAAI,eAAe,IAAI,CAAC,CAAC;AAAA,MAChC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,gCAAgC,MAAM;AAC7C,OAAK,oCAAoC,MAAM;AAC7C,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,UAAM,UAAU,UAAU,OAAO;AACjC,UAAM,YAAY,UAAU,OAAO;AACnC,iBAAO,eAAe,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,eAAe,OAAO,CAAC;AAAA,EACtE,CAAC;AAED,OAAK,mCAAmC,MAAM;AAC5C,UAAM,SAAS,IAAQ,YAAY;AAAA,MACjC,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,MAAU,KAAK;AAAA,IACjB,CAAC;AACD,UAAM,WAAW,UAAU,MAAM;AACjC,UAAM,WAAW,UAAU,QAAQ;AAEnC,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,EAAE;AACrC,iBAAQ,SAAS,CAAC,EAAU,OAAO,EAAE,KAAK,OAAO,OAAO;AACxD,iBAAQ,SAAS,CAAC,EAAU,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,EACpD,CAAC;AAED,OAAK,oCAAoC,MAAM;AAC7C,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AACA,UAAM,UAAU,UAAU,OAAO;AACjC,UAAM,YAAY,UAAU,OAAO;AACnC,iBAAO,eAAe,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,eAAe,OAAO,CAAC;AAAA,EACtE,CAAC;AAED,OAAK,mCAAmC,MAAM;AAC5C,UAAM,SAAS,IAAQ,cAAc;AAAA,MACnC,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACd,CAAC;AACD,UAAM,WAAW,UAAU,MAAM;AACjC,UAAM,WAAW,UAAU,QAAQ;AACnC,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,EAAE;AACrC,iBAAQ,SAAS,CAAC,EAAU,MAAM,EAAE,KAAK,OAAO,MAAM;AACtD,iBAAQ,SAAS,CAAC,EAAU,iBAAiB,EAAE,KAAK,OAAO,iBAAiB;AAAA,EAC9E,CAAC;AAED,OAAK,wCAAwC,MAAM;AACjD,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,WAAW,KAAK,UAAU,EAAE,KAAK,MAAM,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,UAAU,OAAO;AACjC,UAAM,YAAY,UAAU,OAAO;AAEnC,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAC1C,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAE1C,QAAI,eAAe,UAAU,CAAC,GAAG;AAC/B,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,IAAI,EAAE,KAAK,aAAa;AAAA,IAC7E;AAAA,EACF,CAAC;AAED,OAAK,uCAAuC,MAAM;AAChD,UAAM,gBAAgB,IAAQ,uBAAuB;AAAA,MACnD,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,EAAE,KAAK,MAAM;AAAA,MACxB,iBAAiB;AAAA,IACnB,CAAC;AACD,UAAM,WAAW,UAAU,CAAC,aAAa,CAAC;AAC1C,UAAM,WAAW,UAAU,QAAQ;AAEnC,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,aAAa;AAEzC,iBAAQ,SAAS,CAAC,EAAU,IAAI,EAAE,KAAK,aAAa;AACpD,iBAAQ,SAAS,CAAC,EAAU,SAAS,EAAE,QAAQ,EAAE,KAAK,MAAM,CAAC;AAAA,EAC/D,CAAC;AAED,OAAK,kCAAkC,MAAM;AAC3C,UAAM,gBAAgB,IAAQ,kBAAkB;AAAA,MAC9C,IAAI;AAAA,MACJ,WAAW;AAAA,MACX,OAAO,EAAE,QAAQ,UAAU;AAAA,MAC3B,MAAU,KAAK;AAAA,IACjB,CAAC;AACD,UAAM,WAAW,UAAU,CAAC,aAAa,CAAC;AAC1C,UAAM,WAAW,UAAU,QAAQ;AACnC,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,eAAe;AAE3C,iBAAQ,SAAS,CAAC,EAAU,SAAS,EAAE,KAAK,WAAW;AAAA,EACzD,CAAC;AAED,OAAK,mDAAmD,MAAM;AAC5D,UAAM,aAAa,GAAG,GAAG;AACzB,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,WAAW,KAAK,UAAU,EAAE,KAAK,MAAM,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,IAChB;AACA,UAAM,UAA+B,EAAE,aAAa,EAAE,MAAM,cAAc,EAAE;AAC5E,UAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,UAAM,YAAY,UAAU,SAAS,OAAO;AAE5C,iBAAO,OAAO,QAAQ,YAAY,MAAM,EAAE,KAAK,UAAU;AAEzD,QAAI,eAAe,UAAU,CAAC,GAAG;AAC/B,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,IAAI,EAAE,KAAK,aAAa;AAAA,IAC7E;AAAA,EACF,CAAC;AAED,OAAK,oCAAoC,MAAM;AAC7C,UAAM,SAAS,IAAQ,aAAa;AAAA,MAClC,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAU,KAAK;AAAA,IACjB,CAAC;AACD,UAAM,WAAW,UAAU,MAAM;AACjC,UAAM,WAAW,UAAU,QAAQ;AACnC,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,EAAE;AACrC,iBAAQ,SAAS,CAAC,EAAU,MAAM,EAAE,KAAK,OAAO,MAAM;AACtD,iBAAQ,SAAS,CAAC,EAAU,KAAK,EAAE,KAAK,OAAO,KAAK;AACpD,iBAAQ,SAAS,CAAC,EAAU,IAAI,EAAE,KAAK,OAAO,IAAI;AAAA,EACpD,CAAC;AAED,OAAK,0DAA0D,MAAM;AAEnE,UAAM,wBAAsC;AAAA,MAC1C,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA;AAAA,IACX;AACA,UAAM,mBAAmB,UAAU,qBAAqB;AACxD,UAAM,qBAAqB,UAAU,gBAAgB;AACrD,iBAAO,mBAAmB,CAAC,EAAE,EAAE,EAAE,KAAK,sBAAsB,EAAE;AAC9D,iBAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AACnD,iBAAQ,mBAAmB,CAAC,EAAU,MAAM,MAAM,EAAE,KAAK,MAAM;AAC/D,iBAAQ,mBAAmB,CAAC,EAAU,MAAM,KAAK,EAAE,KAAK,qBAAqB;AAG7E,UAAM,mBAAiC;AAAA,MACrC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,SAAS;AAAA;AAAA,IACX;AACA,UAAM,cAAc,UAAU,gBAAgB;AAC9C,UAAM,gBAAgB,UAAU,WAAW;AAC3C,iBAAO,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,iBAAiB,EAAE;AACpD,iBAAO,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM;AACzC,iBAAQ,cAAc,CAAC,EAAU,MAAM,MAAM,EAAE,KAAK,KAAK;AACzD,iBAAQ,cAAc,CAAC,EAAU,MAAM,KAAK,EAAE,KAAK,gBAAgB;AAAA,EACrE,CAAC;AAED,OAAK,yCAAyC,MAAM;AAClD,UAAM,aAAa,GAAG,GAAG,CAAC,UAAU,sBAAsB,MAAM,KAAK,MAAM;AAC3E,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,WAAW,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,IAChB;AAEA,UAAM,UAA+B;AAAA,MACnC,KAAK,EAAE,MAAM,IAAI;AAAA,IACnB;AAGA,UAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,UAAM,YAAY,UAAU,SAAS,OAAO;AAG5C,iBAAO,OAAO,QAAQ,GAAG,EAAE,MAAM,EAAE,KAAK,UAAU;AAClD,iBAAO,QAAQ,GAAG,EAAE,MAAM,EAAE,KAAK,UAAU;AAG3C,iBAAO,SAAS,EAAE,aAAa,CAAC;AAChC,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAC1C,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAG1C,QAAI,eAAe,UAAU,CAAC,GAAG;AAC/B,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,IAAI,EAAE,KAAK,eAAe;AAC7E,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,4DAA4D,MAAM;AACrE,UAAM,aAAa,GAAG,GAAG,CAAC,UAAU,6BAA6B,MAAM,KAAK,MAAM;AAClF,UAAM,UAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,WAAW,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,IAChB;AAEA,UAAM,UAA+B;AAAA,MACnC,gBAAgB,EAAE,MAAM,iBAAiB;AAAA,MACzC,KAAK,EAAE,MAAM,IAAI;AAAA,IACnB;AAGA,UAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,UAAM,YAAY,UAAU,SAAS,OAAO;AAG5C,iBAAO,OAAO,QAAQ,eAAe,MAAM,EAAE,KAAK,UAAU;AAC5D,iBAAO,QAAQ,eAAe,MAAM,EAAE,KAAK,UAAU;AACrD,iBAAO,QAAQ,GAAG,EAAE,MAAM,EAAE,cAAc;AAG1C,iBAAO,SAAS,EAAE,aAAa,CAAC;AAChC,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAC1C,iBAAO,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AAG1C,QAAI,eAAe,UAAU,CAAC,GAAG;AAC/B,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,IAAI,EAAE,KAAK,gBAAgB;AAC9E,mBAAQ,UAAU,CAAC,EAAU,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,OAAK,iDAAiD,MAAM;AAC1D,UAAM,gBAAgB,IAAQ,uBAAuB;AAAA,MACnD,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,qBAAqB;AAAA,MACxC,iBAAiB;AAAA,IACnB,CAAC;AAED,UAAM,UAA+B;AAAA,MACnC,KAAK;AAAA,QACH,MAAM;AAAA,QACN,QAAQ,GAAG,GAAG,CAAC,UAAU,0BAA0B,MAAM,KAAK,MAAM;AAAA,MACtE;AAAA,IACF;AAGA,UAAM,WAAW,UAAU,CAAC,aAAa,GAAG,OAAO;AACnD,UAAM,WAAW,UAAU,UAAU,OAAO;AAK5C,iBAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,mBAAmB;AAC/C,iBAAQ,SAAS,CAAC,EAAU,IAAI,EAAE,KAAS,KAAK,SAAS;AACzD,iBAAO,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,mBAAmB;AAC/C,iBAAQ,SAAS,CAAC,EAAU,IAAI,EAAE,KAAK,eAAe;AACtD,iBAAQ,SAAS,CAAC,EAAU,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAAA,EAC/E,CAAC;AAED,OAAK,uDAAuD,MAAM;AAEhE,UAAM,gBAA8B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAGA,UAAM,UAAU,UAAU,aAAa;AACvC,UAAM,WAAW,UAAU,OAAO;AAElC,iBAAO,OAAO,EAAE,aAAa,CAAC;AAC9B,iBAAO,QAAQ,CAAC,CAAC,EAAE,eAAmB,aAAa;AACnD,iBAAQ,QAAQ,CAAC,EAAU,MAAM,EAAE,KAAK,8CAA8C;AAEtF,iBAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,iBAAO,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM;AACpC,iBAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,8CAA8C;AAAA,EACjF,CAAC;AAED,OAAK,4DAA4D,MAAM;AAErE,UAAM,gBAA8B;AAAA,MAClC,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,WAAW,MAAM,EAAE,OAAO,GAAG,EAAE;AAAA,MAClD,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAGA,UAAM,UAAU,UAAU,aAAa;AACvC,UAAM,WAAW,UAAU,OAAO;AAElC,iBAAO,OAAO,EAAE,aAAa,CAAC;AAC9B,iBAAO,QAAQ,CAAC,CAAC,EAAE,eAAmB,aAAa;AACnD,iBAAQ,QAAQ,CAAC,EAAU,MAAM,EAAE,KAAK,0CAA0C;AAElF,iBAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,iBAAO,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM;AACpC,iBAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,0CAA0C;AAAA,EAC7E,CAAC;AAED,OAAK,iEAAiE,MAAM;AAC1E,UAAM,aAAa,GAAG,GAAG,CAAC,UAAU,aAAa,KAAK,UAAU,MAAM,MAAM,GAAG;AAG/E,UAAM,gBAAgB,IAAQ,uBAAuB;AAAA,MACnD,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,WAAW,EAAE,OAAO,aAAa;AAAA,MACjC,iBAAiB;AAAA,IACnB,CAAC;AAGD,UAAM,YAAY,IAAQ,cAAc;AAAA,MACtC,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,YAAY;AAAA,IACd,CAAC;AAED,UAAM,UAAU;AAAA,MACd,YAAY;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAGA,UAAM,WAAW,UAAU,CAAC,eAAe,SAAS,GAAG,OAAO;AAG9D,iBAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,iBAAO,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,WAAW;AACzC,iBAAO,kBAAkB,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI;AAC/C,iBAAO,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM;AACpC,iBAAO,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,qCAAqC;AAGtE,QAAI,kBAAkB,SAAS,CAAC,KAAK,SAAS,CAAC,EAAE,cAAc;AAC7D,eAAS,CAAC,EAAE,aAAa,EAAE,QAAQ,mBAAmB,CAAC;AACvD,mBAAO,UAAU,EAAE;AAAA,QACjB,aAAO,iBAAiB;AAAA,UACtB,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,WAAW,UAAU,UAAU,OAAO;AAG5C,iBAAO,QAAQ,EAAE,aAAa,CAAC;AAC/B,iBAAO,SAAS,CAAC,CAAC,EAAE,eAAmB,WAAW;AAClD,iBAAO,SAAS,CAAC,CAAC,EAAE,eAAmB,sBAAsB;AAC7D,iBAAO,SAAS,CAAC,CAAC,EAAE,eAAmB,aAAa;AAGpD,iBAAQ,SAAS,CAAC,EAAU,SAAS,EAAE,QAAQ,EAAE,OAAO,aAAa,CAAC;AACtE,iBAAQ,SAAS,CAAC,EAAU,MAAM,EAAE,KAAK,qCAAqC;AAAA,EAChF,CAAC;AACH,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/message-conversion/roundtrip-conversion.test.ts"],"sourcesContent":["import { describe, test, expect, vi } from \"vitest\";\nimport * as gql from \"../client\";\nimport agui from \"@copilotkit/shared\";\nimport { aguiToGQL } from \"./agui-to-gql\";\nimport { gqlToAGUI } from \"./gql-to-agui\";\n\n// Helper to strip functions for deep equality\nfunction stripFunctions(obj: any): any {\n if (typeof obj === \"function\") return undefined;\n if (Array.isArray(obj)) return obj.map(stripFunctions);\n if (obj && typeof obj === \"object\") {\n const out: any = {};\n for (const k in obj) {\n if (typeof obj[k] !== \"function\") {\n out[k] = stripFunctions(obj[k]);\n }\n }\n return out;\n }\n return obj;\n}\n\ndescribe(\"roundtrip message conversion\", () => {\n test(\"text message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"user-1\",\n role: \"user\",\n content: \"Hello!\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"text message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.TextMessage({\n id: \"assistant-1\",\n content: \"Hi!\",\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // Should be equivalent in content, id, and role\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).content).toBe(gqlMsg.content);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"tool message AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"tool-1\",\n role: \"tool\",\n content: \"Tool result\",\n toolCallId: \"tool-call-1\",\n toolName: \"testAction\",\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n expect(stripFunctions(aguiMsgs2[0])).toEqual(stripFunctions(aguiMsg));\n });\n\n test(\"tool message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ResultMessage({\n id: \"tool-1\",\n result: \"Tool result\",\n actionExecutionId: \"tool-call-1\",\n actionName: \"testAction\",\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).result).toBe(gqlMsg.result);\n expect((gqlMsgs2[0] as any).actionExecutionId).toBe(gqlMsg.actionExecutionId);\n });\n\n test(\"action execution AGUI -> GQL -> AGUI\", () => {\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n };\n const gqlMsgs = aguiToGQL(aguiMsg);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs);\n // Should have an assistant message and an action execution message\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n // Only check toolCalls if present\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"action execution GQL -> AGUI -> GQL\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"tool-call-1\",\n name: \"doSomething\",\n arguments: { foo: \"bar\" },\n parentMessageId: \"assistant-1\",\n });\n const aguiMsgs = gqlToAGUI([actionExecMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n // The ActionExecutionMessage is at index 1, not index 0\n expect(gqlMsgs2[1].id).toBe(\"tool-call-1\");\n // The name should be extracted from the toolCall function name\n expect((gqlMsgs2[1] as any).name).toBe(\"doSomething\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ foo: \"bar\" });\n });\n\n test(\"agent state GQL -> AGUI -> GQL\", () => {\n const agentStateMsg = new gql.AgentStateMessage({\n id: \"agent-state-1\",\n agentName: \"testAgent\",\n state: { status: \"running\" },\n role: gql.Role.Assistant,\n });\n const aguiMsgs = gqlToAGUI([agentStateMsg]);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(\"agent-state-1\");\n // The agentName should be preserved in the roundtrip\n expect((gqlMsgs2[0] as any).agentName).toBe(\"testAgent\");\n });\n\n test(\"action execution with render function roundtrip\", () => {\n const mockRender = vi.fn();\n const aguiMsg: agui.Message = {\n id: \"assistant-1\",\n role: \"assistant\",\n content: \"Running action\",\n toolCalls: [\n {\n id: \"tool-call-1\",\n type: \"function\",\n function: {\n name: \"doSomething\",\n arguments: JSON.stringify({ foo: \"bar\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n const actions: Record<string, any> = { doSomething: { name: \"doSomething\" } };\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n // The render function should be preserved in actions context\n expect(typeof actions.doSomething.render).toBe(\"function\");\n // The roundtripped message should have the same tool call\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"doSomething\");\n }\n });\n\n test(\"image message GQL -> AGUI -> GQL\", () => {\n const gqlMsg = new gql.ImageMessage({\n id: \"img-1\",\n format: \"jpeg\",\n bytes: \"somebase64string\",\n role: gql.Role.User,\n });\n const aguiMsgs = gqlToAGUI(gqlMsg);\n const gqlMsgs2 = aguiToGQL(aguiMsgs);\n expect(gqlMsgs2[0].id).toBe(gqlMsg.id);\n expect((gqlMsgs2[0] as any).format).toBe(gqlMsg.format);\n expect((gqlMsgs2[0] as any).bytes).toBe(gqlMsg.bytes);\n expect((gqlMsgs2[0] as any).role).toBe(gqlMsg.role);\n });\n\n test(\"image message AGUI -> GQL -> AGUI (assistant and user)\", () => {\n // Assistant image message\n const aguiAssistantImageMsg: agui.Message = {\n id: \"img-assistant-1\",\n role: \"assistant\",\n image: {\n format: \"jpeg\",\n bytes: \"assistantbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlAssistantMsgs = aguiToGQL(aguiAssistantImageMsg);\n const aguiAssistantMsgs2 = gqlToAGUI(gqlAssistantMsgs);\n expect(aguiAssistantMsgs2[0].id).toBe(aguiAssistantImageMsg.id);\n expect(aguiAssistantMsgs2[0].role).toBe(\"assistant\");\n expect((aguiAssistantMsgs2[0] as any).image.format).toBe(\"jpeg\");\n expect((aguiAssistantMsgs2[0] as any).image.bytes).toBe(\"assistantbase64data\");\n\n // User image message\n const aguiUserImageMsg: agui.Message = {\n id: \"img-user-1\",\n role: \"user\",\n image: {\n format: \"png\",\n bytes: \"userbase64data\",\n },\n content: \"\", // required for type\n };\n const gqlUserMsgs = aguiToGQL(aguiUserImageMsg);\n const aguiUserMsgs2 = gqlToAGUI(gqlUserMsgs);\n expect(aguiUserMsgs2[0].id).toBe(aguiUserImageMsg.id);\n expect(aguiUserMsgs2[0].role).toBe(\"user\");\n expect((aguiUserMsgs2[0] as any).image.format).toBe(\"png\");\n expect((aguiUserMsgs2[0] as any).image.bytes).toBe(\"userbase64data\");\n });\n\n test(\"wild card action roundtrip conversion\", () => {\n const mockRender = vi.fn((props) => `Wildcard rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-wildcard-1\",\n role: \"assistant\",\n content: \"Running wild card action\",\n toolCalls: [\n {\n id: \"tool-call-wildcard-1\",\n type: \"function\",\n function: {\n name: \"unknownAction\",\n arguments: JSON.stringify({ test: \"wildcard-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the wild card action preserved the render function\n expect(typeof actions[\"*\"].render).toBe(\"function\");\n expect(actions[\"*\"].render).toBe(mockRender);\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"unknownAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"wildcard-value\"}',\n );\n }\n });\n\n test(\"wild card action with specific action priority roundtrip\", () => {\n const mockRender = vi.fn((props) => `Specific action rendered: ${props.args.test}`);\n const aguiMsg: agui.Message = {\n id: \"assistant-priority-1\",\n role: \"assistant\",\n content: \"Running specific action\",\n toolCalls: [\n {\n id: \"tool-call-priority-1\",\n type: \"function\",\n function: {\n name: \"specificAction\",\n arguments: JSON.stringify({ test: \"specific-value\" }),\n },\n },\n ],\n generativeUI: mockRender,\n };\n\n const actions: Record<string, any> = {\n specificAction: { name: \"specificAction\" },\n \"*\": { name: \"*\" },\n };\n\n // AGUI -> GQL -> AGUI roundtrip\n const gqlMsgs = aguiToGQL(aguiMsg, actions);\n const aguiMsgs2 = gqlToAGUI(gqlMsgs, actions);\n\n // Verify the specific action preserved the render function (not wild card)\n expect(typeof actions.specificAction.render).toBe(\"function\");\n expect(actions.specificAction.render).toBe(mockRender);\n expect(actions[\"*\"].render).toBeUndefined();\n\n // Verify the roundtripped message structure\n expect(aguiMsgs2).toHaveLength(2);\n expect(aguiMsgs2[0].role).toBe(\"assistant\");\n expect(aguiMsgs2[1].role).toBe(\"assistant\");\n\n // Check that the tool call is preserved\n if (\"toolCalls\" in aguiMsgs2[1]) {\n expect((aguiMsgs2[1] as any).toolCalls[0].function.name).toBe(\"specificAction\");\n expect((aguiMsgs2[1] as any).toolCalls[0].function.arguments).toBe(\n '{\"test\":\"specific-value\"}',\n );\n }\n });\n\n test(\"wild card action GQL -> AGUI -> GQL roundtrip\", () => {\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"wildcard-action-1\",\n name: \"unknownAction\",\n arguments: { test: \"wildcard-gql-value\" },\n parentMessageId: \"assistant-1\",\n });\n\n const actions: Record<string, any> = {\n \"*\": {\n name: \"*\",\n render: vi.fn((props) => `GQL wildcard rendered: ${props.args.test}`),\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // When converting ActionExecutionMessage to AGUI and back, we get:\n // 1. A TextMessage (assistant message with toolCalls)\n // 2. An ActionExecutionMessage (the tool call itself)\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[0].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[0] as any).role).toBe(gql.Role.Assistant);\n expect(gqlMsgs2[1].id).toBe(\"wildcard-action-1\");\n expect((gqlMsgs2[1] as any).name).toBe(\"unknownAction\");\n expect((gqlMsgs2[1] as any).arguments).toEqual({ test: \"wildcard-gql-value\" });\n });\n\n test(\"roundtrip conversion with result parsing edge cases\", () => {\n // Test with a tool result that contains a JSON string\n const toolResultMsg: agui.Message = {\n id: \"tool-result-json\",\n role: \"tool\",\n content: '{\"status\": \"success\", \"data\": {\"value\": 42}}',\n toolCallId: \"tool-call-json\",\n toolName: \"jsonAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\": \"success\", \"data\": {\"value\": 42}}');\n });\n\n test(\"roundtrip conversion with object content in tool results\", () => {\n // Test with a tool result that has object content (edge case)\n const toolResultMsg: agui.Message = {\n id: \"tool-result-object\",\n role: \"tool\",\n content: { status: \"success\", data: { value: 42 } } as any,\n toolCallId: \"tool-call-object\",\n toolName: \"objectAction\",\n };\n\n // Convert AGUI -> GQL -> AGUI\n const gqlMsgs = aguiToGQL(toolResultMsg);\n const aguiMsgs = gqlToAGUI(gqlMsgs);\n\n expect(gqlMsgs).toHaveLength(1);\n expect(gqlMsgs[0]).toBeInstanceOf(gql.ResultMessage);\n expect((gqlMsgs[0] as any).result).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n\n expect(aguiMsgs).toHaveLength(1);\n expect(aguiMsgs[0].role).toBe(\"tool\");\n expect(aguiMsgs[0].content).toBe('{\"status\":\"success\",\"data\":{\"value\":42}}');\n });\n\n test(\"roundtrip conversion with action execution and result parsing\", () => {\n const mockRender = vi.fn((props) => `Rendered: ${JSON.stringify(props.result)}`);\n\n // Create action execution message\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"action-with-result\",\n name: \"testAction\",\n arguments: { input: \"test-value\" },\n parentMessageId: \"parent-result\",\n });\n\n // Create result message\n const resultMsg = new gql.ResultMessage({\n id: \"result-with-json\",\n result: '{\"output\": \"processed\", \"count\": 5}',\n actionExecutionId: \"action-with-result\",\n actionName: \"testAction\",\n });\n\n const actions = {\n testAction: {\n name: \"testAction\",\n render: mockRender,\n },\n };\n\n // Convert GQL -> AGUI\n const aguiMsgs = gqlToAGUI([actionExecMsg, resultMsg], actions);\n\n // The action execution should have a generativeUI function that parses string results\n expect(aguiMsgs).toHaveLength(2);\n expect(aguiMsgs[0].role).toBe(\"assistant\");\n expect(\"generativeUI\" in aguiMsgs[0]).toBe(true);\n expect(aguiMsgs[1].role).toBe(\"tool\");\n expect(aguiMsgs[1].content).toBe('{\"output\": \"processed\", \"count\": 5}');\n\n // Test that the render function receives parsed results\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI({ result: '{\"parsed\": true}' });\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n result: { parsed: true }, // Should be parsed from string\n }),\n );\n }\n\n // Convert back AGUI -> GQL\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Should have 3 messages: TextMessage, ActionExecutionMessage, ResultMessage\n expect(gqlMsgs2).toHaveLength(3);\n expect(gqlMsgs2[0]).toBeInstanceOf(gql.TextMessage);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect(gqlMsgs2[2]).toBeInstanceOf(gql.ResultMessage);\n\n // Check that arguments roundtripped correctly\n expect((gqlMsgs2[1] as any).arguments).toEqual({ input: \"test-value\" });\n expect((gqlMsgs2[2] as any).result).toBe('{\"output\": \"processed\", \"count\": 5}');\n });\n\n test(\"roundtrip conversion verifies correct property distribution for regular actions\", () => {\n const mockRender = vi.fn((props) => `Regular action: ${JSON.stringify(props.args)}`);\n\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"regular-action-test\",\n name: \"regularAction\",\n arguments: { test: \"regular-value\" },\n parentMessageId: \"parent-regular\",\n });\n\n const actions = {\n regularAction: {\n name: \"regularAction\",\n render: mockRender,\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Verify the roundtrip preserved the action\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect((gqlMsgs2[1] as any).name).toBe(\"regularAction\");\n\n // Test that regular actions do NOT receive the name property in render props\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI();\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n args: { test: \"regular-value\" },\n // name property should NOT be present for regular actions\n }),\n );\n\n // Verify name property is NOT present\n const callArgs = mockRender.mock.calls[0][0];\n expect(callArgs).not.toHaveProperty(\"name\");\n }\n });\n\n test(\"roundtrip conversion verifies correct property distribution for wildcard actions\", () => {\n const mockRender = vi.fn(\n (props) => `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`,\n );\n\n const actionExecMsg = new gql.ActionExecutionMessage({\n id: \"wildcard-action-test\",\n name: \"unknownAction\",\n arguments: { test: \"wildcard-value\" },\n parentMessageId: \"parent-wildcard\",\n });\n\n const actions = {\n \"*\": {\n name: \"*\",\n render: mockRender,\n },\n };\n\n // GQL -> AGUI -> GQL roundtrip\n const aguiMsgs = gqlToAGUI([actionExecMsg], actions);\n const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);\n\n // Verify the roundtrip preserved the action\n expect(gqlMsgs2).toHaveLength(2);\n expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);\n expect((gqlMsgs2[1] as any).name).toBe(\"unknownAction\");\n\n // Test that wildcard actions DO receive the name property in render props\n if (\"generativeUI\" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {\n aguiMsgs[0].generativeUI();\n expect(mockRender).toHaveBeenCalledWith(\n expect.objectContaining({\n args: { test: \"wildcard-value\" },\n name: \"unknownAction\", // name property SHOULD be present for wildcard actions\n }),\n );\n\n // Verify name property IS present\n const callArgs = mockRender.mock.calls[0][0];\n expect(callArgs).toHaveProperty(\"name\", \"unknownAction\");\n }\n });\n});\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"publishConfig": {
|
|
10
10
|
"access": "public"
|
|
11
11
|
},
|
|
12
|
-
"version": "1.10.2
|
|
12
|
+
"version": "1.10.2",
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"main": "./dist/index.js",
|
|
15
15
|
"module": "./dist/index.mjs",
|
|
@@ -45,13 +45,13 @@
|
|
|
45
45
|
"tsup": "^6.7.0",
|
|
46
46
|
"typescript": "^5.4.5",
|
|
47
47
|
"vitest": "^3.1.3",
|
|
48
|
-
"@copilotkit/runtime": "1.10.2
|
|
48
|
+
"@copilotkit/runtime": "1.10.2"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@urql/core": "^5.0.3",
|
|
52
52
|
"untruncate-json": "^0.0.1",
|
|
53
53
|
"urql": "^4.1.0",
|
|
54
|
-
"@copilotkit/shared": "1.10.2
|
|
54
|
+
"@copilotkit/shared": "1.10.2"
|
|
55
55
|
},
|
|
56
56
|
"keywords": [
|
|
57
57
|
"copilotkit",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, test, expect } from "vitest";
|
|
1
|
+
import { describe, test, expect, vi } from "vitest";
|
|
2
2
|
import * as gql from "../client";
|
|
3
3
|
import agui from "@copilotkit/shared";
|
|
4
4
|
import {
|
|
@@ -585,6 +585,63 @@ describe("agui-to-gql", () => {
|
|
|
585
585
|
expect(action.render).toBe(mockRender1);
|
|
586
586
|
});
|
|
587
587
|
});
|
|
588
|
+
|
|
589
|
+
test("should verify render function receives correct props including name", () => {
|
|
590
|
+
const mockRender = vi.fn(
|
|
591
|
+
(props) => `Rendered: ${props.name} with args: ${JSON.stringify(props.args)}`,
|
|
592
|
+
);
|
|
593
|
+
const aguiMessage: agui.Message = {
|
|
594
|
+
id: "assistant-render-props",
|
|
595
|
+
role: "assistant",
|
|
596
|
+
content: "I'll execute a function",
|
|
597
|
+
toolCalls: [
|
|
598
|
+
{
|
|
599
|
+
id: "tool-call-render-props",
|
|
600
|
+
type: "function",
|
|
601
|
+
function: {
|
|
602
|
+
name: "testFunction",
|
|
603
|
+
arguments: JSON.stringify({ param: "value" }),
|
|
604
|
+
},
|
|
605
|
+
},
|
|
606
|
+
],
|
|
607
|
+
generativeUI: mockRender,
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const actions: Record<string, any> = {
|
|
611
|
+
testFunction: { name: "testFunction" },
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
const result = aguiMessageWithRenderToGQL(aguiMessage, actions);
|
|
615
|
+
|
|
616
|
+
expect(result).toHaveLength(2);
|
|
617
|
+
expect(result[0]).toBeInstanceOf(gql.TextMessage);
|
|
618
|
+
expect(result[1]).toBeInstanceOf(gql.ActionExecutionMessage);
|
|
619
|
+
|
|
620
|
+
// Check that the render function was preserved in actions
|
|
621
|
+
expect(actions.testFunction.render).toBe(mockRender);
|
|
622
|
+
|
|
623
|
+
// Now test that when the render function is called, it receives the correct props
|
|
624
|
+
// This simulates what happens when the render function is actually used
|
|
625
|
+
if (actions.testFunction.render) {
|
|
626
|
+
actions.testFunction.render({
|
|
627
|
+
status: "inProgress",
|
|
628
|
+
args: { param: "value" },
|
|
629
|
+
result: undefined,
|
|
630
|
+
respond: () => {},
|
|
631
|
+
messageId: "tool-call-render-props",
|
|
632
|
+
name: "testFunction",
|
|
633
|
+
});
|
|
634
|
+
|
|
635
|
+
expect(mockRender).toHaveBeenCalledWith({
|
|
636
|
+
status: "inProgress",
|
|
637
|
+
args: { param: "value" },
|
|
638
|
+
result: undefined,
|
|
639
|
+
respond: expect.any(Function),
|
|
640
|
+
messageId: "tool-call-render-props",
|
|
641
|
+
name: "testFunction",
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
});
|
|
588
645
|
});
|
|
589
646
|
|
|
590
647
|
describe("aguiImageMessageToGQLMessage", () => {
|
|
@@ -433,6 +433,7 @@ describe("message-conversion", () => {
|
|
|
433
433
|
result: undefined,
|
|
434
434
|
respond: expect.any(Function),
|
|
435
435
|
messageId: "action-1",
|
|
436
|
+
// Regular actions should NOT have the name property
|
|
436
437
|
});
|
|
437
438
|
});
|
|
438
439
|
|
|
@@ -463,6 +464,7 @@ describe("message-conversion", () => {
|
|
|
463
464
|
result: undefined,
|
|
464
465
|
respond: expect.any(Function),
|
|
465
466
|
messageId: "action-1",
|
|
467
|
+
// Regular actions should NOT have the name property
|
|
466
468
|
});
|
|
467
469
|
});
|
|
468
470
|
|
|
@@ -503,6 +505,7 @@ describe("message-conversion", () => {
|
|
|
503
505
|
result: "Action completed successfully",
|
|
504
506
|
respond: expect.any(Function),
|
|
505
507
|
messageId: "action-1",
|
|
508
|
+
// Regular actions should NOT have the name property
|
|
506
509
|
});
|
|
507
510
|
});
|
|
508
511
|
|
|
@@ -538,6 +541,7 @@ describe("message-conversion", () => {
|
|
|
538
541
|
respond: expect.any(Function),
|
|
539
542
|
customProp: "test",
|
|
540
543
|
messageId: "action-1",
|
|
544
|
+
// Regular actions should NOT have the name property
|
|
541
545
|
});
|
|
542
546
|
});
|
|
543
547
|
|
|
@@ -917,6 +921,73 @@ describe("message-conversion", () => {
|
|
|
917
921
|
});
|
|
918
922
|
});
|
|
919
923
|
|
|
924
|
+
test("should pass tool name to wildcard action render function", () => {
|
|
925
|
+
const mockRender = vi.fn(
|
|
926
|
+
(props) => `Wildcard rendered: ${props.name} with args: ${JSON.stringify(props.args)}`,
|
|
927
|
+
);
|
|
928
|
+
const actions = {
|
|
929
|
+
"*": {
|
|
930
|
+
name: "*",
|
|
931
|
+
render: mockRender,
|
|
932
|
+
},
|
|
933
|
+
};
|
|
934
|
+
|
|
935
|
+
const actionExecMsg = new gql.ActionExecutionMessage({
|
|
936
|
+
id: "action-wildcard-name",
|
|
937
|
+
name: "testTool",
|
|
938
|
+
arguments: { param: "value" },
|
|
939
|
+
parentMessageId: "parent-wildcard-name",
|
|
940
|
+
});
|
|
941
|
+
|
|
942
|
+
const result = gqlActionExecutionMessageToAGUIMessage(actionExecMsg, actions);
|
|
943
|
+
|
|
944
|
+
// Call the generativeUI function to trigger the render
|
|
945
|
+
(result as any).generativeUI?.();
|
|
946
|
+
|
|
947
|
+
// Verify that the render function was called with the name property
|
|
948
|
+
expect(mockRender).toHaveBeenCalledWith(
|
|
949
|
+
expect.objectContaining({
|
|
950
|
+
name: "testTool",
|
|
951
|
+
args: { param: "value" },
|
|
952
|
+
}),
|
|
953
|
+
);
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
test("should pass tool name to regular action render function", () => {
|
|
957
|
+
const mockRender = vi.fn((props) => `Regular action rendered: ${JSON.stringify(props.args)}`);
|
|
958
|
+
const actions = {
|
|
959
|
+
testAction: {
|
|
960
|
+
name: "testAction",
|
|
961
|
+
render: mockRender,
|
|
962
|
+
},
|
|
963
|
+
};
|
|
964
|
+
|
|
965
|
+
const actionExecMsg = new gql.ActionExecutionMessage({
|
|
966
|
+
id: "action-regular-name",
|
|
967
|
+
name: "testAction",
|
|
968
|
+
arguments: { param: "value" },
|
|
969
|
+
parentMessageId: "parent-regular-name",
|
|
970
|
+
});
|
|
971
|
+
|
|
972
|
+
const result = gqlActionExecutionMessageToAGUIMessage(actionExecMsg, actions);
|
|
973
|
+
|
|
974
|
+
// Call the generativeUI function to trigger the render
|
|
975
|
+
(result as any).generativeUI?.();
|
|
976
|
+
|
|
977
|
+
// Verify that the render function was called with the correct props
|
|
978
|
+
// Regular actions should NOT have the name property
|
|
979
|
+
expect(mockRender).toHaveBeenCalledWith(
|
|
980
|
+
expect.objectContaining({
|
|
981
|
+
args: { param: "value" },
|
|
982
|
+
// name property should NOT be present for regular actions
|
|
983
|
+
}),
|
|
984
|
+
);
|
|
985
|
+
|
|
986
|
+
// Verify that the name property is NOT present
|
|
987
|
+
const callArgs = mockRender.mock.calls[0][0];
|
|
988
|
+
expect(callArgs).not.toHaveProperty("name");
|
|
989
|
+
});
|
|
990
|
+
|
|
920
991
|
test("should prioritize specific action over wild card action", () => {
|
|
921
992
|
const actions = {
|
|
922
993
|
specificAction: {
|
|
@@ -109,17 +109,31 @@ export function gqlActionExecutionMessageToAGUIMessage(
|
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
//
|
|
113
|
-
const
|
|
112
|
+
// Base props that all actions receive
|
|
113
|
+
const baseProps = {
|
|
114
114
|
status: props?.status || status,
|
|
115
115
|
args: message.arguments || {},
|
|
116
116
|
result: props?.result || actionResult || undefined,
|
|
117
|
-
respond: props?.respond || (() => {}),
|
|
118
117
|
messageId: message.id,
|
|
119
|
-
...props,
|
|
120
118
|
};
|
|
121
119
|
|
|
122
|
-
|
|
120
|
+
// Add properties based on action type
|
|
121
|
+
if (action.name === "*") {
|
|
122
|
+
// Wildcard actions get the tool name; ensure it cannot be overridden by incoming props
|
|
123
|
+
return originalRender({
|
|
124
|
+
...baseProps,
|
|
125
|
+
...props,
|
|
126
|
+
name: message.name,
|
|
127
|
+
});
|
|
128
|
+
} else {
|
|
129
|
+
// Regular actions get respond (defaulting to a no-op if not provided)
|
|
130
|
+
const respond = props?.respond ?? (() => {});
|
|
131
|
+
return originalRender({
|
|
132
|
+
...baseProps,
|
|
133
|
+
...props,
|
|
134
|
+
respond,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
123
137
|
};
|
|
124
138
|
};
|
|
125
139
|
|
|
@@ -437,4 +437,90 @@ describe("roundtrip message conversion", () => {
|
|
|
437
437
|
expect((gqlMsgs2[1] as any).arguments).toEqual({ input: "test-value" });
|
|
438
438
|
expect((gqlMsgs2[2] as any).result).toBe('{"output": "processed", "count": 5}');
|
|
439
439
|
});
|
|
440
|
+
|
|
441
|
+
test("roundtrip conversion verifies correct property distribution for regular actions", () => {
|
|
442
|
+
const mockRender = vi.fn((props) => `Regular action: ${JSON.stringify(props.args)}`);
|
|
443
|
+
|
|
444
|
+
const actionExecMsg = new gql.ActionExecutionMessage({
|
|
445
|
+
id: "regular-action-test",
|
|
446
|
+
name: "regularAction",
|
|
447
|
+
arguments: { test: "regular-value" },
|
|
448
|
+
parentMessageId: "parent-regular",
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
const actions = {
|
|
452
|
+
regularAction: {
|
|
453
|
+
name: "regularAction",
|
|
454
|
+
render: mockRender,
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
// GQL -> AGUI -> GQL roundtrip
|
|
459
|
+
const aguiMsgs = gqlToAGUI([actionExecMsg], actions);
|
|
460
|
+
const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);
|
|
461
|
+
|
|
462
|
+
// Verify the roundtrip preserved the action
|
|
463
|
+
expect(gqlMsgs2).toHaveLength(2);
|
|
464
|
+
expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);
|
|
465
|
+
expect((gqlMsgs2[1] as any).name).toBe("regularAction");
|
|
466
|
+
|
|
467
|
+
// Test that regular actions do NOT receive the name property in render props
|
|
468
|
+
if ("generativeUI" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {
|
|
469
|
+
aguiMsgs[0].generativeUI();
|
|
470
|
+
expect(mockRender).toHaveBeenCalledWith(
|
|
471
|
+
expect.objectContaining({
|
|
472
|
+
args: { test: "regular-value" },
|
|
473
|
+
// name property should NOT be present for regular actions
|
|
474
|
+
}),
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
// Verify name property is NOT present
|
|
478
|
+
const callArgs = mockRender.mock.calls[0][0];
|
|
479
|
+
expect(callArgs).not.toHaveProperty("name");
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
test("roundtrip conversion verifies correct property distribution for wildcard actions", () => {
|
|
484
|
+
const mockRender = vi.fn(
|
|
485
|
+
(props) => `Wildcard action: ${props.name} with ${JSON.stringify(props.args)}`,
|
|
486
|
+
);
|
|
487
|
+
|
|
488
|
+
const actionExecMsg = new gql.ActionExecutionMessage({
|
|
489
|
+
id: "wildcard-action-test",
|
|
490
|
+
name: "unknownAction",
|
|
491
|
+
arguments: { test: "wildcard-value" },
|
|
492
|
+
parentMessageId: "parent-wildcard",
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
const actions = {
|
|
496
|
+
"*": {
|
|
497
|
+
name: "*",
|
|
498
|
+
render: mockRender,
|
|
499
|
+
},
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
// GQL -> AGUI -> GQL roundtrip
|
|
503
|
+
const aguiMsgs = gqlToAGUI([actionExecMsg], actions);
|
|
504
|
+
const gqlMsgs2 = aguiToGQL(aguiMsgs, actions);
|
|
505
|
+
|
|
506
|
+
// Verify the roundtrip preserved the action
|
|
507
|
+
expect(gqlMsgs2).toHaveLength(2);
|
|
508
|
+
expect(gqlMsgs2[1]).toBeInstanceOf(gql.ActionExecutionMessage);
|
|
509
|
+
expect((gqlMsgs2[1] as any).name).toBe("unknownAction");
|
|
510
|
+
|
|
511
|
+
// Test that wildcard actions DO receive the name property in render props
|
|
512
|
+
if ("generativeUI" in aguiMsgs[0] && aguiMsgs[0].generativeUI) {
|
|
513
|
+
aguiMsgs[0].generativeUI();
|
|
514
|
+
expect(mockRender).toHaveBeenCalledWith(
|
|
515
|
+
expect.objectContaining({
|
|
516
|
+
args: { test: "wildcard-value" },
|
|
517
|
+
name: "unknownAction", // name property SHOULD be present for wildcard actions
|
|
518
|
+
}),
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
// Verify name property IS present
|
|
522
|
+
const callArgs = mockRender.mock.calls[0][0];
|
|
523
|
+
expect(callArgs).toHaveProperty("name", "unknownAction");
|
|
524
|
+
}
|
|
525
|
+
});
|
|
440
526
|
});
|
|
@@ -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 // Provide the full props structure that the render function expects\n const renderProps = {\n status: props?.status || status,\n args: message.arguments || {},\n result: props?.result || actionResult || undefined,\n respond: props?.respond || (() => {}),\n messageId: message.id,\n ...props,\n };\n\n return originalRender(renderProps);\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"]}
|