@perkos/perkos-a2a 0.3.1

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/dist/index.js ADDED
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @perkos/a2a — OpenClaw Plugin
3
+ *
4
+ * Agent-to-Agent (A2A) protocol communication plugin.
5
+ * Adds tools for agents to discover peers, send tasks, and check task status.
6
+ * Runs an A2A-compliant HTTP server alongside the OpenClaw gateway.
7
+ */
8
+ import { A2AServer } from "./server.js";
9
+ export { A2AServer } from "./server.js";
10
+ export * from "./types.js";
11
+ export default function register(api) {
12
+ const pluginConfig = api.config?.plugins?.entries?.["perkos-a2a"]?.config || {
13
+ agentName: "agent",
14
+ port: 5050,
15
+ skills: [],
16
+ peers: {},
17
+ };
18
+ const logger = api.logger || console;
19
+ const server = new A2AServer(pluginConfig, logger);
20
+ // Start A2A server as background service
21
+ api.registerService({
22
+ id: "perkos-a2a",
23
+ start: () => {
24
+ server.start();
25
+ logger.info(`[perkos-a2a] A2A server started for ${pluginConfig.agentName}`);
26
+ },
27
+ stop: () => {
28
+ logger.info("[perkos-a2a] A2A server stopping");
29
+ },
30
+ });
31
+ // Tool: Send a task to a peer agent
32
+ api.registerTool({
33
+ name: "a2a_send_task",
34
+ description: "Send a task to another agent in the council via A2A protocol. " +
35
+ "Use this to delegate work to a peer agent.",
36
+ parameters: {
37
+ type: "object",
38
+ properties: {
39
+ target: {
40
+ type: "string",
41
+ description: "Name of the target agent (e.g. 'mimir', 'tyr', 'bragi', 'idunn')",
42
+ },
43
+ message: {
44
+ type: "string",
45
+ description: "The task message to send to the agent",
46
+ },
47
+ },
48
+ required: ["target", "message"],
49
+ },
50
+ async execute(_id, params) {
51
+ try {
52
+ const result = await server.sendTask(params.target, params.message);
53
+ if (result.error) {
54
+ return {
55
+ content: [
56
+ {
57
+ type: "text",
58
+ text: `Failed to send task to ${params.target}: ${result.error.message}`,
59
+ },
60
+ ],
61
+ };
62
+ }
63
+ const task = result.result;
64
+ return {
65
+ content: [
66
+ {
67
+ type: "text",
68
+ text: [
69
+ `Task sent to ${params.target} successfully.`,
70
+ `Task ID: ${task?.id}`,
71
+ `Status: ${task?.status?.state}`,
72
+ ].join("\n"),
73
+ },
74
+ ],
75
+ };
76
+ }
77
+ catch (err) {
78
+ const msg = err instanceof Error ? err.message : String(err);
79
+ return {
80
+ content: [{ type: "text", text: `Error sending task: ${msg}` }],
81
+ };
82
+ }
83
+ },
84
+ });
85
+ // Tool: Discover peer agents
86
+ api.registerTool({
87
+ name: "a2a_discover",
88
+ description: "Discover all peer agents in the council and their capabilities. " +
89
+ "Returns each agent's status, name, description, and skills.",
90
+ parameters: {
91
+ type: "object",
92
+ properties: {},
93
+ },
94
+ async execute() {
95
+ try {
96
+ const peers = await server.discoverPeers();
97
+ const lines = ["## Council Agents\n"];
98
+ for (const [name, info] of Object.entries(peers)) {
99
+ if (info.status === "online" && info.card) {
100
+ lines.push(`### ${info.card.name} (${name})`);
101
+ lines.push(`- **Status:** online`);
102
+ lines.push(`- **Description:** ${info.card.description}`);
103
+ lines.push(`- **Skills:** ${info.card.skills.map((s) => s.name).join(", ")}`);
104
+ lines.push("");
105
+ }
106
+ else {
107
+ lines.push(`### ${name}`);
108
+ lines.push(`- **Status:** offline`);
109
+ lines.push("");
110
+ }
111
+ }
112
+ return {
113
+ content: [{ type: "text", text: lines.join("\n") }],
114
+ };
115
+ }
116
+ catch (err) {
117
+ const msg = err instanceof Error ? err.message : String(err);
118
+ return {
119
+ content: [{ type: "text", text: `Error discovering peers: ${msg}` }],
120
+ };
121
+ }
122
+ },
123
+ });
124
+ // Tool: Get task status
125
+ api.registerTool({
126
+ name: "a2a_task_status",
127
+ description: "Get the status of a previously sent A2A task by its ID.",
128
+ parameters: {
129
+ type: "object",
130
+ properties: {
131
+ target: {
132
+ type: "string",
133
+ description: "Name of the agent that received the task",
134
+ },
135
+ taskId: {
136
+ type: "string",
137
+ description: "The task ID returned from a2a_send_task",
138
+ },
139
+ },
140
+ required: ["target", "taskId"],
141
+ },
142
+ async execute(_id, params) {
143
+ const targetUrl = pluginConfig.peers[params.target];
144
+ if (!targetUrl) {
145
+ return {
146
+ content: [
147
+ { type: "text", text: `Unknown agent: ${params.target}` },
148
+ ],
149
+ };
150
+ }
151
+ try {
152
+ const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {
153
+ method: "POST",
154
+ headers: { "Content-Type": "application/json" },
155
+ body: JSON.stringify({
156
+ jsonrpc: "2.0",
157
+ method: "tasks/get",
158
+ id: crypto.randomUUID(),
159
+ params: { id: params.taskId },
160
+ }),
161
+ });
162
+ const data = (await response.json());
163
+ if (data.error) {
164
+ return {
165
+ content: [
166
+ { type: "text", text: `Error: ${data.error.message}` },
167
+ ],
168
+ };
169
+ }
170
+ const task = data.result;
171
+ return {
172
+ content: [
173
+ {
174
+ type: "text",
175
+ text: [
176
+ `**Task:** ${task.id}`,
177
+ `**Status:** ${task.status.state}`,
178
+ `**Updated:** ${task.status.timestamp}`,
179
+ task.artifacts?.length
180
+ ? `**Artifacts:** ${task.artifacts.length}`
181
+ : "",
182
+ ]
183
+ .filter(Boolean)
184
+ .join("\n"),
185
+ },
186
+ ],
187
+ };
188
+ }
189
+ catch (err) {
190
+ const msg = err instanceof Error ? err.message : String(err);
191
+ return {
192
+ content: [{ type: "text", text: `Error: ${msg}` }],
193
+ };
194
+ }
195
+ },
196
+ });
197
+ // Gateway RPC method
198
+ api.registerGatewayMethod("a2a.status", ({ respond }) => {
199
+ respond(true, {
200
+ agent: pluginConfig.agentName,
201
+ port: pluginConfig.port,
202
+ peers: Object.keys(pluginConfig.peers),
203
+ protocol: "a2a",
204
+ version: "0.3.0",
205
+ });
206
+ });
207
+ // CLI command
208
+ api.registerCli(({ program }) => {
209
+ const cmd = program.command("a2a").description("A2A protocol tools");
210
+ cmd
211
+ .command("status")
212
+ .description("Show A2A agent status")
213
+ .action(async () => {
214
+ console.log(`Agent: ${pluginConfig.agentName}`);
215
+ console.log(`Port: ${pluginConfig.port}`);
216
+ console.log(`Peers: ${Object.keys(pluginConfig.peers).join(", ")}`);
217
+ });
218
+ cmd
219
+ .command("discover")
220
+ .description("Discover peer agents")
221
+ .action(async () => {
222
+ const peers = await server.discoverPeers();
223
+ for (const [name, info] of Object.entries(peers)) {
224
+ console.log(`${name}: ${info.status}${info.card ? ` — ${info.card.description}` : ""}`);
225
+ }
226
+ });
227
+ cmd
228
+ .command("send <target> <message>")
229
+ .description("Send a task to a peer agent")
230
+ .action(async (target, message) => {
231
+ const result = await server.sendTask(target, message);
232
+ console.log(JSON.stringify(result, null, 2));
233
+ });
234
+ }, { commands: ["perkos-a2a"] });
235
+ }
236
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * A2A Protocol Server
3
+ * Express-based JSON-RPC 2.0 server with Agent Card discovery
4
+ */
5
+ import express from "express";
6
+ import type { AgentCard, JsonRpcResponse, A2APluginConfig } from "./types.js";
7
+ export declare class A2AServer {
8
+ private app;
9
+ private tasks;
10
+ private agentCard;
11
+ private config;
12
+ private logger;
13
+ constructor(config: A2APluginConfig, logger?: {
14
+ info: (...args: unknown[]) => void;
15
+ error: (...args: unknown[]) => void;
16
+ });
17
+ private setupRoutes;
18
+ private handleSendMessage;
19
+ private processTask;
20
+ private handleGetTask;
21
+ private handleListTasks;
22
+ private handleCancelTask;
23
+ /** Send a task to a peer agent via A2A protocol */
24
+ sendTask(targetAgent: string, messageText: string): Promise<JsonRpcResponse>;
25
+ /** Discover all peer agents */
26
+ discoverPeers(): Promise<Record<string, {
27
+ status: string;
28
+ card?: AgentCard;
29
+ }>>;
30
+ private success;
31
+ private error;
32
+ start(): void;
33
+ private tryListen;
34
+ getExpressApp(): express.Express;
35
+ }
36
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,OAAO,KAAK,EACV,SAAS,EAGT,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,qBAAa,SAAS;IACpB,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAA8E;gBAG1F,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE;IAsBtF,OAAO,CAAC,WAAW;YAgFL,iBAAiB;YA+BjB,WAAW;IA4DzB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,gBAAgB;IAaxB,mDAAmD;IAC7C,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC;IAgC3B,+BAA+B;IACzB,aAAa,IAAI,OAAO,CAC5B,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC,CACrD;IAeD,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIb,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,SAAS;IA2BjB,aAAa,IAAI,OAAO,CAAC,OAAO;CAGjC"}
package/dist/server.js ADDED
@@ -0,0 +1,287 @@
1
+ /**
2
+ * A2A Protocol Server
3
+ * Express-based JSON-RPC 2.0 server with Agent Card discovery
4
+ */
5
+ import express from "express";
6
+ import { randomUUID } from "crypto";
7
+ import { homedir } from "os";
8
+ export class A2AServer {
9
+ app;
10
+ tasks = new Map();
11
+ agentCard;
12
+ config;
13
+ logger;
14
+ constructor(config, logger) {
15
+ this.config = config;
16
+ this.logger = logger || { info: console.log, error: console.error };
17
+ this.app = express();
18
+ this.app.use(express.json());
19
+ this.agentCard = {
20
+ name: config.agentName,
21
+ description: `PerkOS agent: ${config.agentName}`,
22
+ protocolVersion: "0.3.0",
23
+ version: "1.0.0",
24
+ url: `http://localhost:${config.port}/a2a/jsonrpc`,
25
+ skills: config.skills || [],
26
+ capabilities: { pushNotifications: false },
27
+ defaultInputModes: ["text"],
28
+ defaultOutputModes: ["text"],
29
+ };
30
+ this.setupRoutes();
31
+ }
32
+ setupRoutes() {
33
+ // Agent Card discovery
34
+ this.app.get("/.well-known/agent-card.json", (_req, res) => {
35
+ res.json(this.agentCard);
36
+ });
37
+ // Health check
38
+ this.app.get("/health", (_req, res) => {
39
+ res.json({
40
+ ok: true,
41
+ agent: this.config.agentName,
42
+ protocol: "a2a",
43
+ version: "0.3.0",
44
+ peers: Object.keys(this.config.peers),
45
+ taskCount: this.tasks.size,
46
+ });
47
+ });
48
+ // JSON-RPC 2.0 endpoint
49
+ this.app.post("/a2a/jsonrpc", async (req, res) => {
50
+ const { method, params, id } = req.body;
51
+ try {
52
+ let result;
53
+ switch (method) {
54
+ case "message/send":
55
+ result = await this.handleSendMessage(params, id);
56
+ break;
57
+ case "tasks/get":
58
+ result = this.handleGetTask(params, id);
59
+ break;
60
+ case "tasks/list":
61
+ result = this.handleListTasks(id);
62
+ break;
63
+ case "tasks/cancel":
64
+ result = this.handleCancelTask(params, id);
65
+ break;
66
+ case "agent/card":
67
+ result = this.success(id, this.agentCard);
68
+ break;
69
+ default:
70
+ result = this.error(id, -32601, `Method not found: ${method}`);
71
+ }
72
+ res.json(result);
73
+ }
74
+ catch (err) {
75
+ const msg = err instanceof Error ? err.message : String(err);
76
+ this.logger.error(`[a2a] RPC error: ${msg}`);
77
+ res.json(this.error(id, -32603, msg));
78
+ }
79
+ });
80
+ // Peer discovery
81
+ this.app.get("/a2a/peers", async (_req, res) => {
82
+ const results = {};
83
+ for (const [name, url] of Object.entries(this.config.peers)) {
84
+ try {
85
+ const r = await fetch(`${url}/.well-known/agent-card.json`, {
86
+ signal: AbortSignal.timeout(3000),
87
+ });
88
+ results[name] = { status: "online", card: await r.json() };
89
+ }
90
+ catch {
91
+ results[name] = { status: "offline" };
92
+ }
93
+ }
94
+ res.json(results);
95
+ });
96
+ // Send task to peer (REST convenience)
97
+ this.app.post("/a2a/send", async (req, res) => {
98
+ const { target, message } = req.body;
99
+ try {
100
+ const result = await this.sendTask(target, message);
101
+ res.json({ ok: true, result });
102
+ }
103
+ catch (err) {
104
+ const msg = err instanceof Error ? err.message : String(err);
105
+ res.status(500).json({ ok: false, error: msg });
106
+ }
107
+ });
108
+ }
109
+ async handleSendMessage(params, rpcId) {
110
+ const message = params.message;
111
+ const taskId = randomUUID();
112
+ const contextId = message?.contextId || randomUUID();
113
+ const task = {
114
+ kind: "task",
115
+ id: taskId,
116
+ contextId,
117
+ status: { state: "submitted", timestamp: new Date().toISOString() },
118
+ messages: [message],
119
+ artifacts: [],
120
+ metadata: {
121
+ fromAgent: message?.metadata?.fromAgent || "unknown",
122
+ },
123
+ };
124
+ this.tasks.set(taskId, task);
125
+ this.logger.info(`[a2a] Task ${taskId} received from ${task.metadata?.fromAgent}`);
126
+ // Process asynchronously
127
+ this.processTask(task);
128
+ return this.success(rpcId, task);
129
+ }
130
+ async processTask(task) {
131
+ task.status = { state: "working", timestamp: new Date().toISOString() };
132
+ const textParts = task.messages
133
+ .flatMap((m) => m.parts || [])
134
+ .filter((p) => p.kind === "text")
135
+ .map((p) => p.text)
136
+ .join("\n");
137
+ // Write task to workspace for OpenClaw agent to process
138
+ try {
139
+ const fs = await import("fs");
140
+ const taskDir = this.config.workspacePath
141
+ || `${process.env.HOME || homedir()}/.openclaw/workspace/memory`;
142
+ if (!fs.existsSync(taskDir)) {
143
+ fs.mkdirSync(taskDir, { recursive: true });
144
+ }
145
+ const taskFile = `${taskDir}/a2a-task-${task.id}.md`;
146
+ const content = [
147
+ "# A2A Task",
148
+ "",
149
+ `**From:** ${task.metadata?.fromAgent}`,
150
+ `**Task ID:** ${task.id}`,
151
+ `**Time:** ${new Date().toISOString()}`,
152
+ "",
153
+ "## Message",
154
+ "",
155
+ textParts,
156
+ "",
157
+ ].join("\n");
158
+ fs.writeFileSync(taskFile, content);
159
+ task.artifacts.push({
160
+ kind: "artifact",
161
+ artifactId: randomUUID(),
162
+ parts: [{ kind: "text", text: `Task queued: ${taskFile}` }],
163
+ });
164
+ task.status = {
165
+ state: "completed",
166
+ timestamp: new Date().toISOString(),
167
+ };
168
+ this.logger.info(`[a2a] Task ${task.id} completed`);
169
+ }
170
+ catch (err) {
171
+ const msg = err instanceof Error ? err.message : String(err);
172
+ task.status = {
173
+ state: "failed",
174
+ timestamp: new Date().toISOString(),
175
+ message: {
176
+ role: "agent",
177
+ parts: [{ kind: "text", text: msg }],
178
+ },
179
+ };
180
+ this.logger.error(`[a2a] Task ${task.id} failed: ${msg}`);
181
+ }
182
+ }
183
+ handleGetTask(params, rpcId) {
184
+ const task = this.tasks.get(params?.id);
185
+ if (!task)
186
+ return this.error(rpcId, 404, "Task not found");
187
+ return this.success(rpcId, task);
188
+ }
189
+ handleListTasks(rpcId) {
190
+ const allTasks = Array.from(this.tasks.values()).sort((a, b) => new Date(b.status.timestamp).getTime() -
191
+ new Date(a.status.timestamp).getTime());
192
+ return this.success(rpcId, { tasks: allTasks, nextPageToken: "" });
193
+ }
194
+ handleCancelTask(params, rpcId) {
195
+ const task = this.tasks.get(params?.id);
196
+ if (!task)
197
+ return this.error(rpcId, 404, "Task not found");
198
+ if (["completed", "failed", "canceled"].includes(task.status.state)) {
199
+ return this.error(rpcId, 409, "Task not cancelable");
200
+ }
201
+ task.status = { state: "canceled", timestamp: new Date().toISOString() };
202
+ return this.success(rpcId, task);
203
+ }
204
+ /** Send a task to a peer agent via A2A protocol */
205
+ async sendTask(targetAgent, messageText) {
206
+ const targetUrl = this.config.peers[targetAgent];
207
+ if (!targetUrl) {
208
+ throw new Error(`Unknown peer: ${targetAgent}. Known peers: ${Object.keys(this.config.peers).join(", ")}`);
209
+ }
210
+ const payload = {
211
+ jsonrpc: "2.0",
212
+ method: "message/send",
213
+ id: randomUUID(),
214
+ params: {
215
+ message: {
216
+ kind: "message",
217
+ messageId: randomUUID(),
218
+ role: "user",
219
+ parts: [{ kind: "text", text: messageText }],
220
+ metadata: { fromAgent: this.config.agentName },
221
+ },
222
+ },
223
+ };
224
+ const response = await fetch(`${targetUrl}/a2a/jsonrpc`, {
225
+ method: "POST",
226
+ headers: { "Content-Type": "application/json" },
227
+ body: JSON.stringify(payload),
228
+ });
229
+ return (await response.json());
230
+ }
231
+ /** Discover all peer agents */
232
+ async discoverPeers() {
233
+ const results = {};
234
+ for (const [name, url] of Object.entries(this.config.peers)) {
235
+ try {
236
+ const r = await fetch(`${url}/.well-known/agent-card.json`, {
237
+ signal: AbortSignal.timeout(3000),
238
+ });
239
+ results[name] = { status: "online", card: (await r.json()) };
240
+ }
241
+ catch {
242
+ results[name] = { status: "offline" };
243
+ }
244
+ }
245
+ return results;
246
+ }
247
+ success(id, result) {
248
+ return { jsonrpc: "2.0", id, result };
249
+ }
250
+ error(id, code, message) {
251
+ return { jsonrpc: "2.0", id, error: { code, message } };
252
+ }
253
+ start() {
254
+ this.tryListen(this.config.port);
255
+ }
256
+ tryListen(port, attempt = 1) {
257
+ const maxAttempts = 3;
258
+ try {
259
+ const srv = this.app.listen(port, "0.0.0.0", () => {
260
+ this.logger.info(`[a2a] ${this.config.agentName} server on port ${port}`);
261
+ // Update agent card URL to reflect actual port
262
+ this.agentCard.url = `http://localhost:${port}/a2a/jsonrpc`;
263
+ });
264
+ srv.on("error", (err) => {
265
+ if (err.code === "EADDRINUSE" && attempt < maxAttempts) {
266
+ const nextPort = port + 1;
267
+ this.logger.info(`[a2a] Port ${port} in use, trying ${nextPort}`);
268
+ this.tryListen(nextPort, attempt + 1);
269
+ }
270
+ else if (err.code === "EADDRINUSE") {
271
+ this.logger.error(`[a2a] Ports ${this.config.port}-${port} all in use, giving up`);
272
+ }
273
+ else {
274
+ this.logger.error(`[a2a] Server error: ${err.message}`);
275
+ }
276
+ });
277
+ }
278
+ catch (err) {
279
+ const msg = err instanceof Error ? err.message : String(err);
280
+ this.logger.error(`[a2a] Failed to start server: ${msg}`);
281
+ }
282
+ }
283
+ getExpressApp() {
284
+ return this.app;
285
+ }
286
+ }
287
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /** A2A Protocol types (v0.3.0) */
2
+ export interface AgentCard {
3
+ name: string;
4
+ description: string;
5
+ protocolVersion: string;
6
+ version: string;
7
+ url: string;
8
+ skills: AgentSkill[];
9
+ capabilities: {
10
+ pushNotifications: boolean;
11
+ };
12
+ defaultInputModes: string[];
13
+ defaultOutputModes: string[];
14
+ }
15
+ export interface AgentSkill {
16
+ id: string;
17
+ name: string;
18
+ description: string;
19
+ tags: string[];
20
+ }
21
+ export interface Part {
22
+ kind: "text" | "file" | "data";
23
+ text?: string;
24
+ mimeType?: string;
25
+ data?: unknown;
26
+ }
27
+ export interface Message {
28
+ kind: "message";
29
+ messageId: string;
30
+ role: "user" | "agent";
31
+ parts: Part[];
32
+ contextId?: string;
33
+ metadata?: Record<string, unknown>;
34
+ }
35
+ export interface TaskStatus {
36
+ state: "submitted" | "working" | "completed" | "failed" | "canceled";
37
+ timestamp: string;
38
+ message?: Partial<Message>;
39
+ }
40
+ export interface Artifact {
41
+ kind: "artifact";
42
+ artifactId: string;
43
+ parts: Part[];
44
+ }
45
+ export interface Task {
46
+ kind: "task";
47
+ id: string;
48
+ contextId: string;
49
+ status: TaskStatus;
50
+ messages: Message[];
51
+ artifacts: Artifact[];
52
+ metadata?: Record<string, unknown>;
53
+ }
54
+ export interface JsonRpcRequest {
55
+ jsonrpc: "2.0";
56
+ method: string;
57
+ params: Record<string, unknown>;
58
+ id: string;
59
+ }
60
+ export interface JsonRpcResponse {
61
+ jsonrpc: "2.0";
62
+ id: string;
63
+ result?: unknown;
64
+ error?: {
65
+ code: number;
66
+ message: string;
67
+ };
68
+ }
69
+ export interface PeerConfig {
70
+ [agentName: string]: string;
71
+ }
72
+ export interface A2APluginConfig {
73
+ agentName: string;
74
+ port: number;
75
+ skills: AgentSkill[];
76
+ peers: PeerConfig;
77
+ }
78
+ //# sourceMappingURL=types.d.ts.map