@assistant-ui/react-a2a 0.1.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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/A2AMessageAccumulator.d.ts +16 -0
- package/dist/A2AMessageAccumulator.d.ts.map +1 -0
- package/dist/A2AMessageAccumulator.js +35 -0
- package/dist/A2AMessageAccumulator.js.map +1 -0
- package/dist/appendA2AChunk.d.ts +3 -0
- package/dist/appendA2AChunk.d.ts.map +1 -0
- package/dist/appendA2AChunk.js +90 -0
- package/dist/appendA2AChunk.js.map +1 -0
- package/dist/convertA2AMessages.d.ts +64 -0
- package/dist/convertA2AMessages.d.ts.map +1 -0
- package/dist/convertA2AMessages.js +93 -0
- package/dist/convertA2AMessages.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/testUtils.d.ts +4 -0
- package/dist/testUtils.d.ts.map +1 -0
- package/dist/testUtils.js +10 -0
- package/dist/testUtils.js.map +1 -0
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/useA2AMessages.d.ts +25 -0
- package/dist/useA2AMessages.d.ts.map +1 -0
- package/dist/useA2AMessages.js +134 -0
- package/dist/useA2AMessages.js.map +1 -0
- package/dist/useA2ARuntime.d.ts +55 -0
- package/dist/useA2ARuntime.d.ts.map +1 -0
- package/dist/useA2ARuntime.js +215 -0
- package/dist/useA2ARuntime.js.map +1 -0
- package/package.json +68 -0
- package/src/A2AMessageAccumulator.ts +48 -0
- package/src/appendA2AChunk.ts +121 -0
- package/src/convertA2AMessages.ts +108 -0
- package/src/index.ts +6 -0
- package/src/testUtils.ts +11 -0
- package/src/types.ts +114 -0
- package/src/useA2AMessages.ts +180 -0
- package/src/useA2ARuntime.ts +331 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AgentbaseAI Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type A2AStateAccumulatorConfig<TMessage> = {
|
|
2
|
+
initialMessages?: TMessage[];
|
|
3
|
+
appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;
|
|
4
|
+
};
|
|
5
|
+
export declare class A2AMessageAccumulator<TMessage extends {
|
|
6
|
+
id?: string;
|
|
7
|
+
}> {
|
|
8
|
+
private messagesMap;
|
|
9
|
+
private appendMessage;
|
|
10
|
+
constructor({ initialMessages, appendMessage, }?: A2AStateAccumulatorConfig<TMessage>);
|
|
11
|
+
private ensureMessageId;
|
|
12
|
+
addMessages(newMessages: TMessage[]): TMessage[];
|
|
13
|
+
getMessages(): TMessage[];
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=A2AMessageAccumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A2AMessageAccumulator.d.ts","sourceRoot":"","sources":["../src/A2AMessageAccumulator.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,yBAAyB,CAAC,QAAQ,IAAI;IAChD,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC;CAC1E,CAAC;AAEF,qBAAa,qBAAqB,CAAC,QAAQ,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE;IACjE,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,aAAa,CAGP;gBAEF,EACV,eAAoB,EACpB,aAGa,GACd,GAAE,yBAAyB,CAAC,QAAQ,CAAM;IAK3C,OAAO,CAAC,eAAe;IAIhB,WAAW,CAAC,WAAW,EAAE,QAAQ,EAAE;IAWnC,WAAW,IAAI,QAAQ,EAAE;IAIzB,KAAK;CAGb"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/A2AMessageAccumulator.ts
|
|
2
|
+
import { v4 as uuidv4 } from "uuid";
|
|
3
|
+
var A2AMessageAccumulator = class {
|
|
4
|
+
messagesMap = /* @__PURE__ */ new Map();
|
|
5
|
+
appendMessage;
|
|
6
|
+
constructor({
|
|
7
|
+
initialMessages = [],
|
|
8
|
+
appendMessage = ((_, curr) => curr)
|
|
9
|
+
} = {}) {
|
|
10
|
+
this.appendMessage = appendMessage;
|
|
11
|
+
this.addMessages(initialMessages);
|
|
12
|
+
}
|
|
13
|
+
ensureMessageId(message) {
|
|
14
|
+
return message.id ? message : { ...message, id: uuidv4() };
|
|
15
|
+
}
|
|
16
|
+
addMessages(newMessages) {
|
|
17
|
+
if (newMessages.length === 0) return this.getMessages();
|
|
18
|
+
for (const message of newMessages.map(this.ensureMessageId)) {
|
|
19
|
+
const messageId = message.id;
|
|
20
|
+
const previous = this.messagesMap.get(messageId);
|
|
21
|
+
this.messagesMap.set(messageId, this.appendMessage(previous, message));
|
|
22
|
+
}
|
|
23
|
+
return this.getMessages();
|
|
24
|
+
}
|
|
25
|
+
getMessages() {
|
|
26
|
+
return [...this.messagesMap.values()];
|
|
27
|
+
}
|
|
28
|
+
clear() {
|
|
29
|
+
this.messagesMap.clear();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
export {
|
|
33
|
+
A2AMessageAccumulator
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=A2AMessageAccumulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/A2AMessageAccumulator.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"uuid\";\n\nexport type A2AStateAccumulatorConfig<TMessage> = {\n initialMessages?: TMessage[];\n appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;\n};\n\nexport class A2AMessageAccumulator<TMessage extends { id?: string }> {\n private messagesMap = new Map<string, TMessage>();\n private appendMessage: (\n prev: TMessage | undefined,\n curr: TMessage,\n ) => TMessage;\n\n constructor({\n initialMessages = [],\n appendMessage = ((_: TMessage | undefined, curr: TMessage) => curr) as (\n prev: TMessage | undefined,\n curr: TMessage,\n ) => TMessage,\n }: A2AStateAccumulatorConfig<TMessage> = {}) {\n this.appendMessage = appendMessage;\n this.addMessages(initialMessages);\n }\n\n private ensureMessageId(message: TMessage): TMessage {\n return message.id ? message : { ...message, id: uuidv4() };\n }\n\n public addMessages(newMessages: TMessage[]) {\n if (newMessages.length === 0) return this.getMessages();\n\n for (const message of newMessages.map(this.ensureMessageId)) {\n const messageId = message.id!; // ensureMessageId guarantees id exists\n const previous = this.messagesMap.get(messageId);\n this.messagesMap.set(messageId, this.appendMessage(previous, message));\n }\n return this.getMessages();\n }\n\n public getMessages(): TMessage[] {\n return [...this.messagesMap.values()];\n }\n\n public clear() {\n this.messagesMap.clear();\n }\n}\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAOtB,IAAM,wBAAN,MAA8D;AAAA,EAC3D,cAAc,oBAAI,IAAsB;AAAA,EACxC;AAAA,EAKR,YAAY;AAAA,IACV,kBAAkB,CAAC;AAAA,IACnB,iBAAiB,CAAC,GAAyB,SAAmB;AAAA,EAIhE,IAAyC,CAAC,GAAG;AAC3C,SAAK,gBAAgB;AACrB,SAAK,YAAY,eAAe;AAAA,EAClC;AAAA,EAEQ,gBAAgB,SAA6B;AACnD,WAAO,QAAQ,KAAK,UAAU,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;AAAA,EAC3D;AAAA,EAEO,YAAY,aAAyB;AAC1C,QAAI,YAAY,WAAW,EAAG,QAAO,KAAK,YAAY;AAEtD,eAAW,WAAW,YAAY,IAAI,KAAK,eAAe,GAAG;AAC3D,YAAM,YAAY,QAAQ;AAC1B,YAAM,WAAW,KAAK,YAAY,IAAI,SAAS;AAC/C,WAAK,YAAY,IAAI,WAAW,KAAK,cAAc,UAAU,OAAO,CAAC;AAAA,IACvE;AACA,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEO,cAA0B;AAC/B,WAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC;AAAA,EACtC;AAAA,EAEO,QAAQ;AACb,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appendA2AChunk.d.ts","sourceRoot":"","sources":["../src/appendA2AChunk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,eAAO,MAAM,cAAc,GACzB,MAAM,UAAU,GAAG,SAAS,EAC5B,MAAM,UAAU,KACf,UAkHF,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// src/appendA2AChunk.ts
|
|
2
|
+
import { parsePartialJsonObject } from "assistant-stream/utils";
|
|
3
|
+
var appendA2AChunk = (prev, curr) => {
|
|
4
|
+
if (!prev || prev.role !== curr.role || prev.id !== curr.id) {
|
|
5
|
+
return curr;
|
|
6
|
+
}
|
|
7
|
+
if (curr.role === "assistant") {
|
|
8
|
+
const newContent = Array.isArray(prev.content) ? [...prev.content] : typeof prev.content === "string" ? [{ type: "text", text: prev.content }] : [];
|
|
9
|
+
if (typeof curr.content === "string") {
|
|
10
|
+
const lastIndex = newContent.length - 1;
|
|
11
|
+
const lastPart = newContent[lastIndex];
|
|
12
|
+
if (lastPart?.type === "text") {
|
|
13
|
+
lastPart.text += curr.content;
|
|
14
|
+
} else {
|
|
15
|
+
newContent.push({ type: "text", text: curr.content });
|
|
16
|
+
}
|
|
17
|
+
} else if (Array.isArray(curr.content)) {
|
|
18
|
+
for (const contentPart of curr.content) {
|
|
19
|
+
const lastIndex = newContent.length - 1;
|
|
20
|
+
const lastPart = newContent[lastIndex];
|
|
21
|
+
if (contentPart.type === "text" && lastPart?.type === "text") {
|
|
22
|
+
lastPart.text += contentPart.text;
|
|
23
|
+
} else {
|
|
24
|
+
newContent.push(contentPart);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const newToolCalls = [...prev.tool_calls ?? []];
|
|
29
|
+
if (curr.tool_calls) {
|
|
30
|
+
for (const toolCall of curr.tool_calls) {
|
|
31
|
+
const existingIndex = newToolCalls.findIndex(
|
|
32
|
+
(tc) => tc.id === toolCall.id
|
|
33
|
+
);
|
|
34
|
+
if (existingIndex >= 0) {
|
|
35
|
+
const existing = newToolCalls[existingIndex];
|
|
36
|
+
newToolCalls[existingIndex] = {
|
|
37
|
+
...existing,
|
|
38
|
+
...toolCall,
|
|
39
|
+
// If argsText is provided in chunks, concatenate it
|
|
40
|
+
argsText: (existing.argsText || "") + (toolCall.argsText || ""),
|
|
41
|
+
// Try to parse merged args, fallback to existing or new args
|
|
42
|
+
args: parsePartialJsonObject(
|
|
43
|
+
(existing.argsText || "") + (toolCall.argsText || "")
|
|
44
|
+
) || toolCall.args || existing.args
|
|
45
|
+
};
|
|
46
|
+
} else {
|
|
47
|
+
newToolCalls.push(toolCall);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const newArtifacts = [...prev.artifacts ?? []];
|
|
52
|
+
if (curr.artifacts) {
|
|
53
|
+
for (const artifact of curr.artifacts) {
|
|
54
|
+
const existingIndex = newArtifacts.findIndex(
|
|
55
|
+
(a) => a.name === artifact.name
|
|
56
|
+
);
|
|
57
|
+
if (existingIndex >= 0) {
|
|
58
|
+
const existingArtifact = newArtifacts[existingIndex];
|
|
59
|
+
newArtifacts[existingIndex] = {
|
|
60
|
+
name: existingArtifact.name,
|
|
61
|
+
parts: [...existingArtifact.parts, ...artifact.parts]
|
|
62
|
+
};
|
|
63
|
+
} else {
|
|
64
|
+
newArtifacts.push(artifact);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const result2 = {
|
|
69
|
+
...prev,
|
|
70
|
+
content: newContent
|
|
71
|
+
};
|
|
72
|
+
const newStatus = curr.status || prev.status;
|
|
73
|
+
if (newStatus) result2.status = newStatus;
|
|
74
|
+
if (newToolCalls.length > 0) result2.tool_calls = newToolCalls;
|
|
75
|
+
if (newArtifacts.length > 0) result2.artifacts = newArtifacts;
|
|
76
|
+
return result2;
|
|
77
|
+
}
|
|
78
|
+
const result = {
|
|
79
|
+
...prev,
|
|
80
|
+
...curr
|
|
81
|
+
};
|
|
82
|
+
if (curr.artifacts || prev.artifacts) {
|
|
83
|
+
result.artifacts = [...prev.artifacts ?? [], ...curr.artifacts ?? []];
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
};
|
|
87
|
+
export {
|
|
88
|
+
appendA2AChunk
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=appendA2AChunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/appendA2AChunk.ts"],"sourcesContent":["import { A2AMessage } from \"./types\";\nimport { parsePartialJsonObject } from \"assistant-stream/utils\";\n\nexport const appendA2AChunk = (\n prev: A2AMessage | undefined,\n curr: A2AMessage,\n): A2AMessage => {\n // If no previous message or different message type, return current as-is\n if (!prev || prev.role !== curr.role || prev.id !== curr.id) {\n return curr;\n }\n\n // For assistant messages, we need to handle streaming content and tool calls\n if (curr.role === \"assistant\") {\n const newContent = Array.isArray(prev.content)\n ? [...prev.content]\n : typeof prev.content === \"string\"\n ? [{ type: \"text\" as const, text: prev.content }]\n : [];\n\n // Append new content chunks\n if (typeof curr.content === \"string\") {\n const lastIndex = newContent.length - 1;\n const lastPart = newContent[lastIndex];\n\n if (lastPart?.type === \"text\") {\n // Append to existing text part\n (lastPart as { type: \"text\"; text: string }).text += curr.content;\n } else {\n // Create new text part\n newContent.push({ type: \"text\", text: curr.content });\n }\n } else if (Array.isArray(curr.content)) {\n for (const contentPart of curr.content) {\n const lastIndex = newContent.length - 1;\n const lastPart = newContent[lastIndex];\n\n if (contentPart.type === \"text\" && lastPart?.type === \"text\") {\n // Append to existing text part\n (lastPart as { type: \"text\"; text: string }).text += contentPart.text;\n } else {\n // Add new content part\n newContent.push(contentPart);\n }\n }\n }\n\n // Merge tool calls - A2A typically sends complete tool calls rather than chunks\n const newToolCalls = [...(prev.tool_calls ?? [])];\n if (curr.tool_calls) {\n for (const toolCall of curr.tool_calls) {\n const existingIndex = newToolCalls.findIndex(\n (tc) => tc.id === toolCall.id,\n );\n if (existingIndex >= 0) {\n // Update existing tool call (merge args if needed)\n const existing = newToolCalls[existingIndex]!;\n newToolCalls[existingIndex] = {\n ...existing,\n ...toolCall,\n // If argsText is provided in chunks, concatenate it\n argsText: (existing.argsText || \"\") + (toolCall.argsText || \"\"),\n // Try to parse merged args, fallback to existing or new args\n args:\n parsePartialJsonObject(\n (existing.argsText || \"\") + (toolCall.argsText || \"\"),\n ) ||\n toolCall.args ||\n existing.args,\n };\n } else {\n // Add new tool call\n newToolCalls.push(toolCall);\n }\n }\n }\n\n // Merge artifacts\n const newArtifacts = [...(prev.artifacts ?? [])];\n if (curr.artifacts) {\n for (const artifact of curr.artifacts) {\n const existingIndex = newArtifacts.findIndex(\n (a) => a.name === artifact.name,\n );\n if (existingIndex >= 0) {\n // Merge artifact parts\n const existingArtifact = newArtifacts[existingIndex]!;\n newArtifacts[existingIndex] = {\n name: existingArtifact.name,\n parts: [...existingArtifact.parts, ...artifact.parts],\n };\n } else {\n // Add new artifact\n newArtifacts.push(artifact);\n }\n }\n }\n\n const result: A2AMessage = {\n ...prev,\n content: newContent,\n };\n const newStatus = curr.status || prev.status;\n if (newStatus) result.status = newStatus;\n if (newToolCalls.length > 0) result.tool_calls = newToolCalls;\n if (newArtifacts.length > 0) result.artifacts = newArtifacts;\n return result;\n }\n\n // For other message types (user, system, tool), just return the current message\n // as they typically don't stream in chunks\n const result: A2AMessage = {\n ...prev,\n ...curr,\n };\n // Preserve any existing artifacts and merge with new ones\n if (curr.artifacts || prev.artifacts) {\n result.artifacts = [...(prev.artifacts ?? []), ...(curr.artifacts ?? [])];\n }\n return result;\n};\n"],"mappings":"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","names":["result"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { A2AMessage } from "./types";
|
|
2
|
+
import { ToolCallMessagePart } from "@assistant-ui/react";
|
|
3
|
+
export declare const convertA2AMessage: (message: A2AMessage) => {
|
|
4
|
+
id: string | undefined;
|
|
5
|
+
role: "system";
|
|
6
|
+
content: {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
}[];
|
|
10
|
+
status?: never;
|
|
11
|
+
} | {
|
|
12
|
+
id: string | undefined;
|
|
13
|
+
role: "user";
|
|
14
|
+
content: NonNullable<import("@assistant-ui/react").ThreadUserMessagePart | null>[];
|
|
15
|
+
status?: never;
|
|
16
|
+
} | {
|
|
17
|
+
id: string | undefined;
|
|
18
|
+
role: "assistant";
|
|
19
|
+
content: (NonNullable<import("@assistant-ui/react").ThreadUserMessagePart | null> | ToolCallMessagePart)[];
|
|
20
|
+
status: import("@assistant-ui/react").MessageStatus | undefined;
|
|
21
|
+
} | {
|
|
22
|
+
id: string | undefined;
|
|
23
|
+
role: "user";
|
|
24
|
+
content: {
|
|
25
|
+
type: "tool-call";
|
|
26
|
+
toolCallId: string;
|
|
27
|
+
toolName: string;
|
|
28
|
+
result: any;
|
|
29
|
+
isError: boolean;
|
|
30
|
+
}[];
|
|
31
|
+
status?: never;
|
|
32
|
+
};
|
|
33
|
+
export declare const convertA2AMessages: (messages: A2AMessage[]) => ({
|
|
34
|
+
id: string | undefined;
|
|
35
|
+
role: "system";
|
|
36
|
+
content: {
|
|
37
|
+
type: "text";
|
|
38
|
+
text: string;
|
|
39
|
+
}[];
|
|
40
|
+
status?: never;
|
|
41
|
+
} | {
|
|
42
|
+
id: string | undefined;
|
|
43
|
+
role: "user";
|
|
44
|
+
content: NonNullable<import("@assistant-ui/react").ThreadUserMessagePart | null>[];
|
|
45
|
+
status?: never;
|
|
46
|
+
} | {
|
|
47
|
+
id: string | undefined;
|
|
48
|
+
role: "assistant";
|
|
49
|
+
content: (NonNullable<import("@assistant-ui/react").ThreadUserMessagePart | null> | ToolCallMessagePart)[];
|
|
50
|
+
status: import("@assistant-ui/react").MessageStatus | undefined;
|
|
51
|
+
} | {
|
|
52
|
+
id: string | undefined;
|
|
53
|
+
role: "user";
|
|
54
|
+
content: {
|
|
55
|
+
type: "tool-call";
|
|
56
|
+
toolCallId: string;
|
|
57
|
+
toolName: string;
|
|
58
|
+
result: any;
|
|
59
|
+
isError: boolean;
|
|
60
|
+
}[];
|
|
61
|
+
status?: never;
|
|
62
|
+
})[];
|
|
63
|
+
export declare const useA2AMessageConverter: (messages: A2AMessage[], isRunning: boolean) => import("@assistant-ui/react").ThreadMessage[];
|
|
64
|
+
//# sourceMappingURL=convertA2AMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertA2AMessages.d.ts","sourceRoot":"","sources":["../src/convertA2AMessages.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkC1D,eAAO,MAAM,iBAAiB,GAAI,SAAS,UAAU;;;;;cAOe,MAAM;;;;;;;;;;;;;;;;;;;;;;;;CAiDzE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,UAAU,UAAU,EAAE;;;;;cAnDW,MAAM;;;;;;;;;;;;;;;;;;;;;;;;IAoDzC,CAAC;AAElC,eAAO,MAAM,sBAAsB,GACjC,UAAU,UAAU,EAAE,EACtB,WAAW,OAAO,kDAMhB,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/convertA2AMessages.ts
|
|
4
|
+
import { useExternalMessageConverter } from "@assistant-ui/react";
|
|
5
|
+
var contentToParts = (content) => {
|
|
6
|
+
if (typeof content === "string")
|
|
7
|
+
return [{ type: "text", text: content }];
|
|
8
|
+
return content.map((part) => {
|
|
9
|
+
const type = part.type;
|
|
10
|
+
switch (type) {
|
|
11
|
+
case "text":
|
|
12
|
+
return { type: "text", text: part.text };
|
|
13
|
+
case "image_url":
|
|
14
|
+
if (typeof part.image_url === "string") {
|
|
15
|
+
return { type: "image", image: part.image_url };
|
|
16
|
+
} else {
|
|
17
|
+
return {
|
|
18
|
+
type: "image",
|
|
19
|
+
image: part.image_url.url
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
case "data":
|
|
23
|
+
return {
|
|
24
|
+
type: "text",
|
|
25
|
+
text: `[Data: ${JSON.stringify(part.data)}]`
|
|
26
|
+
};
|
|
27
|
+
default:
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}).filter((part) => part !== null);
|
|
31
|
+
};
|
|
32
|
+
var convertA2AMessage = (message) => {
|
|
33
|
+
const role = message.role;
|
|
34
|
+
switch (role) {
|
|
35
|
+
case "system":
|
|
36
|
+
return {
|
|
37
|
+
id: message.id,
|
|
38
|
+
role: "system",
|
|
39
|
+
content: [{ type: "text", text: message.content }]
|
|
40
|
+
};
|
|
41
|
+
case "user":
|
|
42
|
+
return {
|
|
43
|
+
id: message.id,
|
|
44
|
+
role: "user",
|
|
45
|
+
content: contentToParts(message.content)
|
|
46
|
+
};
|
|
47
|
+
case "assistant": {
|
|
48
|
+
const toolCallParts = message.tool_calls?.map((toolCall) => ({
|
|
49
|
+
type: "tool-call",
|
|
50
|
+
toolCallId: toolCall.id,
|
|
51
|
+
toolName: toolCall.name,
|
|
52
|
+
args: toolCall.args,
|
|
53
|
+
argsText: toolCall.argsText ?? JSON.stringify(toolCall.args)
|
|
54
|
+
})) ?? [];
|
|
55
|
+
return {
|
|
56
|
+
id: message.id,
|
|
57
|
+
role: "assistant",
|
|
58
|
+
content: [...contentToParts(message.content), ...toolCallParts],
|
|
59
|
+
status: message.status
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
case "tool":
|
|
63
|
+
return {
|
|
64
|
+
id: message.id,
|
|
65
|
+
role: "user",
|
|
66
|
+
content: [
|
|
67
|
+
{
|
|
68
|
+
type: "tool-call",
|
|
69
|
+
toolCallId: message.tool_call_id,
|
|
70
|
+
toolName: "",
|
|
71
|
+
// A2A doesn't store tool name in tool messages
|
|
72
|
+
result: JSON.parse(message.content),
|
|
73
|
+
isError: message.status?.type === "incomplete" && message.status?.reason === "error"
|
|
74
|
+
}
|
|
75
|
+
]
|
|
76
|
+
};
|
|
77
|
+
default:
|
|
78
|
+
const _exhaustiveCheck = role;
|
|
79
|
+
throw new Error(`Unknown message role: ${_exhaustiveCheck}`);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var convertA2AMessages = (messages) => messages.map(convertA2AMessage);
|
|
83
|
+
var useA2AMessageConverter = (messages, isRunning) => useExternalMessageConverter({
|
|
84
|
+
callback: convertA2AMessage,
|
|
85
|
+
messages,
|
|
86
|
+
isRunning
|
|
87
|
+
});
|
|
88
|
+
export {
|
|
89
|
+
convertA2AMessage,
|
|
90
|
+
convertA2AMessages,
|
|
91
|
+
useA2AMessageConverter
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=convertA2AMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/convertA2AMessages.ts"],"sourcesContent":["\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { A2AMessage } from \"./types\";\nimport { ToolCallMessagePart } from \"@assistant-ui/react\";\nimport { ThreadUserMessage } from \"@assistant-ui/react\";\n\nconst contentToParts = (content: A2AMessage[\"content\"]) => {\n if (typeof content === \"string\")\n return [{ type: \"text\" as const, text: content }];\n return content\n .map((part): ThreadUserMessage[\"content\"][number] | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"image_url\":\n if (typeof part.image_url === \"string\") {\n return { type: \"image\", image: part.image_url };\n } else {\n return {\n type: \"image\",\n image: part.image_url.url,\n };\n }\n case \"data\":\n // Convert data parts to text representation for display\n return {\n type: \"text\",\n text: `[Data: ${JSON.stringify(part.data)}]`,\n };\n default:\n return null;\n }\n })\n .filter((part): part is NonNullable<typeof part> => part !== null);\n};\n\nexport const convertA2AMessage = (message: A2AMessage) => {\n const role = message.role;\n switch (role) {\n case \"system\":\n return {\n id: message.id,\n role: \"system\" as const,\n content: [{ type: \"text\" as const, text: message.content as string }],\n };\n\n case \"user\":\n return {\n id: message.id,\n role: \"user\" as const,\n content: contentToParts(message.content),\n };\n\n case \"assistant\": {\n const toolCallParts: ToolCallMessagePart[] =\n message.tool_calls?.map((toolCall) => ({\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n args: toolCall.args,\n argsText: toolCall.argsText ?? JSON.stringify(toolCall.args),\n })) ?? [];\n\n return {\n id: message.id,\n role: \"assistant\" as const,\n content: [...contentToParts(message.content), ...toolCallParts],\n status: message.status,\n };\n }\n\n case \"tool\":\n return {\n id: message.id,\n role: \"user\" as const,\n content: [\n {\n type: \"tool-call\" as const,\n toolCallId: message.tool_call_id!,\n toolName: \"\", // A2A doesn't store tool name in tool messages\n result: JSON.parse(message.content as string),\n isError:\n message.status?.type === \"incomplete\" &&\n message.status?.reason === \"error\",\n },\n ],\n };\n\n default:\n const _exhaustiveCheck: never = role;\n throw new Error(`Unknown message role: ${_exhaustiveCheck}`);\n }\n};\n\nexport const convertA2AMessages = (messages: A2AMessage[]) =>\n messages.map(convertA2AMessage);\n\nexport const useA2AMessageConverter = (\n messages: A2AMessage[],\n isRunning: boolean,\n) =>\n useExternalMessageConverter({\n callback: convertA2AMessage,\n messages,\n isRunning,\n });\n"],"mappings":";;;AAEA,SAAS,mCAAmC;AAK5C,IAAM,iBAAiB,CAAC,YAAmC;AACzD,MAAI,OAAO,YAAY;AACrB,WAAO,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,CAAC;AAClD,SAAO,QACJ,IAAI,CAAC,SAAsD;AAC1D,UAAM,OAAO,KAAK;AAClB,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,MACzC,KAAK;AACH,YAAI,OAAO,KAAK,cAAc,UAAU;AACtC,iBAAO,EAAE,MAAM,SAAS,OAAO,KAAK,UAAU;AAAA,QAChD,OAAO;AACL,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO,KAAK,UAAU;AAAA,UACxB;AAAA,QACF;AAAA,MACF,KAAK;AAEH,eAAO;AAAA,UACL,MAAM;AAAA,UACN,MAAM,UAAU,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,QAC3C;AAAA,MACF;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAA2C,SAAS,IAAI;AACrE;AAEO,IAAM,oBAAoB,CAAC,YAAwB;AACxD,QAAM,OAAO,QAAQ;AACrB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAkB,CAAC;AAAA,MACtE;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,eAAe,QAAQ,OAAO;AAAA,MACzC;AAAA,IAEF,KAAK,aAAa;AAChB,YAAM,gBACJ,QAAQ,YAAY,IAAI,CAAC,cAAc;AAAA,QACrC,MAAM;AAAA,QACN,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS;AAAA,QACf,UAAU,SAAS,YAAY,KAAK,UAAU,SAAS,IAAI;AAAA,MAC7D,EAAE,KAAK,CAAC;AAEV,aAAO;AAAA,QACL,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC,GAAG,eAAe,QAAQ,OAAO,GAAG,GAAG,aAAa;AAAA,QAC9D,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,YAAY,QAAQ;AAAA,YACpB,UAAU;AAAA;AAAA,YACV,QAAQ,KAAK,MAAM,QAAQ,OAAiB;AAAA,YAC5C,SACE,QAAQ,QAAQ,SAAS,gBACzB,QAAQ,QAAQ,WAAW;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IAEF;AACE,YAAM,mBAA0B;AAChC,YAAM,IAAI,MAAM,yBAAyB,gBAAgB,EAAE;AAAA,EAC/D;AACF;AAEO,IAAM,qBAAqB,CAAC,aACjC,SAAS,IAAI,iBAAiB;AAEzB,IAAM,yBAAyB,CACpC,UACA,cAEA,4BAA4B;AAAA,EAC1B,UAAU;AAAA,EACV;AAAA,EACA;AACF,CAAC;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
export * from "./useA2ARuntime.js";
|
|
3
|
+
export * from "./useA2AMessages.js";
|
|
4
|
+
export * from "./convertA2AMessages.js";
|
|
5
|
+
export * from "./types.js";
|
|
6
|
+
export * from "./A2AMessageAccumulator.js";
|
|
7
|
+
export * from "./appendA2AChunk.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./useA2ARuntime\";\nexport * from \"./useA2AMessages\";\nexport * from \"./convertA2AMessages\";\nexport * from \"./types\";\nexport * from \"./A2AMessageAccumulator\";\nexport * from \"./appendA2AChunk\";\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { A2AMessage } from "./types";
|
|
2
|
+
import { A2AMessagesEvent } from "./useA2AMessages";
|
|
3
|
+
export declare const mockStreamCallbackFactory: (events: Array<A2AMessagesEvent<A2AMessage>>) => () => AsyncGenerator<import("./types").A2AEvent, void, unknown>;
|
|
4
|
+
//# sourceMappingURL=testUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../src/testUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,eAAO,MAAM,yBAAyB,GACpC,QAAQ,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,oEAM1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testUtils.ts"],"sourcesContent":["import { A2AMessage } from \"./types\";\nimport { A2AMessagesEvent } from \"./useA2AMessages\";\n\nexport const mockStreamCallbackFactory = (\n events: Array<A2AMessagesEvent<A2AMessage>>,\n) =>\n async function* () {\n for (const event of events) {\n yield event;\n }\n };\n"],"mappings":";AAGO,IAAM,4BAA4B,CACvC,WAEA,mBAAmB;AACjB,aAAW,SAAS,QAAQ;AAC1B,UAAM;AAAA,EACR;AACF;","names":[]}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { MessageStatus } from "@assistant-ui/react";
|
|
2
|
+
import { ReadonlyJSONObject } from "assistant-stream/utils";
|
|
3
|
+
export type A2AMessage = {
|
|
4
|
+
id?: string;
|
|
5
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
6
|
+
content: string | A2AMessageContent[];
|
|
7
|
+
tool_calls?: A2AToolCall[];
|
|
8
|
+
tool_call_id?: string;
|
|
9
|
+
artifacts?: A2AArtifact[];
|
|
10
|
+
status?: MessageStatus;
|
|
11
|
+
};
|
|
12
|
+
export type A2AMessageContent = {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: "image_url";
|
|
17
|
+
image_url: string | {
|
|
18
|
+
url: string;
|
|
19
|
+
};
|
|
20
|
+
} | {
|
|
21
|
+
type: "data";
|
|
22
|
+
data: any;
|
|
23
|
+
};
|
|
24
|
+
export type A2AToolCall = {
|
|
25
|
+
id: string;
|
|
26
|
+
name: string;
|
|
27
|
+
args: ReadonlyJSONObject;
|
|
28
|
+
argsText?: string;
|
|
29
|
+
};
|
|
30
|
+
export type A2AArtifact = {
|
|
31
|
+
name: string;
|
|
32
|
+
parts: A2AArtifactPart[];
|
|
33
|
+
};
|
|
34
|
+
export type A2AArtifactPart = {
|
|
35
|
+
kind: "text" | "data" | "file";
|
|
36
|
+
data?: any;
|
|
37
|
+
text?: string;
|
|
38
|
+
metadata?: Record<string, any>;
|
|
39
|
+
};
|
|
40
|
+
export type A2AEvent = {
|
|
41
|
+
event: A2AKnownEventTypes | string;
|
|
42
|
+
data: any;
|
|
43
|
+
};
|
|
44
|
+
export declare enum A2AKnownEventTypes {
|
|
45
|
+
TaskUpdate = "task-update",
|
|
46
|
+
TaskComplete = "task-complete",
|
|
47
|
+
TaskFailed = "task-failed",
|
|
48
|
+
Artifacts = "artifacts",
|
|
49
|
+
StateUpdate = "state-update",
|
|
50
|
+
Error = "error"
|
|
51
|
+
}
|
|
52
|
+
export type A2ATaskState = {
|
|
53
|
+
id: string;
|
|
54
|
+
state: "pending" | "working" | "completed" | "failed";
|
|
55
|
+
progress?: number;
|
|
56
|
+
message?: string;
|
|
57
|
+
};
|
|
58
|
+
export type A2ATaskResult = {
|
|
59
|
+
id: string;
|
|
60
|
+
status: {
|
|
61
|
+
state: "pending" | "working" | "completed" | "failed";
|
|
62
|
+
message?: string;
|
|
63
|
+
};
|
|
64
|
+
artifacts?: A2AArtifact[];
|
|
65
|
+
history?: Array<{
|
|
66
|
+
messageId: string;
|
|
67
|
+
role: string;
|
|
68
|
+
parts?: Array<{
|
|
69
|
+
kind: string;
|
|
70
|
+
text?: string;
|
|
71
|
+
data?: any;
|
|
72
|
+
}>;
|
|
73
|
+
}>;
|
|
74
|
+
};
|
|
75
|
+
export type A2AConfig = {
|
|
76
|
+
contextId?: string;
|
|
77
|
+
runConfig?: Record<string, any>;
|
|
78
|
+
};
|
|
79
|
+
export type A2ASendMessageConfig = A2AConfig & {
|
|
80
|
+
command?: A2ACommand;
|
|
81
|
+
};
|
|
82
|
+
export type A2ACommand = {
|
|
83
|
+
resume?: string;
|
|
84
|
+
interrupt?: string;
|
|
85
|
+
};
|
|
86
|
+
export type A2AStreamCallback<TMessage> = (messages: TMessage[], config: A2ASendMessageConfig & {
|
|
87
|
+
abortSignal: AbortSignal;
|
|
88
|
+
}) => Promise<AsyncGenerator<A2AEvent>> | AsyncGenerator<A2AEvent>;
|
|
89
|
+
export type OnTaskUpdateEventCallback = (data: A2ATaskState) => void | Promise<void>;
|
|
90
|
+
export type OnArtifactsEventCallback = (artifacts: A2AArtifact[]) => void | Promise<void>;
|
|
91
|
+
export type OnErrorEventCallback = (error: unknown) => void | Promise<void>;
|
|
92
|
+
export type OnStateUpdateEventCallback = (state: unknown) => void | Promise<void>;
|
|
93
|
+
export type OnCustomEventCallback = (type: string, data: unknown) => void | Promise<void>;
|
|
94
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/types.ts
|
|
2
|
+
var A2AKnownEventTypes = /* @__PURE__ */ ((A2AKnownEventTypes2) => {
|
|
3
|
+
A2AKnownEventTypes2["TaskUpdate"] = "task-update";
|
|
4
|
+
A2AKnownEventTypes2["TaskComplete"] = "task-complete";
|
|
5
|
+
A2AKnownEventTypes2["TaskFailed"] = "task-failed";
|
|
6
|
+
A2AKnownEventTypes2["Artifacts"] = "artifacts";
|
|
7
|
+
A2AKnownEventTypes2["StateUpdate"] = "state-update";
|
|
8
|
+
A2AKnownEventTypes2["Error"] = "error";
|
|
9
|
+
return A2AKnownEventTypes2;
|
|
10
|
+
})(A2AKnownEventTypes || {});
|
|
11
|
+
export {
|
|
12
|
+
A2AKnownEventTypes
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import { MessageStatus } from \"@assistant-ui/react\";\nimport { ReadonlyJSONObject } from \"assistant-stream/utils\";\n\n// A2A Message Types\nexport type A2AMessage = {\n id?: string;\n role: \"user\" | \"assistant\" | \"system\" | \"tool\";\n content: string | A2AMessageContent[];\n tool_calls?: A2AToolCall[];\n tool_call_id?: string;\n artifacts?: A2AArtifact[];\n status?: MessageStatus;\n};\n\nexport type A2AMessageContent =\n | { type: \"text\"; text: string }\n | { type: \"image_url\"; image_url: string | { url: string } }\n | { type: \"data\"; data: any };\n\nexport type A2AToolCall = {\n id: string;\n name: string;\n args: ReadonlyJSONObject;\n argsText?: string;\n};\n\nexport type A2AArtifact = {\n name: string;\n parts: A2AArtifactPart[];\n};\n\nexport type A2AArtifactPart = {\n kind: \"text\" | \"data\" | \"file\";\n data?: any;\n text?: string;\n metadata?: Record<string, any>;\n};\n\n// A2A Events (similar to LangGraph events)\nexport type A2AEvent = {\n event: A2AKnownEventTypes | string;\n data: any;\n};\n\nexport enum A2AKnownEventTypes {\n TaskUpdate = \"task-update\",\n TaskComplete = \"task-complete\",\n TaskFailed = \"task-failed\",\n Artifacts = \"artifacts\",\n StateUpdate = \"state-update\",\n Error = \"error\",\n}\n\n// A2A Task State\nexport type A2ATaskState = {\n id: string;\n state: \"pending\" | \"working\" | \"completed\" | \"failed\";\n progress?: number;\n message?: string;\n};\n\n// A2A Task Result\nexport type A2ATaskResult = {\n id: string;\n status: {\n state: \"pending\" | \"working\" | \"completed\" | \"failed\";\n message?: string;\n };\n artifacts?: A2AArtifact[];\n history?: Array<{\n messageId: string;\n role: string;\n parts?: Array<{ kind: string; text?: string; data?: any }>;\n }>;\n};\n\n// A2A Configuration\nexport type A2AConfig = {\n contextId?: string;\n runConfig?: Record<string, any>;\n};\n\n// A2A Send Message Configuration\nexport type A2ASendMessageConfig = A2AConfig & {\n command?: A2ACommand;\n};\n\n// A2A Commands (for interrupts/resume)\nexport type A2ACommand = {\n resume?: string;\n interrupt?: string;\n};\n\n// A2A Stream Callback\nexport type A2AStreamCallback<TMessage> = (\n messages: TMessage[],\n config: A2ASendMessageConfig & { abortSignal: AbortSignal },\n) => Promise<AsyncGenerator<A2AEvent>> | AsyncGenerator<A2AEvent>;\n\n// Event handler callback types\nexport type OnTaskUpdateEventCallback = (\n data: A2ATaskState,\n) => void | Promise<void>;\nexport type OnArtifactsEventCallback = (\n artifacts: A2AArtifact[],\n) => void | Promise<void>;\nexport type OnErrorEventCallback = (error: unknown) => void | Promise<void>;\nexport type OnStateUpdateEventCallback = (\n state: unknown,\n) => void | Promise<void>;\nexport type OnCustomEventCallback = (\n type: string,\n data: unknown,\n) => void | Promise<void>;\n"],"mappings":";AA4CO,IAAK,qBAAL,kBAAKA,wBAAL;AACL,EAAAA,oBAAA,gBAAa;AACb,EAAAA,oBAAA,kBAAe;AACf,EAAAA,oBAAA,gBAAa;AACb,EAAAA,oBAAA,eAAY;AACZ,EAAAA,oBAAA,iBAAc;AACd,EAAAA,oBAAA,WAAQ;AANE,SAAAA;AAAA,GAAA;","names":["A2AKnownEventTypes"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { A2AEvent, A2ATaskState, A2AArtifact, A2ASendMessageConfig, A2AStreamCallback, OnTaskUpdateEventCallback, OnArtifactsEventCallback, OnErrorEventCallback, OnStateUpdateEventCallback, OnCustomEventCallback } from "./types";
|
|
2
|
+
export type A2AMessagesEvent<_TMessage> = A2AEvent;
|
|
3
|
+
export declare const useA2AMessages: <TMessage extends {
|
|
4
|
+
id?: string;
|
|
5
|
+
}>({ stream, appendMessage, eventHandlers, }: {
|
|
6
|
+
stream: A2AStreamCallback<TMessage>;
|
|
7
|
+
appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;
|
|
8
|
+
eventHandlers?: {
|
|
9
|
+
onTaskUpdate?: OnTaskUpdateEventCallback;
|
|
10
|
+
onArtifacts?: OnArtifactsEventCallback;
|
|
11
|
+
onError?: OnErrorEventCallback;
|
|
12
|
+
onStateUpdate?: OnStateUpdateEventCallback;
|
|
13
|
+
onCustomEvent?: OnCustomEventCallback;
|
|
14
|
+
};
|
|
15
|
+
}) => {
|
|
16
|
+
messages: TMessage[];
|
|
17
|
+
artifacts: A2AArtifact[];
|
|
18
|
+
taskState: A2ATaskState | undefined;
|
|
19
|
+
sendMessage: (newMessages: TMessage[], config: A2ASendMessageConfig) => Promise<void>;
|
|
20
|
+
cancel: () => void;
|
|
21
|
+
setMessages: import("react").Dispatch<import("react").SetStateAction<TMessage[]>>;
|
|
22
|
+
setArtifacts: import("react").Dispatch<import("react").SetStateAction<A2AArtifact[]>>;
|
|
23
|
+
setTaskState: import("react").Dispatch<import("react").SetStateAction<A2ATaskState | undefined>>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=useA2AMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useA2AMessages.d.ts","sourceRoot":"","sources":["../src/useA2AMessages.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,QAAQ,EAER,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,gBAAgB,CAAC,SAAS,IAAI,QAAQ,CAAC;AAOnD,eAAO,MAAM,cAAc,GAAI,QAAQ,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,2CAI9D;IACD,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ,KAAK,QAAQ,CAAC;IACzE,aAAa,CAAC,EAAE;QACd,YAAY,CAAC,EAAE,yBAAyB,CAAC;QACzC,WAAW,CAAC,EAAE,wBAAwB,CAAC;QACvC,OAAO,CAAC,EAAE,oBAAoB,CAAC;QAC/B,aAAa,CAAC,EAAE,0BAA0B,CAAC;QAC3C,aAAa,CAAC,EAAE,qBAAqB,CAAC;KACvC,CAAC;CACH;;;;+BAUuB,QAAQ,EAAE,UAAU,oBAAoB;;;;;CAmI/D,CAAC"}
|