@kernel.chat/kbot 2.22.3 → 2.23.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/a2a.d.ts ADDED
@@ -0,0 +1,131 @@
1
+ import type { Server, IncomingMessage, ServerResponse } from 'node:http';
2
+ /** A2A Agent Card — advertises this agent's capabilities to other agents */
3
+ export interface AgentCard {
4
+ name: string;
5
+ description: string;
6
+ version: string;
7
+ url: string;
8
+ provider: {
9
+ organization: string;
10
+ url: string;
11
+ };
12
+ capabilities: {
13
+ streaming: boolean;
14
+ pushNotifications: boolean;
15
+ stateTransitionHistory: boolean;
16
+ };
17
+ skills: AgentSkill[];
18
+ defaultInputModes: string[];
19
+ defaultOutputModes: string[];
20
+ }
21
+ /** A skill advertised by the agent */
22
+ export interface AgentSkill {
23
+ id: string;
24
+ name: string;
25
+ description: string;
26
+ tags: string[];
27
+ examples?: string[];
28
+ }
29
+ /** A2A Task — represents a unit of work sent between agents */
30
+ export interface A2ATask {
31
+ id: string;
32
+ status: A2ATaskStatus;
33
+ message: A2AMessage;
34
+ result?: A2AMessage;
35
+ history?: A2AMessage[];
36
+ metadata?: Record<string, unknown>;
37
+ createdAt: string;
38
+ }
39
+ /** Task status per A2A lifecycle */
40
+ export interface A2ATaskStatus {
41
+ state: 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';
42
+ message?: string;
43
+ timestamp: string;
44
+ }
45
+ /** A2A message — the content exchanged between agents */
46
+ export interface A2AMessage {
47
+ role: 'user' | 'agent';
48
+ parts: A2APart[];
49
+ }
50
+ /** A2A content part — text, file, or data */
51
+ export type A2APart = {
52
+ type: 'text';
53
+ text: string;
54
+ } | {
55
+ type: 'file';
56
+ file: {
57
+ name: string;
58
+ mimeType: string;
59
+ bytes: string;
60
+ };
61
+ } | {
62
+ type: 'data';
63
+ data: Record<string, unknown>;
64
+ };
65
+ /** Registry entry for a discovered remote agent */
66
+ export interface RemoteAgent {
67
+ url: string;
68
+ card: AgentCard;
69
+ discoveredAt: string;
70
+ lastContactedAt?: string;
71
+ }
72
+ /** Build the Agent Card for this kbot instance */
73
+ export declare function buildAgentCard(endpointUrl?: string): AgentCard;
74
+ export interface A2ARouteOptions {
75
+ /** Port the server is running on (for Agent Card URL) */
76
+ port?: number;
77
+ /** Full endpoint URL override (e.g. https://my-kbot.example.com) */
78
+ endpointUrl?: string;
79
+ /** Bearer token for authentication (optional) */
80
+ token?: string;
81
+ }
82
+ /**
83
+ * Mount A2A protocol routes onto an existing HTTP server's request handler.
84
+ *
85
+ * Returns a request handler that should be called from the server's main
86
+ * request listener. Returns `true` if the request was handled by A2A routes,
87
+ * `false` if it should be passed to the next handler.
88
+ */
89
+ export declare function createA2AHandler(options?: A2ARouteOptions): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
90
+ /**
91
+ * Mount A2A routes onto an existing Node.js HTTP Server.
92
+ *
93
+ * Wraps the server's existing request listeners so A2A endpoints are
94
+ * checked first. Non-A2A requests fall through to the original handler.
95
+ */
96
+ export declare function mountA2ARoutes(server: Server, options?: A2ARouteOptions): void;
97
+ /**
98
+ * Discover a remote A2A agent by fetching its Agent Card.
99
+ *
100
+ * @param url - Base URL of the remote agent (e.g. "http://other-agent:8080")
101
+ * @returns The agent's card, or null if discovery fails
102
+ */
103
+ export declare function discoverAgent(url: string): Promise<AgentCard | null>;
104
+ /**
105
+ * Send a task to a remote A2A agent and wait for the result.
106
+ *
107
+ * @param agentUrl - Base URL of the remote agent
108
+ * @param task - The task text to send
109
+ * @param options - Optional agent hint and metadata
110
+ * @returns The agent's text response, or null if the task failed
111
+ */
112
+ export declare function delegateTask(agentUrl: string, task: string, options?: {
113
+ agent?: string;
114
+ metadata?: Record<string, unknown>;
115
+ }): Promise<{
116
+ text: string;
117
+ metadata: Record<string, unknown>;
118
+ } | null>;
119
+ /**
120
+ * List all discovered remote agents from the local registry.
121
+ */
122
+ export declare function listRemoteAgents(): RemoteAgent[];
123
+ /**
124
+ * Remove a remote agent from the local registry.
125
+ */
126
+ export declare function removeRemoteAgent(url: string): boolean;
127
+ /**
128
+ * Find a remote agent that has a skill matching the given tags.
129
+ */
130
+ export declare function findAgentBySkill(tags: string[]): RemoteAgent | null;
131
+ //# sourceMappingURL=a2a.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.d.ts","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAYxE,4EAA4E;AAC5E,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,OAAO,CAAA;QAClB,iBAAiB,EAAE,OAAO,CAAA;QAC1B,sBAAsB,EAAE,OAAO,CAAA;KAChC,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAA;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,+DAA+D;AAC/D,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,gBAAgB,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;IACvF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,yDAAyD;AACzD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IACtB,KAAK,EAAE,OAAO,EAAE,CAAA;CACjB;AAED,6CAA6C;AAC7C,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAA;AAEnD,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,SAAS,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AA+FD,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CA0B9D;AA4GD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,eAAoB,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CA0G/H;AAaD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CAwBlF;AAqBD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiC1E;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC/D,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAqDrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,EAAE,CAGhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CAanE"}
package/dist/a2a.js ADDED
@@ -0,0 +1,504 @@
1
+ // K:BOT A2A (Agent-to-Agent) Protocol Support
2
+ //
3
+ // Implements Google's Agent2Agent protocol for agent interoperability:
4
+ // - Agent Card: JSON descriptor of kbot's capabilities
5
+ // - A2A Server: HTTP endpoints for receiving tasks from other agents
6
+ // - A2A Client: Discovery and delegation to external A2A agents
7
+ //
8
+ // Spec: https://google.github.io/A2A/
9
+ //
10
+ // Usage:
11
+ // import { mountA2ARoutes } from './a2a.js'
12
+ // mountA2ARoutes(server, { port: 7437 })
13
+ import { createRequire } from 'node:module';
14
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { randomUUID } from 'node:crypto';
18
+ import { runAgent } from './agent.js';
19
+ import { SPECIALISTS } from './agents/specialists.js';
20
+ import { timingSafeEqual } from 'node:crypto';
21
+ // ── Package metadata ──
22
+ const __require = createRequire(import.meta.url);
23
+ const pkg = __require('../package.json');
24
+ // ── Constants ──
25
+ const KBOT_DIR = join(homedir(), '.kbot');
26
+ const REGISTRY_PATH = join(KBOT_DIR, 'a2a-registry.json');
27
+ const DEFAULT_PORT = 7437;
28
+ // ── In-memory task store ──
29
+ const tasks = new Map();
30
+ const MAX_TASKS = 1000;
31
+ const TASK_TTL_MS = 60 * 60 * 1000; // 1 hour
32
+ function pruneTasks() {
33
+ if (tasks.size <= MAX_TASKS)
34
+ return;
35
+ const now = Date.now();
36
+ for (const [id, task] of tasks) {
37
+ if (now - new Date(task.createdAt).getTime() > TASK_TTL_MS)
38
+ tasks.delete(id);
39
+ }
40
+ // If still over limit, drop oldest
41
+ if (tasks.size > MAX_TASKS) {
42
+ const oldest = [...tasks.keys()].slice(0, tasks.size - MAX_TASKS);
43
+ for (const id of oldest)
44
+ tasks.delete(id);
45
+ }
46
+ }
47
+ // ── Skill mapping ──
48
+ /** Map specialist definitions to A2A skills */
49
+ function specialistToSkill(id, def) {
50
+ const tagMap = {
51
+ kernel: ['general', 'assistant', 'coordination'],
52
+ researcher: ['research', 'fact-checking', 'synthesis'],
53
+ coder: ['programming', 'code-generation', 'debugging', 'refactoring'],
54
+ writer: ['writing', 'documentation', 'content-creation'],
55
+ analyst: ['analysis', 'strategy', 'evaluation'],
56
+ aesthete: ['design', 'ui-ux', 'css', 'accessibility'],
57
+ guardian: ['security', 'vulnerability-scanning', 'owasp'],
58
+ curator: ['knowledge-management', 'documentation', 'indexing'],
59
+ strategist: ['business-strategy', 'roadmapping', 'competitive-analysis'],
60
+ infrastructure: ['devops', 'ci-cd', 'containers', 'cloud'],
61
+ quant: ['data-science', 'statistics', 'quantitative-analysis'],
62
+ investigator: ['deep-research', 'root-cause-analysis', 'forensics'],
63
+ oracle: ['predictions', 'trend-analysis', 'forecasting'],
64
+ chronist: ['history', 'timelines', 'changelog'],
65
+ sage: ['philosophy', 'wisdom', 'mental-models'],
66
+ communicator: ['communication', 'messaging', 'presentations'],
67
+ adapter: ['translation', 'format-conversion', 'migration'],
68
+ };
69
+ return {
70
+ id,
71
+ name: def.name,
72
+ description: def.prompt.split('\n')[0].replace(/^You are (?:an? )?/, ''),
73
+ tags: tagMap[id] || [id],
74
+ };
75
+ }
76
+ /** Additional built-in agent skills (preset agents beyond the 17 specialists) */
77
+ const EXTRA_SKILLS = [
78
+ {
79
+ id: 'hacker',
80
+ name: 'Hacker',
81
+ description: 'Offensive security specialist and CTF solver — red team analysis',
82
+ tags: ['offensive-security', 'penetration-testing', 'ctf'],
83
+ },
84
+ {
85
+ id: 'operator',
86
+ name: 'Operator',
87
+ description: 'Autonomous executor — plans, executes, verifies, and reports',
88
+ tags: ['automation', 'orchestration', 'task-execution'],
89
+ },
90
+ {
91
+ id: 'dreamer',
92
+ name: 'Dreamer',
93
+ description: 'Liminal space explorer — dream interpretation, worldbuilding, vision engineering',
94
+ tags: ['creative', 'worldbuilding', 'imagination'],
95
+ },
96
+ {
97
+ id: 'creative',
98
+ name: 'Creative',
99
+ description: 'Generative art, creative coding, shaders, procedural generation',
100
+ tags: ['generative-art', 'creative-coding', 'shaders', 'music'],
101
+ },
102
+ {
103
+ id: 'developer',
104
+ name: 'Developer',
105
+ description: 'K:BOT self-improvement specialist — builds and extends kbot itself',
106
+ tags: ['kbot', 'self-improvement', 'typescript', 'tooling'],
107
+ },
108
+ ];
109
+ // ── Agent Card ──
110
+ /** Build the Agent Card for this kbot instance */
111
+ export function buildAgentCard(endpointUrl) {
112
+ const url = endpointUrl || `http://localhost:${DEFAULT_PORT}`;
113
+ const skills = [
114
+ ...Object.entries(SPECIALISTS).map(([id, def]) => specialistToSkill(id, def)),
115
+ ...EXTRA_SKILLS,
116
+ ];
117
+ return {
118
+ name: 'kbot',
119
+ description: pkg.description,
120
+ version: pkg.version,
121
+ url,
122
+ provider: {
123
+ organization: 'kernel.chat group',
124
+ url: pkg.homepage,
125
+ },
126
+ capabilities: {
127
+ streaming: true,
128
+ pushNotifications: false,
129
+ stateTransitionHistory: true,
130
+ },
131
+ skills,
132
+ defaultInputModes: ['text/plain', 'application/json'],
133
+ defaultOutputModes: ['text/plain', 'application/json'],
134
+ };
135
+ }
136
+ // ── Task execution ──
137
+ /** Create a new A2A task from an incoming message */
138
+ function createTask(message, metadata) {
139
+ const now = new Date().toISOString();
140
+ const task = {
141
+ id: randomUUID(),
142
+ status: {
143
+ state: 'submitted',
144
+ timestamp: now,
145
+ },
146
+ message,
147
+ history: [],
148
+ metadata,
149
+ createdAt: now,
150
+ };
151
+ pruneTasks();
152
+ tasks.set(task.id, task);
153
+ return task;
154
+ }
155
+ /** Extract plain text from an A2A message */
156
+ function extractText(message) {
157
+ return message.parts
158
+ .filter((p) => p.type === 'text')
159
+ .map(p => p.text)
160
+ .join('\n');
161
+ }
162
+ /** Execute a task through kbot's agent system */
163
+ async function executeTask(task) {
164
+ // Transition to working
165
+ task.status = { state: 'working', timestamp: new Date().toISOString() };
166
+ task.history?.push({ ...task.message });
167
+ const userText = extractText(task.message);
168
+ if (!userText) {
169
+ task.status = { state: 'failed', message: 'No text content in message', timestamp: new Date().toISOString() };
170
+ return task;
171
+ }
172
+ // Determine agent from metadata hint or let router decide
173
+ const agentOptions = {};
174
+ if (task.metadata?.agent && typeof task.metadata.agent === 'string') {
175
+ agentOptions.agent = task.metadata.agent;
176
+ }
177
+ try {
178
+ const response = await runAgent(userText, agentOptions);
179
+ task.result = {
180
+ role: 'agent',
181
+ parts: [{ type: 'text', text: response.content }],
182
+ };
183
+ task.status = { state: 'completed', timestamp: new Date().toISOString() };
184
+ // Include agent metadata in task
185
+ task.metadata = {
186
+ ...task.metadata,
187
+ agentUsed: response.agent,
188
+ model: response.model,
189
+ toolCalls: response.toolCalls,
190
+ usage: response.usage,
191
+ };
192
+ }
193
+ catch (err) {
194
+ task.status = {
195
+ state: 'failed',
196
+ message: err instanceof Error ? err.message : 'Task execution failed',
197
+ timestamp: new Date().toISOString(),
198
+ };
199
+ }
200
+ return task;
201
+ }
202
+ // ── A2A Server ──
203
+ /** HTTP helpers */
204
+ function sendJson(res, status, data) {
205
+ res.setHeader('Access-Control-Allow-Origin', '*');
206
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
207
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
208
+ res.writeHead(status, { 'Content-Type': 'application/json' });
209
+ res.end(JSON.stringify(data));
210
+ }
211
+ const MAX_BODY_SIZE = 1024 * 1024; // 1 MB
212
+ function readBody(req) {
213
+ return new Promise((resolve, reject) => {
214
+ const chunks = [];
215
+ let size = 0;
216
+ req.on('data', (c) => {
217
+ size += c.length;
218
+ if (size > MAX_BODY_SIZE) {
219
+ req.destroy();
220
+ reject(new Error('Request body too large'));
221
+ return;
222
+ }
223
+ chunks.push(c);
224
+ });
225
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
226
+ req.on('error', reject);
227
+ });
228
+ }
229
+ /**
230
+ * Mount A2A protocol routes onto an existing HTTP server's request handler.
231
+ *
232
+ * Returns a request handler that should be called from the server's main
233
+ * request listener. Returns `true` if the request was handled by A2A routes,
234
+ * `false` if it should be passed to the next handler.
235
+ */
236
+ export function createA2AHandler(options = {}) {
237
+ const baseUrl = options.endpointUrl || `http://localhost:${options.port || DEFAULT_PORT}`;
238
+ const card = buildAgentCard(baseUrl);
239
+ return async (req, res) => {
240
+ const url = new URL(req.url || '/', `http://localhost`);
241
+ const path = url.pathname;
242
+ // CORS preflight for A2A routes
243
+ if (req.method === 'OPTIONS' && (path === '/.well-known/agent.json' || path.startsWith('/a2a/'))) {
244
+ res.setHeader('Access-Control-Allow-Origin', '*');
245
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
246
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
247
+ res.writeHead(204);
248
+ res.end();
249
+ return true;
250
+ }
251
+ // Auth check for task endpoints
252
+ if (options.token && path.startsWith('/a2a/')) {
253
+ const auth = req.headers.authorization;
254
+ const bearerToken = auth?.startsWith('Bearer ') ? auth.slice(7) : null;
255
+ const tokenBuf = Buffer.from(options.token);
256
+ const bearerBuf = Buffer.from(bearerToken || '');
257
+ if (tokenBuf.length !== bearerBuf.length || !timingSafeEqual(tokenBuf, bearerBuf)) {
258
+ sendJson(res, 401, { error: 'Unauthorized' });
259
+ return true;
260
+ }
261
+ }
262
+ // GET /.well-known/agent.json — Agent Card discovery
263
+ if (path === '/.well-known/agent.json' && req.method === 'GET') {
264
+ sendJson(res, 200, card);
265
+ return true;
266
+ }
267
+ // POST /a2a/tasks — Submit a new task
268
+ if (path === '/a2a/tasks' && req.method === 'POST') {
269
+ try {
270
+ const body = JSON.parse(await readBody(req));
271
+ if (!body.message || !body.message.parts || !body.message.role) {
272
+ sendJson(res, 400, { error: 'Invalid message format. Expected { message: { role, parts } }' });
273
+ return true;
274
+ }
275
+ const task = createTask(body.message, body.metadata);
276
+ // Check if caller wants synchronous execution
277
+ const sync = url.searchParams.get('sync') === 'true';
278
+ if (sync) {
279
+ // Synchronous: execute and return completed task
280
+ const completed = await executeTask(task);
281
+ sendJson(res, 200, taskToResponse(completed));
282
+ }
283
+ else {
284
+ // Asynchronous: return immediately with submitted status, execute in background
285
+ sendJson(res, 202, taskToResponse(task));
286
+ // Fire and forget — task will be updated in the store
287
+ executeTask(task).catch(() => {
288
+ task.status = { state: 'failed', message: 'Background execution failed', timestamp: new Date().toISOString() };
289
+ });
290
+ }
291
+ }
292
+ catch (err) {
293
+ sendJson(res, 400, { error: err instanceof Error ? err.message : 'Invalid request body' });
294
+ }
295
+ return true;
296
+ }
297
+ // GET /a2a/tasks/:id — Get task status and result
298
+ const taskStatusMatch = path.match(/^\/a2a\/tasks\/([a-f0-9-]+)$/);
299
+ if (taskStatusMatch && req.method === 'GET') {
300
+ const taskId = taskStatusMatch[1];
301
+ const task = tasks.get(taskId);
302
+ if (!task) {
303
+ sendJson(res, 404, { error: 'Task not found' });
304
+ return true;
305
+ }
306
+ sendJson(res, 200, taskToResponse(task));
307
+ return true;
308
+ }
309
+ // POST /a2a/tasks/:id/cancel — Cancel a task
310
+ const taskCancelMatch = path.match(/^\/a2a\/tasks\/([a-f0-9-]+)\/cancel$/);
311
+ if (taskCancelMatch && req.method === 'POST') {
312
+ const taskId = taskCancelMatch[1];
313
+ const task = tasks.get(taskId);
314
+ if (!task) {
315
+ sendJson(res, 404, { error: 'Task not found' });
316
+ return true;
317
+ }
318
+ if (task.status.state === 'completed' || task.status.state === 'failed') {
319
+ sendJson(res, 409, { error: `Cannot cancel task in '${task.status.state}' state` });
320
+ return true;
321
+ }
322
+ task.status = { state: 'canceled', timestamp: new Date().toISOString() };
323
+ sendJson(res, 200, taskToResponse(task));
324
+ return true;
325
+ }
326
+ // Not an A2A route
327
+ return false;
328
+ };
329
+ }
330
+ /** Serialize a task for the A2A response format */
331
+ function taskToResponse(task) {
332
+ return {
333
+ id: task.id,
334
+ status: task.status,
335
+ result: task.result || null,
336
+ history: task.history || [],
337
+ metadata: task.metadata || {},
338
+ };
339
+ }
340
+ /**
341
+ * Mount A2A routes onto an existing Node.js HTTP Server.
342
+ *
343
+ * Wraps the server's existing request listeners so A2A endpoints are
344
+ * checked first. Non-A2A requests fall through to the original handler.
345
+ */
346
+ export function mountA2ARoutes(server, options = {}) {
347
+ const a2aHandler = createA2AHandler(options);
348
+ // Capture existing listeners
349
+ const existingListeners = server.listeners('request');
350
+ server.removeAllListeners('request');
351
+ // Install composite handler: A2A first, then original
352
+ server.on('request', async (req, res) => {
353
+ try {
354
+ const handled = await a2aHandler(req, res);
355
+ if (handled)
356
+ return;
357
+ }
358
+ catch (err) {
359
+ sendJson(res, 500, { error: err instanceof Error ? err.message : 'A2A internal error' });
360
+ return;
361
+ }
362
+ // Fall through to original handlers
363
+ for (const listener of existingListeners) {
364
+ listener(req, res);
365
+ }
366
+ });
367
+ }
368
+ // ── A2A Client ──
369
+ /** Load the agent registry from disk */
370
+ function loadRegistry() {
371
+ try {
372
+ if (!existsSync(REGISTRY_PATH))
373
+ return {};
374
+ const raw = readFileSync(REGISTRY_PATH, 'utf-8');
375
+ return JSON.parse(raw);
376
+ }
377
+ catch {
378
+ return {};
379
+ }
380
+ }
381
+ /** Save the agent registry to disk */
382
+ function saveRegistry(registry) {
383
+ if (!existsSync(KBOT_DIR))
384
+ mkdirSync(KBOT_DIR, { recursive: true });
385
+ writeFileSync(REGISTRY_PATH, JSON.stringify(registry, null, 2));
386
+ }
387
+ /**
388
+ * Discover a remote A2A agent by fetching its Agent Card.
389
+ *
390
+ * @param url - Base URL of the remote agent (e.g. "http://other-agent:8080")
391
+ * @returns The agent's card, or null if discovery fails
392
+ */
393
+ export async function discoverAgent(url) {
394
+ const cardUrl = url.replace(/\/$/, '') + '/.well-known/agent.json';
395
+ try {
396
+ const response = await fetch(cardUrl, {
397
+ headers: { 'Accept': 'application/json' },
398
+ signal: AbortSignal.timeout(10_000),
399
+ });
400
+ if (!response.ok) {
401
+ return null;
402
+ }
403
+ const card = await response.json();
404
+ // Validate minimum required fields
405
+ if (!card.name || !card.url || !card.skills) {
406
+ return null;
407
+ }
408
+ // Register in local registry
409
+ const registry = loadRegistry();
410
+ registry[url] = {
411
+ url,
412
+ card,
413
+ discoveredAt: new Date().toISOString(),
414
+ };
415
+ saveRegistry(registry);
416
+ return card;
417
+ }
418
+ catch {
419
+ return null;
420
+ }
421
+ }
422
+ /**
423
+ * Send a task to a remote A2A agent and wait for the result.
424
+ *
425
+ * @param agentUrl - Base URL of the remote agent
426
+ * @param task - The task text to send
427
+ * @param options - Optional agent hint and metadata
428
+ * @returns The agent's text response, or null if the task failed
429
+ */
430
+ export async function delegateTask(agentUrl, task, options) {
431
+ const taskUrl = agentUrl.replace(/\/$/, '') + '/a2a/tasks?sync=true';
432
+ try {
433
+ const body = {
434
+ message: {
435
+ role: 'user',
436
+ parts: [{ type: 'text', text: task }],
437
+ },
438
+ };
439
+ if (options?.agent || options?.metadata) {
440
+ body.metadata = { ...options?.metadata, agent: options?.agent };
441
+ }
442
+ const response = await fetch(taskUrl, {
443
+ method: 'POST',
444
+ headers: { 'Content-Type': 'application/json' },
445
+ body: JSON.stringify(body),
446
+ signal: AbortSignal.timeout(120_000), // 2 minute timeout for task execution
447
+ });
448
+ if (!response.ok) {
449
+ return null;
450
+ }
451
+ const result = await response.json();
452
+ if (result.status.state !== 'completed' || !result.result) {
453
+ return null;
454
+ }
455
+ const text = result.result.parts
456
+ .filter((p) => p.type === 'text')
457
+ .map(p => p.text)
458
+ .join('\n');
459
+ // Update last contact time in registry
460
+ const registry = loadRegistry();
461
+ if (registry[agentUrl]) {
462
+ registry[agentUrl].lastContactedAt = new Date().toISOString();
463
+ saveRegistry(registry);
464
+ }
465
+ return { text, metadata: result.metadata || {} };
466
+ }
467
+ catch {
468
+ return null;
469
+ }
470
+ }
471
+ /**
472
+ * List all discovered remote agents from the local registry.
473
+ */
474
+ export function listRemoteAgents() {
475
+ const registry = loadRegistry();
476
+ return Object.values(registry);
477
+ }
478
+ /**
479
+ * Remove a remote agent from the local registry.
480
+ */
481
+ export function removeRemoteAgent(url) {
482
+ const registry = loadRegistry();
483
+ if (!registry[url])
484
+ return false;
485
+ delete registry[url];
486
+ saveRegistry(registry);
487
+ return true;
488
+ }
489
+ /**
490
+ * Find a remote agent that has a skill matching the given tags.
491
+ */
492
+ export function findAgentBySkill(tags) {
493
+ const registry = loadRegistry();
494
+ const tagSet = new Set(tags.map(t => t.toLowerCase()));
495
+ for (const agent of Object.values(registry)) {
496
+ for (const skill of agent.card.skills) {
497
+ if (skill.tags.some(t => tagSet.has(t.toLowerCase()))) {
498
+ return agent;
499
+ }
500
+ }
501
+ }
502
+ return null;
503
+ }
504
+ //# sourceMappingURL=a2a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a.js","sourceRoot":"","sources":["../src/a2a.ts"],"names":[],"mappings":"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"}