@glinr/theauth 0.5.0 → 0.6.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 +54 -20
- package/dist/a2a/index.d.ts +3 -3
- package/dist/a2a/index.js.map +1 -1
- package/dist/agent/index.d.ts +3 -3
- package/dist/agent/index.js +48 -48
- package/dist/agent/index.js.map +1 -1
- package/dist/audit/index.d.ts +2 -2
- package/dist/audit/index.js +48 -48
- package/dist/audit/index.js.map +1 -1
- package/dist/auth/index.d.ts +71 -51
- package/dist/auth/index.js +1156 -241
- package/dist/auth/index.js.map +1 -1
- package/dist/index.d.ts +1204 -1224
- package/dist/index.js +4467 -3520
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/permission/index.d.ts +3 -3
- package/dist/permission/index.js +51 -50
- package/dist/permission/index.js.map +1 -1
- package/dist/redirect/index.d.ts +1 -1
- package/dist/redirect/index.js +1 -1
- package/dist/redirect/index.js.map +1 -1
- package/dist/standards/index.d.ts +1 -1
- package/dist/standards/index.js.map +1 -1
- package/dist/{types-D1dTo8-m.d.ts → types-JOx1R8-Q.d.ts} +494 -499
- package/dist/{types-IkWVkOVv.d.ts → types-XoCxTUZj.d.ts} +2 -6
- package/dist/vc/index.d.ts +6 -12
- package/dist/vc/index.js +4 -7
- package/dist/vc/index.js.map +1 -1
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
[npm](https://www.npmjs.com/package/@glinr/theauth) · [Source](https://github.com/glincker/theauth/tree/main/packages/core) · [Docs](https://docs.theauth.dev/concepts) · [All packages](https://github.com/glincker/theauth#packages)
|
|
2
|
+
|
|
1
3
|
<p align="center">
|
|
2
|
-
<img src="https://theauth.dev/logo.svg" height="64" alt="
|
|
4
|
+
<img src="https://theauth.dev/logo.svg" height="64" alt="theAuth" />
|
|
3
5
|
</p>
|
|
4
6
|
|
|
5
7
|
<h1 align="center">theauth</h1>
|
|
@@ -19,17 +21,20 @@
|
|
|
19
21
|
</p>
|
|
20
22
|
|
|
21
23
|
<p align="center">
|
|
22
|
-
<a href="https://
|
|
23
|
-
<a href="https://docs.theauth.dev/
|
|
24
|
+
<a href="https://theauth.dev">Website</a> ·
|
|
25
|
+
<a href="https://docs.theauth.dev/quickstart">Quickstart</a> ·
|
|
26
|
+
<a href="https://docs.theauth.dev">Documentation</a> ·
|
|
24
27
|
<a href="https://github.com/glincker/theauth/tree/main/examples">Examples</a> ·
|
|
25
|
-
<a href="https://
|
|
28
|
+
<a href="https://theauth.dev/pricing/">Cloud (early access)</a>
|
|
26
29
|
</p>
|
|
27
30
|
|
|
31
|
+
Part of [theAuth](https://theauth.dev), open-source auth for AI agents and humans. Docs: [docs.theauth.dev](https://docs.theauth.dev).
|
|
32
|
+
|
|
28
33
|
---
|
|
29
34
|
|
|
30
35
|
## Why theauth?
|
|
31
36
|
|
|
32
|
-
Every auth library handles human login. None of them handle **AI agent identity**.
|
|
37
|
+
Every auth library handles human login. None of them handle **AI agent identity**. theAuth gives every agent its own bearer token, scoped permissions, delegation chains, and an immutable audit trail. Plus full human auth (14 methods, 17 OAuth providers, passkeys, SSO) so you don't need two auth systems.
|
|
33
38
|
|
|
34
39
|
```
|
|
35
40
|
npm install @glinr/theauth
|
|
@@ -38,16 +43,16 @@ npm install @glinr/theauth
|
|
|
38
43
|
## Quick start
|
|
39
44
|
|
|
40
45
|
```typescript
|
|
41
|
-
import {
|
|
46
|
+
import { createTheAuth } from "@glinr/theauth";
|
|
42
47
|
import { emailPassword } from "@glinr/theauth/auth";
|
|
43
48
|
|
|
44
|
-
const
|
|
45
|
-
database: { provider: "sqlite", url: "
|
|
49
|
+
const theauth = createTheAuth({
|
|
50
|
+
database: { provider: "sqlite", url: "theauth.db" },
|
|
46
51
|
plugins: [emailPassword()],
|
|
47
52
|
});
|
|
48
53
|
|
|
49
54
|
// Create an AI agent with scoped permissions
|
|
50
|
-
const agent = await
|
|
55
|
+
const agent = await theauth.agent.create({
|
|
51
56
|
ownerId: "user-123",
|
|
52
57
|
name: "github-reader",
|
|
53
58
|
type: "autonomous",
|
|
@@ -59,7 +64,7 @@ const agent = await kavach.agent.create({
|
|
|
59
64
|
});
|
|
60
65
|
|
|
61
66
|
// Authorize and audit (< 1ms)
|
|
62
|
-
const result = await
|
|
67
|
+
const result = await theauth.authorize(agent.id, {
|
|
63
68
|
action: "read",
|
|
64
69
|
resource: "mcp:github:repos",
|
|
65
70
|
});
|
|
@@ -77,7 +82,7 @@ const result = await kavach.authorize(agent.id, {
|
|
|
77
82
|
- Wildcard permission matching (`mcp:github:*`)
|
|
78
83
|
- Delegation chains with depth limits
|
|
79
84
|
- Immutable audit trail
|
|
80
|
-
- Trust scoring
|
|
85
|
+
- Trust scoring
|
|
81
86
|
- Budget policies and cost attribution
|
|
82
87
|
- CIBA-style human approval flows
|
|
83
88
|
|
|
@@ -131,6 +136,29 @@ Runs on Cloudflare Workers (D1), Deno, Bun, and Node.js. Only 3 runtime deps: `d
|
|
|
131
136
|
|
|
132
137
|
Rate limiting (per-agent and per-IP) · HIBP breach checking · CSRF protection · httpOnly secure cookies · Email enumeration prevention · Trusted device windows · Password reset with signed tokens
|
|
133
138
|
|
|
139
|
+
## SCIM 2.0 compatibility
|
|
140
|
+
|
|
141
|
+
Full RFC 7644 protocol and RFC 7643 core schema, with a working demo against Okta. See [`examples/scim-okta`](../../examples/scim-okta) and the [SCIM guide](https://docs.theauth.dev/auth/scim).
|
|
142
|
+
|
|
143
|
+
| Area | Status | Notes |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| Discovery (`/ServiceProviderConfig`, `/Schemas`, `/ResourceTypes`) | ✓ | Enterprise User extension advertised in `/Schemas` |
|
|
146
|
+
| `/Users` CRUD | ✓ | POST, GET, PUT, PATCH, DELETE |
|
|
147
|
+
| `/Groups` CRUD | ✓ | Backed by `theauth_organizations` + `theauth_org_members` |
|
|
148
|
+
| `/Me` | ✓ | Opt-in via `resolveSelf` callback |
|
|
149
|
+
| `/Bulk` | 501 | Deliberate, advertised as `supported: false` |
|
|
150
|
+
| Filter grammar (§3.4.2.2) | ✓ | eq, ne, co, sw, ew, gt, ge, lt, le, pr, and, or, not, parens, value-path |
|
|
151
|
+
| PATCH path expressions (§3.5.2) | ✓ | Includes `emails[type eq "work"].value`, op cap of 1000, immutable checks |
|
|
152
|
+
| Sort (§3.4.2.3) | ✓ | `sortBy` + `sortOrder` with `id` tie-break |
|
|
153
|
+
| Pagination | ✓ | `startIndex`, `count`, `totalResults` |
|
|
154
|
+
| Enterprise User extension (RFC 7643 §4.3) | ✓ | `employeeNumber`, `department`, `manager`, etc. |
|
|
155
|
+
| Audit log on every write | ✓ | `auditLogs` row per POST/PUT/PATCH/DELETE |
|
|
156
|
+
| Bearer token auth | ✓ | Only supported scheme |
|
|
157
|
+
| ETag / conditional requests | No | Not implemented |
|
|
158
|
+
| Groups PATCH with value-filter member ops | Partial | Routes through legacy handler |
|
|
159
|
+
|
|
160
|
+
Tested against Okta's SCIM test suite categories: discovery, Users CRUD, Groups CRUD, filter (all listed ops), PATCH simple paths, PATCH value-paths, Enterprise User, pagination, sort. Outstanding gaps are the two rows above.
|
|
161
|
+
|
|
134
162
|
## Framework adapters
|
|
135
163
|
|
|
136
164
|
Works with every major framework:
|
|
@@ -146,7 +174,7 @@ Works with every major framework:
|
|
|
146
174
|
|
|
147
175
|
| Package | What |
|
|
148
176
|
|---------|------|
|
|
149
|
-
| `@glinr/theauth-react` |
|
|
177
|
+
| `@glinr/theauth-react` | TheAuthProvider + hooks |
|
|
150
178
|
| `@glinr/theauth-vue` | Vue 3 plugin + composables |
|
|
151
179
|
| `@glinr/theauth-svelte` | Svelte stores |
|
|
152
180
|
| `@glinr/theauth-ui` | 7 pre-built auth components (SignIn, SignUp, UserButton...) |
|
|
@@ -160,10 +188,10 @@ SQLite, PostgreSQL, MySQL, Cloudflare D1, libSQL (Turso). Tables are auto-create
|
|
|
160
188
|
|
|
161
189
|
```typescript
|
|
162
190
|
// Cloudflare Workers + D1
|
|
163
|
-
|
|
191
|
+
createTheAuth({ database: { provider: "d1", binding: env.THEAUTH_DB } });
|
|
164
192
|
|
|
165
193
|
// PostgreSQL
|
|
166
|
-
|
|
194
|
+
createTheAuth({ database: { provider: "postgres", url: process.env.DATABASE_URL } });
|
|
167
195
|
```
|
|
168
196
|
|
|
169
197
|
## Plugins
|
|
@@ -176,26 +204,32 @@ import {
|
|
|
176
204
|
organizations, sso, admin, apiKeys, webhooks,
|
|
177
205
|
} from "@glinr/theauth/auth";
|
|
178
206
|
|
|
179
|
-
|
|
180
|
-
database: { provider: "sqlite", url: "
|
|
207
|
+
createTheAuth({
|
|
208
|
+
database: { provider: "sqlite", url: "theauth.db" },
|
|
181
209
|
plugins: [emailPassword(), magicLink({ sendMagicLink }), passkey(), totp()],
|
|
182
210
|
});
|
|
183
211
|
```
|
|
184
212
|
|
|
185
|
-
##
|
|
213
|
+
## theAuth Cloud
|
|
186
214
|
|
|
187
|
-
Don't want to self-host? [
|
|
215
|
+
Don't want to self-host? [theAuth Cloud](https://theauth.dev/pricing/) (early access) is the managed version with dashboard, billing, and zero infrastructure.
|
|
188
216
|
|
|
189
217
|
| | Free | Starter | Growth | Scale |
|
|
190
218
|
|---|---|---|---|---|
|
|
191
219
|
| MAU | 1,000 | 10,000 | 50,000 | 200,000 |
|
|
192
220
|
| Price | $0 | $29/mo | $79/mo | $199/mo |
|
|
193
221
|
|
|
194
|
-
[
|
|
222
|
+
[Cloud early access](https://theauth.dev/pricing/) · [Compare plans](https://theauth.dev/pricing/) · [Self-host instead](https://docs.theauth.dev/quickstart)
|
|
195
223
|
|
|
196
224
|
## Documentation
|
|
197
225
|
|
|
198
|
-
Full docs at **[docs.theauth.dev](https://docs.theauth.dev
|
|
226
|
+
Full docs at **[docs.theauth.dev](https://docs.theauth.dev)**
|
|
227
|
+
|
|
228
|
+
## Community
|
|
229
|
+
|
|
230
|
+
[](https://discord.gg/Ar5pcaZB99)
|
|
231
|
+
|
|
232
|
+
Questions and help in the `#theauth` forum on the [GLINR Discord](https://discord.gg/Ar5pcaZB99).
|
|
199
233
|
|
|
200
234
|
## License
|
|
201
235
|
|
package/dist/a2a/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as jose from 'jose';
|
|
2
|
-
import { A as AgentIdentity } from '../types-
|
|
2
|
+
import { A as AgentIdentity } from '../types-JOx1R8-Q.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { R as Result } from '../types-
|
|
4
|
+
import { R as Result } from '../types-XoCxTUZj.js';
|
|
5
5
|
import 'drizzle-orm/sqlite-core';
|
|
6
6
|
import '../redirect/index.js';
|
|
7
7
|
|
|
@@ -2288,7 +2288,7 @@ declare function verifyAgentCard(options: VerifyAgentCardOptions): Promise<Resul
|
|
|
2288
2288
|
* ```typescript
|
|
2289
2289
|
* const client = createA2AClient({
|
|
2290
2290
|
* agent: 'https://remote-agent.example.com',
|
|
2291
|
-
* getAuthToken: () =>
|
|
2291
|
+
* getAuthToken: () => theauth.issueToken({ agentId: myAgent.id }),
|
|
2292
2292
|
* });
|
|
2293
2293
|
*
|
|
2294
2294
|
* const card = await client.discover();
|
package/dist/a2a/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/crypto/web-crypto.ts","../../src/a2a/types.ts","../../src/a2a/agent-card.ts","../../src/a2a/client.ts","../../src/a2a/server.ts"],"names":["canceled"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Web Crypto API utilities for TheAuth.\n *\n * This module uses ONLY the Web Crypto API (globalThis.crypto) which is\n * available natively in Cloudflare Workers, Deno, Bun, and Node 20+.\n * No `node:crypto` imports are used, making the core package edge-compatible.\n */\n\n// ---------------------------------------------------------------------------\n// Encoding helpers\n// ---------------------------------------------------------------------------\n\nconst HEX_CHARS = \"0123456789abcdef\";\n\n/** Encode a Uint8Array as a lowercase hex string. */\nexport function toHex(bytes: Uint8Array): string {\n\tlet hex = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst b = bytes[i] as number;\n\t\thex += HEX_CHARS[b >> 4] as string;\n\t\thex += HEX_CHARS[b & 0x0f] as string;\n\t}\n\treturn hex;\n}\n\n/** Decode a hex string into a Uint8Array. */\nexport function fromHex(hex: string): Uint8Array {\n\tif (hex.length % 2 !== 0) {\n\t\tthrow new Error(\"fromHex: hex string must have even length\");\n\t}\n\tconst bytes = new Uint8Array(hex.length / 2);\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst hi = parseInt(hex[i * 2] as string, 16);\n\t\tconst lo = parseInt(hex[i * 2 + 1] as string, 16);\n\t\tif (Number.isNaN(hi) || Number.isNaN(lo)) {\n\t\t\tthrow new Error(`fromHex: invalid hex character at position ${i * 2}`);\n\t\t}\n\t\tbytes[i] = (hi << 4) | lo;\n\t}\n\treturn bytes;\n}\n\n/** Encode a Uint8Array as a base64url string (no padding). */\nexport function toBase64Url(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbinary += String.fromCharCode(bytes[i] as number);\n\t}\n\treturn btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** Decode a base64url string into a Uint8Array. */\nexport function fromBase64Url(b64: string): Uint8Array {\n\t// Restore standard base64\n\tlet base64 = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t// Add padding\n\twhile (base64.length % 4 !== 0) {\n\t\tbase64 += \"=\";\n\t}\n\tconst binary = atob(base64);\n\tconst bytes = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\n// ---------------------------------------------------------------------------\n// Random generation\n// ---------------------------------------------------------------------------\n\n/** Generate a v4 UUID using the globally available crypto.randomUUID(). */\nexport function generateId(): string {\n\treturn globalThis.crypto.randomUUID();\n}\n\n/** Generate cryptographically secure random bytes as a Uint8Array. */\nexport function randomBytes(length: number): Uint8Array {\n\tconst bytes = new Uint8Array(length);\n\tglobalThis.crypto.getRandomValues(bytes);\n\treturn bytes;\n}\n\n/** Generate cryptographically secure random bytes as a hex string. */\nexport function randomBytesHex(length: number): string {\n\treturn toHex(randomBytes(length));\n}\n\n// ---------------------------------------------------------------------------\n// Text encoding helper (internal)\n// ---------------------------------------------------------------------------\n\nconst TEXT_ENCODER = new TextEncoder();\n\nfunction toBytes(data: string | Uint8Array): ArrayBuffer {\n\tif (typeof data === \"string\") {\n\t\tconst encoded = TEXT_ENCODER.encode(data);\n\t\treturn (encoded.buffer as ArrayBuffer).slice(\n\t\t\tencoded.byteOffset,\n\t\t\tencoded.byteOffset + encoded.byteLength,\n\t\t);\n\t}\n\treturn (data.buffer as ArrayBuffer).slice(data.byteOffset, data.byteOffset + data.byteLength);\n}\n\n// ---------------------------------------------------------------------------\n// Hashing\n// ---------------------------------------------------------------------------\n\n/** SHA-256 hash, returns hex string. */\nexport async function sha256(data: string | Uint8Array): Promise<string> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-256\", toBytes(data));\n\treturn toHex(new Uint8Array(digest));\n}\n\n/** SHA-256 hash, returns Uint8Array. */\nexport async function sha256Raw(data: string | Uint8Array): Promise<Uint8Array> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-256\", toBytes(data));\n\treturn new Uint8Array(digest);\n}\n\n/** SHA-1 hash, returns hex string. Needed for HIBP k-anonymity. */\nexport async function sha1(data: string | Uint8Array): Promise<string> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-1\", toBytes(data));\n\treturn toHex(new Uint8Array(digest));\n}\n\n// ---------------------------------------------------------------------------\n// HMAC\n// ---------------------------------------------------------------------------\n\n/** Import a secret key for HMAC operations. */\nexport async function importHmacKey(\n\tkey: string | Uint8Array,\n\thash: \"SHA-256\" | \"SHA-1\" = \"SHA-256\",\n): Promise<CryptoKey> {\n\tconst keyData = typeof key === \"string\" ? TEXT_ENCODER.encode(key) : key;\n\treturn globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\t(keyData.buffer as ArrayBuffer).slice(\n\t\t\tkeyData.byteOffset,\n\t\t\tkeyData.byteOffset + keyData.byteLength,\n\t\t),\n\t\t{ name: \"HMAC\", hash: { name: hash } },\n\t\tfalse,\n\t\t[\"sign\", \"verify\"],\n\t);\n}\n\n/** HMAC-SHA256 sign, returns hex string. */\nexport async function hmacSha256(\n\tkey: string | Uint8Array,\n\tdata: string | Uint8Array,\n): Promise<string> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-256\");\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, toBytes(data));\n\treturn toHex(new Uint8Array(signature));\n}\n\n/** HMAC-SHA256 sign, returns Uint8Array. */\nexport async function hmacSha256Raw(\n\tkey: string | Uint8Array,\n\tdata: string | Uint8Array,\n): Promise<Uint8Array> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-256\");\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, toBytes(data));\n\treturn new Uint8Array(signature);\n}\n\n/** HMAC-SHA1 sign, returns Uint8Array (needed for TOTP per RFC 6238). */\nexport async function hmacSha1Raw(key: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-1\");\n\tconst buf = (data.buffer as ArrayBuffer).slice(\n\t\tdata.byteOffset,\n\t\tdata.byteOffset + data.byteLength,\n\t);\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, buf);\n\treturn new Uint8Array(signature);\n}\n\n// ---------------------------------------------------------------------------\n// PBKDF2 password hashing\n// ---------------------------------------------------------------------------\n\nconst PBKDF2_ITERATIONS = 100_000; // CF Workers caps at 100K; OWASP recommends 600K for Node.js\nconst PBKDF2_KEY_LENGTH = 64; // bytes\nconst PBKDF2_SALT_LENGTH = 32; // bytes\n\n/**\n * Hash a password using PBKDF2-SHA256.\n *\n * Returns a string in the format: `pbkdf2:iterations:salt_hex:hash_hex`\n * which is safe to store in the database.\n */\nexport async function pbkdf2Hash(\n\tpassword: string,\n\tsalt?: Uint8Array,\n\titerations?: number,\n): Promise<string> {\n\tconst actualSalt = salt ?? randomBytes(PBKDF2_SALT_LENGTH);\n\tconst actualIterations = iterations ?? PBKDF2_ITERATIONS;\n\n\tconst keyMaterial = await globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tTEXT_ENCODER.encode(password),\n\t\t\"PBKDF2\",\n\t\tfalse,\n\t\t[\"deriveBits\"],\n\t);\n\n\tconst saltBuf = (actualSalt.buffer as ArrayBuffer).slice(\n\t\tactualSalt.byteOffset,\n\t\tactualSalt.byteOffset + actualSalt.byteLength,\n\t);\n\tconst derived = await globalThis.crypto.subtle.deriveBits(\n\t\t{\n\t\t\tname: \"PBKDF2\",\n\t\t\tsalt: saltBuf,\n\t\t\titerations: actualIterations,\n\t\t\thash: \"SHA-256\",\n\t\t},\n\t\tkeyMaterial,\n\t\tPBKDF2_KEY_LENGTH * 8,\n\t);\n\n\treturn `pbkdf2:${actualIterations}:${toHex(actualSalt)}:${toHex(new Uint8Array(derived))}`;\n}\n\n/**\n * Verify a password against a stored PBKDF2 hash.\n *\n * Supports the `pbkdf2:iterations:salt:hash` format produced by `pbkdf2Hash`.\n */\nexport async function pbkdf2Verify(password: string, stored: string): Promise<boolean> {\n\tconst parts = stored.split(\":\");\n\tif (parts.length !== 4 || parts[0] !== \"pbkdf2\") {\n\t\treturn false;\n\t}\n\n\tconst iterations = parseInt(parts[1] as string, 10);\n\tconst salt = fromHex(parts[2] as string);\n\tconst storedHash = fromHex(parts[3] as string);\n\n\tif (Number.isNaN(iterations)) return false;\n\n\tconst keyMaterial = await globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tTEXT_ENCODER.encode(password),\n\t\t\"PBKDF2\",\n\t\tfalse,\n\t\t[\"deriveBits\"],\n\t);\n\n\tconst saltBuf = (salt.buffer as ArrayBuffer).slice(\n\t\tsalt.byteOffset,\n\t\tsalt.byteOffset + salt.byteLength,\n\t);\n\tconst derived = await globalThis.crypto.subtle.deriveBits(\n\t\t{\n\t\t\tname: \"PBKDF2\",\n\t\t\tsalt: saltBuf,\n\t\t\titerations,\n\t\t\thash: \"SHA-256\",\n\t\t},\n\t\tkeyMaterial,\n\t\tstoredHash.length * 8,\n\t);\n\n\treturn constantTimeEqual(new Uint8Array(derived), storedHash);\n}\n\n// ---------------------------------------------------------------------------\n// Constant-time comparison\n// ---------------------------------------------------------------------------\n\n/**\n * Constant-time comparison of two Uint8Arrays.\n * Returns false immediately if lengths differ (length is not secret).\n */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\tlet diff = 0;\n\tfor (let i = 0; i < a.byteLength; i++) {\n\t\tdiff |= (a[i] as number) ^ (b[i] as number);\n\t}\n\treturn diff === 0;\n}\n","/**\n * A2A (Agent-to-Agent) protocol types for TheAuth.\n *\n * Implements the Google Agent2Agent protocol specification for\n * agent interoperability. Covers Agent Cards, JSON-RPC methods,\n * task lifecycle, message/artifact types, and authentication schemes.\n *\n * @see https://a2a-protocol.org/latest/specification/\n */\n\nimport { z } from \"zod\";\nimport type { AuthError, KavachError, Result, TheAuthError } from \"../mcp/types.js\";\n\nexport type { AuthError, KavachError, Result, TheAuthError };\n\n// ─── Protocol Constants ─────────────────────────────────────────────────────\n\nexport const A2A_PROTOCOL_VERSION = \"0.3\";\nexport const A2A_JSONRPC_VERSION = \"2.0\";\nexport const A2A_WELL_KNOWN_PATH = \"/.well-known/agent.json\";\n\n// ─── Roles & States ─────────────────────────────────────────────────────────\n\nexport type A2ARole = \"user\" | \"agent\";\n\nexport type A2ATaskState =\n\t| \"submitted\"\n\t| \"working\"\n\t| \"input-required\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"canceled\"\n\t| \"auth-required\"\n\t| \"rejected\";\n\n// ─── Parts (content atoms inside messages/artifacts) ─────────────────────────\n\nexport interface A2ATextPart {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface A2AFilePart {\n\ttype: \"file\";\n\tfileUri: string;\n\tmimeType: string;\n\tname?: string;\n}\n\nexport interface A2ADataPart {\n\ttype: \"data\";\n\tmimeType: string;\n\tdata: string; // base64-encoded\n}\n\nexport type A2APart = A2ATextPart | A2AFilePart | A2ADataPart;\n\n// ─── Message ─────────────────────────────────────────────────────────────────\n\nexport interface A2AMessage {\n\tid: string;\n\trole: A2ARole;\n\tparts: A2APart[];\n\tcreatedAt: string;\n\tmetadata?: Record<string, unknown>;\n\treferenceTaskIds?: string[];\n}\n\n// ─── Artifact ────────────────────────────────────────────────────────────────\n\nexport interface A2AArtifact {\n\tid: string;\n\tname?: string;\n\tmimeType?: string;\n\tparts: A2APart[];\n\tmetadata?: Record<string, unknown>;\n\tcreatedAt: string;\n}\n\n// ─── Task Status ─────────────────────────────────────────────────────────────\n\nexport interface A2ATaskStatus {\n\tcode: A2ATaskState;\n\tmessage?: string;\n\tprogress?: number; // 0–100\n}\n\n// ─── Task ────────────────────────────────────────────────────────────────────\n\nexport interface A2ATask {\n\tid: string;\n\tcontextId: string;\n\tstatus: A2ATaskStatus;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\thistory?: A2AMessage[];\n\tartifacts?: A2AArtifact[];\n\tmetadata?: Record<string, unknown>;\n}\n\n// ─── Streaming Events ────────────────────────────────────────────────────────\n\nexport interface A2ATaskStatusUpdateEvent {\n\ttaskId: string;\n\tcontextId: string;\n\tnewState: A2ATaskState;\n\tnewStatus: A2ATaskStatus;\n\ttimestamp: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ATaskArtifactUpdateEvent {\n\ttaskId: string;\n\tcontextId: string;\n\tartifactId: string;\n\tartifact: A2AArtifact;\n\ttimestamp: string;\n}\n\nexport type A2AStreamEvent =\n\t| { type: \"task\"; task: A2ATask }\n\t| { type: \"message\"; message: A2AMessage }\n\t| { type: \"statusUpdate\"; event: A2ATaskStatusUpdateEvent }\n\t| { type: \"artifactUpdate\"; event: A2ATaskArtifactUpdateEvent };\n\n// ─── Security Schemes (OpenAPI-style, per A2A spec) ──────────────────────────\n\nexport interface A2AApiKeySecurityScheme {\n\ttype: \"apiKey\";\n\tname: string;\n\tin: \"query\" | \"header\" | \"cookie\";\n\tdescription?: string;\n}\n\nexport interface A2AHttpSecurityScheme {\n\ttype: \"http\";\n\tscheme: string;\n\tbearerFormat?: string;\n\tdescription?: string;\n}\n\nexport interface A2AOAuth2Flow {\n\tauthorizationUrl?: string;\n\ttokenUrl?: string;\n\trefreshUrl?: string;\n\tscopes: Record<string, string>;\n}\n\nexport interface A2AOAuth2SecurityScheme {\n\ttype: \"oauth2\";\n\tflows: {\n\t\timplicit?: A2AOAuth2Flow;\n\t\tpassword?: A2AOAuth2Flow;\n\t\tclientCredentials?: A2AOAuth2Flow;\n\t\tauthorizationCode?: A2AOAuth2Flow;\n\t\tdeviceCode?: A2AOAuth2Flow;\n\t};\n\tdescription?: string;\n}\n\nexport interface A2AOidcSecurityScheme {\n\ttype: \"openIdConnect\";\n\topenIdConnectUrl: string;\n\tdescription?: string;\n}\n\nexport interface A2AMutualTlsSecurityScheme {\n\ttype: \"mutualTls\";\n\tdescription?: string;\n}\n\nexport type A2ASecurityScheme =\n\t| A2AApiKeySecurityScheme\n\t| A2AHttpSecurityScheme\n\t| A2AOAuth2SecurityScheme\n\t| A2AOidcSecurityScheme\n\t| A2AMutualTlsSecurityScheme;\n\n// ─── Agent Card ──────────────────────────────────────────────────────────────\n\nexport interface A2AAgentProvider {\n\tname: string;\n\temail?: string;\n\turl?: string;\n}\n\nexport interface A2AAgentSkill {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tinputSchema?: Record<string, unknown>;\n\toutputSchema?: Record<string, unknown>;\n\tsupportedMediaTypes?: string[];\n\ttags?: string[];\n}\n\nexport interface A2AAgentCapabilities {\n\tstreaming?: boolean;\n\tpushNotifications?: boolean;\n\textendedAgentCard?: boolean;\n}\n\nexport interface A2AAgentCardSignature {\n\talgorithm: string;\n\tsignature: string;\n\tkeyId: string;\n}\n\nexport interface A2AAgentCard {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tversion: string;\n\tprotocolVersion: string;\n\turl: string;\n\tprovider?: A2AAgentProvider;\n\tcapabilities?: A2AAgentCapabilities;\n\tskills: A2AAgentSkill[];\n\tsecuritySchemes?: Record<string, A2ASecurityScheme>;\n\tsecurity?: Array<Record<string, string[]>>;\n\tdefaultInputModes?: string[];\n\tdefaultOutputModes?: string[];\n\tdocumentationUrl?: string;\n\tsignature?: A2AAgentCardSignature;\n\tmetadata?: Record<string, unknown>;\n}\n\n// ─── JSON-RPC Envelope ───────────────────────────────────────────────────────\n\nexport interface A2AJsonRpcRequest<P = unknown> {\n\tjsonrpc: \"2.0\";\n\tid: string | number;\n\tmethod: string;\n\tparams: P;\n}\n\nexport interface A2AJsonRpcResponse<R = unknown> {\n\tjsonrpc: \"2.0\";\n\tid: string | number;\n\tresult?: R;\n\terror?: A2AJsonRpcError;\n}\n\nexport interface A2AJsonRpcError {\n\tcode: number;\n\tmessage: string;\n\tdata?: unknown;\n}\n\n// ─── JSON-RPC Standard Error Codes ───────────────────────────────────────────\n\nexport const A2A_ERROR_CODES = {\n\tPARSE_ERROR: -32700,\n\tINVALID_REQUEST: -32600,\n\tMETHOD_NOT_FOUND: -32601,\n\tINVALID_PARAMS: -32602,\n\tINTERNAL_ERROR: -32603,\n\t// A2A-specific codes (application-defined range)\n\tTASK_NOT_FOUND: -32001,\n\tAGENT_NOT_FOUND: -32002,\n\tAUTHENTICATION_REQUIRED: -32003,\n\tPERMISSION_DENIED: -32004,\n\tRATE_LIMITED: -32005,\n\tTASK_ALREADY_COMPLETED: -32006,\n} as const;\n\n// ─── JSON-RPC Method Params ──────────────────────────────────────────────────\n\nexport interface A2ASendMessageParams {\n\tmessage: A2AMessage;\n\tconfiguration?: A2ASendMessageConfiguration;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ASendMessageConfiguration {\n\tacceptedOutputModes?: string[];\n\thistoryLength?: number;\n\treturnImmediately?: boolean;\n}\n\nexport interface A2AGetTaskParams {\n\tid: string;\n\thistoryLength?: number;\n}\n\nexport interface A2ACancelTaskParams {\n\tid: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ASubscribeToTaskParams {\n\tid: string;\n}\n\n// ─── JSON-RPC Method Names ───────────────────────────────────────────────────\n\nexport const A2A_METHODS = {\n\tSEND_MESSAGE: \"message/send\",\n\tSEND_STREAMING_MESSAGE: \"message/stream\",\n\tGET_TASK: \"tasks/get\",\n\tCANCEL_TASK: \"tasks/cancel\",\n} as const;\n\n// ─── A2A Server Config ───────────────────────────────────────────────────────\n\nexport interface A2ATaskHandler {\n\t/** Handle an incoming message and produce a task result */\n\tonMessage: (message: A2AMessage, config?: A2ASendMessageConfiguration) => Promise<A2ATask>;\n\t/** Handle task cancellation */\n\tonCancel?: (taskId: string) => Promise<A2ATask>;\n\t/** Handle streaming message — yields events instead of returning a task */\n\tonMessageStream?: (\n\t\tmessage: A2AMessage,\n\t\tconfig?: A2ASendMessageConfiguration,\n\t) => AsyncIterable<A2AStreamEvent>;\n}\n\nexport interface A2AServerConfig {\n\t/** Agent card for this server */\n\tagentCard: A2AAgentCard;\n\t/** Handler for incoming tasks */\n\thandler: A2ATaskHandler;\n\t/** Validate an incoming auth token. Return the agent ID or null if invalid. */\n\tauthenticate?: (request: Request) => Promise<string | null>;\n\t/** Called after each A2A interaction for audit logging */\n\tonAudit?: (event: A2AAuditEvent) => Promise<void>;\n\t/** In-memory or external task store. Defaults to in-memory Map. */\n\ttaskStore?: A2ATaskStore;\n}\n\nexport interface A2ATaskStore {\n\tget: (taskId: string) => Promise<A2ATask | undefined>;\n\tset: (taskId: string, task: A2ATask) => Promise<void>;\n\tdelete: (taskId: string) => Promise<boolean>;\n}\n\nexport interface A2AAuditEvent {\n\tmethod: string;\n\tagentId: string | null;\n\ttaskId?: string;\n\ttimestamp: string;\n\tsuccess: boolean;\n\terror?: string;\n}\n\n// ─── A2A Client Config ───────────────────────────────────────────────────────\n\nexport interface A2AClientConfig {\n\t/** Base URL of the remote A2A agent, or a discovered Agent Card */\n\tagent: string | A2AAgentCard;\n\t/** Auth token or function that returns a token */\n\tgetAuthToken?: () => Promise<string> | string;\n\t/** Custom fetch implementation (for testing or proxying) */\n\tfetch?: typeof globalThis.fetch;\n\t/** Request timeout in milliseconds. Default: 30_000. */\n\ttimeout?: number;\n}\n\nexport interface A2AClient {\n\t/** Discover the remote agent's card from /.well-known/agent.json */\n\tdiscover: () => Promise<Result<A2AAgentCard>>;\n\t/** Send a message and get a task back */\n\tsendMessage: (params: A2ASendMessageParams) => Promise<Result<A2ATask>>;\n\t/** Get an existing task by ID */\n\tgetTask: (params: A2AGetTaskParams) => Promise<Result<A2ATask>>;\n\t/** Cancel a running task */\n\tcancelTask: (params: A2ACancelTaskParams) => Promise<Result<A2ATask>>;\n\t/** Send a streaming message and receive SSE events */\n\tsendStreamingMessage: (params: A2ASendMessageParams) => AsyncIterable<A2AStreamEvent>;\n}\n\n// ─── Zod Schemas ─────────────────────────────────────────────────────────────\n\nexport const A2ATextPartSchema = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n});\n\nexport const A2AFilePartSchema = z.object({\n\ttype: z.literal(\"file\"),\n\tfileUri: z.string(),\n\tmimeType: z.string(),\n\tname: z.string().optional(),\n});\n\nexport const A2ADataPartSchema = z.object({\n\ttype: z.literal(\"data\"),\n\tmimeType: z.string(),\n\tdata: z.string(),\n});\n\nexport const A2APartSchema = z.discriminatedUnion(\"type\", [\n\tA2ATextPartSchema,\n\tA2AFilePartSchema,\n\tA2ADataPartSchema,\n]);\n\nexport const A2AMessageSchema = z.object({\n\tid: z.string().min(1),\n\trole: z.enum([\"user\", \"agent\"]),\n\tparts: z.array(A2APartSchema).min(1),\n\tcreatedAt: z.string(),\n\tmetadata: z.record(z.unknown()).optional(),\n\treferenceTaskIds: z.array(z.string()).optional(),\n});\n\nexport const A2ATaskStateSchema = z.enum([\n\t\"submitted\",\n\t\"working\",\n\t\"input-required\",\n\t\"completed\",\n\t\"failed\",\n\t\"canceled\",\n\t\"auth-required\",\n\t\"rejected\",\n]);\n\nexport const A2ATaskStatusSchema = z.object({\n\tcode: A2ATaskStateSchema,\n\tmessage: z.string().optional(),\n\tprogress: z.number().min(0).max(100).optional(),\n});\n\nexport const A2AArtifactSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().optional(),\n\tmimeType: z.string().optional(),\n\tparts: z.array(A2APartSchema).min(1),\n\tmetadata: z.record(z.unknown()).optional(),\n\tcreatedAt: z.string(),\n});\n\nexport const A2ATaskSchema = z.object({\n\tid: z.string().min(1),\n\tcontextId: z.string().min(1),\n\tstatus: A2ATaskStatusSchema,\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\thistory: z.array(A2AMessageSchema).optional(),\n\tartifacts: z.array(A2AArtifactSchema).optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AAgentSkillSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tinputSchema: z.record(z.unknown()).optional(),\n\toutputSchema: z.record(z.unknown()).optional(),\n\tsupportedMediaTypes: z.array(z.string()).optional(),\n\ttags: z.array(z.string()).optional(),\n});\n\nexport const A2AAgentProviderSchema = z.object({\n\tname: z.string().min(1),\n\temail: z.string().optional(),\n\turl: z.string().optional(),\n});\n\nexport const A2AAgentCapabilitiesSchema = z.object({\n\tstreaming: z.boolean().optional(),\n\tpushNotifications: z.boolean().optional(),\n\textendedAgentCard: z.boolean().optional(),\n});\n\nconst A2ASecuritySchemeBaseSchema = z.object({\n\tdescription: z.string().optional(),\n});\n\nexport const A2AApiKeySecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"apiKey\"),\n\tname: z.string().min(1),\n\tin: z.enum([\"query\", \"header\", \"cookie\"]),\n});\n\nexport const A2AHttpSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"http\"),\n\tscheme: z.string().min(1),\n\tbearerFormat: z.string().optional(),\n});\n\nexport const A2AOAuth2FlowSchema = z.object({\n\tauthorizationUrl: z.string().optional(),\n\ttokenUrl: z.string().optional(),\n\trefreshUrl: z.string().optional(),\n\tscopes: z.record(z.string()),\n});\n\nexport const A2AOAuth2SecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"oauth2\"),\n\tflows: z.object({\n\t\timplicit: A2AOAuth2FlowSchema.optional(),\n\t\tpassword: A2AOAuth2FlowSchema.optional(),\n\t\tclientCredentials: A2AOAuth2FlowSchema.optional(),\n\t\tauthorizationCode: A2AOAuth2FlowSchema.optional(),\n\t\tdeviceCode: A2AOAuth2FlowSchema.optional(),\n\t}),\n});\n\nexport const A2AOidcSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"openIdConnect\"),\n\topenIdConnectUrl: z.string().min(1),\n});\n\nexport const A2AMutualTlsSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"mutualTls\"),\n});\n\nexport const A2ASecuritySchemeSchema = z.discriminatedUnion(\"type\", [\n\tA2AApiKeySecuritySchemeSchema,\n\tA2AHttpSecuritySchemeSchema,\n\tA2AOAuth2SecuritySchemeSchema,\n\tA2AOidcSecuritySchemeSchema,\n\tA2AMutualTlsSecuritySchemeSchema,\n]);\n\nexport const A2AAgentCardSignatureSchema = z.object({\n\talgorithm: z.string().min(1),\n\tsignature: z.string().min(1),\n\tkeyId: z.string().min(1),\n});\n\nexport const A2AAgentCardSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tversion: z.string().min(1),\n\tprotocolVersion: z.string().min(1),\n\turl: z.string().url(),\n\tprovider: A2AAgentProviderSchema.optional(),\n\tcapabilities: A2AAgentCapabilitiesSchema.optional(),\n\tskills: z.array(A2AAgentSkillSchema).min(1),\n\tsecuritySchemes: z.record(A2ASecuritySchemeSchema).optional(),\n\tsecurity: z.array(z.record(z.array(z.string()))).optional(),\n\tdefaultInputModes: z.array(z.string()).optional(),\n\tdefaultOutputModes: z.array(z.string()).optional(),\n\tdocumentationUrl: z.string().url().optional(),\n\tsignature: A2AAgentCardSignatureSchema.optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2ASendMessageConfigurationSchema = z.object({\n\tacceptedOutputModes: z.array(z.string()).optional(),\n\thistoryLength: z.number().int().min(0).optional(),\n\treturnImmediately: z.boolean().optional(),\n});\n\nexport const A2ASendMessageParamsSchema = z.object({\n\tmessage: A2AMessageSchema,\n\tconfiguration: A2ASendMessageConfigurationSchema.optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AGetTaskParamsSchema = z.object({\n\tid: z.string().min(1),\n\thistoryLength: z.number().int().min(0).optional(),\n});\n\nexport const A2ACancelTaskParamsSchema = z.object({\n\tid: z.string().min(1),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AJsonRpcRequestSchema = z.object({\n\tjsonrpc: z.literal(\"2.0\"),\n\tid: z.union([z.string(), z.number()]),\n\tmethod: z.string().min(1),\n\tparams: z.unknown(),\n});\n","/**\n * A2A Agent Card management.\n *\n * Creates, validates, signs, and verifies Agent Cards that describe\n * an agent's identity, capabilities, skills, and auth requirements\n * using the A2A protocol format.\n */\n\nimport * as jose from \"jose\";\nimport { generateId } from \"../crypto/web-crypto.js\";\nimport type { AgentIdentity } from \"../types.js\";\nimport type {\n\tA2AAgentCapabilities,\n\tA2AAgentCard,\n\tA2AAgentProvider,\n\tA2AAgentSkill,\n\tA2ASecurityScheme,\n\tResult,\n} from \"./types.js\";\nimport { A2A_PROTOCOL_VERSION, A2AAgentCardSchema } from \"./types.js\";\n\n// ─── Create Agent Card ───────────────────────────────────────────────────────\n\nexport interface CreateAgentCardInput {\n\t/** The TheAuth agent identity to build the card from */\n\tagent: Pick<AgentIdentity, \"id\" | \"name\" | \"type\">;\n\t/** The URL where this agent's A2A endpoint is hosted */\n\turl: string;\n\t/** Human-readable description of what the agent does */\n\tdescription: string;\n\t/** Semantic version of this agent */\n\tversion: string;\n\t/** Skills this agent can perform */\n\tskills: A2AAgentSkill[];\n\t/** Optional provider information */\n\tprovider?: A2AAgentProvider;\n\t/** Optional capabilities declaration */\n\tcapabilities?: A2AAgentCapabilities;\n\t/** Security schemes required to call this agent */\n\tsecuritySchemes?: Record<string, A2ASecurityScheme>;\n\t/** Security requirements (references to securitySchemes keys) */\n\tsecurity?: Array<Record<string, string[]>>;\n\t/** Default accepted input MIME types */\n\tdefaultInputModes?: string[];\n\t/** Default output MIME types */\n\tdefaultOutputModes?: string[];\n\t/** Link to agent documentation */\n\tdocumentationUrl?: string;\n\t/** Arbitrary metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Create an A2A-compliant Agent Card from a TheAuth agent identity.\n *\n * Maps TheAuth agent fields to the A2A Agent Card format and sets\n * the protocol version automatically.\n */\nexport function createAgentCard(input: CreateAgentCardInput): A2AAgentCard {\n\tconst card: A2AAgentCard = {\n\t\tid: input.agent.id,\n\t\tname: input.agent.name,\n\t\tdescription: input.description,\n\t\tversion: input.version,\n\t\tprotocolVersion: A2A_PROTOCOL_VERSION,\n\t\turl: input.url,\n\t\tskills: input.skills,\n\t};\n\n\tif (input.provider) card.provider = input.provider;\n\tif (input.capabilities) card.capabilities = input.capabilities;\n\tif (input.securitySchemes) card.securitySchemes = input.securitySchemes;\n\tif (input.security) card.security = input.security;\n\tif (input.defaultInputModes) card.defaultInputModes = input.defaultInputModes;\n\tif (input.defaultOutputModes) card.defaultOutputModes = input.defaultOutputModes;\n\tif (input.documentationUrl) card.documentationUrl = input.documentationUrl;\n\tif (input.metadata) card.metadata = input.metadata;\n\n\treturn card;\n}\n\n// ─── Validate Agent Card ─────────────────────────────────────────────────────\n\n/**\n * Validate an incoming Agent Card against the A2A schema.\n *\n * Returns the parsed card on success or a structured error on failure.\n */\nexport function validateAgentCard(card: unknown): Result<A2AAgentCard> {\n\tconst parsed = A2AAgentCardSchema.safeParse(card);\n\tif (!parsed.success) {\n\t\tconst issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_INVALID_AGENT_CARD\",\n\t\t\t\tmessage: `Invalid Agent Card: ${issues.join(\"; \")}`,\n\t\t\t\tdetails: { issues },\n\t\t\t},\n\t\t};\n\t}\n\treturn { success: true, data: parsed.data as A2AAgentCard };\n}\n\n// ─── Sign Agent Card ─────────────────────────────────────────────────────────\n\nexport interface SignAgentCardOptions {\n\t/** The Agent Card to sign */\n\tcard: A2AAgentCard;\n\t/** JWK private key used to create the signature */\n\tprivateKey: CryptoKey | jose.JWK;\n\t/** Signing algorithm. Default: \"ES256\". */\n\talgorithm?: string;\n\t/** Key ID to include in the signature. Auto-generated if not provided. */\n\tkeyId?: string;\n}\n\n/**\n * Sign an Agent Card with a private key.\n *\n * Creates a JWS compact signature over the card's canonical JSON\n * (excluding the signature field itself). The signature, algorithm,\n * and key ID are attached to the card's `signature` field.\n */\nexport async function signAgentCard(options: SignAgentCardOptions): Promise<Result<A2AAgentCard>> {\n\tconst { card, privateKey, algorithm = \"ES256\", keyId } = options;\n\n\ttry {\n\t\t// Strip existing signature before signing\n\t\tconst { signature: _ignored, ...cardWithoutSignature } = card;\n\n\t\tconst payload = new TextEncoder().encode(JSON.stringify(cardWithoutSignature));\n\n\t\tconst key =\n\t\t\t\"kty\" in (privateKey as jose.JWK)\n\t\t\t\t? await jose.importJWK(privateKey as jose.JWK, algorithm)\n\t\t\t\t: privateKey;\n\n\t\tconst kid = keyId ?? generateId();\n\n\t\tconst jws = await new jose.CompactSign(payload)\n\t\t\t.setProtectedHeader({ alg: algorithm, kid })\n\t\t\t.sign(key as CryptoKey);\n\n\t\tconst signedCard: A2AAgentCard = {\n\t\t\t...card,\n\t\t\tsignature: {\n\t\t\t\talgorithm,\n\t\t\t\tsignature: jws,\n\t\t\t\tkeyId: kid,\n\t\t\t},\n\t\t};\n\n\t\treturn { success: true, data: signedCard };\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_SIGN_FAILED\",\n\t\t\t\tmessage: err instanceof Error ? err.message : \"Failed to sign agent card\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n// ─── Verify Agent Card ───────────────────────────────────────────────────────\n\nexport interface VerifyAgentCardOptions {\n\t/** The signed Agent Card to verify */\n\tcard: A2AAgentCard;\n\t/** JWK public key used to verify the signature */\n\tpublicKey: CryptoKey | jose.JWK;\n}\n\n/**\n * Verify a signed Agent Card's signature.\n *\n * Checks that the JWS signature in `card.signature` is valid\n * against the provided public key and that the payload matches\n * the card content (minus the signature field).\n */\nexport async function verifyAgentCard(\n\toptions: VerifyAgentCardOptions,\n): Promise<Result<{ valid: boolean; card: A2AAgentCard }>> {\n\tconst { card, publicKey } = options;\n\n\tif (!card.signature) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_NO_SIGNATURE\",\n\t\t\t\tmessage: \"Agent Card has no signature to verify\",\n\t\t\t},\n\t\t};\n\t}\n\n\ttry {\n\t\tconst { signature, ...cardWithoutSignature } = card;\n\t\tconst algorithm = signature.algorithm;\n\n\t\tconst key =\n\t\t\t\"kty\" in (publicKey as jose.JWK)\n\t\t\t\t? await jose.importJWK(publicKey as jose.JWK, algorithm)\n\t\t\t\t: publicKey;\n\n\t\tconst { payload } = await jose.compactVerify(signature.signature, key as CryptoKey);\n\n\t\tconst decoded = new TextDecoder().decode(payload);\n\t\tconst signedContent = JSON.parse(decoded) as Record<string, unknown>;\n\t\tconst currentContent = JSON.stringify(cardWithoutSignature);\n\t\tconst parsedCurrentContent = JSON.parse(currentContent) as Record<string, unknown>;\n\n\t\t// Compare the signed payload against the current card content\n\t\tconst matches = JSON.stringify(signedContent) === JSON.stringify(parsedCurrentContent);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { valid: matches, card },\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_VERIFY_FAILED\",\n\t\t\t\tmessage: err instanceof Error ? err.message : \"Failed to verify agent card signature\",\n\t\t\t},\n\t\t};\n\t}\n}\n","/**\n * A2A client for TheAuth.\n *\n * Discovers remote agents via /.well-known/agent.json and communicates\n * with them through JSON-RPC over HTTP. Supports message send, task\n * retrieval, cancellation, and SSE streaming.\n */\n\nimport { generateId } from \"../crypto/web-crypto.js\";\nimport type {\n\tA2AAgentCard,\n\tA2ACancelTaskParams,\n\tA2AClient,\n\tA2AClientConfig,\n\tA2AGetTaskParams,\n\tA2AJsonRpcResponse,\n\tA2ASendMessageParams,\n\tA2AStreamEvent,\n\tA2ATask,\n\tResult,\n} from \"./types.js\";\nimport {\n\tA2A_JSONRPC_VERSION,\n\tA2A_METHODS,\n\tA2A_WELL_KNOWN_PATH,\n\tA2AAgentCardSchema,\n} from \"./types.js\";\n\n// ─── Create A2A Client ──────────────────────────────────────────────────────\n\n/**\n * Create an A2A client that can discover and call remote A2A agents.\n *\n * @example\n * ```typescript\n * const client = createA2AClient({\n * agent: 'https://remote-agent.example.com',\n * getAuthToken: () => kavach.issueToken({ agentId: myAgent.id }),\n * });\n *\n * const card = await client.discover();\n * const result = await client.sendMessage({\n * message: { id: '1', role: 'user', parts: [{ type: 'text', text: 'Hello' }], createdAt: new Date().toISOString() },\n * });\n * ```\n */\nexport function createA2AClient(config: A2AClientConfig): A2AClient {\n\tconst fetchFn = config.fetch ?? globalThis.fetch;\n\tconst timeout = config.timeout ?? 30_000;\n\n\tlet cachedCard: A2AAgentCard | undefined;\n\n\t// Resolve the base URL from the config\n\tfunction getBaseUrl(): string {\n\t\tif (typeof config.agent === \"string\") {\n\t\t\treturn config.agent.replace(/\\/$/, \"\");\n\t\t}\n\t\treturn config.agent.url.replace(/\\/$/, \"\");\n\t}\n\n\t// If the agent was passed as a card, use it directly\n\tif (typeof config.agent !== \"string\") {\n\t\tcachedCard = config.agent;\n\t}\n\n\tasync function getAuthHeaders(): Promise<Record<string, string>> {\n\t\tif (!config.getAuthToken) return {};\n\t\tconst token = await config.getAuthToken();\n\t\treturn { Authorization: `Bearer ${token}` };\n\t}\n\n\tasync function jsonRpcCall<R>(method: string, params: unknown): Promise<Result<R>> {\n\t\tconst baseUrl = cachedCard?.url ?? getBaseUrl();\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeout);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(baseUrl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...authHeaders,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\tmethod,\n\t\t\t\t\tparams,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_HTTP_ERROR\",\n\t\t\t\t\t\tmessage: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst body = (await response.json()) as A2AJsonRpcResponse<R>;\n\n\t\t\tif (body.error) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: `A2A_RPC_${body.error.code}`,\n\t\t\t\t\t\tmessage: body.error.message,\n\t\t\t\t\t\tdetails: body.error.data ? { data: body.error.data } : undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { success: true, data: body.result as R };\n\t\t} catch (err) {\n\t\t\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_TIMEOUT\",\n\t\t\t\t\t\tmessage: `Request timed out after ${timeout}ms`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"A2A_REQUEST_FAILED\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Request failed\",\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tasync function discover(): Promise<Result<A2AAgentCard>> {\n\t\tif (cachedCard) {\n\t\t\treturn { success: true, data: cachedCard };\n\t\t}\n\n\t\tconst baseUrl = getBaseUrl();\n\t\tconst url = `${baseUrl}${A2A_WELL_KNOWN_PATH}`;\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeout);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: authHeaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_DISCOVERY_FAILED\",\n\t\t\t\t\t\tmessage: `Discovery failed: HTTP ${response.status}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst body: unknown = await response.json();\n\t\t\tconst parsed = A2AAgentCardSchema.safeParse(body);\n\n\t\t\tif (!parsed.success) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_INVALID_AGENT_CARD\",\n\t\t\t\t\t\tmessage: `Invalid agent card: ${parsed.error.issues.map((i) => i.message).join(\"; \")}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcachedCard = parsed.data as A2AAgentCard;\n\t\t\treturn { success: true, data: cachedCard };\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"A2A_DISCOVERY_FAILED\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Discovery request failed\",\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tasync function sendMessage(params: A2ASendMessageParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.SEND_MESSAGE, params);\n\t}\n\n\tasync function getTask(params: A2AGetTaskParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.GET_TASK, params);\n\t}\n\n\tasync function cancelTask(params: A2ACancelTaskParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.CANCEL_TASK, params);\n\t}\n\n\tasync function* sendStreamingMessage(\n\t\tparams: A2ASendMessageParams,\n\t): AsyncIterable<A2AStreamEvent> {\n\t\tconst baseUrl = cachedCard?.url ?? getBaseUrl();\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst response = await fetchFn(baseUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t\t...authHeaders,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\t\t\tid: generateId(),\n\t\t\t\tmethod: A2A_METHODS.SEND_STREAMING_MESSAGE,\n\t\t\t\tparams,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok || !response.body) {\n\t\t\tthrow new Error(`Streaming request failed: HTTP ${response.status}`);\n\t\t}\n\n\t\tconst reader = response.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet buffer = \"\";\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (line.startsWith(\"data: \")) {\n\t\t\t\t\t\tconst data = line.slice(6).trim();\n\t\t\t\t\t\tif (data === \"[DONE]\") return;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tyield JSON.parse(data) as A2AStreamEvent;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip malformed SSE lines\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n\n\treturn {\n\t\tdiscover,\n\t\tsendMessage,\n\t\tgetTask,\n\t\tcancelTask,\n\t\tsendStreamingMessage,\n\t};\n}\n","/**\n * A2A JSON-RPC server for TheAuth.\n *\n * Creates a Web API Request/Response handler that implements the A2A\n * protocol's JSON-RPC endpoint. Handles message/send, tasks/get,\n * tasks/cancel, and message/stream (SSE). Authenticates callers through\n * TheAuth and logs every interaction to the audit trail.\n */\n\nimport type {\n\tA2AAuditEvent,\n\tA2AJsonRpcError,\n\tA2AJsonRpcResponse,\n\tA2AServerConfig,\n\tA2ATask,\n\tA2ATaskStore,\n} from \"./types.js\";\nimport {\n\tA2A_ERROR_CODES,\n\tA2A_JSONRPC_VERSION,\n\tA2A_METHODS,\n\tA2A_WELL_KNOWN_PATH,\n\tA2ACancelTaskParamsSchema,\n\tA2AGetTaskParamsSchema,\n\tA2AJsonRpcRequestSchema,\n\tA2ASendMessageParamsSchema,\n} from \"./types.js\";\n\n// ─── In-memory task store (default) ──────────────────────────────────────────\n\nfunction createInMemoryTaskStore(): A2ATaskStore {\n\tconst tasks = new Map<string, A2ATask>();\n\treturn {\n\t\tasync get(taskId: string) {\n\t\t\treturn tasks.get(taskId);\n\t\t},\n\t\tasync set(taskId: string, task: A2ATask) {\n\t\t\ttasks.set(taskId, task);\n\t\t},\n\t\tasync delete(taskId: string) {\n\t\t\treturn tasks.delete(taskId);\n\t\t},\n\t};\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction jsonRpcError(id: string | number | null, error: A2AJsonRpcError): Response {\n\tconst body: A2AJsonRpcResponse = {\n\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\tid: id ?? 0,\n\t\terror,\n\t};\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus: 200, // JSON-RPC always returns 200\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\nfunction jsonRpcSuccess(id: string | number, result: unknown): Response {\n\tconst body: A2AJsonRpcResponse = {\n\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\tid,\n\t\tresult,\n\t};\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus: 200,\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\n// ─── Create A2A Server ───────────────────────────────────────────────────────\n\nexport interface A2AServer {\n\t/** Handle an incoming HTTP request (JSON-RPC or agent card discovery) */\n\thandleRequest: (request: Request) => Promise<Response>;\n\t/** Access the task store directly (for testing or admin) */\n\ttaskStore: A2ATaskStore;\n}\n\n/**\n * Create an A2A-compliant JSON-RPC server.\n *\n * The returned `handleRequest` function accepts standard Web API Request\n * objects and returns Response objects. Mount it at whatever path you\n * prefer; it also handles `/.well-known/agent.json` for agent card\n * discovery.\n *\n * @example\n * ```typescript\n * const server = createA2AServer({\n * agentCard: myCard,\n * handler: {\n * onMessage: async (msg) => ({ id: '...', contextId: '...', status: { code: 'completed' }, ... }),\n * },\n * authenticate: async (req) => verifyToken(req),\n * });\n *\n * // In your HTTP framework:\n * app.all('/a2a', (req) => server.handleRequest(req));\n * ```\n */\nexport function createA2AServer(config: A2AServerConfig): A2AServer {\n\tconst taskStore = config.taskStore ?? createInMemoryTaskStore();\n\n\tasync function audit(event: Omit<A2AAuditEvent, \"timestamp\">): Promise<void> {\n\t\tif (config.onAudit) {\n\t\t\tawait config.onAudit({\n\t\t\t\t...event,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function authenticate(\n\t\trequest: Request,\n\t): Promise<{ agentId: string | null; error: Response | null }> {\n\t\tif (!config.authenticate) {\n\t\t\treturn { agentId: null, error: null };\n\t\t}\n\n\t\tconst agentId = await config.authenticate(request);\n\t\tif (agentId === null) {\n\t\t\treturn {\n\t\t\t\tagentId: null,\n\t\t\t\terror: jsonRpcError(0, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.AUTHENTICATION_REQUIRED,\n\t\t\t\t\tmessage: \"Authentication required\",\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\n\t\treturn { agentId, error: null };\n\t}\n\n\tasync function handleSendMessage(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2ASendMessageParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Invalid params\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: `Invalid params: ${parsed.error.issues.map((i) => i.message).join(\"; \")}`,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst task = await config.handler.onMessage(parsed.data.message, parsed.data.configuration);\n\n\t\t\tawait taskStore.set(task.id, task);\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: task.id,\n\t\t\t\tsuccess: true,\n\t\t\t});\n\n\t\t\treturn jsonRpcSuccess(id, task);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : \"Internal error\";\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\tmessage,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function handleGetTask(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2AGetTaskParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params: id is required\",\n\t\t\t});\n\t\t}\n\n\t\tconst task = await taskStore.get(parsed.data.id);\n\t\tif (!task) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.GET_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task not found\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_NOT_FOUND,\n\t\t\t\tmessage: `Task ${parsed.data.id} not found`,\n\t\t\t});\n\t\t}\n\n\t\t// Trim history if historyLength specified\n\t\tlet result = task;\n\t\tif (parsed.data.historyLength !== undefined && task.history) {\n\t\t\tconst len = parsed.data.historyLength;\n\t\t\tresult = {\n\t\t\t\t...task,\n\t\t\t\thistory: len === 0 ? [] : task.history.slice(-len),\n\t\t\t};\n\t\t}\n\n\t\tawait audit({\n\t\t\tmethod: A2A_METHODS.GET_TASK,\n\t\t\tagentId,\n\t\t\ttaskId: task.id,\n\t\t\tsuccess: true,\n\t\t});\n\n\t\treturn jsonRpcSuccess(id, result);\n\t}\n\n\tasync function handleCancelTask(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2ACancelTaskParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params: id is required\",\n\t\t\t});\n\t\t}\n\n\t\tconst existing = await taskStore.get(parsed.data.id);\n\t\tif (!existing) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task not found\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_NOT_FOUND,\n\t\t\t\tmessage: `Task ${parsed.data.id} not found`,\n\t\t\t});\n\t\t}\n\n\t\t// Already in a terminal state\n\t\tif (\n\t\t\texisting.status.code === \"completed\" ||\n\t\t\texisting.status.code === \"failed\" ||\n\t\t\texisting.status.code === \"canceled\"\n\t\t) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: existing.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task already in terminal state\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_ALREADY_COMPLETED,\n\t\t\t\tmessage: `Task ${parsed.data.id} is already ${existing.status.code}`,\n\t\t\t});\n\t\t}\n\n\t\tif (config.handler.onCancel) {\n\t\t\ttry {\n\t\t\t\tconst canceled = await config.handler.onCancel(parsed.data.id);\n\t\t\t\tawait taskStore.set(canceled.id, canceled);\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\t\tagentId,\n\t\t\t\t\ttaskId: canceled.id,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t});\n\t\t\t\treturn jsonRpcSuccess(id, canceled);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Cancel failed\";\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\t\tagentId,\n\t\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: message,\n\t\t\t\t});\n\t\t\t\treturn jsonRpcError(id, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Default cancellation\n\t\tconst canceled: A2ATask = {\n\t\t\t...existing,\n\t\t\tstatus: { code: \"canceled\", message: \"Canceled by client\" },\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t};\n\t\tawait taskStore.set(canceled.id, canceled);\n\t\tawait audit({\n\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\tagentId,\n\t\t\ttaskId: canceled.id,\n\t\t\tsuccess: true,\n\t\t});\n\t\treturn jsonRpcSuccess(id, canceled);\n\t}\n\n\tfunction handleStreamingMessage(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Response {\n\t\tif (!config.handler.onMessageStream) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.METHOD_NOT_FOUND,\n\t\t\t\tmessage: \"Streaming not supported by this agent\",\n\t\t\t});\n\t\t}\n\n\t\tconst parsed = A2ASendMessageParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params\",\n\t\t\t});\n\t\t}\n\n\t\tconst stream = config.handler.onMessageStream(parsed.data.message, parsed.data.configuration);\n\n\t\tconst encoder = new TextEncoder();\n\t\tconst readable = new ReadableStream({\n\t\t\tasync start(controller) {\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const event of stream) {\n\t\t\t\t\t\tconst data = JSON.stringify(event);\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n\t\t\t\t\t}\n\t\t\t\t\tcontroller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst errorData = JSON.stringify({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Stream error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tcontroller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t}\n\t\t\t\t// Fire-and-forget audit\n\t\t\t\tvoid audit({\n\t\t\t\t\tmethod: A2A_METHODS.SEND_STREAMING_MESSAGE,\n\t\t\t\t\tagentId,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\treturn new Response(readable, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\tConnection: \"keep-alive\",\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function handleRequest(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\n\t\t// Agent Card discovery\n\t\tif (request.method === \"GET\" && url.pathname.endsWith(A2A_WELL_KNOWN_PATH)) {\n\t\t\treturn new Response(JSON.stringify(config.agentCard), {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t});\n\t\t}\n\n\t\t// Only POST for JSON-RPC\n\t\tif (request.method !== \"POST\") {\n\t\t\treturn new Response(\"Method Not Allowed\", { status: 405 });\n\t\t}\n\n\t\t// Authenticate\n\t\tconst auth = await authenticate(request);\n\t\tif (auth.error) return auth.error;\n\t\tconst agentId = auth.agentId;\n\n\t\t// Parse JSON-RPC envelope\n\t\tlet body: unknown;\n\t\ttry {\n\t\t\tbody = await request.json();\n\t\t} catch {\n\t\t\treturn jsonRpcError(null, {\n\t\t\t\tcode: A2A_ERROR_CODES.PARSE_ERROR,\n\t\t\t\tmessage: \"Invalid JSON\",\n\t\t\t});\n\t\t}\n\n\t\tconst envelope = A2AJsonRpcRequestSchema.safeParse(body);\n\t\tif (!envelope.success) {\n\t\t\treturn jsonRpcError(null, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_REQUEST,\n\t\t\t\tmessage: \"Invalid JSON-RPC request\",\n\t\t\t});\n\t\t}\n\n\t\tconst { id: reqId, method, params } = envelope.data;\n\n\t\tswitch (method) {\n\t\t\tcase A2A_METHODS.SEND_MESSAGE:\n\t\t\t\treturn handleSendMessage(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.GET_TASK:\n\t\t\t\treturn handleGetTask(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.CANCEL_TASK:\n\t\t\t\treturn handleCancelTask(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.SEND_STREAMING_MESSAGE:\n\t\t\t\treturn handleStreamingMessage(reqId, params, agentId);\n\n\t\t\tdefault:\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod,\n\t\t\t\t\tagentId,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"Method not found\",\n\t\t\t\t});\n\t\t\t\treturn jsonRpcError(reqId, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.METHOD_NOT_FOUND,\n\t\t\t\t\tmessage: `Unknown method: ${method}`,\n\t\t\t\t});\n\t\t}\n\t}\n\n\treturn { handleRequest, taskStore };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/crypto/web-crypto.ts","../../src/a2a/types.ts","../../src/a2a/agent-card.ts","../../src/a2a/client.ts","../../src/a2a/server.ts"],"names":["canceled"],"mappings":";;;;;;AAwEO,SAAS,UAAA,GAAqB;AACpC,EAAA,OAAO,UAAA,CAAW,OAAO,UAAA,EAAW;AACrC;AAkBqB,IAAI,WAAA;AC3ElB,IAAM,oBAAA,GAAuB;AAC7B,IAAM,mBAAA,GAAsB;AAC5B,IAAM,mBAAA,GAAsB;AAwO5B,IAAM,eAAA,GAAkB;AAAA,EAC9B,WAAA,EAAa,MAAA;AAAA,EACb,eAAA,EAAiB,MAAA;AAAA,EACjB,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,MAAA;AAAA;AAAA,EAEhB,cAAA,EAAgB,MAAA;AAAA,EAChB,eAAA,EAAiB,MAAA;AAAA,EACjB,uBAAA,EAAyB,MAAA;AAAA,EACzB,iBAAA,EAAmB,MAAA;AAAA,EACnB,YAAA,EAAc,MAAA;AAAA,EACd,sBAAA,EAAwB;AACzB;AAgCO,IAAM,WAAA,GAAc;AAAA,EAC1B,YAAA,EAAc,cAAA;AAAA,EACd,sBAAA,EAAwB,gBAAA;AAAA,EACxB,QAAA,EAAU,WAAA;AAAA,EACV,WAAA,EAAa;AACd;AAwEO,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM,EAAE,MAAA;AACT,CAAC;AAEM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAClB,CAAC;AAEM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,IAAA,EAAM,EAAE,MAAA;AACT,CAAC;AAEM,IAAM,aAAA,GAAgB,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACzD,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACD,CAAC;AAEM,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACxC,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EAC9B,OAAO,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACnC,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACzC,kBAAkB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AACvC,CAAC;AAEM,IAAM,kBAAA,GAAqB,EAAE,IAAA,CAAK;AAAA,EACxC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAC;AAEM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC3C,IAAA,EAAM,kBAAA;AAAA,EACN,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,QAAA;AACtC,CAAC;AAEM,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACzC,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,OAAO,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACnC,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACzC,SAAA,EAAW,EAAE,MAAA;AACd,CAAC;AAEM,IAAM,aAAA,GAAgB,EAAE,MAAA,CAAO;AAAA,EACrC,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,MAAA,EAAQ,mBAAA;AAAA,EACR,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,gBAAgB,EAAE,QAAA,EAAS;AAAA,EAC5C,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA,EAAS;AAAA,EAC/C,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC;AAEM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC3C,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,aAAa,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EAC5C,cAAc,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EAC7C,qBAAqB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAClD,MAAM,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAC3B,CAAC;AAEM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC9C,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACjB,CAAC;AAEM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAClD,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAChC,iBAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACxC,iBAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAChC,CAAC;AAED,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EAC5C,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACzB,CAAC,CAAA;AAEM,IAAM,6BAAA,GAAgC,4BAA4B,MAAA,CAAO;AAAA,EAC/E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC;AACzC,CAAC;AAEM,IAAM,2BAAA,GAA8B,4BAA4B,MAAA,CAAO;AAAA,EAC7E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC;AAEM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC3C,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,QAAQ;AAC5B,CAAC;AAEM,IAAM,6BAAA,GAAgC,4BAA4B,MAAA,CAAO;AAAA,EAC/E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACxB,KAAA,EAAO,EAAE,MAAA,CAAO;AAAA,IACf,QAAA,EAAU,oBAAoB,QAAA,EAAS;AAAA,IACvC,QAAA,EAAU,oBAAoB,QAAA,EAAS;AAAA,IACvC,iBAAA,EAAmB,oBAAoB,QAAA,EAAS;AAAA,IAChD,iBAAA,EAAmB,oBAAoB,QAAA,EAAS;AAAA,IAChD,UAAA,EAAY,oBAAoB,QAAA;AAAS,GACzC;AACF,CAAC;AAEM,IAAM,2BAAA,GAA8B,4BAA4B,MAAA,CAAO;AAAA,EAC7E,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,eAAe,CAAA;AAAA,EAC/B,gBAAA,EAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACnC,CAAC;AAEM,IAAM,gCAAA,GAAmC,4BAA4B,MAAA,CAAO;AAAA,EAClF,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,WAAW;AAC5B,CAAC;AAEM,IAAM,uBAAA,GAA0B,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EACnE,6BAAA;AAAA,EACA,2BAAA;AAAA,EACA,6BAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACD,CAAC;AAEM,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA,EACnD,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC3B,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACxB,CAAC;AAEM,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAC1C,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,EACtB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACjC,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EACpB,QAAA,EAAU,uBAAuB,QAAA,EAAS;AAAA,EAC1C,YAAA,EAAc,2BAA2B,QAAA,EAAS;AAAA,EAClD,QAAQ,CAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EAC1C,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,uBAAuB,EAAE,QAAA,EAAS;AAAA,EAC5D,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAC1D,mBAAmB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAChD,oBAAoB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACjD,kBAAkB,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA,EAC5C,SAAA,EAAW,4BAA4B,QAAA,EAAS;AAAA,EAChD,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC;AAEM,IAAM,iCAAA,GAAoC,EAAE,MAAA,CAAO;AAAA,EACzD,qBAAqB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EAClD,aAAA,EAAe,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAChD,iBAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAChC,CAAC;AAEM,IAAM,0BAAA,GAA6B,EAAE,MAAA,CAAO;AAAA,EAClD,OAAA,EAAS,gBAAA;AAAA,EACT,aAAA,EAAe,kCAAkC,QAAA,EAAS;AAAA,EAC1D,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC;AAEM,IAAM,sBAAA,GAAyB,EAAE,MAAA,CAAO;AAAA,EAC9C,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,aAAA,EAAe,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA;AACxC,CAAC;AAEM,IAAM,yBAAA,GAA4B,EAAE,MAAA,CAAO;AAAA,EACjD,EAAA,EAAI,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACpB,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AACjC,CAAC;AAEM,IAAM,uBAAA,GAA0B,EAAE,MAAA,CAAO;AAAA,EAC/C,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EACxB,EAAA,EAAI,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,QAAO,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAAA,EACpC,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACxB,MAAA,EAAQ,EAAE,OAAA;AACX,CAAC;;;AC9fM,SAAS,gBAAgB,KAAA,EAA2C;AAC1E,EAAA,MAAM,IAAA,GAAqB;AAAA,IAC1B,EAAA,EAAI,MAAM,KAAA,CAAM,EAAA;AAAA,IAChB,IAAA,EAAM,MAAM,KAAA,CAAM,IAAA;AAAA,IAClB,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,eAAA,EAAiB,oBAAA;AAAA,IACjB,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,QAAQ,KAAA,CAAM;AAAA,GACf;AAEA,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,QAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,CAAK,YAAA,GAAe,KAAA,CAAM,YAAA;AAClD,EAAA,IAAI,KAAA,CAAM,eAAA,EAAiB,IAAA,CAAK,eAAA,GAAkB,KAAA,CAAM,eAAA;AACxD,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,QAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,iBAAA,EAAmB,IAAA,CAAK,iBAAA,GAAoB,KAAA,CAAM,iBAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,kBAAA,EAAoB,IAAA,CAAK,kBAAA,GAAqB,KAAA,CAAM,kBAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,gBAAA,EAAkB,IAAA,CAAK,gBAAA,GAAmB,KAAA,CAAM,gBAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,QAAA;AAE1C,EAAA,OAAO,IAAA;AACR;AASO,SAAS,kBAAkB,IAAA,EAAqC;AACtE,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,IAAI,CAAA;AAChD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACjF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,wBAAA;AAAA,QACN,OAAA,EAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACjD,OAAA,EAAS,EAAE,MAAA;AAAO;AACnB,KACD;AAAA,EACD;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAqB;AAC3D;AAsBA,eAAsB,cAAc,OAAA,EAA8D;AACjG,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,GAAY,OAAA,EAAS,OAAM,GAAI,OAAA;AAEzD,EAAA,IAAI;AAEH,IAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,sBAAqB,GAAI,IAAA;AAEzD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,oBAAoB,CAAC,CAAA;AAE7E,IAAA,MAAM,MACL,KAAA,IAAU,UAAA,GACP,MAAW,IAAA,CAAA,SAAA,CAAU,UAAA,EAAwB,SAAS,CAAA,GACtD,UAAA;AAEJ,IAAA,MAAM,GAAA,GAAM,SAAS,UAAA,EAAW;AAEhC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAS,IAAA,CAAA,WAAA,CAAY,OAAO,CAAA,CAC5C,kBAAA,CAAmB,EAAE,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,CAAA,CAC1C,KAAK,GAAgB,CAAA;AAEvB,IAAA,MAAM,UAAA,GAA2B;AAAA,MAChC,GAAG,IAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACV,SAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,KAAA,EAAO;AAAA;AACR,KACD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,EAC1C,SAAS,GAAA,EAAK;AACb,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,iBAAA;AAAA,QACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAC/C,KACD;AAAA,EACD;AACD;AAkBA,eAAsB,gBACrB,OAAA,EAC0D;AAC1D,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,OAAA;AAE5B,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACpB,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EAAS;AAAA;AACV,KACD;AAAA,EACD;AAEA,EAAA,IAAI;AACH,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,oBAAA,EAAqB,GAAI,IAAA;AAC/C,IAAA,MAAM,YAAY,SAAA,CAAU,SAAA;AAE5B,IAAA,MAAM,MACL,KAAA,IAAU,SAAA,GACP,MAAW,IAAA,CAAA,SAAA,CAAU,SAAA,EAAuB,SAAS,CAAA,GACrD,SAAA;AAEJ,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAW,IAAA,CAAA,aAAA,CAAc,SAAA,CAAU,WAAW,GAAgB,CAAA;AAElF,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY,CAAE,OAAO,OAAO,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACxC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,oBAAoB,CAAA;AAC1D,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAGtD,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,KAAM,IAAA,CAAK,UAAU,oBAAoB,CAAA;AAErF,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA;AAAK,KAC9B;AAAA,EACD,SAAS,GAAA,EAAK;AACb,IAAA,OAAO;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAC/C,KACD;AAAA,EACD;AACD;;;ACtLO,SAAS,gBAAgB,MAAA,EAAoC;AACnE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,IAAS,UAAA,CAAW,KAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAElC,EAAA,IAAI,UAAA;AAGJ,EAAA,SAAS,UAAA,GAAqB;AAC7B,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,EAAU;AACrC,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,UAAA,GAAa,MAAA,CAAO,KAAA;AAAA,EACrB;AAEA,EAAA,eAAe,cAAA,GAAkD;AAChE,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,EAAc,OAAO,EAAC;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,YAAA,EAAa;AACxC,IAAA,OAAO,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG;AAAA,EAC3C;AAEA,EAAA,eAAe,WAAA,CAAe,QAAgB,MAAA,EAAqC;AAClF,IAAA,MAAM,OAAA,GAAU,UAAA,EAAY,GAAA,IAAO,UAAA,EAAW;AAC9C,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AAEzC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE1D,IAAA,IAAI;AACH,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAA,EAAS;AAAA,QACvC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACR,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG;AAAA,SACJ;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,mBAAA;AAAA,UACT,IAAI,UAAA,EAAW;AAAA,UACf,MAAA;AAAA,UACA;AAAA,SACA,CAAA;AAAA,QACD,QAAQ,UAAA,CAAW;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,QAAA,OAAO;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACN,IAAA,EAAM,gBAAA;AAAA,YACN,SAAS,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA;AACzD,SACD;AAAA,MACD;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,MAAA,IAAI,KAAK,KAAA,EAAO;AACf,QAAA,OAAO;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACN,IAAA,EAAM,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,YAChC,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,YACpB,OAAA,EAAS,KAAK,KAAA,CAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,GAAI,KAAA;AAAA;AACxD,SACD;AAAA,MACD;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,KAAK,MAAA,EAAY;AAAA,IAChD,SAAS,GAAA,EAAK;AACb,MAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAC7D,QAAA,OAAO;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACN,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,2BAA2B,OAAO,CAAA,EAAA;AAAA;AAC5C,SACD;AAAA,MACD;AACA,MAAA,OAAO;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACN,IAAA,EAAM,oBAAA;AAAA,UACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAC/C,OACD;AAAA,IACD,CAAA,SAAE;AACD,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACnB;AAAA,EACD;AAEA,EAAA,eAAe,QAAA,GAA0C;AACxD,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,IAC1C;AAEA,IAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,EAAG,mBAAmB,CAAA,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AAEzC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE1D,IAAA,IAAI;AACH,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA,EAAK;AAAA,QACnC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,QAAQ,UAAA,CAAW;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,QAAA,OAAO;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACN,IAAA,EAAM,sBAAA;AAAA,YACN,OAAA,EAAS,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA;AAAA;AACnD,SACD;AAAA,MACD;AAEA,MAAA,MAAM,IAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,IAAI,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,QAAA,OAAO;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACN,IAAA,EAAM,wBAAA;AAAA,YACN,OAAA,EAAS,CAAA,oBAAA,EAAuB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AACrF,SACD;AAAA,MACD;AAEA,MAAA,UAAA,GAAa,MAAA,CAAO,IAAA;AACpB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,UAAA,EAAW;AAAA,IAC1C,SAAS,GAAA,EAAK;AACb,MAAA,OAAO;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACN,IAAA,EAAM,sBAAA;AAAA,UACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAC/C,OACD;AAAA,IACD,CAAA,SAAE;AACD,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACnB;AAAA,EACD;AAEA,EAAA,eAAe,YAAY,MAAA,EAAwD;AAClF,IAAA,OAAO,WAAA,CAAqB,WAAA,CAAY,YAAA,EAAc,MAAM,CAAA;AAAA,EAC7D;AAEA,EAAA,eAAe,QAAQ,MAAA,EAAoD;AAC1E,IAAA,OAAO,WAAA,CAAqB,WAAA,CAAY,QAAA,EAAU,MAAM,CAAA;AAAA,EACzD;AAEA,EAAA,eAAe,WAAW,MAAA,EAAuD;AAChF,IAAA,OAAO,WAAA,CAAqB,WAAA,CAAY,WAAA,EAAa,MAAM,CAAA;AAAA,EAC5D;AAEA,EAAA,gBAAgB,qBACf,MAAA,EACgC;AAChC,IAAA,MAAM,OAAA,GAAU,UAAA,EAAY,GAAA,IAAO,UAAA,EAAW;AAC9C,IAAA,MAAM,WAAA,GAAc,MAAM,cAAA,EAAe;AAEzC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,OAAA,EAAS;AAAA,MACvC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACR,cAAA,EAAgB,kBAAA;AAAA,QAChB,MAAA,EAAQ,mBAAA;AAAA,QACR,GAAG;AAAA,OACJ;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACpB,OAAA,EAAS,mBAAA;AAAA,QACT,IAAI,UAAA,EAAW;AAAA,QACf,QAAQ,WAAA,CAAY,sBAAA;AAAA,QACpB;AAAA,OACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,CAAC,SAAS,IAAA,EAAM;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI;AACH,MAAA,OAAO,IAAA,EAAM;AACZ,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,YAAA,IAAI,SAAS,QAAA,EAAU;AACvB,YAAA,IAAI;AACH,cAAA,MAAM,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,YACtB,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAA,SAAE;AACD,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACpB;AAAA,EACD;AAEA,EAAA,OAAO;AAAA,IACN,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD;AACD;;;ACjPA,SAAS,uBAAA,GAAwC;AAChD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AACvC,EAAA,OAAO;AAAA,IACN,MAAM,IAAI,MAAA,EAAgB;AACzB,MAAA,OAAO,KAAA,CAAM,IAAI,MAAM,CAAA;AAAA,IACxB,CAAA;AAAA,IACA,MAAM,GAAA,CAAI,MAAA,EAAgB,IAAA,EAAe;AACxC,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,MAAM,OAAO,MAAA,EAAgB;AAC5B,MAAA,OAAO,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,IAC3B;AAAA,GACD;AACD;AAIA,SAAS,YAAA,CAAa,IAA4B,KAAA,EAAkC;AACnF,EAAA,MAAM,IAAA,GAA2B;AAAA,IAChC,OAAA,EAAS,mBAAA;AAAA,IACT,IAAI,EAAA,IAAM,CAAA;AAAA,IACV;AAAA,GACD;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACzC,MAAA,EAAQ,GAAA;AAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GAC9C,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,IAAqB,MAAA,EAA2B;AACvE,EAAA,MAAM,IAAA,GAA2B;AAAA,IAChC,OAAA,EAAS,mBAAA;AAAA,IACT,EAAA;AAAA,IACA;AAAA,GACD;AACA,EAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AAAA,IACzC,MAAA,EAAQ,GAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,GAC9C,CAAA;AACF;AAiCO,SAAS,gBAAgB,MAAA,EAAoC;AACnE,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,uBAAA,EAAwB;AAE9D,EAAA,eAAe,MAAM,KAAA,EAAwD;AAC5E,IAAA,IAAI,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,OAAO,OAAA,CAAQ;AAAA,QACpB,GAAG,KAAA;AAAA,QACH,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OAClC,CAAA;AAAA,IACF;AAAA,EACD;AAEA,EAAA,eAAe,aACd,OAAA,EAC8D;AAC9D,IAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACzB,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACrC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AACjD,IAAA,IAAI,YAAY,IAAA,EAAM;AACrB,MAAA,OAAO;AAAA,QACN,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,aAAa,CAAA,EAAG;AAAA,UACtB,MAAM,eAAA,CAAgB,uBAAA;AAAA,UACtB,OAAA,EAAS;AAAA,SACT;AAAA,OACF;AAAA,IACD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAAA,EAC/B;AAEA,EAAA,eAAe,iBAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACoB;AACpB,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,SAAA,CAAU,MAAM,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,YAAA;AAAA,QACpB,OAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAChF,CAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACH,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,OAAO,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAE1F,MAAA,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AACjC,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,YAAA;AAAA,QACpB,OAAA;AAAA,QACA,QAAQ,IAAA,CAAK,EAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACT,CAAA;AAED,MAAA,OAAO,cAAA,CAAe,IAAI,IAAI,CAAA;AAAA,IAC/B,SAAS,GAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,YAAA;AAAA,QACpB,OAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB;AAAA,OACA,CAAA;AAAA,IACF;AAAA,EACD;AAEA,EAAA,eAAe,aAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACoB;AACpB,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,SAAA,CAAU,MAAM,CAAA;AACtD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,MAAM,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,KAAK,EAAE,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACV,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,QAAA;AAAA,QACpB,OAAA;AAAA,QACA,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,UAAA;AAAA,OAC/B,CAAA;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,aAAA,KAAkB,MAAA,IAAa,KAAK,OAAA,EAAS;AAC5D,MAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,aAAA;AACxB,MAAA,MAAA,GAAS;AAAA,QACR,GAAG,IAAA;AAAA,QACH,OAAA,EAAS,QAAQ,CAAA,GAAI,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAG;AAAA,OAClD;AAAA,IACD;AAEA,IAAA,MAAM,KAAA,CAAM;AAAA,MACX,QAAQ,WAAA,CAAY,QAAA;AAAA,MACpB,OAAA;AAAA,MACA,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACT,CAAA;AAED,IAAA,OAAO,cAAA,CAAe,IAAI,MAAM,CAAA;AAAA,EACjC;AAEA,EAAA,eAAe,gBAAA,CACd,EAAA,EACA,MAAA,EACA,OAAA,EACoB;AACpB,IAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,SAAA,CAAU,MAAM,CAAA;AACzD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAW,MAAM,SAAA,CAAU,GAAA,CAAI,MAAA,CAAO,KAAK,EAAE,CAAA;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,WAAA;AAAA,QACpB,OAAA;AAAA,QACA,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,UAAA;AAAA,OAC/B,CAAA;AAAA,IACF;AAGA,IAAA,IACC,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,WAAA,IACzB,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,QAAA,IACzB,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,UAAA,EACxB;AACD,MAAA,MAAM,KAAA,CAAM;AAAA,QACX,QAAQ,WAAA,CAAY,WAAA;AAAA,QACpB,OAAA;AAAA,QACA,QAAQ,QAAA,CAAS,EAAA;AAAA,QACjB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACP,CAAA;AACD,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,sBAAA;AAAA,QACtB,OAAA,EAAS,QAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,YAAA,EAAe,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,OAClE,CAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,QAAQ,QAAA,EAAU;AAC5B,MAAA,IAAI;AACH,QAAA,MAAMA,YAAW,MAAM,MAAA,CAAO,QAAQ,QAAA,CAAS,MAAA,CAAO,KAAK,EAAE,CAAA;AAC7D,QAAA,MAAM,SAAA,CAAU,GAAA,CAAIA,SAAAA,CAAS,EAAA,EAAIA,SAAQ,CAAA;AACzC,QAAA,MAAM,KAAA,CAAM;AAAA,UACX,QAAQ,WAAA,CAAY,WAAA;AAAA,UACpB,OAAA;AAAA,UACA,QAAQA,SAAAA,CAAS,EAAA;AAAA,UACjB,OAAA,EAAS;AAAA,SACT,CAAA;AACD,QAAA,OAAO,cAAA,CAAe,IAAIA,SAAQ,CAAA;AAAA,MACnC,SAAS,GAAA,EAAK;AACb,QAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACrD,QAAA,MAAM,KAAA,CAAM;AAAA,UACX,QAAQ,WAAA,CAAY,WAAA;AAAA,UACpB,OAAA;AAAA,UACA,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACP,CAAA;AACD,QAAA,OAAO,aAAa,EAAA,EAAI;AAAA,UACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,UACtB;AAAA,SACA,CAAA;AAAA,MACF;AAAA,IACD;AAGA,IAAA,MAAM,QAAA,GAAoB;AAAA,MACzB,GAAG,QAAA;AAAA,MACH,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,SAAS,oBAAA,EAAqB;AAAA,MAC1D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC;AACA,IAAA,MAAM,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AACzC,IAAA,MAAM,KAAA,CAAM;AAAA,MACX,QAAQ,WAAA,CAAY,WAAA;AAAA,MACpB,OAAA;AAAA,MACA,QAAQ,QAAA,CAAS,EAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACT,CAAA;AACD,IAAA,OAAO,cAAA,CAAe,IAAI,QAAQ,CAAA;AAAA,EACnC;AAEA,EAAA,SAAS,sBAAA,CACR,EAAA,EACA,MAAA,EACA,OAAA,EACW;AACX,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AACpC,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,gBAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,SAAA,CAAU,MAAM,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACpB,MAAA,OAAO,aAAa,EAAA,EAAI;AAAA,QACvB,MAAM,eAAA,CAAgB,cAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,eAAA,CAAgB,OAAO,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAE5F,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,MACnC,MAAM,MAAM,UAAA,EAAY;AACvB,QAAA,IAAI;AACH,UAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AACjC,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,YAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,EAAS,IAAI;;AAAA,CAAM,CAAC,CAAA;AAAA,UACvD;AACA,UAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAC,CAAA;AACrD,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QAClB,SAAS,GAAA,EAAK;AACb,UAAA,MAAM,SAAA,GAAY,KAAK,SAAA,CAAU;AAAA,YAChC,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACN,MAAM,eAAA,CAAgB,cAAA;AAAA,cACtB,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA;AAC/C,WACA,CAAA;AACD,UAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,EAAS,SAAS;;AAAA,CAAM,CAAC,CAAA;AAC3D,UAAA,UAAA,CAAW,KAAA,EAAM;AAAA,QAClB;AAEA,QAAA,KAAK,KAAA,CAAM;AAAA,UACV,QAAQ,WAAA,CAAY,sBAAA;AAAA,UACpB,OAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACT,CAAA;AAAA,MACF;AAAA,KACA,CAAA;AAED,IAAA,OAAO,IAAI,SAAS,QAAA,EAAU;AAAA,MAC7B,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACR,cAAA,EAAgB,mBAAA;AAAA,QAChB,eAAA,EAAiB,UAAA;AAAA,QACjB,UAAA,EAAY;AAAA;AACb,KACA,CAAA;AAAA,EACF;AAEA,EAAA,eAAe,cAAc,OAAA,EAAqC;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAG/B,IAAA,IAAI,QAAQ,MAAA,KAAW,KAAA,IAAS,IAAI,QAAA,CAAS,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAC3E,MAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA,EAAG;AAAA,QACrD,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC9C,CAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC9B,MAAA,OAAO,IAAI,QAAA,CAAS,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC1D;AAGA,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,OAAO,CAAA;AACvC,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAC5B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAGrB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACH,MAAA,IAAA,GAAO,MAAM,QAAQ,IAAA,EAAK;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,aAAa,IAAA,EAAM;AAAA,QACzB,MAAM,eAAA,CAAgB,WAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,SAAA,CAAU,IAAI,CAAA;AACvD,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACtB,MAAA,OAAO,aAAa,IAAA,EAAM;AAAA,QACzB,MAAM,eAAA,CAAgB,eAAA;AAAA,QACtB,OAAA,EAAS;AAAA,OACT,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,MAAA,KAAW,QAAA,CAAS,IAAA;AAE/C,IAAA,QAAQ,MAAA;AAAQ,MACf,KAAK,WAAA,CAAY,YAAA;AAChB,QAAA,OAAO,iBAAA,CAAkB,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAEhD,KAAK,WAAA,CAAY,QAAA;AAChB,QAAA,OAAO,aAAA,CAAc,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAE5C,KAAK,WAAA,CAAY,WAAA;AAChB,QAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAE/C,KAAK,WAAA,CAAY,sBAAA;AAChB,QAAA,OAAO,sBAAA,CAAuB,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,MAErD;AACC,QAAA,MAAM,KAAA,CAAM;AAAA,UACX,MAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACP,CAAA;AACD,QAAA,OAAO,aAAa,KAAA,EAAO;AAAA,UAC1B,MAAM,eAAA,CAAgB,gBAAA;AAAA,UACtB,OAAA,EAAS,mBAAmB,MAAM,CAAA;AAAA,SAClC,CAAA;AAAA;AACH,EACD;AAEA,EAAA,OAAO,EAAE,eAAe,SAAA,EAAU;AACnC","file":"index.js","sourcesContent":["/**\n * Web Crypto API utilities for TheAuth.\n *\n * This module uses ONLY the Web Crypto API (globalThis.crypto) which is\n * available natively in Cloudflare Workers, Deno, Bun, and Node 20+.\n * No `node:crypto` imports are used, making the core package edge-compatible.\n */\n\n// ---------------------------------------------------------------------------\n// Encoding helpers\n// ---------------------------------------------------------------------------\n\nconst HEX_CHARS = \"0123456789abcdef\";\n\n/** Encode a Uint8Array as a lowercase hex string. */\nexport function toHex(bytes: Uint8Array): string {\n\tlet hex = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst b = bytes[i] as number;\n\t\thex += HEX_CHARS[b >> 4] as string;\n\t\thex += HEX_CHARS[b & 0x0f] as string;\n\t}\n\treturn hex;\n}\n\n/** Decode a hex string into a Uint8Array. */\nexport function fromHex(hex: string): Uint8Array {\n\tif (hex.length % 2 !== 0) {\n\t\tthrow new Error(\"fromHex: hex string must have even length\");\n\t}\n\tconst bytes = new Uint8Array(hex.length / 2);\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tconst hi = parseInt(hex[i * 2] as string, 16);\n\t\tconst lo = parseInt(hex[i * 2 + 1] as string, 16);\n\t\tif (Number.isNaN(hi) || Number.isNaN(lo)) {\n\t\t\tthrow new Error(`fromHex: invalid hex character at position ${i * 2}`);\n\t\t}\n\t\tbytes[i] = (hi << 4) | lo;\n\t}\n\treturn bytes;\n}\n\n/** Encode a Uint8Array as a base64url string (no padding). */\nexport function toBase64Url(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbinary += String.fromCharCode(bytes[i] as number);\n\t}\n\treturn btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\n/** Decode a base64url string into a Uint8Array. */\nexport function fromBase64Url(b64: string): Uint8Array {\n\t// Restore standard base64\n\tlet base64 = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t// Add padding\n\twhile (base64.length % 4 !== 0) {\n\t\tbase64 += \"=\";\n\t}\n\tconst binary = atob(base64);\n\tconst bytes = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\n// ---------------------------------------------------------------------------\n// Random generation\n// ---------------------------------------------------------------------------\n\n/** Generate a v4 UUID using the globally available crypto.randomUUID(). */\nexport function generateId(): string {\n\treturn globalThis.crypto.randomUUID();\n}\n\n/** Generate cryptographically secure random bytes as a Uint8Array. */\nexport function randomBytes(length: number): Uint8Array {\n\tconst bytes = new Uint8Array(length);\n\tglobalThis.crypto.getRandomValues(bytes);\n\treturn bytes;\n}\n\n/** Generate cryptographically secure random bytes as a hex string. */\nexport function randomBytesHex(length: number): string {\n\treturn toHex(randomBytes(length));\n}\n\n// ---------------------------------------------------------------------------\n// Text encoding helper (internal)\n// ---------------------------------------------------------------------------\n\nconst TEXT_ENCODER = new TextEncoder();\n\nfunction toBytes(data: string | Uint8Array): ArrayBuffer {\n\tif (typeof data === \"string\") {\n\t\tconst encoded = TEXT_ENCODER.encode(data);\n\t\treturn (encoded.buffer as ArrayBuffer).slice(\n\t\t\tencoded.byteOffset,\n\t\t\tencoded.byteOffset + encoded.byteLength,\n\t\t);\n\t}\n\treturn (data.buffer as ArrayBuffer).slice(data.byteOffset, data.byteOffset + data.byteLength);\n}\n\n// ---------------------------------------------------------------------------\n// Hashing\n// ---------------------------------------------------------------------------\n\n/** SHA-256 hash, returns hex string. */\nexport async function sha256(data: string | Uint8Array): Promise<string> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-256\", toBytes(data));\n\treturn toHex(new Uint8Array(digest));\n}\n\n/** SHA-256 hash, returns Uint8Array. */\nexport async function sha256Raw(data: string | Uint8Array): Promise<Uint8Array> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-256\", toBytes(data));\n\treturn new Uint8Array(digest);\n}\n\n/** SHA-1 hash, returns hex string. Needed for HIBP k-anonymity. */\nexport async function sha1(data: string | Uint8Array): Promise<string> {\n\tconst digest = await globalThis.crypto.subtle.digest(\"SHA-1\", toBytes(data));\n\treturn toHex(new Uint8Array(digest));\n}\n\n// ---------------------------------------------------------------------------\n// HMAC\n// ---------------------------------------------------------------------------\n\n/** Import a secret key for HMAC operations. */\nexport async function importHmacKey(\n\tkey: string | Uint8Array,\n\thash: \"SHA-256\" | \"SHA-1\" = \"SHA-256\",\n): Promise<CryptoKey> {\n\tconst keyData = typeof key === \"string\" ? TEXT_ENCODER.encode(key) : key;\n\treturn globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\t(keyData.buffer as ArrayBuffer).slice(\n\t\t\tkeyData.byteOffset,\n\t\t\tkeyData.byteOffset + keyData.byteLength,\n\t\t),\n\t\t{ name: \"HMAC\", hash: { name: hash } },\n\t\tfalse,\n\t\t[\"sign\", \"verify\"],\n\t);\n}\n\n/** HMAC-SHA256 sign, returns hex string. */\nexport async function hmacSha256(\n\tkey: string | Uint8Array,\n\tdata: string | Uint8Array,\n): Promise<string> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-256\");\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, toBytes(data));\n\treturn toHex(new Uint8Array(signature));\n}\n\n/** HMAC-SHA256 sign, returns Uint8Array. */\nexport async function hmacSha256Raw(\n\tkey: string | Uint8Array,\n\tdata: string | Uint8Array,\n): Promise<Uint8Array> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-256\");\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, toBytes(data));\n\treturn new Uint8Array(signature);\n}\n\n/** HMAC-SHA1 sign, returns Uint8Array (needed for TOTP per RFC 6238). */\nexport async function hmacSha1Raw(key: Uint8Array, data: Uint8Array): Promise<Uint8Array> {\n\tconst cryptoKey = await importHmacKey(key, \"SHA-1\");\n\tconst buf = (data.buffer as ArrayBuffer).slice(\n\t\tdata.byteOffset,\n\t\tdata.byteOffset + data.byteLength,\n\t);\n\tconst signature = await globalThis.crypto.subtle.sign(\"HMAC\", cryptoKey, buf);\n\treturn new Uint8Array(signature);\n}\n\n// ---------------------------------------------------------------------------\n// PBKDF2 password hashing\n// ---------------------------------------------------------------------------\n\nconst PBKDF2_ITERATIONS = 100_000; // CF Workers caps at 100K; OWASP recommends 600K for Node.js\nconst PBKDF2_KEY_LENGTH = 64; // bytes\nconst PBKDF2_SALT_LENGTH = 32; // bytes\n\n/**\n * Hash a password using PBKDF2-SHA256.\n *\n * Returns a string in the format: `pbkdf2:iterations:salt_hex:hash_hex`\n * which is safe to store in the database.\n */\nexport async function pbkdf2Hash(\n\tpassword: string,\n\tsalt?: Uint8Array,\n\titerations?: number,\n): Promise<string> {\n\tconst actualSalt = salt ?? randomBytes(PBKDF2_SALT_LENGTH);\n\tconst actualIterations = iterations ?? PBKDF2_ITERATIONS;\n\n\tconst keyMaterial = await globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tTEXT_ENCODER.encode(password),\n\t\t\"PBKDF2\",\n\t\tfalse,\n\t\t[\"deriveBits\"],\n\t);\n\n\tconst saltBuf = (actualSalt.buffer as ArrayBuffer).slice(\n\t\tactualSalt.byteOffset,\n\t\tactualSalt.byteOffset + actualSalt.byteLength,\n\t);\n\tconst derived = await globalThis.crypto.subtle.deriveBits(\n\t\t{\n\t\t\tname: \"PBKDF2\",\n\t\t\tsalt: saltBuf,\n\t\t\titerations: actualIterations,\n\t\t\thash: \"SHA-256\",\n\t\t},\n\t\tkeyMaterial,\n\t\tPBKDF2_KEY_LENGTH * 8,\n\t);\n\n\treturn `pbkdf2:${actualIterations}:${toHex(actualSalt)}:${toHex(new Uint8Array(derived))}`;\n}\n\n/**\n * Verify a password against a stored PBKDF2 hash.\n *\n * Supports the `pbkdf2:iterations:salt:hash` format produced by `pbkdf2Hash`.\n */\nexport async function pbkdf2Verify(password: string, stored: string): Promise<boolean> {\n\tconst parts = stored.split(\":\");\n\tif (parts.length !== 4 || parts[0] !== \"pbkdf2\") {\n\t\treturn false;\n\t}\n\n\tconst iterations = parseInt(parts[1] as string, 10);\n\tconst salt = fromHex(parts[2] as string);\n\tconst storedHash = fromHex(parts[3] as string);\n\n\tif (Number.isNaN(iterations)) return false;\n\n\tconst keyMaterial = await globalThis.crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tTEXT_ENCODER.encode(password),\n\t\t\"PBKDF2\",\n\t\tfalse,\n\t\t[\"deriveBits\"],\n\t);\n\n\tconst saltBuf = (salt.buffer as ArrayBuffer).slice(\n\t\tsalt.byteOffset,\n\t\tsalt.byteOffset + salt.byteLength,\n\t);\n\tconst derived = await globalThis.crypto.subtle.deriveBits(\n\t\t{\n\t\t\tname: \"PBKDF2\",\n\t\t\tsalt: saltBuf,\n\t\t\titerations,\n\t\t\thash: \"SHA-256\",\n\t\t},\n\t\tkeyMaterial,\n\t\tstoredHash.length * 8,\n\t);\n\n\treturn constantTimeEqual(new Uint8Array(derived), storedHash);\n}\n\n// ---------------------------------------------------------------------------\n// Constant-time comparison\n// ---------------------------------------------------------------------------\n\n/**\n * Constant-time comparison of two Uint8Arrays.\n * Returns false immediately if lengths differ (length is not secret).\n */\nexport function constantTimeEqual(a: Uint8Array, b: Uint8Array): boolean {\n\tif (a.byteLength !== b.byteLength) {\n\t\treturn false;\n\t}\n\tlet diff = 0;\n\tfor (let i = 0; i < a.byteLength; i++) {\n\t\tdiff |= (a[i] as number) ^ (b[i] as number);\n\t}\n\treturn diff === 0;\n}\n","/**\n * A2A (Agent-to-Agent) protocol types for TheAuth.\n *\n * Implements the Google Agent2Agent protocol specification for\n * agent interoperability. Covers Agent Cards, JSON-RPC methods,\n * task lifecycle, message/artifact types, and authentication schemes.\n *\n * @see https://a2a-protocol.org/latest/specification/\n */\n\nimport { z } from \"zod\";\nimport type { AuthError, Result, TheAuthError } from \"../mcp/types.js\";\n\nexport type { AuthError, Result, TheAuthError };\n\n// ─── Protocol Constants ─────────────────────────────────────────────────────\n\nexport const A2A_PROTOCOL_VERSION = \"0.3\";\nexport const A2A_JSONRPC_VERSION = \"2.0\";\nexport const A2A_WELL_KNOWN_PATH = \"/.well-known/agent.json\";\n\n// ─── Roles & States ─────────────────────────────────────────────────────────\n\nexport type A2ARole = \"user\" | \"agent\";\n\nexport type A2ATaskState =\n\t| \"submitted\"\n\t| \"working\"\n\t| \"input-required\"\n\t| \"completed\"\n\t| \"failed\"\n\t| \"canceled\"\n\t| \"auth-required\"\n\t| \"rejected\";\n\n// ─── Parts (content atoms inside messages/artifacts) ─────────────────────────\n\nexport interface A2ATextPart {\n\ttype: \"text\";\n\ttext: string;\n}\n\nexport interface A2AFilePart {\n\ttype: \"file\";\n\tfileUri: string;\n\tmimeType: string;\n\tname?: string;\n}\n\nexport interface A2ADataPart {\n\ttype: \"data\";\n\tmimeType: string;\n\tdata: string; // base64-encoded\n}\n\nexport type A2APart = A2ATextPart | A2AFilePart | A2ADataPart;\n\n// ─── Message ─────────────────────────────────────────────────────────────────\n\nexport interface A2AMessage {\n\tid: string;\n\trole: A2ARole;\n\tparts: A2APart[];\n\tcreatedAt: string;\n\tmetadata?: Record<string, unknown>;\n\treferenceTaskIds?: string[];\n}\n\n// ─── Artifact ────────────────────────────────────────────────────────────────\n\nexport interface A2AArtifact {\n\tid: string;\n\tname?: string;\n\tmimeType?: string;\n\tparts: A2APart[];\n\tmetadata?: Record<string, unknown>;\n\tcreatedAt: string;\n}\n\n// ─── Task Status ─────────────────────────────────────────────────────────────\n\nexport interface A2ATaskStatus {\n\tcode: A2ATaskState;\n\tmessage?: string;\n\tprogress?: number; // 0–100\n}\n\n// ─── Task ────────────────────────────────────────────────────────────────────\n\nexport interface A2ATask {\n\tid: string;\n\tcontextId: string;\n\tstatus: A2ATaskStatus;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\thistory?: A2AMessage[];\n\tartifacts?: A2AArtifact[];\n\tmetadata?: Record<string, unknown>;\n}\n\n// ─── Streaming Events ────────────────────────────────────────────────────────\n\nexport interface A2ATaskStatusUpdateEvent {\n\ttaskId: string;\n\tcontextId: string;\n\tnewState: A2ATaskState;\n\tnewStatus: A2ATaskStatus;\n\ttimestamp: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ATaskArtifactUpdateEvent {\n\ttaskId: string;\n\tcontextId: string;\n\tartifactId: string;\n\tartifact: A2AArtifact;\n\ttimestamp: string;\n}\n\nexport type A2AStreamEvent =\n\t| { type: \"task\"; task: A2ATask }\n\t| { type: \"message\"; message: A2AMessage }\n\t| { type: \"statusUpdate\"; event: A2ATaskStatusUpdateEvent }\n\t| { type: \"artifactUpdate\"; event: A2ATaskArtifactUpdateEvent };\n\n// ─── Security Schemes (OpenAPI-style, per A2A spec) ──────────────────────────\n\nexport interface A2AApiKeySecurityScheme {\n\ttype: \"apiKey\";\n\tname: string;\n\tin: \"query\" | \"header\" | \"cookie\";\n\tdescription?: string;\n}\n\nexport interface A2AHttpSecurityScheme {\n\ttype: \"http\";\n\tscheme: string;\n\tbearerFormat?: string;\n\tdescription?: string;\n}\n\nexport interface A2AOAuth2Flow {\n\tauthorizationUrl?: string;\n\ttokenUrl?: string;\n\trefreshUrl?: string;\n\tscopes: Record<string, string>;\n}\n\nexport interface A2AOAuth2SecurityScheme {\n\ttype: \"oauth2\";\n\tflows: {\n\t\timplicit?: A2AOAuth2Flow;\n\t\tpassword?: A2AOAuth2Flow;\n\t\tclientCredentials?: A2AOAuth2Flow;\n\t\tauthorizationCode?: A2AOAuth2Flow;\n\t\tdeviceCode?: A2AOAuth2Flow;\n\t};\n\tdescription?: string;\n}\n\nexport interface A2AOidcSecurityScheme {\n\ttype: \"openIdConnect\";\n\topenIdConnectUrl: string;\n\tdescription?: string;\n}\n\nexport interface A2AMutualTlsSecurityScheme {\n\ttype: \"mutualTls\";\n\tdescription?: string;\n}\n\nexport type A2ASecurityScheme =\n\t| A2AApiKeySecurityScheme\n\t| A2AHttpSecurityScheme\n\t| A2AOAuth2SecurityScheme\n\t| A2AOidcSecurityScheme\n\t| A2AMutualTlsSecurityScheme;\n\n// ─── Agent Card ──────────────────────────────────────────────────────────────\n\nexport interface A2AAgentProvider {\n\tname: string;\n\temail?: string;\n\turl?: string;\n}\n\nexport interface A2AAgentSkill {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tinputSchema?: Record<string, unknown>;\n\toutputSchema?: Record<string, unknown>;\n\tsupportedMediaTypes?: string[];\n\ttags?: string[];\n}\n\nexport interface A2AAgentCapabilities {\n\tstreaming?: boolean;\n\tpushNotifications?: boolean;\n\textendedAgentCard?: boolean;\n}\n\nexport interface A2AAgentCardSignature {\n\talgorithm: string;\n\tsignature: string;\n\tkeyId: string;\n}\n\nexport interface A2AAgentCard {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tversion: string;\n\tprotocolVersion: string;\n\turl: string;\n\tprovider?: A2AAgentProvider;\n\tcapabilities?: A2AAgentCapabilities;\n\tskills: A2AAgentSkill[];\n\tsecuritySchemes?: Record<string, A2ASecurityScheme>;\n\tsecurity?: Array<Record<string, string[]>>;\n\tdefaultInputModes?: string[];\n\tdefaultOutputModes?: string[];\n\tdocumentationUrl?: string;\n\tsignature?: A2AAgentCardSignature;\n\tmetadata?: Record<string, unknown>;\n}\n\n// ─── JSON-RPC Envelope ───────────────────────────────────────────────────────\n\nexport interface A2AJsonRpcRequest<P = unknown> {\n\tjsonrpc: \"2.0\";\n\tid: string | number;\n\tmethod: string;\n\tparams: P;\n}\n\nexport interface A2AJsonRpcResponse<R = unknown> {\n\tjsonrpc: \"2.0\";\n\tid: string | number;\n\tresult?: R;\n\terror?: A2AJsonRpcError;\n}\n\nexport interface A2AJsonRpcError {\n\tcode: number;\n\tmessage: string;\n\tdata?: unknown;\n}\n\n// ─── JSON-RPC Standard Error Codes ───────────────────────────────────────────\n\nexport const A2A_ERROR_CODES = {\n\tPARSE_ERROR: -32700,\n\tINVALID_REQUEST: -32600,\n\tMETHOD_NOT_FOUND: -32601,\n\tINVALID_PARAMS: -32602,\n\tINTERNAL_ERROR: -32603,\n\t// A2A-specific codes (application-defined range)\n\tTASK_NOT_FOUND: -32001,\n\tAGENT_NOT_FOUND: -32002,\n\tAUTHENTICATION_REQUIRED: -32003,\n\tPERMISSION_DENIED: -32004,\n\tRATE_LIMITED: -32005,\n\tTASK_ALREADY_COMPLETED: -32006,\n} as const;\n\n// ─── JSON-RPC Method Params ──────────────────────────────────────────────────\n\nexport interface A2ASendMessageParams {\n\tmessage: A2AMessage;\n\tconfiguration?: A2ASendMessageConfiguration;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ASendMessageConfiguration {\n\tacceptedOutputModes?: string[];\n\thistoryLength?: number;\n\treturnImmediately?: boolean;\n}\n\nexport interface A2AGetTaskParams {\n\tid: string;\n\thistoryLength?: number;\n}\n\nexport interface A2ACancelTaskParams {\n\tid: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface A2ASubscribeToTaskParams {\n\tid: string;\n}\n\n// ─── JSON-RPC Method Names ───────────────────────────────────────────────────\n\nexport const A2A_METHODS = {\n\tSEND_MESSAGE: \"message/send\",\n\tSEND_STREAMING_MESSAGE: \"message/stream\",\n\tGET_TASK: \"tasks/get\",\n\tCANCEL_TASK: \"tasks/cancel\",\n} as const;\n\n// ─── A2A Server Config ───────────────────────────────────────────────────────\n\nexport interface A2ATaskHandler {\n\t/** Handle an incoming message and produce a task result */\n\tonMessage: (message: A2AMessage, config?: A2ASendMessageConfiguration) => Promise<A2ATask>;\n\t/** Handle task cancellation */\n\tonCancel?: (taskId: string) => Promise<A2ATask>;\n\t/** Handle streaming message — yields events instead of returning a task */\n\tonMessageStream?: (\n\t\tmessage: A2AMessage,\n\t\tconfig?: A2ASendMessageConfiguration,\n\t) => AsyncIterable<A2AStreamEvent>;\n}\n\nexport interface A2AServerConfig {\n\t/** Agent card for this server */\n\tagentCard: A2AAgentCard;\n\t/** Handler for incoming tasks */\n\thandler: A2ATaskHandler;\n\t/** Validate an incoming auth token. Return the agent ID or null if invalid. */\n\tauthenticate?: (request: Request) => Promise<string | null>;\n\t/** Called after each A2A interaction for audit logging */\n\tonAudit?: (event: A2AAuditEvent) => Promise<void>;\n\t/** In-memory or external task store. Defaults to in-memory Map. */\n\ttaskStore?: A2ATaskStore;\n}\n\nexport interface A2ATaskStore {\n\tget: (taskId: string) => Promise<A2ATask | undefined>;\n\tset: (taskId: string, task: A2ATask) => Promise<void>;\n\tdelete: (taskId: string) => Promise<boolean>;\n}\n\nexport interface A2AAuditEvent {\n\tmethod: string;\n\tagentId: string | null;\n\ttaskId?: string;\n\ttimestamp: string;\n\tsuccess: boolean;\n\terror?: string;\n}\n\n// ─── A2A Client Config ───────────────────────────────────────────────────────\n\nexport interface A2AClientConfig {\n\t/** Base URL of the remote A2A agent, or a discovered Agent Card */\n\tagent: string | A2AAgentCard;\n\t/** Auth token or function that returns a token */\n\tgetAuthToken?: () => Promise<string> | string;\n\t/** Custom fetch implementation (for testing or proxying) */\n\tfetch?: typeof globalThis.fetch;\n\t/** Request timeout in milliseconds. Default: 30_000. */\n\ttimeout?: number;\n}\n\nexport interface A2AClient {\n\t/** Discover the remote agent's card from /.well-known/agent.json */\n\tdiscover: () => Promise<Result<A2AAgentCard>>;\n\t/** Send a message and get a task back */\n\tsendMessage: (params: A2ASendMessageParams) => Promise<Result<A2ATask>>;\n\t/** Get an existing task by ID */\n\tgetTask: (params: A2AGetTaskParams) => Promise<Result<A2ATask>>;\n\t/** Cancel a running task */\n\tcancelTask: (params: A2ACancelTaskParams) => Promise<Result<A2ATask>>;\n\t/** Send a streaming message and receive SSE events */\n\tsendStreamingMessage: (params: A2ASendMessageParams) => AsyncIterable<A2AStreamEvent>;\n}\n\n// ─── Zod Schemas ─────────────────────────────────────────────────────────────\n\nexport const A2ATextPartSchema = z.object({\n\ttype: z.literal(\"text\"),\n\ttext: z.string(),\n});\n\nexport const A2AFilePartSchema = z.object({\n\ttype: z.literal(\"file\"),\n\tfileUri: z.string(),\n\tmimeType: z.string(),\n\tname: z.string().optional(),\n});\n\nexport const A2ADataPartSchema = z.object({\n\ttype: z.literal(\"data\"),\n\tmimeType: z.string(),\n\tdata: z.string(),\n});\n\nexport const A2APartSchema = z.discriminatedUnion(\"type\", [\n\tA2ATextPartSchema,\n\tA2AFilePartSchema,\n\tA2ADataPartSchema,\n]);\n\nexport const A2AMessageSchema = z.object({\n\tid: z.string().min(1),\n\trole: z.enum([\"user\", \"agent\"]),\n\tparts: z.array(A2APartSchema).min(1),\n\tcreatedAt: z.string(),\n\tmetadata: z.record(z.unknown()).optional(),\n\treferenceTaskIds: z.array(z.string()).optional(),\n});\n\nexport const A2ATaskStateSchema = z.enum([\n\t\"submitted\",\n\t\"working\",\n\t\"input-required\",\n\t\"completed\",\n\t\"failed\",\n\t\"canceled\",\n\t\"auth-required\",\n\t\"rejected\",\n]);\n\nexport const A2ATaskStatusSchema = z.object({\n\tcode: A2ATaskStateSchema,\n\tmessage: z.string().optional(),\n\tprogress: z.number().min(0).max(100).optional(),\n});\n\nexport const A2AArtifactSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().optional(),\n\tmimeType: z.string().optional(),\n\tparts: z.array(A2APartSchema).min(1),\n\tmetadata: z.record(z.unknown()).optional(),\n\tcreatedAt: z.string(),\n});\n\nexport const A2ATaskSchema = z.object({\n\tid: z.string().min(1),\n\tcontextId: z.string().min(1),\n\tstatus: A2ATaskStatusSchema,\n\tcreatedAt: z.string(),\n\tupdatedAt: z.string(),\n\thistory: z.array(A2AMessageSchema).optional(),\n\tartifacts: z.array(A2AArtifactSchema).optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AAgentSkillSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tinputSchema: z.record(z.unknown()).optional(),\n\toutputSchema: z.record(z.unknown()).optional(),\n\tsupportedMediaTypes: z.array(z.string()).optional(),\n\ttags: z.array(z.string()).optional(),\n});\n\nexport const A2AAgentProviderSchema = z.object({\n\tname: z.string().min(1),\n\temail: z.string().optional(),\n\turl: z.string().optional(),\n});\n\nexport const A2AAgentCapabilitiesSchema = z.object({\n\tstreaming: z.boolean().optional(),\n\tpushNotifications: z.boolean().optional(),\n\textendedAgentCard: z.boolean().optional(),\n});\n\nconst A2ASecuritySchemeBaseSchema = z.object({\n\tdescription: z.string().optional(),\n});\n\nexport const A2AApiKeySecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"apiKey\"),\n\tname: z.string().min(1),\n\tin: z.enum([\"query\", \"header\", \"cookie\"]),\n});\n\nexport const A2AHttpSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"http\"),\n\tscheme: z.string().min(1),\n\tbearerFormat: z.string().optional(),\n});\n\nexport const A2AOAuth2FlowSchema = z.object({\n\tauthorizationUrl: z.string().optional(),\n\ttokenUrl: z.string().optional(),\n\trefreshUrl: z.string().optional(),\n\tscopes: z.record(z.string()),\n});\n\nexport const A2AOAuth2SecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"oauth2\"),\n\tflows: z.object({\n\t\timplicit: A2AOAuth2FlowSchema.optional(),\n\t\tpassword: A2AOAuth2FlowSchema.optional(),\n\t\tclientCredentials: A2AOAuth2FlowSchema.optional(),\n\t\tauthorizationCode: A2AOAuth2FlowSchema.optional(),\n\t\tdeviceCode: A2AOAuth2FlowSchema.optional(),\n\t}),\n});\n\nexport const A2AOidcSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"openIdConnect\"),\n\topenIdConnectUrl: z.string().min(1),\n});\n\nexport const A2AMutualTlsSecuritySchemeSchema = A2ASecuritySchemeBaseSchema.extend({\n\ttype: z.literal(\"mutualTls\"),\n});\n\nexport const A2ASecuritySchemeSchema = z.discriminatedUnion(\"type\", [\n\tA2AApiKeySecuritySchemeSchema,\n\tA2AHttpSecuritySchemeSchema,\n\tA2AOAuth2SecuritySchemeSchema,\n\tA2AOidcSecuritySchemeSchema,\n\tA2AMutualTlsSecuritySchemeSchema,\n]);\n\nexport const A2AAgentCardSignatureSchema = z.object({\n\talgorithm: z.string().min(1),\n\tsignature: z.string().min(1),\n\tkeyId: z.string().min(1),\n});\n\nexport const A2AAgentCardSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().min(1),\n\tdescription: z.string(),\n\tversion: z.string().min(1),\n\tprotocolVersion: z.string().min(1),\n\turl: z.string().url(),\n\tprovider: A2AAgentProviderSchema.optional(),\n\tcapabilities: A2AAgentCapabilitiesSchema.optional(),\n\tskills: z.array(A2AAgentSkillSchema).min(1),\n\tsecuritySchemes: z.record(A2ASecuritySchemeSchema).optional(),\n\tsecurity: z.array(z.record(z.array(z.string()))).optional(),\n\tdefaultInputModes: z.array(z.string()).optional(),\n\tdefaultOutputModes: z.array(z.string()).optional(),\n\tdocumentationUrl: z.string().url().optional(),\n\tsignature: A2AAgentCardSignatureSchema.optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2ASendMessageConfigurationSchema = z.object({\n\tacceptedOutputModes: z.array(z.string()).optional(),\n\thistoryLength: z.number().int().min(0).optional(),\n\treturnImmediately: z.boolean().optional(),\n});\n\nexport const A2ASendMessageParamsSchema = z.object({\n\tmessage: A2AMessageSchema,\n\tconfiguration: A2ASendMessageConfigurationSchema.optional(),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AGetTaskParamsSchema = z.object({\n\tid: z.string().min(1),\n\thistoryLength: z.number().int().min(0).optional(),\n});\n\nexport const A2ACancelTaskParamsSchema = z.object({\n\tid: z.string().min(1),\n\tmetadata: z.record(z.unknown()).optional(),\n});\n\nexport const A2AJsonRpcRequestSchema = z.object({\n\tjsonrpc: z.literal(\"2.0\"),\n\tid: z.union([z.string(), z.number()]),\n\tmethod: z.string().min(1),\n\tparams: z.unknown(),\n});\n","/**\n * A2A Agent Card management.\n *\n * Creates, validates, signs, and verifies Agent Cards that describe\n * an agent's identity, capabilities, skills, and auth requirements\n * using the A2A protocol format.\n */\n\nimport * as jose from \"jose\";\nimport { generateId } from \"../crypto/web-crypto.js\";\nimport type { AgentIdentity } from \"../types.js\";\nimport type {\n\tA2AAgentCapabilities,\n\tA2AAgentCard,\n\tA2AAgentProvider,\n\tA2AAgentSkill,\n\tA2ASecurityScheme,\n\tResult,\n} from \"./types.js\";\nimport { A2A_PROTOCOL_VERSION, A2AAgentCardSchema } from \"./types.js\";\n\n// ─── Create Agent Card ───────────────────────────────────────────────────────\n\nexport interface CreateAgentCardInput {\n\t/** The TheAuth agent identity to build the card from */\n\tagent: Pick<AgentIdentity, \"id\" | \"name\" | \"type\">;\n\t/** The URL where this agent's A2A endpoint is hosted */\n\turl: string;\n\t/** Human-readable description of what the agent does */\n\tdescription: string;\n\t/** Semantic version of this agent */\n\tversion: string;\n\t/** Skills this agent can perform */\n\tskills: A2AAgentSkill[];\n\t/** Optional provider information */\n\tprovider?: A2AAgentProvider;\n\t/** Optional capabilities declaration */\n\tcapabilities?: A2AAgentCapabilities;\n\t/** Security schemes required to call this agent */\n\tsecuritySchemes?: Record<string, A2ASecurityScheme>;\n\t/** Security requirements (references to securitySchemes keys) */\n\tsecurity?: Array<Record<string, string[]>>;\n\t/** Default accepted input MIME types */\n\tdefaultInputModes?: string[];\n\t/** Default output MIME types */\n\tdefaultOutputModes?: string[];\n\t/** Link to agent documentation */\n\tdocumentationUrl?: string;\n\t/** Arbitrary metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Create an A2A-compliant Agent Card from a TheAuth agent identity.\n *\n * Maps TheAuth agent fields to the A2A Agent Card format and sets\n * the protocol version automatically.\n */\nexport function createAgentCard(input: CreateAgentCardInput): A2AAgentCard {\n\tconst card: A2AAgentCard = {\n\t\tid: input.agent.id,\n\t\tname: input.agent.name,\n\t\tdescription: input.description,\n\t\tversion: input.version,\n\t\tprotocolVersion: A2A_PROTOCOL_VERSION,\n\t\turl: input.url,\n\t\tskills: input.skills,\n\t};\n\n\tif (input.provider) card.provider = input.provider;\n\tif (input.capabilities) card.capabilities = input.capabilities;\n\tif (input.securitySchemes) card.securitySchemes = input.securitySchemes;\n\tif (input.security) card.security = input.security;\n\tif (input.defaultInputModes) card.defaultInputModes = input.defaultInputModes;\n\tif (input.defaultOutputModes) card.defaultOutputModes = input.defaultOutputModes;\n\tif (input.documentationUrl) card.documentationUrl = input.documentationUrl;\n\tif (input.metadata) card.metadata = input.metadata;\n\n\treturn card;\n}\n\n// ─── Validate Agent Card ─────────────────────────────────────────────────────\n\n/**\n * Validate an incoming Agent Card against the A2A schema.\n *\n * Returns the parsed card on success or a structured error on failure.\n */\nexport function validateAgentCard(card: unknown): Result<A2AAgentCard> {\n\tconst parsed = A2AAgentCardSchema.safeParse(card);\n\tif (!parsed.success) {\n\t\tconst issues = parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`);\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_INVALID_AGENT_CARD\",\n\t\t\t\tmessage: `Invalid Agent Card: ${issues.join(\"; \")}`,\n\t\t\t\tdetails: { issues },\n\t\t\t},\n\t\t};\n\t}\n\treturn { success: true, data: parsed.data as A2AAgentCard };\n}\n\n// ─── Sign Agent Card ─────────────────────────────────────────────────────────\n\nexport interface SignAgentCardOptions {\n\t/** The Agent Card to sign */\n\tcard: A2AAgentCard;\n\t/** JWK private key used to create the signature */\n\tprivateKey: CryptoKey | jose.JWK;\n\t/** Signing algorithm. Default: \"ES256\". */\n\talgorithm?: string;\n\t/** Key ID to include in the signature. Auto-generated if not provided. */\n\tkeyId?: string;\n}\n\n/**\n * Sign an Agent Card with a private key.\n *\n * Creates a JWS compact signature over the card's canonical JSON\n * (excluding the signature field itself). The signature, algorithm,\n * and key ID are attached to the card's `signature` field.\n */\nexport async function signAgentCard(options: SignAgentCardOptions): Promise<Result<A2AAgentCard>> {\n\tconst { card, privateKey, algorithm = \"ES256\", keyId } = options;\n\n\ttry {\n\t\t// Strip existing signature before signing\n\t\tconst { signature: _ignored, ...cardWithoutSignature } = card;\n\n\t\tconst payload = new TextEncoder().encode(JSON.stringify(cardWithoutSignature));\n\n\t\tconst key =\n\t\t\t\"kty\" in (privateKey as jose.JWK)\n\t\t\t\t? await jose.importJWK(privateKey as jose.JWK, algorithm)\n\t\t\t\t: privateKey;\n\n\t\tconst kid = keyId ?? generateId();\n\n\t\tconst jws = await new jose.CompactSign(payload)\n\t\t\t.setProtectedHeader({ alg: algorithm, kid })\n\t\t\t.sign(key as CryptoKey);\n\n\t\tconst signedCard: A2AAgentCard = {\n\t\t\t...card,\n\t\t\tsignature: {\n\t\t\t\talgorithm,\n\t\t\t\tsignature: jws,\n\t\t\t\tkeyId: kid,\n\t\t\t},\n\t\t};\n\n\t\treturn { success: true, data: signedCard };\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_SIGN_FAILED\",\n\t\t\t\tmessage: err instanceof Error ? err.message : \"Failed to sign agent card\",\n\t\t\t},\n\t\t};\n\t}\n}\n\n// ─── Verify Agent Card ───────────────────────────────────────────────────────\n\nexport interface VerifyAgentCardOptions {\n\t/** The signed Agent Card to verify */\n\tcard: A2AAgentCard;\n\t/** JWK public key used to verify the signature */\n\tpublicKey: CryptoKey | jose.JWK;\n}\n\n/**\n * Verify a signed Agent Card's signature.\n *\n * Checks that the JWS signature in `card.signature` is valid\n * against the provided public key and that the payload matches\n * the card content (minus the signature field).\n */\nexport async function verifyAgentCard(\n\toptions: VerifyAgentCardOptions,\n): Promise<Result<{ valid: boolean; card: A2AAgentCard }>> {\n\tconst { card, publicKey } = options;\n\n\tif (!card.signature) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_NO_SIGNATURE\",\n\t\t\t\tmessage: \"Agent Card has no signature to verify\",\n\t\t\t},\n\t\t};\n\t}\n\n\ttry {\n\t\tconst { signature, ...cardWithoutSignature } = card;\n\t\tconst algorithm = signature.algorithm;\n\n\t\tconst key =\n\t\t\t\"kty\" in (publicKey as jose.JWK)\n\t\t\t\t? await jose.importJWK(publicKey as jose.JWK, algorithm)\n\t\t\t\t: publicKey;\n\n\t\tconst { payload } = await jose.compactVerify(signature.signature, key as CryptoKey);\n\n\t\tconst decoded = new TextDecoder().decode(payload);\n\t\tconst signedContent = JSON.parse(decoded) as Record<string, unknown>;\n\t\tconst currentContent = JSON.stringify(cardWithoutSignature);\n\t\tconst parsedCurrentContent = JSON.parse(currentContent) as Record<string, unknown>;\n\n\t\t// Compare the signed payload against the current card content\n\t\tconst matches = JSON.stringify(signedContent) === JSON.stringify(parsedCurrentContent);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdata: { valid: matches, card },\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: {\n\t\t\t\tcode: \"A2A_VERIFY_FAILED\",\n\t\t\t\tmessage: err instanceof Error ? err.message : \"Failed to verify agent card signature\",\n\t\t\t},\n\t\t};\n\t}\n}\n","/**\n * A2A client for TheAuth.\n *\n * Discovers remote agents via /.well-known/agent.json and communicates\n * with them through JSON-RPC over HTTP. Supports message send, task\n * retrieval, cancellation, and SSE streaming.\n */\n\nimport { generateId } from \"../crypto/web-crypto.js\";\nimport type {\n\tA2AAgentCard,\n\tA2ACancelTaskParams,\n\tA2AClient,\n\tA2AClientConfig,\n\tA2AGetTaskParams,\n\tA2AJsonRpcResponse,\n\tA2ASendMessageParams,\n\tA2AStreamEvent,\n\tA2ATask,\n\tResult,\n} from \"./types.js\";\nimport {\n\tA2A_JSONRPC_VERSION,\n\tA2A_METHODS,\n\tA2A_WELL_KNOWN_PATH,\n\tA2AAgentCardSchema,\n} from \"./types.js\";\n\n// ─── Create A2A Client ──────────────────────────────────────────────────────\n\n/**\n * Create an A2A client that can discover and call remote A2A agents.\n *\n * @example\n * ```typescript\n * const client = createA2AClient({\n * agent: 'https://remote-agent.example.com',\n * getAuthToken: () => theauth.issueToken({ agentId: myAgent.id }),\n * });\n *\n * const card = await client.discover();\n * const result = await client.sendMessage({\n * message: { id: '1', role: 'user', parts: [{ type: 'text', text: 'Hello' }], createdAt: new Date().toISOString() },\n * });\n * ```\n */\nexport function createA2AClient(config: A2AClientConfig): A2AClient {\n\tconst fetchFn = config.fetch ?? globalThis.fetch;\n\tconst timeout = config.timeout ?? 30_000;\n\n\tlet cachedCard: A2AAgentCard | undefined;\n\n\t// Resolve the base URL from the config\n\tfunction getBaseUrl(): string {\n\t\tif (typeof config.agent === \"string\") {\n\t\t\treturn config.agent.replace(/\\/$/, \"\");\n\t\t}\n\t\treturn config.agent.url.replace(/\\/$/, \"\");\n\t}\n\n\t// If the agent was passed as a card, use it directly\n\tif (typeof config.agent !== \"string\") {\n\t\tcachedCard = config.agent;\n\t}\n\n\tasync function getAuthHeaders(): Promise<Record<string, string>> {\n\t\tif (!config.getAuthToken) return {};\n\t\tconst token = await config.getAuthToken();\n\t\treturn { Authorization: `Bearer ${token}` };\n\t}\n\n\tasync function jsonRpcCall<R>(method: string, params: unknown): Promise<Result<R>> {\n\t\tconst baseUrl = cachedCard?.url ?? getBaseUrl();\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeout);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(baseUrl, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t...authHeaders,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\tmethod,\n\t\t\t\t\tparams,\n\t\t\t\t}),\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_HTTP_ERROR\",\n\t\t\t\t\t\tmessage: `HTTP ${response.status}: ${response.statusText}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst body = (await response.json()) as A2AJsonRpcResponse<R>;\n\n\t\t\tif (body.error) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: `A2A_RPC_${body.error.code}`,\n\t\t\t\t\t\tmessage: body.error.message,\n\t\t\t\t\t\tdetails: body.error.data ? { data: body.error.data } : undefined,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { success: true, data: body.result as R };\n\t\t} catch (err) {\n\t\t\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_TIMEOUT\",\n\t\t\t\t\t\tmessage: `Request timed out after ${timeout}ms`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"A2A_REQUEST_FAILED\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Request failed\",\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tasync function discover(): Promise<Result<A2AAgentCard>> {\n\t\tif (cachedCard) {\n\t\t\treturn { success: true, data: cachedCard };\n\t\t}\n\n\t\tconst baseUrl = getBaseUrl();\n\t\tconst url = `${baseUrl}${A2A_WELL_KNOWN_PATH}`;\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst controller = new AbortController();\n\t\tconst timer = setTimeout(() => controller.abort(), timeout);\n\n\t\ttry {\n\t\t\tconst response = await fetchFn(url, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: authHeaders,\n\t\t\t\tsignal: controller.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_DISCOVERY_FAILED\",\n\t\t\t\t\t\tmessage: `Discovery failed: HTTP ${response.status}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst body: unknown = await response.json();\n\t\t\tconst parsed = A2AAgentCardSchema.safeParse(body);\n\n\t\t\tif (!parsed.success) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tcode: \"A2A_INVALID_AGENT_CARD\",\n\t\t\t\t\t\tmessage: `Invalid agent card: ${parsed.error.issues.map((i) => i.message).join(\"; \")}`,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcachedCard = parsed.data as A2AAgentCard;\n\t\t\treturn { success: true, data: cachedCard };\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: {\n\t\t\t\t\tcode: \"A2A_DISCOVERY_FAILED\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Discovery request failed\",\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t}\n\n\tasync function sendMessage(params: A2ASendMessageParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.SEND_MESSAGE, params);\n\t}\n\n\tasync function getTask(params: A2AGetTaskParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.GET_TASK, params);\n\t}\n\n\tasync function cancelTask(params: A2ACancelTaskParams): Promise<Result<A2ATask>> {\n\t\treturn jsonRpcCall<A2ATask>(A2A_METHODS.CANCEL_TASK, params);\n\t}\n\n\tasync function* sendStreamingMessage(\n\t\tparams: A2ASendMessageParams,\n\t): AsyncIterable<A2AStreamEvent> {\n\t\tconst baseUrl = cachedCard?.url ?? getBaseUrl();\n\t\tconst authHeaders = await getAuthHeaders();\n\n\t\tconst response = await fetchFn(baseUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t\t...authHeaders,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\t\t\tid: generateId(),\n\t\t\t\tmethod: A2A_METHODS.SEND_STREAMING_MESSAGE,\n\t\t\t\tparams,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok || !response.body) {\n\t\t\tthrow new Error(`Streaming request failed: HTTP ${response.status}`);\n\t\t}\n\n\t\tconst reader = response.body.getReader();\n\t\tconst decoder = new TextDecoder();\n\t\tlet buffer = \"\";\n\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() ?? \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (line.startsWith(\"data: \")) {\n\t\t\t\t\t\tconst data = line.slice(6).trim();\n\t\t\t\t\t\tif (data === \"[DONE]\") return;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tyield JSON.parse(data) as A2AStreamEvent;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip malformed SSE lines\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n\n\treturn {\n\t\tdiscover,\n\t\tsendMessage,\n\t\tgetTask,\n\t\tcancelTask,\n\t\tsendStreamingMessage,\n\t};\n}\n","/**\n * A2A JSON-RPC server for TheAuth.\n *\n * Creates a Web API Request/Response handler that implements the A2A\n * protocol's JSON-RPC endpoint. Handles message/send, tasks/get,\n * tasks/cancel, and message/stream (SSE). Authenticates callers through\n * TheAuth and logs every interaction to the audit trail.\n */\n\nimport type {\n\tA2AAuditEvent,\n\tA2AJsonRpcError,\n\tA2AJsonRpcResponse,\n\tA2AServerConfig,\n\tA2ATask,\n\tA2ATaskStore,\n} from \"./types.js\";\nimport {\n\tA2A_ERROR_CODES,\n\tA2A_JSONRPC_VERSION,\n\tA2A_METHODS,\n\tA2A_WELL_KNOWN_PATH,\n\tA2ACancelTaskParamsSchema,\n\tA2AGetTaskParamsSchema,\n\tA2AJsonRpcRequestSchema,\n\tA2ASendMessageParamsSchema,\n} from \"./types.js\";\n\n// ─── In-memory task store (default) ──────────────────────────────────────────\n\nfunction createInMemoryTaskStore(): A2ATaskStore {\n\tconst tasks = new Map<string, A2ATask>();\n\treturn {\n\t\tasync get(taskId: string) {\n\t\t\treturn tasks.get(taskId);\n\t\t},\n\t\tasync set(taskId: string, task: A2ATask) {\n\t\t\ttasks.set(taskId, task);\n\t\t},\n\t\tasync delete(taskId: string) {\n\t\t\treturn tasks.delete(taskId);\n\t\t},\n\t};\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction jsonRpcError(id: string | number | null, error: A2AJsonRpcError): Response {\n\tconst body: A2AJsonRpcResponse = {\n\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\tid: id ?? 0,\n\t\terror,\n\t};\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus: 200, // JSON-RPC always returns 200\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\nfunction jsonRpcSuccess(id: string | number, result: unknown): Response {\n\tconst body: A2AJsonRpcResponse = {\n\t\tjsonrpc: A2A_JSONRPC_VERSION,\n\t\tid,\n\t\tresult,\n\t};\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus: 200,\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t});\n}\n\n// ─── Create A2A Server ───────────────────────────────────────────────────────\n\nexport interface A2AServer {\n\t/** Handle an incoming HTTP request (JSON-RPC or agent card discovery) */\n\thandleRequest: (request: Request) => Promise<Response>;\n\t/** Access the task store directly (for testing or admin) */\n\ttaskStore: A2ATaskStore;\n}\n\n/**\n * Create an A2A-compliant JSON-RPC server.\n *\n * The returned `handleRequest` function accepts standard Web API Request\n * objects and returns Response objects. Mount it at whatever path you\n * prefer; it also handles `/.well-known/agent.json` for agent card\n * discovery.\n *\n * @example\n * ```typescript\n * const server = createA2AServer({\n * agentCard: myCard,\n * handler: {\n * onMessage: async (msg) => ({ id: '...', contextId: '...', status: { code: 'completed' }, ... }),\n * },\n * authenticate: async (req) => verifyToken(req),\n * });\n *\n * // In your HTTP framework:\n * app.all('/a2a', (req) => server.handleRequest(req));\n * ```\n */\nexport function createA2AServer(config: A2AServerConfig): A2AServer {\n\tconst taskStore = config.taskStore ?? createInMemoryTaskStore();\n\n\tasync function audit(event: Omit<A2AAuditEvent, \"timestamp\">): Promise<void> {\n\t\tif (config.onAudit) {\n\t\t\tawait config.onAudit({\n\t\t\t\t...event,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function authenticate(\n\t\trequest: Request,\n\t): Promise<{ agentId: string | null; error: Response | null }> {\n\t\tif (!config.authenticate) {\n\t\t\treturn { agentId: null, error: null };\n\t\t}\n\n\t\tconst agentId = await config.authenticate(request);\n\t\tif (agentId === null) {\n\t\t\treturn {\n\t\t\t\tagentId: null,\n\t\t\t\terror: jsonRpcError(0, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.AUTHENTICATION_REQUIRED,\n\t\t\t\t\tmessage: \"Authentication required\",\n\t\t\t\t}),\n\t\t\t};\n\t\t}\n\n\t\treturn { agentId, error: null };\n\t}\n\n\tasync function handleSendMessage(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2ASendMessageParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Invalid params\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: `Invalid params: ${parsed.error.issues.map((i) => i.message).join(\"; \")}`,\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst task = await config.handler.onMessage(parsed.data.message, parsed.data.configuration);\n\n\t\t\tawait taskStore.set(task.id, task);\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: task.id,\n\t\t\t\tsuccess: true,\n\t\t\t});\n\n\t\t\treturn jsonRpcSuccess(id, task);\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : \"Internal error\";\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.SEND_MESSAGE,\n\t\t\t\tagentId,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: message,\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\tmessage,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync function handleGetTask(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2AGetTaskParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params: id is required\",\n\t\t\t});\n\t\t}\n\n\t\tconst task = await taskStore.get(parsed.data.id);\n\t\tif (!task) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.GET_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task not found\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_NOT_FOUND,\n\t\t\t\tmessage: `Task ${parsed.data.id} not found`,\n\t\t\t});\n\t\t}\n\n\t\t// Trim history if historyLength specified\n\t\tlet result = task;\n\t\tif (parsed.data.historyLength !== undefined && task.history) {\n\t\t\tconst len = parsed.data.historyLength;\n\t\t\tresult = {\n\t\t\t\t...task,\n\t\t\t\thistory: len === 0 ? [] : task.history.slice(-len),\n\t\t\t};\n\t\t}\n\n\t\tawait audit({\n\t\t\tmethod: A2A_METHODS.GET_TASK,\n\t\t\tagentId,\n\t\t\ttaskId: task.id,\n\t\t\tsuccess: true,\n\t\t});\n\n\t\treturn jsonRpcSuccess(id, result);\n\t}\n\n\tasync function handleCancelTask(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Promise<Response> {\n\t\tconst parsed = A2ACancelTaskParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params: id is required\",\n\t\t\t});\n\t\t}\n\n\t\tconst existing = await taskStore.get(parsed.data.id);\n\t\tif (!existing) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task not found\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_NOT_FOUND,\n\t\t\t\tmessage: `Task ${parsed.data.id} not found`,\n\t\t\t});\n\t\t}\n\n\t\t// Already in a terminal state\n\t\tif (\n\t\t\texisting.status.code === \"completed\" ||\n\t\t\texisting.status.code === \"failed\" ||\n\t\t\texisting.status.code === \"canceled\"\n\t\t) {\n\t\t\tawait audit({\n\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\tagentId,\n\t\t\t\ttaskId: existing.id,\n\t\t\t\tsuccess: false,\n\t\t\t\terror: \"Task already in terminal state\",\n\t\t\t});\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.TASK_ALREADY_COMPLETED,\n\t\t\t\tmessage: `Task ${parsed.data.id} is already ${existing.status.code}`,\n\t\t\t});\n\t\t}\n\n\t\tif (config.handler.onCancel) {\n\t\t\ttry {\n\t\t\t\tconst canceled = await config.handler.onCancel(parsed.data.id);\n\t\t\t\tawait taskStore.set(canceled.id, canceled);\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\t\tagentId,\n\t\t\t\t\ttaskId: canceled.id,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t});\n\t\t\t\treturn jsonRpcSuccess(id, canceled);\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : \"Cancel failed\";\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\t\t\tagentId,\n\t\t\t\t\ttaskId: parsed.data.id,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: message,\n\t\t\t\t});\n\t\t\t\treturn jsonRpcError(id, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Default cancellation\n\t\tconst canceled: A2ATask = {\n\t\t\t...existing,\n\t\t\tstatus: { code: \"canceled\", message: \"Canceled by client\" },\n\t\t\tupdatedAt: new Date().toISOString(),\n\t\t};\n\t\tawait taskStore.set(canceled.id, canceled);\n\t\tawait audit({\n\t\t\tmethod: A2A_METHODS.CANCEL_TASK,\n\t\t\tagentId,\n\t\t\ttaskId: canceled.id,\n\t\t\tsuccess: true,\n\t\t});\n\t\treturn jsonRpcSuccess(id, canceled);\n\t}\n\n\tfunction handleStreamingMessage(\n\t\tid: string | number,\n\t\tparams: unknown,\n\t\tagentId: string | null,\n\t): Response {\n\t\tif (!config.handler.onMessageStream) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.METHOD_NOT_FOUND,\n\t\t\t\tmessage: \"Streaming not supported by this agent\",\n\t\t\t});\n\t\t}\n\n\t\tconst parsed = A2ASendMessageParamsSchema.safeParse(params);\n\t\tif (!parsed.success) {\n\t\t\treturn jsonRpcError(id, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_PARAMS,\n\t\t\t\tmessage: \"Invalid params\",\n\t\t\t});\n\t\t}\n\n\t\tconst stream = config.handler.onMessageStream(parsed.data.message, parsed.data.configuration);\n\n\t\tconst encoder = new TextEncoder();\n\t\tconst readable = new ReadableStream({\n\t\t\tasync start(controller) {\n\t\t\t\ttry {\n\t\t\t\t\tfor await (const event of stream) {\n\t\t\t\t\t\tconst data = JSON.stringify(event);\n\t\t\t\t\t\tcontroller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n\t\t\t\t\t}\n\t\t\t\t\tcontroller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst errorData = JSON.stringify({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tcode: A2A_ERROR_CODES.INTERNAL_ERROR,\n\t\t\t\t\t\t\tmessage: err instanceof Error ? err.message : \"Stream error\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tcontroller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t}\n\t\t\t\t// Fire-and-forget audit\n\t\t\t\tvoid audit({\n\t\t\t\t\tmethod: A2A_METHODS.SEND_STREAMING_MESSAGE,\n\t\t\t\t\tagentId,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\treturn new Response(readable, {\n\t\t\tstatus: 200,\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/event-stream\",\n\t\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\tConnection: \"keep-alive\",\n\t\t\t},\n\t\t});\n\t}\n\n\tasync function handleRequest(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\n\t\t// Agent Card discovery\n\t\tif (request.method === \"GET\" && url.pathname.endsWith(A2A_WELL_KNOWN_PATH)) {\n\t\t\treturn new Response(JSON.stringify(config.agentCard), {\n\t\t\t\tstatus: 200,\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t});\n\t\t}\n\n\t\t// Only POST for JSON-RPC\n\t\tif (request.method !== \"POST\") {\n\t\t\treturn new Response(\"Method Not Allowed\", { status: 405 });\n\t\t}\n\n\t\t// Authenticate\n\t\tconst auth = await authenticate(request);\n\t\tif (auth.error) return auth.error;\n\t\tconst agentId = auth.agentId;\n\n\t\t// Parse JSON-RPC envelope\n\t\tlet body: unknown;\n\t\ttry {\n\t\t\tbody = await request.json();\n\t\t} catch {\n\t\t\treturn jsonRpcError(null, {\n\t\t\t\tcode: A2A_ERROR_CODES.PARSE_ERROR,\n\t\t\t\tmessage: \"Invalid JSON\",\n\t\t\t});\n\t\t}\n\n\t\tconst envelope = A2AJsonRpcRequestSchema.safeParse(body);\n\t\tif (!envelope.success) {\n\t\t\treturn jsonRpcError(null, {\n\t\t\t\tcode: A2A_ERROR_CODES.INVALID_REQUEST,\n\t\t\t\tmessage: \"Invalid JSON-RPC request\",\n\t\t\t});\n\t\t}\n\n\t\tconst { id: reqId, method, params } = envelope.data;\n\n\t\tswitch (method) {\n\t\t\tcase A2A_METHODS.SEND_MESSAGE:\n\t\t\t\treturn handleSendMessage(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.GET_TASK:\n\t\t\t\treturn handleGetTask(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.CANCEL_TASK:\n\t\t\t\treturn handleCancelTask(reqId, params, agentId);\n\n\t\t\tcase A2A_METHODS.SEND_STREAMING_MESSAGE:\n\t\t\t\treturn handleStreamingMessage(reqId, params, agentId);\n\n\t\t\tdefault:\n\t\t\t\tawait audit({\n\t\t\t\t\tmethod,\n\t\t\t\t\tagentId,\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"Method not found\",\n\t\t\t\t});\n\t\t\t\treturn jsonRpcError(reqId, {\n\t\t\t\t\tcode: A2A_ERROR_CODES.METHOD_NOT_FOUND,\n\t\t\t\t\tmessage: `Unknown method: ${method}`,\n\t\t\t\t});\n\t\t}\n\t}\n\n\treturn { handleRequest, taskStore };\n}\n"]}
|
package/dist/agent/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { D as Database, C as CreateAgentInput, A as AgentIdentity,
|
|
2
|
-
export {
|
|
1
|
+
import { D as Database, C as CreateAgentInput, A as AgentIdentity, m as AgentFilter, U as UpdateAgentInput } from '../types-JOx1R8-Q.js';
|
|
2
|
+
export { a0 as AgentConfig } from '../types-JOx1R8-Q.js';
|
|
3
3
|
import 'drizzle-orm/sqlite-core';
|
|
4
|
-
import '../types-
|
|
4
|
+
import '../types-XoCxTUZj.js';
|
|
5
5
|
import 'zod';
|
|
6
6
|
import '../redirect/index.js';
|
|
7
7
|
|