@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.
- package/README.md +173 -151
- package/dist/adapters/express.d.ts +5 -0
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +53 -30
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts +5 -0
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +51 -35
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/hono.d.ts +5 -0
- package/dist/adapters/hono.d.ts.map +1 -1
- package/dist/adapters/hono.js +41 -49
- package/dist/adapters/hono.js.map +1 -1
- package/dist/adapters/koa.d.ts +5 -0
- package/dist/adapters/koa.d.ts.map +1 -1
- package/dist/adapters/koa.js +39 -32
- package/dist/adapters/koa.js.map +1 -1
- package/dist/adapters/next.d.ts +13 -2
- package/dist/adapters/next.d.ts.map +1 -1
- package/dist/adapters/next.js +75 -51
- package/dist/adapters/next.js.map +1 -1
- package/dist/adapters/shared.d.ts +43 -10
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +156 -23
- package/dist/adapters/shared.js.map +1 -1
- package/dist/agent-card.d.ts +22 -7
- package/dist/agent-card.d.ts.map +1 -1
- package/dist/agent-card.js +71 -34
- package/dist/agent-card.js.map +1 -1
- package/dist/approvals.d.ts +46 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +105 -0
- package/dist/approvals.js.map +1 -0
- package/dist/client.d.ts +59 -17
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +237 -142
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +24 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +90 -19
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +11 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/ownership.d.ts +7 -1
- package/dist/ownership.d.ts.map +1 -1
- package/dist/ownership.js +24 -3
- package/dist/ownership.js.map +1 -1
- package/dist/protocol.d.ts +70 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +187 -0
- package/dist/protocol.js.map +1 -0
- package/dist/push-notifications.d.ts +5 -2
- package/dist/push-notifications.d.ts.map +1 -1
- package/dist/push-notifications.js +33 -23
- package/dist/push-notifications.js.map +1 -1
- package/dist/redis-task-store.js +3 -3
- package/dist/redis-task-store.js.map +1 -1
- package/dist/server.d.ts +75 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +324 -270
- package/dist/server.js.map +1 -1
- package/dist/task-manager.d.ts +57 -11
- package/dist/task-manager.d.ts.map +1 -1
- package/dist/task-manager.js +264 -116
- package/dist/task-manager.js.map +1 -1
- package/dist/task-store.js +4 -4
- package/dist/task-store.js.map +1 -1
- package/dist/types.d.ts +226 -85
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -3
- package/dist/types.js.map +1 -1
- package/dist/url.d.ts +7 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +12 -0
- package/dist/url.js.map +1 -0
- package/package.json +19 -9
- package/dist/adapters/sse-error-event.d.ts +0 -3
- package/dist/adapters/sse-error-event.d.ts.map +0 -1
- package/dist/adapters/sse-error-event.js +0 -12
- package/dist/adapters/sse-error-event.js.map +0 -1
package/dist/adapters/express.js
CHANGED
|
@@ -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 {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAkD,MAAM,SAAS,CAAC;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,
|
|
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,
|
|
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"}
|
package/dist/adapters/fastify.js
CHANGED
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
import { createErrorResponse } from '../json-rpc.js';
|
|
2
2
|
import * as errors from '../errors.js';
|
|
3
|
-
import {
|
|
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
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
raw.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/adapters/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/hono.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/adapters/hono.js
CHANGED
|
@@ -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 {
|
|
6
|
-
import {
|
|
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
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/adapters/hono.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/koa.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/adapters/koa.js
CHANGED
|
@@ -1,32 +1,52 @@
|
|
|
1
1
|
import { createErrorResponse } from '../json-rpc.js';
|
|
2
2
|
import * as errors from '../errors.js';
|
|
3
|
-
import {
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ctx.body = createErrorResponse(null, errors.contentTypeNotSupported(contentType));
|
|
33
|
+
switch (response.kind) {
|
|
34
|
+
case 'pass':
|
|
35
|
+
await next();
|
|
15
36
|
return;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
ctx.body =
|
|
37
|
+
case 'json':
|
|
38
|
+
ctx.status = response.status;
|
|
39
|
+
ctx.set(response.headers);
|
|
40
|
+
ctx.body = response.body;
|
|
20
41
|
return;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
package/dist/adapters/koa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"koa.js","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"koa.js","sourceRoot":"","sources":["../../src/adapters/koa.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/next.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|