@cogitator-ai/a2a 0.7.7 → 0.8.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 (82) hide show
  1. package/README.md +173 -151
  2. package/dist/adapters/express.d.ts +5 -0
  3. package/dist/adapters/express.d.ts.map +1 -1
  4. package/dist/adapters/express.js +53 -30
  5. package/dist/adapters/express.js.map +1 -1
  6. package/dist/adapters/fastify.d.ts +5 -0
  7. package/dist/adapters/fastify.d.ts.map +1 -1
  8. package/dist/adapters/fastify.js +51 -35
  9. package/dist/adapters/fastify.js.map +1 -1
  10. package/dist/adapters/hono.d.ts +5 -0
  11. package/dist/adapters/hono.d.ts.map +1 -1
  12. package/dist/adapters/hono.js +41 -49
  13. package/dist/adapters/hono.js.map +1 -1
  14. package/dist/adapters/koa.d.ts +5 -0
  15. package/dist/adapters/koa.d.ts.map +1 -1
  16. package/dist/adapters/koa.js +39 -32
  17. package/dist/adapters/koa.js.map +1 -1
  18. package/dist/adapters/next.d.ts +13 -2
  19. package/dist/adapters/next.d.ts.map +1 -1
  20. package/dist/adapters/next.js +75 -51
  21. package/dist/adapters/next.js.map +1 -1
  22. package/dist/adapters/shared.d.ts +43 -10
  23. package/dist/adapters/shared.d.ts.map +1 -1
  24. package/dist/adapters/shared.js +156 -23
  25. package/dist/adapters/shared.js.map +1 -1
  26. package/dist/agent-card.d.ts +22 -7
  27. package/dist/agent-card.d.ts.map +1 -1
  28. package/dist/agent-card.js +71 -34
  29. package/dist/agent-card.js.map +1 -1
  30. package/dist/approvals.d.ts +46 -0
  31. package/dist/approvals.d.ts.map +1 -0
  32. package/dist/approvals.js +105 -0
  33. package/dist/approvals.js.map +1 -0
  34. package/dist/client.d.ts +59 -17
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +237 -142
  37. package/dist/client.js.map +1 -1
  38. package/dist/errors.d.ts +24 -1
  39. package/dist/errors.d.ts.map +1 -1
  40. package/dist/errors.js +90 -19
  41. package/dist/errors.js.map +1 -1
  42. package/dist/index.d.ts +11 -7
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +7 -5
  45. package/dist/index.js.map +1 -1
  46. package/dist/ownership.d.ts +7 -1
  47. package/dist/ownership.d.ts.map +1 -1
  48. package/dist/ownership.js +24 -3
  49. package/dist/ownership.js.map +1 -1
  50. package/dist/protocol.d.ts +70 -0
  51. package/dist/protocol.d.ts.map +1 -0
  52. package/dist/protocol.js +187 -0
  53. package/dist/protocol.js.map +1 -0
  54. package/dist/push-notifications.d.ts +5 -2
  55. package/dist/push-notifications.d.ts.map +1 -1
  56. package/dist/push-notifications.js +33 -23
  57. package/dist/push-notifications.js.map +1 -1
  58. package/dist/redis-task-store.js +3 -3
  59. package/dist/redis-task-store.js.map +1 -1
  60. package/dist/server.d.ts +75 -12
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +324 -270
  63. package/dist/server.js.map +1 -1
  64. package/dist/task-manager.d.ts +57 -11
  65. package/dist/task-manager.d.ts.map +1 -1
  66. package/dist/task-manager.js +264 -116
  67. package/dist/task-manager.js.map +1 -1
  68. package/dist/task-store.js +4 -4
  69. package/dist/task-store.js.map +1 -1
  70. package/dist/types.d.ts +226 -85
  71. package/dist/types.d.ts.map +1 -1
  72. package/dist/types.js +10 -3
  73. package/dist/types.js.map +1 -1
  74. package/dist/url.d.ts +7 -0
  75. package/dist/url.d.ts.map +1 -0
  76. package/dist/url.js +12 -0
  77. package/dist/url.js.map +1 -0
  78. package/package.json +19 -9
  79. package/dist/adapters/sse-error-event.d.ts +0 -3
  80. package/dist/adapters/sse-error-event.d.ts.map +0 -1
  81. package/dist/adapters/sse-error-event.js +0 -12
  82. package/dist/adapters/sse-error-event.js.map +0 -1
@@ -1,52 +1,75 @@
1
1
  import { Router, json } from 'express';
2
2
  import { createErrorResponse } from '../json-rpc.js';
3
3
  import * as errors from '../errors.js';
4
- import { isStreamRequest, pipeJsonRpcStream, SSE_HEADERS } from './shared.js';
5
- export function a2aExpress(server) {
6
- const router = Router();
7
- router.get('/.well-known/agent.json', (_req, res) => {
8
- const cards = server.getAgentCards();
9
- res.json(cards.length === 1 ? cards[0] : cards);
4
+ import { handleA2AHttp } from './shared.js';
5
+ const parseJson = json();
6
+ function readBody(req, res) {
7
+ if (req.body !== undefined)
8
+ return Promise.resolve(req.body);
9
+ return new Promise((resolve, reject) => {
10
+ parseJson(req, res, (error) => {
11
+ if (error)
12
+ reject(error instanceof Error ? error : new SyntaxError(String(error)));
13
+ else
14
+ resolve(req.body);
15
+ });
10
16
  });
11
- router.post(server.basePath, json(), async (req, res) => {
12
- const contentType = req.headers['content-type'];
13
- if (contentType && !contentType.startsWith('application/json')) {
14
- res.json(createErrorResponse(null, errors.contentTypeNotSupported(contentType)));
17
+ }
18
+ async function send(res, response) {
19
+ switch (response.kind) {
20
+ case 'json':
21
+ res.status(response.status).set(response.headers).json(response.body);
15
22
  return;
16
- }
17
- const body = req.body;
18
- const authToken = server.getAuthToken((name) => req.get(name));
19
- if (isStreamRequest(body)) {
20
- const controller = new AbortController();
21
- res.on('close', () => controller.abort());
22
- res.writeHead(200, SSE_HEADERS);
23
- await pipeJsonRpcStream(server, body, authToken, controller.signal, (frame) => {
23
+ case 'empty':
24
+ res.status(response.status).end();
25
+ return;
26
+ case 'sse':
27
+ res.writeHead(200, response.headers);
28
+ await response.pipe((frame) => {
24
29
  if (!res.writableEnded && !res.destroyed)
25
30
  res.write(frame);
26
31
  });
27
32
  if (!res.writableEnded)
28
33
  res.end();
29
34
  return;
30
- }
35
+ case 'pass':
36
+ return;
37
+ }
38
+ }
39
+ /**
40
+ * Express router serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
41
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
42
+ * endpoint under `<basePath>/<agent name>`.
43
+ */
44
+ export function a2aExpress(server) {
45
+ const router = Router();
46
+ router.use(async (req, res, next) => {
47
+ const controller = new AbortController();
48
+ res.on('close', () => controller.abort());
31
49
  try {
32
- const response = await server.handleJsonRpc(body, authToken);
33
- if (response === null) {
34
- res.status(204).end();
50
+ const response = await handleA2AHttp(server, {
51
+ method: req.method,
52
+ path: req.path,
53
+ mountUrl: `${req.protocol}://${req.get('host') ?? 'localhost'}${req.baseUrl}`,
54
+ header: (name) => req.get(name),
55
+ readBody: () => readBody(req, res),
56
+ signal: controller.signal,
57
+ });
58
+ if (response.kind === 'pass') {
59
+ next();
35
60
  return;
36
61
  }
37
- res.json(response);
62
+ await send(res, response);
38
63
  }
39
64
  catch (error) {
65
+ if (res.headersSent) {
66
+ if (!res.writableEnded)
67
+ res.end();
68
+ return;
69
+ }
40
70
  res.json(createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed')));
41
71
  }
42
72
  });
43
- router.use((err, _req, res, next) => {
44
- if (err instanceof SyntaxError) {
45
- res.json(createErrorResponse(null, errors.parseError('Invalid JSON body')));
46
- return;
47
- }
48
- next(err);
49
- });
50
73
  return router;
51
74
  }
52
75
  //# sourceMappingURL=express.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/adapters/express.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import type { FastifyPluginAsync } from 'fastify';
2
2
  import type { A2AServer } from '../server.js';
3
+ /**
4
+ * Fastify plugin serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
5
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
6
+ * endpoint under `<basePath>/<agent name>`.
7
+ */
3
8
  export declare function a2aFastify(server: A2AServer): FastifyPluginAsync;
4
9
  //# sourceMappingURL=fastify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,kBAAkB,CA6DhE"}
1
+ {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,kBAAkB,EAAgC,MAAM,SAAS,CAAC;AACjG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,kBAAkB,CA8EhE"}
@@ -1,12 +1,24 @@
1
1
  import { createErrorResponse } from '../json-rpc.js';
2
2
  import * as errors from '../errors.js';
3
- import { firstHeader, isStreamRequest, pipeJsonRpcStream, SSE_HEADERS } from './shared.js';
3
+ import { AGENT_CARD_PATH, LEGACY_AGENT_CARD_PATH } from '../types.js';
4
+ import { firstHeader, handleA2AHttp, mountUrlOf } from './shared.js';
5
+ import { trimTrailingSlashes } from '../url.js';
6
+ /**
7
+ * Fastify plugin serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
8
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
9
+ * endpoint under `<basePath>/<agent name>`.
10
+ */
4
11
  export function a2aFastify(server) {
5
12
  return async (fastify) => {
6
13
  fastify.setErrorHandler((error, _request, reply) => {
7
14
  if (error instanceof SyntaxError || error.statusCode === 400) {
8
15
  return reply.send(createErrorResponse(null, errors.parseError('Invalid JSON body')));
9
16
  }
17
+ if (error.statusCode === 415) {
18
+ return reply
19
+ .code(415)
20
+ .send(createErrorResponse(null, errors.invalidRequest('Content-Type must be application/json')));
21
+ }
10
22
  if (typeof error.statusCode === 'number' &&
11
23
  error.statusCode > 400 &&
12
24
  error.statusCode < 500) {
@@ -14,42 +26,46 @@ export function a2aFastify(server) {
14
26
  }
15
27
  return reply.send(createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed')));
16
28
  });
17
- fastify.get('/.well-known/agent.json', async (_request, reply) => {
18
- const cards = server.getAgentCards();
19
- return reply.send(cards.length === 1 ? cards[0] : cards);
20
- });
21
- fastify.post(server.basePath, async (request, reply) => {
22
- const contentType = request.headers['content-type'];
23
- if (contentType && !contentType.startsWith('application/json')) {
24
- return reply.send(createErrorResponse(null, errors.contentTypeNotSupported(contentType)));
25
- }
26
- const body = request.body;
27
- const authToken = server.getAuthToken((name) => firstHeader(request.headers[name.toLowerCase()]));
28
- if (isStreamRequest(body)) {
29
- void reply.hijack();
30
- const raw = reply.raw;
31
- const controller = new AbortController();
32
- raw.on('close', () => controller.abort());
33
- raw.writeHead(200, SSE_HEADERS);
34
- await pipeJsonRpcStream(server, body, authToken, controller.signal, (frame) => {
35
- if (!raw.writableEnded && !raw.destroyed)
36
- raw.write(frame);
37
- });
38
- if (!raw.writableEnded)
39
- raw.end();
40
- return;
41
- }
42
- try {
43
- const response = await server.handleJsonRpc(body, authToken);
44
- if (response === null) {
45
- return reply.code(204).send();
29
+ const serve = async (request, reply, relativePath) => {
30
+ const controller = new AbortController();
31
+ reply.raw.on('close', () => controller.abort());
32
+ const requestUrl = new URL(request.url, `${request.protocol}://${request.host}`);
33
+ const response = await handleA2AHttp(server, {
34
+ method: request.method,
35
+ path: relativePath,
36
+ mountUrl: mountUrlOf(requestUrl, relativePath),
37
+ header: (name) => firstHeader(request.headers[name.toLowerCase()]),
38
+ readBody: async () => request.body,
39
+ signal: controller.signal,
40
+ });
41
+ switch (response.kind) {
42
+ case 'json':
43
+ return reply.code(response.status).headers(response.headers).send(response.body);
44
+ case 'empty':
45
+ return reply.code(response.status).send();
46
+ case 'pass':
47
+ return reply.callNotFound();
48
+ case 'sse': {
49
+ void reply.hijack();
50
+ const raw = reply.raw;
51
+ raw.writeHead(200, response.headers);
52
+ await response.pipe((frame) => {
53
+ if (!raw.writableEnded && !raw.destroyed)
54
+ raw.write(frame);
55
+ });
56
+ if (!raw.writableEnded)
57
+ raw.end();
58
+ return reply;
46
59
  }
47
- return reply.send(response);
48
- }
49
- catch (error) {
50
- return reply.send(createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed')));
51
60
  }
52
- });
61
+ };
62
+ const base = trimTrailingSlashes(server.basePath);
63
+ const agentPath = (request) => `${base}/${encodeURIComponent(request.params.agent ?? '')}`;
64
+ fastify.get(AGENT_CARD_PATH, (request, reply) => serve(request, reply, AGENT_CARD_PATH));
65
+ fastify.get(LEGACY_AGENT_CARD_PATH, (request, reply) => serve(request, reply, LEGACY_AGENT_CARD_PATH));
66
+ fastify.get(`${base}/:agent${AGENT_CARD_PATH}`, (request, reply) => serve(request, reply, `${agentPath(request)}${AGENT_CARD_PATH}`));
67
+ fastify.post(server.basePath, (request, reply) => serve(request, reply, server.basePath));
68
+ fastify.post(`${base}/:agent`, (request, reply) => serve(request, reply, agentPath(request)));
53
69
  };
54
70
  }
55
71
  //# sourceMappingURL=fastify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import { Hono } from 'hono';
2
2
  import type { A2AServer } from '../server.js';
3
+ /**
4
+ * Hono app serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
5
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
6
+ * endpoint under `<basePath>/<agent name>`.
7
+ */
3
8
  export declare function a2aHono(server: A2AServer): Hono;
4
9
  //# sourceMappingURL=hono.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+D/C"}
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAgB,MAAM,MAAM,CAAC;AAE1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgD/C"}
@@ -2,64 +2,56 @@ import { Hono } from 'hono';
2
2
  import { streamSSE } from 'hono/streaming';
3
3
  import { createErrorResponse } from '../json-rpc.js';
4
4
  import * as errors from '../errors.js';
5
- import { buildSseErrorEvent } from './sse-error-event.js';
6
- import { isStreamRequest } from './shared.js';
5
+ import { AGENT_CARD_PATH, LEGACY_AGENT_CARD_PATH } from '../types.js';
6
+ import { handleA2AHttp, mountUrlOf } from './shared.js';
7
+ import { trimTrailingSlashes } from '../url.js';
8
+ /**
9
+ * Hono app serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
10
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
11
+ * endpoint under `<basePath>/<agent name>`.
12
+ */
7
13
  export function a2aHono(server) {
8
14
  const app = new Hono();
9
- app.get('/.well-known/agent.json', (c) => {
10
- const cards = server.getAgentCards();
11
- return c.json(cards.length === 1 ? cards[0] : cards);
12
- });
13
- app.post(server.basePath, async (c) => {
14
- const contentType = c.req.header('content-type');
15
- if (contentType && !contentType.startsWith('application/json')) {
16
- return c.json(createErrorResponse(null, errors.contentTypeNotSupported(contentType)));
17
- }
18
- let body;
15
+ const serve = async (c, relativePath) => {
16
+ const controller = new AbortController();
17
+ c.req.raw.signal.addEventListener('abort', () => controller.abort(), { once: true });
19
18
  try {
20
- body = await c.req.json();
21
- }
22
- catch {
23
- return c.json(createErrorResponse(null, errors.parseError('Invalid JSON body')));
24
- }
25
- const authToken = server.getAuthToken((name) => c.req.header(name));
26
- if (isStreamRequest(body)) {
27
- c.header('X-Accel-Buffering', 'no');
28
- return streamSSE(c, async (stream) => {
29
- const controller = new AbortController();
30
- stream.onAbort(() => controller.abort());
31
- try {
32
- for await (const event of server.handleJsonRpcStream(body, authToken, controller.signal)) {
33
- if (controller.signal.aborted)
34
- return;
35
- await stream.writeSSE({ data: JSON.stringify(event) });
36
- }
37
- if (!controller.signal.aborted)
38
- await stream.writeSSE({ data: '[DONE]' });
39
- }
40
- catch (error) {
41
- if (controller.signal.aborted)
42
- return;
43
- try {
44
- await stream.writeSSE({ data: JSON.stringify(buildSseErrorEvent(error)) });
45
- }
46
- catch {
47
- return;
48
- }
49
- }
19
+ const response = await handleA2AHttp(server, {
20
+ method: c.req.method,
21
+ path: relativePath,
22
+ mountUrl: mountUrlOf(new URL(c.req.url), relativePath),
23
+ header: (name) => c.req.header(name),
24
+ readBody: () => c.req.json(),
25
+ signal: controller.signal,
50
26
  });
51
- }
52
- try {
53
- const response = await server.handleJsonRpc(body, authToken);
54
- if (response === null) {
55
- return c.body(null, 204);
27
+ switch (response.kind) {
28
+ case 'json':
29
+ return c.json(response.body, response.status, response.headers);
30
+ case 'empty':
31
+ return c.body(null, response.status);
32
+ case 'pass':
33
+ return c.notFound();
34
+ case 'sse':
35
+ c.header('X-Accel-Buffering', 'no');
36
+ return streamSSE(c, async (stream) => {
37
+ stream.onAbort(() => controller.abort());
38
+ await response.pipe(async (frame) => {
39
+ await stream.write(frame);
40
+ });
41
+ });
56
42
  }
57
- return c.json(response);
58
43
  }
59
44
  catch (error) {
60
45
  return c.json(createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed')));
61
46
  }
62
- });
47
+ };
48
+ const base = trimTrailingSlashes(server.basePath);
49
+ const agentPath = (c) => `${base}/${encodeURIComponent(c.req.param('agent') ?? '')}`;
50
+ app.get(AGENT_CARD_PATH, (c) => serve(c, AGENT_CARD_PATH));
51
+ app.get(LEGACY_AGENT_CARD_PATH, (c) => serve(c, LEGACY_AGENT_CARD_PATH));
52
+ app.get(`${base}/:agent${AGENT_CARD_PATH}`, (c) => serve(c, `${agentPath(c)}${AGENT_CARD_PATH}`));
53
+ app.post(server.basePath, (c) => serve(c, server.basePath));
54
+ app.post(`${base}/:agent`, (c) => serve(c, agentPath(c)));
63
55
  return app;
64
56
  }
65
57
  //# sourceMappingURL=hono.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
1
  import type { Middleware } from 'koa';
2
2
  import type { A2AServer } from '../server.js';
3
+ /**
4
+ * Koa middleware serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
5
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
6
+ * endpoint under `<basePath>/<agent name>`. JSON bodies must be parsed by a body parser before it.
7
+ */
3
8
  export declare function a2aKoa(server: A2AServer): Middleware;
4
9
  //# sourceMappingURL=koa.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,KAAK,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAyDpD"}
1
+ {"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAW,MAAM,KAAK,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAW9C;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CA2CpD"}
@@ -1,32 +1,52 @@
1
1
  import { createErrorResponse } from '../json-rpc.js';
2
2
  import * as errors from '../errors.js';
3
- import { isStreamRequest, pipeJsonRpcStream, SSE_HEADERS } from './shared.js';
3
+ import { handleA2AHttp } from './shared.js';
4
+ /** Where the middleware is mounted: the part of the original path before `ctx.path` (koa-mount). */
5
+ function mountPath(ctx) {
6
+ const original = new URL(ctx.originalUrl, 'http://localhost').pathname;
7
+ return original.endsWith(ctx.path) ? original.slice(0, original.length - ctx.path.length) : '';
8
+ }
9
+ /**
10
+ * Koa middleware serving an A2A server: the Agent Card at `/.well-known/agent-card.json` (and the
11
+ * pre-v0.3 `/.well-known/agent.json`), JSON-RPC at `basePath`, and every agent's own card and
12
+ * endpoint under `<basePath>/<agent name>`. JSON bodies must be parsed by a body parser before it.
13
+ */
4
14
  export function a2aKoa(server) {
5
15
  return async (ctx, next) => {
6
- if (ctx.path === '/.well-known/agent.json' && ctx.method === 'GET') {
7
- const cards = server.getAgentCards();
8
- ctx.body = cards.length === 1 ? cards[0] : cards;
16
+ const controller = new AbortController();
17
+ ctx.res.on('close', () => controller.abort());
18
+ let response;
19
+ try {
20
+ response = await handleA2AHttp(server, {
21
+ method: ctx.method,
22
+ path: ctx.path,
23
+ mountUrl: `${ctx.protocol}://${ctx.host}${mountPath(ctx)}`,
24
+ header: (name) => ctx.get(name) || undefined,
25
+ readBody: async () => ctx.request.body,
26
+ signal: controller.signal,
27
+ });
28
+ }
29
+ catch (error) {
30
+ ctx.body = createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed'));
9
31
  return;
10
32
  }
11
- if (ctx.path === server.basePath && ctx.method === 'POST') {
12
- const contentType = ctx.headers['content-type'];
13
- if (contentType && !contentType.startsWith('application/json')) {
14
- ctx.body = createErrorResponse(null, errors.contentTypeNotSupported(contentType));
33
+ switch (response.kind) {
34
+ case 'pass':
35
+ await next();
15
36
  return;
16
- }
17
- const body = ctx.request.body;
18
- if (body === undefined) {
19
- ctx.body = createErrorResponse(null, errors.parseError('Request body not parsed. Ensure body-parsing middleware is applied.'));
37
+ case 'json':
38
+ ctx.status = response.status;
39
+ ctx.set(response.headers);
40
+ ctx.body = response.body;
20
41
  return;
21
- }
22
- const authToken = server.getAuthToken((name) => ctx.get(name) || undefined);
23
- if (isStreamRequest(body)) {
42
+ case 'empty':
43
+ ctx.status = response.status;
44
+ return;
45
+ case 'sse': {
24
46
  ctx.respond = false;
25
47
  const res = ctx.res;
26
- const controller = new AbortController();
27
- res.on('close', () => controller.abort());
28
- res.writeHead(200, SSE_HEADERS);
29
- await pipeJsonRpcStream(server, body, authToken, controller.signal, (frame) => {
48
+ res.writeHead(200, response.headers);
49
+ await response.pipe((frame) => {
30
50
  if (!res.writableEnded && !res.destroyed)
31
51
  res.write(frame);
32
52
  });
@@ -34,20 +54,7 @@ export function a2aKoa(server) {
34
54
  res.end();
35
55
  return;
36
56
  }
37
- try {
38
- const response = await server.handleJsonRpc(body, authToken);
39
- if (response === null) {
40
- ctx.status = 204;
41
- return;
42
- }
43
- ctx.body = response;
44
- }
45
- catch (error) {
46
- ctx.body = createErrorResponse(null, errors.clientJsonRpcError(error, 'A2A request failed'));
47
- }
48
- return;
49
57
  }
50
- await next();
51
58
  };
52
59
  }
53
60
  //# sourceMappingURL=koa.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"koa.js","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koa.js","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,17 @@
1
1
  import type { A2AServer } from '../server.js';
2
+ type RouteParams = Record<string, string | string[] | undefined>;
3
+ /** The context Next.js passes a route handler; `agent` is read from a dynamic `[agent]` segment. */
4
+ export interface NextRouteContext {
5
+ params?: RouteParams | Promise<RouteParams>;
6
+ }
7
+ /**
8
+ * Next.js App Router handlers for an A2A server. Export `GET` from the route that serves
9
+ * `/.well-known/agent-card.json` and `POST` from the route at `basePath`. In a dynamic
10
+ * `[agent]` route they serve that agent's own card and endpoint.
11
+ */
2
12
  export declare function a2aNext(server: A2AServer): {
3
- GET(): Promise<Response>;
4
- POST(request: Request): Promise<Response>;
13
+ GET(request: Request, context?: NextRouteContext): Promise<Response>;
14
+ POST(request: Request, context?: NextRouteContext): Promise<Response>;
5
15
  };
16
+ export {};
6
17
  //# sourceMappingURL=next.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/adapters/next.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS;WAExB,OAAO,CAAC,QAAQ,CAAC;kBAKV,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;EAwDlD"}
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/adapters/next.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEjE,oGAAoG;AACpG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC7C;AAwCD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS;iBA4BlB,OAAO,YAAY,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;kBAQtD,OAAO,YAAY,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;EAM9E"}