noumen 0.1.0 → 0.2.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.
Files changed (118) hide show
  1. package/README.md +767 -51
  2. package/dist/a2a/index.d.ts +148 -0
  3. package/dist/a2a/index.js +579 -0
  4. package/dist/a2a/index.js.map +1 -0
  5. package/dist/acp/index.d.ts +129 -0
  6. package/dist/acp/index.js +498 -0
  7. package/dist/acp/index.js.map +1 -0
  8. package/dist/agent-BrkbZyOT.d.ts +1028 -0
  9. package/dist/cache-DVqaCX8v.d.ts +38 -0
  10. package/dist/chunk-2ZTGQLYK.js +356 -0
  11. package/dist/chunk-2ZTGQLYK.js.map +1 -0
  12. package/dist/chunk-42PHHZUA.js +132 -0
  13. package/dist/chunk-42PHHZUA.js.map +1 -0
  14. package/dist/chunk-4SQA2UCV.js +26 -0
  15. package/dist/chunk-4SQA2UCV.js.map +1 -0
  16. package/dist/chunk-5GEX6ZSB.js +179 -0
  17. package/dist/chunk-5GEX6ZSB.js.map +1 -0
  18. package/dist/chunk-7ZMN7XJE.js +94 -0
  19. package/dist/chunk-7ZMN7XJE.js.map +1 -0
  20. package/dist/chunk-AMYIJSAZ.js +57 -0
  21. package/dist/chunk-AMYIJSAZ.js.map +1 -0
  22. package/dist/chunk-BGG2E6JD.js +10 -0
  23. package/dist/chunk-BGG2E6JD.js.map +1 -0
  24. package/dist/chunk-BZSFUEWM.js +43 -0
  25. package/dist/chunk-BZSFUEWM.js.map +1 -0
  26. package/dist/chunk-CPFHEPW4.js +139 -0
  27. package/dist/chunk-CPFHEPW4.js.map +1 -0
  28. package/dist/chunk-D43BWEZA.js +346 -0
  29. package/dist/chunk-D43BWEZA.js.map +1 -0
  30. package/dist/chunk-DGUM43GV.js +11 -0
  31. package/dist/chunk-DGUM43GV.js.map +1 -0
  32. package/dist/chunk-JACGEMTF.js +43 -0
  33. package/dist/chunk-JACGEMTF.js.map +1 -0
  34. package/dist/chunk-JX7CLUCV.js +21 -0
  35. package/dist/chunk-JX7CLUCV.js.map +1 -0
  36. package/dist/chunk-KXDB56YW.js +39 -0
  37. package/dist/chunk-KXDB56YW.js.map +1 -0
  38. package/dist/chunk-KY6ZPWHO.js +112 -0
  39. package/dist/chunk-KY6ZPWHO.js.map +1 -0
  40. package/dist/chunk-NBDFQYUZ.js +7992 -0
  41. package/dist/chunk-NBDFQYUZ.js.map +1 -0
  42. package/dist/chunk-OGXNFXFA.js +196 -0
  43. package/dist/chunk-OGXNFXFA.js.map +1 -0
  44. package/dist/chunk-QTJ7VTJY.js +1994 -0
  45. package/dist/chunk-QTJ7VTJY.js.map +1 -0
  46. package/dist/chunk-UVSSQBDY.js +192 -0
  47. package/dist/chunk-UVSSQBDY.js.map +1 -0
  48. package/dist/chunk-Y45R3PQL.js +684 -0
  49. package/dist/chunk-Y45R3PQL.js.map +1 -0
  50. package/dist/cli/index.d.ts +1 -0
  51. package/dist/cli/index.js +868 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/client/index.d.ts +64 -0
  54. package/dist/client/index.js +409 -0
  55. package/dist/client/index.js.map +1 -0
  56. package/dist/client-CRRO2376.js +10 -0
  57. package/dist/client-CRRO2376.js.map +1 -0
  58. package/dist/headless-Q7XHHZIW.js +143 -0
  59. package/dist/headless-Q7XHHZIW.js.map +1 -0
  60. package/dist/history-snip-64GYP4ZL.js +12 -0
  61. package/dist/history-snip-64GYP4ZL.js.map +1 -0
  62. package/dist/index.d.ts +1305 -418
  63. package/dist/index.js +384 -1757
  64. package/dist/index.js.map +1 -1
  65. package/dist/jsonrpc/index.d.ts +54 -0
  66. package/dist/jsonrpc/index.js +34 -0
  67. package/dist/jsonrpc/index.js.map +1 -0
  68. package/dist/lsp/index.d.ts +36 -0
  69. package/dist/lsp/index.js +16 -0
  70. package/dist/lsp/index.js.map +1 -0
  71. package/dist/lsp-PS3BWIHC.js +8 -0
  72. package/dist/lsp-PS3BWIHC.js.map +1 -0
  73. package/dist/manager-DLXK63XC.js +8 -0
  74. package/dist/manager-DLXK63XC.js.map +1 -0
  75. package/dist/mcp/index.d.ts +111 -0
  76. package/dist/mcp/index.js +104 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp-auth-AEI2R4ZC.js +9 -0
  79. package/dist/mcp-auth-AEI2R4ZC.js.map +1 -0
  80. package/dist/ollama-YNXAYP3R.js +18 -0
  81. package/dist/ollama-YNXAYP3R.js.map +1 -0
  82. package/dist/provider-factory-34MSWJZ3.js +20 -0
  83. package/dist/provider-factory-34MSWJZ3.js.map +1 -0
  84. package/dist/providers/anthropic.d.ts +19 -0
  85. package/dist/providers/anthropic.js +33 -0
  86. package/dist/providers/anthropic.js.map +1 -0
  87. package/dist/providers/bedrock.d.ts +39 -0
  88. package/dist/providers/bedrock.js +54 -0
  89. package/dist/providers/bedrock.js.map +1 -0
  90. package/dist/providers/gemini.d.ts +16 -0
  91. package/dist/providers/gemini.js +224 -0
  92. package/dist/providers/gemini.js.map +1 -0
  93. package/dist/providers/openai.d.ts +18 -0
  94. package/dist/providers/openai.js +8 -0
  95. package/dist/providers/openai.js.map +1 -0
  96. package/dist/providers/openrouter.d.ts +16 -0
  97. package/dist/providers/openrouter.js +23 -0
  98. package/dist/providers/openrouter.js.map +1 -0
  99. package/dist/providers/vertex.d.ts +40 -0
  100. package/dist/providers/vertex.js +64 -0
  101. package/dist/providers/vertex.js.map +1 -0
  102. package/dist/render-GRN4ZSSW.js +14 -0
  103. package/dist/render-GRN4ZSSW.js.map +1 -0
  104. package/dist/resolve-XM52G7YE.js +14 -0
  105. package/dist/resolve-XM52G7YE.js.map +1 -0
  106. package/dist/server/index.d.ts +128 -0
  107. package/dist/server/index.js +626 -0
  108. package/dist/server/index.js.map +1 -0
  109. package/dist/server-Cg1yWGaV.d.ts +96 -0
  110. package/dist/spinner-OJNR6NFO.js +8 -0
  111. package/dist/spinner-OJNR6NFO.js.map +1 -0
  112. package/dist/types-2kTLUCnD.d.ts +107 -0
  113. package/dist/types-3c88cRKH.d.ts +547 -0
  114. package/dist/types-CwKKucOF.d.ts +620 -0
  115. package/dist/types-DwdzmXfs.d.ts +107 -0
  116. package/dist/types-NIyVwQ4h.d.ts +109 -0
  117. package/dist/types-QwfylltH.d.ts +71 -0
  118. package/package.json +134 -6
@@ -0,0 +1,579 @@
1
+ import {
2
+ generateUUID
3
+ } from "../chunk-BGG2E6JD.js";
4
+ import {
5
+ INTERNAL_ERROR,
6
+ INVALID_PARAMS,
7
+ METHOD_NOT_FOUND,
8
+ PARSE_ERROR,
9
+ formatError,
10
+ formatRequest,
11
+ formatResponse,
12
+ isRequest,
13
+ parseMessage
14
+ } from "../chunk-AMYIJSAZ.js";
15
+ import "../chunk-JACGEMTF.js";
16
+ import "../chunk-DGUM43GV.js";
17
+
18
+ // src/a2a/server.ts
19
+ import { createServer } from "http";
20
+
21
+ // src/a2a/types.ts
22
+ var A2A_METHODS = {
23
+ TASKS_SEND: "tasks/send",
24
+ TASKS_SEND_SUBSCRIBE: "tasks/sendSubscribe",
25
+ TASKS_GET: "tasks/get",
26
+ TASKS_CANCEL: "tasks/cancel",
27
+ TASKS_PUSH_NOTIFICATION: "tasks/pushNotification",
28
+ TASKS_RESUBSCRIBE: "tasks/resubscribe"
29
+ };
30
+
31
+ // src/a2a/task-manager.ts
32
+ var TaskManager = class {
33
+ tasks = /* @__PURE__ */ new Map();
34
+ code;
35
+ constructor(code) {
36
+ this.code = code;
37
+ }
38
+ /**
39
+ * Create a task, start running it, and return the task immediately.
40
+ * Use `getTask` to poll status or `streamTask` for SSE.
41
+ */
42
+ async sendTask(params) {
43
+ const taskId = params.id ?? generateUUID();
44
+ const thread = this.code.createThread({
45
+ sessionId: params.sessionId
46
+ });
47
+ const task = {
48
+ id: taskId,
49
+ sessionId: thread.sessionId,
50
+ status: { state: "submitted", timestamp: (/* @__PURE__ */ new Date()).toISOString() },
51
+ history: [params.message],
52
+ artifacts: []
53
+ };
54
+ const abortController = new AbortController();
55
+ this.tasks.set(taskId, { task, thread, abortController });
56
+ const prompt = this.messageToPrompt(params.message);
57
+ this.runTask(taskId, prompt);
58
+ return task;
59
+ }
60
+ /**
61
+ * Stream task events as an async generator (for SSE).
62
+ */
63
+ async *sendTaskSubscribe(params) {
64
+ const taskId = params.id ?? generateUUID();
65
+ const thread = this.code.createThread({
66
+ sessionId: params.sessionId
67
+ });
68
+ const task = {
69
+ id: taskId,
70
+ sessionId: thread.sessionId,
71
+ status: { state: "submitted", timestamp: (/* @__PURE__ */ new Date()).toISOString() },
72
+ history: [params.message],
73
+ artifacts: []
74
+ };
75
+ const abortController = new AbortController();
76
+ this.tasks.set(taskId, { task, thread, abortController });
77
+ yield {
78
+ type: "status",
79
+ taskId,
80
+ status: task.status,
81
+ final: false
82
+ };
83
+ task.status = { state: "working", timestamp: (/* @__PURE__ */ new Date()).toISOString() };
84
+ yield {
85
+ type: "status",
86
+ taskId,
87
+ status: task.status,
88
+ final: false
89
+ };
90
+ const prompt = this.messageToPrompt(params.message);
91
+ const textParts = [];
92
+ try {
93
+ for await (const event of thread.run(prompt, {
94
+ signal: abortController.signal
95
+ })) {
96
+ const streamEvent = this.mapStreamEvent(taskId, task, event, textParts);
97
+ if (streamEvent) yield streamEvent;
98
+ }
99
+ if (textParts.length > 0) {
100
+ const artifact = {
101
+ name: "response",
102
+ parts: [{ type: "text", text: textParts.join("") }],
103
+ lastChunk: true
104
+ };
105
+ task.artifacts = [artifact];
106
+ yield { type: "artifact", taskId, artifact };
107
+ }
108
+ task.status = { state: "completed", timestamp: (/* @__PURE__ */ new Date()).toISOString() };
109
+ yield { type: "status", taskId, status: task.status, final: true };
110
+ } catch (err) {
111
+ task.status = {
112
+ state: "failed",
113
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
114
+ message: {
115
+ role: "agent",
116
+ parts: [
117
+ {
118
+ type: "text",
119
+ text: err instanceof Error ? err.message : String(err)
120
+ }
121
+ ]
122
+ }
123
+ };
124
+ yield { type: "status", taskId, status: task.status, final: true };
125
+ }
126
+ }
127
+ getTask(taskId) {
128
+ return this.tasks.get(taskId)?.task ?? null;
129
+ }
130
+ cancelTask(taskId) {
131
+ const managed = this.tasks.get(taskId);
132
+ if (!managed) return false;
133
+ managed.abortController.abort();
134
+ managed.task.status = {
135
+ state: "canceled",
136
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
137
+ };
138
+ return true;
139
+ }
140
+ async runTask(taskId, prompt) {
141
+ const managed = this.tasks.get(taskId);
142
+ if (!managed) return;
143
+ managed.task.status = {
144
+ state: "working",
145
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
146
+ };
147
+ try {
148
+ const textParts = [];
149
+ for await (const event of managed.thread.run(prompt, {
150
+ signal: managed.abortController.signal
151
+ })) {
152
+ if (event.type === "text_delta") {
153
+ textParts.push(event.text);
154
+ }
155
+ if (event.type === "user_input_request") {
156
+ managed.task.status = {
157
+ state: "input-required",
158
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
159
+ };
160
+ }
161
+ }
162
+ if (textParts.length > 0) {
163
+ managed.task.artifacts = [
164
+ {
165
+ name: "response",
166
+ parts: [{ type: "text", text: textParts.join("") }],
167
+ lastChunk: true
168
+ }
169
+ ];
170
+ }
171
+ managed.task.status = {
172
+ state: "completed",
173
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
174
+ };
175
+ } catch (err) {
176
+ managed.task.status = {
177
+ state: "failed",
178
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
179
+ message: {
180
+ role: "agent",
181
+ parts: [
182
+ {
183
+ type: "text",
184
+ text: err instanceof Error ? err.message : String(err)
185
+ }
186
+ ]
187
+ }
188
+ };
189
+ }
190
+ }
191
+ mapStreamEvent(taskId, task, event, textParts) {
192
+ switch (event.type) {
193
+ case "text_delta":
194
+ textParts.push(event.text);
195
+ return null;
196
+ // Text accumulates into artifact at end
197
+ case "user_input_request":
198
+ task.status = {
199
+ state: "input-required",
200
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
201
+ };
202
+ return {
203
+ type: "status",
204
+ taskId,
205
+ status: task.status,
206
+ final: false
207
+ };
208
+ case "error":
209
+ task.status = {
210
+ state: "failed",
211
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
212
+ message: {
213
+ role: "agent",
214
+ parts: [{ type: "text", text: event.error.message }]
215
+ }
216
+ };
217
+ return {
218
+ type: "status",
219
+ taskId,
220
+ status: task.status,
221
+ final: true
222
+ };
223
+ default:
224
+ return null;
225
+ }
226
+ }
227
+ messageToPrompt(message) {
228
+ return message.parts.filter((p) => p.type === "text").map((p) => p.text).join("\n");
229
+ }
230
+ };
231
+
232
+ // src/a2a/agent-card.ts
233
+ function buildAgentCard(options) {
234
+ return {
235
+ name: options.name,
236
+ description: options.description ?? "A noumen-powered AI coding agent",
237
+ url: options.url,
238
+ version: options.version ?? "0.1.0",
239
+ provider: options.provider,
240
+ capabilities: {
241
+ streaming: options.streaming ?? true,
242
+ pushNotifications: false,
243
+ stateTransitionHistory: true
244
+ },
245
+ authentication: options.authentication,
246
+ defaultInputModes: ["text"],
247
+ defaultOutputModes: ["text"],
248
+ skills: options.skills ?? [
249
+ {
250
+ id: "coding",
251
+ name: "Code Generation & Editing",
252
+ description: "Read, write, and edit code files with full tool access",
253
+ tags: ["coding", "files", "shell"]
254
+ }
255
+ ]
256
+ };
257
+ }
258
+
259
+ // src/a2a/server.ts
260
+ var A2AServer = class {
261
+ httpServer = null;
262
+ taskManager;
263
+ agentCard;
264
+ options;
265
+ constructor(code, options) {
266
+ this.taskManager = new TaskManager(code);
267
+ this.agentCard = buildAgentCard(options);
268
+ this.options = options;
269
+ }
270
+ async start() {
271
+ const port = this.options.port ?? 3e3;
272
+ this.httpServer = createServer((req, res) => {
273
+ this.handleRequest(req, res).catch((err) => {
274
+ res.writeHead(500, { "Content-Type": "application/json" });
275
+ res.end(JSON.stringify({ error: err.message }));
276
+ });
277
+ });
278
+ return new Promise((resolve) => {
279
+ this.httpServer.listen(port, () => resolve());
280
+ });
281
+ }
282
+ async stop() {
283
+ return new Promise((resolve) => {
284
+ if (this.httpServer) {
285
+ this.httpServer.close(() => resolve());
286
+ } else {
287
+ resolve();
288
+ }
289
+ });
290
+ }
291
+ async handleRequest(req, res) {
292
+ if (this.options.cors !== false) {
293
+ res.setHeader("Access-Control-Allow-Origin", this.options.cors ?? "*");
294
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
295
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
296
+ }
297
+ if (req.method === "OPTIONS") {
298
+ res.writeHead(204);
299
+ res.end();
300
+ return;
301
+ }
302
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
303
+ if (url.pathname === "/.well-known/agent.json" && req.method === "GET") {
304
+ res.writeHead(200, { "Content-Type": "application/json" });
305
+ res.end(JSON.stringify(this.agentCard));
306
+ return;
307
+ }
308
+ if (url.pathname === "/" && req.method === "POST") {
309
+ const body = await readBody(req);
310
+ let msg;
311
+ try {
312
+ msg = parseMessage(body);
313
+ } catch {
314
+ res.writeHead(200, { "Content-Type": "application/json" });
315
+ res.end(JSON.stringify(formatError(null, PARSE_ERROR, "Invalid JSON")));
316
+ return;
317
+ }
318
+ if (!isRequest(msg)) {
319
+ res.writeHead(200, { "Content-Type": "application/json" });
320
+ res.end(JSON.stringify(formatError(null, PARSE_ERROR, "Expected JSON-RPC request")));
321
+ return;
322
+ }
323
+ const request = msg;
324
+ if (request.method === A2A_METHODS.TASKS_SEND_SUBSCRIBE) {
325
+ await this.handleStreamingRequest(request, res);
326
+ return;
327
+ }
328
+ try {
329
+ const result = await this.dispatch(request);
330
+ res.writeHead(200, { "Content-Type": "application/json" });
331
+ res.end(JSON.stringify(formatResponse(request.id, result)));
332
+ } catch (err) {
333
+ const code = err.code ?? INTERNAL_ERROR;
334
+ res.writeHead(200, { "Content-Type": "application/json" });
335
+ res.end(
336
+ JSON.stringify(
337
+ formatError(
338
+ request.id,
339
+ code,
340
+ err instanceof Error ? err.message : String(err)
341
+ )
342
+ )
343
+ );
344
+ }
345
+ return;
346
+ }
347
+ res.writeHead(404, { "Content-Type": "application/json" });
348
+ res.end(JSON.stringify({ error: "Not found" }));
349
+ }
350
+ async dispatch(request) {
351
+ switch (request.method) {
352
+ case A2A_METHODS.TASKS_SEND: {
353
+ const params = request.params;
354
+ if (!params?.message) {
355
+ throw Object.assign(new Error("Missing message"), {
356
+ code: INVALID_PARAMS
357
+ });
358
+ }
359
+ return this.taskManager.sendTask(params);
360
+ }
361
+ case A2A_METHODS.TASKS_GET: {
362
+ const params = request.params;
363
+ const task = this.taskManager.getTask(params.id);
364
+ if (!task) {
365
+ throw Object.assign(new Error(`Task not found: ${params.id}`), {
366
+ code: INVALID_PARAMS
367
+ });
368
+ }
369
+ return task;
370
+ }
371
+ case A2A_METHODS.TASKS_CANCEL: {
372
+ const params = request.params;
373
+ const canceled = this.taskManager.cancelTask(params.id);
374
+ if (!canceled) {
375
+ throw Object.assign(new Error(`Task not found: ${params.id}`), {
376
+ code: INVALID_PARAMS
377
+ });
378
+ }
379
+ return { ok: true };
380
+ }
381
+ default:
382
+ throw Object.assign(
383
+ new Error(`Unknown method: ${request.method}`),
384
+ { code: METHOD_NOT_FOUND }
385
+ );
386
+ }
387
+ }
388
+ async handleStreamingRequest(request, res) {
389
+ const params = request.params;
390
+ if (!params?.message) {
391
+ res.writeHead(200, { "Content-Type": "application/json" });
392
+ res.end(
393
+ JSON.stringify(
394
+ formatError(request.id, INVALID_PARAMS, "Missing message")
395
+ )
396
+ );
397
+ return;
398
+ }
399
+ res.writeHead(200, {
400
+ "Content-Type": "text/event-stream",
401
+ "Cache-Control": "no-cache",
402
+ Connection: "keep-alive"
403
+ });
404
+ try {
405
+ for await (const event of this.taskManager.sendTaskSubscribe(params)) {
406
+ const data = JSON.stringify({
407
+ jsonrpc: "2.0",
408
+ id: request.id,
409
+ result: event
410
+ });
411
+ res.write(`data: ${data}
412
+
413
+ `);
414
+ }
415
+ } catch (err) {
416
+ const errorData = JSON.stringify(
417
+ formatError(
418
+ request.id,
419
+ INTERNAL_ERROR,
420
+ err instanceof Error ? err.message : String(err)
421
+ )
422
+ );
423
+ res.write(`data: ${errorData}
424
+
425
+ `);
426
+ }
427
+ res.end();
428
+ }
429
+ };
430
+ function readBody(req) {
431
+ return new Promise((resolve, reject) => {
432
+ const chunks = [];
433
+ req.on("data", (chunk) => chunks.push(chunk));
434
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
435
+ req.on("error", reject);
436
+ });
437
+ }
438
+
439
+ // src/a2a/client.ts
440
+ var A2AClient = class {
441
+ agentUrl;
442
+ headers;
443
+ constructor(agentUrl, options) {
444
+ this.agentUrl = agentUrl.replace(/\/+$/, "");
445
+ this.headers = {
446
+ "Content-Type": "application/json",
447
+ ...options?.token ? { Authorization: `Bearer ${options.token}` } : {},
448
+ ...options?.headers ?? {}
449
+ };
450
+ }
451
+ /**
452
+ * Discover the remote agent's capabilities via its Agent Card.
453
+ */
454
+ async getAgentCard() {
455
+ const res = await fetch(
456
+ `${this.agentUrl}/.well-known/agent.json`,
457
+ { headers: this.headers }
458
+ );
459
+ if (!res.ok) {
460
+ throw new Error(`Failed to fetch agent card: ${res.status}`);
461
+ }
462
+ return res.json();
463
+ }
464
+ /**
465
+ * Send a task to the remote agent (non-streaming).
466
+ */
467
+ async sendTask(params) {
468
+ const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND, params);
469
+ const res = await fetch(this.agentUrl, {
470
+ method: "POST",
471
+ headers: this.headers,
472
+ body: JSON.stringify(rpc)
473
+ });
474
+ const response = await res.json();
475
+ if ("error" in response) {
476
+ throw new Error(response.error.message);
477
+ }
478
+ return response.result;
479
+ }
480
+ /**
481
+ * Send a task and subscribe to streaming updates via SSE.
482
+ */
483
+ async *sendTaskSubscribe(params) {
484
+ const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND_SUBSCRIBE, params);
485
+ const res = await fetch(this.agentUrl, {
486
+ method: "POST",
487
+ headers: this.headers,
488
+ body: JSON.stringify(rpc)
489
+ });
490
+ if (!res.ok) {
491
+ throw new Error(`A2A streaming request failed: ${res.status}`);
492
+ }
493
+ const reader = res.body?.getReader();
494
+ if (!reader) throw new Error("No response body");
495
+ const decoder = new TextDecoder();
496
+ let buffer = "";
497
+ try {
498
+ while (true) {
499
+ const { done, value } = await reader.read();
500
+ if (done) break;
501
+ buffer += decoder.decode(value, { stream: true });
502
+ const lines = buffer.split("\n");
503
+ buffer = lines.pop() ?? "";
504
+ for (const line of lines) {
505
+ if (line.startsWith("data: ")) {
506
+ const data = line.slice(6).trim();
507
+ if (!data) continue;
508
+ try {
509
+ const parsed = JSON.parse(data);
510
+ if ("result" in parsed) {
511
+ yield parsed.result;
512
+ }
513
+ } catch {
514
+ }
515
+ }
516
+ }
517
+ }
518
+ } finally {
519
+ reader.releaseLock();
520
+ }
521
+ }
522
+ /**
523
+ * Get the current state of a task.
524
+ */
525
+ async getTask(taskId) {
526
+ const rpc = formatRequest(1, A2A_METHODS.TASKS_GET, { id: taskId });
527
+ const res = await fetch(this.agentUrl, {
528
+ method: "POST",
529
+ headers: this.headers,
530
+ body: JSON.stringify(rpc)
531
+ });
532
+ const response = await res.json();
533
+ if ("error" in response) {
534
+ throw new Error(response.error.message);
535
+ }
536
+ return response.result;
537
+ }
538
+ /**
539
+ * Cancel a running task.
540
+ */
541
+ async cancelTask(taskId) {
542
+ const rpc = formatRequest(1, A2A_METHODS.TASKS_CANCEL, { id: taskId });
543
+ const res = await fetch(this.agentUrl, {
544
+ method: "POST",
545
+ headers: this.headers,
546
+ body: JSON.stringify(rpc)
547
+ });
548
+ const response = await res.json();
549
+ if ("error" in response) {
550
+ throw new Error(response.error.message);
551
+ }
552
+ }
553
+ /**
554
+ * Helper: send a simple text message and return the task.
555
+ */
556
+ async ask(text, sessionId) {
557
+ return this.sendTask({
558
+ sessionId,
559
+ message: {
560
+ role: "user",
561
+ parts: [{ type: "text", text }]
562
+ }
563
+ });
564
+ }
565
+ };
566
+
567
+ // src/a2a/index.ts
568
+ function createA2AServer(code, options) {
569
+ return new A2AServer(code, options);
570
+ }
571
+ export {
572
+ A2AClient,
573
+ A2AServer,
574
+ A2A_METHODS,
575
+ TaskManager,
576
+ buildAgentCard,
577
+ createA2AServer
578
+ };
579
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/a2a/server.ts","../../src/a2a/types.ts","../../src/a2a/task-manager.ts","../../src/a2a/agent-card.ts","../../src/a2a/client.ts","../../src/a2a/index.ts"],"sourcesContent":["/**\n * A2A HTTP server implementing the Agent2Agent protocol endpoints.\n *\n * Endpoints:\n * GET /.well-known/agent.json -> Agent Card\n * POST / -> JSON-RPC dispatch\n */\n\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport type { Agent } from \"../agent.js\";\nimport type { AgentCard } from \"./types.js\";\nimport { A2A_METHODS, type TaskSendParams, type TaskStreamEvent } from \"./types.js\";\nimport { TaskManager } from \"./task-manager.js\";\nimport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nimport {\n formatResponse,\n formatError,\n parseMessage,\n isRequest,\n METHOD_NOT_FOUND,\n INVALID_PARAMS,\n INTERNAL_ERROR,\n PARSE_ERROR,\n type JsonRpcRequest,\n} from \"../jsonrpc/index.js\";\n\nexport interface A2AServerOptions extends AgentCardOptions {\n /** Port to listen on (default: 3000) */\n port?: number;\n /** CORS origin header (default: \"*\") */\n cors?: string | false;\n}\n\nexport class A2AServer {\n private httpServer: ReturnType<typeof createServer> | null = null;\n private taskManager: TaskManager;\n private agentCard: AgentCard;\n private options: A2AServerOptions;\n\n constructor(code: Agent, options: A2AServerOptions) {\n this.taskManager = new TaskManager(code);\n this.agentCard = buildAgentCard(options);\n this.options = options;\n }\n\n async start(): Promise<void> {\n const port = this.options.port ?? 3000;\n\n this.httpServer = createServer((req, res) => {\n this.handleRequest(req, res).catch((err) => {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: err.message }));\n });\n });\n\n return new Promise<void>((resolve) => {\n this.httpServer!.listen(port, () => resolve());\n });\n }\n\n async stop(): Promise<void> {\n return new Promise<void>((resolve) => {\n if (this.httpServer) {\n this.httpServer.close(() => resolve());\n } else {\n resolve();\n }\n });\n }\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n // CORS\n if (this.options.cors !== false) {\n res.setHeader(\"Access-Control-Allow-Origin\", this.options.cors ?? \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n }\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n\n // Agent Card discovery\n if (url.pathname === \"/.well-known/agent.json\" && req.method === \"GET\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(this.agentCard));\n return;\n }\n\n // JSON-RPC endpoint\n if (url.pathname === \"/\" && req.method === \"POST\") {\n const body = await readBody(req);\n let msg;\n try {\n msg = parseMessage(body);\n } catch {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Invalid JSON\")));\n return;\n }\n\n if (!isRequest(msg)) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatError(null, PARSE_ERROR, \"Expected JSON-RPC request\")));\n return;\n }\n\n const request = msg as JsonRpcRequest;\n\n // Check if this is a streaming request\n if (request.method === A2A_METHODS.TASKS_SEND_SUBSCRIBE) {\n await this.handleStreamingRequest(request, res);\n return;\n }\n\n try {\n const result = await this.dispatch(request);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(formatResponse(request.id, result)));\n } catch (err) {\n const code = (err as { code?: number }).code ?? INTERNAL_ERROR;\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(\n request.id,\n code,\n err instanceof Error ? err.message : String(err),\n ),\n ),\n );\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n\n private async dispatch(request: JsonRpcRequest): Promise<unknown> {\n switch (request.method) {\n case A2A_METHODS.TASKS_SEND: {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n throw Object.assign(new Error(\"Missing message\"), {\n code: INVALID_PARAMS,\n });\n }\n return this.taskManager.sendTask(params);\n }\n\n case A2A_METHODS.TASKS_GET: {\n const params = request.params as { id: string };\n const task = this.taskManager.getTask(params.id);\n if (!task) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return task;\n }\n\n case A2A_METHODS.TASKS_CANCEL: {\n const params = request.params as { id: string };\n const canceled = this.taskManager.cancelTask(params.id);\n if (!canceled) {\n throw Object.assign(new Error(`Task not found: ${params.id}`), {\n code: INVALID_PARAMS,\n });\n }\n return { ok: true };\n }\n\n default:\n throw Object.assign(\n new Error(`Unknown method: ${request.method}`),\n { code: METHOD_NOT_FOUND },\n );\n }\n }\n\n private async handleStreamingRequest(\n request: JsonRpcRequest,\n res: ServerResponse,\n ): Promise<void> {\n const params = request.params as TaskSendParams;\n if (!params?.message) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify(\n formatError(request.id, INVALID_PARAMS, \"Missing message\"),\n ),\n );\n return;\n }\n\n // SSE response\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n try {\n for await (const event of this.taskManager.sendTaskSubscribe(params)) {\n const data = JSON.stringify({\n jsonrpc: \"2.0\",\n id: request.id,\n result: event,\n });\n res.write(`data: ${data}\\n\\n`);\n }\n } catch (err) {\n const errorData = JSON.stringify(\n formatError(\n request.id,\n INTERNAL_ERROR,\n err instanceof Error ? err.message : String(err),\n ),\n );\n res.write(`data: ${errorData}\\n\\n`);\n }\n\n res.end();\n }\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n","/**\n * Agent2Agent (A2A) protocol types per the Google A2A specification.\n * https://google.github.io/A2A/specification/\n */\n\n// ── Agent Card ──────────────────────────────────────────────────────────────\n\nexport interface AgentCard {\n name: string;\n description?: string;\n url: string;\n provider?: {\n organization: string;\n url?: string;\n };\n version: string;\n capabilities?: {\n streaming?: boolean;\n pushNotifications?: boolean;\n stateTransitionHistory?: boolean;\n };\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n defaultInputModes?: string[];\n defaultOutputModes?: string[];\n skills?: AgentSkill[];\n}\n\nexport interface AgentSkill {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n examples?: string[];\n inputModes?: string[];\n outputModes?: string[];\n}\n\n// ── Task lifecycle ──────────────────────────────────────────────────────────\n\nexport type TaskStatus =\n | \"submitted\"\n | \"working\"\n | \"input-required\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\nexport interface Task {\n id: string;\n sessionId?: string;\n status: TaskState;\n history?: Message[];\n artifacts?: Artifact[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskState {\n state: TaskStatus;\n message?: Message;\n timestamp?: string;\n}\n\n// ── Messages and parts ──────────────────────────────────────────────────────\n\nexport interface Message {\n role: \"user\" | \"agent\";\n parts: Part[];\n metadata?: Record<string, unknown>;\n}\n\nexport type Part = TextPart | FilePart | DataPart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n file: {\n name?: string;\n mimeType?: string;\n bytes?: string; // base64\n uri?: string;\n };\n}\n\nexport interface DataPart {\n type: \"data\";\n data: Record<string, unknown>;\n}\n\nexport interface Artifact {\n name?: string;\n description?: string;\n parts: Part[];\n index?: number;\n append?: boolean;\n lastChunk?: boolean;\n metadata?: Record<string, unknown>;\n}\n\n// ── JSON-RPC method params ──────────────────────────────────────────────────\n\nexport interface TaskSendParams {\n id?: string;\n sessionId?: string;\n message: Message;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskGetParams {\n id: string;\n}\n\nexport interface TaskCancelParams {\n id: string;\n}\n\n// ── SSE streaming ───────────────────────────────────────────────────────────\n\nexport interface TaskStatusUpdateEvent {\n type: \"status\";\n taskId: string;\n status: TaskState;\n final: boolean;\n}\n\nexport interface TaskArtifactUpdateEvent {\n type: \"artifact\";\n taskId: string;\n artifact: Artifact;\n}\n\nexport type TaskStreamEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;\n\n// ── A2A method constants ────────────────────────────────────────────────────\n\nexport const A2A_METHODS = {\n TASKS_SEND: \"tasks/send\",\n TASKS_SEND_SUBSCRIBE: \"tasks/sendSubscribe\",\n TASKS_GET: \"tasks/get\",\n TASKS_CANCEL: \"tasks/cancel\",\n TASKS_PUSH_NOTIFICATION: \"tasks/pushNotification\",\n TASKS_RESUBSCRIBE: \"tasks/resubscribe\",\n} as const;\n","/**\n * A2A Task Manager: maps A2A task lifecycle to noumen sessions/threads.\n */\n\nimport type { Agent } from \"../agent.js\";\nimport type { Thread } from \"../thread.js\";\nimport type { StreamEvent } from \"../session/types.js\";\nimport { contentToString } from \"../utils/content.js\";\nimport { generateUUID } from \"../utils/uuid.js\";\nimport type {\n Task,\n TaskState,\n TaskStatus,\n Message,\n Part,\n TextPart,\n Artifact,\n TaskStreamEvent,\n TaskSendParams,\n} from \"./types.js\";\n\ninterface ManagedTask {\n task: Task;\n thread: Thread;\n abortController: AbortController;\n}\n\nexport class TaskManager {\n private tasks = new Map<string, ManagedTask>();\n private code: Agent;\n\n constructor(code: Agent) {\n this.code = code;\n }\n\n /**\n * Create a task, start running it, and return the task immediately.\n * Use `getTask` to poll status or `streamTask` for SSE.\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const taskId = params.id ?? generateUUID();\n\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n const prompt = this.messageToPrompt(params.message);\n this.runTask(taskId, prompt);\n\n return task;\n }\n\n /**\n * Stream task events as an async generator (for SSE).\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const taskId = params.id ?? generateUUID();\n\n const thread = this.code.createThread({\n sessionId: params.sessionId,\n });\n\n const task: Task = {\n id: taskId,\n sessionId: thread.sessionId,\n status: { state: \"submitted\", timestamp: new Date().toISOString() },\n history: [params.message],\n artifacts: [],\n };\n\n const abortController = new AbortController();\n this.tasks.set(taskId, { task, thread, abortController });\n\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n task.status = { state: \"working\", timestamp: new Date().toISOString() };\n yield {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n const prompt = this.messageToPrompt(params.message);\n const textParts: string[] = [];\n\n try {\n for await (const event of thread.run(prompt, {\n signal: abortController.signal,\n })) {\n const streamEvent = this.mapStreamEvent(taskId, task, event, textParts);\n if (streamEvent) yield streamEvent;\n }\n\n // Finalize\n if (textParts.length > 0) {\n const artifact: Artifact = {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n };\n task.artifacts = [artifact];\n yield { type: \"artifact\", taskId, artifact };\n }\n\n task.status = { state: \"completed\", timestamp: new Date().toISOString() };\n yield { type: \"status\", taskId, status: task.status, final: true };\n } catch (err) {\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n yield { type: \"status\", taskId, status: task.status, final: true };\n }\n }\n\n getTask(taskId: string): Task | null {\n return this.tasks.get(taskId)?.task ?? null;\n }\n\n cancelTask(taskId: string): boolean {\n const managed = this.tasks.get(taskId);\n if (!managed) return false;\n\n managed.abortController.abort();\n managed.task.status = {\n state: \"canceled\",\n timestamp: new Date().toISOString(),\n };\n return true;\n }\n\n private async runTask(taskId: string, prompt: string): Promise<void> {\n const managed = this.tasks.get(taskId);\n if (!managed) return;\n\n managed.task.status = {\n state: \"working\",\n timestamp: new Date().toISOString(),\n };\n\n try {\n const textParts: string[] = [];\n for await (const event of managed.thread.run(prompt, {\n signal: managed.abortController.signal,\n })) {\n if (event.type === \"text_delta\") {\n textParts.push(event.text);\n }\n if (event.type === \"user_input_request\") {\n managed.task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n }\n }\n\n if (textParts.length > 0) {\n managed.task.artifacts = [\n {\n name: \"response\",\n parts: [{ type: \"text\", text: textParts.join(\"\") }],\n lastChunk: true,\n },\n ];\n }\n\n managed.task.status = {\n state: \"completed\",\n timestamp: new Date().toISOString(),\n };\n } catch (err) {\n managed.task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [\n {\n type: \"text\",\n text: err instanceof Error ? err.message : String(err),\n },\n ],\n },\n };\n }\n }\n\n private mapStreamEvent(\n taskId: string,\n task: Task,\n event: StreamEvent,\n textParts: string[],\n ): TaskStreamEvent | null {\n switch (event.type) {\n case \"text_delta\":\n textParts.push(event.text);\n return null; // Text accumulates into artifact at end\n\n case \"user_input_request\":\n task.status = {\n state: \"input-required\",\n timestamp: new Date().toISOString(),\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: false,\n };\n\n case \"error\":\n task.status = {\n state: \"failed\",\n timestamp: new Date().toISOString(),\n message: {\n role: \"agent\",\n parts: [{ type: \"text\", text: event.error.message }],\n },\n };\n return {\n type: \"status\",\n taskId,\n status: task.status,\n final: true,\n };\n\n default:\n return null;\n }\n }\n\n private messageToPrompt(message: Message): string {\n return message.parts\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\");\n }\n}\n","/**\n * Build an A2A Agent Card from a noumen Code instance configuration.\n */\n\nimport type { AgentCard, AgentSkill } from \"./types.js\";\n\nexport interface AgentCardOptions {\n name: string;\n description?: string;\n url: string;\n version?: string;\n provider?: {\n organization: string;\n url?: string;\n };\n skills?: AgentSkill[];\n authentication?: {\n schemes: string[];\n credentials?: string;\n };\n streaming?: boolean;\n}\n\nexport function buildAgentCard(options: AgentCardOptions): AgentCard {\n return {\n name: options.name,\n description: options.description ?? \"A noumen-powered AI coding agent\",\n url: options.url,\n version: options.version ?? \"0.1.0\",\n provider: options.provider,\n capabilities: {\n streaming: options.streaming ?? true,\n pushNotifications: false,\n stateTransitionHistory: true,\n },\n authentication: options.authentication,\n defaultInputModes: [\"text\"],\n defaultOutputModes: [\"text\"],\n skills: options.skills ?? [\n {\n id: \"coding\",\n name: \"Code Generation & Editing\",\n description: \"Read, write, and edit code files with full tool access\",\n tags: [\"coding\", \"files\", \"shell\"],\n },\n ],\n };\n}\n","/**\n * A2A client for calling remote A2A agents.\n *\n * Enables noumen agents to discover and delegate work to other A2A agents.\n */\n\nimport type {\n AgentCard,\n Task,\n Message,\n TaskSendParams,\n TaskStreamEvent,\n} from \"./types.js\";\nimport { A2A_METHODS } from \"./types.js\";\nimport { formatRequest, type JsonRpcResponse } from \"../jsonrpc/index.js\";\n\nexport interface A2AClientOptions {\n /** Override headers for all requests. */\n headers?: Record<string, string>;\n /** Bearer token for authentication. */\n token?: string;\n}\n\nexport class A2AClient {\n private agentUrl: string;\n private headers: Record<string, string>;\n\n constructor(agentUrl: string, options?: A2AClientOptions) {\n this.agentUrl = agentUrl.replace(/\\/+$/, \"\");\n this.headers = {\n \"Content-Type\": \"application/json\",\n ...(options?.token ? { Authorization: `Bearer ${options.token}` } : {}),\n ...(options?.headers ?? {}),\n };\n }\n\n /**\n * Discover the remote agent's capabilities via its Agent Card.\n */\n async getAgentCard(): Promise<AgentCard> {\n const res = await fetch(\n `${this.agentUrl}/.well-known/agent.json`,\n { headers: this.headers },\n );\n if (!res.ok) {\n throw new Error(`Failed to fetch agent card: ${res.status}`);\n }\n return res.json() as Promise<AgentCard>;\n }\n\n /**\n * Send a task to the remote agent (non-streaming).\n */\n async sendTask(params: TaskSendParams): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Send a task and subscribe to streaming updates via SSE.\n */\n async *sendTaskSubscribe(\n params: TaskSendParams,\n ): AsyncGenerator<TaskStreamEvent> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_SEND_SUBSCRIBE, params);\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n\n if (!res.ok) {\n throw new Error(`A2A streaming request failed: ${res.status}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) throw new Error(\"No response body\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (!data) continue;\n try {\n const parsed = JSON.parse(data) as JsonRpcResponse;\n if (\"result\" in parsed) {\n yield parsed.result as TaskStreamEvent;\n }\n } catch {\n // Skip malformed SSE data\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Get the current state of a task.\n */\n async getTask(taskId: string): Promise<Task> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_GET, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n return response.result as Task;\n }\n\n /**\n * Cancel a running task.\n */\n async cancelTask(taskId: string): Promise<void> {\n const rpc = formatRequest(1, A2A_METHODS.TASKS_CANCEL, { id: taskId });\n const res = await fetch(this.agentUrl, {\n method: \"POST\",\n headers: this.headers,\n body: JSON.stringify(rpc),\n });\n const response = (await res.json()) as JsonRpcResponse;\n if (\"error\" in response) {\n throw new Error(response.error.message);\n }\n }\n\n /**\n * Helper: send a simple text message and return the task.\n */\n async ask(text: string, sessionId?: string): Promise<Task> {\n return this.sendTask({\n sessionId,\n message: {\n role: \"user\",\n parts: [{ type: \"text\", text }],\n },\n });\n }\n}\n","/**\n * A2A (Agent2Agent) protocol adapter for noumen.\n *\n * Server usage:\n * import { createA2AServer } from \"noumen/a2a\";\n * const server = createA2AServer(code, { name: \"MyAgent\", url: \"https://...\" });\n * await server.start();\n *\n * Client usage:\n * import { A2AClient } from \"noumen/a2a\";\n * const client = new A2AClient(\"https://remote-agent.example.com\");\n * const card = await client.getAgentCard();\n * const task = await client.ask(\"Fix the bug in auth.ts\");\n */\n\nexport { A2AServer, type A2AServerOptions } from \"./server.js\";\nexport { A2AClient, type A2AClientOptions } from \"./client.js\";\nexport { TaskManager } from \"./task-manager.js\";\nexport { buildAgentCard, type AgentCardOptions } from \"./agent-card.js\";\nexport {\n type AgentCard,\n type AgentSkill,\n type Task,\n type TaskState,\n type TaskStatus,\n type Message,\n type Part,\n type TextPart,\n type FilePart,\n type DataPart,\n type Artifact,\n type TaskSendParams,\n type TaskStreamEvent,\n A2A_METHODS,\n} from \"./types.js\";\n\nimport type { Agent } from \"../agent.js\";\nimport { A2AServer, type A2AServerOptions } from \"./server.js\";\n\n/**\n * Create an A2A server that exposes an Agent instance via the Agent2Agent protocol.\n */\nexport function createA2AServer(\n code: Agent,\n options: A2AServerOptions,\n): A2AServer {\n return new A2AServer(code, options);\n}\n"],"mappings":"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","names":[]}