@keycardai/a2a 0.1.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 (60) hide show
  1. package/README.md +110 -0
  2. package/dist/cjs/auth.d.ts +48 -0
  3. package/dist/cjs/auth.d.ts.map +1 -0
  4. package/dist/cjs/auth.js +90 -0
  5. package/dist/cjs/auth.js.map +1 -0
  6. package/dist/cjs/config.d.ts +35 -0
  7. package/dist/cjs/config.d.ts.map +1 -0
  8. package/dist/cjs/config.js +19 -0
  9. package/dist/cjs/config.js.map +1 -0
  10. package/dist/cjs/delegation.d.ts +56 -0
  11. package/dist/cjs/delegation.d.ts.map +1 -0
  12. package/dist/cjs/delegation.js +124 -0
  13. package/dist/cjs/delegation.js.map +1 -0
  14. package/dist/cjs/discovery.d.ts +30 -0
  15. package/dist/cjs/discovery.d.ts.map +1 -0
  16. package/dist/cjs/discovery.js +90 -0
  17. package/dist/cjs/discovery.js.map +1 -0
  18. package/dist/cjs/index.d.ts +14 -0
  19. package/dist/cjs/index.d.ts.map +1 -0
  20. package/dist/cjs/index.js +34 -0
  21. package/dist/cjs/index.js.map +1 -0
  22. package/dist/cjs/package.json +1 -0
  23. package/dist/cjs/server.d.ts +32 -0
  24. package/dist/cjs/server.d.ts.map +1 -0
  25. package/dist/cjs/server.js +53 -0
  26. package/dist/cjs/server.js.map +1 -0
  27. package/dist/cjs/types.d.ts +84 -0
  28. package/dist/cjs/types.d.ts.map +1 -0
  29. package/dist/cjs/types.js +21 -0
  30. package/dist/cjs/types.js.map +1 -0
  31. package/dist/esm/auth.d.ts +48 -0
  32. package/dist/esm/auth.d.ts.map +1 -0
  33. package/dist/esm/auth.js +84 -0
  34. package/dist/esm/auth.js.map +1 -0
  35. package/dist/esm/config.d.ts +35 -0
  36. package/dist/esm/config.d.ts.map +1 -0
  37. package/dist/esm/config.js +14 -0
  38. package/dist/esm/config.js.map +1 -0
  39. package/dist/esm/delegation.d.ts +56 -0
  40. package/dist/esm/delegation.d.ts.map +1 -0
  41. package/dist/esm/delegation.js +120 -0
  42. package/dist/esm/delegation.js.map +1 -0
  43. package/dist/esm/discovery.d.ts +30 -0
  44. package/dist/esm/discovery.d.ts.map +1 -0
  45. package/dist/esm/discovery.js +86 -0
  46. package/dist/esm/discovery.js.map +1 -0
  47. package/dist/esm/index.d.ts +14 -0
  48. package/dist/esm/index.d.ts.map +1 -0
  49. package/dist/esm/index.js +15 -0
  50. package/dist/esm/index.js.map +1 -0
  51. package/dist/esm/package.json +1 -0
  52. package/dist/esm/server.d.ts +32 -0
  53. package/dist/esm/server.d.ts.map +1 -0
  54. package/dist/esm/server.js +47 -0
  55. package/dist/esm/server.js.map +1 -0
  56. package/dist/esm/types.d.ts +84 -0
  57. package/dist/esm/types.d.ts.map +1 -0
  58. package/dist/esm/types.js +18 -0
  59. package/dist/esm/types.js.map +1 -0
  60. package/package.json +55 -0
@@ -0,0 +1,14 @@
1
+ export { KeycardUser, keycardUserBuilder, getKeycardAuth } from "./auth.js";
2
+ export type { KeycardUserBuilderOptions } from "./auth.js";
3
+ export { createKeycardRequestHandler, buildAgentCard } from "./server.js";
4
+ export type { AgentExecutor, RequestContext, ExecutionEventBus } from "./server.js";
5
+ export { InMemoryTaskStore } from "./server.js";
6
+ export type { AgentServiceConfig } from "./config.js";
7
+ export { getAgentCardUrl, getJsonrpcUrl, getAuthServerUrl } from "./config.js";
8
+ export { ServiceDiscovery } from "./discovery.js";
9
+ export { DelegationClient } from "./delegation.js";
10
+ export type { DelegationResult, InvokeOptions } from "./delegation.js";
11
+ export { agentCardHandler, jsonRpcHandler, restHandler, UserBuilder, } from "@a2a-js/sdk/server/express";
12
+ export type { AgentCard, Message, Task } from "@a2a-js/sdk";
13
+ export { DefaultRequestHandler } from "@a2a-js/sdk/server";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,YAAY,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAG3D,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIvE,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultRequestHandler = exports.UserBuilder = exports.restHandler = exports.jsonRpcHandler = exports.agentCardHandler = exports.DelegationClient = exports.ServiceDiscovery = exports.getAuthServerUrl = exports.getJsonrpcUrl = exports.getAgentCardUrl = exports.InMemoryTaskStore = exports.buildAgentCard = exports.createKeycardRequestHandler = exports.getKeycardAuth = exports.keycardUserBuilder = exports.KeycardUser = void 0;
4
+ // Keycard auth adapter for @a2a-js/sdk
5
+ var auth_js_1 = require("./auth.js");
6
+ Object.defineProperty(exports, "KeycardUser", { enumerable: true, get: function () { return auth_js_1.KeycardUser; } });
7
+ Object.defineProperty(exports, "keycardUserBuilder", { enumerable: true, get: function () { return auth_js_1.keycardUserBuilder; } });
8
+ Object.defineProperty(exports, "getKeycardAuth", { enumerable: true, get: function () { return auth_js_1.getKeycardAuth; } });
9
+ // Server convenience helpers (thin wrappers over @a2a-js/sdk)
10
+ var server_js_1 = require("./server.js");
11
+ Object.defineProperty(exports, "createKeycardRequestHandler", { enumerable: true, get: function () { return server_js_1.createKeycardRequestHandler; } });
12
+ Object.defineProperty(exports, "buildAgentCard", { enumerable: true, get: function () { return server_js_1.buildAgentCard; } });
13
+ var server_js_2 = require("./server.js");
14
+ Object.defineProperty(exports, "InMemoryTaskStore", { enumerable: true, get: function () { return server_js_2.InMemoryTaskStore; } });
15
+ var config_js_1 = require("./config.js");
16
+ Object.defineProperty(exports, "getAgentCardUrl", { enumerable: true, get: function () { return config_js_1.getAgentCardUrl; } });
17
+ Object.defineProperty(exports, "getJsonrpcUrl", { enumerable: true, get: function () { return config_js_1.getJsonrpcUrl; } });
18
+ Object.defineProperty(exports, "getAuthServerUrl", { enumerable: true, get: function () { return config_js_1.getAuthServerUrl; } });
19
+ // Discovery
20
+ var discovery_js_1 = require("./discovery.js");
21
+ Object.defineProperty(exports, "ServiceDiscovery", { enumerable: true, get: function () { return discovery_js_1.ServiceDiscovery; } });
22
+ // Delegation client
23
+ var delegation_js_1 = require("./delegation.js");
24
+ Object.defineProperty(exports, "DelegationClient", { enumerable: true, get: function () { return delegation_js_1.DelegationClient; } });
25
+ // Re-export the SDK's Express handlers and UserBuilder so customers
26
+ // import from one place.
27
+ var express_1 = require("@a2a-js/sdk/server/express");
28
+ Object.defineProperty(exports, "agentCardHandler", { enumerable: true, get: function () { return express_1.agentCardHandler; } });
29
+ Object.defineProperty(exports, "jsonRpcHandler", { enumerable: true, get: function () { return express_1.jsonRpcHandler; } });
30
+ Object.defineProperty(exports, "restHandler", { enumerable: true, get: function () { return express_1.restHandler; } });
31
+ Object.defineProperty(exports, "UserBuilder", { enumerable: true, get: function () { return express_1.UserBuilder; } });
32
+ var server_1 = require("@a2a-js/sdk/server");
33
+ Object.defineProperty(exports, "DefaultRequestHandler", { enumerable: true, get: function () { return server_1.DefaultRequestHandler; } });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,qCAA4E;AAAnE,sGAAA,WAAW,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,yGAAA,cAAc,OAAA;AAGxD,8DAA8D;AAC9D,yCAA0E;AAAjE,wHAAA,2BAA2B,OAAA;AAAE,2GAAA,cAAc,OAAA;AAEpD,yCAAgD;AAAvC,8GAAA,iBAAiB,OAAA;AAI1B,yCAA+E;AAAtE,4GAAA,eAAe,OAAA;AAAE,0GAAA,aAAa,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAEzD,YAAY;AACZ,+CAAkD;AAAzC,gHAAA,gBAAgB,OAAA;AAEzB,oBAAoB;AACpB,iDAAmD;AAA1C,iHAAA,gBAAgB,OAAA;AAGzB,oEAAoE;AACpE,yBAAyB;AACzB,sDAKoC;AAJlC,2GAAA,gBAAgB,OAAA;AAChB,yGAAA,cAAc,OAAA;AACd,sGAAA,WAAW,OAAA;AACX,sGAAA,WAAW,OAAA;AAKb,6CAA2D;AAAlD,+GAAA,qBAAqB,OAAA"}
@@ -0,0 +1 @@
1
+ {"type": "commonjs"}
@@ -0,0 +1,32 @@
1
+ import { DefaultRequestHandler, type AgentExecutor, type TaskStore } from "@a2a-js/sdk/server";
2
+ import type { AgentCard } from "@a2a-js/sdk";
3
+ import type { AgentServiceConfig } from "./config.js";
4
+ export type { AgentExecutor, RequestContext, ExecutionEventBus } from "@a2a-js/sdk/server";
5
+ export { InMemoryTaskStore } from "@a2a-js/sdk/server";
6
+ /**
7
+ * Creates a `DefaultRequestHandler` from `@a2a-js/sdk` pre-wired with a
8
+ * `KeycardUser`-aware agent card and the provided executor.
9
+ *
10
+ * Pass the returned handler to the SDK's Express adapters alongside a
11
+ * `keycardUserBuilder` for auth:
12
+ *
13
+ * ```ts
14
+ * const requestHandler = createKeycardRequestHandler(executor, config, agentCard);
15
+ * const userBuilder = keycardUserBuilder({ issuer: "https://zone.keycard.cloud" });
16
+ *
17
+ * app.get("/.well-known/agent-card.json", agentCardHandler({ agentCardProvider: requestHandler }));
18
+ * app.post("/a2a/jsonrpc", jsonRpcHandler({ requestHandler, userBuilder }));
19
+ * ```
20
+ *
21
+ * Python equivalent: the composition of `create_agent_card_server`,
22
+ * `serve_agent`, and the `KeycardServerCallContextBuilder` from `keycardai-a2a`.
23
+ */
24
+ export declare function createKeycardRequestHandler(executor: AgentExecutor, agentCard: AgentCard, options?: {
25
+ taskStore?: TaskStore;
26
+ }): DefaultRequestHandler;
27
+ /**
28
+ * Build an `AgentCard` from an `AgentServiceConfig` for use with
29
+ * `createKeycardRequestHandler`.
30
+ */
31
+ export declare function buildAgentCard(config: AgentServiceConfig): AgentCard;
32
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,SAAS,EACpB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GAClC,qBAAqB,CAMvB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAiBpE"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryTaskStore = void 0;
4
+ exports.createKeycardRequestHandler = createKeycardRequestHandler;
5
+ exports.buildAgentCard = buildAgentCard;
6
+ const server_1 = require("@a2a-js/sdk/server");
7
+ const config_js_1 = require("./config.js");
8
+ var server_2 = require("@a2a-js/sdk/server");
9
+ Object.defineProperty(exports, "InMemoryTaskStore", { enumerable: true, get: function () { return server_2.InMemoryTaskStore; } });
10
+ /**
11
+ * Creates a `DefaultRequestHandler` from `@a2a-js/sdk` pre-wired with a
12
+ * `KeycardUser`-aware agent card and the provided executor.
13
+ *
14
+ * Pass the returned handler to the SDK's Express adapters alongside a
15
+ * `keycardUserBuilder` for auth:
16
+ *
17
+ * ```ts
18
+ * const requestHandler = createKeycardRequestHandler(executor, config, agentCard);
19
+ * const userBuilder = keycardUserBuilder({ issuer: "https://zone.keycard.cloud" });
20
+ *
21
+ * app.get("/.well-known/agent-card.json", agentCardHandler({ agentCardProvider: requestHandler }));
22
+ * app.post("/a2a/jsonrpc", jsonRpcHandler({ requestHandler, userBuilder }));
23
+ * ```
24
+ *
25
+ * Python equivalent: the composition of `create_agent_card_server`,
26
+ * `serve_agent`, and the `KeycardServerCallContextBuilder` from `keycardai-a2a`.
27
+ */
28
+ function createKeycardRequestHandler(executor, agentCard, options) {
29
+ return new server_1.DefaultRequestHandler(agentCard, options?.taskStore ?? new server_1.InMemoryTaskStore(), executor);
30
+ }
31
+ /**
32
+ * Build an `AgentCard` from an `AgentServiceConfig` for use with
33
+ * `createKeycardRequestHandler`.
34
+ */
35
+ function buildAgentCard(config) {
36
+ return {
37
+ name: config.serviceName,
38
+ description: config.description ?? "",
39
+ url: (0, config_js_1.getJsonrpcUrl)(config),
40
+ version: "0.1",
41
+ protocolVersion: "0.3",
42
+ capabilities: {},
43
+ defaultInputModes: ["text/plain"],
44
+ defaultOutputModes: ["text/plain"],
45
+ skills: config.skills?.map((s) => ({
46
+ id: s.id,
47
+ name: s.name,
48
+ description: s.description,
49
+ tags: s.tags ?? [],
50
+ })) ?? [],
51
+ };
52
+ }
53
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";;;AA+BA,kEAUC;AAMD,wCAiBC;AAhED,+CAK4B;AAG5B,2CAA4C;AAG5C,6CAAuD;AAA9C,2GAAA,iBAAiB,OAAA;AAE1B;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,2BAA2B,CACzC,QAAuB,EACvB,SAAoB,EACpB,OAAmC;IAEnC,OAAO,IAAI,8BAAqB,CAC9B,SAAS,EACT,OAAO,EAAE,SAAS,IAAI,IAAI,0BAAiB,EAAE,EAC7C,QAAQ,CACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,MAA0B;IACvD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,WAAW;QACxB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;QACrC,GAAG,EAAE,IAAA,yBAAa,EAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,eAAe,EAAE,KAAK;QACtB,YAAY,EAAE,EAAE;QAChB,iBAAiB,EAAE,CAAC,YAAY,CAAC;QACjC,kBAAkB,EAAE,CAAC,YAAY,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;SACnB,CAAC,CAAC,IAAI,EAAE;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * A2A (Agent-to-Agent) protocol types.
3
+ * Reference: https://google.github.io/A2A
4
+ */
5
+ export interface AgentSkill {
6
+ id: string;
7
+ name: string;
8
+ description?: string;
9
+ tags?: readonly string[];
10
+ }
11
+ export interface AgentCapabilities {
12
+ streaming?: boolean;
13
+ pushNotifications?: boolean;
14
+ stateTransitionHistory?: boolean;
15
+ }
16
+ /**
17
+ * Agent card served at `GET /.well-known/agent-card.json`.
18
+ * Describes the agent's identity, capabilities, and endpoint.
19
+ */
20
+ export interface AgentCard {
21
+ name: string;
22
+ description?: string;
23
+ url: string;
24
+ version: string;
25
+ capabilities?: AgentCapabilities;
26
+ skills?: AgentSkill[];
27
+ defaultInputModes?: readonly string[];
28
+ defaultOutputModes?: readonly string[];
29
+ }
30
+ export interface TextPart {
31
+ type: "text";
32
+ text: string;
33
+ }
34
+ export interface DataPart {
35
+ type: "data";
36
+ data: Record<string, unknown>;
37
+ }
38
+ export type Part = TextPart | DataPart;
39
+ export type MessageRole = "user" | "agent";
40
+ export interface A2AMessage {
41
+ messageId: string;
42
+ role: MessageRole;
43
+ parts: readonly Part[];
44
+ metadata?: Record<string, unknown>;
45
+ }
46
+ export interface A2ARequest {
47
+ jsonrpc: "2.0";
48
+ id: string;
49
+ method: "message/send";
50
+ params: {
51
+ message: A2AMessage;
52
+ };
53
+ }
54
+ export interface A2ASuccessResponse {
55
+ jsonrpc: "2.0";
56
+ id: string;
57
+ result: {
58
+ message: A2AMessage;
59
+ };
60
+ }
61
+ export interface A2AErrorResponse {
62
+ jsonrpc: "2.0";
63
+ id: string;
64
+ error: {
65
+ code: number;
66
+ message: string;
67
+ data?: unknown;
68
+ };
69
+ }
70
+ export type A2AResponse = A2ASuccessResponse | A2AErrorResponse;
71
+ export declare const A2A_JSONRPC_VERSION: "2.0";
72
+ export declare const A2A_PROTOCOL_VERSION: "1.0";
73
+ export declare const A2A_VERSION_HEADER: "x-a2a-protocol-version";
74
+ export declare const A2A_JSONRPC_PATH: "/a2a/jsonrpc";
75
+ export declare const A2A_AGENT_CARD_PATH: "/.well-known/agent-card.json";
76
+ export declare const A2A_ERROR_CODES: {
77
+ readonly PARSE_ERROR: -32700;
78
+ readonly INVALID_REQUEST: -32600;
79
+ readonly METHOD_NOT_FOUND: -32601;
80
+ readonly INVALID_PARAMS: -32602;
81
+ readonly INTERNAL_ERROR: -32603;
82
+ readonly UNAUTHORIZED: -32001;
83
+ };
84
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAMD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE;QACN,OAAO,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,OAAO,EAAE,UAAU,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAEhE,eAAO,MAAM,mBAAmB,EAAG,KAAc,CAAC;AAClD,eAAO,MAAM,oBAAoB,EAAG,KAAc,CAAC;AACnD,eAAO,MAAM,kBAAkB,EAAG,wBAAiC,CAAC;AACpE,eAAO,MAAM,gBAAgB,EAAG,cAAuB,CAAC;AACxD,eAAO,MAAM,mBAAmB,EAAG,8BAAuC,CAAC;AAE3E,eAAO,MAAM,eAAe;;;;;;;CAOlB,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * A2A (Agent-to-Agent) protocol types.
4
+ * Reference: https://google.github.io/A2A
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.A2A_ERROR_CODES = exports.A2A_AGENT_CARD_PATH = exports.A2A_JSONRPC_PATH = exports.A2A_VERSION_HEADER = exports.A2A_PROTOCOL_VERSION = exports.A2A_JSONRPC_VERSION = void 0;
8
+ exports.A2A_JSONRPC_VERSION = "2.0";
9
+ exports.A2A_PROTOCOL_VERSION = "1.0";
10
+ exports.A2A_VERSION_HEADER = "x-a2a-protocol-version";
11
+ exports.A2A_JSONRPC_PATH = "/a2a/jsonrpc";
12
+ exports.A2A_AGENT_CARD_PATH = "/.well-known/agent-card.json";
13
+ exports.A2A_ERROR_CODES = {
14
+ PARSE_ERROR: -32700,
15
+ INVALID_REQUEST: -32600,
16
+ METHOD_NOT_FOUND: -32601,
17
+ INVALID_PARAMS: -32602,
18
+ INTERNAL_ERROR: -32603,
19
+ UNAUTHORIZED: -32001,
20
+ };
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAwFU,QAAA,mBAAmB,GAAG,KAAc,CAAC;AACrC,QAAA,oBAAoB,GAAG,KAAc,CAAC;AACtC,QAAA,kBAAkB,GAAG,wBAAiC,CAAC;AACvD,QAAA,gBAAgB,GAAG,cAAuB,CAAC;AAC3C,QAAA,mBAAmB,GAAG,8BAAuC,CAAC;AAE9D,QAAA,eAAe,GAAG;IAC7B,WAAW,EAAE,CAAC,KAAK;IACnB,eAAe,EAAE,CAAC,KAAK;IACvB,gBAAgB,EAAE,CAAC,KAAK;IACxB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,YAAY,EAAE,CAAC,KAAK;CACZ,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { User } from "@a2a-js/sdk/server";
2
+ import type { UserBuilder } from "@a2a-js/sdk/server/express";
3
+ import type { TokenVerifierOptions } from "@keycardai/oauth/server/tokenVerifier";
4
+ import type { AccessToken } from "@keycardai/oauth/server/accessToken";
5
+ import type { RequestContext } from "@a2a-js/sdk/server";
6
+ /**
7
+ * A Keycard-verified user. Implements `@a2a-js/sdk`'s `User` interface
8
+ * and carries the full `AccessToken` for downstream delegation.
9
+ *
10
+ * Python equivalent: the `KeycardUser` injected into `ServerCallContext.state`
11
+ * by `KeycardServerCallContextBuilder`.
12
+ */
13
+ export declare class KeycardUser implements User {
14
+ readonly accessToken: AccessToken;
15
+ constructor(accessToken: AccessToken);
16
+ get isAuthenticated(): boolean;
17
+ get userName(): string;
18
+ }
19
+ export type KeycardUserBuilderOptions = Pick<TokenVerifierOptions, "issuer" | "audience" | "enableMultiZone" | "keyring" | "requiredScopes">;
20
+ /**
21
+ * Returns a `UserBuilder` for `@a2a-js/sdk`'s Express handlers that validates
22
+ * Keycard-issued JWTs and injects a `KeycardUser` into the request context.
23
+ *
24
+ * Python equivalent: `KeycardServerCallContextBuilder`, the auth extension
25
+ * point of `a2a-sdk` where Keycard auth is wired in.
26
+ *
27
+ * ```ts
28
+ * const userBuilder = keycardUserBuilder({ issuer: "https://zone.keycard.cloud" });
29
+ * app.post("/a2a/jsonrpc", jsonRpcHandler({ requestHandler, userBuilder }));
30
+ * ```
31
+ *
32
+ * On a valid token the SDK receives a `KeycardUser`; on an invalid or missing
33
+ * token it receives an `UnauthenticatedUser`, and the SDK rejects the request
34
+ * with a 401.
35
+ */
36
+ export declare function keycardUserBuilder(options: KeycardUserBuilderOptions): UserBuilder;
37
+ /**
38
+ * Extract the `AccessToken` from an A2A `RequestContext`.
39
+ * Returns `null` if the request was not authenticated with a Keycard token.
40
+ *
41
+ * ```ts
42
+ * const auth = getKeycardAuth(requestContext);
43
+ * if (!auth) throw new Error("unauthenticated");
44
+ * // use auth.token for downstream delegation
45
+ * ```
46
+ */
47
+ export declare function getKeycardAuth(requestContext: RequestContext): AccessToken | null;
48
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;GAMG;AACH,qBAAa,WAAY,YAAW,IAAI;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAEtB,WAAW,EAAE,WAAW;IAIpC,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;CACF;AAED,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,oBAAoB,EACpB,QAAQ,GAAG,UAAU,GAAG,iBAAiB,GAAG,SAAS,GAAG,gBAAgB,CACzE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,WAAW,CAsBlF;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAMjF"}
@@ -0,0 +1,84 @@
1
+ import { TokenVerifier } from "@keycardai/oauth/server/tokenVerifier";
2
+ import { A2AError } from "@a2a-js/sdk/server";
3
+ /**
4
+ * A Keycard-verified user. Implements `@a2a-js/sdk`'s `User` interface
5
+ * and carries the full `AccessToken` for downstream delegation.
6
+ *
7
+ * Python equivalent: the `KeycardUser` injected into `ServerCallContext.state`
8
+ * by `KeycardServerCallContextBuilder`.
9
+ */
10
+ export class KeycardUser {
11
+ constructor(accessToken) {
12
+ this.accessToken = accessToken;
13
+ }
14
+ get isAuthenticated() {
15
+ return true;
16
+ }
17
+ get userName() {
18
+ return this.accessToken.clientId;
19
+ }
20
+ }
21
+ /**
22
+ * Returns a `UserBuilder` for `@a2a-js/sdk`'s Express handlers that validates
23
+ * Keycard-issued JWTs and injects a `KeycardUser` into the request context.
24
+ *
25
+ * Python equivalent: `KeycardServerCallContextBuilder`, the auth extension
26
+ * point of `a2a-sdk` where Keycard auth is wired in.
27
+ *
28
+ * ```ts
29
+ * const userBuilder = keycardUserBuilder({ issuer: "https://zone.keycard.cloud" });
30
+ * app.post("/a2a/jsonrpc", jsonRpcHandler({ requestHandler, userBuilder }));
31
+ * ```
32
+ *
33
+ * On a valid token the SDK receives a `KeycardUser`; on an invalid or missing
34
+ * token it receives an `UnauthenticatedUser`, and the SDK rejects the request
35
+ * with a 401.
36
+ */
37
+ export function keycardUserBuilder(options) {
38
+ const verifier = new TokenVerifier({
39
+ issuer: options.issuer,
40
+ audience: options.audience,
41
+ enableMultiZone: options.enableMultiZone,
42
+ keyring: options.keyring,
43
+ requiredScopes: options.requiredScopes,
44
+ });
45
+ return async (req) => {
46
+ const authorization = req.headers.authorization;
47
+ if (!authorization?.startsWith("Bearer ")) {
48
+ // -32001 is the A2A unauthorized error code
49
+ throw new A2AError(-32001, "Missing or invalid Authorization header");
50
+ }
51
+ const token = authorization.slice(7);
52
+ const accessToken = await verifier.verifyToken(token);
53
+ if (!accessToken) {
54
+ throw new A2AError(-32001, "Invalid or expired token");
55
+ }
56
+ return new KeycardUser(accessToken);
57
+ };
58
+ }
59
+ /**
60
+ * Extract the `AccessToken` from an A2A `RequestContext`.
61
+ * Returns `null` if the request was not authenticated with a Keycard token.
62
+ *
63
+ * ```ts
64
+ * const auth = getKeycardAuth(requestContext);
65
+ * if (!auth) throw new Error("unauthenticated");
66
+ * // use auth.token for downstream delegation
67
+ * ```
68
+ */
69
+ export function getKeycardAuth(requestContext) {
70
+ const user = requestContext.context?.user;
71
+ if (user instanceof KeycardUser) {
72
+ return user.accessToken;
73
+ }
74
+ return null;
75
+ }
76
+ class UnauthenticatedUser {
77
+ get isAuthenticated() {
78
+ return false;
79
+ }
80
+ get userName() {
81
+ return "anonymous";
82
+ }
83
+ }
84
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAItE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,OAAO,WAAW;IAGtB,YAAY,WAAwB;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;IACnC,CAAC;CACF;AAOD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,OAAO,KAAK,EAAE,GAAY,EAAiB,EAAE;QAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QAChD,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,4CAA4C;YAC5C,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,yCAAyC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,cAA8B;IAC3D,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;IAC1C,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,mBAAmB;IACvB,IAAI,eAAe;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ import type { AgentSkill } from "@a2a-js/sdk";
2
+ export type { AgentSkill } from "@a2a-js/sdk";
3
+ /**
4
+ * Configuration for a Keycard-protected A2A agent service.
5
+ *
6
+ * Python equivalent: `keycardai.a2a.AgentServiceConfig`
7
+ */
8
+ export interface AgentServiceConfig {
9
+ /** Human-readable service name, used as the agent card `name`. */
10
+ serviceName: string;
11
+ /** Keycard client ID for service-to-service token exchange. */
12
+ clientId: string;
13
+ /** Keycard client secret. */
14
+ clientSecret: string;
15
+ /**
16
+ * Public URL of this agent service, e.g. "https://my-agent.example.com".
17
+ * Used to construct the JSONRPC endpoint URL.
18
+ */
19
+ identityUrl: string;
20
+ /** Keycard zone ID, e.g. "abc1234". Constructs the auth server URL. */
21
+ zoneId?: string;
22
+ /**
23
+ * Explicit authorization server URL. Defaults to
24
+ * `https://{zoneId}.keycard.cloud` when `zoneId` is provided.
25
+ */
26
+ authorizationServerUrl?: string;
27
+ /** Description for the agent card. */
28
+ description?: string;
29
+ /** Skills advertised in the agent card. */
30
+ skills?: readonly AgentSkill[];
31
+ }
32
+ export declare function getAgentCardUrl(config: AgentServiceConfig): string;
33
+ export declare function getJsonrpcUrl(config: AgentServiceConfig): string;
34
+ export declare function getAuthServerUrl(config: AgentServiceConfig): string;
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAElE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAEhE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAMnE"}
@@ -0,0 +1,14 @@
1
+ export function getAgentCardUrl(config) {
2
+ return `${config.identityUrl}/.well-known/agent-card.json`;
3
+ }
4
+ export function getJsonrpcUrl(config) {
5
+ return `${config.identityUrl}/a2a/jsonrpc`;
6
+ }
7
+ export function getAuthServerUrl(config) {
8
+ if (config.authorizationServerUrl)
9
+ return config.authorizationServerUrl;
10
+ if (config.zoneId)
11
+ return `https://${config.zoneId}.keycard.cloud`;
12
+ throw new Error("AgentServiceConfig: either `authorizationServerUrl` or `zoneId` is required");
13
+ }
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO,GAAG,MAAM,CAAC,WAAW,8BAA8B,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA0B;IACtD,OAAO,GAAG,MAAM,CAAC,WAAW,cAAc,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IACzD,IAAI,MAAM,CAAC,sBAAsB;QAAE,OAAO,MAAM,CAAC,sBAAsB,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,WAAW,MAAM,CAAC,MAAM,gBAAgB,CAAC;IACnE,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { AgentCard } from "@a2a-js/sdk";
2
+ import type { Message } from "@a2a-js/sdk";
3
+ import { ServiceDiscovery } from "./discovery.js";
4
+ import type { AgentServiceConfig } from "./config.js";
5
+ export interface DelegationResult {
6
+ /** The agent's response message. */
7
+ message: Message;
8
+ /** Resolved agent card for the target service. */
9
+ agentCard: AgentCard;
10
+ }
11
+ export interface InvokeOptions {
12
+ /**
13
+ * Keycard bearer token from the current request context. Pass
14
+ * `getKeycardAuth(requestContext)?.token` from the executor.
15
+ * Required for all delegation flows.
16
+ *
17
+ * For service-to-service delegation without a user token (equivalent to
18
+ * Python's client-credentials fallback in `DelegationClient`), first
19
+ * acquire a service access token from Keycard, then pass it here.
20
+ * A convenience method for this path is a planned follow-up.
21
+ */
22
+ subjectToken: string;
23
+ /** Timeout in ms for the JSONRPC call. Default: 30 000. */
24
+ timeoutMs?: number;
25
+ /** Arbitrary metadata to attach to the A2A message. */
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ /**
29
+ * Client for delegating tasks to remote A2A agent services with
30
+ * Keycard token exchange.
31
+ *
32
+ * ```ts
33
+ * const client = new DelegationClient(config);
34
+ *
35
+ * // Inside your AgentExecutor.execute():
36
+ * const auth = getKeycardAuth(requestContext);
37
+ * const result = await client.invokeService(targetUrl, "summarize this", {
38
+ * subjectToken: auth!.token,
39
+ * });
40
+ * eventBus.publish(result.message);
41
+ * eventBus.finished();
42
+ * ```
43
+ *
44
+ * Python equivalent: `keycardai.a2a.DelegationClient`
45
+ */
46
+ export declare class DelegationClient {
47
+ #private;
48
+ constructor(config: AgentServiceConfig, options?: {
49
+ discovery?: ServiceDiscovery;
50
+ });
51
+ /**
52
+ * Discover, authenticate, and invoke a remote A2A agent in one call.
53
+ */
54
+ invokeService(serviceUrl: string, task: string, options: InvokeOptions): Promise<DelegationResult>;
55
+ }
56
+ //# sourceMappingURL=delegation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation.d.ts","sourceRoot":"","sources":["../../src/delegation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGtD,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;OASG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,gBAAgB;;gBAKf,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,gBAAgB,CAAA;KAAE;IAQlF;;OAEG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,gBAAgB,CAAC;CAsE7B"}