@cogitator-ai/a2a 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 (57) hide show
  1. package/dist/adapters/express.d.ts +4 -0
  2. package/dist/adapters/express.d.ts.map +1 -0
  3. package/dist/adapters/express.js +34 -0
  4. package/dist/adapters/express.js.map +1 -0
  5. package/dist/adapters/fastify.d.ts +4 -0
  6. package/dist/adapters/fastify.d.ts.map +1 -0
  7. package/dist/adapters/fastify.js +33 -0
  8. package/dist/adapters/fastify.js.map +1 -0
  9. package/dist/adapters/hono.d.ts +4 -0
  10. package/dist/adapters/hono.d.ts.map +1 -0
  11. package/dist/adapters/hono.js +30 -0
  12. package/dist/adapters/hono.js.map +1 -0
  13. package/dist/adapters/koa.d.ts +4 -0
  14. package/dist/adapters/koa.d.ts.map +1 -0
  15. package/dist/adapters/koa.js +38 -0
  16. package/dist/adapters/koa.js.map +1 -0
  17. package/dist/adapters/next.d.ts +11 -0
  18. package/dist/adapters/next.d.ts.map +1 -0
  19. package/dist/adapters/next.js +39 -0
  20. package/dist/adapters/next.js.map +1 -0
  21. package/dist/agent-card.d.ts +9 -0
  22. package/dist/agent-card.d.ts.map +1 -0
  23. package/dist/agent-card.js +31 -0
  24. package/dist/agent-card.js.map +1 -0
  25. package/dist/client.d.ts +38 -0
  26. package/dist/client.d.ts.map +1 -0
  27. package/dist/client.js +230 -0
  28. package/dist/client.js.map +1 -0
  29. package/dist/errors.d.ts +19 -0
  30. package/dist/errors.d.ts.map +1 -0
  31. package/dist/errors.js +52 -0
  32. package/dist/errors.js.map +1 -0
  33. package/dist/index.d.ts +14 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +9 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/json-rpc.d.ts +26 -0
  38. package/dist/json-rpc.d.ts.map +1 -0
  39. package/dist/json-rpc.js +44 -0
  40. package/dist/json-rpc.js.map +1 -0
  41. package/dist/server.d.ts +20 -0
  42. package/dist/server.d.ts.map +1 -0
  43. package/dist/server.js +245 -0
  44. package/dist/server.js.map +1 -0
  45. package/dist/task-manager.d.ts +22 -0
  46. package/dist/task-manager.d.ts.map +1 -0
  47. package/dist/task-manager.js +175 -0
  48. package/dist/task-manager.js.map +1 -0
  49. package/dist/task-store.d.ts +10 -0
  50. package/dist/task-store.d.ts.map +1 -0
  51. package/dist/task-store.js +33 -0
  52. package/dist/task-store.js.map +1 -0
  53. package/dist/types.d.ts +174 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +10 -0
  56. package/dist/types.js.map +1 -0
  57. package/package.json +97 -0
package/dist/errors.js ADDED
@@ -0,0 +1,52 @@
1
+ export function taskNotFound(taskId) {
2
+ return { code: -32001, message: `Task not found: ${taskId}`, data: { taskId } };
3
+ }
4
+ export function taskNotCancelable(taskId) {
5
+ return { code: -32002, message: `Task is not cancelable: ${taskId}`, data: { taskId } };
6
+ }
7
+ export function pushNotificationsNotSupported() {
8
+ return { code: -32003, message: 'Push notifications are not supported' };
9
+ }
10
+ export function unsupportedOperation(method) {
11
+ return { code: -32004, message: `Unsupported operation: ${method}`, data: { method } };
12
+ }
13
+ export function contentTypeNotSupported(contentType) {
14
+ return {
15
+ code: -32005,
16
+ message: `Content type not supported: ${contentType}`,
17
+ data: { contentType },
18
+ };
19
+ }
20
+ export function invalidAgentResponse(detail) {
21
+ return { code: -32006, message: `Invalid agent response: ${detail}` };
22
+ }
23
+ export function agentNotFound(agentName) {
24
+ return { code: -32007, message: `Agent not found: ${agentName}`, data: { agentName } };
25
+ }
26
+ export function parseError(detail) {
27
+ return { code: -32700, message: detail ? `Parse error: ${detail}` : 'Parse error' };
28
+ }
29
+ export function invalidRequest(detail) {
30
+ return { code: -32600, message: detail ? `Invalid request: ${detail}` : 'Invalid request' };
31
+ }
32
+ export function methodNotFound(method) {
33
+ return { code: -32601, message: `Method not found: ${method}`, data: { method } };
34
+ }
35
+ export function invalidParams(detail) {
36
+ return { code: -32602, message: `Invalid params: ${detail}` };
37
+ }
38
+ export function internalError(detail) {
39
+ return { code: -32603, message: detail ? `Internal error: ${detail}` : 'Internal error' };
40
+ }
41
+ export class A2AError extends Error {
42
+ jsonRpcError;
43
+ constructor(jsonRpcError) {
44
+ super(jsonRpcError.message);
45
+ this.jsonRpcError = jsonRpcError;
46
+ this.name = 'A2AError';
47
+ }
48
+ get code() {
49
+ return this.jsonRpcError.code;
50
+ }
51
+ }
52
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2BAA2B,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,6BAA6B;IAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,0BAA0B,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,OAAO;QACL,IAAI,EAAE,CAAC,KAAK;QACZ,OAAO,EAAE,+BAA+B,WAAW,EAAE;QACrD,IAAI,EAAE,EAAE,WAAW,EAAE;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2BAA2B,MAAM,EAAE,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,oBAAoB,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qBAAqB,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,MAAM,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAe;IAC3C,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACL;IAA5B,YAA4B,YAA0B;QACpD,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QADF,iBAAY,GAAZ,YAAY,CAAc;QAEpD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ export { A2AServer } from './server.js';
2
+ export { A2AClient } from './client.js';
3
+ export type { A2AToolOptions } from './client.js';
4
+ export { generateAgentCard } from './agent-card.js';
5
+ export type { AgentCardOptions } from './agent-card.js';
6
+ export { InMemoryTaskStore } from './task-store.js';
7
+ export { TaskManager } from './task-manager.js';
8
+ export type { TaskManagerConfig } from './task-manager.js';
9
+ export { parseJsonRpcRequest, createSuccessResponse, createErrorResponse, isValidRequest, JsonRpcParseError, } from './json-rpc.js';
10
+ export type { JsonRpcRequest, JsonRpcResponse, JsonRpcError } from './json-rpc.js';
11
+ export { taskNotFound, taskNotCancelable, pushNotificationsNotSupported, unsupportedOperation, contentTypeNotSupported, invalidAgentResponse, agentNotFound, parseError, invalidRequest, methodNotFound, invalidParams, internalError, A2AError, } from './errors.js';
12
+ export { TERMINAL_STATES, isTerminalState } from './types.js';
13
+ export type { TaskState, TextPart, FilePart, DataPart, Part, A2AMessage, Artifact, A2AErrorDetail, TaskStatus, A2ATask, AgentProvider, A2ACapabilities, AgentSkill, SecurityScheme, AgentCard, SendMessageConfiguration, TaskFilter, TaskStore, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, A2AStreamEvent, AgentRunResult, CogitatorLike, A2AAuthConfig, A2AServerConfig, A2AClientConfig, } from './types.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,6BAA6B,EAC7B,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,YAAY,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,cAAc,EACd,UAAU,EACV,OAAO,EACP,aAAa,EACb,eAAe,EACf,UAAU,EACV,cAAc,EACd,SAAS,EACT,wBAAwB,EACxB,UAAU,EACV,SAAS,EACT,qBAAqB,EACrB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { A2AServer } from './server.js';
2
+ export { A2AClient } from './client.js';
3
+ export { generateAgentCard } from './agent-card.js';
4
+ export { InMemoryTaskStore } from './task-store.js';
5
+ export { TaskManager } from './task-manager.js';
6
+ export { parseJsonRpcRequest, createSuccessResponse, createErrorResponse, isValidRequest, JsonRpcParseError, } from './json-rpc.js';
7
+ export { taskNotFound, taskNotCancelable, pushNotificationsNotSupported, unsupportedOperation, contentTypeNotSupported, invalidAgentResponse, agentNotFound, parseError, invalidRequest, methodNotFound, invalidParams, internalError, A2AError, } from './errors.js';
8
+ export { TERMINAL_STATES, isTerminalState } from './types.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,6BAA6B,EAC7B,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface JsonRpcRequest {
2
+ jsonrpc: '2.0';
3
+ method: string;
4
+ params?: unknown;
5
+ id: string | number;
6
+ }
7
+ export interface JsonRpcResponse {
8
+ jsonrpc: '2.0';
9
+ result?: unknown;
10
+ error?: JsonRpcError;
11
+ id: string | number | null;
12
+ }
13
+ export interface JsonRpcError {
14
+ code: number;
15
+ message: string;
16
+ data?: unknown;
17
+ }
18
+ export declare class JsonRpcParseError extends Error {
19
+ readonly code: number;
20
+ constructor(message: string, code?: number);
21
+ }
22
+ export declare function isValidRequest(req: unknown): req is JsonRpcRequest;
23
+ export declare function parseJsonRpcRequest(body: unknown): JsonRpcRequest | JsonRpcRequest[];
24
+ export declare function createSuccessResponse(id: string | number, result: unknown): JsonRpcResponse;
25
+ export declare function createErrorResponse(id: string | number | null, error: JsonRpcError): JsonRpcResponse;
26
+ //# sourceMappingURL=json-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc.d.ts","sourceRoot":"","sources":["../src/json-rpc.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;gBAD5B,OAAO,EAAE,MAAM,EACC,IAAI,GAAE,MAAe;CAKxC;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAYlE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,cAAc,EAAE,CAwBpF;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,eAAe,CAE3F;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,EAC1B,KAAK,EAAE,YAAY,GAClB,eAAe,CAEjB"}
@@ -0,0 +1,44 @@
1
+ export class JsonRpcParseError extends Error {
2
+ code;
3
+ constructor(message, code = -32700) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'JsonRpcParseError';
7
+ }
8
+ }
9
+ export function isValidRequest(req) {
10
+ if (req === null || typeof req !== 'object' || Array.isArray(req)) {
11
+ return false;
12
+ }
13
+ const obj = req;
14
+ return (obj.jsonrpc === '2.0' &&
15
+ typeof obj.method === 'string' &&
16
+ (typeof obj.id === 'string' || typeof obj.id === 'number'));
17
+ }
18
+ export function parseJsonRpcRequest(body) {
19
+ if (body === null || body === undefined || typeof body !== 'object') {
20
+ throw new JsonRpcParseError('Invalid JSON-RPC request: expected object or array');
21
+ }
22
+ if (Array.isArray(body)) {
23
+ if (body.length === 0) {
24
+ throw new JsonRpcParseError('Invalid JSON-RPC batch: empty array');
25
+ }
26
+ for (const item of body) {
27
+ if (!isValidRequest(item)) {
28
+ throw new JsonRpcParseError('Invalid JSON-RPC request in batch');
29
+ }
30
+ }
31
+ return body;
32
+ }
33
+ if (!isValidRequest(body)) {
34
+ throw new JsonRpcParseError('Invalid JSON-RPC request structure');
35
+ }
36
+ return body;
37
+ }
38
+ export function createSuccessResponse(id, result) {
39
+ return { jsonrpc: '2.0', result, id };
40
+ }
41
+ export function createErrorResponse(id, error) {
42
+ return { jsonrpc: '2.0', error, id };
43
+ }
44
+ //# sourceMappingURL=json-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-rpc.js","sourceRoot":"","sources":["../src/json-rpc.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IAFlB,YACE,OAAe,EACC,OAAe,CAAC,KAAK;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,SAAI,GAAJ,IAAI,CAAiB;QAGrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,OAAO,CACL,GAAG,CAAC,OAAO,KAAK,KAAK;QACrB,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAC9B,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,oDAAoD,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CAAC,qCAAqC,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,iBAAiB,CAAC,mCAAmC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,OAAO,IAAwB,CAAC;IAClC,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,IAAsB,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAmB,EAAE,MAAe;IACxE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAA0B,EAC1B,KAAmB;IAEnB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { A2AServerConfig, AgentCard, A2AStreamEvent } from './types.js';
2
+ import type { JsonRpcResponse } from './json-rpc.js';
3
+ export declare class A2AServer {
4
+ private agents;
5
+ private cogitator;
6
+ private taskManager;
7
+ private agentCards;
8
+ private basePath;
9
+ private cardUrl;
10
+ constructor(config: A2AServerConfig);
11
+ getAgentCard(agentName?: string): AgentCard;
12
+ getAgentCards(): AgentCard[];
13
+ handleJsonRpc(body: unknown): Promise<JsonRpcResponse>;
14
+ handleJsonRpcStream(body: unknown): AsyncGenerator<A2AStreamEvent>;
15
+ private routeMethod;
16
+ private handleSendMessage;
17
+ private handleGetTask;
18
+ private handleCancelTask;
19
+ }
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAGT,cAAc,EAGf,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,eAAe,CAAC;AAcrE,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,eAAe;IAyBnC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;IAS3C,aAAa,IAAI,SAAS,EAAE;IAItB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BrD,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC,cAAc,CAAC;YA4I3D,WAAW;YAeX,iBAAiB;YAoBjB,aAAa;YAMb,gBAAgB;CAK/B"}
package/dist/server.js ADDED
@@ -0,0 +1,245 @@
1
+ import { parseJsonRpcRequest, createSuccessResponse, createErrorResponse, JsonRpcParseError, } from './json-rpc.js';
2
+ import { TaskManager } from './task-manager.js';
3
+ import { generateAgentCard } from './agent-card.js';
4
+ import { A2AError } from './errors.js';
5
+ import * as errors from './errors.js';
6
+ import { InMemoryTaskStore } from './task-store.js';
7
+ import { isTerminalState } from './types.js';
8
+ export class A2AServer {
9
+ agents;
10
+ cogitator;
11
+ taskManager;
12
+ agentCards;
13
+ basePath;
14
+ cardUrl;
15
+ constructor(config) {
16
+ const agentNames = Object.keys(config.agents);
17
+ if (agentNames.length === 0) {
18
+ throw new Error('A2AServer requires at least one agent');
19
+ }
20
+ this.agents = config.agents;
21
+ this.cogitator = config.cogitator;
22
+ this.basePath = config.basePath ?? '/a2a';
23
+ this.cardUrl = config.cardUrl ?? '';
24
+ this.taskManager = new TaskManager({
25
+ taskStore: config.taskStore ?? new InMemoryTaskStore(),
26
+ });
27
+ this.agentCards = new Map();
28
+ for (const [name, agent] of Object.entries(this.agents)) {
29
+ const card = generateAgentCard(agent, {
30
+ url: this.cardUrl || this.basePath,
31
+ capabilities: { streaming: true, pushNotifications: false },
32
+ });
33
+ this.agentCards.set(name, card);
34
+ }
35
+ }
36
+ getAgentCard(agentName) {
37
+ if (agentName) {
38
+ const card = this.agentCards.get(agentName);
39
+ if (!card)
40
+ throw new A2AError(errors.agentNotFound(agentName));
41
+ return card;
42
+ }
43
+ return this.agentCards.values().next().value;
44
+ }
45
+ getAgentCards() {
46
+ return Array.from(this.agentCards.values());
47
+ }
48
+ async handleJsonRpc(body) {
49
+ let request;
50
+ try {
51
+ const parsed = parseJsonRpcRequest(body);
52
+ if (Array.isArray(parsed)) {
53
+ return createErrorResponse(null, errors.invalidRequest('Batch requests are not supported'));
54
+ }
55
+ request = parsed;
56
+ }
57
+ catch (e) {
58
+ if (e instanceof JsonRpcParseError) {
59
+ return createErrorResponse(null, errors.parseError(e.message));
60
+ }
61
+ return createErrorResponse(null, errors.internalError(String(e)));
62
+ }
63
+ try {
64
+ const result = await this.routeMethod(request.method, request.params);
65
+ return createSuccessResponse(request.id, result);
66
+ }
67
+ catch (e) {
68
+ if (e instanceof A2AError) {
69
+ return createErrorResponse(request.id, e.jsonRpcError);
70
+ }
71
+ return createErrorResponse(request.id, errors.internalError(e instanceof Error ? e.message : String(e)));
72
+ }
73
+ }
74
+ async *handleJsonRpcStream(body) {
75
+ let request;
76
+ try {
77
+ const parsed = parseJsonRpcRequest(body);
78
+ if (Array.isArray(parsed)) {
79
+ yield {
80
+ type: 'status-update',
81
+ taskId: '',
82
+ status: {
83
+ state: 'failed',
84
+ timestamp: new Date().toISOString(),
85
+ message: 'Batch requests are not supported',
86
+ },
87
+ timestamp: new Date().toISOString(),
88
+ };
89
+ return;
90
+ }
91
+ request = parsed;
92
+ }
93
+ catch (e) {
94
+ yield {
95
+ type: 'status-update',
96
+ taskId: '',
97
+ status: {
98
+ state: 'failed',
99
+ timestamp: new Date().toISOString(),
100
+ message: e instanceof Error ? e.message : 'Invalid JSON-RPC request',
101
+ },
102
+ timestamp: new Date().toISOString(),
103
+ };
104
+ return;
105
+ }
106
+ if (request.method !== 'message/stream') {
107
+ yield {
108
+ type: 'status-update',
109
+ taskId: '',
110
+ status: {
111
+ state: 'failed',
112
+ timestamp: new Date().toISOString(),
113
+ message: `Unsupported method for streaming: ${request.method}`,
114
+ },
115
+ timestamp: new Date().toISOString(),
116
+ };
117
+ return;
118
+ }
119
+ const params = request.params;
120
+ if (!params?.message) {
121
+ yield {
122
+ type: 'status-update',
123
+ taskId: '',
124
+ status: {
125
+ state: 'failed',
126
+ timestamp: new Date().toISOString(),
127
+ message: 'Missing required parameter: message',
128
+ },
129
+ timestamp: new Date().toISOString(),
130
+ };
131
+ return;
132
+ }
133
+ const agentName = params.agentName ?? Object.keys(this.agents)[0];
134
+ const agent = this.agents[agentName];
135
+ if (!agent) {
136
+ yield {
137
+ type: 'status-update',
138
+ taskId: '',
139
+ status: {
140
+ state: 'failed',
141
+ timestamp: new Date().toISOString(),
142
+ message: `Agent not found: ${agentName}`,
143
+ },
144
+ timestamp: new Date().toISOString(),
145
+ };
146
+ return;
147
+ }
148
+ const task = await this.taskManager.createTask(params.message);
149
+ const eventQueue = [];
150
+ let resolve = null;
151
+ const onEvent = (event) => {
152
+ if (event.taskId === task.id) {
153
+ eventQueue.push(event);
154
+ if (resolve) {
155
+ resolve();
156
+ resolve = null;
157
+ }
158
+ }
159
+ };
160
+ this.taskManager.on('event', onEvent);
161
+ let executionDone = false;
162
+ const executionPromise = this.taskManager
163
+ .executeTask(task, this.cogitator, agent, params.message)
164
+ .then(() => {
165
+ executionDone = true;
166
+ if (resolve) {
167
+ resolve();
168
+ resolve = null;
169
+ }
170
+ });
171
+ try {
172
+ yield {
173
+ type: 'status-update',
174
+ taskId: task.id,
175
+ status: task.status,
176
+ timestamp: new Date().toISOString(),
177
+ };
178
+ let done = false;
179
+ while (!done) {
180
+ if (eventQueue.length > 0) {
181
+ const event = eventQueue.shift();
182
+ yield event;
183
+ if (event.type === 'status-update' && isTerminalState(event.status.state)) {
184
+ done = true;
185
+ }
186
+ }
187
+ else if (executionDone) {
188
+ const finalTask = await this.taskManager.getTask(task.id);
189
+ if (isTerminalState(finalTask.status.state)) {
190
+ done = true;
191
+ }
192
+ }
193
+ else {
194
+ await new Promise((r) => {
195
+ resolve = r;
196
+ });
197
+ }
198
+ }
199
+ }
200
+ finally {
201
+ this.taskManager.removeListener('event', onEvent);
202
+ await executionPromise.catch(() => { });
203
+ }
204
+ }
205
+ async routeMethod(method, params) {
206
+ switch (method) {
207
+ case 'message/send':
208
+ return this.handleSendMessage(params);
209
+ case 'message/stream':
210
+ throw new A2AError(errors.unsupportedOperation('Use handleJsonRpcStream for streaming'));
211
+ case 'tasks/get':
212
+ return this.handleGetTask(params);
213
+ case 'tasks/cancel':
214
+ return this.handleCancelTask(params);
215
+ default:
216
+ throw new A2AError(errors.methodNotFound(method));
217
+ }
218
+ }
219
+ async handleSendMessage(params) {
220
+ const { message, agentName } = params;
221
+ if (!message || !message.parts || !message.role) {
222
+ throw new A2AError(errors.invalidParams('message is required with role and parts'));
223
+ }
224
+ const resolvedAgentName = agentName ?? Object.keys(this.agents)[0];
225
+ const agent = this.agents[resolvedAgentName];
226
+ if (!agent)
227
+ throw new A2AError(errors.agentNotFound(resolvedAgentName));
228
+ const task = await this.taskManager.createTask(message);
229
+ const completed = await this.taskManager.executeTask(task, this.cogitator, agent, message);
230
+ return completed;
231
+ }
232
+ async handleGetTask(params) {
233
+ const { id } = params;
234
+ if (!id)
235
+ throw new A2AError(errors.invalidParams('id is required'));
236
+ return this.taskManager.getTask(id);
237
+ }
238
+ async handleCancelTask(params) {
239
+ const { id } = params;
240
+ if (!id)
241
+ throw new A2AError(errors.invalidParams('id is required'));
242
+ return this.taskManager.cancelTask(id);
243
+ }
244
+ }
245
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { A2ATask, A2AMessage, TaskStore, CogitatorLike, AgentRunResult } from './types.js';
3
+ export type { CogitatorLike, AgentRunResult };
4
+ export interface TaskManagerConfig {
5
+ taskStore?: TaskStore;
6
+ }
7
+ export declare class TaskManager extends EventEmitter {
8
+ private store;
9
+ private activeTasks;
10
+ constructor(config?: TaskManagerConfig);
11
+ createTask(message: A2AMessage, contextId?: string): Promise<A2ATask>;
12
+ executeTask(task: A2ATask, cogitator: CogitatorLike, agent: unknown, message: A2AMessage, onToken?: (token: string) => void): Promise<A2ATask>;
13
+ completeTask(taskId: string, result: AgentRunResult): Promise<A2ATask>;
14
+ failTask(taskId: string, errorMessage: string): Promise<A2ATask>;
15
+ cancelTask(taskId: string): Promise<A2ATask>;
16
+ getTask(taskId: string): Promise<A2ATask>;
17
+ private extractTextFromMessage;
18
+ private buildArtifacts;
19
+ private emitStatusUpdate;
20
+ private emitArtifactUpdate;
21
+ }
22
+ //# sourceMappingURL=task-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../src/task-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,SAAS,EAIT,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAMpB,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAAsC;gBAE7C,MAAM,CAAC,EAAE,iBAAiB;IAKhC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAarE,WAAW,CACf,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,OAAO,CAAC;IA2Bb,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAsCtE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAehE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB5C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,kBAAkB;CAS3B"}
@@ -0,0 +1,175 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { InMemoryTaskStore } from './task-store.js';
4
+ import { isTerminalState } from './types.js';
5
+ import { A2AError } from './errors.js';
6
+ import * as errors from './errors.js';
7
+ export class TaskManager extends EventEmitter {
8
+ store;
9
+ activeTasks = new Map();
10
+ constructor(config) {
11
+ super();
12
+ this.store = config?.taskStore ?? new InMemoryTaskStore();
13
+ }
14
+ async createTask(message, contextId) {
15
+ const task = {
16
+ id: `task_${randomUUID()}`,
17
+ contextId: contextId ?? `ctx_${randomUUID()}`,
18
+ status: { state: 'working', timestamp: new Date().toISOString() },
19
+ history: [message],
20
+ artifacts: [],
21
+ };
22
+ await this.store.create(task);
23
+ this.emitStatusUpdate(task);
24
+ return task;
25
+ }
26
+ async executeTask(task, cogitator, agent, message, onToken) {
27
+ const abortController = new AbortController();
28
+ this.activeTasks.set(task.id, abortController);
29
+ try {
30
+ const input = this.extractTextFromMessage(message);
31
+ const result = await cogitator.run(agent, {
32
+ input,
33
+ signal: abortController.signal,
34
+ stream: !!onToken,
35
+ onToken,
36
+ });
37
+ return await this.completeTask(task.id, result);
38
+ }
39
+ catch (error) {
40
+ if (abortController.signal.aborted) {
41
+ const current = await this.store.get(task.id);
42
+ if (current && isTerminalState(current.status.state)) {
43
+ return current;
44
+ }
45
+ return await this.cancelTask(task.id);
46
+ }
47
+ return await this.failTask(task.id, error instanceof Error ? error.message : String(error));
48
+ }
49
+ finally {
50
+ this.activeTasks.delete(task.id);
51
+ }
52
+ }
53
+ async completeTask(taskId, result) {
54
+ const existing = await this.store.get(taskId);
55
+ if (!existing)
56
+ throw new A2AError(errors.taskNotFound(taskId));
57
+ const artifacts = this.buildArtifacts(result);
58
+ const agentMessage = {
59
+ role: 'agent',
60
+ parts: [{ type: 'text', text: result.output }],
61
+ taskId,
62
+ };
63
+ if (result.structured) {
64
+ agentMessage.parts.push({
65
+ type: 'data',
66
+ mimeType: 'application/json',
67
+ data: result.structured,
68
+ });
69
+ }
70
+ const status = {
71
+ state: 'completed',
72
+ timestamp: new Date().toISOString(),
73
+ };
74
+ const history = [...existing.history, agentMessage];
75
+ await this.store.update(taskId, { status, artifacts, history });
76
+ const updatedTask = await this.store.get(taskId);
77
+ if (!updatedTask)
78
+ throw new A2AError(errors.taskNotFound(taskId));
79
+ this.emitStatusUpdate(updatedTask);
80
+ for (const artifact of artifacts) {
81
+ this.emitArtifactUpdate(updatedTask.id, artifact);
82
+ }
83
+ return updatedTask;
84
+ }
85
+ async failTask(taskId, errorMessage) {
86
+ const status = {
87
+ state: 'failed',
88
+ timestamp: new Date().toISOString(),
89
+ message: errorMessage,
90
+ errorDetails: { code: -1, message: errorMessage },
91
+ };
92
+ await this.store.update(taskId, { status });
93
+ const task = await this.store.get(taskId);
94
+ if (!task)
95
+ throw new A2AError(errors.taskNotFound(taskId));
96
+ this.emitStatusUpdate(task);
97
+ return task;
98
+ }
99
+ async cancelTask(taskId) {
100
+ const task = await this.store.get(taskId);
101
+ if (!task)
102
+ throw new A2AError(errors.taskNotFound(taskId));
103
+ if (isTerminalState(task.status.state)) {
104
+ throw new A2AError(errors.taskNotCancelable(taskId));
105
+ }
106
+ const controller = this.activeTasks.get(taskId);
107
+ if (controller)
108
+ controller.abort();
109
+ const status = {
110
+ state: 'canceled',
111
+ timestamp: new Date().toISOString(),
112
+ };
113
+ await this.store.update(taskId, { status });
114
+ const updated = await this.store.get(taskId);
115
+ if (!updated)
116
+ throw new A2AError(errors.taskNotFound(taskId));
117
+ this.emitStatusUpdate(updated);
118
+ return updated;
119
+ }
120
+ async getTask(taskId) {
121
+ const task = await this.store.get(taskId);
122
+ if (!task)
123
+ throw new A2AError(errors.taskNotFound(taskId));
124
+ return task;
125
+ }
126
+ extractTextFromMessage(message) {
127
+ return message.parts
128
+ .filter((p) => p.type === 'text')
129
+ .map((p) => p.text)
130
+ .join('\n');
131
+ }
132
+ buildArtifacts(result) {
133
+ const artifacts = [];
134
+ if (result.output) {
135
+ artifacts.push({
136
+ id: `art_${randomUUID()}`,
137
+ parts: [{ type: 'text', text: result.output }],
138
+ mimeType: 'text/plain',
139
+ });
140
+ }
141
+ if (result.structured) {
142
+ artifacts.push({
143
+ id: `art_${randomUUID()}`,
144
+ parts: [
145
+ {
146
+ type: 'data',
147
+ mimeType: 'application/json',
148
+ data: result.structured,
149
+ },
150
+ ],
151
+ mimeType: 'application/json',
152
+ });
153
+ }
154
+ return artifacts;
155
+ }
156
+ emitStatusUpdate(task) {
157
+ const event = {
158
+ type: 'status-update',
159
+ taskId: task.id,
160
+ status: task.status,
161
+ timestamp: new Date().toISOString(),
162
+ };
163
+ this.emit('event', event);
164
+ }
165
+ emitArtifactUpdate(taskId, artifact) {
166
+ const event = {
167
+ type: 'artifact-update',
168
+ taskId,
169
+ artifact,
170
+ timestamp: new Date().toISOString(),
171
+ };
172
+ this.emit('event', event);
173
+ }
174
+ }
175
+ //# sourceMappingURL=task-manager.js.map