@multi-agent-protocol/sdk 0.1.6 → 0.1.7
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/dist/server.cjs +14097 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.js +13938 -0
- package/dist/server.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/jose/dist/webapi/lib/buffer_utils.js","../../../../node_modules/jose/dist/webapi/lib/base64.js","../../../../node_modules/jose/dist/webapi/util/base64url.js","../../../../node_modules/jose/dist/webapi/util/errors.js","../../../../node_modules/jose/dist/webapi/lib/iv.js","../../../../node_modules/jose/dist/webapi/lib/check_iv_length.js","../../../../node_modules/jose/dist/webapi/lib/check_cek_length.js","../../../../node_modules/jose/dist/webapi/lib/crypto_key.js","../../../../node_modules/jose/dist/webapi/lib/invalid_key_input.js","../../../../node_modules/jose/dist/webapi/lib/is_key_like.js","../../../../node_modules/jose/dist/webapi/lib/decrypt.js","../../../../node_modules/jose/dist/webapi/lib/is_disjoint.js","../../../../node_modules/jose/dist/webapi/lib/is_object.js","../../../../node_modules/jose/dist/webapi/lib/aeskw.js","../../../../node_modules/jose/dist/webapi/lib/digest.js","../../../../node_modules/jose/dist/webapi/lib/ecdhes.js","../../../../node_modules/jose/dist/webapi/lib/pbes2kw.js","../../../../node_modules/jose/dist/webapi/lib/check_key_length.js","../../../../node_modules/jose/dist/webapi/lib/rsaes.js","../../../../node_modules/jose/dist/webapi/lib/cek.js","../../../../node_modules/jose/dist/webapi/lib/asn1.js","../../../../node_modules/jose/dist/webapi/lib/jwk_to_key.js","../../../../node_modules/jose/dist/webapi/key/import.js","../../../../node_modules/jose/dist/webapi/lib/encrypt.js","../../../../node_modules/jose/dist/webapi/lib/aesgcmkw.js","../../../../node_modules/jose/dist/webapi/lib/decrypt_key_management.js","../../../../node_modules/jose/dist/webapi/lib/validate_crit.js","../../../../node_modules/jose/dist/webapi/lib/validate_algorithms.js","../../../../node_modules/jose/dist/webapi/lib/is_jwk.js","../../../../node_modules/jose/dist/webapi/lib/normalize_key.js","../../../../node_modules/jose/dist/webapi/lib/check_key_type.js","../../../../node_modules/jose/dist/webapi/jwe/flattened/decrypt.js","../../../../node_modules/jose/dist/webapi/jwe/compact/decrypt.js","../../../../node_modules/jose/dist/webapi/jwe/general/decrypt.js","../../../../node_modules/jose/dist/webapi/lib/private_symbols.js","../../../../node_modules/jose/dist/webapi/lib/key_to_jwk.js","../../../../node_modules/jose/dist/webapi/key/export.js","../../../../node_modules/jose/dist/webapi/lib/encrypt_key_management.js","../../../../node_modules/jose/dist/webapi/jwe/flattened/encrypt.js","../../../../node_modules/jose/dist/webapi/jwe/general/encrypt.js","../../../../node_modules/jose/dist/webapi/lib/subtle_dsa.js","../../../../node_modules/jose/dist/webapi/lib/get_sign_verify_key.js","../../../../node_modules/jose/dist/webapi/lib/verify.js","../../../../node_modules/jose/dist/webapi/jws/flattened/verify.js","../../../../node_modules/jose/dist/webapi/jws/compact/verify.js","../../../../node_modules/jose/dist/webapi/jws/general/verify.js","../../../../node_modules/jose/dist/webapi/lib/jwt_claims_set.js","../../../../node_modules/jose/dist/webapi/jwt/verify.js","../../../../node_modules/jose/dist/webapi/jwt/decrypt.js","../../../../node_modules/jose/dist/webapi/jwe/compact/encrypt.js","../../../../node_modules/jose/dist/webapi/lib/sign.js","../../../../node_modules/jose/dist/webapi/jws/flattened/sign.js","../../../../node_modules/jose/dist/webapi/jws/compact/sign.js","../../../../node_modules/jose/dist/webapi/jws/general/sign.js","../../../../node_modules/jose/dist/webapi/jwt/sign.js","../../../../node_modules/jose/dist/webapi/jwt/encrypt.js","../../../../node_modules/jose/dist/webapi/jwk/thumbprint.js","../../../../node_modules/jose/dist/webapi/jwk/embedded.js","../../../../node_modules/jose/dist/webapi/jwks/local.js","../../../../node_modules/jose/dist/webapi/jwks/remote.js","../../../../node_modules/jose/dist/webapi/jwt/unsecured.js","../../../../node_modules/jose/dist/webapi/util/decode_protected_header.js","../../../../node_modules/jose/dist/webapi/util/decode_jwt.js","../../../../node_modules/jose/dist/webapi/key/generate_key_pair.js","../../../../node_modules/jose/dist/webapi/key/generate_secret.js","../../../../node_modules/jose/dist/webapi/index.js","../src/types/index.ts","../src/utils/ulid.ts","../src/server/events/stores/in-memory.ts","../src/server/events/event-bus.ts","../src/server/agents/stores/in-memory.ts","../src/server/agents/registry.ts","../src/jsonrpc/index.ts","../src/errors/index.ts","../src/server/agents/handlers.ts","../src/server/sessions/stores/in-memory.ts","../src/server/sessions/manager.ts","../src/server/scopes/stores/in-memory.ts","../src/server/scopes/manager.ts","../src/server/scopes/handlers.ts","../src/utils/causal-buffer.ts","../src/server/subscriptions/stores/in-memory.ts","../src/server/subscriptions/manager.ts","../src/server/subscriptions/handlers.ts","../src/server/messages/stores/in-memory.ts","../src/server/messages/router.ts","../src/server/messages/address.ts","../src/server/messages/handlers.ts","../src/server/mail/stores/in-memory-conversation.ts","../src/server/mail/stores/in-memory-turn.ts","../src/server/mail/stores/in-memory-thread.ts","../src/server/mail/stores/in-memory-participant.ts","../src/server/mail/conversation-manager.ts","../src/server/mail/turn-manager.ts","../src/server/mail/thread-manager.ts","../src/server/mail/handlers.ts","../src/server/router/connection.ts","../src/server/router/middleware.ts","../src/server/router/handlers.ts","../src/server/router/adapter.ts","../src/server/router/base-router.ts","../src/server/credentials/handlers.ts","../src/server/workspace/handlers.ts","../src/server/auth/manager.ts","../src/server/auth/capabilities.ts","../src/server/auth/middleware.ts","../src/server/auth/authenticators/no-auth.ts","../src/server/auth/authenticators/api-key.ts","../src/server/auth/authenticators/jwt.ts","../src/server/auth/authenticators/mtls.ts","../src/server/auth/providers/agent-iam-mapper.ts","../src/server/auth/providers/agent-iam.ts","../src/server/auth/providers/agent-iam-federation.ts","../src/federation/did-wba/resolver.ts","../src/federation/did-wba/proof.ts","../src/federation/challenge.ts","../src/server/auth/did-wba-authenticator.ts","../src/server/server.ts","../src/server/permissions/checker.ts","../src/server/permissions/middleware.ts","../src/server/cleanup/cleaner.ts","../src/server/federation/buffer.ts","../src/server/federation/gateway.ts","../src/server/federation/federated-id.ts","../src/server/federation/decorators/agents.ts","../src/server/federation/decorators/scopes.ts","../src/server/federation/decorators/messages.ts","../src/server/federation/handlers.ts","../src/server/trajectory/stores/in-memory.ts","../src/server/trajectory/manager.ts","../src/server/trajectory/handlers.ts","../src/server/middleware/validation.ts"],"names":["encode","message","tag","getCryptoKey","deriveKey","wrap","unwrap","decrypt","keyData","encrypt","protectedHeader","init_decrypt","init_encrypt","jwe","subtleAlgorithm","init_verify","init_sign","cache","jwk","monotonicFactory","ulid","agentId","check","ENCODING","SEPARATOR","DEFAULT_SYNC_OPTIONS","z"],"mappings":"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","file":"server.cjs","sourcesContent":["export const encoder = new TextEncoder();\nexport const decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nexport function concat(...buffers) {\n const size = buffers.reduce((acc, { length }) => acc + length, 0);\n const buf = new Uint8Array(size);\n let i = 0;\n for (const buffer of buffers) {\n buf.set(buffer, i);\n i += buffer.length;\n }\n return buf;\n}\nfunction writeUInt32BE(buf, value, offset) {\n if (value < 0 || value >= MAX_INT32) {\n throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n }\n buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nexport function uint64be(value) {\n const high = Math.floor(value / MAX_INT32);\n const low = value % MAX_INT32;\n const buf = new Uint8Array(8);\n writeUInt32BE(buf, high, 0);\n writeUInt32BE(buf, low, 4);\n return buf;\n}\nexport function uint32be(value) {\n const buf = new Uint8Array(4);\n writeUInt32BE(buf, value);\n return buf;\n}\nexport function encode(string) {\n const bytes = new Uint8Array(string.length);\n for (let i = 0; i < string.length; i++) {\n const code = string.charCodeAt(i);\n if (code > 127) {\n throw new TypeError('non-ASCII string encountered in encode()');\n }\n bytes[i] = code;\n }\n return bytes;\n}\n","export function encodeBase64(input) {\n if (Uint8Array.prototype.toBase64) {\n return input.toBase64();\n }\n const CHUNK_SIZE = 0x8000;\n const arr = [];\n for (let i = 0; i < input.length; i += CHUNK_SIZE) {\n arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE)));\n }\n return btoa(arr.join(''));\n}\nexport function decodeBase64(encoded) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(encoded);\n }\n const binary = atob(encoded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","import { encoder, decoder } from '../lib/buffer_utils.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nexport function decode(input) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(typeof input === 'string' ? input : decoder.decode(input), {\n alphabet: 'base64url',\n });\n }\n let encoded = input;\n if (encoded instanceof Uint8Array) {\n encoded = decoder.decode(encoded);\n }\n encoded = encoded.replace(/-/g, '+').replace(/_/g, '/');\n try {\n return decodeBase64(encoded);\n }\n catch {\n throw new TypeError('The input to be decoded is not correctly encoded.');\n }\n}\nexport function encode(input) {\n let unencoded = input;\n if (typeof unencoded === 'string') {\n unencoded = encoder.encode(unencoded);\n }\n if (Uint8Array.prototype.toBase64) {\n return unencoded.toBase64({ alphabet: 'base64url', omitPadding: true });\n }\n return encodeBase64(unencoded).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","export class JOSEError extends Error {\n static code = 'ERR_JOSE_GENERIC';\n code = 'ERR_JOSE_GENERIC';\n constructor(message, options) {\n super(message, options);\n this.name = this.constructor.name;\n Error.captureStackTrace?.(this, this.constructor);\n }\n}\nexport class JWTClaimValidationFailed extends JOSEError {\n static code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JWTExpired extends JOSEError {\n static code = 'ERR_JWT_EXPIRED';\n code = 'ERR_JWT_EXPIRED';\n claim;\n reason;\n payload;\n constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n super(message, { cause: { claim, reason, payload } });\n this.claim = claim;\n this.reason = reason;\n this.payload = payload;\n }\n}\nexport class JOSEAlgNotAllowed extends JOSEError {\n static code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n}\nexport class JOSENotSupported extends JOSEError {\n static code = 'ERR_JOSE_NOT_SUPPORTED';\n code = 'ERR_JOSE_NOT_SUPPORTED';\n}\nexport class JWEDecryptionFailed extends JOSEError {\n static code = 'ERR_JWE_DECRYPTION_FAILED';\n code = 'ERR_JWE_DECRYPTION_FAILED';\n constructor(message = 'decryption operation failed', options) {\n super(message, options);\n }\n}\nexport class JWEInvalid extends JOSEError {\n static code = 'ERR_JWE_INVALID';\n code = 'ERR_JWE_INVALID';\n}\nexport class JWSInvalid extends JOSEError {\n static code = 'ERR_JWS_INVALID';\n code = 'ERR_JWS_INVALID';\n}\nexport class JWTInvalid extends JOSEError {\n static code = 'ERR_JWT_INVALID';\n code = 'ERR_JWT_INVALID';\n}\nexport class JWKInvalid extends JOSEError {\n static code = 'ERR_JWK_INVALID';\n code = 'ERR_JWK_INVALID';\n}\nexport class JWKSInvalid extends JOSEError {\n static code = 'ERR_JWKS_INVALID';\n code = 'ERR_JWKS_INVALID';\n}\nexport class JWKSNoMatchingKey extends JOSEError {\n static code = 'ERR_JWKS_NO_MATCHING_KEY';\n code = 'ERR_JWKS_NO_MATCHING_KEY';\n constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSMultipleMatchingKeys extends JOSEError {\n [Symbol.asyncIterator];\n static code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n super(message, options);\n }\n}\nexport class JWKSTimeout extends JOSEError {\n static code = 'ERR_JWKS_TIMEOUT';\n code = 'ERR_JWKS_TIMEOUT';\n constructor(message = 'request timed out', options) {\n super(message, options);\n }\n}\nexport class JWSSignatureVerificationFailed extends JOSEError {\n static code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n constructor(message = 'signature verification failed', options) {\n super(message, options);\n }\n}\n","import { JOSENotSupported } from '../util/errors.js';\nexport function bitLength(alg) {\n switch (alg) {\n case 'A128GCM':\n case 'A128GCMKW':\n case 'A192GCM':\n case 'A192GCMKW':\n case 'A256GCM':\n case 'A256GCMKW':\n return 96;\n case 'A128CBC-HS256':\n case 'A192CBC-HS384':\n case 'A256CBC-HS512':\n return 128;\n default:\n throw new JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);\n }\n}\nexport const generateIv = (alg) => crypto.getRandomValues(new Uint8Array(bitLength(alg) >> 3));\n","import { JWEInvalid } from '../util/errors.js';\nimport { bitLength } from './iv.js';\nexport function checkIvLength(enc, iv) {\n if (iv.length << 3 !== bitLength(enc)) {\n throw new JWEInvalid('Invalid Initialization Vector length');\n }\n}\n","import { JWEInvalid } from '../util/errors.js';\nexport function checkCekLength(cek, expected) {\n const actual = cek.byteLength << 3;\n if (actual !== expected) {\n throw new JWEInvalid(`Invalid Content Encryption Key length. Expected ${expected} bits, got ${actual} bits`);\n }\n}\n","const unusable = (name, prop = 'algorithm.name') => new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`);\nconst isAlgorithm = (algorithm, name) => algorithm.name === name;\nfunction getHashLength(hash) {\n return parseInt(hash.name.slice(4), 10);\n}\nfunction getNamedCurve(alg) {\n switch (alg) {\n case 'ES256':\n return 'P-256';\n case 'ES384':\n return 'P-384';\n case 'ES512':\n return 'P-521';\n default:\n throw new Error('unreachable');\n }\n}\nfunction checkUsage(key, usage) {\n if (usage && !key.usages.includes(usage)) {\n throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`);\n }\n}\nexport function checkSigCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512': {\n if (!isAlgorithm(key.algorithm, 'HMAC'))\n throw unusable('HMAC');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'RS256':\n case 'RS384':\n case 'RS512': {\n if (!isAlgorithm(key.algorithm, 'RSASSA-PKCS1-v1_5'))\n throw unusable('RSASSA-PKCS1-v1_5');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'PS256':\n case 'PS384':\n case 'PS512': {\n if (!isAlgorithm(key.algorithm, 'RSA-PSS'))\n throw unusable('RSA-PSS');\n const expected = parseInt(alg.slice(2), 10);\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n case 'Ed25519':\n case 'EdDSA': {\n if (!isAlgorithm(key.algorithm, 'Ed25519'))\n throw unusable('Ed25519');\n break;\n }\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87': {\n if (!isAlgorithm(key.algorithm, alg))\n throw unusable(alg);\n break;\n }\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n if (!isAlgorithm(key.algorithm, 'ECDSA'))\n throw unusable('ECDSA');\n const expected = getNamedCurve(alg);\n const actual = key.algorithm.namedCurve;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.namedCurve');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\nexport function checkEncCryptoKey(key, alg, usage) {\n switch (alg) {\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM': {\n if (!isAlgorithm(key.algorithm, 'AES-GCM'))\n throw unusable('AES-GCM');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (!isAlgorithm(key.algorithm, 'AES-KW'))\n throw unusable('AES-KW');\n const expected = parseInt(alg.slice(1, 4), 10);\n const actual = key.algorithm.length;\n if (actual !== expected)\n throw unusable(expected, 'algorithm.length');\n break;\n }\n case 'ECDH': {\n switch (key.algorithm.name) {\n case 'ECDH':\n case 'X25519':\n break;\n default:\n throw unusable('ECDH or X25519');\n }\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW':\n if (!isAlgorithm(key.algorithm, 'PBKDF2'))\n throw unusable('PBKDF2');\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (!isAlgorithm(key.algorithm, 'RSA-OAEP'))\n throw unusable('RSA-OAEP');\n const expected = parseInt(alg.slice(9), 10) || 1;\n const actual = getHashLength(key.algorithm.hash);\n if (actual !== expected)\n throw unusable(`SHA-${expected}`, 'algorithm.hash');\n break;\n }\n default:\n throw new TypeError('CryptoKey does not support this operation');\n }\n checkUsage(key, usage);\n}\n","function message(msg, actual, ...types) {\n types = types.filter(Boolean);\n if (types.length > 2) {\n const last = types.pop();\n msg += `one of type ${types.join(', ')}, or ${last}.`;\n }\n else if (types.length === 2) {\n msg += `one of type ${types[0]} or ${types[1]}.`;\n }\n else {\n msg += `of type ${types[0]}.`;\n }\n if (actual == null) {\n msg += ` Received ${actual}`;\n }\n else if (typeof actual === 'function' && actual.name) {\n msg += ` Received function ${actual.name}`;\n }\n else if (typeof actual === 'object' && actual != null) {\n if (actual.constructor?.name) {\n msg += ` Received an instance of ${actual.constructor.name}`;\n }\n }\n return msg;\n}\nexport const invalidKeyInput = (actual, ...types) => message('Key must be ', actual, ...types);\nexport const withAlg = (alg, actual, ...types) => message(`Key for the ${alg} algorithm must be `, actual, ...types);\n","export function assertCryptoKey(key) {\n if (!isCryptoKey(key)) {\n throw new Error('CryptoKey instance expected');\n }\n}\nexport const isCryptoKey = (key) => {\n if (key?.[Symbol.toStringTag] === 'CryptoKey')\n return true;\n try {\n return key instanceof CryptoKey;\n }\n catch {\n return false;\n }\n};\nexport const isKeyObject = (key) => key?.[Symbol.toStringTag] === 'KeyObject';\nexport const isKeyLike = (key) => isCryptoKey(key) || isKeyObject(key);\n","import { concat, uint64be } from './buffer_utils.js';\nimport { checkIvLength } from './check_iv_length.js';\nimport { checkCekLength } from './check_cek_length.js';\nimport { JOSENotSupported, JWEDecryptionFailed, JWEInvalid } from '../util/errors.js';\nimport { checkEncCryptoKey } from './crypto_key.js';\nimport { invalidKeyInput } from './invalid_key_input.js';\nimport { isCryptoKey } from './is_key_like.js';\nasync function timingSafeEqual(a, b) {\n if (!(a instanceof Uint8Array)) {\n throw new TypeError('First argument must be a buffer');\n }\n if (!(b instanceof Uint8Array)) {\n throw new TypeError('Second argument must be a buffer');\n }\n const algorithm = { name: 'HMAC', hash: 'SHA-256' };\n const key = (await crypto.subtle.generateKey(algorithm, false, ['sign']));\n const aHmac = new Uint8Array(await crypto.subtle.sign(algorithm, key, a));\n const bHmac = new Uint8Array(await crypto.subtle.sign(algorithm, key, b));\n let out = 0;\n let i = -1;\n while (++i < 32) {\n out |= aHmac[i] ^ bHmac[i];\n }\n return out === 0;\n}\nasync function cbcDecrypt(enc, cek, ciphertext, iv, tag, aad) {\n if (!(cek instanceof Uint8Array)) {\n throw new TypeError(invalidKeyInput(cek, 'Uint8Array'));\n }\n const keySize = parseInt(enc.slice(1, 4), 10);\n const encKey = await crypto.subtle.importKey('raw', cek.subarray(keySize >> 3), 'AES-CBC', false, ['decrypt']);\n const macKey = await crypto.subtle.importKey('raw', cek.subarray(0, keySize >> 3), {\n hash: `SHA-${keySize << 1}`,\n name: 'HMAC',\n }, false, ['sign']);\n const macData = concat(aad, iv, ciphertext, uint64be(aad.length << 3));\n const expectedTag = new Uint8Array((await crypto.subtle.sign('HMAC', macKey, macData)).slice(0, keySize >> 3));\n let macCheckPassed;\n try {\n macCheckPassed = await timingSafeEqual(tag, expectedTag);\n }\n catch {\n }\n if (!macCheckPassed) {\n throw new JWEDecryptionFailed();\n }\n let plaintext;\n try {\n plaintext = new Uint8Array(await crypto.subtle.decrypt({ iv: iv, name: 'AES-CBC' }, encKey, ciphertext));\n }\n catch {\n }\n if (!plaintext) {\n throw new JWEDecryptionFailed();\n }\n return plaintext;\n}\nasync function gcmDecrypt(enc, cek, ciphertext, iv, tag, aad) {\n let encKey;\n if (cek instanceof Uint8Array) {\n encKey = await crypto.subtle.importKey('raw', cek, 'AES-GCM', false, ['decrypt']);\n }\n else {\n checkEncCryptoKey(cek, enc, 'decrypt');\n encKey = cek;\n }\n try {\n return new Uint8Array(await crypto.subtle.decrypt({\n additionalData: aad,\n iv: iv,\n name: 'AES-GCM',\n tagLength: 128,\n }, encKey, concat(ciphertext, tag)));\n }\n catch {\n throw new JWEDecryptionFailed();\n }\n}\nexport async function decrypt(enc, cek, ciphertext, iv, tag, aad) {\n if (!isCryptoKey(cek) && !(cek instanceof Uint8Array)) {\n throw new TypeError(invalidKeyInput(cek, 'CryptoKey', 'KeyObject', 'Uint8Array', 'JSON Web Key'));\n }\n if (!iv) {\n throw new JWEInvalid('JWE Initialization Vector missing');\n }\n if (!tag) {\n throw new JWEInvalid('JWE Authentication Tag missing');\n }\n checkIvLength(enc, iv);\n switch (enc) {\n case 'A128CBC-HS256':\n case 'A192CBC-HS384':\n case 'A256CBC-HS512':\n if (cek instanceof Uint8Array)\n checkCekLength(cek, parseInt(enc.slice(-3), 10));\n return cbcDecrypt(enc, cek, ciphertext, iv, tag, aad);\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM':\n if (cek instanceof Uint8Array)\n checkCekLength(cek, parseInt(enc.slice(1, 4), 10));\n return gcmDecrypt(enc, cek, ciphertext, iv, tag, aad);\n default:\n throw new JOSENotSupported('Unsupported JWE Content Encryption Algorithm');\n }\n}\n","export function isDisjoint(...headers) {\n const sources = headers.filter(Boolean);\n if (sources.length === 0 || sources.length === 1) {\n return true;\n }\n let acc;\n for (const header of sources) {\n const parameters = Object.keys(header);\n if (!acc || acc.size === 0) {\n acc = new Set(parameters);\n continue;\n }\n for (const parameter of parameters) {\n if (acc.has(parameter)) {\n return false;\n }\n acc.add(parameter);\n }\n }\n return true;\n}\n","const isObjectLike = (value) => typeof value === 'object' && value !== null;\nexport function isObject(input) {\n if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n return false;\n }\n if (Object.getPrototypeOf(input) === null) {\n return true;\n }\n let proto = input;\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n return Object.getPrototypeOf(input) === proto;\n}\n","import { checkEncCryptoKey } from './crypto_key.js';\nfunction checkKeySize(key, alg) {\n if (key.algorithm.length !== parseInt(alg.slice(1, 4), 10)) {\n throw new TypeError(`Invalid key size for alg: ${alg}`);\n }\n}\nfunction getCryptoKey(key, alg, usage) {\n if (key instanceof Uint8Array) {\n return crypto.subtle.importKey('raw', key, 'AES-KW', true, [usage]);\n }\n checkEncCryptoKey(key, alg, usage);\n return key;\n}\nexport async function wrap(alg, key, cek) {\n const cryptoKey = await getCryptoKey(key, alg, 'wrapKey');\n checkKeySize(cryptoKey, alg);\n const cryptoKeyCek = await crypto.subtle.importKey('raw', cek, { hash: 'SHA-256', name: 'HMAC' }, true, ['sign']);\n return new Uint8Array(await crypto.subtle.wrapKey('raw', cryptoKeyCek, cryptoKey, 'AES-KW'));\n}\nexport async function unwrap(alg, key, encryptedKey) {\n const cryptoKey = await getCryptoKey(key, alg, 'unwrapKey');\n checkKeySize(cryptoKey, alg);\n const cryptoKeyCek = await crypto.subtle.unwrapKey('raw', encryptedKey, cryptoKey, 'AES-KW', { hash: 'SHA-256', name: 'HMAC' }, true, ['sign']);\n return new Uint8Array(await crypto.subtle.exportKey('raw', cryptoKeyCek));\n}\n","export async function digest(algorithm, data) {\n const subtleDigest = `SHA-${algorithm.slice(-3)}`;\n return new Uint8Array(await crypto.subtle.digest(subtleDigest, data));\n}\n","import { encode, concat, uint32be } from './buffer_utils.js';\nimport { checkEncCryptoKey } from './crypto_key.js';\nimport { digest } from './digest.js';\nfunction lengthAndInput(input) {\n return concat(uint32be(input.length), input);\n}\nasync function concatKdf(Z, L, OtherInfo) {\n const dkLen = L >> 3;\n const hashLen = 32;\n const reps = Math.ceil(dkLen / hashLen);\n const dk = new Uint8Array(reps * hashLen);\n for (let i = 1; i <= reps; i++) {\n const hashInput = new Uint8Array(4 + Z.length + OtherInfo.length);\n hashInput.set(uint32be(i), 0);\n hashInput.set(Z, 4);\n hashInput.set(OtherInfo, 4 + Z.length);\n const hashResult = await digest('sha256', hashInput);\n dk.set(hashResult, (i - 1) * hashLen);\n }\n return dk.slice(0, dkLen);\n}\nexport async function deriveKey(publicKey, privateKey, algorithm, keyLength, apu = new Uint8Array(), apv = new Uint8Array()) {\n checkEncCryptoKey(publicKey, 'ECDH');\n checkEncCryptoKey(privateKey, 'ECDH', 'deriveBits');\n const algorithmID = lengthAndInput(encode(algorithm));\n const partyUInfo = lengthAndInput(apu);\n const partyVInfo = lengthAndInput(apv);\n const suppPubInfo = uint32be(keyLength);\n const suppPrivInfo = new Uint8Array();\n const otherInfo = concat(algorithmID, partyUInfo, partyVInfo, suppPubInfo, suppPrivInfo);\n const Z = new Uint8Array(await crypto.subtle.deriveBits({\n name: publicKey.algorithm.name,\n public: publicKey,\n }, privateKey, getEcdhBitLength(publicKey)));\n return concatKdf(Z, keyLength, otherInfo);\n}\nfunction getEcdhBitLength(publicKey) {\n if (publicKey.algorithm.name === 'X25519') {\n return 256;\n }\n return (Math.ceil(parseInt(publicKey.algorithm.namedCurve.slice(-3), 10) / 8) << 3);\n}\nexport function allowed(key) {\n switch (key.algorithm.namedCurve) {\n case 'P-256':\n case 'P-384':\n case 'P-521':\n return true;\n default:\n return key.algorithm.name === 'X25519';\n }\n}\n","import { encode as b64u } from '../util/base64url.js';\nimport * as aeskw from './aeskw.js';\nimport { checkEncCryptoKey } from './crypto_key.js';\nimport { concat, encode } from './buffer_utils.js';\nimport { JWEInvalid } from '../util/errors.js';\nfunction getCryptoKey(key, alg) {\n if (key instanceof Uint8Array) {\n return crypto.subtle.importKey('raw', key, 'PBKDF2', false, [\n 'deriveBits',\n ]);\n }\n checkEncCryptoKey(key, alg, 'deriveBits');\n return key;\n}\nconst concatSalt = (alg, p2sInput) => concat(encode(alg), Uint8Array.of(0x00), p2sInput);\nasync function deriveKey(p2s, alg, p2c, key) {\n if (!(p2s instanceof Uint8Array) || p2s.length < 8) {\n throw new JWEInvalid('PBES2 Salt Input must be 8 or more octets');\n }\n const salt = concatSalt(alg, p2s);\n const keylen = parseInt(alg.slice(13, 16), 10);\n const subtleAlg = {\n hash: `SHA-${alg.slice(8, 11)}`,\n iterations: p2c,\n name: 'PBKDF2',\n salt,\n };\n const cryptoKey = await getCryptoKey(key, alg);\n return new Uint8Array(await crypto.subtle.deriveBits(subtleAlg, cryptoKey, keylen));\n}\nexport async function wrap(alg, key, cek, p2c = 2048, p2s = crypto.getRandomValues(new Uint8Array(16))) {\n const derived = await deriveKey(p2s, alg, p2c, key);\n const encryptedKey = await aeskw.wrap(alg.slice(-6), derived, cek);\n return { encryptedKey, p2c, p2s: b64u(p2s) };\n}\nexport async function unwrap(alg, key, encryptedKey, p2c, p2s) {\n const derived = await deriveKey(p2s, alg, p2c, key);\n return aeskw.unwrap(alg.slice(-6), derived, encryptedKey);\n}\n","export function checkKeyLength(alg, key) {\n if (alg.startsWith('RS') || alg.startsWith('PS')) {\n const { modulusLength } = key.algorithm;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`);\n }\n }\n}\n","import { checkEncCryptoKey } from './crypto_key.js';\nimport { checkKeyLength } from './check_key_length.js';\nimport { JOSENotSupported } from '../util/errors.js';\nconst subtleAlgorithm = (alg) => {\n switch (alg) {\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n return 'RSA-OAEP';\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n};\nexport async function encrypt(alg, key, cek) {\n checkEncCryptoKey(key, alg, 'encrypt');\n checkKeyLength(alg, key);\n return new Uint8Array(await crypto.subtle.encrypt(subtleAlgorithm(alg), key, cek));\n}\nexport async function decrypt(alg, key, encryptedKey) {\n checkEncCryptoKey(key, alg, 'decrypt');\n checkKeyLength(alg, key);\n return new Uint8Array(await crypto.subtle.decrypt(subtleAlgorithm(alg), key, encryptedKey));\n}\n","import { JOSENotSupported } from '../util/errors.js';\nexport function cekLength(alg) {\n switch (alg) {\n case 'A128GCM':\n return 128;\n case 'A192GCM':\n return 192;\n case 'A256GCM':\n case 'A128CBC-HS256':\n return 256;\n case 'A192CBC-HS384':\n return 384;\n case 'A256CBC-HS512':\n return 512;\n default:\n throw new JOSENotSupported(`Unsupported JWE Algorithm: ${alg}`);\n }\n}\nexport const generateCek = (alg) => crypto.getRandomValues(new Uint8Array(cekLength(alg) >> 3));\n","import { invalidKeyInput } from './invalid_key_input.js';\nimport { encodeBase64, decodeBase64 } from '../lib/base64.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nconst formatPEM = (b64, descriptor) => {\n const newlined = (b64.match(/.{1,64}/g) || []).join('\\n');\n return `-----BEGIN ${descriptor}-----\\n${newlined}\\n-----END ${descriptor}-----`;\n};\nconst genericExport = async (keyType, keyFormat, key) => {\n if (isKeyObject(key)) {\n if (key.type !== keyType) {\n throw new TypeError(`key is not a ${keyType} key`);\n }\n return key.export({ format: 'pem', type: keyFormat });\n }\n if (!isCryptoKey(key)) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject'));\n }\n if (!key.extractable) {\n throw new TypeError('CryptoKey is not extractable');\n }\n if (key.type !== keyType) {\n throw new TypeError(`key is not a ${keyType} key`);\n }\n return formatPEM(encodeBase64(new Uint8Array(await crypto.subtle.exportKey(keyFormat, key))), `${keyType.toUpperCase()} KEY`);\n};\nexport const toSPKI = (key) => genericExport('public', 'spki', key);\nexport const toPKCS8 = (key) => genericExport('private', 'pkcs8', key);\nconst bytesEqual = (a, b) => {\n if (a.byteLength !== b.length)\n return false;\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n};\nconst createASN1State = (data) => ({ data, pos: 0 });\nconst parseLength = (state) => {\n const first = state.data[state.pos++];\n if (first & 0x80) {\n const lengthOfLen = first & 0x7f;\n let length = 0;\n for (let i = 0; i < lengthOfLen; i++) {\n length = (length << 8) | state.data[state.pos++];\n }\n return length;\n }\n return first;\n};\nconst skipElement = (state, count = 1) => {\n if (count <= 0)\n return;\n state.pos++;\n const length = parseLength(state);\n state.pos += length;\n if (count > 1) {\n skipElement(state, count - 1);\n }\n};\nconst expectTag = (state, expectedTag, errorMessage) => {\n if (state.data[state.pos++] !== expectedTag) {\n throw new Error(errorMessage);\n }\n};\nconst getSubarray = (state, length) => {\n const result = state.data.subarray(state.pos, state.pos + length);\n state.pos += length;\n return result;\n};\nconst parseAlgorithmOID = (state) => {\n expectTag(state, 0x06, 'Expected algorithm OID');\n const oidLen = parseLength(state);\n return getSubarray(state, oidLen);\n};\nfunction parsePKCS8Header(state) {\n expectTag(state, 0x30, 'Invalid PKCS#8 structure');\n parseLength(state);\n expectTag(state, 0x02, 'Expected version field');\n const verLen = parseLength(state);\n state.pos += verLen;\n expectTag(state, 0x30, 'Expected algorithm identifier');\n const algIdLen = parseLength(state);\n const algIdStart = state.pos;\n return { algIdStart, algIdLength: algIdLen };\n}\nfunction parseSPKIHeader(state) {\n expectTag(state, 0x30, 'Invalid SPKI structure');\n parseLength(state);\n expectTag(state, 0x30, 'Expected algorithm identifier');\n const algIdLen = parseLength(state);\n const algIdStart = state.pos;\n return { algIdStart, algIdLength: algIdLen };\n}\nconst parseECAlgorithmIdentifier = (state) => {\n const algOid = parseAlgorithmOID(state);\n if (bytesEqual(algOid, [0x2b, 0x65, 0x6e])) {\n return 'X25519';\n }\n if (!bytesEqual(algOid, [0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01])) {\n throw new Error('Unsupported key algorithm');\n }\n expectTag(state, 0x06, 'Expected curve OID');\n const curveOidLen = parseLength(state);\n const curveOid = getSubarray(state, curveOidLen);\n for (const { name, oid } of [\n { name: 'P-256', oid: [0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07] },\n { name: 'P-384', oid: [0x2b, 0x81, 0x04, 0x00, 0x22] },\n { name: 'P-521', oid: [0x2b, 0x81, 0x04, 0x00, 0x23] },\n ]) {\n if (bytesEqual(curveOid, oid)) {\n return name;\n }\n }\n throw new Error('Unsupported named curve');\n};\nconst genericImport = async (keyFormat, keyData, alg, options) => {\n let algorithm;\n let keyUsages;\n const isPublic = keyFormat === 'spki';\n const getSigUsages = () => (isPublic ? ['verify'] : ['sign']);\n const getEncUsages = () => isPublic ? ['encrypt', 'wrapKey'] : ['decrypt', 'unwrapKey'];\n switch (alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${alg.slice(-3)}` };\n keyUsages = getSigUsages();\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${alg.slice(-3)}` };\n keyUsages = getSigUsages();\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(alg.slice(-3), 10) || 1}`,\n };\n keyUsages = getEncUsages();\n break;\n case 'ES256':\n case 'ES384':\n case 'ES512': {\n const curveMap = { ES256: 'P-256', ES384: 'P-384', ES512: 'P-521' };\n algorithm = { name: 'ECDSA', namedCurve: curveMap[alg] };\n keyUsages = getSigUsages();\n break;\n }\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW': {\n try {\n const namedCurve = options.getNamedCurve(keyData);\n algorithm = namedCurve === 'X25519' ? { name: 'X25519' } : { name: 'ECDH', namedCurve };\n }\n catch (cause) {\n throw new JOSENotSupported('Invalid or unsupported key format');\n }\n keyUsages = isPublic ? [] : ['deriveBits'];\n break;\n }\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = getSigUsages();\n break;\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: alg };\n keyUsages = getSigUsages();\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported \"alg\" (Algorithm) value');\n }\n return crypto.subtle.importKey(keyFormat, keyData, algorithm, options?.extractable ?? (isPublic ? true : false), keyUsages);\n};\nconst processPEMData = (pem, pattern) => {\n return decodeBase64(pem.replace(pattern, ''));\n};\nexport const fromPKCS8 = (pem, alg, options) => {\n const keyData = processPEMData(pem, /(?:-----(?:BEGIN|END) PRIVATE KEY-----|\\s)/g);\n let opts = options;\n if (alg?.startsWith?.('ECDH-ES')) {\n opts ||= {};\n opts.getNamedCurve = (keyData) => {\n const state = createASN1State(keyData);\n parsePKCS8Header(state);\n return parseECAlgorithmIdentifier(state);\n };\n }\n return genericImport('pkcs8', keyData, alg, opts);\n};\nexport const fromSPKI = (pem, alg, options) => {\n const keyData = processPEMData(pem, /(?:-----(?:BEGIN|END) PUBLIC KEY-----|\\s)/g);\n let opts = options;\n if (alg?.startsWith?.('ECDH-ES')) {\n opts ||= {};\n opts.getNamedCurve = (keyData) => {\n const state = createASN1State(keyData);\n parseSPKIHeader(state);\n return parseECAlgorithmIdentifier(state);\n };\n }\n return genericImport('spki', keyData, alg, opts);\n};\nfunction spkiFromX509(buf) {\n const state = createASN1State(buf);\n expectTag(state, 0x30, 'Invalid certificate structure');\n parseLength(state);\n expectTag(state, 0x30, 'Invalid tbsCertificate structure');\n parseLength(state);\n if (buf[state.pos] === 0xa0) {\n skipElement(state, 6);\n }\n else {\n skipElement(state, 5);\n }\n const spkiStart = state.pos;\n expectTag(state, 0x30, 'Invalid SPKI structure');\n const spkiContentLen = parseLength(state);\n return buf.subarray(spkiStart, spkiStart + spkiContentLen + (state.pos - spkiStart));\n}\nfunction extractX509SPKI(x509) {\n const derBytes = processPEMData(x509, /(?:-----(?:BEGIN|END) CERTIFICATE-----|\\s)/g);\n return spkiFromX509(derBytes);\n}\nexport const fromX509 = (pem, alg, options) => {\n let spki;\n try {\n spki = extractX509SPKI(pem);\n }\n catch (cause) {\n throw new TypeError('Failed to parse the X.509 certificate', { cause });\n }\n return fromSPKI(formatPEM(encodeBase64(spki), 'PUBLIC KEY'), alg, options);\n};\n","import { JOSENotSupported } from '../util/errors.js';\nfunction subtleMapping(jwk) {\n let algorithm;\n let keyUsages;\n switch (jwk.kty) {\n case 'AKP': {\n switch (jwk.alg) {\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n algorithm = { name: jwk.alg };\n keyUsages = jwk.priv ? ['sign'] : ['verify'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'RSA': {\n switch (jwk.alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = { name: 'RSA-PSS', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = { name: 'RSASSA-PKCS1-v1_5', hash: `SHA-${jwk.alg.slice(-3)}` };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}`,\n };\n keyUsages = jwk.d ? ['decrypt', 'unwrapKey'] : ['encrypt', 'wrapKey'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'EC': {\n switch (jwk.alg) {\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: 'ECDH', namedCurve: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n case 'OKP': {\n switch (jwk.alg) {\n case 'Ed25519':\n case 'EdDSA':\n algorithm = { name: 'Ed25519' };\n keyUsages = jwk.d ? ['sign'] : ['verify'];\n break;\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n algorithm = { name: jwk.crv };\n keyUsages = jwk.d ? ['deriveBits'] : [];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"kty\" (Key Type) Parameter value');\n }\n return { algorithm, keyUsages };\n}\nexport async function jwkToKey(jwk) {\n if (!jwk.alg) {\n throw new TypeError('\"alg\" argument is required when \"jwk.alg\" is not present');\n }\n const { algorithm, keyUsages } = subtleMapping(jwk);\n const keyData = { ...jwk };\n if (keyData.kty !== 'AKP') {\n delete keyData.alg;\n }\n delete keyData.use;\n return crypto.subtle.importKey('jwk', keyData, algorithm, jwk.ext ?? (jwk.d || jwk.priv ? false : true), jwk.key_ops ?? keyUsages);\n}\n","import { decode as decodeBase64URL } from '../util/base64url.js';\nimport { fromSPKI, fromPKCS8, fromX509 } from '../lib/asn1.js';\nimport { jwkToKey } from '../lib/jwk_to_key.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isObject } from '../lib/is_object.js';\nexport async function importSPKI(spki, alg, options) {\n if (typeof spki !== 'string' || spki.indexOf('-----BEGIN PUBLIC KEY-----') !== 0) {\n throw new TypeError('\"spki\" must be SPKI formatted string');\n }\n return fromSPKI(spki, alg, options);\n}\nexport async function importX509(x509, alg, options) {\n if (typeof x509 !== 'string' || x509.indexOf('-----BEGIN CERTIFICATE-----') !== 0) {\n throw new TypeError('\"x509\" must be X.509 formatted string');\n }\n return fromX509(x509, alg, options);\n}\nexport async function importPKCS8(pkcs8, alg, options) {\n if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {\n throw new TypeError('\"pkcs8\" must be PKCS#8 formatted string');\n }\n return fromPKCS8(pkcs8, alg, options);\n}\nexport async function importJWK(jwk, alg, options) {\n if (!isObject(jwk)) {\n throw new TypeError('JWK must be an object');\n }\n let ext;\n alg ??= jwk.alg;\n ext ??= options?.extractable ?? jwk.ext;\n switch (jwk.kty) {\n case 'oct':\n if (typeof jwk.k !== 'string' || !jwk.k) {\n throw new TypeError('missing \"k\" (Key Value) Parameter value');\n }\n return decodeBase64URL(jwk.k);\n case 'RSA':\n if ('oth' in jwk && jwk.oth !== undefined) {\n throw new JOSENotSupported('RSA JWK \"oth\" (Other Primes Info) Parameter value is not supported');\n }\n return jwkToKey({ ...jwk, alg, ext });\n case 'AKP': {\n if (typeof jwk.alg !== 'string' || !jwk.alg) {\n throw new TypeError('missing \"alg\" (Algorithm) Parameter value');\n }\n if (alg !== undefined && alg !== jwk.alg) {\n throw new TypeError('JWK alg and alg option value mismatch');\n }\n return jwkToKey({ ...jwk, ext });\n }\n case 'EC':\n case 'OKP':\n return jwkToKey({ ...jwk, alg, ext });\n default:\n throw new JOSENotSupported('Unsupported \"kty\" (Key Type) Parameter value');\n }\n}\n","import { concat, uint64be } from './buffer_utils.js';\nimport { checkIvLength } from './check_iv_length.js';\nimport { checkCekLength } from './check_cek_length.js';\nimport { checkEncCryptoKey } from './crypto_key.js';\nimport { invalidKeyInput } from './invalid_key_input.js';\nimport { generateIv } from './iv.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { isCryptoKey } from './is_key_like.js';\nasync function cbcEncrypt(enc, plaintext, cek, iv, aad) {\n if (!(cek instanceof Uint8Array)) {\n throw new TypeError(invalidKeyInput(cek, 'Uint8Array'));\n }\n const keySize = parseInt(enc.slice(1, 4), 10);\n const encKey = await crypto.subtle.importKey('raw', cek.subarray(keySize >> 3), 'AES-CBC', false, ['encrypt']);\n const macKey = await crypto.subtle.importKey('raw', cek.subarray(0, keySize >> 3), {\n hash: `SHA-${keySize << 1}`,\n name: 'HMAC',\n }, false, ['sign']);\n const ciphertext = new Uint8Array(await crypto.subtle.encrypt({\n iv: iv,\n name: 'AES-CBC',\n }, encKey, plaintext));\n const macData = concat(aad, iv, ciphertext, uint64be(aad.length << 3));\n const tag = new Uint8Array((await crypto.subtle.sign('HMAC', macKey, macData)).slice(0, keySize >> 3));\n return { ciphertext, tag, iv };\n}\nasync function gcmEncrypt(enc, plaintext, cek, iv, aad) {\n let encKey;\n if (cek instanceof Uint8Array) {\n encKey = await crypto.subtle.importKey('raw', cek, 'AES-GCM', false, ['encrypt']);\n }\n else {\n checkEncCryptoKey(cek, enc, 'encrypt');\n encKey = cek;\n }\n const encrypted = new Uint8Array(await crypto.subtle.encrypt({\n additionalData: aad,\n iv: iv,\n name: 'AES-GCM',\n tagLength: 128,\n }, encKey, plaintext));\n const tag = encrypted.slice(-16);\n const ciphertext = encrypted.slice(0, -16);\n return { ciphertext, tag, iv };\n}\nexport async function encrypt(enc, plaintext, cek, iv, aad) {\n if (!isCryptoKey(cek) && !(cek instanceof Uint8Array)) {\n throw new TypeError(invalidKeyInput(cek, 'CryptoKey', 'KeyObject', 'Uint8Array', 'JSON Web Key'));\n }\n if (iv) {\n checkIvLength(enc, iv);\n }\n else {\n iv = generateIv(enc);\n }\n switch (enc) {\n case 'A128CBC-HS256':\n case 'A192CBC-HS384':\n case 'A256CBC-HS512':\n if (cek instanceof Uint8Array) {\n checkCekLength(cek, parseInt(enc.slice(-3), 10));\n }\n return cbcEncrypt(enc, plaintext, cek, iv, aad);\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM':\n if (cek instanceof Uint8Array) {\n checkCekLength(cek, parseInt(enc.slice(1, 4), 10));\n }\n return gcmEncrypt(enc, plaintext, cek, iv, aad);\n default:\n throw new JOSENotSupported('Unsupported JWE Content Encryption Algorithm');\n }\n}\n","import { encrypt } from './encrypt.js';\nimport { decrypt } from './decrypt.js';\nimport { encode as b64u } from '../util/base64url.js';\nexport async function wrap(alg, key, cek, iv) {\n const jweAlgorithm = alg.slice(0, 7);\n const wrapped = await encrypt(jweAlgorithm, cek, key, iv, new Uint8Array());\n return {\n encryptedKey: wrapped.ciphertext,\n iv: b64u(wrapped.iv),\n tag: b64u(wrapped.tag),\n };\n}\nexport async function unwrap(alg, key, encryptedKey, iv, tag) {\n const jweAlgorithm = alg.slice(0, 7);\n return decrypt(jweAlgorithm, key, encryptedKey, iv, tag, new Uint8Array());\n}\n","import * as aeskw from './aeskw.js';\nimport * as ecdhes from './ecdhes.js';\nimport * as pbes2kw from './pbes2kw.js';\nimport * as rsaes from './rsaes.js';\nimport { decode as b64u } from '../util/base64url.js';\nimport { JOSENotSupported, JWEInvalid } from '../util/errors.js';\nimport { cekLength } from '../lib/cek.js';\nimport { importJWK } from '../key/import.js';\nimport { isObject } from './is_object.js';\nimport { unwrap as aesGcmKw } from './aesgcmkw.js';\nimport { assertCryptoKey } from './is_key_like.js';\nexport async function decryptKeyManagement(alg, key, encryptedKey, joseHeader, options) {\n switch (alg) {\n case 'dir': {\n if (encryptedKey !== undefined)\n throw new JWEInvalid('Encountered unexpected JWE Encrypted Key');\n return key;\n }\n case 'ECDH-ES':\n if (encryptedKey !== undefined)\n throw new JWEInvalid('Encountered unexpected JWE Encrypted Key');\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW': {\n if (!isObject(joseHeader.epk))\n throw new JWEInvalid(`JOSE Header \"epk\" (Ephemeral Public Key) missing or invalid`);\n assertCryptoKey(key);\n if (!ecdhes.allowed(key))\n throw new JOSENotSupported('ECDH with the provided key is not allowed or not supported by your javascript runtime');\n const epk = await importJWK(joseHeader.epk, alg);\n assertCryptoKey(epk);\n let partyUInfo;\n let partyVInfo;\n if (joseHeader.apu !== undefined) {\n if (typeof joseHeader.apu !== 'string')\n throw new JWEInvalid(`JOSE Header \"apu\" (Agreement PartyUInfo) invalid`);\n try {\n partyUInfo = b64u(joseHeader.apu);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the apu');\n }\n }\n if (joseHeader.apv !== undefined) {\n if (typeof joseHeader.apv !== 'string')\n throw new JWEInvalid(`JOSE Header \"apv\" (Agreement PartyVInfo) invalid`);\n try {\n partyVInfo = b64u(joseHeader.apv);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the apv');\n }\n }\n const sharedSecret = await ecdhes.deriveKey(epk, key, alg === 'ECDH-ES' ? joseHeader.enc : alg, alg === 'ECDH-ES' ? cekLength(joseHeader.enc) : parseInt(alg.slice(-5, -2), 10), partyUInfo, partyVInfo);\n if (alg === 'ECDH-ES')\n return sharedSecret;\n if (encryptedKey === undefined)\n throw new JWEInvalid('JWE Encrypted Key missing');\n return aeskw.unwrap(alg.slice(-6), sharedSecret, encryptedKey);\n }\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n if (encryptedKey === undefined)\n throw new JWEInvalid('JWE Encrypted Key missing');\n assertCryptoKey(key);\n return rsaes.decrypt(alg, key, encryptedKey);\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW': {\n if (encryptedKey === undefined)\n throw new JWEInvalid('JWE Encrypted Key missing');\n if (typeof joseHeader.p2c !== 'number')\n throw new JWEInvalid(`JOSE Header \"p2c\" (PBES2 Count) missing or invalid`);\n const p2cLimit = options?.maxPBES2Count || 10_000;\n if (joseHeader.p2c > p2cLimit)\n throw new JWEInvalid(`JOSE Header \"p2c\" (PBES2 Count) out is of acceptable bounds`);\n if (typeof joseHeader.p2s !== 'string')\n throw new JWEInvalid(`JOSE Header \"p2s\" (PBES2 Salt) missing or invalid`);\n let p2s;\n try {\n p2s = b64u(joseHeader.p2s);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the p2s');\n }\n return pbes2kw.unwrap(alg, key, encryptedKey, joseHeader.p2c, p2s);\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n if (encryptedKey === undefined)\n throw new JWEInvalid('JWE Encrypted Key missing');\n return aeskw.unwrap(alg, key, encryptedKey);\n }\n case 'A128GCMKW':\n case 'A192GCMKW':\n case 'A256GCMKW': {\n if (encryptedKey === undefined)\n throw new JWEInvalid('JWE Encrypted Key missing');\n if (typeof joseHeader.iv !== 'string')\n throw new JWEInvalid(`JOSE Header \"iv\" (Initialization Vector) missing or invalid`);\n if (typeof joseHeader.tag !== 'string')\n throw new JWEInvalid(`JOSE Header \"tag\" (Authentication Tag) missing or invalid`);\n let iv;\n try {\n iv = b64u(joseHeader.iv);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the iv');\n }\n let tag;\n try {\n tag = b64u(joseHeader.tag);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the tag');\n }\n return aesGcmKw(alg, key, encryptedKey, iv, tag);\n }\n default: {\n throw new JOSENotSupported('Invalid or unsupported \"alg\" (JWE Algorithm) header value');\n }\n }\n}\n","import { JOSENotSupported, JWEInvalid, JWSInvalid } from '../util/errors.js';\nexport function validateCrit(Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) {\n if (joseHeader.crit !== undefined && protectedHeader?.crit === undefined) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be integrity protected');\n }\n if (!protectedHeader || protectedHeader.crit === undefined) {\n return new Set();\n }\n if (!Array.isArray(protectedHeader.crit) ||\n protectedHeader.crit.length === 0 ||\n protectedHeader.crit.some((input) => typeof input !== 'string' || input.length === 0)) {\n throw new Err('\"crit\" (Critical) Header Parameter MUST be an array of non-empty strings when present');\n }\n let recognized;\n if (recognizedOption !== undefined) {\n recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]);\n }\n else {\n recognized = recognizedDefault;\n }\n for (const parameter of protectedHeader.crit) {\n if (!recognized.has(parameter)) {\n throw new JOSENotSupported(`Extension Header Parameter \"${parameter}\" is not recognized`);\n }\n if (joseHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" is missing`);\n }\n if (recognized.get(parameter) && protectedHeader[parameter] === undefined) {\n throw new Err(`Extension Header Parameter \"${parameter}\" MUST be integrity protected`);\n }\n }\n return new Set(protectedHeader.crit);\n}\n","export function validateAlgorithms(option, algorithms) {\n if (algorithms !== undefined &&\n (!Array.isArray(algorithms) || algorithms.some((s) => typeof s !== 'string'))) {\n throw new TypeError(`\"${option}\" option must be an array of strings`);\n }\n if (!algorithms) {\n return undefined;\n }\n return new Set(algorithms);\n}\n","import { isObject } from './is_object.js';\nexport const isJWK = (key) => isObject(key) && typeof key.kty === 'string';\nexport const isPrivateJWK = (key) => key.kty !== 'oct' &&\n ((key.kty === 'AKP' && typeof key.priv === 'string') || typeof key.d === 'string');\nexport const isPublicJWK = (key) => key.kty !== 'oct' && key.d === undefined && key.priv === undefined;\nexport const isSecretJWK = (key) => key.kty === 'oct' && typeof key.k === 'string';\n","import { isJWK } from './is_jwk.js';\nimport { decode } from '../util/base64url.js';\nimport { jwkToKey } from './jwk_to_key.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nlet cache;\nconst handleJWK = async (key, jwk, alg, freeze = false) => {\n cache ||= new WeakMap();\n let cached = cache.get(key);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const cryptoKey = await jwkToKey({ ...jwk, alg });\n if (freeze)\n Object.freeze(key);\n if (!cached) {\n cache.set(key, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nconst handleKeyObject = (keyObject, alg) => {\n cache ||= new WeakMap();\n let cached = cache.get(keyObject);\n if (cached?.[alg]) {\n return cached[alg];\n }\n const isPublic = keyObject.type === 'public';\n const extractable = isPublic ? true : false;\n let cryptoKey;\n if (keyObject.asymmetricKeyType === 'x25519') {\n switch (alg) {\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW':\n break;\n default:\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ['deriveBits']);\n }\n if (keyObject.asymmetricKeyType === 'ed25519') {\n if (alg !== 'EdDSA' && alg !== 'Ed25519') {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n switch (keyObject.asymmetricKeyType) {\n case 'ml-dsa-44':\n case 'ml-dsa-65':\n case 'ml-dsa-87': {\n if (alg !== keyObject.asymmetricKeyType.toUpperCase()) {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [\n isPublic ? 'verify' : 'sign',\n ]);\n }\n }\n if (keyObject.asymmetricKeyType === 'rsa') {\n let hash;\n switch (alg) {\n case 'RSA-OAEP':\n hash = 'SHA-1';\n break;\n case 'RS256':\n case 'PS256':\n case 'RSA-OAEP-256':\n hash = 'SHA-256';\n break;\n case 'RS384':\n case 'PS384':\n case 'RSA-OAEP-384':\n hash = 'SHA-384';\n break;\n case 'RS512':\n case 'PS512':\n case 'RSA-OAEP-512':\n hash = 'SHA-512';\n break;\n default:\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (alg.startsWith('RSA-OAEP')) {\n return keyObject.toCryptoKey({\n name: 'RSA-OAEP',\n hash,\n }, extractable, isPublic ? ['encrypt'] : ['decrypt']);\n }\n cryptoKey = keyObject.toCryptoKey({\n name: alg.startsWith('PS') ? 'RSA-PSS' : 'RSASSA-PKCS1-v1_5',\n hash,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (keyObject.asymmetricKeyType === 'ec') {\n const nist = new Map([\n ['prime256v1', 'P-256'],\n ['secp384r1', 'P-384'],\n ['secp521r1', 'P-521'],\n ]);\n const namedCurve = nist.get(keyObject.asymmetricKeyDetails?.namedCurve);\n if (!namedCurve) {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (alg === 'ES256' && namedCurve === 'P-256') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg === 'ES384' && namedCurve === 'P-384') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg === 'ES512' && namedCurve === 'P-521') {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDSA',\n namedCurve,\n }, extractable, [isPublic ? 'verify' : 'sign']);\n }\n if (alg.startsWith('ECDH-ES')) {\n cryptoKey = keyObject.toCryptoKey({\n name: 'ECDH',\n namedCurve,\n }, extractable, isPublic ? [] : ['deriveBits']);\n }\n }\n if (!cryptoKey) {\n throw new TypeError('given KeyObject instance cannot be used for this algorithm');\n }\n if (!cached) {\n cache.set(keyObject, { [alg]: cryptoKey });\n }\n else {\n cached[alg] = cryptoKey;\n }\n return cryptoKey;\n};\nexport async function normalizeKey(key, alg) {\n if (key instanceof Uint8Array) {\n return key;\n }\n if (isCryptoKey(key)) {\n return key;\n }\n if (isKeyObject(key)) {\n if (key.type === 'secret') {\n return key.export();\n }\n if ('toCryptoKey' in key && typeof key.toCryptoKey === 'function') {\n try {\n return handleKeyObject(key, alg);\n }\n catch (err) {\n if (err instanceof TypeError) {\n throw err;\n }\n }\n }\n let jwk = key.export({ format: 'jwk' });\n return handleJWK(key, jwk, alg);\n }\n if (isJWK(key)) {\n if (key.k) {\n return decode(key.k);\n }\n return handleJWK(key, key, alg, true);\n }\n throw new Error('unreachable');\n}\n","import { withAlg as invalidKeyInput } from './invalid_key_input.js';\nimport { isKeyLike } from './is_key_like.js';\nimport * as jwk from './is_jwk.js';\nconst tag = (key) => key?.[Symbol.toStringTag];\nconst jwkMatchesOp = (alg, key, usage) => {\n if (key.use !== undefined) {\n let expected;\n switch (usage) {\n case 'sign':\n case 'verify':\n expected = 'sig';\n break;\n case 'encrypt':\n case 'decrypt':\n expected = 'enc';\n break;\n }\n if (key.use !== expected) {\n throw new TypeError(`Invalid key for this operation, its \"use\" must be \"${expected}\" when present`);\n }\n }\n if (key.alg !== undefined && key.alg !== alg) {\n throw new TypeError(`Invalid key for this operation, its \"alg\" must be \"${alg}\" when present`);\n }\n if (Array.isArray(key.key_ops)) {\n let expectedKeyOp;\n switch (true) {\n case usage === 'sign' || usage === 'verify':\n case alg === 'dir':\n case alg.includes('CBC-HS'):\n expectedKeyOp = usage;\n break;\n case alg.startsWith('PBES2'):\n expectedKeyOp = 'deriveBits';\n break;\n case /^A\\d{3}(?:GCM)?(?:KW)?$/.test(alg):\n if (!alg.includes('GCM') && alg.endsWith('KW')) {\n expectedKeyOp = usage === 'encrypt' ? 'wrapKey' : 'unwrapKey';\n }\n else {\n expectedKeyOp = usage;\n }\n break;\n case usage === 'encrypt' && alg.startsWith('RSA'):\n expectedKeyOp = 'wrapKey';\n break;\n case usage === 'decrypt':\n expectedKeyOp = alg.startsWith('RSA') ? 'unwrapKey' : 'deriveBits';\n break;\n }\n if (expectedKeyOp && key.key_ops?.includes?.(expectedKeyOp) === false) {\n throw new TypeError(`Invalid key for this operation, its \"key_ops\" must include \"${expectedKeyOp}\" when present`);\n }\n }\n return true;\n};\nconst symmetricTypeCheck = (alg, key, usage) => {\n if (key instanceof Uint8Array)\n return;\n if (jwk.isJWK(key)) {\n if (jwk.isSecretJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK \"kty\" (Key Type) equal to \"oct\" and the JWK \"k\" (Key Value) present`);\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key', 'Uint8Array'));\n }\n if (key.type !== 'secret') {\n throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type \"secret\"`);\n }\n};\nconst asymmetricTypeCheck = (alg, key, usage) => {\n if (jwk.isJWK(key)) {\n switch (usage) {\n case 'decrypt':\n case 'sign':\n if (jwk.isPrivateJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a private JWK`);\n case 'encrypt':\n case 'verify':\n if (jwk.isPublicJWK(key) && jwkMatchesOp(alg, key, usage))\n return;\n throw new TypeError(`JSON Web Key for this operation must be a public JWK`);\n }\n }\n if (!isKeyLike(key)) {\n throw new TypeError(invalidKeyInput(alg, key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n if (key.type === 'secret') {\n throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type \"secret\"`);\n }\n if (key.type === 'public') {\n switch (usage) {\n case 'sign':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type \"private\"`);\n case 'decrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type \"private\"`);\n }\n }\n if (key.type === 'private') {\n switch (usage) {\n case 'verify':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type \"public\"`);\n case 'encrypt':\n throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type \"public\"`);\n }\n }\n};\nexport function checkKeyType(alg, key, usage) {\n switch (alg.substring(0, 2)) {\n case 'A1':\n case 'A2':\n case 'di':\n case 'HS':\n case 'PB':\n symmetricTypeCheck(alg, key, usage);\n break;\n default:\n asymmetricTypeCheck(alg, key, usage);\n }\n}\n","import { decode as b64u } from '../../util/base64url.js';\nimport { decrypt } from '../../lib/decrypt.js';\nimport { JOSEAlgNotAllowed, JOSENotSupported, JWEInvalid } from '../../util/errors.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { isObject } from '../../lib/is_object.js';\nimport { decryptKeyManagement } from '../../lib/decrypt_key_management.js';\nimport { decoder, concat, encode } from '../../lib/buffer_utils.js';\nimport { generateCek } from '../../lib/cek.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { validateAlgorithms } from '../../lib/validate_algorithms.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nexport async function flattenedDecrypt(jwe, key, options) {\n if (!isObject(jwe)) {\n throw new JWEInvalid('Flattened JWE must be an object');\n }\n if (jwe.protected === undefined && jwe.header === undefined && jwe.unprotected === undefined) {\n throw new JWEInvalid('JOSE Header missing');\n }\n if (jwe.iv !== undefined && typeof jwe.iv !== 'string') {\n throw new JWEInvalid('JWE Initialization Vector incorrect type');\n }\n if (typeof jwe.ciphertext !== 'string') {\n throw new JWEInvalid('JWE Ciphertext missing or incorrect type');\n }\n if (jwe.tag !== undefined && typeof jwe.tag !== 'string') {\n throw new JWEInvalid('JWE Authentication Tag incorrect type');\n }\n if (jwe.protected !== undefined && typeof jwe.protected !== 'string') {\n throw new JWEInvalid('JWE Protected Header incorrect type');\n }\n if (jwe.encrypted_key !== undefined && typeof jwe.encrypted_key !== 'string') {\n throw new JWEInvalid('JWE Encrypted Key incorrect type');\n }\n if (jwe.aad !== undefined && typeof jwe.aad !== 'string') {\n throw new JWEInvalid('JWE AAD incorrect type');\n }\n if (jwe.header !== undefined && !isObject(jwe.header)) {\n throw new JWEInvalid('JWE Shared Unprotected Header incorrect type');\n }\n if (jwe.unprotected !== undefined && !isObject(jwe.unprotected)) {\n throw new JWEInvalid('JWE Per-Recipient Unprotected Header incorrect type');\n }\n let parsedProt;\n if (jwe.protected) {\n try {\n const protectedHeader = b64u(jwe.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWEInvalid('JWE Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jwe.header, jwe.unprotected)) {\n throw new JWEInvalid('JWE Protected, JWE Unprotected Header, and JWE Per-Recipient Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jwe.header,\n ...jwe.unprotected,\n };\n validateCrit(JWEInvalid, new Map(), options?.crit, parsedProt, joseHeader);\n if (joseHeader.zip !== undefined) {\n throw new JOSENotSupported('JWE \"zip\" (Compression Algorithm) Header Parameter is not supported.');\n }\n const { alg, enc } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWEInvalid('missing JWE Algorithm (alg) in JWE Header');\n }\n if (typeof enc !== 'string' || !enc) {\n throw new JWEInvalid('missing JWE Encryption Algorithm (enc) in JWE Header');\n }\n const keyManagementAlgorithms = options && validateAlgorithms('keyManagementAlgorithms', options.keyManagementAlgorithms);\n const contentEncryptionAlgorithms = options &&\n validateAlgorithms('contentEncryptionAlgorithms', options.contentEncryptionAlgorithms);\n if ((keyManagementAlgorithms && !keyManagementAlgorithms.has(alg)) ||\n (!keyManagementAlgorithms && alg.startsWith('PBES2'))) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (contentEncryptionAlgorithms && !contentEncryptionAlgorithms.has(enc)) {\n throw new JOSEAlgNotAllowed('\"enc\" (Encryption Algorithm) Header Parameter value not allowed');\n }\n let encryptedKey;\n if (jwe.encrypted_key !== undefined) {\n try {\n encryptedKey = b64u(jwe.encrypted_key);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the encrypted_key');\n }\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jwe);\n resolvedKey = true;\n }\n checkKeyType(alg === 'dir' ? enc : alg, key, 'decrypt');\n const k = await normalizeKey(key, alg);\n let cek;\n try {\n cek = await decryptKeyManagement(alg, k, encryptedKey, joseHeader, options);\n }\n catch (err) {\n if (err instanceof TypeError || err instanceof JWEInvalid || err instanceof JOSENotSupported) {\n throw err;\n }\n cek = generateCek(enc);\n }\n let iv;\n let tag;\n if (jwe.iv !== undefined) {\n try {\n iv = b64u(jwe.iv);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the iv');\n }\n }\n if (jwe.tag !== undefined) {\n try {\n tag = b64u(jwe.tag);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the tag');\n }\n }\n const protectedHeader = jwe.protected !== undefined ? encode(jwe.protected) : new Uint8Array();\n let additionalData;\n if (jwe.aad !== undefined) {\n additionalData = concat(protectedHeader, encode('.'), encode(jwe.aad));\n }\n else {\n additionalData = protectedHeader;\n }\n let ciphertext;\n try {\n ciphertext = b64u(jwe.ciphertext);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the ciphertext');\n }\n const plaintext = await decrypt(enc, cek, ciphertext, iv, tag, additionalData);\n const result = { plaintext };\n if (jwe.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jwe.aad !== undefined) {\n try {\n result.additionalAuthenticatedData = b64u(jwe.aad);\n }\n catch {\n throw new JWEInvalid('Failed to base64url decode the aad');\n }\n }\n if (jwe.unprotected !== undefined) {\n result.sharedUnprotectedHeader = jwe.unprotected;\n }\n if (jwe.header !== undefined) {\n result.unprotectedHeader = jwe.header;\n }\n if (resolvedKey) {\n return { ...result, key: k };\n }\n return result;\n}\n","import { flattenedDecrypt } from '../flattened/decrypt.js';\nimport { JWEInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactDecrypt(jwe, key, options) {\n if (jwe instanceof Uint8Array) {\n jwe = decoder.decode(jwe);\n }\n if (typeof jwe !== 'string') {\n throw new JWEInvalid('Compact JWE must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: encryptedKey, 2: iv, 3: ciphertext, 4: tag, length, } = jwe.split('.');\n if (length !== 5) {\n throw new JWEInvalid('Invalid Compact JWE');\n }\n const decrypted = await flattenedDecrypt({\n ciphertext,\n iv: iv || undefined,\n protected: protectedHeader,\n tag: tag || undefined,\n encrypted_key: encryptedKey || undefined,\n }, key, options);\n const result = { plaintext: decrypted.plaintext, protectedHeader: decrypted.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: decrypted.key };\n }\n return result;\n}\n","import { flattenedDecrypt } from '../flattened/decrypt.js';\nimport { JWEDecryptionFailed, JWEInvalid } from '../../util/errors.js';\nimport { isObject } from '../../lib/is_object.js';\nexport async function generalDecrypt(jwe, key, options) {\n if (!isObject(jwe)) {\n throw new JWEInvalid('General JWE must be an object');\n }\n if (!Array.isArray(jwe.recipients) || !jwe.recipients.every(isObject)) {\n throw new JWEInvalid('JWE Recipients missing or incorrect type');\n }\n if (!jwe.recipients.length) {\n throw new JWEInvalid('JWE Recipients has no members');\n }\n for (const recipient of jwe.recipients) {\n try {\n return await flattenedDecrypt({\n aad: jwe.aad,\n ciphertext: jwe.ciphertext,\n encrypted_key: recipient.encrypted_key,\n header: recipient.header,\n iv: jwe.iv,\n protected: jwe.protected,\n tag: jwe.tag,\n unprotected: jwe.unprotected,\n }, key, options);\n }\n catch {\n }\n }\n throw new JWEDecryptionFailed();\n}\n","export const unprotected = Symbol();\n","import { invalidKeyInput } from './invalid_key_input.js';\nimport { encode as b64u } from '../util/base64url.js';\nimport { isCryptoKey, isKeyObject } from './is_key_like.js';\nexport async function keyToJWK(key) {\n if (isKeyObject(key)) {\n if (key.type === 'secret') {\n key = key.export();\n }\n else {\n return key.export({ format: 'jwk' });\n }\n }\n if (key instanceof Uint8Array) {\n return {\n kty: 'oct',\n k: b64u(key),\n };\n }\n if (!isCryptoKey(key)) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'Uint8Array'));\n }\n if (!key.extractable) {\n throw new TypeError('non-extractable CryptoKey cannot be exported as a JWK');\n }\n const { ext, key_ops, alg, use, ...jwk } = await crypto.subtle.exportKey('jwk', key);\n if (jwk.kty === 'AKP') {\n ;\n jwk.alg = alg;\n }\n return jwk;\n}\n","import { toSPKI as exportPublic, toPKCS8 as exportPrivate } from '../lib/asn1.js';\nimport { keyToJWK } from '../lib/key_to_jwk.js';\nexport async function exportSPKI(key) {\n return exportPublic(key);\n}\nexport async function exportPKCS8(key) {\n return exportPrivate(key);\n}\nexport async function exportJWK(key) {\n return keyToJWK(key);\n}\n","import * as aeskw from './aeskw.js';\nimport * as ecdhes from './ecdhes.js';\nimport * as pbes2kw from './pbes2kw.js';\nimport * as rsaes from './rsaes.js';\nimport { encode as b64u } from '../util/base64url.js';\nimport { normalizeKey } from './normalize_key.js';\nimport { generateCek, cekLength } from '../lib/cek.js';\nimport { JOSENotSupported } from '../util/errors.js';\nimport { exportJWK } from '../key/export.js';\nimport { wrap as aesGcmKw } from './aesgcmkw.js';\nimport { assertCryptoKey } from './is_key_like.js';\nexport async function encryptKeyManagement(alg, enc, key, providedCek, providedParameters = {}) {\n let encryptedKey;\n let parameters;\n let cek;\n switch (alg) {\n case 'dir': {\n cek = key;\n break;\n }\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW': {\n assertCryptoKey(key);\n if (!ecdhes.allowed(key)) {\n throw new JOSENotSupported('ECDH with the provided key is not allowed or not supported by your javascript runtime');\n }\n const { apu, apv } = providedParameters;\n let ephemeralKey;\n if (providedParameters.epk) {\n ephemeralKey = (await normalizeKey(providedParameters.epk, alg));\n }\n else {\n ephemeralKey = (await crypto.subtle.generateKey(key.algorithm, true, ['deriveBits'])).privateKey;\n }\n const { x, y, crv, kty } = await exportJWK(ephemeralKey);\n const sharedSecret = await ecdhes.deriveKey(key, ephemeralKey, alg === 'ECDH-ES' ? enc : alg, alg === 'ECDH-ES' ? cekLength(enc) : parseInt(alg.slice(-5, -2), 10), apu, apv);\n parameters = { epk: { x, crv, kty } };\n if (kty === 'EC')\n parameters.epk.y = y;\n if (apu)\n parameters.apu = b64u(apu);\n if (apv)\n parameters.apv = b64u(apv);\n if (alg === 'ECDH-ES') {\n cek = sharedSecret;\n break;\n }\n cek = providedCek || generateCek(enc);\n const kwAlg = alg.slice(-6);\n encryptedKey = await aeskw.wrap(kwAlg, sharedSecret, cek);\n break;\n }\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512': {\n cek = providedCek || generateCek(enc);\n assertCryptoKey(key);\n encryptedKey = await rsaes.encrypt(alg, key, cek);\n break;\n }\n case 'PBES2-HS256+A128KW':\n case 'PBES2-HS384+A192KW':\n case 'PBES2-HS512+A256KW': {\n cek = providedCek || generateCek(enc);\n const { p2c, p2s } = providedParameters;\n ({ encryptedKey, ...parameters } = await pbes2kw.wrap(alg, key, cek, p2c, p2s));\n break;\n }\n case 'A128KW':\n case 'A192KW':\n case 'A256KW': {\n cek = providedCek || generateCek(enc);\n encryptedKey = await aeskw.wrap(alg, key, cek);\n break;\n }\n case 'A128GCMKW':\n case 'A192GCMKW':\n case 'A256GCMKW': {\n cek = providedCek || generateCek(enc);\n const { iv } = providedParameters;\n ({ encryptedKey, ...parameters } = await aesGcmKw(alg, key, cek, iv));\n break;\n }\n default: {\n throw new JOSENotSupported('Invalid or unsupported \"alg\" (JWE Algorithm) header value');\n }\n }\n return { cek, encryptedKey, parameters };\n}\n","import { encode as b64u } from '../../util/base64url.js';\nimport { unprotected } from '../../lib/private_symbols.js';\nimport { encrypt } from '../../lib/encrypt.js';\nimport { encryptKeyManagement } from '../../lib/encrypt_key_management.js';\nimport { JOSENotSupported, JWEInvalid } from '../../util/errors.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { concat, encode } from '../../lib/buffer_utils.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nexport class FlattenedEncrypt {\n #plaintext;\n #protectedHeader;\n #sharedUnprotectedHeader;\n #unprotectedHeader;\n #aad;\n #cek;\n #iv;\n #keyManagementParameters;\n constructor(plaintext) {\n if (!(plaintext instanceof Uint8Array)) {\n throw new TypeError('plaintext must be an instance of Uint8Array');\n }\n this.#plaintext = plaintext;\n }\n setKeyManagementParameters(parameters) {\n if (this.#keyManagementParameters) {\n throw new TypeError('setKeyManagementParameters can only be called once');\n }\n this.#keyManagementParameters = parameters;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setSharedUnprotectedHeader(sharedUnprotectedHeader) {\n if (this.#sharedUnprotectedHeader) {\n throw new TypeError('setSharedUnprotectedHeader can only be called once');\n }\n this.#sharedUnprotectedHeader = sharedUnprotectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.#unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.#unprotectedHeader = unprotectedHeader;\n return this;\n }\n setAdditionalAuthenticatedData(aad) {\n this.#aad = aad;\n return this;\n }\n setContentEncryptionKey(cek) {\n if (this.#cek) {\n throw new TypeError('setContentEncryptionKey can only be called once');\n }\n this.#cek = cek;\n return this;\n }\n setInitializationVector(iv) {\n if (this.#iv) {\n throw new TypeError('setInitializationVector can only be called once');\n }\n this.#iv = iv;\n return this;\n }\n async encrypt(key, options) {\n if (!this.#protectedHeader && !this.#unprotectedHeader && !this.#sharedUnprotectedHeader) {\n throw new JWEInvalid('either setProtectedHeader, setUnprotectedHeader, or sharedUnprotectedHeader must be called before #encrypt()');\n }\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader, this.#sharedUnprotectedHeader)) {\n throw new JWEInvalid('JWE Protected, JWE Shared Unprotected and JWE Per-Recipient Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n ...this.#sharedUnprotectedHeader,\n };\n validateCrit(JWEInvalid, new Map(), options?.crit, this.#protectedHeader, joseHeader);\n if (joseHeader.zip !== undefined) {\n throw new JOSENotSupported('JWE \"zip\" (Compression Algorithm) Header Parameter is not supported.');\n }\n const { alg, enc } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWEInvalid('JWE \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n if (typeof enc !== 'string' || !enc) {\n throw new JWEInvalid('JWE \"enc\" (Encryption Algorithm) Header Parameter missing or invalid');\n }\n let encryptedKey;\n if (this.#cek && (alg === 'dir' || alg === 'ECDH-ES')) {\n throw new TypeError(`setContentEncryptionKey cannot be called with JWE \"alg\" (Algorithm) Header ${alg}`);\n }\n checkKeyType(alg === 'dir' ? enc : alg, key, 'encrypt');\n let cek;\n {\n let parameters;\n const k = await normalizeKey(key, alg);\n ({ cek, encryptedKey, parameters } = await encryptKeyManagement(alg, enc, k, this.#cek, this.#keyManagementParameters));\n if (parameters) {\n if (options && unprotected in options) {\n if (!this.#unprotectedHeader) {\n this.setUnprotectedHeader(parameters);\n }\n else {\n this.#unprotectedHeader = { ...this.#unprotectedHeader, ...parameters };\n }\n }\n else if (!this.#protectedHeader) {\n this.setProtectedHeader(parameters);\n }\n else {\n this.#protectedHeader = { ...this.#protectedHeader, ...parameters };\n }\n }\n }\n let additionalData;\n let protectedHeaderS;\n let protectedHeaderB;\n let aadMember;\n if (this.#protectedHeader) {\n protectedHeaderS = b64u(JSON.stringify(this.#protectedHeader));\n protectedHeaderB = encode(protectedHeaderS);\n }\n else {\n protectedHeaderS = '';\n protectedHeaderB = new Uint8Array();\n }\n if (this.#aad) {\n aadMember = b64u(this.#aad);\n const aadMemberBytes = encode(aadMember);\n additionalData = concat(protectedHeaderB, encode('.'), aadMemberBytes);\n }\n else {\n additionalData = protectedHeaderB;\n }\n const { ciphertext, tag, iv } = await encrypt(enc, this.#plaintext, cek, this.#iv, additionalData);\n const jwe = {\n ciphertext: b64u(ciphertext),\n };\n if (iv) {\n jwe.iv = b64u(iv);\n }\n if (tag) {\n jwe.tag = b64u(tag);\n }\n if (encryptedKey) {\n jwe.encrypted_key = b64u(encryptedKey);\n }\n if (aadMember) {\n jwe.aad = aadMember;\n }\n if (this.#protectedHeader) {\n jwe.protected = protectedHeaderS;\n }\n if (this.#sharedUnprotectedHeader) {\n jwe.unprotected = this.#sharedUnprotectedHeader;\n }\n if (this.#unprotectedHeader) {\n jwe.header = this.#unprotectedHeader;\n }\n return jwe;\n }\n}\n","import { FlattenedEncrypt } from '../flattened/encrypt.js';\nimport { unprotected } from '../../lib/private_symbols.js';\nimport { JOSENotSupported, JWEInvalid } from '../../util/errors.js';\nimport { generateCek } from '../../lib/cek.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { encryptKeyManagement } from '../../lib/encrypt_key_management.js';\nimport { encode as b64u } from '../../util/base64url.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nclass IndividualRecipient {\n #parent;\n unprotectedHeader;\n keyManagementParameters;\n key;\n options;\n constructor(enc, key, options) {\n this.#parent = enc;\n this.key = key;\n this.options = options;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.unprotectedHeader = unprotectedHeader;\n return this;\n }\n setKeyManagementParameters(parameters) {\n if (this.keyManagementParameters) {\n throw new TypeError('setKeyManagementParameters can only be called once');\n }\n this.keyManagementParameters = parameters;\n return this;\n }\n addRecipient(...args) {\n return this.#parent.addRecipient(...args);\n }\n encrypt(...args) {\n return this.#parent.encrypt(...args);\n }\n done() {\n return this.#parent;\n }\n}\nexport class GeneralEncrypt {\n #plaintext;\n #recipients = [];\n #protectedHeader;\n #unprotectedHeader;\n #aad;\n constructor(plaintext) {\n this.#plaintext = plaintext;\n }\n addRecipient(key, options) {\n const recipient = new IndividualRecipient(this, key, { crit: options?.crit });\n this.#recipients.push(recipient);\n return recipient;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setSharedUnprotectedHeader(sharedUnprotectedHeader) {\n if (this.#unprotectedHeader) {\n throw new TypeError('setSharedUnprotectedHeader can only be called once');\n }\n this.#unprotectedHeader = sharedUnprotectedHeader;\n return this;\n }\n setAdditionalAuthenticatedData(aad) {\n this.#aad = aad;\n return this;\n }\n async encrypt() {\n if (!this.#recipients.length) {\n throw new JWEInvalid('at least one recipient must be added');\n }\n if (this.#recipients.length === 1) {\n const [recipient] = this.#recipients;\n const flattened = await new FlattenedEncrypt(this.#plaintext)\n .setAdditionalAuthenticatedData(this.#aad)\n .setProtectedHeader(this.#protectedHeader)\n .setSharedUnprotectedHeader(this.#unprotectedHeader)\n .setUnprotectedHeader(recipient.unprotectedHeader)\n .encrypt(recipient.key, { ...recipient.options });\n const jwe = {\n ciphertext: flattened.ciphertext,\n iv: flattened.iv,\n recipients: [{}],\n tag: flattened.tag,\n };\n if (flattened.aad)\n jwe.aad = flattened.aad;\n if (flattened.protected)\n jwe.protected = flattened.protected;\n if (flattened.unprotected)\n jwe.unprotected = flattened.unprotected;\n if (flattened.encrypted_key)\n jwe.recipients[0].encrypted_key = flattened.encrypted_key;\n if (flattened.header)\n jwe.recipients[0].header = flattened.header;\n return jwe;\n }\n let enc;\n for (let i = 0; i < this.#recipients.length; i++) {\n const recipient = this.#recipients[i];\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader, recipient.unprotectedHeader)) {\n throw new JWEInvalid('JWE Protected, JWE Shared Unprotected and JWE Per-Recipient Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n ...recipient.unprotectedHeader,\n };\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWEInvalid('JWE \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n if (alg === 'dir' || alg === 'ECDH-ES') {\n throw new JWEInvalid('\"dir\" and \"ECDH-ES\" alg may only be used with a single recipient');\n }\n if (typeof joseHeader.enc !== 'string' || !joseHeader.enc) {\n throw new JWEInvalid('JWE \"enc\" (Encryption Algorithm) Header Parameter missing or invalid');\n }\n if (!enc) {\n enc = joseHeader.enc;\n }\n else if (enc !== joseHeader.enc) {\n throw new JWEInvalid('JWE \"enc\" (Encryption Algorithm) Header Parameter must be the same for all recipients');\n }\n validateCrit(JWEInvalid, new Map(), recipient.options.crit, this.#protectedHeader, joseHeader);\n if (joseHeader.zip !== undefined) {\n throw new JOSENotSupported('JWE \"zip\" (Compression Algorithm) Header Parameter is not supported.');\n }\n }\n const cek = generateCek(enc);\n const jwe = {\n ciphertext: '',\n recipients: [],\n };\n for (let i = 0; i < this.#recipients.length; i++) {\n const recipient = this.#recipients[i];\n const target = {};\n jwe.recipients.push(target);\n if (i === 0) {\n const flattened = await new FlattenedEncrypt(this.#plaintext)\n .setAdditionalAuthenticatedData(this.#aad)\n .setContentEncryptionKey(cek)\n .setProtectedHeader(this.#protectedHeader)\n .setSharedUnprotectedHeader(this.#unprotectedHeader)\n .setUnprotectedHeader(recipient.unprotectedHeader)\n .setKeyManagementParameters(recipient.keyManagementParameters)\n .encrypt(recipient.key, {\n ...recipient.options,\n [unprotected]: true,\n });\n jwe.ciphertext = flattened.ciphertext;\n jwe.iv = flattened.iv;\n jwe.tag = flattened.tag;\n if (flattened.aad)\n jwe.aad = flattened.aad;\n if (flattened.protected)\n jwe.protected = flattened.protected;\n if (flattened.unprotected)\n jwe.unprotected = flattened.unprotected;\n target.encrypted_key = flattened.encrypted_key;\n if (flattened.header)\n target.header = flattened.header;\n continue;\n }\n const alg = recipient.unprotectedHeader?.alg ||\n this.#protectedHeader?.alg ||\n this.#unprotectedHeader?.alg;\n checkKeyType(alg === 'dir' ? enc : alg, recipient.key, 'encrypt');\n const k = await normalizeKey(recipient.key, alg);\n const { encryptedKey, parameters } = await encryptKeyManagement(alg, enc, k, cek, recipient.keyManagementParameters);\n target.encrypted_key = b64u(encryptedKey);\n if (recipient.unprotectedHeader || parameters)\n target.header = { ...recipient.unprotectedHeader, ...parameters };\n }\n return jwe;\n }\n}\n","import { JOSENotSupported } from '../util/errors.js';\nexport function subtleAlgorithm(alg, algorithm) {\n const hash = `SHA-${alg.slice(-3)}`;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n return { hash, name: 'HMAC' };\n case 'PS256':\n case 'PS384':\n case 'PS512':\n return { hash, name: 'RSA-PSS', saltLength: parseInt(alg.slice(-3), 10) >> 3 };\n case 'RS256':\n case 'RS384':\n case 'RS512':\n return { hash, name: 'RSASSA-PKCS1-v1_5' };\n case 'ES256':\n case 'ES384':\n case 'ES512':\n return { hash, name: 'ECDSA', namedCurve: algorithm.namedCurve };\n case 'Ed25519':\n case 'EdDSA':\n return { name: 'Ed25519' };\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87':\n return { name: alg };\n default:\n throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`);\n }\n}\n","import { checkSigCryptoKey } from './crypto_key.js';\nimport { invalidKeyInput } from './invalid_key_input.js';\nexport async function getSigKey(alg, key, usage) {\n if (key instanceof Uint8Array) {\n if (!alg.startsWith('HS')) {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n return crypto.subtle.importKey('raw', key, { hash: `SHA-${alg.slice(-3)}`, name: 'HMAC' }, false, [usage]);\n }\n checkSigCryptoKey(key, alg, usage);\n return key;\n}\n","import { subtleAlgorithm } from './subtle_dsa.js';\nimport { checkKeyLength } from './check_key_length.js';\nimport { getSigKey } from './get_sign_verify_key.js';\nexport async function verify(alg, key, signature, data) {\n const cryptoKey = await getSigKey(alg, key, 'verify');\n checkKeyLength(alg, cryptoKey);\n const algorithm = subtleAlgorithm(alg, cryptoKey.algorithm);\n try {\n return await crypto.subtle.verify(algorithm, cryptoKey, signature, data);\n }\n catch {\n return false;\n }\n}\n","import { decode as b64u } from '../../util/base64url.js';\nimport { verify } from '../../lib/verify.js';\nimport { JOSEAlgNotAllowed, JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { concat, encoder, decoder, encode } from '../../lib/buffer_utils.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { isObject } from '../../lib/is_object.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { validateAlgorithms } from '../../lib/validate_algorithms.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nexport async function flattenedVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('Flattened JWS must be an object');\n }\n if (jws.protected === undefined && jws.header === undefined) {\n throw new JWSInvalid('Flattened JWS must have either of the \"protected\" or \"header\" members');\n }\n if (jws.protected !== undefined && typeof jws.protected !== 'string') {\n throw new JWSInvalid('JWS Protected Header incorrect type');\n }\n if (jws.payload === undefined) {\n throw new JWSInvalid('JWS Payload missing');\n }\n if (typeof jws.signature !== 'string') {\n throw new JWSInvalid('JWS Signature missing or incorrect type');\n }\n if (jws.header !== undefined && !isObject(jws.header)) {\n throw new JWSInvalid('JWS Unprotected Header incorrect type');\n }\n let parsedProt = {};\n if (jws.protected) {\n try {\n const protectedHeader = b64u(jws.protected);\n parsedProt = JSON.parse(decoder.decode(protectedHeader));\n }\n catch {\n throw new JWSInvalid('JWS Protected Header is invalid');\n }\n }\n if (!isDisjoint(parsedProt, jws.header)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...parsedProt,\n ...jws.header,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, parsedProt, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = parsedProt.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n const algorithms = options && validateAlgorithms('algorithms', options.algorithms);\n if (algorithms && !algorithms.has(alg)) {\n throw new JOSEAlgNotAllowed('\"alg\" (Algorithm) Header Parameter value not allowed');\n }\n if (b64) {\n if (typeof jws.payload !== 'string') {\n throw new JWSInvalid('JWS Payload must be a string');\n }\n }\n else if (typeof jws.payload !== 'string' && !(jws.payload instanceof Uint8Array)) {\n throw new JWSInvalid('JWS Payload must be a string or an Uint8Array instance');\n }\n let resolvedKey = false;\n if (typeof key === 'function') {\n key = await key(parsedProt, jws);\n resolvedKey = true;\n }\n checkKeyType(alg, key, 'verify');\n const data = concat(jws.protected !== undefined ? encode(jws.protected) : new Uint8Array(), encode('.'), typeof jws.payload === 'string'\n ? b64\n ? encode(jws.payload)\n : encoder.encode(jws.payload)\n : jws.payload);\n let signature;\n try {\n signature = b64u(jws.signature);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the signature');\n }\n const k = await normalizeKey(key, alg);\n const verified = await verify(alg, k, signature, data);\n if (!verified) {\n throw new JWSSignatureVerificationFailed();\n }\n let payload;\n if (b64) {\n try {\n payload = b64u(jws.payload);\n }\n catch {\n throw new JWSInvalid('Failed to base64url decode the payload');\n }\n }\n else if (typeof jws.payload === 'string') {\n payload = encoder.encode(jws.payload);\n }\n else {\n payload = jws.payload;\n }\n const result = { payload };\n if (jws.protected !== undefined) {\n result.protectedHeader = parsedProt;\n }\n if (jws.header !== undefined) {\n result.unprotectedHeader = jws.header;\n }\n if (resolvedKey) {\n return { ...result, key: k };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { decoder } from '../../lib/buffer_utils.js';\nexport async function compactVerify(jws, key, options) {\n if (jws instanceof Uint8Array) {\n jws = decoder.decode(jws);\n }\n if (typeof jws !== 'string') {\n throw new JWSInvalid('Compact JWS must be a string or Uint8Array');\n }\n const { 0: protectedHeader, 1: payload, 2: signature, length } = jws.split('.');\n if (length !== 3) {\n throw new JWSInvalid('Invalid Compact JWS');\n }\n const verified = await flattenedVerify({ payload, protected: protectedHeader, signature }, key, options);\n const result = { payload: verified.payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { flattenedVerify } from '../flattened/verify.js';\nimport { JWSInvalid, JWSSignatureVerificationFailed } from '../../util/errors.js';\nimport { isObject } from '../../lib/is_object.js';\nexport async function generalVerify(jws, key, options) {\n if (!isObject(jws)) {\n throw new JWSInvalid('General JWS must be an object');\n }\n if (!Array.isArray(jws.signatures) || !jws.signatures.every(isObject)) {\n throw new JWSInvalid('JWS Signatures missing or incorrect type');\n }\n for (const signature of jws.signatures) {\n try {\n return await flattenedVerify({\n header: signature.header,\n payload: jws.payload,\n protected: signature.protected,\n signature: signature.signature,\n }, key, options);\n }\n catch {\n }\n }\n throw new JWSSignatureVerificationFailed();\n}\n","import { JWTClaimValidationFailed, JWTExpired, JWTInvalid } from '../util/errors.js';\nimport { encoder, decoder } from './buffer_utils.js';\nimport { isObject } from './is_object.js';\nconst epoch = (date) => Math.floor(date.getTime() / 1000);\nconst minute = 60;\nconst hour = minute * 60;\nconst day = hour * 24;\nconst week = day * 7;\nconst year = day * 365.25;\nconst REGEX = /^(\\+|\\-)? ?(\\d+|\\d+\\.\\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;\nexport function secs(str) {\n const matched = REGEX.exec(str);\n if (!matched || (matched[4] && matched[1])) {\n throw new TypeError('Invalid time period format');\n }\n const value = parseFloat(matched[2]);\n const unit = matched[3].toLowerCase();\n let numericDate;\n switch (unit) {\n case 'sec':\n case 'secs':\n case 'second':\n case 'seconds':\n case 's':\n numericDate = Math.round(value);\n break;\n case 'minute':\n case 'minutes':\n case 'min':\n case 'mins':\n case 'm':\n numericDate = Math.round(value * minute);\n break;\n case 'hour':\n case 'hours':\n case 'hr':\n case 'hrs':\n case 'h':\n numericDate = Math.round(value * hour);\n break;\n case 'day':\n case 'days':\n case 'd':\n numericDate = Math.round(value * day);\n break;\n case 'week':\n case 'weeks':\n case 'w':\n numericDate = Math.round(value * week);\n break;\n default:\n numericDate = Math.round(value * year);\n break;\n }\n if (matched[1] === '-' || matched[4] === 'ago') {\n return -numericDate;\n }\n return numericDate;\n}\nfunction validateInput(label, input) {\n if (!Number.isFinite(input)) {\n throw new TypeError(`Invalid ${label} input`);\n }\n return input;\n}\nconst normalizeTyp = (value) => {\n if (value.includes('/')) {\n return value.toLowerCase();\n }\n return `application/${value.toLowerCase()}`;\n};\nconst checkAudiencePresence = (audPayload, audOption) => {\n if (typeof audPayload === 'string') {\n return audOption.includes(audPayload);\n }\n if (Array.isArray(audPayload)) {\n return audOption.some(Set.prototype.has.bind(new Set(audPayload)));\n }\n return false;\n};\nexport function validateClaimsSet(protectedHeader, encodedPayload, options = {}) {\n let payload;\n try {\n payload = JSON.parse(decoder.decode(encodedPayload));\n }\n catch {\n }\n if (!isObject(payload)) {\n throw new JWTInvalid('JWT Claims Set must be a top-level JSON object');\n }\n const { typ } = options;\n if (typ &&\n (typeof protectedHeader.typ !== 'string' ||\n normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {\n throw new JWTClaimValidationFailed('unexpected \"typ\" JWT header value', payload, 'typ', 'check_failed');\n }\n const { requiredClaims = [], issuer, subject, audience, maxTokenAge } = options;\n const presenceCheck = [...requiredClaims];\n if (maxTokenAge !== undefined)\n presenceCheck.push('iat');\n if (audience !== undefined)\n presenceCheck.push('aud');\n if (subject !== undefined)\n presenceCheck.push('sub');\n if (issuer !== undefined)\n presenceCheck.push('iss');\n for (const claim of new Set(presenceCheck.reverse())) {\n if (!(claim in payload)) {\n throw new JWTClaimValidationFailed(`missing required \"${claim}\" claim`, payload, claim, 'missing');\n }\n }\n if (issuer &&\n !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {\n throw new JWTClaimValidationFailed('unexpected \"iss\" claim value', payload, 'iss', 'check_failed');\n }\n if (subject && payload.sub !== subject) {\n throw new JWTClaimValidationFailed('unexpected \"sub\" claim value', payload, 'sub', 'check_failed');\n }\n if (audience &&\n !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {\n throw new JWTClaimValidationFailed('unexpected \"aud\" claim value', payload, 'aud', 'check_failed');\n }\n let tolerance;\n switch (typeof options.clockTolerance) {\n case 'string':\n tolerance = secs(options.clockTolerance);\n break;\n case 'number':\n tolerance = options.clockTolerance;\n break;\n case 'undefined':\n tolerance = 0;\n break;\n default:\n throw new TypeError('Invalid clockTolerance option type');\n }\n const { currentDate } = options;\n const now = epoch(currentDate || new Date());\n if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {\n throw new JWTClaimValidationFailed('\"iat\" claim must be a number', payload, 'iat', 'invalid');\n }\n if (payload.nbf !== undefined) {\n if (typeof payload.nbf !== 'number') {\n throw new JWTClaimValidationFailed('\"nbf\" claim must be a number', payload, 'nbf', 'invalid');\n }\n if (payload.nbf > now + tolerance) {\n throw new JWTClaimValidationFailed('\"nbf\" claim timestamp check failed', payload, 'nbf', 'check_failed');\n }\n }\n if (payload.exp !== undefined) {\n if (typeof payload.exp !== 'number') {\n throw new JWTClaimValidationFailed('\"exp\" claim must be a number', payload, 'exp', 'invalid');\n }\n if (payload.exp <= now - tolerance) {\n throw new JWTExpired('\"exp\" claim timestamp check failed', payload, 'exp', 'check_failed');\n }\n }\n if (maxTokenAge) {\n const age = now - payload.iat;\n const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);\n if (age - tolerance > max) {\n throw new JWTExpired('\"iat\" claim timestamp check failed (too far in the past)', payload, 'iat', 'check_failed');\n }\n if (age < 0 - tolerance) {\n throw new JWTClaimValidationFailed('\"iat\" claim timestamp check failed (it should be in the past)', payload, 'iat', 'check_failed');\n }\n }\n return payload;\n}\nexport class JWTClaimsBuilder {\n #payload;\n constructor(payload) {\n if (!isObject(payload)) {\n throw new TypeError('JWT Claims Set MUST be an object');\n }\n this.#payload = structuredClone(payload);\n }\n data() {\n return encoder.encode(JSON.stringify(this.#payload));\n }\n get iss() {\n return this.#payload.iss;\n }\n set iss(value) {\n this.#payload.iss = value;\n }\n get sub() {\n return this.#payload.sub;\n }\n set sub(value) {\n this.#payload.sub = value;\n }\n get aud() {\n return this.#payload.aud;\n }\n set aud(value) {\n this.#payload.aud = value;\n }\n set jti(value) {\n this.#payload.jti = value;\n }\n set nbf(value) {\n if (typeof value === 'number') {\n this.#payload.nbf = validateInput('setNotBefore', value);\n }\n else if (value instanceof Date) {\n this.#payload.nbf = validateInput('setNotBefore', epoch(value));\n }\n else {\n this.#payload.nbf = epoch(new Date()) + secs(value);\n }\n }\n set exp(value) {\n if (typeof value === 'number') {\n this.#payload.exp = validateInput('setExpirationTime', value);\n }\n else if (value instanceof Date) {\n this.#payload.exp = validateInput('setExpirationTime', epoch(value));\n }\n else {\n this.#payload.exp = epoch(new Date()) + secs(value);\n }\n }\n set iat(value) {\n if (value === undefined) {\n this.#payload.iat = epoch(new Date());\n }\n else if (value instanceof Date) {\n this.#payload.iat = validateInput('setIssuedAt', epoch(value));\n }\n else if (typeof value === 'string') {\n this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value));\n }\n else {\n this.#payload.iat = validateInput('setIssuedAt', value);\n }\n }\n}\n","import { compactVerify } from '../jws/compact/verify.js';\nimport { validateClaimsSet } from '../lib/jwt_claims_set.js';\nimport { JWTInvalid } from '../util/errors.js';\nexport async function jwtVerify(jwt, key, options) {\n const verified = await compactVerify(jwt, key, options);\n if (verified.protectedHeader.crit?.includes('b64') && verified.protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n const payload = validateClaimsSet(verified.protectedHeader, verified.payload, options);\n const result = { payload, protectedHeader: verified.protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: verified.key };\n }\n return result;\n}\n","import { compactDecrypt } from '../jwe/compact/decrypt.js';\nimport { validateClaimsSet } from '../lib/jwt_claims_set.js';\nimport { JWTClaimValidationFailed } from '../util/errors.js';\nexport async function jwtDecrypt(jwt, key, options) {\n const decrypted = await compactDecrypt(jwt, key, options);\n const payload = validateClaimsSet(decrypted.protectedHeader, decrypted.plaintext, options);\n const { protectedHeader } = decrypted;\n if (protectedHeader.iss !== undefined && protectedHeader.iss !== payload.iss) {\n throw new JWTClaimValidationFailed('replicated \"iss\" claim header parameter mismatch', payload, 'iss', 'mismatch');\n }\n if (protectedHeader.sub !== undefined && protectedHeader.sub !== payload.sub) {\n throw new JWTClaimValidationFailed('replicated \"sub\" claim header parameter mismatch', payload, 'sub', 'mismatch');\n }\n if (protectedHeader.aud !== undefined &&\n JSON.stringify(protectedHeader.aud) !== JSON.stringify(payload.aud)) {\n throw new JWTClaimValidationFailed('replicated \"aud\" claim header parameter mismatch', payload, 'aud', 'mismatch');\n }\n const result = { payload, protectedHeader };\n if (typeof key === 'function') {\n return { ...result, key: decrypted.key };\n }\n return result;\n}\n","import { FlattenedEncrypt } from '../flattened/encrypt.js';\nexport class CompactEncrypt {\n #flattened;\n constructor(plaintext) {\n this.#flattened = new FlattenedEncrypt(plaintext);\n }\n setContentEncryptionKey(cek) {\n this.#flattened.setContentEncryptionKey(cek);\n return this;\n }\n setInitializationVector(iv) {\n this.#flattened.setInitializationVector(iv);\n return this;\n }\n setProtectedHeader(protectedHeader) {\n this.#flattened.setProtectedHeader(protectedHeader);\n return this;\n }\n setKeyManagementParameters(parameters) {\n this.#flattened.setKeyManagementParameters(parameters);\n return this;\n }\n async encrypt(key, options) {\n const jwe = await this.#flattened.encrypt(key, options);\n return [jwe.protected, jwe.encrypted_key, jwe.iv, jwe.ciphertext, jwe.tag].join('.');\n }\n}\n","import { subtleAlgorithm } from './subtle_dsa.js';\nimport { checkKeyLength } from './check_key_length.js';\nimport { getSigKey } from './get_sign_verify_key.js';\nexport async function sign(alg, key, data) {\n const cryptoKey = await getSigKey(alg, key, 'sign');\n checkKeyLength(alg, cryptoKey);\n const signature = await crypto.subtle.sign(subtleAlgorithm(alg, cryptoKey.algorithm), cryptoKey, data);\n return new Uint8Array(signature);\n}\n","import { encode as b64u } from '../../util/base64url.js';\nimport { sign } from '../../lib/sign.js';\nimport { isDisjoint } from '../../lib/is_disjoint.js';\nimport { JWSInvalid } from '../../util/errors.js';\nimport { concat, encode } from '../../lib/buffer_utils.js';\nimport { checkKeyType } from '../../lib/check_key_type.js';\nimport { validateCrit } from '../../lib/validate_crit.js';\nimport { normalizeKey } from '../../lib/normalize_key.js';\nexport class FlattenedSign {\n #payload;\n #protectedHeader;\n #unprotectedHeader;\n constructor(payload) {\n if (!(payload instanceof Uint8Array)) {\n throw new TypeError('payload must be an instance of Uint8Array');\n }\n this.#payload = payload;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.#unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.#unprotectedHeader = unprotectedHeader;\n return this;\n }\n async sign(key, options) {\n if (!this.#protectedHeader && !this.#unprotectedHeader) {\n throw new JWSInvalid('either setProtectedHeader or setUnprotectedHeader must be called before #sign()');\n }\n if (!isDisjoint(this.#protectedHeader, this.#unprotectedHeader)) {\n throw new JWSInvalid('JWS Protected and JWS Unprotected Header Parameter names must be disjoint');\n }\n const joseHeader = {\n ...this.#protectedHeader,\n ...this.#unprotectedHeader,\n };\n const extensions = validateCrit(JWSInvalid, new Map([['b64', true]]), options?.crit, this.#protectedHeader, joseHeader);\n let b64 = true;\n if (extensions.has('b64')) {\n b64 = this.#protectedHeader.b64;\n if (typeof b64 !== 'boolean') {\n throw new JWSInvalid('The \"b64\" (base64url-encode payload) Header Parameter must be a boolean');\n }\n }\n const { alg } = joseHeader;\n if (typeof alg !== 'string' || !alg) {\n throw new JWSInvalid('JWS \"alg\" (Algorithm) Header Parameter missing or invalid');\n }\n checkKeyType(alg, key, 'sign');\n let payloadS;\n let payloadB;\n if (b64) {\n payloadS = b64u(this.#payload);\n payloadB = encode(payloadS);\n }\n else {\n payloadB = this.#payload;\n payloadS = '';\n }\n let protectedHeaderString;\n let protectedHeaderBytes;\n if (this.#protectedHeader) {\n protectedHeaderString = b64u(JSON.stringify(this.#protectedHeader));\n protectedHeaderBytes = encode(protectedHeaderString);\n }\n else {\n protectedHeaderString = '';\n protectedHeaderBytes = new Uint8Array();\n }\n const data = concat(protectedHeaderBytes, encode('.'), payloadB);\n const k = await normalizeKey(key, alg);\n const signature = await sign(alg, k, data);\n const jws = {\n signature: b64u(signature),\n payload: payloadS,\n };\n if (this.#unprotectedHeader) {\n jws.header = this.#unprotectedHeader;\n }\n if (this.#protectedHeader) {\n jws.protected = protectedHeaderString;\n }\n return jws;\n }\n}\n","import { FlattenedSign } from '../flattened/sign.js';\nexport class CompactSign {\n #flattened;\n constructor(payload) {\n this.#flattened = new FlattenedSign(payload);\n }\n setProtectedHeader(protectedHeader) {\n this.#flattened.setProtectedHeader(protectedHeader);\n return this;\n }\n async sign(key, options) {\n const jws = await this.#flattened.sign(key, options);\n if (jws.payload === undefined) {\n throw new TypeError('use the flattened module for creating JWS with b64: false');\n }\n return `${jws.protected}.${jws.payload}.${jws.signature}`;\n }\n}\n","import { FlattenedSign } from '../flattened/sign.js';\nimport { JWSInvalid } from '../../util/errors.js';\nclass IndividualSignature {\n #parent;\n protectedHeader;\n unprotectedHeader;\n options;\n key;\n constructor(sig, key, options) {\n this.#parent = sig;\n this.key = key;\n this.options = options;\n }\n setProtectedHeader(protectedHeader) {\n if (this.protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.protectedHeader = protectedHeader;\n return this;\n }\n setUnprotectedHeader(unprotectedHeader) {\n if (this.unprotectedHeader) {\n throw new TypeError('setUnprotectedHeader can only be called once');\n }\n this.unprotectedHeader = unprotectedHeader;\n return this;\n }\n addSignature(...args) {\n return this.#parent.addSignature(...args);\n }\n sign(...args) {\n return this.#parent.sign(...args);\n }\n done() {\n return this.#parent;\n }\n}\nexport class GeneralSign {\n #payload;\n #signatures = [];\n constructor(payload) {\n this.#payload = payload;\n }\n addSignature(key, options) {\n const signature = new IndividualSignature(this, key, options);\n this.#signatures.push(signature);\n return signature;\n }\n async sign() {\n if (!this.#signatures.length) {\n throw new JWSInvalid('at least one signature must be added');\n }\n const jws = {\n signatures: [],\n payload: '',\n };\n for (let i = 0; i < this.#signatures.length; i++) {\n const signature = this.#signatures[i];\n const flattened = new FlattenedSign(this.#payload);\n flattened.setProtectedHeader(signature.protectedHeader);\n flattened.setUnprotectedHeader(signature.unprotectedHeader);\n const { payload, ...rest } = await flattened.sign(signature.key, signature.options);\n if (i === 0) {\n jws.payload = payload;\n }\n else if (jws.payload !== payload) {\n throw new JWSInvalid('inconsistent use of JWS Unencoded Payload (RFC7797)');\n }\n jws.signatures.push(rest);\n }\n return jws;\n }\n}\n","import { CompactSign } from '../jws/compact/sign.js';\nimport { JWTInvalid } from '../util/errors.js';\nimport { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class SignJWT {\n #protectedHeader;\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n this.#protectedHeader = protectedHeader;\n return this;\n }\n async sign(key, options) {\n const sig = new CompactSign(this.#jwt.data());\n sig.setProtectedHeader(this.#protectedHeader);\n if (Array.isArray(this.#protectedHeader?.crit) &&\n this.#protectedHeader.crit.includes('b64') &&\n this.#protectedHeader.b64 === false) {\n throw new JWTInvalid('JWTs MUST NOT use unencoded payload');\n }\n return sig.sign(key, options);\n }\n}\n","import { CompactEncrypt } from '../jwe/compact/encrypt.js';\nimport { JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class EncryptJWT {\n #cek;\n #iv;\n #keyManagementParameters;\n #protectedHeader;\n #replicateIssuerAsHeader;\n #replicateSubjectAsHeader;\n #replicateAudienceAsHeader;\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n setProtectedHeader(protectedHeader) {\n if (this.#protectedHeader) {\n throw new TypeError('setProtectedHeader can only be called once');\n }\n this.#protectedHeader = protectedHeader;\n return this;\n }\n setKeyManagementParameters(parameters) {\n if (this.#keyManagementParameters) {\n throw new TypeError('setKeyManagementParameters can only be called once');\n }\n this.#keyManagementParameters = parameters;\n return this;\n }\n setContentEncryptionKey(cek) {\n if (this.#cek) {\n throw new TypeError('setContentEncryptionKey can only be called once');\n }\n this.#cek = cek;\n return this;\n }\n setInitializationVector(iv) {\n if (this.#iv) {\n throw new TypeError('setInitializationVector can only be called once');\n }\n this.#iv = iv;\n return this;\n }\n replicateIssuerAsHeader() {\n this.#replicateIssuerAsHeader = true;\n return this;\n }\n replicateSubjectAsHeader() {\n this.#replicateSubjectAsHeader = true;\n return this;\n }\n replicateAudienceAsHeader() {\n this.#replicateAudienceAsHeader = true;\n return this;\n }\n async encrypt(key, options) {\n const enc = new CompactEncrypt(this.#jwt.data());\n if (this.#protectedHeader &&\n (this.#replicateIssuerAsHeader ||\n this.#replicateSubjectAsHeader ||\n this.#replicateAudienceAsHeader)) {\n this.#protectedHeader = {\n ...this.#protectedHeader,\n iss: this.#replicateIssuerAsHeader ? this.#jwt.iss : undefined,\n sub: this.#replicateSubjectAsHeader ? this.#jwt.sub : undefined,\n aud: this.#replicateAudienceAsHeader ? this.#jwt.aud : undefined,\n };\n }\n enc.setProtectedHeader(this.#protectedHeader);\n if (this.#iv) {\n enc.setInitializationVector(this.#iv);\n }\n if (this.#cek) {\n enc.setContentEncryptionKey(this.#cek);\n }\n if (this.#keyManagementParameters) {\n enc.setKeyManagementParameters(this.#keyManagementParameters);\n }\n return enc.encrypt(key, options);\n }\n}\n","import { digest } from '../lib/digest.js';\nimport { encode as b64u } from '../util/base64url.js';\nimport { JOSENotSupported, JWKInvalid } from '../util/errors.js';\nimport { encode } from '../lib/buffer_utils.js';\nimport { isKeyLike } from '../lib/is_key_like.js';\nimport { isJWK } from '../lib/is_jwk.js';\nimport { exportJWK } from '../key/export.js';\nimport { invalidKeyInput } from '../lib/invalid_key_input.js';\nconst check = (value, description) => {\n if (typeof value !== 'string' || !value) {\n throw new JWKInvalid(`${description} missing or invalid`);\n }\n};\nexport async function calculateJwkThumbprint(key, digestAlgorithm) {\n let jwk;\n if (isJWK(key)) {\n jwk = key;\n }\n else if (isKeyLike(key)) {\n jwk = await exportJWK(key);\n }\n else {\n throw new TypeError(invalidKeyInput(key, 'CryptoKey', 'KeyObject', 'JSON Web Key'));\n }\n digestAlgorithm ??= 'sha256';\n if (digestAlgorithm !== 'sha256' &&\n digestAlgorithm !== 'sha384' &&\n digestAlgorithm !== 'sha512') {\n throw new TypeError('digestAlgorithm must one of \"sha256\", \"sha384\", or \"sha512\"');\n }\n let components;\n switch (jwk.kty) {\n case 'AKP':\n check(jwk.alg, '\"alg\" (Algorithm) Parameter');\n check(jwk.pub, '\"pub\" (Public key) Parameter');\n components = { alg: jwk.alg, kty: jwk.kty, pub: jwk.pub };\n break;\n case 'EC':\n check(jwk.crv, '\"crv\" (Curve) Parameter');\n check(jwk.x, '\"x\" (X Coordinate) Parameter');\n check(jwk.y, '\"y\" (Y Coordinate) Parameter');\n components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x, y: jwk.y };\n break;\n case 'OKP':\n check(jwk.crv, '\"crv\" (Subtype of Key Pair) Parameter');\n check(jwk.x, '\"x\" (Public Key) Parameter');\n components = { crv: jwk.crv, kty: jwk.kty, x: jwk.x };\n break;\n case 'RSA':\n check(jwk.e, '\"e\" (Exponent) Parameter');\n check(jwk.n, '\"n\" (Modulus) Parameter');\n components = { e: jwk.e, kty: jwk.kty, n: jwk.n };\n break;\n case 'oct':\n check(jwk.k, '\"k\" (Key Value) Parameter');\n components = { k: jwk.k, kty: jwk.kty };\n break;\n default:\n throw new JOSENotSupported('\"kty\" (Key Type) Parameter missing or unsupported');\n }\n const data = encode(JSON.stringify(components));\n return b64u(await digest(digestAlgorithm, data));\n}\nexport async function calculateJwkThumbprintUri(key, digestAlgorithm) {\n digestAlgorithm ??= 'sha256';\n const thumbprint = await calculateJwkThumbprint(key, digestAlgorithm);\n return `urn:ietf:params:oauth:jwk-thumbprint:sha-${digestAlgorithm.slice(-3)}:${thumbprint}`;\n}\n","import { importJWK } from '../key/import.js';\nimport { isObject } from '../lib/is_object.js';\nimport { JWSInvalid } from '../util/errors.js';\nexport async function EmbeddedJWK(protectedHeader, token) {\n const joseHeader = {\n ...protectedHeader,\n ...token?.header,\n };\n if (!isObject(joseHeader.jwk)) {\n throw new JWSInvalid('\"jwk\" (JSON Web Key) Header Parameter must be a JSON object');\n }\n const key = await importJWK({ ...joseHeader.jwk, ext: true }, joseHeader.alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWSInvalid('\"jwk\" (JSON Web Key) Header Parameter must be a public key');\n }\n return key;\n}\n","import { importJWK } from '../key/import.js';\nimport { JWKSInvalid, JOSENotSupported, JWKSNoMatchingKey, JWKSMultipleMatchingKeys, } from '../util/errors.js';\nimport { isObject } from '../lib/is_object.js';\nfunction getKtyFromAlg(alg) {\n switch (typeof alg === 'string' && alg.slice(0, 2)) {\n case 'RS':\n case 'PS':\n return 'RSA';\n case 'ES':\n return 'EC';\n case 'Ed':\n return 'OKP';\n case 'ML':\n return 'AKP';\n default:\n throw new JOSENotSupported('Unsupported \"alg\" value for a JSON Web Key Set');\n }\n}\nfunction isJWKSLike(jwks) {\n return (jwks &&\n typeof jwks === 'object' &&\n Array.isArray(jwks.keys) &&\n jwks.keys.every(isJWKLike));\n}\nfunction isJWKLike(key) {\n return isObject(key);\n}\nclass LocalJWKSet {\n #jwks;\n #cached = new WeakMap();\n constructor(jwks) {\n if (!isJWKSLike(jwks)) {\n throw new JWKSInvalid('JSON Web Key Set malformed');\n }\n this.#jwks = structuredClone(jwks);\n }\n jwks() {\n return this.#jwks;\n }\n async getKey(protectedHeader, token) {\n const { alg, kid } = { ...protectedHeader, ...token?.header };\n const kty = getKtyFromAlg(alg);\n const candidates = this.#jwks.keys.filter((jwk) => {\n let candidate = kty === jwk.kty;\n if (candidate && typeof kid === 'string') {\n candidate = kid === jwk.kid;\n }\n if (candidate && (typeof jwk.alg === 'string' || kty === 'AKP')) {\n candidate = alg === jwk.alg;\n }\n if (candidate && typeof jwk.use === 'string') {\n candidate = jwk.use === 'sig';\n }\n if (candidate && Array.isArray(jwk.key_ops)) {\n candidate = jwk.key_ops.includes('verify');\n }\n if (candidate) {\n switch (alg) {\n case 'ES256':\n candidate = jwk.crv === 'P-256';\n break;\n case 'ES384':\n candidate = jwk.crv === 'P-384';\n break;\n case 'ES512':\n candidate = jwk.crv === 'P-521';\n break;\n case 'Ed25519':\n case 'EdDSA':\n candidate = jwk.crv === 'Ed25519';\n break;\n }\n }\n return candidate;\n });\n const { 0: jwk, length } = candidates;\n if (length === 0) {\n throw new JWKSNoMatchingKey();\n }\n if (length !== 1) {\n const error = new JWKSMultipleMatchingKeys();\n const _cached = this.#cached;\n error[Symbol.asyncIterator] = async function* () {\n for (const jwk of candidates) {\n try {\n yield await importWithAlgCache(_cached, jwk, alg);\n }\n catch { }\n }\n };\n throw error;\n }\n return importWithAlgCache(this.#cached, jwk, alg);\n }\n}\nasync function importWithAlgCache(cache, jwk, alg) {\n const cached = cache.get(jwk) || cache.set(jwk, {}).get(jwk);\n if (cached[alg] === undefined) {\n const key = await importJWK({ ...jwk, ext: true }, alg);\n if (key instanceof Uint8Array || key.type !== 'public') {\n throw new JWKSInvalid('JSON Web Key Set members must be public keys');\n }\n cached[alg] = key;\n }\n return cached[alg];\n}\nexport function createLocalJWKSet(jwks) {\n const set = new LocalJWKSet(jwks);\n const localJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(localJWKSet, {\n jwks: {\n value: () => structuredClone(set.jwks()),\n enumerable: false,\n configurable: false,\n writable: false,\n },\n });\n return localJWKSet;\n}\n","import { JOSEError, JWKSNoMatchingKey, JWKSTimeout } from '../util/errors.js';\nimport { createLocalJWKSet } from './local.js';\nimport { isObject } from '../lib/is_object.js';\nfunction isCloudflareWorkers() {\n return (typeof WebSocketPair !== 'undefined' ||\n (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') ||\n (typeof EdgeRuntime !== 'undefined' && EdgeRuntime === 'vercel'));\n}\nlet USER_AGENT;\nif (typeof navigator === 'undefined' || !navigator.userAgent?.startsWith?.('Mozilla/5.0 ')) {\n const NAME = 'jose';\n const VERSION = 'v6.1.3';\n USER_AGENT = `${NAME}/${VERSION}`;\n}\nexport const customFetch = Symbol();\nasync function fetchJwks(url, headers, signal, fetchImpl = fetch) {\n const response = await fetchImpl(url, {\n method: 'GET',\n signal,\n redirect: 'manual',\n headers,\n }).catch((err) => {\n if (err.name === 'TimeoutError') {\n throw new JWKSTimeout();\n }\n throw err;\n });\n if (response.status !== 200) {\n throw new JOSEError('Expected 200 OK from the JSON Web Key Set HTTP response');\n }\n try {\n return await response.json();\n }\n catch {\n throw new JOSEError('Failed to parse the JSON Web Key Set HTTP response as JSON');\n }\n}\nexport const jwksCache = Symbol();\nfunction isFreshJwksCache(input, cacheMaxAge) {\n if (typeof input !== 'object' || input === null) {\n return false;\n }\n if (!('uat' in input) || typeof input.uat !== 'number' || Date.now() - input.uat >= cacheMaxAge) {\n return false;\n }\n if (!('jwks' in input) ||\n !isObject(input.jwks) ||\n !Array.isArray(input.jwks.keys) ||\n !Array.prototype.every.call(input.jwks.keys, isObject)) {\n return false;\n }\n return true;\n}\nclass RemoteJWKSet {\n #url;\n #timeoutDuration;\n #cooldownDuration;\n #cacheMaxAge;\n #jwksTimestamp;\n #pendingFetch;\n #headers;\n #customFetch;\n #local;\n #cache;\n constructor(url, options) {\n if (!(url instanceof URL)) {\n throw new TypeError('url must be an instance of URL');\n }\n this.#url = new URL(url.href);\n this.#timeoutDuration =\n typeof options?.timeoutDuration === 'number' ? options?.timeoutDuration : 5000;\n this.#cooldownDuration =\n typeof options?.cooldownDuration === 'number' ? options?.cooldownDuration : 30000;\n this.#cacheMaxAge = typeof options?.cacheMaxAge === 'number' ? options?.cacheMaxAge : 600000;\n this.#headers = new Headers(options?.headers);\n if (USER_AGENT && !this.#headers.has('User-Agent')) {\n this.#headers.set('User-Agent', USER_AGENT);\n }\n if (!this.#headers.has('accept')) {\n this.#headers.set('accept', 'application/json');\n this.#headers.append('accept', 'application/jwk-set+json');\n }\n this.#customFetch = options?.[customFetch];\n if (options?.[jwksCache] !== undefined) {\n this.#cache = options?.[jwksCache];\n if (isFreshJwksCache(options?.[jwksCache], this.#cacheMaxAge)) {\n this.#jwksTimestamp = this.#cache.uat;\n this.#local = createLocalJWKSet(this.#cache.jwks);\n }\n }\n }\n pendingFetch() {\n return !!this.#pendingFetch;\n }\n coolingDown() {\n return typeof this.#jwksTimestamp === 'number'\n ? Date.now() < this.#jwksTimestamp + this.#cooldownDuration\n : false;\n }\n fresh() {\n return typeof this.#jwksTimestamp === 'number'\n ? Date.now() < this.#jwksTimestamp + this.#cacheMaxAge\n : false;\n }\n jwks() {\n return this.#local?.jwks();\n }\n async getKey(protectedHeader, token) {\n if (!this.#local || !this.fresh()) {\n await this.reload();\n }\n try {\n return await this.#local(protectedHeader, token);\n }\n catch (err) {\n if (err instanceof JWKSNoMatchingKey) {\n if (this.coolingDown() === false) {\n await this.reload();\n return this.#local(protectedHeader, token);\n }\n }\n throw err;\n }\n }\n async reload() {\n if (this.#pendingFetch && isCloudflareWorkers()) {\n this.#pendingFetch = undefined;\n }\n this.#pendingFetch ||= fetchJwks(this.#url.href, this.#headers, AbortSignal.timeout(this.#timeoutDuration), this.#customFetch)\n .then((json) => {\n this.#local = createLocalJWKSet(json);\n if (this.#cache) {\n this.#cache.uat = Date.now();\n this.#cache.jwks = json;\n }\n this.#jwksTimestamp = Date.now();\n this.#pendingFetch = undefined;\n })\n .catch((err) => {\n this.#pendingFetch = undefined;\n throw err;\n });\n await this.#pendingFetch;\n }\n}\nexport function createRemoteJWKSet(url, options) {\n const set = new RemoteJWKSet(url, options);\n const remoteJWKSet = async (protectedHeader, token) => set.getKey(protectedHeader, token);\n Object.defineProperties(remoteJWKSet, {\n coolingDown: {\n get: () => set.coolingDown(),\n enumerable: true,\n configurable: false,\n },\n fresh: {\n get: () => set.fresh(),\n enumerable: true,\n configurable: false,\n },\n reload: {\n value: () => set.reload(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n reloading: {\n get: () => set.pendingFetch(),\n enumerable: true,\n configurable: false,\n },\n jwks: {\n value: () => set.jwks(),\n enumerable: true,\n configurable: false,\n writable: false,\n },\n });\n return remoteJWKSet;\n}\n","import * as b64u from '../util/base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport { JWTInvalid } from '../util/errors.js';\nimport { validateClaimsSet, JWTClaimsBuilder } from '../lib/jwt_claims_set.js';\nexport class UnsecuredJWT {\n #jwt;\n constructor(payload = {}) {\n this.#jwt = new JWTClaimsBuilder(payload);\n }\n encode() {\n const header = b64u.encode(JSON.stringify({ alg: 'none' }));\n const payload = b64u.encode(this.#jwt.data());\n return `${header}.${payload}.`;\n }\n setIssuer(issuer) {\n this.#jwt.iss = issuer;\n return this;\n }\n setSubject(subject) {\n this.#jwt.sub = subject;\n return this;\n }\n setAudience(audience) {\n this.#jwt.aud = audience;\n return this;\n }\n setJti(jwtId) {\n this.#jwt.jti = jwtId;\n return this;\n }\n setNotBefore(input) {\n this.#jwt.nbf = input;\n return this;\n }\n setExpirationTime(input) {\n this.#jwt.exp = input;\n return this;\n }\n setIssuedAt(input) {\n this.#jwt.iat = input;\n return this;\n }\n static decode(jwt, options) {\n if (typeof jwt !== 'string') {\n throw new JWTInvalid('Unsecured JWT must be a string');\n }\n const { 0: encodedHeader, 1: encodedPayload, 2: signature, length } = jwt.split('.');\n if (length !== 3 || signature !== '') {\n throw new JWTInvalid('Invalid Unsecured JWT');\n }\n let header;\n try {\n header = JSON.parse(decoder.decode(b64u.decode(encodedHeader)));\n if (header.alg !== 'none')\n throw new Error();\n }\n catch {\n throw new JWTInvalid('Invalid Unsecured JWT');\n }\n const payload = validateClaimsSet(header, b64u.decode(encodedPayload), options);\n return { payload, header };\n }\n}\n","import { decode as b64u } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport { isObject } from '../lib/is_object.js';\nexport function decodeProtectedHeader(token) {\n let protectedB64u;\n if (typeof token === 'string') {\n const parts = token.split('.');\n if (parts.length === 3 || parts.length === 5) {\n ;\n [protectedB64u] = parts;\n }\n }\n else if (typeof token === 'object' && token) {\n if ('protected' in token) {\n protectedB64u = token.protected;\n }\n else {\n throw new TypeError('Token does not contain a Protected Header');\n }\n }\n try {\n if (typeof protectedB64u !== 'string' || !protectedB64u) {\n throw new Error();\n }\n const result = JSON.parse(decoder.decode(b64u(protectedB64u)));\n if (!isObject(result)) {\n throw new Error();\n }\n return result;\n }\n catch {\n throw new TypeError('Invalid Token or Protected Header formatting');\n }\n}\n","import { decode as b64u } from './base64url.js';\nimport { decoder } from '../lib/buffer_utils.js';\nimport { isObject } from '../lib/is_object.js';\nimport { JWTInvalid } from './errors.js';\nexport function decodeJwt(jwt) {\n if (typeof jwt !== 'string')\n throw new JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n const { 1: payload, length } = jwt.split('.');\n if (length === 5)\n throw new JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n if (length !== 3)\n throw new JWTInvalid('Invalid JWT');\n if (!payload)\n throw new JWTInvalid('JWTs must contain a payload');\n let decoded;\n try {\n decoded = b64u(payload);\n }\n catch {\n throw new JWTInvalid('Failed to base64url decode the payload');\n }\n let result;\n try {\n result = JSON.parse(decoder.decode(decoded));\n }\n catch {\n throw new JWTInvalid('Failed to parse the decoded payload as JSON');\n }\n if (!isObject(result))\n throw new JWTInvalid('Invalid JWT Claims Set');\n return result;\n}\n","import { JOSENotSupported } from '../util/errors.js';\nfunction getModulusLengthOption(options) {\n const modulusLength = options?.modulusLength ?? 2048;\n if (typeof modulusLength !== 'number' || modulusLength < 2048) {\n throw new JOSENotSupported('Invalid or unsupported modulusLength option provided, 2048 bits or larger keys must be used');\n }\n return modulusLength;\n}\nexport async function generateKeyPair(alg, options) {\n let algorithm;\n let keyUsages;\n switch (alg) {\n case 'PS256':\n case 'PS384':\n case 'PS512':\n algorithm = {\n name: 'RSA-PSS',\n hash: `SHA-${alg.slice(-3)}`,\n publicExponent: Uint8Array.of(0x01, 0x00, 0x01),\n modulusLength: getModulusLengthOption(options),\n };\n keyUsages = ['sign', 'verify'];\n break;\n case 'RS256':\n case 'RS384':\n case 'RS512':\n algorithm = {\n name: 'RSASSA-PKCS1-v1_5',\n hash: `SHA-${alg.slice(-3)}`,\n publicExponent: Uint8Array.of(0x01, 0x00, 0x01),\n modulusLength: getModulusLengthOption(options),\n };\n keyUsages = ['sign', 'verify'];\n break;\n case 'RSA-OAEP':\n case 'RSA-OAEP-256':\n case 'RSA-OAEP-384':\n case 'RSA-OAEP-512':\n algorithm = {\n name: 'RSA-OAEP',\n hash: `SHA-${parseInt(alg.slice(-3), 10) || 1}`,\n publicExponent: Uint8Array.of(0x01, 0x00, 0x01),\n modulusLength: getModulusLengthOption(options),\n };\n keyUsages = ['decrypt', 'unwrapKey', 'encrypt', 'wrapKey'];\n break;\n case 'ES256':\n algorithm = { name: 'ECDSA', namedCurve: 'P-256' };\n keyUsages = ['sign', 'verify'];\n break;\n case 'ES384':\n algorithm = { name: 'ECDSA', namedCurve: 'P-384' };\n keyUsages = ['sign', 'verify'];\n break;\n case 'ES512':\n algorithm = { name: 'ECDSA', namedCurve: 'P-521' };\n keyUsages = ['sign', 'verify'];\n break;\n case 'Ed25519':\n case 'EdDSA': {\n keyUsages = ['sign', 'verify'];\n algorithm = { name: 'Ed25519' };\n break;\n }\n case 'ML-DSA-44':\n case 'ML-DSA-65':\n case 'ML-DSA-87': {\n keyUsages = ['sign', 'verify'];\n algorithm = { name: alg };\n break;\n }\n case 'ECDH-ES':\n case 'ECDH-ES+A128KW':\n case 'ECDH-ES+A192KW':\n case 'ECDH-ES+A256KW': {\n keyUsages = ['deriveBits'];\n const crv = options?.crv ?? 'P-256';\n switch (crv) {\n case 'P-256':\n case 'P-384':\n case 'P-521': {\n algorithm = { name: 'ECDH', namedCurve: crv };\n break;\n }\n case 'X25519':\n algorithm = { name: 'X25519' };\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported crv option provided, supported values are P-256, P-384, P-521, and X25519');\n }\n break;\n }\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n return crypto.subtle.generateKey(algorithm, options?.extractable ?? false, keyUsages);\n}\n","import { JOSENotSupported } from '../util/errors.js';\nexport async function generateSecret(alg, options) {\n let length;\n let algorithm;\n let keyUsages;\n switch (alg) {\n case 'HS256':\n case 'HS384':\n case 'HS512':\n length = parseInt(alg.slice(-3), 10);\n algorithm = { name: 'HMAC', hash: `SHA-${length}`, length };\n keyUsages = ['sign', 'verify'];\n break;\n case 'A128CBC-HS256':\n case 'A192CBC-HS384':\n case 'A256CBC-HS512':\n length = parseInt(alg.slice(-3), 10);\n return crypto.getRandomValues(new Uint8Array(length >> 3));\n case 'A128KW':\n case 'A192KW':\n case 'A256KW':\n length = parseInt(alg.slice(1, 4), 10);\n algorithm = { name: 'AES-KW', length };\n keyUsages = ['wrapKey', 'unwrapKey'];\n break;\n case 'A128GCMKW':\n case 'A192GCMKW':\n case 'A256GCMKW':\n case 'A128GCM':\n case 'A192GCM':\n case 'A256GCM':\n length = parseInt(alg.slice(1, 4), 10);\n algorithm = { name: 'AES-GCM', length };\n keyUsages = ['encrypt', 'decrypt'];\n break;\n default:\n throw new JOSENotSupported('Invalid or unsupported JWK \"alg\" (Algorithm) Parameter value');\n }\n return crypto.subtle.generateKey(algorithm, options?.extractable ?? false, keyUsages);\n}\n","export { compactDecrypt } from './jwe/compact/decrypt.js';\nexport { flattenedDecrypt } from './jwe/flattened/decrypt.js';\nexport { generalDecrypt } from './jwe/general/decrypt.js';\nexport { GeneralEncrypt } from './jwe/general/encrypt.js';\nexport { compactVerify } from './jws/compact/verify.js';\nexport { flattenedVerify } from './jws/flattened/verify.js';\nexport { generalVerify } from './jws/general/verify.js';\nexport { jwtVerify } from './jwt/verify.js';\nexport { jwtDecrypt } from './jwt/decrypt.js';\nexport { CompactEncrypt } from './jwe/compact/encrypt.js';\nexport { FlattenedEncrypt } from './jwe/flattened/encrypt.js';\nexport { CompactSign } from './jws/compact/sign.js';\nexport { FlattenedSign } from './jws/flattened/sign.js';\nexport { GeneralSign } from './jws/general/sign.js';\nexport { SignJWT } from './jwt/sign.js';\nexport { EncryptJWT } from './jwt/encrypt.js';\nexport { calculateJwkThumbprint, calculateJwkThumbprintUri } from './jwk/thumbprint.js';\nexport { EmbeddedJWK } from './jwk/embedded.js';\nexport { createLocalJWKSet } from './jwks/local.js';\nexport { createRemoteJWKSet, jwksCache, customFetch } from './jwks/remote.js';\nexport { UnsecuredJWT } from './jwt/unsecured.js';\nexport { exportPKCS8, exportSPKI, exportJWK } from './key/export.js';\nexport { importSPKI, importPKCS8, importX509, importJWK } from './key/import.js';\nexport { decodeProtectedHeader } from './util/decode_protected_header.js';\nexport { decodeJwt } from './util/decode_jwt.js';\nimport * as errors from './util/errors.js';\nexport { errors };\nexport { generateKeyPair } from './key/generate_key_pair.js';\nexport { generateSecret } from './key/generate_secret.js';\nimport * as base64url from './util/base64url.js';\nexport { base64url };\nexport const cryptoRuntime = 'WebCryptoAPI';\n","/**\n * Multi-Agent Protocol (MAP) Type Definitions - v2\n *\n * Core type definitions matching the MAP JSON Schema.\n * These types are the foundation for the TypeScript SDK.\n *\n * v2 Changes:\n * - Fixed ERROR_CODES collision (FEDERATION_AUTH_FAILED)\n * - Added Agent.ownerId for ownership tracking\n * - Reorganized method constants by capability domain\n * - Added EventInput type and createEvent() helper\n * - Added disconnect policy and lifecycle events\n * - Expanded subscription filters\n * - Standardized response shapes (always return entities)\n * - Added hierarchy expansion to agents/get\n * - Added CAPABILITY_REQUIREMENTS mapping\n * - Clarified message event data (no payloads)\n */\n\n// =============================================================================\n// Primitive Types & Identifiers\n// =============================================================================\n\n/** Unique identifier for any participant (agent, client, system, gateway) */\nexport type ParticipantId = string;\n\n/** Unique identifier for an agent */\nexport type AgentId = string;\n\n/** Unique identifier for a scope */\nexport type ScopeId = string;\n\n/** Unique identifier for a session */\nexport type SessionId = string;\n\n/** Unique identifier for a message */\nexport type MessageId = string;\n\n/** Unique identifier for a subscription */\nexport type SubscriptionId = string;\n\n/** Identifier for correlating related messages */\nexport type CorrelationId = string;\n\n/** Unique identifier for a conversation (format: 'conv-{ulid}') */\nexport type ConversationId = string;\n\n/** Unique identifier for a turn within a conversation (format: 'turn-{ulid}') */\nexport type TurnId = string;\n\n/** Unique identifier for a thread within a conversation (format: 'thread-{ulid}') */\nexport type ThreadId = string;\n\n/** Unique identifier for a trajectory checkpoint */\nexport type CheckpointId = string;\n\n/** Unique identifier for a task */\nexport type TaskId = string;\n\n/** JSON-RPC request ID */\nexport type RequestId = string | number;\n\n/** MAP protocol version */\nexport type ProtocolVersion = 1;\n\n/** Unix timestamp in milliseconds */\nexport type Timestamp = number;\n\n/** Vendor extension metadata */\nexport type Meta = Record<string, unknown>;\n\n// =============================================================================\n// Agent Environment Types\n// =============================================================================\n\n/**\n * Compute environment information for an agent.\n * Category names are normative; field conventions within categories are documented separately.\n *\n * @example\n * ```typescript\n * const environment: AgentEnvironment = {\n * schemaVersion: '1.0',\n * os: { type: 'linux', version: '22.04' },\n * process: { cwd: '/home/user/project' },\n * network: { connectivity: 'full' },\n * tools: { installed: { python: '3.11', node: '20.0' } }\n * };\n * ```\n */\nexport interface AgentEnvironment {\n /** Schema version for evolution (e.g., '1.0') */\n schemaVersion?: string;\n\n /** Self-declared profile compliance (e.g., ['cloud-native', 'ml-ready']) */\n profiles?: string[];\n\n /** Host/machine info (arch, cpu, memory, gpu) */\n host?: Record<string, unknown>;\n\n /** Operating system info (type, version) */\n os?: Record<string, unknown>;\n\n /** Process/runtime info (pid, cwd, runtime) */\n process?: Record<string, unknown>;\n\n /** Container info if containerized */\n container?: Record<string, unknown>;\n\n /** Cloud provider info (provider, region) */\n cloud?: Record<string, unknown>;\n\n /** Kubernetes info if in k8s */\n k8s?: Record<string, unknown>;\n\n /** Filesystem/workspace info (cwd, mounts, workspace) */\n filesystem?: Record<string, unknown>;\n\n /** Network info (connectivity, addresses) */\n network?: Record<string, unknown>;\n\n /** Available tools and runtimes */\n tools?: Record<string, unknown>;\n\n /** Resource limits and constraints */\n resources?: Record<string, unknown>;\n\n /** Security/isolation context */\n security?: Record<string, unknown>;\n\n /** External services and APIs (aiProviders, mcp) */\n services?: Record<string, unknown>;\n\n /** Allow additional categories */\n [key: string]: unknown;\n}\n\n// =============================================================================\n// Agent Capability Descriptor Types\n// =============================================================================\n\n/**\n * Structured capability descriptor for an agent.\n * Published at registration time via the `capabilityDescriptor` field on Agent.\n * Optional — agents without descriptors still work via role/metadata.\n */\nexport interface MAPAgentCapabilityDescriptor {\n /** Globally unique capability descriptor ID (e.g., \"urn:map:cap:code-review\") */\n id?: string;\n /** Semantic version of the capability descriptor */\n version?: string;\n /** Human-readable name */\n name?: string;\n /** Human-readable summary of what this agent does */\n description?: string;\n /** Capability categories this agent supports */\n capabilities?: MAPCapabilityDeclaration[];\n /** Input types this agent can accept */\n accepts?: MAPInterfaceSpec[];\n /** Output types this agent can provide */\n provides?: MAPInterfaceSpec[];\n /** Semantic tags for discovery (searchable) */\n tags?: string[];\n}\n\n/**\n * A single capability declaration within an agent's descriptor.\n */\nexport interface MAPCapabilityDeclaration {\n /** Machine-readable capability identifier (namespaced, e.g., \"doc:summarize\") */\n id: string;\n /** Capability version */\n version?: string;\n /** What this capability does */\n description?: string;\n /** Interfaces for this specific capability */\n interfaces?: MAPInterfaceSpec[];\n}\n\n/**\n * Interface specification for capability inputs/outputs.\n */\nexport interface MAPInterfaceSpec {\n /** Content type (e.g., \"application/json\", \"text/plain\") */\n contentType: string;\n /** JSON Schema URI for the expected payload structure */\n schema?: string;\n /** Description of this interface */\n description?: string;\n}\n\n// =============================================================================\n// Participant Types\n// =============================================================================\n\n/** Type of participant in the protocol */\nexport type ParticipantType = \"agent\" | \"client\" | \"system\" | \"gateway\";\n\n/** Transport binding type */\nexport type TransportType = \"websocket\" | \"stdio\" | \"inprocess\" | \"http-sse\";\n\n/**\n * Streaming capabilities for backpressure and flow control.\n * Servers advertise these to indicate what features they support.\n */\nexport interface StreamingCapabilities {\n /** Server can receive and process ack notifications */\n supportsAck?: boolean;\n /** Server will pause sending when client falls behind */\n supportsFlowControl?: boolean;\n /** Server supports pause/resume subscription state */\n supportsPause?: boolean;\n}\n\n/** Capabilities of a participant, grouped by category */\nexport interface ParticipantCapabilities {\n observation?: {\n /** Can subscribe to event streams */\n canObserve?: boolean;\n /** Can query agents and structure */\n canQuery?: boolean;\n };\n messaging?: {\n /** Can send messages */\n canSend?: boolean;\n /** Can receive messages addressed to it */\n canReceive?: boolean;\n /** Can send to scopes/roles */\n canBroadcast?: boolean;\n };\n lifecycle?: {\n /** Can create child agents */\n canSpawn?: boolean;\n /** Can register agents (not as children) */\n canRegister?: boolean;\n /** Can remove agents */\n canUnregister?: boolean;\n /** Can inject context/control agents */\n canSteer?: boolean;\n /** Can request agent termination */\n canStop?: boolean;\n };\n scopes?: {\n /** Can create new scopes */\n canCreateScopes?: boolean;\n /** Can modify and delete scopes */\n canManageScopes?: boolean;\n };\n federation?: {\n /** Can connect to and route to federated systems */\n canFederate?: boolean;\n };\n /** Mail protocol capabilities for conversation/turn tracking */\n mail?: {\n /** Whether mail is enabled (server response only) */\n enabled?: boolean;\n /** Can create new conversations */\n canCreate?: boolean;\n /** Can join existing conversations */\n canJoin?: boolean;\n /** Can invite participants to conversations */\n canInvite?: boolean;\n /** Can view conversation history */\n canViewHistory?: boolean;\n /** Can create threads within conversations */\n canCreateThreads?: boolean;\n };\n /** Workspace file access capabilities */\n workspace?: {\n /** Whether workspace is enabled (server response only) */\n enabled?: boolean;\n /** Can search files by pattern */\n canSearch?: boolean;\n /** Can list files in a directory */\n canList?: boolean;\n /** Can read file contents */\n canRead?: boolean;\n };\n /** Trajectory checkpoint tracking capabilities */\n trajectory?: {\n /** Whether trajectory tracking is enabled (server response only) */\n enabled?: boolean;\n /** Can report trajectory checkpoints */\n canReport?: boolean;\n /** Can list and query checkpoints */\n canQuery?: boolean;\n /** Can request full checkpoint content */\n canRequestContent?: boolean;\n };\n /** Task management capabilities */\n tasks?: {\n /** Whether task management is enabled (server response only) */\n enabled?: boolean;\n /** Can create tasks */\n canCreate?: boolean;\n /** Can assign tasks to agents */\n canAssign?: boolean;\n /** Can update task status and fields */\n canUpdate?: boolean;\n /** Can list and query tasks */\n canList?: boolean;\n };\n /** Streaming/backpressure capabilities */\n streaming?: StreamingCapabilities;\n\n /**\n * Protocols supported by this participant.\n * Used for protocol capability discovery.\n *\n * @example ['acp', 'mcp']\n */\n protocols?: string[];\n\n /**\n * ACP (Agent Client Protocol) capability details.\n * Only present if 'acp' is in the protocols array.\n */\n acp?: ACPCapability;\n\n _meta?: Meta;\n}\n\n/**\n * ACP capability advertisement.\n * Describes what ACP features an agent supports.\n */\nexport interface ACPCapability {\n /** ACP protocol version supported (e.g., '2024-10-07') */\n version: string;\n /** ACP features supported by this agent */\n features?: string[];\n _meta?: Meta;\n}\n\n/** A participant in the MAP protocol */\nexport interface Participant {\n id: ParticipantId;\n type: ParticipantType;\n name?: string;\n capabilities?: ParticipantCapabilities;\n transport?: TransportType;\n sessionId?: SessionId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agent Types\n// =============================================================================\n\n/**\n * State of an agent.\n * Standard states are enumerated; custom states use 'x-' prefix.\n */\nexport type AgentState =\n | \"registered\"\n | \"active\"\n | \"busy\"\n | \"idle\"\n | \"suspended\"\n | \"stopping\"\n | \"stopped\"\n | \"failed\"\n | \"orphaned\"\n | `x-${string}`;\n\n/** Type of relationship between agents */\nexport type AgentRelationshipType =\n | \"peer\"\n | \"supervisor\"\n | \"supervised\"\n | \"collaborator\";\n\n/** A relationship between agents */\nexport interface AgentRelationship {\n type: AgentRelationshipType;\n agentId: AgentId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** Lifecycle metadata for an agent */\nexport interface AgentLifecycle {\n createdAt?: Timestamp;\n startedAt?: Timestamp;\n stoppedAt?: Timestamp;\n lastActiveAt?: Timestamp;\n orphanedAt?: Timestamp;\n exitCode?: number;\n exitReason?: string;\n _meta?: Meta;\n}\n\n/** Who can see this agent */\nexport type AgentVisibility = \"public\" | \"parent-only\" | \"scope\" | \"system\";\n\n/** An agent in the multi-agent system */\nexport interface Agent {\n id: AgentId;\n\n /**\n * The participant that owns/controls this agent's connection.\n * Used for message routing and cleanup on disconnect.\n *\n * - Non-null: Agent is owned by the specified participant\n * - null: Agent is orphaned (owner disconnected with 'orphan' policy)\n */\n ownerId: ParticipantId | null;\n\n name?: string;\n description?: string;\n\n /** Parent agent ID (for spawned agents) */\n parent?: AgentId;\n\n /** Child agent IDs (populated when queried with include.children) */\n children?: AgentId[];\n\n relationships?: AgentRelationship[];\n state: AgentState;\n role?: string;\n scopes?: ScopeId[];\n\n /**\n * Simple visibility setting (legacy).\n * @deprecated Use permissionOverrides.canSee.agents for more granular control\n */\n visibility?: AgentVisibility;\n\n /**\n * Per-agent permission overrides.\n * Merged on top of role-based defaults from system configuration.\n * Only include fields that differ from the role default.\n *\n * @example\n * ```typescript\n * // Agent that accepts messages from clients (unlike role default)\n * permissionOverrides: {\n * acceptsFrom: { clients: 'all' }\n * }\n * ```\n */\n permissionOverrides?: Partial<AgentPermissions>;\n\n lifecycle?: AgentLifecycle;\n capabilities?: ParticipantCapabilities;\n\n /** Compute environment where this agent runs */\n environment?: AgentEnvironment;\n\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: MAPAgentCapabilityDescriptor;\n\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Check if an agent is orphaned (owner disconnected).\n * Orphaned agents have `ownerId === null`.\n */\nexport function isOrphanedAgent(agent: Agent): boolean {\n return agent.ownerId === null;\n}\n\n// =============================================================================\n// Agent Permission Types\n// =============================================================================\n\n/**\n * Rule for which agents this agent can see.\n * - 'all': Can see any agent in the system\n * - 'hierarchy': Can see parent, children, ancestors, descendants\n * - 'scoped': Can see agents in the same scopes\n * - 'direct': Can only see explicitly included agents\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentVisibilityRule =\n | \"all\"\n | \"hierarchy\"\n | \"scoped\"\n | \"direct\"\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can see.\n * - 'all': Can see any scope\n * - 'member': Can only see scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeVisibilityRule = \"all\" | \"member\" | { include: ScopeId[] };\n\n/**\n * Rule for how much agent hierarchy structure this agent can see.\n * - 'full': Can see the full agent hierarchy tree\n * - 'local': Can see immediate parent and children only\n * - 'none': Cannot see hierarchy relationships\n */\nexport type StructureVisibilityRule = \"full\" | \"local\" | \"none\";\n\n/**\n * Rule for which agents this agent can send messages to.\n * - 'all': Can message any agent\n * - 'hierarchy': Can message parent, children, ancestors, descendants\n * - 'scoped': Can message agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentMessagingRule =\n | \"all\"\n | \"hierarchy\"\n | \"scoped\"\n | { include: AgentId[] };\n\n/**\n * Rule for which scopes this agent can send messages to.\n * - 'all': Can send to any scope\n * - 'member': Can only send to scopes they're a member of\n * - { include: [...] }: Explicit allowlist of scope IDs\n */\nexport type ScopeMessagingRule = \"all\" | \"member\" | { include: ScopeId[] };\n\n/**\n * Rule for which agents this agent accepts messages from.\n * - 'all': Accepts from any agent\n * - 'hierarchy': Accepts from parent, children, ancestors, descendants\n * - 'scoped': Accepts from agents in the same scopes\n * - { include: [...] }: Explicit allowlist of agent IDs\n */\nexport type AgentAcceptanceRule =\n | \"all\"\n | \"hierarchy\"\n | \"scoped\"\n | { include: AgentId[] };\n\n/**\n * Rule for which clients this agent accepts messages from.\n * - 'all': Accepts from any client\n * - 'none': Does not accept from any client\n * - { include: [...] }: Explicit allowlist of participant IDs\n */\nexport type ClientAcceptanceRule =\n | \"all\"\n | \"none\"\n | { include: ParticipantId[] };\n\n/**\n * Rule for which federated systems this agent accepts messages from.\n * - 'all': Accepts from any federated system\n * - 'none': Does not accept from any federated system\n * - { include: [...] }: Explicit allowlist of system IDs\n */\nexport type SystemAcceptanceRule = \"all\" | \"none\" | { include: string[] };\n\n/**\n * Permission configuration for an agent.\n * Defines what the agent can see, who it can message, and who it accepts messages from.\n *\n * Used in two ways:\n * 1. As role-based defaults in system configuration\n * 2. As per-agent overrides via Agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const workerPermissions: AgentPermissions = {\n * canSee: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * structure: 'local',\n * },\n * canMessage: {\n * agents: 'hierarchy',\n * scopes: 'member',\n * },\n * acceptsFrom: {\n * agents: 'hierarchy',\n * clients: 'none',\n * systems: 'none',\n * },\n * };\n * ```\n */\nexport interface AgentPermissions {\n /** Rules for what this agent can see */\n canSee?: {\n /** Which agents this agent can see */\n agents?: AgentVisibilityRule;\n /** Which scopes this agent can see */\n scopes?: ScopeVisibilityRule;\n /** How much hierarchy structure this agent can see */\n structure?: StructureVisibilityRule;\n };\n /** Rules for who this agent can send messages to */\n canMessage?: {\n /** Which agents this agent can message */\n agents?: AgentMessagingRule;\n /** Which scopes this agent can send to */\n scopes?: ScopeMessagingRule;\n };\n /** Rules for who this agent accepts messages from */\n acceptsFrom?: {\n /** Which agents this agent accepts messages from */\n agents?: AgentAcceptanceRule;\n /** Which clients this agent accepts messages from */\n clients?: ClientAcceptanceRule;\n /** Which federated systems this agent accepts messages from */\n systems?: SystemAcceptanceRule;\n };\n}\n\n/**\n * System-level configuration for agent permissions.\n * Defines default permissions and role-based permission templates.\n *\n * Resolution order:\n * 1. Start with defaultPermissions\n * 2. If agent has a role, deep merge rolePermissions[role]\n * 3. Deep merge agent.permissionOverrides\n *\n * @example\n * ```typescript\n * const config: AgentPermissionConfig = {\n * defaultPermissions: {\n * canSee: { agents: 'hierarchy', scopes: 'member', structure: 'local' },\n * canMessage: { agents: 'hierarchy', scopes: 'member' },\n * acceptsFrom: { agents: 'hierarchy', clients: 'none', systems: 'none' },\n * },\n * rolePermissions: {\n * coordinator: {\n * canSee: { agents: 'all', scopes: 'all', structure: 'full' },\n * canMessage: { agents: 'all', scopes: 'all' },\n * acceptsFrom: { agents: 'all', clients: 'all', systems: 'none' },\n * },\n * },\n * };\n * ```\n */\nexport interface AgentPermissionConfig {\n /** Default permissions for agents without a role or role-specific config */\n defaultPermissions: AgentPermissions;\n /** Role-based permission templates */\n rolePermissions: Record<string, AgentPermissions>;\n}\n\n// =============================================================================\n// Addressing Types\n// =============================================================================\n\n/** Address a single agent directly */\nexport interface DirectAddress {\n agent: AgentId;\n}\n\n/** Address multiple agents */\nexport interface MultiAddress {\n agents: AgentId[];\n}\n\n/** Address all agents in a scope */\nexport interface ScopeAddress {\n scope: ScopeId;\n}\n\n/** Address agents by role, optionally within a scope */\nexport interface RoleAddress {\n role: string;\n within?: ScopeId;\n}\n\n/** Address relative to sender in hierarchy */\nexport interface HierarchicalAddress {\n parent?: true;\n children?: true;\n ancestors?: true;\n descendants?: true;\n siblings?: true;\n depth?: number;\n}\n\n/** Address all agents in the system */\nexport interface BroadcastAddress {\n broadcast: true;\n}\n\n/** Address the system/router itself */\nexport interface SystemAddress {\n system: true;\n}\n\n/** Address any participant by ID or category */\nexport interface ParticipantAddress {\n participant?: ParticipantId;\n participants?: \"all\" | \"agents\" | \"clients\";\n}\n\n/** Address an agent in a federated system */\nexport interface FederatedAddress {\n system: string;\n agent: AgentId;\n}\n\n/** Flexible addressing for any topology */\nexport type Address =\n | string\n | DirectAddress\n | MultiAddress\n | ScopeAddress\n | RoleAddress\n | HierarchicalAddress\n | BroadcastAddress\n | SystemAddress\n | ParticipantAddress\n | FederatedAddress;\n\n// =============================================================================\n// Message Types\n// =============================================================================\n\n/** Message priority */\nexport type MessagePriority = \"urgent\" | \"high\" | \"normal\" | \"low\";\n\n/** Message delivery guarantees */\nexport type DeliverySemantics =\n | \"fire-and-forget\"\n | \"acknowledged\"\n | \"guaranteed\";\n\n/** Relationship context for the message */\nexport type MessageRelationship =\n | \"parent-to-child\"\n | \"child-to-parent\"\n | \"peer\"\n | \"broadcast\";\n\n/** Metadata for a message */\nexport interface MessageMeta {\n timestamp?: Timestamp;\n relationship?: MessageRelationship;\n expectsResponse?: boolean;\n correlationId?: CorrelationId;\n isResult?: boolean;\n priority?: MessagePriority;\n delivery?: DeliverySemantics;\n ttlMs?: number;\n /**\n * Protocol identifier for tunneled protocols (e.g., 'acp').\n * Used to identify the protocol of the payload.\n */\n protocol?: string;\n /**\n * Mail turn tracking metadata.\n * When present on map/send, the server records a turn in the specified\n * conversation in addition to routing the message.\n */\n mail?: MailMessageMeta;\n _meta?: Meta;\n}\n\n/** A message in the multi-agent system */\nexport interface Message<T = unknown> {\n id: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n payload?: T;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\n/** Policy for joining a scope */\nexport type JoinPolicy = \"open\" | \"invite\" | \"role\" | \"system\";\n\n/** Who can see the scope exists and its members */\nexport type ScopeVisibility = \"public\" | \"members\" | \"system\";\n\n/** Who can see messages sent to this scope */\nexport type MessageVisibility = \"public\" | \"members\" | \"system\";\n\n/** Who can send messages to this scope */\nexport type SendPolicy = \"members\" | \"any\";\n\n/** A scope for grouping agents */\nexport interface Scope {\n id: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Event Types\n// =============================================================================\n\n/**\n * Event type constants.\n * Use these instead of string literals for type safety and autocomplete.\n */\nexport const EVENT_TYPES = {\n // Agent lifecycle events\n AGENT_REGISTERED: \"agent_registered\",\n AGENT_UNREGISTERED: \"agent_unregistered\",\n AGENT_STATE_CHANGED: \"agent_state_changed\",\n AGENT_ENVIRONMENT_CHANGED: \"agent_environment_changed\",\n AGENT_ORPHANED: \"agent_orphaned\",\n\n // Participant lifecycle events\n PARTICIPANT_CONNECTED: \"participant_connected\",\n PARTICIPANT_DISCONNECTED: \"participant_disconnected\",\n\n // Message events\n MESSAGE_SENT: \"message_sent\",\n MESSAGE_DELIVERED: \"message_delivered\",\n MESSAGE_FAILED: \"message_failed\",\n\n // Scope events\n SCOPE_CREATED: \"scope_created\",\n SCOPE_DELETED: \"scope_deleted\",\n SCOPE_MEMBER_JOINED: \"scope_member_joined\",\n SCOPE_MEMBER_LEFT: \"scope_member_left\",\n\n // Permission events\n PERMISSIONS_CLIENT_UPDATED: \"permissions_client_updated\",\n PERMISSIONS_AGENT_UPDATED: \"permissions_agent_updated\",\n\n // System events\n SYSTEM_ERROR: \"system_error\",\n\n // Federation events\n FEDERATION_CONNECTED: \"federation_connected\",\n FEDERATION_DISCONNECTED: \"federation_disconnected\",\n\n // Trajectory events\n TRAJECTORY_CHECKPOINT: \"trajectory.checkpoint\",\n TRAJECTORY_CONTENT_AVAILABLE: \"trajectory.content.available\",\n\n // Task events\n TASK_CREATED: \"task.created\",\n TASK_ASSIGNED: \"task.assigned\",\n TASK_STATUS: \"task.status\",\n TASK_COMPLETED: \"task.completed\",\n\n // Mail events\n MAIL_CREATED: \"mail.created\",\n MAIL_CLOSED: \"mail.closed\",\n MAIL_PARTICIPANT_JOINED: \"mail.participant.joined\",\n MAIL_PARTICIPANT_LEFT: \"mail.participant.left\",\n MAIL_TURN_ADDED: \"mail.turn.added\",\n MAIL_TURN_UPDATED: \"mail.turn.updated\",\n MAIL_THREAD_CREATED: \"mail.thread.created\",\n MAIL_SUMMARY_GENERATED: \"mail.summary.generated\",\n} as const;\n\n/** Type of system event (derived from EVENT_TYPES) */\nexport type EventType = (typeof EVENT_TYPES)[keyof typeof EVENT_TYPES];\n\n/**\n * Input for creating events.\n * id and timestamp are optional - server generates them.\n */\nexport interface EventInput {\n type: EventType;\n timestamp?: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/**\n * Wire event as sent to clients.\n * id and timestamp are always present.\n */\nexport interface Event {\n id: string;\n type: EventType;\n timestamp: Timestamp;\n source?: ParticipantId;\n data?: Record<string, unknown>;\n causedBy?: string[];\n _meta?: Meta;\n}\n\n/** Helper to create events with auto-generated id and timestamp */\nexport function createEvent(input: EventInput): Event {\n return {\n id: `evt-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: input.timestamp ?? Date.now(),\n type: input.type,\n source: input.source,\n data: input.data,\n causedBy: input.causedBy,\n _meta: input._meta,\n };\n}\n\n// =============================================================================\n// Subscription Types\n// =============================================================================\n\n/**\n * Filter for event subscriptions.\n *\n * ## Combination Logic\n *\n * All specified fields are combined with **AND** logic:\n * - An event must match ALL specified criteria to be delivered\n * - Within array fields, values are combined with **OR** logic\n * - Empty arrays (`[]`) are treated as \"no filter\" (matches any)\n * - Undefined/omitted fields are treated as \"no filter\" (matches any)\n *\n * ## Examples\n *\n * ```typescript\n * // Match agent_registered OR agent_unregistered events from agent-1 OR agent-2\n * {\n * eventTypes: ['agent_registered', 'agent_unregistered'],\n * fromAgents: ['agent-1', 'agent-2']\n * }\n *\n * // Match any event from agents with role 'worker' OR 'supervisor'\n * { fromRoles: ['worker', 'supervisor'] }\n *\n * // Match scope events in scope-1 with metadata containing priority='high'\n * {\n * scopes: ['scope-1'],\n * metadataMatch: { priority: 'high' }\n * }\n * ```\n *\n * ## Field Semantics\n *\n * | Field | Within-field | Cross-field | Description |\n * |-------|--------------|-------------|-------------|\n * | `eventTypes` | OR | AND | Event type is one of the listed types |\n * | `fromAgents` | OR | AND | Event source is one of the listed agents |\n * | `fromRoles` | OR | AND | Event source agent has one of the listed roles |\n * | `roles` | OR | AND | Event relates to agents with one of the listed roles |\n * | `scopes` | OR | AND | Event relates to one of the listed scopes |\n * | `priorities` | OR | AND | Message priority is one of the listed levels |\n * | `correlationIds` | OR | AND | Event has one of the listed correlation IDs |\n * | `metadataMatch` | AND | AND | Event metadata contains ALL specified key-value pairs |\n */\nexport interface SubscriptionFilter {\n /**\n * Filter by roles the event relates to.\n * Matches events where the related agent has one of these roles.\n */\n roles?: string[];\n\n /**\n * Filter by scopes the event relates to.\n * Matches events with scopeId in event.data matching one of these.\n */\n scopes?: ScopeId[];\n\n /**\n * Filter by event type.\n * Use EVENT_TYPES constants: `eventTypes: [EVENT_TYPES.AGENT_REGISTERED]`\n */\n eventTypes?: EventType[];\n\n /**\n * Filter by message priority (for message events).\n */\n priorities?: MessagePriority[];\n\n /**\n * Filter by correlation ID.\n * Matches events with correlationId in event.data matching one of these.\n */\n correlationIds?: CorrelationId[];\n\n /**\n * Filter by source agent ID.\n * Matches events where event.source is one of these agent IDs.\n */\n fromAgents?: AgentId[];\n\n /**\n * Filter by source agent role.\n * Matches events where the source agent has one of these roles.\n */\n fromRoles?: string[];\n\n /**\n * Filter by metadata key-value pairs.\n * All specified pairs must match (AND logic within this field).\n * Checks event.data.metadata for matching values.\n */\n metadataMatch?: Record<string, unknown>;\n\n /**\n * Filter by agent environment attributes.\n * Matches events from agents whose environment contains matching values.\n * Uses dot notation for nested fields (e.g., 'os.type', 'cloud.region').\n *\n * @example\n * ```typescript\n * environmentMatch: {\n * 'os.type': 'linux',\n * 'cloud.provider': 'aws'\n * }\n * ```\n */\n environmentMatch?: Record<string, unknown>;\n\n /**\n * Mail-specific filter for conversation events.\n * Matches mail events related to a specific conversation, thread,\n * participant, or content type.\n */\n mail?: MailSubscriptionFilter;\n\n /**\n * Trajectory-specific filter for checkpoint events.\n * Matches trajectory events for a specific agent, session, or branch.\n */\n trajectory?: TrajectorySubscriptionFilter;\n\n _meta?: Meta;\n}\n\n/** Options for subscriptions */\nexport interface SubscriptionOptions {\n /** Include full payloads in message events (default: false) */\n includeMessagePayloads?: boolean;\n /** Exclude events from own actions (default: false) */\n excludeOwnEvents?: boolean;\n}\n\n/** An active event subscription */\nexport interface Subscription {\n id: SubscriptionId;\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n createdAt?: Timestamp;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscription Backpressure Types\n// =============================================================================\n\n/**\n * State of a subscription's event delivery.\n * - 'active': Events are being delivered normally\n * - 'paused': Events are buffered but not delivered to the iterator\n * - 'closed': Subscription is terminated\n */\nexport type SubscriptionState = \"active\" | \"paused\" | \"closed\";\n\n/**\n * Information about events dropped due to buffer overflow.\n * Passed to overflow handlers when events cannot be buffered.\n */\nexport interface OverflowInfo {\n /** Number of events dropped in this overflow batch */\n eventsDropped: number;\n /** Event ID of oldest dropped event (if available) */\n oldestDroppedId?: string;\n /** Event ID of newest dropped event (if available) */\n newestDroppedId?: string;\n /** Timestamp when overflow occurred */\n timestamp: Timestamp;\n /** Total events dropped since subscription started */\n totalDropped: number;\n}\n\n/** Handler called when subscription buffer overflows */\nexport type OverflowHandler = (info: OverflowInfo) => void;\n\n/**\n * Parameters for acknowledging received events.\n * Sent as a notification to inform the server of client progress.\n * Enables optional server-side flow control.\n */\nexport interface SubscriptionAckParams {\n /** Subscription being acknowledged */\n subscriptionId: SubscriptionId;\n /** Acknowledge all events up to and including this sequence number */\n upToSequence: number;\n _meta?: Meta;\n}\n\n/** Notification for subscription acknowledgment */\nexport interface SubscriptionAckNotification extends MAPNotificationBase<SubscriptionAckParams> {\n method: \"map/subscribe.ack\";\n params: SubscriptionAckParams;\n}\n\n// =============================================================================\n// Message Event Data Types\n// =============================================================================\n\n/**\n * Data for message_sent events.\n *\n * Payload is included for subscribers that have permission to observe the\n * event stream. Access control is enforced at the subscription level —\n * clients that can subscribe are trusted to see message content.\n */\nexport interface MessageSentEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n priority?: MessagePriority;\n payload?: unknown;\n}\n\n/**\n * Data for message_delivered events.\n *\n * Payload is included for subscribers that have permission to observe the\n * event stream. Access control is enforced at the subscription level.\n */\nexport interface MessageDeliveredEventData {\n messageId: MessageId;\n from: ParticipantId;\n deliveredTo: ParticipantId[];\n timestamp: Timestamp;\n correlationId?: CorrelationId;\n payload?: unknown;\n}\n\n/** Data for message_failed events */\nexport interface MessageFailedEventData {\n messageId: MessageId;\n from: ParticipantId;\n to: Address;\n reason: string;\n code?: number;\n}\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/** Category of error for handling decisions */\nexport type ErrorCategory =\n | \"protocol\"\n | \"auth\"\n | \"routing\"\n | \"agent\"\n | \"resource\"\n | \"federation\"\n | \"mail\"\n | \"trajectory\"\n | \"internal\";\n\n/** Structured error data */\nexport interface MAPErrorData {\n category?: ErrorCategory;\n retryable?: boolean;\n retryAfterMs?: number;\n details?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/** JSON-RPC 2.0 error object */\nexport interface MAPError {\n code: number;\n message: string;\n data?: MAPErrorData;\n}\n\n// =============================================================================\n// JSON-RPC Base Types\n// =============================================================================\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = \"2.0\" as const;\n\n/** Base JSON-RPC request */\nexport interface MAPRequestBase<TParams = unknown> {\n jsonrpc: \"2.0\";\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/** Base JSON-RPC response (success) */\nexport interface MAPResponseSuccess<T = unknown> {\n jsonrpc: \"2.0\";\n id: RequestId;\n result: T;\n}\n\n/** Base JSON-RPC response (error) */\nexport interface MAPResponseError {\n jsonrpc: \"2.0\";\n id: RequestId;\n error: MAPError;\n}\n\n/** JSON-RPC response (success or error) */\nexport type MAPResponse<T = unknown> = MAPResponseSuccess<T> | MAPResponseError;\n\n/** Base JSON-RPC notification */\nexport interface MAPNotificationBase<TParams = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params?: TParams;\n}\n\n// =============================================================================\n// Session Types\n// =============================================================================\n\nexport interface SessionInfo {\n id: SessionId;\n createdAt: Timestamp;\n lastActiveAt?: Timestamp;\n closedAt?: Timestamp;\n}\n\n// =============================================================================\n// Authentication Types\n// =============================================================================\n\n/** Standard authentication methods defined by the protocol */\nexport type StandardAuthMethod =\n | \"bearer\"\n | \"api-key\"\n | \"mtls\"\n | \"none\"\n | \"did:wba\";\n\n/** Authentication method - standard or custom (x- prefixed) */\nexport type AuthMethod = StandardAuthMethod | `x-${string}`;\n\n/** Authentication error codes */\nexport type AuthErrorCode =\n | \"invalid_credentials\"\n | \"expired\"\n | \"insufficient_scope\"\n | \"method_not_supported\"\n | \"auth_required\";\n\n/**\n * Client-provided authentication credentials.\n * Used in connect requests and authenticate calls.\n */\nexport interface AuthCredentials {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Server-advertised authentication capabilities.\n * Included in connect response when auth is required.\n */\nexport interface ServerAuthCapabilities {\n /** Supported authentication methods (in preference order) */\n methods: AuthMethod[];\n /** Is authentication required to proceed? */\n required: boolean;\n /** OAuth2 authorization server metadata URL (RFC 8414) */\n oauth2MetadataUrl?: string;\n /** JWKS URL for local JWT verification (RFC 7517) */\n jwksUrl?: string;\n /** Realm identifier for this server */\n realm?: string;\n}\n\n/**\n * Authenticated principal information.\n * Returned after successful authentication.\n */\nexport interface AuthPrincipal {\n /** Unique identifier for this principal */\n id: string;\n /** Token issuer (for federated auth) */\n issuer?: string;\n /** Additional claims from the credential */\n claims?: Record<string, unknown>;\n /** Token expiration timestamp (Unix ms) - from JWT exp claim */\n expiresAt?: number;\n}\n\n/**\n * Authentication error details.\n */\nexport interface AuthError {\n /** Error code */\n code: AuthErrorCode;\n /** Human-readable error message */\n message: string;\n}\n\n/**\n * Result of an authentication attempt.\n */\nexport interface AuthResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Authenticated principal (if success) */\n principal?: AuthPrincipal;\n /** Error details (if failure) */\n error?: AuthError;\n /** Provider-specific data to store on session (e.g., verified AgentToken) */\n providerData?: unknown;\n}\n\n/**\n * Supported federation authentication methods.\n */\nexport type FederationAuthMethod =\n | \"bearer\"\n | \"api-key\"\n | \"mtls\"\n | \"none\"\n | \"did:wba\"\n | \"oauth2\"\n | `x-${string}`;\n\n/**\n * Authentication for federated connections.\n */\nexport interface FederationAuth {\n method: FederationAuthMethod;\n credentials?: string;\n /** Method-specific additional data (e.g., DID proof, OAuth2 config) */\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// DID:WBA (Web-Based Agent) Types\n// =============================================================================\n\n/**\n * DID:WBA authentication credentials for federation.\n * Used for domain-anchored decentralized identity.\n */\nexport interface DIDWBACredentials {\n method: \"did:wba\";\n /** DID and proof nested in metadata (matches wire format) */\n metadata: {\n /** The DID of the connecting system/agent (e.g., \"did:wba:agents.example.com:gateway\") */\n did: string;\n /** Cryptographic proof of DID ownership */\n proof: DIDWBAProof;\n };\n}\n\n/**\n * Cryptographic proof for DID:WBA authentication.\n */\nexport interface DIDWBAProof {\n /** Proof type (e.g., \"JsonWebSignature2020\", \"Ed25519Signature2020\") */\n type: string;\n /** ISO 8601 timestamp of proof creation */\n created: string;\n /** Server-provided nonce (prevents replay) */\n challenge: string;\n /** JWS signature over (challenge + did + created) */\n jws: string;\n}\n\n/**\n * DID Document structure for MAP federation.\n * Resolved from `did:wba:<domain>:<path>` → `https://<domain>/<path>/did.json`\n */\nexport interface DIDDocument {\n \"@context\"?: string | string[];\n id: string;\n verificationMethod?: DIDVerificationMethod[];\n authentication?: string[];\n service?: DIDService[];\n}\n\n/**\n * A verification method within a DID Document.\n */\nexport interface DIDVerificationMethod {\n id: string;\n type: string;\n controller: string;\n publicKeyJwk?: Record<string, unknown>;\n}\n\n/**\n * A service endpoint within a DID Document.\n */\nexport interface DIDService {\n id: string;\n type: string;\n serviceEndpoint: string | Record<string, unknown>;\n /** MAP protocol version (for MAPFederationEndpoint services) */\n mapProtocolVersion?: number;\n /** MAP capabilities advertised by this endpoint */\n mapCapabilities?: Record<string, boolean>;\n}\n\n/**\n * Union type for all supported federation auth credentials.\n */\nexport type MAPFederationAuth = FederationAuth | DIDWBACredentials;\n\n// =============================================================================\n// Connect Types\n// =============================================================================\n\n/** Policy for handling unexpected disconnection */\nexport interface DisconnectPolicy {\n /** What happens to agents on disconnect */\n agentBehavior: \"unregister\" | \"orphan\" | \"grace-period\";\n /** Grace period before unregistering (ms) */\n gracePeriodMs?: number;\n /** Emit events to subscribers */\n notifySubscribers?: boolean;\n}\n\nexport interface ConnectRequestParams {\n protocolVersion: ProtocolVersion;\n participantType: ParticipantType;\n participantId?: ParticipantId;\n name?: string;\n capabilities?: ParticipantCapabilities;\n sessionId?: SessionId;\n /** Token to resume a previously disconnected session */\n resumeToken?: string;\n /** Reclaim orphaned agents from previous connection */\n reclaimAgents?: AgentId[];\n /** Policy for unexpected disconnect */\n disconnectPolicy?: DisconnectPolicy;\n /** Authentication credentials */\n auth?: AuthCredentials;\n _meta?: Meta;\n}\n\nexport interface ConnectRequest extends MAPRequestBase<ConnectRequestParams> {\n method: \"map/connect\";\n params: ConnectRequestParams;\n}\n\nexport interface ConnectResponseResult {\n protocolVersion: ProtocolVersion;\n sessionId: SessionId;\n participantId: ParticipantId;\n capabilities: ParticipantCapabilities;\n systemInfo?: {\n name?: string;\n version?: string;\n };\n /** Is this a reconnection? */\n reconnected?: boolean;\n /** Reclaimed agents */\n reclaimedAgents?: Agent[];\n /** Currently owned agents */\n ownedAgents?: AgentId[];\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Auth required but not provided - client should authenticate */\n authRequired?: ServerAuthCapabilities;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Disconnect Types\n// =============================================================================\n\nexport interface DisconnectRequestParams {\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface DisconnectRequest extends MAPRequestBase<DisconnectRequestParams> {\n method: \"map/disconnect\";\n params?: DisconnectRequestParams;\n}\n\nexport interface DisconnectResponseResult {\n session: SessionInfo;\n /** Token to resume this session later */\n resumeToken?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Session Request/Response Types\n// =============================================================================\n\nexport interface SessionListRequestParams {\n _meta?: Meta;\n}\n\nexport interface SessionListRequest extends MAPRequestBase<SessionListRequestParams> {\n method: \"map/session/list\";\n params?: SessionListRequestParams;\n}\n\nexport interface SessionListResponseResult {\n sessions: SessionInfo[];\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequestParams {\n sessionId: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionLoadRequest extends MAPRequestBase<SessionLoadRequestParams> {\n method: \"map/session/load\";\n params: SessionLoadRequestParams;\n}\n\nexport interface SessionLoadResponseResult {\n sessionId: SessionId;\n restored: boolean;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequestParams {\n sessionId?: SessionId;\n _meta?: Meta;\n}\n\nexport interface SessionCloseRequest extends MAPRequestBase<SessionCloseRequestParams> {\n method: \"map/session/close\";\n params?: SessionCloseRequestParams;\n}\n\nexport interface SessionCloseResponseResult {\n session: SessionInfo;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Agents Request/Response Types\n// =============================================================================\n\nexport interface AgentsListFilter {\n states?: AgentState[];\n roles?: string[];\n scopes?: ScopeId[];\n parent?: AgentId;\n hasChildren?: boolean;\n ownerId?: ParticipantId;\n /** Filter by structured capability ID (e.g., \"doc:summarize\") */\n capabilityId?: string;\n /** Filter by semantic tags from capability descriptor */\n tags?: string[];\n /** Filter by accepted content type */\n accepts?: string;\n}\n\nexport interface AgentsListRequestParams {\n filter?: AgentsListFilter;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsListRequest extends MAPRequestBase<AgentsListRequestParams> {\n method: \"map/agents/list\";\n params?: AgentsListRequestParams;\n}\n\nexport interface AgentsListResponseResult {\n agents: Agent[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n/** Options for expanding related agents */\nexport interface AgentIncludeOptions {\n parent?: boolean;\n children?: boolean;\n siblings?: boolean;\n ancestors?: boolean;\n descendants?: boolean;\n maxDepth?: number;\n}\n\nexport interface AgentsGetRequestParams {\n agentId: AgentId;\n include?: AgentIncludeOptions;\n _meta?: Meta;\n}\n\nexport interface AgentsGetRequest extends MAPRequestBase<AgentsGetRequestParams> {\n method: \"map/agents/get\";\n params: AgentsGetRequestParams;\n}\n\nexport interface AgentsGetResponseResult {\n agent: Agent;\n parent?: Agent;\n children?: Agent[];\n siblings?: Agent[];\n ancestors?: Agent[];\n descendants?: Agent[];\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n /** Compute environment where this agent runs */\n environment?: AgentEnvironment;\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: MAPAgentCapabilityDescriptor;\n metadata?: Record<string, unknown>;\n /** Permission overrides merged on top of role-based defaults */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsRegisterRequest extends MAPRequestBase<AgentsRegisterRequestParams> {\n method: \"map/agents/register\";\n params?: AgentsRegisterRequestParams;\n}\n\nexport interface AgentsRegisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsUnregisterRequest extends MAPRequestBase<AgentsUnregisterRequestParams> {\n method: \"map/agents/unregister\";\n params: AgentsUnregisterRequestParams;\n}\n\nexport interface AgentsUnregisterResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequestParams {\n agentId: AgentId;\n state?: AgentState;\n /** Update agent's compute environment */\n environment?: AgentEnvironment;\n metadata?: Record<string, unknown>;\n /**\n * Permission overrides to apply to the agent.\n * Merged on top of role-based defaults.\n */\n permissionOverrides?: Partial<AgentPermissions>;\n _meta?: Meta;\n}\n\nexport interface AgentsUpdateRequest extends MAPRequestBase<AgentsUpdateRequestParams> {\n method: \"map/agents/update\";\n params: AgentsUpdateRequestParams;\n}\n\nexport interface AgentsUpdateResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequestParams {\n agentId?: AgentId;\n name?: string;\n description?: string;\n role?: string;\n parent?: AgentId;\n scopes?: ScopeId[];\n visibility?: AgentVisibility;\n capabilities?: ParticipantCapabilities;\n /** Compute environment where this agent runs */\n environment?: AgentEnvironment;\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: MAPAgentCapabilityDescriptor;\n initialMessage?: Message;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AgentsSpawnRequest extends MAPRequestBase<AgentsSpawnRequestParams> {\n method: \"map/agents/spawn\";\n params?: AgentsSpawnRequestParams;\n}\n\nexport interface AgentsSpawnResponseResult {\n agent: Agent;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequestParams {\n agentId: AgentId;\n reason?: string;\n force?: boolean;\n _meta?: Meta;\n}\n\nexport interface AgentsStopRequest extends MAPRequestBase<AgentsStopRequestParams> {\n method: \"map/agents/stop\";\n params: AgentsStopRequestParams;\n}\n\nexport interface AgentsStopResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequestParams {\n agentId: AgentId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface AgentsSuspendRequest extends MAPRequestBase<AgentsSuspendRequestParams> {\n method: \"map/agents/suspend\";\n params: AgentsSuspendRequestParams;\n}\n\nexport interface AgentsSuspendResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequestParams {\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface AgentsResumeRequest extends MAPRequestBase<AgentsResumeRequestParams> {\n method: \"map/agents/resume\";\n params: AgentsResumeRequestParams;\n}\n\nexport interface AgentsResumeResponseResult {\n agent: Agent;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Send Types\n// =============================================================================\n\nexport interface SendRequestParams {\n to: Address;\n payload?: unknown;\n meta?: MessageMeta;\n _meta?: Meta;\n}\n\nexport interface SendRequest extends MAPRequestBase<SendRequestParams> {\n method: \"map/send\";\n params: SendRequestParams;\n}\n\nexport interface SendResponseResult {\n messageId: MessageId;\n delivered?: ParticipantId[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Subscribe Types\n// =============================================================================\n\nexport interface SubscribeRequestParams {\n filter?: SubscriptionFilter;\n options?: SubscriptionOptions;\n replayFrom?: Timestamp | string;\n _meta?: Meta;\n}\n\nexport interface SubscribeRequest extends MAPRequestBase<SubscribeRequestParams> {\n method: \"map/subscribe\";\n params?: SubscribeRequestParams;\n}\n\nexport interface SubscribeResponseResult {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequestParams {\n subscriptionId: SubscriptionId;\n _meta?: Meta;\n}\n\nexport interface UnsubscribeRequest extends MAPRequestBase<UnsubscribeRequestParams> {\n method: \"map/unsubscribe\";\n params: UnsubscribeRequestParams;\n}\n\nexport interface UnsubscribeResponseResult {\n subscription: {\n id: SubscriptionId;\n closedAt: Timestamp;\n };\n _meta?: Meta;\n}\n\n// =============================================================================\n// Replay Types\n// =============================================================================\n\n/**\n * A replayed event with its envelope metadata.\n */\nexport interface ReplayedEvent {\n /** Globally unique event ID (ULID format) */\n eventId: string;\n /** Server timestamp when event was originally processed */\n timestamp: Timestamp;\n /** Event IDs that causally precede this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n}\n\n/**\n * Parameters for replaying historical events.\n *\n * Uses keyset pagination with `afterEventId` - pass the last eventId\n * from the previous response to get the next page of results.\n *\n * @example\n * ```typescript\n * // Replay from a specific point\n * const page1 = await client.replay({ limit: 100 });\n * const page2 = await client.replay({\n * afterEventId: page1.events.at(-1)?.eventId,\n * limit: 100\n * });\n * ```\n */\nexport interface ReplayRequestParams {\n /**\n * Start after this eventId (exclusive).\n * Used for keyset pagination - pass the last eventId from previous response.\n */\n afterEventId?: string;\n\n /**\n * Alternative: start from this timestamp (inclusive).\n * If both afterEventId and fromTimestamp are provided, afterEventId takes precedence.\n */\n fromTimestamp?: Timestamp;\n\n /**\n * End at this timestamp (inclusive).\n * If not provided, replays up to the most recent event.\n */\n toTimestamp?: Timestamp;\n\n /**\n * Filter events (same as subscription filter).\n */\n filter?: SubscriptionFilter;\n\n /**\n * Maximum number of events to return.\n * Default: 100, Maximum: 1000\n */\n limit?: number;\n\n _meta?: Meta;\n}\n\nexport interface ReplayRequest extends MAPRequestBase<ReplayRequestParams> {\n method: \"map/replay\";\n params?: ReplayRequestParams;\n}\n\nexport interface ReplayResponseResult {\n /** Replayed events in chronological order */\n events: ReplayedEvent[];\n\n /** Whether more events exist after the last returned event */\n hasMore: boolean;\n\n /**\n * Total count of matching events (if known).\n * May be omitted for performance reasons on large result sets.\n */\n totalCount?: number;\n\n _meta?: Meta;\n}\n\n// =============================================================================\n// Auth Types\n// =============================================================================\n\nexport interface AuthRefreshRequestParams {\n refreshToken: string;\n _meta?: Meta;\n}\n\nexport interface AuthRefreshRequest extends MAPRequestBase<AuthRefreshRequestParams> {\n method: \"map/auth/refresh\";\n params: AuthRefreshRequestParams;\n}\n\nexport interface AuthRefreshResponseResult {\n accessToken: string;\n expiresAt: Timestamp;\n refreshToken?: string;\n _meta?: Meta;\n}\n\n/**\n * Parameters for map/authenticate request.\n * Used when auth negotiation is required after initial connect.\n */\nexport interface AuthenticateRequestParams {\n /** The authentication method being used */\n method: AuthMethod;\n /** The credential value (token, API key, etc.) */\n credential?: string;\n /** Method-specific additional data */\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface AuthenticateRequest extends MAPRequestBase<AuthenticateRequestParams> {\n method: \"map/authenticate\";\n params: AuthenticateRequestParams;\n}\n\n/**\n * Response from map/authenticate request.\n */\nexport interface AuthenticateResponseResult {\n /** Whether authentication succeeded */\n success: boolean;\n /** Session ID (if auth succeeded) */\n sessionId?: SessionId;\n /** Participant ID (if auth succeeded) */\n participantId?: ParticipantId;\n /** Authenticated principal (if auth succeeded) */\n principal?: AuthPrincipal;\n /** Error details (if auth failed) */\n error?: AuthError;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Scope Types\n// =============================================================================\n\nexport interface ScopesListRequestParams {\n parent?: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesListRequest extends MAPRequestBase<ScopesListRequestParams> {\n method: \"map/scopes/list\";\n params?: ScopesListRequestParams;\n}\n\nexport interface ScopesListResponseResult {\n scopes: Scope[];\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesGetRequest extends MAPRequestBase<ScopesGetRequestParams> {\n method: \"map/scopes/get\";\n params: ScopesGetRequestParams;\n}\n\nexport interface ScopesGetResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequestParams {\n scopeId?: ScopeId;\n name?: string;\n description?: string;\n parent?: ScopeId;\n joinPolicy?: JoinPolicy;\n autoJoinRoles?: string[];\n visibility?: ScopeVisibility;\n messageVisibility?: MessageVisibility;\n sendPolicy?: SendPolicy;\n persistent?: boolean;\n autoDelete?: boolean;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface ScopesCreateRequest extends MAPRequestBase<ScopesCreateRequestParams> {\n method: \"map/scopes/create\";\n params?: ScopesCreateRequestParams;\n}\n\nexport interface ScopesCreateResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequestParams {\n scopeId: ScopeId;\n _meta?: Meta;\n}\n\nexport interface ScopesDeleteRequest extends MAPRequestBase<ScopesDeleteRequestParams> {\n method: \"map/scopes/delete\";\n params: ScopesDeleteRequestParams;\n}\n\nexport interface ScopesDeleteResponseResult {\n scope: Scope;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesJoinRequest extends MAPRequestBase<ScopesJoinRequestParams> {\n method: \"map/scopes/join\";\n params: ScopesJoinRequestParams;\n}\n\nexport interface ScopesJoinResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequestParams {\n scopeId: ScopeId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface ScopesLeaveRequest extends MAPRequestBase<ScopesLeaveRequestParams> {\n method: \"map/scopes/leave\";\n params: ScopesLeaveRequestParams;\n}\n\nexport interface ScopesLeaveResponseResult {\n scope: Scope;\n agent: Agent;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequestParams {\n scopeId: ScopeId;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface ScopesMembersRequest extends MAPRequestBase<ScopesMembersRequestParams> {\n method: \"map/scopes/members\";\n params: ScopesMembersRequestParams;\n}\n\nexport interface ScopesMembersResponseResult {\n members: AgentId[];\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Structure Graph Types\n// =============================================================================\n\nexport interface StructureGraphRequestParams {\n rootAgentId?: AgentId;\n depth?: number;\n includeRelationships?: boolean;\n _meta?: Meta;\n}\n\nexport interface StructureGraphRequest extends MAPRequestBase<StructureGraphRequestParams> {\n method: \"map/structure/graph\";\n params?: StructureGraphRequestParams;\n}\n\nexport interface GraphEdge {\n from: AgentId;\n to: AgentId;\n type: \"parent-child\" | \"peer\" | \"supervisor\" | \"collaborator\";\n}\n\nexport interface StructureGraphResponseResult {\n nodes: Agent[];\n edges: GraphEdge[];\n _meta?: Meta;\n}\n\n// =============================================================================\n// Inject Types\n// =============================================================================\n\nexport type InjectDelivery = \"interrupt\" | \"queue\" | \"best-effort\";\nexport type InjectDeliveryResult = \"interrupt\" | \"queue\" | \"message\";\n\nexport interface InjectRequestParams {\n agentId: AgentId;\n content: unknown;\n delivery?: InjectDelivery;\n _meta?: Meta;\n}\n\nexport interface InjectRequest extends MAPRequestBase<InjectRequestParams> {\n method: \"map/inject\";\n params: InjectRequestParams;\n}\n\nexport interface InjectResponseResult {\n injected: boolean;\n delivery?: InjectDeliveryResult;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Permission Update Types\n// =============================================================================\n\n/**\n * Parameters for updating client permissions.\n * Only system/admin participants can update client permissions.\n */\nexport interface PermissionsUpdateRequestParams {\n /** Client to update permissions for */\n clientId: ParticipantId;\n /** Partial permissions to merge with existing */\n permissions: Partial<ParticipantCapabilities>;\n _meta?: Meta;\n}\n\nexport interface PermissionsUpdateRequest extends MAPRequestBase<PermissionsUpdateRequestParams> {\n method: \"map/permissions/update\";\n params: PermissionsUpdateRequestParams;\n}\n\nexport interface PermissionsUpdateResponseResult {\n /** Whether update was applied */\n success: boolean;\n /** Effective permissions after update */\n effectivePermissions: ParticipantCapabilities;\n _meta?: Meta;\n}\n\n/**\n * Event data for permissions_client_updated events.\n * Emitted when a client's permissions are changed.\n */\nexport interface PermissionsClientUpdatedEventData {\n /** Client whose permissions changed */\n clientId: ParticipantId;\n /** The permission changes that were applied */\n changes: Partial<ParticipantCapabilities>;\n /** Effective permissions after the update */\n effectivePermissions: ParticipantCapabilities;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n/**\n * Event data for permissions_agent_updated events.\n * Emitted when an agent's permission overrides are changed.\n */\nexport interface PermissionsAgentUpdatedEventData {\n /** Agent whose permissions changed */\n agentId: AgentId;\n /** The permission changes that were applied */\n changes: Partial<AgentPermissions>;\n /** Effective permissions after the update */\n effectivePermissions: AgentPermissions;\n /** Participant who made the change */\n updatedBy: ParticipantId;\n}\n\n// =============================================================================\n// Federation Types\n// =============================================================================\n\n/**\n * Metadata for federation routing and tracking.\n * Included in every message routed between federated systems.\n */\nexport interface FederationMetadata {\n /** System that originated this message */\n sourceSystem: string;\n /** Intended final destination system */\n targetSystem: string;\n /** Number of systems this message has traversed */\n hopCount: number;\n /** Maximum hops before rejection (prevents infinite loops) */\n maxHops?: number;\n /** Systems this message has traversed (for debugging/loop detection) */\n path?: string[];\n /** Timestamp when message was first sent (ms since epoch) */\n originTimestamp: Timestamp;\n /** Correlation ID for cross-system tracing */\n correlationId?: string;\n /**\n * Signature for integrity verification.\n * @todo Define signing algorithm and key management\n */\n signature?: string;\n}\n\n/**\n * Envelope for messages routed between federated systems.\n * Wraps the payload with routing metadata for tracking and loop prevention.\n *\n * @typeParam T - The payload type (typically Message)\n *\n * @example\n * ```typescript\n * const envelope: FederationEnvelope<Message> = {\n * payload: message,\n * federation: {\n * sourceSystem: 'alpha',\n * targetSystem: 'beta',\n * hopCount: 0,\n * originTimestamp: Date.now(),\n * },\n * };\n * ```\n */\nexport interface FederationEnvelope<T = unknown> {\n /** The payload being routed */\n payload: T;\n /** Federation routing metadata */\n federation: FederationMetadata;\n}\n\n/**\n * Configuration for federation routing behavior.\n * Used by gateways to control message routing policies.\n */\nexport interface FederationRoutingConfig {\n /** This system's identifier */\n systemId: string;\n /** Maximum hops to accept (default: 10) */\n maxHops?: number;\n /** Whether to track full path for debugging (default: false) */\n trackPath?: boolean;\n /** Systems we're willing to route to (undefined = all) */\n allowedTargets?: string[];\n /** Systems we accept routes from (undefined = all) */\n allowedSources?: string[];\n}\n\n// =============================================================================\n// Federation Reconnection Types\n// =============================================================================\n\n/**\n * Configuration for buffering messages during federation outages.\n * Messages are stored locally until the peer reconnects.\n */\nexport interface FederationBufferConfig {\n /** Enable buffering of messages during disconnection (default: true) */\n enabled?: boolean;\n /** Maximum number of messages to buffer per peer (default: 1000) */\n maxMessages?: number;\n /** Maximum buffer size in bytes per peer (default: 10MB) */\n maxBytes?: number;\n /** Time to retain buffered messages in ms (default: 1 hour) */\n retentionMs?: number;\n /** Strategy when buffer is full */\n overflowStrategy?: \"drop-oldest\" | \"drop-newest\" | \"reject\";\n}\n\n/**\n * Configuration for replaying events from event store on reconnection.\n * Supplements buffer with persisted events.\n */\nexport interface FederationReplayConfig {\n /** Enable replay from event store on reconnection (default: true) */\n enabled?: boolean;\n /** Maximum time window for replay in ms (default: 1 hour) */\n maxReplayWindowMs?: number;\n /** Maximum number of events to replay (default: 10000) */\n maxReplayEvents?: number;\n /** Filter for events to replay (optional) */\n filter?: SubscriptionFilter;\n}\n\n/**\n * Type of gateway reconnection event.\n */\nexport type GatewayReconnectionEventType =\n | \"connecting\"\n | \"connected\"\n | \"disconnected\"\n | \"reconnecting\"\n | \"reconnect_failed\"\n | \"buffer_overflow\"\n | \"replay_started\"\n | \"replay_completed\";\n\n/**\n * Event emitted during gateway reconnection lifecycle.\n */\nexport interface GatewayReconnectionEvent {\n /** Type of reconnection event */\n type: GatewayReconnectionEventType;\n /** Target system ID */\n systemId: string;\n /** Timestamp of the event */\n timestamp: Timestamp;\n /** Current reconnection attempt (for reconnecting events) */\n attempt?: number;\n /** Error message (for disconnected/reconnect_failed) */\n error?: string;\n /** Number of buffered messages (for buffer_overflow) */\n bufferedCount?: number;\n /** Number of events being replayed (for replay_started/completed) */\n replayCount?: number;\n /** Duration of outage in ms (for connected after reconnect) */\n outageDurationMs?: number;\n}\n\n/** Handler for gateway reconnection events */\nexport type GatewayReconnectionEventHandler = (\n event: GatewayReconnectionEvent,\n) => void;\n\n/**\n * Options for gateway connection with reconnection support.\n * Extends base connection options with federation-specific settings.\n */\nexport interface GatewayReconnectionOptions {\n /** Enable automatic reconnection (default: true) */\n autoReconnect?: boolean;\n /** Initial delay before first reconnection attempt in ms (default: 1000) */\n initialDelayMs?: number;\n /** Maximum delay between reconnection attempts in ms (default: 30000) */\n maxDelayMs?: number;\n /** Backoff multiplier for exponential backoff (default: 2) */\n backoffMultiplier?: number;\n /** Maximum number of reconnection attempts (default: Infinity) */\n maxRetries?: number;\n /** Add random jitter to delays (default: true) */\n jitter?: boolean;\n /** Buffer configuration for outages */\n buffer?: FederationBufferConfig;\n /** Replay configuration for event store recovery */\n replay?: FederationReplayConfig;\n /** Handler for reconnection lifecycle events */\n onReconnectionEvent?: GatewayReconnectionEventHandler;\n}\n\nexport interface FederationConnectRequestParams {\n systemId: string;\n endpoint: string;\n auth?: FederationAuth;\n /** Pre-fetched server auth context (e.g., from .well-known discovery) */\n authContext?: {\n /** How the client learned the server's auth requirements */\n source: \"well-known\" | \"cached\" | \"configured\";\n /** Server's nonce/challenge (if pre-fetched, e.g., for did:wba) */\n challenge?: string;\n };\n /** System info about the connecting peer */\n systemInfo?: { name: string; version: string; endpoint: string };\n /** MAP protocol version (default: 1) */\n protocolVersion?: number;\n /** What this peer exposes to the other side */\n exposure?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface FederationConnectRequest extends MAPRequestBase<FederationConnectRequestParams> {\n method: \"map/federation/connect\";\n params: FederationConnectRequestParams;\n}\n\nexport interface FederationConnectResponseResult {\n connected: boolean;\n systemInfo?: {\n name?: string;\n version?: string;\n capabilities?: ParticipantCapabilities;\n };\n /** Federation session ID (when single-request auth succeeds) */\n sessionId?: string;\n /** Authenticated principal (when single-request auth succeeds) */\n principal?: AuthPrincipal;\n /** Auth negotiation fallback (when auth not provided or failed recoverably) */\n authRequired?: {\n methods: string[];\n /** Server-generated challenge nonce (e.g., for did:wba) */\n challenge?: string;\n required: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequestParams {\n /** Target system ID (for immediate next hop) */\n systemId: string;\n /**\n * Wrapped message with federation metadata.\n * Use this for new implementations.\n */\n envelope?: FederationEnvelope<Message>;\n /**\n * Raw message (legacy format).\n * @deprecated Use envelope instead for proper routing metadata\n */\n message?: Message;\n _meta?: Meta;\n}\n\nexport interface FederationRouteRequest extends MAPRequestBase<FederationRouteRequestParams> {\n method: \"map/federation/route\";\n params: FederationRouteRequestParams;\n}\n\nexport interface FederationRouteResponseResult {\n routed: boolean;\n messageId?: MessageId;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Mail Types - Conversation, Turn, and Thread types\n// =============================================================================\n\n/**\n * Type of conversation.\n */\nexport type ConversationType =\n | \"user-session\"\n | \"agent-task\"\n | \"multi-agent\"\n | \"mixed\";\n\n/**\n * Status of a conversation.\n */\nexport type ConversationStatus =\n | \"active\"\n | \"paused\"\n | \"completed\"\n | \"failed\"\n | \"archived\";\n\n/**\n * A conversation - a container for tracking related interactions.\n */\nexport interface Conversation {\n id: ConversationId;\n type: ConversationType;\n status: ConversationStatus;\n subject?: string;\n participantCount: number;\n parentConversationId?: ConversationId;\n parentTurnId?: TurnId;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n closedAt?: Timestamp;\n createdBy: ParticipantId;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Role of a participant within a conversation.\n */\nexport type ParticipantRole =\n | \"initiator\"\n | \"assistant\"\n | \"worker\"\n | \"observer\"\n | \"moderator\";\n\n/**\n * Permissions for a participant within a conversation.\n */\nexport interface ConversationPermissions {\n canSend: boolean;\n canObserve: boolean;\n canInvite: boolean;\n canRemove: boolean;\n canCreateThreads: boolean;\n historyAccess: \"none\" | \"from-join\" | \"full\";\n canSeeInternal: boolean;\n _meta?: Meta;\n}\n\n/**\n * A participant in a conversation with role and permissions.\n */\nexport interface ConversationParticipant {\n id: ParticipantId;\n type: \"user\" | \"agent\" | \"system\";\n role: ParticipantRole;\n joinedAt: Timestamp;\n leftAt?: Timestamp;\n permissions: ConversationPermissions;\n agentInfo?: {\n agentId: AgentId;\n name?: string;\n role?: string;\n };\n _meta?: Meta;\n}\n\n/**\n * A thread within a conversation for focused discussion.\n */\nexport interface Thread {\n id: ThreadId;\n conversationId: ConversationId;\n parentThreadId?: ThreadId;\n subject?: string;\n rootTurnId: TurnId;\n turnCount: number;\n participantCount: number;\n createdAt: Timestamp;\n updatedAt: Timestamp;\n createdBy: ParticipantId;\n _meta?: Meta;\n}\n\n/**\n * How a turn was created.\n * - 'explicit': Created directly via mail/turn call\n * - 'intercepted': Auto-recorded from map/send with mail meta\n */\nexport type TurnSource =\n | { type: \"explicit\"; method: \"mail/turn\" }\n | { type: \"intercepted\"; messageId: MessageId };\n\n/**\n * Visibility of a turn within a conversation.\n */\nexport type TurnVisibility =\n | { type: \"all\" }\n | { type: \"participants\"; ids: ParticipantId[] }\n | { type: \"role\"; roles: ParticipantRole[] }\n | { type: \"private\" };\n\n/**\n * Status of a turn's content lifecycle.\n */\nexport type TurnStatus = \"pending\" | \"streaming\" | \"complete\" | \"failed\";\n\n/**\n * A turn - the atomic unit of conversation.\n * Records what a participant intentionally communicates.\n *\n * Content uses a generic model:\n * - Well-known types: 'text', 'data', 'event', 'reference'\n * - Custom types use 'x-' prefix (e.g., 'x-tool-call')\n */\nexport interface Turn {\n id: TurnId;\n conversationId: ConversationId;\n participant: ParticipantId;\n timestamp: Timestamp;\n /** Content type - well-known ('text', 'data', 'event', 'reference') or custom ('x-*') */\n contentType: string;\n /** Content payload - shape determined by contentType */\n content: unknown;\n /** Thread this turn belongs to */\n threadId?: ThreadId;\n /** Turn this is in reply to */\n inReplyTo?: TurnId;\n /** How this turn was created */\n source: TurnSource;\n /** Who can see this turn */\n visibility?: TurnVisibility;\n /** Status of the turn content */\n status?: TurnStatus;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Mail metadata for map/send turn tracking.\n * Include in MessageMeta.mail to route AND record a turn.\n */\nexport interface MailMessageMeta {\n conversationId: ConversationId;\n threadId?: ThreadId;\n inReplyTo?: TurnId;\n visibility?: TurnVisibility;\n}\n\n/**\n * Mail-specific subscription filter.\n * Used in SubscriptionFilter.mail for filtering mail events.\n */\nexport interface MailSubscriptionFilter {\n conversationId?: ConversationId;\n threadId?: ThreadId;\n participantId?: ParticipantId;\n contentType?: string;\n}\n\n// =============================================================================\n// Mail Event Data Types\n// =============================================================================\n\n/** Data for mail.created events */\nexport interface MailCreatedEventData {\n conversationId: ConversationId;\n type: ConversationType;\n subject?: string;\n createdBy: ParticipantId;\n}\n\n/** Data for mail.closed events */\nexport interface MailClosedEventData {\n conversationId: ConversationId;\n closedBy: ParticipantId;\n reason?: string;\n}\n\n/** Data for mail.participant.joined events */\nexport interface MailParticipantJoinedEventData {\n conversationId: ConversationId;\n participant: ConversationParticipant;\n}\n\n/** Data for mail.participant.left events */\nexport interface MailParticipantLeftEventData {\n conversationId: ConversationId;\n participantId: ParticipantId;\n reason?: string;\n}\n\n/** Data for mail.turn.added events */\nexport interface MailTurnAddedEventData {\n conversationId: ConversationId;\n turn: Turn;\n}\n\n/** Data for mail.turn.updated events */\nexport interface MailTurnUpdatedEventData {\n conversationId: ConversationId;\n turnId: TurnId;\n status?: TurnStatus;\n}\n\n/** Data for mail.thread.created events */\nexport interface MailThreadCreatedEventData {\n conversationId: ConversationId;\n thread: Thread;\n}\n\n/** Data for mail.summary.generated events */\nexport interface MailSummaryGeneratedEventData {\n conversationId: ConversationId;\n summary: string;\n}\n\n// =============================================================================\n// Mail Request/Response Types\n// =============================================================================\n\n// --- mail/create ---\n\nexport interface MailCreateRequestParams {\n type?: ConversationType;\n subject?: string;\n parentConversationId?: ConversationId;\n parentTurnId?: TurnId;\n initialParticipants?: Array<{\n id: ParticipantId;\n role?: ParticipantRole;\n permissions?: Partial<ConversationPermissions>;\n }>;\n initialTurn?: {\n contentType: string;\n content: unknown;\n visibility?: TurnVisibility;\n };\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface MailCreateRequest extends MAPRequestBase<MailCreateRequestParams> {\n method: \"mail/create\";\n params: MailCreateRequestParams;\n}\n\nexport interface MailCreateResponseResult {\n conversation: Conversation;\n participant: ConversationParticipant;\n initialTurn?: Turn;\n _meta?: Meta;\n}\n\n// --- mail/get ---\n\nexport interface MailGetRequestParams {\n conversationId: ConversationId;\n include?: {\n participants?: boolean;\n threads?: boolean;\n recentTurns?: number;\n stats?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailGetRequest extends MAPRequestBase<MailGetRequestParams> {\n method: \"mail/get\";\n params: MailGetRequestParams;\n}\n\nexport interface MailGetResponseResult {\n conversation: Conversation;\n participants?: ConversationParticipant[];\n threads?: Thread[];\n recentTurns?: Turn[];\n stats?: {\n totalTurns: number;\n turnsByContentType: Record<string, number>;\n activeParticipants: number;\n threadCount: number;\n };\n _meta?: Meta;\n}\n\n// --- mail/list ---\n\nexport interface MailListRequestParams {\n filter?: {\n type?: ConversationType[];\n status?: ConversationStatus[];\n participantId?: ParticipantId;\n createdAfter?: Timestamp;\n createdBefore?: Timestamp;\n parentConversationId?: ConversationId;\n };\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface MailListRequest extends MAPRequestBase<MailListRequestParams> {\n method: \"mail/list\";\n params?: MailListRequestParams;\n}\n\nexport interface MailListResponseResult {\n conversations: Conversation[];\n nextCursor?: string;\n hasMore: boolean;\n _meta?: Meta;\n}\n\n// --- mail/close ---\n\nexport interface MailCloseRequestParams {\n conversationId: ConversationId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface MailCloseRequest extends MAPRequestBase<MailCloseRequestParams> {\n method: \"mail/close\";\n params: MailCloseRequestParams;\n}\n\nexport interface MailCloseResponseResult {\n conversation: Conversation;\n _meta?: Meta;\n}\n\n// --- mail/join ---\n\nexport interface MailJoinRequestParams {\n conversationId: ConversationId;\n role?: ParticipantRole;\n catchUp?: {\n from: string | number;\n limit?: number;\n includeSummary?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailJoinRequest extends MAPRequestBase<MailJoinRequestParams> {\n method: \"mail/join\";\n params: MailJoinRequestParams;\n}\n\nexport interface MailJoinResponseResult {\n conversation: Conversation;\n participant: ConversationParticipant;\n history?: Turn[];\n historyCursor?: string;\n summary?: string;\n _meta?: Meta;\n}\n\n// --- mail/leave ---\n\nexport interface MailLeaveRequestParams {\n conversationId: ConversationId;\n reason?: string;\n _meta?: Meta;\n}\n\nexport interface MailLeaveRequest extends MAPRequestBase<MailLeaveRequestParams> {\n method: \"mail/leave\";\n params: MailLeaveRequestParams;\n}\n\nexport interface MailLeaveResponseResult {\n success: boolean;\n leftAt: Timestamp;\n _meta?: Meta;\n}\n\n// --- mail/invite ---\n\nexport interface MailInviteRequestParams {\n conversationId: ConversationId;\n participant: {\n id: ParticipantId;\n role?: ParticipantRole;\n permissions?: Partial<ConversationPermissions>;\n };\n message?: string;\n _meta?: Meta;\n}\n\nexport interface MailInviteRequest extends MAPRequestBase<MailInviteRequestParams> {\n method: \"mail/invite\";\n params: MailInviteRequestParams;\n}\n\nexport interface MailInviteResponseResult {\n invited: boolean;\n participant?: ConversationParticipant;\n invitationId?: string;\n pending?: boolean;\n _meta?: Meta;\n}\n\n// --- mail/turn ---\n\nexport interface MailTurnRequestParams {\n conversationId: ConversationId;\n contentType: string;\n content: unknown;\n threadId?: ThreadId;\n inReplyTo?: TurnId;\n visibility?: TurnVisibility;\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\nexport interface MailTurnRequest extends MAPRequestBase<MailTurnRequestParams> {\n method: \"mail/turn\";\n params: MailTurnRequestParams;\n}\n\nexport interface MailTurnResponseResult {\n turn: Turn;\n _meta?: Meta;\n}\n\n// --- mail/turns/list ---\n\nexport interface MailTurnsListRequestParams {\n conversationId: ConversationId;\n filter?: {\n threadId?: ThreadId;\n includeAllThreads?: boolean;\n contentTypes?: string[];\n participantId?: ParticipantId;\n afterTurnId?: TurnId;\n beforeTurnId?: TurnId;\n afterTimestamp?: Timestamp;\n beforeTimestamp?: Timestamp;\n };\n limit?: number;\n order?: \"asc\" | \"desc\";\n _meta?: Meta;\n}\n\nexport interface MailTurnsListRequest extends MAPRequestBase<MailTurnsListRequestParams> {\n method: \"mail/turns/list\";\n params: MailTurnsListRequestParams;\n}\n\nexport interface MailTurnsListResponseResult {\n turns: Turn[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// --- mail/thread/create ---\n\nexport interface MailThreadCreateRequestParams {\n conversationId: ConversationId;\n rootTurnId: TurnId;\n subject?: string;\n parentThreadId?: ThreadId;\n _meta?: Meta;\n}\n\nexport interface MailThreadCreateRequest extends MAPRequestBase<MailThreadCreateRequestParams> {\n method: \"mail/thread/create\";\n params: MailThreadCreateRequestParams;\n}\n\nexport interface MailThreadCreateResponseResult {\n thread: Thread;\n _meta?: Meta;\n}\n\n// --- mail/thread/list ---\n\nexport interface MailThreadListRequestParams {\n conversationId: ConversationId;\n parentThreadId?: ThreadId;\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface MailThreadListRequest extends MAPRequestBase<MailThreadListRequestParams> {\n method: \"mail/thread/list\";\n params?: MailThreadListRequestParams;\n}\n\nexport interface MailThreadListResponseResult {\n threads: Thread[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// --- mail/summary ---\n\nexport interface MailSummaryRequestParams {\n conversationId: ConversationId;\n scope?: {\n fromTurnId?: TurnId;\n toTurnId?: TurnId;\n threadId?: ThreadId;\n };\n regenerate?: boolean;\n include?: {\n keyPoints?: boolean;\n keyDecisions?: boolean;\n openQuestions?: boolean;\n participants?: boolean;\n };\n _meta?: Meta;\n}\n\nexport interface MailSummaryRequest extends MAPRequestBase<MailSummaryRequestParams> {\n method: \"mail/summary\";\n params: MailSummaryRequestParams;\n}\n\nexport interface MailSummaryResponseResult {\n summary: string;\n keyPoints?: string[];\n keyDecisions?: string[];\n openQuestions?: string[];\n generated: boolean;\n cachedAt?: Timestamp;\n _meta?: Meta;\n}\n\n// --- mail/replay ---\n\nexport interface MailReplayRequestParams {\n conversationId: ConversationId;\n fromTurnId?: TurnId;\n fromTimestamp?: Timestamp;\n threadId?: ThreadId;\n limit?: number;\n contentTypes?: string[];\n _meta?: Meta;\n}\n\nexport interface MailReplayRequest extends MAPRequestBase<MailReplayRequestParams> {\n method: \"mail/replay\";\n params: MailReplayRequestParams;\n}\n\nexport interface MailReplayResponseResult {\n turns: Turn[];\n hasMore: boolean;\n nextCursor?: string;\n missedCount: number;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Workspace Request/Response Types\n// =============================================================================\n\n// --- workspace/search ---\n\nexport interface WorkspaceSearchRequestParams {\n /** Agent whose workspace to search */\n agentId: AgentId;\n /** Search query (matched against filenames) */\n query: string;\n /** Subdirectory to search within (relative to workspace root) */\n cwd?: string;\n /** Max results to return (default 50) */\n limit?: number;\n _meta?: Meta;\n}\n\nexport interface WorkspaceFileResult {\n /** Relative path from workspace root */\n path: string;\n /** Whether this is a directory */\n isDirectory: boolean;\n /** File size in bytes (undefined for directories) */\n size?: number;\n /** MIME type guess based on extension */\n mime?: string;\n}\n\nexport interface WorkspaceSearchResponseResult {\n files: WorkspaceFileResult[];\n _meta?: Meta;\n}\n\n// --- workspace/list ---\n\nexport interface WorkspaceListRequestParams {\n /** Agent whose workspace to list */\n agentId: AgentId;\n /** Directory to list (relative to workspace root, default \".\") */\n directory?: string;\n _meta?: Meta;\n}\n\nexport interface WorkspaceListResponseResult {\n files: WorkspaceFileResult[];\n _meta?: Meta;\n}\n\n// --- workspace/read ---\n\nexport interface WorkspaceReadRequestParams {\n /** Agent whose workspace to read from */\n agentId: AgentId;\n /** File path relative to workspace root */\n path: string;\n /** Optional line range */\n lineRange?: { start: number; end: number };\n _meta?: Meta;\n}\n\nexport interface WorkspaceReadResponseResult {\n /** File text content */\n text: string;\n /** MIME type */\n mime: string;\n /** File size in bytes */\n size: number;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Trajectory Types\n// =============================================================================\n\n/**\n * A trajectory checkpoint records a snapshot of agent work at a meaningful point.\n *\n * The checkpoint intentionally carries only minimal, agent-agnostic fields.\n * Domain-specific data (token usage, file lists, summaries, attribution, VCS\n * info, etc.) belongs in the freeform `metadata` bag so that different agent\n * implementations can attach whatever makes sense for their workflow.\n */\nexport interface TrajectoryCheckpoint {\n /** Unique checkpoint identifier */\n id: CheckpointId;\n /** The agent that created this checkpoint */\n agentId: AgentId;\n /** When the checkpoint was created */\n timestamp: Timestamp;\n /** Short human-readable label (e.g., commit message, task name) */\n label?: string;\n /** Agent's work session identifier (distinct from MAP protocol SessionId) */\n sessionId?: string;\n /** Extensible key-value metadata — agent-specific data goes here */\n metadata?: Record<string, unknown>;\n _meta?: Meta;\n}\n\n/**\n * Content artifact names are freeform strings.\n * Well-known names include \"metadata\", \"transcript\", \"prompts\", \"context\"\n * but agents may define their own.\n */\nexport type TrajectoryContentField = string;\n\n/** Base fields common to both inline and streaming content responses */\nexport interface TrajectoryContentResultBase {\n checkpointId: CheckpointId;\n /** Named content artifacts — small payloads are delivered inline */\n artifacts: Record<string, unknown>;\n}\n\n/** Inline content response — all content fits in a single message */\nexport interface TrajectoryContentResultInline extends TrajectoryContentResultBase {\n streaming: false;\n}\n\n/** Streaming content response — one large artifact will arrive as chunks */\nexport interface TrajectoryContentResultStreaming extends TrajectoryContentResultBase {\n streaming: true;\n /** Unique ID for correlating chunks */\n streamId: string;\n /** Which artifact key is being streamed */\n streamArtifact: string;\n /** Info about the upcoming stream */\n streamInfo: {\n totalBytes: number;\n totalChunks: number;\n encoding: \"base64\";\n };\n}\n\n/** Content result — either inline or streaming */\nexport type TrajectoryContentResult =\n | TrajectoryContentResultInline\n | TrajectoryContentResultStreaming;\n\n/** Params for a content chunk notification */\nexport interface TrajectoryContentChunkParams {\n /** Correlates to streamId from the streaming response */\n streamId: string;\n /** 0-based chunk index */\n index: number;\n /** Base64-encoded chunk data */\n data: string;\n /** True on the last chunk */\n final?: boolean;\n /** SHA-256 checksum of the full content (only on final chunk) */\n checksum?: string;\n}\n\n// =============================================================================\n// Trajectory Subscription Filter\n// =============================================================================\n\n/** Trajectory-specific subscription filter */\nexport interface TrajectorySubscriptionFilter {\n /** Filter by agent ID */\n agentId?: AgentId;\n /** Filter by work session ID */\n sessionId?: string;\n}\n\n// =============================================================================\n// Trajectory Event Data Types\n// =============================================================================\n\n/** Data for trajectory.checkpoint events */\nexport interface TrajectoryCheckpointEventData {\n checkpoint: TrajectoryCheckpoint;\n}\n\n/** Data for trajectory.content.available events */\nexport interface TrajectoryContentAvailableEventData {\n checkpointId: CheckpointId;\n agentId: AgentId;\n}\n\n// =============================================================================\n// Trajectory Request/Response Types\n// =============================================================================\n\n// --- trajectory/checkpoint ---\n\nexport interface TrajectoryCheckpointRequestParams {\n /** Checkpoint data (timestamp auto-filled by server if omitted) */\n checkpoint: Omit<TrajectoryCheckpoint, \"timestamp\"> & {\n timestamp?: Timestamp;\n };\n _meta?: Meta;\n}\n\nexport interface TrajectoryCheckpointRequest extends MAPRequestBase<TrajectoryCheckpointRequestParams> {\n method: \"trajectory/checkpoint\";\n params: TrajectoryCheckpointRequestParams;\n}\n\nexport interface TrajectoryCheckpointResponseResult {\n checkpoint: TrajectoryCheckpoint;\n _meta?: Meta;\n}\n\n// --- trajectory/list ---\n\nexport interface TrajectoryListRequestParams {\n filter?: {\n agentId?: AgentId;\n sessionId?: string;\n afterTimestamp?: Timestamp;\n beforeTimestamp?: Timestamp;\n };\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface TrajectoryListRequest extends MAPRequestBase<TrajectoryListRequestParams> {\n method: \"trajectory/list\";\n params: TrajectoryListRequestParams;\n}\n\nexport interface TrajectoryListResponseResult {\n checkpoints: TrajectoryCheckpoint[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// --- trajectory/get ---\n\nexport interface TrajectoryGetRequestParams {\n checkpointId: CheckpointId;\n _meta?: Meta;\n}\n\nexport interface TrajectoryGetRequest extends MAPRequestBase<TrajectoryGetRequestParams> {\n method: \"trajectory/get\";\n params: TrajectoryGetRequestParams;\n}\n\nexport interface TrajectoryGetResponseResult {\n checkpoint: TrajectoryCheckpoint;\n _meta?: Meta;\n}\n\n// --- trajectory/content ---\n\nexport interface TrajectoryContentRequestParams {\n checkpointId: CheckpointId;\n /** Which content fields to include (default: all) */\n include?: TrajectoryContentField[];\n _meta?: Meta;\n}\n\nexport interface TrajectoryContentRequest extends MAPRequestBase<TrajectoryContentRequestParams> {\n method: \"trajectory/content\";\n params: TrajectoryContentRequestParams;\n}\n\nexport interface TrajectoryContentResponseResult {\n content: TrajectoryContentResult;\n _meta?: Meta;\n}\n\n// --- trajectory/content.chunk (notification) ---\n\nexport interface TrajectoryContentChunkNotification extends MAPNotificationBase<TrajectoryContentChunkParams> {\n method: \"trajectory/content.chunk\";\n params: TrajectoryContentChunkParams;\n}\n\n// =============================================================================\n// Task Types\n// =============================================================================\n\n/** Standard task status values. Implementations may use `meta` for richer states. */\nexport type MAPTaskStatus =\n | \"open\"\n | \"in_progress\"\n | \"blocked\"\n | \"completed\"\n | \"failed\";\n\n/**\n * A task in the MAP system.\n *\n * Intentionally minimal — MAP defines the coordination envelope,\n * not the task semantics. Providers (e.g., OpenTasks) can use\n * the `meta` field for implementation-specific data (graph edges,\n * priority levels, content hashes, etc.).\n */\nexport interface MAPTask {\n /** Unique task identifier */\n id: TaskId;\n\n /** Agent this task is assigned to (null = unassigned) */\n assignee?: AgentId | null;\n\n /** Human-readable task title */\n title?: string;\n\n /** Current task status */\n status?: MAPTaskStatus;\n\n /** Task description or instructions */\n description?: string;\n\n /** Provider/implementation-specific metadata */\n meta?: Meta;\n}\n\n// =============================================================================\n// Task Event Data Types\n// =============================================================================\n\n/** Data for task.created events */\nexport interface TaskCreatedEventData {\n task: MAPTask;\n}\n\n/** Data for task.assigned events */\nexport interface TaskAssignedEventData {\n taskId: TaskId;\n agentId: AgentId;\n}\n\n/** Data for task.status events */\nexport interface TaskStatusEventData {\n taskId: TaskId;\n previous: MAPTaskStatus;\n current: MAPTaskStatus;\n}\n\n/** Data for task.completed events */\nexport interface TaskCompletedEventData {\n taskId: TaskId;\n result?: unknown;\n}\n\n// =============================================================================\n// Task Request/Response Types\n// =============================================================================\n\n// --- map/tasks/create ---\n\nexport interface TasksCreateRequestParams {\n /** Task data. If `id` is omitted, the server generates one. */\n task: Omit<MAPTask, \"id\"> & { id?: TaskId };\n _meta?: Meta;\n}\n\nexport interface TasksCreateRequest extends MAPRequestBase<TasksCreateRequestParams> {\n method: \"map/tasks/create\";\n params: TasksCreateRequestParams;\n}\n\nexport interface TasksCreateResponseResult {\n task: MAPTask;\n _meta?: Meta;\n}\n\n// --- map/tasks/assign ---\n\nexport interface TasksAssignRequestParams {\n taskId: TaskId;\n agentId: AgentId;\n _meta?: Meta;\n}\n\nexport interface TasksAssignRequest extends MAPRequestBase<TasksAssignRequestParams> {\n method: \"map/tasks/assign\";\n params: TasksAssignRequestParams;\n}\n\nexport interface TasksAssignResponseResult {\n task: MAPTask;\n _meta?: Meta;\n}\n\n// --- map/tasks/update ---\n\nexport interface TasksUpdateRequestParams {\n taskId: TaskId;\n status?: MAPTaskStatus;\n title?: string;\n description?: string;\n assignee?: AgentId | null;\n meta?: Meta;\n _meta?: Meta;\n}\n\nexport interface TasksUpdateRequest extends MAPRequestBase<TasksUpdateRequestParams> {\n method: \"map/tasks/update\";\n params: TasksUpdateRequestParams;\n}\n\nexport interface TasksUpdateResponseResult {\n task: MAPTask;\n _meta?: Meta;\n}\n\n// --- map/tasks/list ---\n\nexport interface TasksListRequestParams {\n filter?: {\n assignee?: AgentId;\n status?: MAPTaskStatus | MAPTaskStatus[];\n };\n limit?: number;\n cursor?: string;\n _meta?: Meta;\n}\n\nexport interface TasksListRequest extends MAPRequestBase<TasksListRequestParams> {\n method: \"map/tasks/list\";\n params?: TasksListRequestParams;\n}\n\nexport interface TasksListResponseResult {\n tasks: MAPTask[];\n hasMore: boolean;\n nextCursor?: string;\n _meta?: Meta;\n}\n\n// =============================================================================\n// Notification Types\n// =============================================================================\n\n/**\n * Parameters for event notifications delivered to subscribers.\n *\n * The envelope contains both delivery metadata (subscriptionId, sequence)\n * and optional fields for deduplication and causal ordering.\n */\nexport interface EventNotificationParams {\n /** The subscription this event is being delivered to */\n subscriptionId: SubscriptionId;\n\n /** Monotonically increasing sequence number within this subscription */\n sequenceNumber: number;\n\n /**\n * Globally unique event identifier (ULID format).\n *\n * Used for:\n * - Deduplication (same event delivered multiple times)\n * - Replay references (afterEventId in replay requests)\n * - Causal tracking (referenced in causedBy arrays)\n *\n * Format: 26-character ULID, e.g., \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n *\n * @remarks\n * If not provided by the server, deduplication is skipped.\n * New routers should always provide this field.\n */\n eventId?: string;\n\n /**\n * Server timestamp when the event was processed (milliseconds since epoch).\n *\n * This is the envelope-level timestamp, which may differ from event.timestamp\n * if the event was queued or replayed.\n */\n timestamp?: Timestamp;\n\n /**\n * Event IDs of events that causally precede this event.\n *\n * Used for enforcing causal ordering - this event should not be\n * processed until all events in causedBy have been processed.\n *\n * @example\n * A message_delivered event would have causedBy: [messagesentEventId]\n */\n causedBy?: string[];\n\n /** The event payload */\n event: Event;\n\n _meta?: Meta;\n}\n\nexport interface EventNotification extends MAPNotificationBase<EventNotificationParams> {\n method: \"map/event\";\n params: EventNotificationParams;\n}\n\nexport interface MessageNotificationParams {\n message: Message;\n _meta?: Meta;\n}\n\nexport interface MessageNotification extends MAPNotificationBase<MessageNotificationParams> {\n method: \"map/message\";\n params: MessageNotificationParams;\n}\n\n// =============================================================================\n// Union Types for All Requests/Responses/Notifications\n// =============================================================================\n\n/** All MAP request types */\nexport type MAPRequest =\n // Core\n | ConnectRequest\n | DisconnectRequest\n | SessionListRequest\n | SessionLoadRequest\n | SessionCloseRequest\n | AgentsListRequest\n | AgentsGetRequest\n | SendRequest\n | SubscribeRequest\n | UnsubscribeRequest\n | ReplayRequest\n | AuthRefreshRequest\n // Structure\n | AgentsRegisterRequest\n | AgentsSpawnRequest\n | AgentsUnregisterRequest\n | AgentsUpdateRequest\n | AgentsStopRequest\n | AgentsSuspendRequest\n | AgentsResumeRequest\n | StructureGraphRequest\n | ScopesListRequest\n | ScopesGetRequest\n | ScopesCreateRequest\n | ScopesDeleteRequest\n | ScopesJoinRequest\n | ScopesLeaveRequest\n | ScopesMembersRequest\n // Permissions\n | PermissionsUpdateRequest\n // Extension\n | InjectRequest\n | FederationConnectRequest\n | FederationRouteRequest\n // Mail\n | MailCreateRequest\n | MailGetRequest\n | MailListRequest\n | MailCloseRequest\n | MailJoinRequest\n | MailLeaveRequest\n | MailInviteRequest\n | MailTurnRequest\n | MailTurnsListRequest\n | MailThreadCreateRequest\n | MailThreadListRequest\n | MailSummaryRequest\n | MailReplayRequest\n // Trajectory\n | TrajectoryCheckpointRequest\n | TrajectoryListRequest\n | TrajectoryGetRequest\n | TrajectoryContentRequest;\n\n/** All MAP notification types */\nexport type MAPNotification =\n | EventNotification\n | MessageNotification\n | SubscriptionAckNotification\n | TrajectoryContentChunkNotification;\n\n// =============================================================================\n// Method Constants (Reorganized by capability domain)\n// =============================================================================\n\n/** Core methods - All implementations must support */\nexport const CORE_METHODS = {\n CONNECT: \"map/connect\",\n DISCONNECT: \"map/disconnect\",\n SEND: \"map/send\",\n SUBSCRIBE: \"map/subscribe\",\n UNSUBSCRIBE: \"map/unsubscribe\",\n REPLAY: \"map/replay\",\n} as const;\n\n/** Observation methods - Query/read operations */\nexport const OBSERVATION_METHODS = {\n AGENTS_LIST: \"map/agents/list\",\n AGENTS_GET: \"map/agents/get\",\n SCOPES_LIST: \"map/scopes/list\",\n SCOPES_GET: \"map/scopes/get\",\n SCOPES_MEMBERS: \"map/scopes/members\",\n STRUCTURE_GRAPH: \"map/structure/graph\",\n} as const;\n\n/** Lifecycle methods - Agent creation/destruction */\nexport const LIFECYCLE_METHODS = {\n AGENTS_REGISTER: \"map/agents/register\",\n AGENTS_UNREGISTER: \"map/agents/unregister\",\n AGENTS_SPAWN: \"map/agents/spawn\",\n} as const;\n\n/** State methods - Agent state management */\nexport const STATE_METHODS = {\n AGENTS_UPDATE: \"map/agents/update\",\n AGENTS_SUSPEND: \"map/agents/suspend\",\n AGENTS_RESUME: \"map/agents/resume\",\n AGENTS_STOP: \"map/agents/stop\",\n} as const;\n\n/** Steering methods - External control */\nexport const STEERING_METHODS = {\n INJECT: \"map/inject\",\n} as const;\n\n/** Scope methods - Scope management */\nexport const SCOPE_METHODS = {\n SCOPES_CREATE: \"map/scopes/create\",\n SCOPES_DELETE: \"map/scopes/delete\",\n SCOPES_JOIN: \"map/scopes/join\",\n SCOPES_LEAVE: \"map/scopes/leave\",\n} as const;\n\n/** Session methods */\nexport const SESSION_METHODS = {\n SESSION_LIST: \"map/session/list\",\n SESSION_LOAD: \"map/session/load\",\n SESSION_CLOSE: \"map/session/close\",\n} as const;\n\n/** Auth methods */\nexport const AUTH_METHODS = {\n AUTHENTICATE: \"map/authenticate\",\n AUTH_REFRESH: \"map/auth/refresh\",\n} as const;\n\n/** Permission methods */\nexport const PERMISSION_METHODS = {\n PERMISSIONS_UPDATE: \"map/permissions/update\",\n} as const;\n\n/** Federation methods */\nexport const FEDERATION_METHODS = {\n FEDERATION_CONNECT: \"map/federation/connect\",\n FEDERATION_ROUTE: \"map/federation/route\",\n} as const;\n\n/** Mail methods - Conversation and turn management */\nexport const MAIL_METHODS = {\n MAIL_CREATE: \"mail/create\",\n MAIL_GET: \"mail/get\",\n MAIL_LIST: \"mail/list\",\n MAIL_CLOSE: \"mail/close\",\n MAIL_JOIN: \"mail/join\",\n MAIL_LEAVE: \"mail/leave\",\n MAIL_INVITE: \"mail/invite\",\n MAIL_TURN: \"mail/turn\",\n MAIL_TURNS_LIST: \"mail/turns/list\",\n MAIL_THREAD_CREATE: \"mail/thread/create\",\n MAIL_THREAD_LIST: \"mail/thread/list\",\n MAIL_SUMMARY: \"mail/summary\",\n MAIL_REPLAY: \"mail/replay\",\n} as const;\n\n/** Workspace methods */\nexport const WORKSPACE_METHODS = {\n WORKSPACE_SEARCH: \"workspace/search\",\n WORKSPACE_LIST: \"workspace/list\",\n WORKSPACE_READ: \"workspace/read\",\n} as const;\n\n/** Trajectory methods - Agent work trajectory tracking */\nexport const TRAJECTORY_METHODS = {\n TRAJECTORY_CHECKPOINT: \"trajectory/checkpoint\",\n TRAJECTORY_LIST: \"trajectory/list\",\n TRAJECTORY_GET: \"trajectory/get\",\n TRAJECTORY_CONTENT: \"trajectory/content\",\n} as const;\n\n/** Task methods - Task management */\nexport const TASK_METHODS = {\n TASKS_CREATE: \"map/tasks/create\",\n TASKS_ASSIGN: \"map/tasks/assign\",\n TASKS_UPDATE: \"map/tasks/update\",\n TASKS_LIST: \"map/tasks/list\",\n} as const;\n\n/** Notification methods */\nexport const NOTIFICATION_METHODS = {\n EVENT: \"map/event\",\n MESSAGE: \"map/message\",\n SEND: \"map/send\",\n /** Client acknowledges received events (for backpressure) */\n SUBSCRIBE_ACK: \"map/subscribe.ack\",\n /** Server notifies client that auth is about to expire */\n AUTH_EXPIRING: \"map/auth/expiring\",\n /** Content chunk for streaming large trajectory transcripts */\n TRAJECTORY_CONTENT_CHUNK: \"trajectory/content.chunk\",\n} as const;\n\n/** All MAP methods */\nexport const MAP_METHODS = {\n ...CORE_METHODS,\n ...OBSERVATION_METHODS,\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...STEERING_METHODS,\n ...SCOPE_METHODS,\n ...SESSION_METHODS,\n ...AUTH_METHODS,\n ...PERMISSION_METHODS,\n ...FEDERATION_METHODS,\n ...MAIL_METHODS,\n ...WORKSPACE_METHODS,\n ...TRAJECTORY_METHODS,\n ...TASK_METHODS,\n} as const;\n\n// Legacy aliases for backward compatibility\nexport const STRUCTURE_METHODS = {\n ...LIFECYCLE_METHODS,\n ...STATE_METHODS,\n ...SCOPE_METHODS,\n STRUCTURE_GRAPH: OBSERVATION_METHODS.STRUCTURE_GRAPH,\n} as const;\n\nexport const EXTENSION_METHODS = {\n ...STEERING_METHODS,\n ...FEDERATION_METHODS,\n} as const;\n\n// =============================================================================\n// Error Codes (Fixed: no collisions)\n// =============================================================================\n\n/** JSON-RPC standard error codes */\nexport const PROTOCOL_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n/** Authentication error codes */\nexport const AUTH_ERROR_CODES = {\n AUTH_REQUIRED: 1000,\n AUTH_FAILED: 1001,\n TOKEN_EXPIRED: 1002,\n PERMISSION_DENIED: 1003,\n INSUFFICIENT_SCOPE: 1004,\n METHOD_NOT_SUPPORTED: 1005,\n INVALID_CREDENTIALS: 1006,\n} as const;\n\n/** Routing error codes */\nexport const ROUTING_ERROR_CODES = {\n ADDRESS_NOT_FOUND: 2000,\n AGENT_NOT_FOUND: 2001,\n SCOPE_NOT_FOUND: 2002,\n DELIVERY_FAILED: 2003,\n ADDRESS_AMBIGUOUS: 2004,\n} as const;\n\n/** Agent error codes */\nexport const AGENT_ERROR_CODES = {\n AGENT_EXISTS: 3000,\n STATE_INVALID: 3001,\n NOT_RESPONDING: 3002,\n TERMINATED: 3003,\n SPAWN_FAILED: 3004,\n} as const;\n\n/** Resource error codes */\nexport const RESOURCE_ERROR_CODES = {\n EXHAUSTED: 4000,\n RATE_LIMITED: 4001,\n QUOTA_EXCEEDED: 4002,\n} as const;\n\n/** Federation error codes - prefixed to avoid collision with AUTH_FAILED */\nexport const FEDERATION_ERROR_CODES = {\n FEDERATION_UNAVAILABLE: 5000,\n FEDERATION_SYSTEM_NOT_FOUND: 5001,\n FEDERATION_AUTH_FAILED: 5002,\n FEDERATION_ROUTE_REJECTED: 5003,\n /** Message has already visited this system (loop detected) */\n FEDERATION_LOOP_DETECTED: 5010,\n /** Message exceeded maximum hop count */\n FEDERATION_MAX_HOPS_EXCEEDED: 5011,\n /** DID document resolution failed (network error, invalid document, etc.) */\n FEDERATION_DID_RESOLUTION_FAILED: 5004,\n /** DID proof verification failed (bad signature, expired, wrong challenge, etc.) */\n FEDERATION_DID_PROOF_INVALID: 5005,\n} as const;\n\n/** Mail error codes - prefixed to avoid collision with PERMISSION_DENIED */\nexport const MAIL_ERROR_CODES = {\n MAIL_CONVERSATION_NOT_FOUND: 10000,\n MAIL_CONVERSATION_CLOSED: 10001,\n MAIL_NOT_A_PARTICIPANT: 10002,\n MAIL_PERMISSION_DENIED: 10003,\n MAIL_TURN_NOT_FOUND: 10004,\n MAIL_THREAD_NOT_FOUND: 10005,\n MAIL_INVALID_TURN_CONTENT: 10006,\n MAIL_PARTICIPANT_ALREADY_JOINED: 10007,\n MAIL_INVITATION_REQUIRED: 10008,\n MAIL_HISTORY_ACCESS_DENIED: 10009,\n MAIL_PARENT_CONVERSATION_NOT_FOUND: 10010,\n} as const;\n\n/** Trajectory error codes */\nexport const TRAJECTORY_ERROR_CODES = {\n TRAJECTORY_NOT_ENABLED: 13000,\n TRAJECTORY_CHECKPOINT_NOT_FOUND: 13001,\n TRAJECTORY_CONTENT_UNAVAILABLE: 13002,\n TRAJECTORY_STREAM_FAILED: 13003,\n TRAJECTORY_PERMISSION_DENIED: 13004,\n} as const;\n\n/** All error codes */\nexport const ERROR_CODES = {\n ...PROTOCOL_ERROR_CODES,\n ...AUTH_ERROR_CODES,\n ...ROUTING_ERROR_CODES,\n ...AGENT_ERROR_CODES,\n ...RESOURCE_ERROR_CODES,\n ...FEDERATION_ERROR_CODES,\n ...MAIL_ERROR_CODES,\n ...TRAJECTORY_ERROR_CODES,\n} as const;\n\n/** Protocol version */\nexport const PROTOCOL_VERSION: ProtocolVersion = 1;\n\n// =============================================================================\n// Capability Requirements\n// =============================================================================\n\n/**\n * Maps methods to required capabilities.\n * Empty array means no special capability required.\n */\nexport const CAPABILITY_REQUIREMENTS: Record<string, string[]> = {\n // Core\n [CORE_METHODS.CONNECT]: [],\n [CORE_METHODS.DISCONNECT]: [],\n [CORE_METHODS.SEND]: [\"messaging.canSend\"],\n [CORE_METHODS.SUBSCRIBE]: [\"observation.canObserve\"],\n [CORE_METHODS.UNSUBSCRIBE]: [\"observation.canObserve\"],\n\n // Observation\n [OBSERVATION_METHODS.AGENTS_LIST]: [\"observation.canQuery\"],\n [OBSERVATION_METHODS.AGENTS_GET]: [\"observation.canQuery\"],\n [OBSERVATION_METHODS.SCOPES_LIST]: [\"observation.canQuery\"],\n [OBSERVATION_METHODS.SCOPES_GET]: [\"observation.canQuery\"],\n [OBSERVATION_METHODS.SCOPES_MEMBERS]: [\"observation.canQuery\"],\n [OBSERVATION_METHODS.STRUCTURE_GRAPH]: [\"observation.canQuery\"],\n\n // Lifecycle\n [LIFECYCLE_METHODS.AGENTS_REGISTER]: [\"lifecycle.canRegister\"],\n [LIFECYCLE_METHODS.AGENTS_UNREGISTER]: [\"lifecycle.canUnregister\"],\n [LIFECYCLE_METHODS.AGENTS_SPAWN]: [\"lifecycle.canSpawn\"],\n\n // State\n [STATE_METHODS.AGENTS_UPDATE]: [\"lifecycle.canRegister\"],\n [STATE_METHODS.AGENTS_SUSPEND]: [\"lifecycle.canStop\"],\n [STATE_METHODS.AGENTS_RESUME]: [\"lifecycle.canStop\"],\n [STATE_METHODS.AGENTS_STOP]: [\"lifecycle.canStop\"],\n\n // Steering\n [STEERING_METHODS.INJECT]: [\"lifecycle.canSteer\"],\n\n // Scopes\n [SCOPE_METHODS.SCOPES_CREATE]: [\"scopes.canCreateScopes\"],\n [SCOPE_METHODS.SCOPES_DELETE]: [\"scopes.canManageScopes\"],\n [SCOPE_METHODS.SCOPES_JOIN]: [],\n [SCOPE_METHODS.SCOPES_LEAVE]: [],\n\n // Session\n [SESSION_METHODS.SESSION_LIST]: [],\n [SESSION_METHODS.SESSION_LOAD]: [],\n [SESSION_METHODS.SESSION_CLOSE]: [],\n\n // Auth (no capability required - anyone can authenticate)\n [AUTH_METHODS.AUTHENTICATE]: [],\n [AUTH_METHODS.AUTH_REFRESH]: [],\n\n // Permissions (system-only, no capability check - enforced by participant type)\n [PERMISSION_METHODS.PERMISSIONS_UPDATE]: [],\n\n // Federation\n [FEDERATION_METHODS.FEDERATION_CONNECT]: [\"federation.canFederate\"],\n [FEDERATION_METHODS.FEDERATION_ROUTE]: [\"federation.canFederate\"],\n\n // Mail\n [MAIL_METHODS.MAIL_CREATE]: [\"mail.canCreate\"],\n [MAIL_METHODS.MAIL_GET]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_LIST]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_CLOSE]: [\"mail.canCreate\"],\n [MAIL_METHODS.MAIL_JOIN]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_LEAVE]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_INVITE]: [\"mail.canInvite\"],\n [MAIL_METHODS.MAIL_TURN]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_TURNS_LIST]: [\"mail.canViewHistory\"],\n [MAIL_METHODS.MAIL_THREAD_CREATE]: [\"mail.canCreateThreads\"],\n [MAIL_METHODS.MAIL_THREAD_LIST]: [\"mail.canJoin\"],\n [MAIL_METHODS.MAIL_SUMMARY]: [\"mail.canViewHistory\"],\n [MAIL_METHODS.MAIL_REPLAY]: [\"mail.canViewHistory\"],\n\n // Workspace\n [WORKSPACE_METHODS.WORKSPACE_SEARCH]: [\"workspace.canSearch\"],\n [WORKSPACE_METHODS.WORKSPACE_LIST]: [\"workspace.canList\"],\n [WORKSPACE_METHODS.WORKSPACE_READ]: [\"workspace.canRead\"],\n\n // Trajectory\n [TRAJECTORY_METHODS.TRAJECTORY_CHECKPOINT]: [\"trajectory.canReport\"],\n [TRAJECTORY_METHODS.TRAJECTORY_LIST]: [\"trajectory.canQuery\"],\n [TRAJECTORY_METHODS.TRAJECTORY_GET]: [\"trajectory.canQuery\"],\n [TRAJECTORY_METHODS.TRAJECTORY_CONTENT]: [\"trajectory.canRequestContent\"],\n\n // Tasks\n [TASK_METHODS.TASKS_CREATE]: [\"tasks.canCreate\"],\n [TASK_METHODS.TASKS_ASSIGN]: [\"tasks.canAssign\"],\n [TASK_METHODS.TASKS_UPDATE]: [\"tasks.canUpdate\"],\n [TASK_METHODS.TASKS_LIST]: [\"tasks.canList\"],\n} as const;\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/** Check if a response is an error response */\nexport function isErrorResponse(\n response: MAPResponse,\n): response is MAPResponseError {\n return \"error\" in response;\n}\n\n/** Check if a response is a success response */\nexport function isSuccessResponse<T>(\n response: MAPResponse<T>,\n): response is MAPResponseSuccess<T> {\n return \"result\" in response;\n}\n\n/** Check if an address is a direct address */\nexport function isDirectAddress(address: Address): address is DirectAddress {\n return (\n typeof address === \"object\" && \"agent\" in address && !(\"system\" in address)\n );\n}\n\n/** Check if an address is a federated address */\nexport function isFederatedAddress(\n address: Address,\n): address is FederatedAddress {\n return (\n typeof address === \"object\" && \"system\" in address && \"agent\" in address\n );\n}\n\n/** Check if an address is a scope address */\nexport function isScopeAddress(address: Address): address is ScopeAddress {\n return typeof address === \"object\" && \"scope\" in address;\n}\n\n/** Check if an address is a broadcast address */\nexport function isBroadcastAddress(\n address: Address,\n): address is BroadcastAddress {\n return typeof address === \"object\" && \"broadcast\" in address;\n}\n\n/** Check if an address is a hierarchical address */\nexport function isHierarchicalAddress(\n address: Address,\n): address is HierarchicalAddress {\n return (\n typeof address === \"object\" &&\n (\"parent\" in address ||\n \"children\" in address ||\n \"ancestors\" in address ||\n \"descendants\" in address ||\n \"siblings\" in address)\n );\n}\n","/**\n * ULID utilities for MAP event IDs\n *\n * ULIDs (Universally Unique Lexicographically Sortable Identifiers) are:\n * - 26 characters, Crockford Base32 encoded\n * - Time-sortable (first 48 bits = millisecond timestamp)\n * - Lexicographically sortable (string comparison = chronological order)\n *\n * Format: TTTTTTTTTTRRRRRRRRRRRRRRR\n * |---------|-------------|\n * Timestamp Randomness\n * (10 chars) (16 chars)\n *\n * @example\n * ```typescript\n * import { ulid, ulidTimestamp, compareUlid } from './utils/ulid';\n *\n * const id = ulid(); // \"01HQJY3KCNP5VXWZ8M4R6T2G9B\"\n * const ts = ulidTimestamp(id); // 1706123456789\n * ```\n */\n\n// Re-export from ulid package\nexport { ulid, monotonicFactory } from 'ulid';\n\n// Crockford Base32 alphabet used by ULID\nconst ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\nconst ENCODING_LEN = ENCODING.length; // 32\n\n/**\n * Extract the timestamp from a ULID.\n *\n * @param id - The ULID string\n * @returns Unix timestamp in milliseconds\n *\n * @example\n * ```typescript\n * const id = ulid();\n * const timestamp = ulidTimestamp(id);\n * console.log(new Date(timestamp));\n * ```\n */\nexport function ulidTimestamp(id: string): number {\n if (id.length !== 26) {\n throw new Error(`Invalid ULID: expected 26 characters, got ${id.length}`);\n }\n\n // Decode first 10 characters (timestamp portion)\n let time = 0;\n for (let i = 0; i < 10; i++) {\n const char = id[i].toUpperCase();\n const idx = ENCODING.indexOf(char);\n if (idx === -1) {\n throw new Error(`Invalid ULID character: ${char}`);\n }\n time = time * ENCODING_LEN + idx;\n }\n\n return time;\n}\n\n/**\n * Compare two ULIDs lexicographically.\n *\n * Since ULIDs are designed to be lexicographically sortable,\n * this comparison also gives chronological ordering.\n *\n * @param a - First ULID\n * @param b - Second ULID\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```typescript\n * const ids = [ulid(), ulid(), ulid()];\n * ids.sort(compareUlid); // Chronological order\n * ```\n */\nexport function compareUlid(a: string, b: string): number {\n return a.localeCompare(b);\n}\n\n/**\n * Check if a string is a valid ULID format.\n *\n * @param id - String to check\n * @returns True if valid ULID format\n */\nexport function isValidUlid(id: string): boolean {\n if (typeof id !== 'string' || id.length !== 26) {\n return false;\n }\n\n for (let i = 0; i < 26; i++) {\n if (ENCODING.indexOf(id[i].toUpperCase()) === -1) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * In-memory EventStore implementation\n *\n * Provides ephemeral storage for events with configurable max size and LRU eviction.\n */\n\nimport type { MAPEvent, EventFilter, EventStore } from \"../../types\";\nimport { compareUlid } from \"../../../utils/ulid\";\n\n/**\n * Options for InMemoryEventStore\n */\nexport interface InMemoryEventStoreOptions {\n /** Maximum number of events to store (default: 10000) */\n maxSize?: number;\n}\n\n/**\n * In-memory implementation of EventStore.\n *\n * Features:\n * - O(1) lookup by ID\n * - Configurable max size with automatic eviction of oldest events\n * - Efficient filtering by event type\n */\nexport class InMemoryEventStore implements EventStore {\n private readonly events: Map<string, MAPEvent> = new Map();\n private readonly eventOrder: string[] = [];\n private readonly maxSize: number;\n\n constructor(options: InMemoryEventStoreOptions = {}) {\n this.maxSize = options.maxSize ?? 10000;\n }\n\n /**\n * Append an event to storage.\n * Evicts oldest events if max size is exceeded.\n */\n append(event: MAPEvent): void {\n // If event already exists, don't add it again\n if (this.events.has(event.id)) {\n return;\n }\n\n // Evict oldest events if at capacity\n while (this.eventOrder.length >= this.maxSize && this.eventOrder.length > 0) {\n const oldestId = this.eventOrder.shift()!;\n this.events.delete(oldestId);\n }\n\n // Add new event\n this.events.set(event.id, event);\n this.eventOrder.push(event.id);\n }\n\n /**\n * Query events matching filter criteria.\n */\n query(filter: EventFilter): MAPEvent[] {\n let results: MAPEvent[] = [];\n\n // Get all events in order\n for (const id of this.eventOrder) {\n const event = this.events.get(id);\n if (!event) continue;\n\n // Filter by types\n if (filter.types && filter.types.length > 0) {\n if (!filter.types.includes(event.type)) {\n continue;\n }\n }\n\n // Filter by since (exclusive - events after this ID)\n if (filter.since) {\n if (compareUlid(event.id, filter.since) <= 0) {\n continue;\n }\n }\n\n // Filter by until (inclusive - events up to and including this ID)\n if (filter.until) {\n if (compareUlid(event.id, filter.until) > 0) {\n continue;\n }\n }\n\n results.push(event);\n\n // Limit results\n if (filter.limit && results.length >= filter.limit) {\n break;\n }\n }\n\n return results;\n }\n\n /**\n * Get a specific event by ID.\n */\n getById(id: string): MAPEvent | undefined {\n return this.events.get(id);\n }\n\n /**\n * Clear all events.\n */\n clear(): void {\n this.events.clear();\n this.eventOrder.length = 0;\n }\n\n /**\n * Get the current number of stored events.\n */\n get size(): number {\n return this.events.size;\n }\n}\n","/**\n * EventBus implementation\n *\n * Central event dispatcher for the MAP server SDK.\n */\n\nimport type {\n MAPEvent,\n EventFilter,\n EventStore,\n EventHandler,\n EventBus,\n EventBusOptions,\n SubscriberErrorCallback,\n} from \"../types\";\nimport { monotonicFactory } from \"../../utils/ulid\";\nimport { InMemoryEventStore } from \"./stores/in-memory\";\n\n// Use monotonic ULID generator to ensure IDs are always increasing\n// even when events are emitted within the same millisecond\nconst generateUlid = monotonicFactory();\n\n/**\n * Internal subscription tracking\n */\ninterface Subscription {\n types: Set<string>;\n handler: EventHandler;\n}\n\n/**\n * EventBus implementation.\n *\n * Central event dispatcher that:\n * - Assigns ULID and timestamp to emitted events\n * - Stores events in the configured store\n * - Notifies registered handlers synchronously\n * - Supports wildcard subscriptions with '*'\n */\n/**\n * Default error handler - logs to console.error\n */\nconst defaultErrorHandler: SubscriberErrorCallback = (error, event, subscriberIndex) => {\n console.error(`EventBus subscriber ${subscriberIndex} error handling ${event.type}:`, error);\n};\n\nexport class EventBusImpl implements EventBus {\n readonly store: EventStore;\n private readonly subscriptions: Map<number, Subscription> = new Map();\n private nextSubscriptionId = 0;\n private readonly onSubscriberError: SubscriberErrorCallback;\n\n constructor(options: EventBusOptions = {}) {\n this.store = options.store ?? new InMemoryEventStore();\n this.onSubscriberError = options.onSubscriberError ?? defaultErrorHandler;\n }\n\n /**\n * Emit an event.\n *\n * - Assigns a ULID for the event ID\n * - Sets the timestamp to current time\n * - Stores the event\n * - Notifies all matching handlers synchronously\n *\n * @returns The complete event with ID and timestamp\n */\n emit(event: Omit<MAPEvent, \"id\" | \"timestamp\">): MAPEvent {\n const completeEvent: MAPEvent = {\n ...event,\n id: generateUlid(),\n timestamp: Date.now(),\n };\n\n // Store the event\n this.store.append(completeEvent);\n\n // Notify handlers synchronously\n for (const [subscriptionId, subscription] of this.subscriptions.entries()) {\n if (this.matchesSubscription(completeEvent, subscription)) {\n try {\n subscription.handler(completeEvent);\n } catch (error) {\n // Isolate subscriber errors - one failing shouldn't affect others\n this.onSubscriberError(\n error instanceof Error ? error : new Error(String(error)),\n completeEvent,\n subscriptionId\n );\n }\n }\n }\n\n return completeEvent;\n }\n\n /**\n * Subscribe to events by type.\n *\n * @param types Event type(s) to listen for, or '*' for all events\n * @param handler Callback invoked for each matching event\n * @returns Unsubscribe function\n */\n on(types: string | string[], handler: EventHandler): () => void {\n const typeSet = new Set(Array.isArray(types) ? types : [types]);\n const subscriptionId = this.nextSubscriptionId++;\n\n this.subscriptions.set(subscriptionId, {\n types: typeSet,\n handler,\n });\n\n // Return unsubscribe function\n return () => {\n this.subscriptions.delete(subscriptionId);\n };\n }\n\n /**\n * Query historical events from the store.\n */\n getEvents(filter: EventFilter): MAPEvent[] {\n return this.store.query(filter);\n }\n\n /**\n * Check if an event matches a subscription.\n */\n private matchesSubscription(\n event: MAPEvent,\n subscription: Subscription\n ): boolean {\n // Wildcard matches all events\n if (subscription.types.has(\"*\")) {\n return true;\n }\n\n // Check for exact type match\n if (subscription.types.has(event.type)) {\n return true;\n }\n\n // Check for prefix matches (e.g., \"agent.*\" matches \"agent.registered\")\n for (const type of subscription.types) {\n if (type.endsWith(\".*\")) {\n const prefix = type.slice(0, -2);\n if (event.type.startsWith(prefix + \".\")) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Get the number of active subscriptions.\n */\n get subscriptionCount(): number {\n return this.subscriptions.size;\n }\n}\n","/**\n * In-memory AgentStore implementation\n */\n\nimport type {\n RegisteredAgent,\n AgentFilter,\n AgentStore,\n} from \"../../types\";\nimport { hasCapability } from \"../registry\";\n\n/**\n * In-memory implementation of AgentStore.\n */\nexport class InMemoryAgentStore implements AgentStore {\n private readonly agents: Map<string, RegisteredAgent> = new Map();\n\n /**\n * Save an agent (create or update).\n */\n save(agent: RegisteredAgent): void {\n this.agents.set(agent.id, { ...agent });\n }\n\n /**\n * Get agent by ID.\n */\n get(id: string): RegisteredAgent | undefined {\n const agent = this.agents.get(id);\n return agent ? { ...agent } : undefined;\n }\n\n /**\n * List agents matching filter criteria.\n */\n list(filter?: AgentFilter): RegisteredAgent[] {\n const results: RegisteredAgent[] = [];\n\n for (const agent of this.agents.values()) {\n // Filter by state\n if (filter?.state !== undefined && agent.state !== filter.state) {\n continue;\n }\n\n // Filter by role\n if (filter?.role !== undefined && agent.role !== filter.role) {\n continue;\n }\n\n // Filter by session\n if (filter?.sessionId !== undefined && agent.sessionId !== filter.sessionId) {\n continue;\n }\n\n // Filter by capability (supports glob patterns)\n if (filter?.capability !== undefined) {\n if (!hasCapability(agent.capabilities, filter.capability)) {\n continue;\n }\n }\n\n // Filter by structured capability ID from capabilityDescriptor\n if (filter?.capabilityId !== undefined) {\n const match = agent.capabilityDescriptor?.capabilities?.some(\n (cap) => cap.id === filter.capabilityId\n );\n if (!match) continue;\n }\n\n // Filter by semantic tag from capabilityDescriptor\n if (filter?.tag !== undefined) {\n if (!agent.capabilityDescriptor?.tags?.includes(filter.tag)) continue;\n }\n\n // Filter by accepted content type from capabilityDescriptor\n if (filter?.accepts !== undefined) {\n const match = agent.capabilityDescriptor?.accepts?.some(\n (spec) => spec.contentType === filter.accepts\n );\n if (!match) continue;\n }\n\n // Note: scopeId filter is handled by caller (requires ScopeManager)\n results.push({ ...agent });\n }\n\n return results;\n }\n\n /**\n * Delete an agent by ID.\n */\n delete(id: string): boolean {\n return this.agents.delete(id);\n }\n\n /**\n * Clear all agents.\n */\n clear(): void {\n this.agents.clear();\n }\n\n /**\n * Get the number of stored agents.\n */\n get size(): number {\n return this.agents.size;\n }\n}\n","/**\n * AgentRegistry implementation\n *\n * Manages agent lifecycle and state with event emission.\n */\n\nimport type {\n RegisteredAgent,\n AgentFilter,\n AgentStore,\n AgentRegistry,\n AgentRegistryOptions,\n ServerAgentState,\n StandardAgentState,\n EventBus,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryAgentStore } from \"./stores/in-memory\";\n\n/**\n * Error thrown when an agent is not found.\n */\nexport class AgentNotFoundError extends Error {\n constructor(agentId: string) {\n super(`Agent not found: ${agentId}`);\n this.name = \"AgentNotFoundError\";\n }\n}\n\n/**\n * Error thrown for invalid state transitions.\n */\nexport class InvalidStateTransitionError extends Error {\n constructor(from: ServerAgentState, to: ServerAgentState) {\n super(`Invalid state transition: ${from} -> ${to}`);\n this.name = \"InvalidStateTransitionError\";\n }\n}\n\n/**\n * Error thrown when an agent state is invalid.\n */\nexport class InvalidAgentStateError extends Error {\n constructor(state: string, reason: string) {\n super(`Invalid agent state \"${state}\": ${reason}`);\n this.name = \"InvalidAgentStateError\";\n }\n}\n\n/** Standard agent states */\nconst STANDARD_STATES: readonly StandardAgentState[] = [\"idle\", \"busy\", \"suspended\", \"stopped\"];\n\n/** Maximum length for custom state names */\nconst MAX_CUSTOM_STATE_LENGTH = 64;\n\n/**\n * Check if a state is a standard agent state.\n */\nexport function isStandardState(state: string): state is StandardAgentState {\n return STANDARD_STATES.includes(state as StandardAgentState);\n}\n\n/**\n * Check if a state is a custom agent state (starts with \"custom:\").\n */\nexport function isCustomState(state: string): boolean {\n return state.startsWith(\"custom:\");\n}\n\n/**\n * Validate an agent state.\n * - Standard states are always valid\n * - Custom states must start with \"custom:\" and have a non-empty suffix\n * - Custom state suffix must be <= 64 characters\n *\n * @throws InvalidAgentStateError if state is invalid\n */\nexport function validateAgentState(state: string): void {\n if (isStandardState(state)) {\n return; // Standard states are always valid\n }\n\n if (!isCustomState(state)) {\n throw new InvalidAgentStateError(\n state,\n `must be a standard state (${STANDARD_STATES.join(\", \")}) or start with \"custom:\"`\n );\n }\n\n const suffix = state.slice(7); // Remove \"custom:\" prefix\n if (suffix.length === 0) {\n throw new InvalidAgentStateError(state, \"custom state must have a non-empty suffix after 'custom:'\");\n }\n\n if (suffix.length > MAX_CUSTOM_STATE_LENGTH) {\n throw new InvalidAgentStateError(\n state,\n `custom state suffix must be <= ${MAX_CUSTOM_STATE_LENGTH} characters (got ${suffix.length})`\n );\n }\n}\n\n/**\n * Valid state transitions for standard states.\n *\n * State machine:\n * idle <-> busy\n * idle -> suspended -> idle\n * idle -> stopped\n * busy -> suspended -> busy (resumes to previous state)\n * busy -> stopped\n * suspended -> stopped\n *\n * Custom states (custom:*) can transition to/from any state,\n * bypassing the standard state machine.\n */\nconst VALID_TRANSITIONS: Record<StandardAgentState, StandardAgentState[]> = {\n idle: [\"busy\", \"suspended\", \"stopped\"],\n busy: [\"idle\", \"suspended\", \"stopped\"],\n suspended: [\"idle\", \"busy\", \"stopped\"],\n stopped: [], // Terminal state\n};\n\n/**\n * Check if a state transition is valid.\n *\n * Rules:\n * - Custom states can transition to/from any state (bypass state machine)\n * - Standard states follow the VALID_TRANSITIONS state machine\n * - Transitioning to \"stopped\" is always allowed (cleanup)\n * - Transitioning from \"stopped\" is never allowed (terminal state)\n */\nexport function isValidTransition(\n from: ServerAgentState,\n to: ServerAgentState\n): boolean {\n // Custom states can transition to/from any state\n if (isCustomState(from) || isCustomState(to)) {\n // Exception: cannot transition from \"stopped\" even to custom states\n if (from === \"stopped\") {\n return false;\n }\n return true;\n }\n\n // Both are standard states - use state machine\n return VALID_TRANSITIONS[from as StandardAgentState].includes(to as StandardAgentState);\n}\n\n/**\n * Check if a capability matches a pattern.\n * Supports:\n * - Exact match: \"translate:en\" matches \"translate:en\"\n * - Glob with *: \"translate:*\" matches \"translate:en\", \"translate:fr\"\n * - Glob with **: \"translate:**\" matches \"translate:en:formal\"\n */\nexport function matchesCapability(capability: string, pattern: string): boolean {\n // Exact match\n if (pattern === capability) {\n return true;\n }\n\n // Convert glob pattern to regex\n // First, replace ** with a placeholder to avoid conflicts\n let regexPattern = pattern.replace(/\\*\\*/g, \"\\x00DOUBLESTAR\\x00\");\n // Then replace single * with a placeholder\n regexPattern = regexPattern.replace(/\\*/g, \"\\x00SINGLESTAR\\x00\");\n // Escape special regex chars\n regexPattern = regexPattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n // Replace placeholders with regex patterns\n regexPattern = regexPattern.replace(/\\x00DOUBLESTAR\\x00/g, \".*\"); // ** matches anything\n regexPattern = regexPattern.replace(/\\x00SINGLESTAR\\x00/g, \"[^:]*\"); // * matches anything except colons\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(capability);\n}\n\n/**\n * Check if an agent has any capability matching the pattern.\n */\nexport function hasCapability(capabilities: string[] | undefined, pattern: string): boolean {\n if (!capabilities || capabilities.length === 0) {\n return false;\n }\n return capabilities.some((cap) => matchesCapability(cap, pattern));\n}\n\n/**\n * AgentRegistry implementation.\n *\n * Manages agent lifecycle:\n * - Registration and unregistration\n * - State transitions with validation\n * - Metadata updates\n * - Bulk cleanup by session\n *\n * Events emitted:\n * - agent.registered\n * - agent.unregistered\n * - agent.state.changed\n * - agent.metadata.changed\n */\nexport class AgentRegistryImpl implements AgentRegistry {\n private readonly eventBus: EventBus;\n private readonly store: AgentStore;\n\n constructor(options: AgentRegistryOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemoryAgentStore();\n }\n\n /**\n * Register a new agent.\n */\n register(params: {\n name: string;\n role?: string;\n metadata?: Record<string, unknown>;\n sessionId: string;\n /** Capabilities this agent provides (for capability-based discovery) */\n capabilities?: string[];\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: import('../../types').MAPAgentCapabilityDescriptor;\n }): RegisteredAgent {\n const now = Date.now();\n const agent: RegisteredAgent = {\n id: ulid(),\n name: params.name,\n role: params.role,\n state: \"idle\",\n metadata: params.metadata ?? {},\n sessionId: params.sessionId,\n registeredAt: now,\n lastStateChange: now,\n capabilities: params.capabilities,\n capabilityDescriptor: params.capabilityDescriptor,\n };\n\n this.store.save(agent);\n\n this.eventBus.emit({\n type: \"agent.registered\",\n data: { agent },\n source: { agentId: agent.id, sessionId: params.sessionId },\n });\n\n return agent;\n }\n\n /**\n * Get agent by ID.\n */\n get(id: string): RegisteredAgent | undefined {\n return this.store.get(id);\n }\n\n /**\n * List agents matching filter criteria.\n */\n list(filter?: AgentFilter): RegisteredAgent[] {\n return this.store.list(filter);\n }\n\n /**\n * Unregister an agent.\n */\n unregister(id: string): boolean {\n const agent = this.store.get(id);\n if (!agent) {\n return false;\n }\n\n const deleted = this.store.delete(id);\n if (deleted) {\n this.eventBus.emit({\n type: \"agent.unregistered\",\n data: { agentId: id, agent },\n source: { agentId: id, sessionId: agent.sessionId },\n });\n }\n\n return deleted;\n }\n\n /**\n * Update agent state with validation.\n *\n * Supports both standard states (idle, busy, suspended, stopped)\n * and custom states (custom:thinking, custom:waiting, etc.).\n *\n * Standard states follow a state machine with restricted transitions.\n * Custom states can transition to/from any state.\n */\n updateState(id: string, state: ServerAgentState): RegisteredAgent {\n const agent = this.store.get(id);\n if (!agent) {\n throw new AgentNotFoundError(id);\n }\n\n // Check if state is actually changing\n if (agent.state === state) {\n return agent;\n }\n\n // Validate the state format\n validateAgentState(state);\n\n // Validate transition\n if (!isValidTransition(agent.state, state)) {\n throw new InvalidStateTransitionError(agent.state, state);\n }\n\n const previousState = agent.state;\n const updatedAgent: RegisteredAgent = {\n ...agent,\n state,\n lastStateChange: Date.now(),\n };\n\n this.store.save(updatedAgent);\n\n this.eventBus.emit({\n type: \"agent.state.changed\",\n data: { agent: updatedAgent, previousState },\n source: { agentId: id, sessionId: agent.sessionId },\n });\n\n return updatedAgent;\n }\n\n /**\n * Update agent metadata (merges with existing).\n */\n updateMetadata(\n id: string,\n metadata: Record<string, unknown>\n ): RegisteredAgent {\n const agent = this.store.get(id);\n if (!agent) {\n throw new AgentNotFoundError(id);\n }\n\n const updatedAgent: RegisteredAgent = {\n ...agent,\n metadata: { ...agent.metadata, ...metadata },\n };\n\n this.store.save(updatedAgent);\n\n this.eventBus.emit({\n type: \"agent.metadata.changed\",\n data: { agent: updatedAgent, changes: metadata },\n source: { agentId: id, sessionId: agent.sessionId },\n });\n\n return updatedAgent;\n }\n\n /**\n * Unregister all agents for a session.\n * Used for cleanup when a session disconnects.\n */\n unregisterBySession(sessionId: string): string[] {\n const agents = this.store.list({ sessionId });\n const unregisteredIds: string[] = [];\n\n for (const agent of agents) {\n if (this.unregister(agent.id)) {\n unregisteredIds.push(agent.id);\n }\n }\n\n return unregisteredIds;\n }\n}\n","/**\n * JSON-RPC 2.0 utilities for MAP protocol\n */\n\nimport type { RequestId, MAPError } from '../types';\n\n/** JSON-RPC version constant */\nexport const JSONRPC_VERSION = '2.0' as const;\n\n/**\n * Generic JSON-RPC request structure\n */\nexport interface JsonRpcRequest<TParams = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC notification structure (no id)\n */\nexport interface JsonRpcNotification<TParams = unknown> {\n jsonrpc: '2.0';\n method: string;\n params?: TParams;\n}\n\n/**\n * Generic JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse<TResult = unknown> {\n jsonrpc: '2.0';\n id: RequestId;\n result: TResult;\n}\n\n/**\n * Generic JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: '2.0';\n id: RequestId;\n error: MAPError;\n}\n\n/**\n * Any JSON-RPC response\n */\nexport type JsonRpcResponse<TResult = unknown> =\n | JsonRpcSuccessResponse<TResult>\n | JsonRpcErrorResponse;\n\n/**\n * Any JSON-RPC message\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n/**\n * Check if a message is a request (has id and method)\n */\nexport function isRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n 'method' in message\n );\n}\n\n/**\n * Check if a message is a notification (has method but no id)\n */\nexport function isNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Check if a message is a response (has id but no method)\n */\nexport function isResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n message.jsonrpc === '2.0' &&\n 'id' in message &&\n !('method' in message)\n );\n}\n\n/**\n * Check if a response is an error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse\n): response is JsonRpcErrorResponse {\n return 'error' in response;\n}\n\n/**\n * Check if a response is a success response\n */\nexport function isSuccessResponse<T>(\n response: JsonRpcResponse<T>\n): response is JsonRpcSuccessResponse<T> {\n return 'result' in response;\n}\n\n/**\n * Create a JSON-RPC request\n */\nexport function createRequest<TParams>(\n id: RequestId,\n method: string,\n params?: TParams\n): JsonRpcRequest<TParams> {\n const request: JsonRpcRequest<TParams> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) {\n request.params = params;\n }\n return request;\n}\n\n/**\n * Create a JSON-RPC notification\n */\nexport function createNotification<TParams>(\n method: string,\n params?: TParams\n): JsonRpcNotification<TParams> {\n const notification: JsonRpcNotification<TParams> = {\n jsonrpc: '2.0',\n method,\n };\n if (params !== undefined) {\n notification.params = params;\n }\n return notification;\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse<TResult>(\n id: RequestId,\n result: TResult\n): JsonRpcSuccessResponse<TResult> {\n return {\n jsonrpc: '2.0',\n id,\n result,\n };\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: RequestId,\n error: MAPError\n): JsonRpcErrorResponse {\n return {\n jsonrpc: '2.0',\n id,\n error,\n };\n}\n","/**\n * Error classes for MAP protocol\n */\n\nimport type { MAPError, MAPErrorData, ErrorCategory, RequestId } from '../types';\nimport {\n PROTOCOL_ERROR_CODES,\n AUTH_ERROR_CODES,\n ROUTING_ERROR_CODES,\n AGENT_ERROR_CODES,\n RESOURCE_ERROR_CODES,\n FEDERATION_ERROR_CODES,\n} from '../types';\nimport { createErrorResponse, type JsonRpcErrorResponse } from '../jsonrpc';\n\n/**\n * Error thrown when a MAP request fails.\n *\n * Extends Error with JSON-RPC error properties and provides\n * factory methods for common error types.\n */\nexport class MAPRequestError extends Error {\n readonly code: number;\n readonly data?: MAPErrorData;\n\n constructor(code: number, message: string, data?: MAPErrorData) {\n super(message);\n this.name = 'MAPRequestError';\n this.code = code;\n this.data = data;\n }\n\n /**\n * Convert to MAP error object\n */\n toError(): MAPError {\n const error: MAPError = {\n code: this.code,\n message: this.message,\n };\n if (this.data) {\n error.data = this.data;\n }\n return error;\n }\n\n /**\n * Convert to JSON-RPC error response\n */\n toResponse(id: RequestId): JsonRpcErrorResponse {\n return createErrorResponse(id, this.toError());\n }\n\n // ==========================================================================\n // Protocol Errors (-32xxx)\n // ==========================================================================\n\n static parseError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.PARSE_ERROR,\n details ?? 'Parse error',\n { category: 'protocol' }\n );\n }\n\n static invalidRequest(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_REQUEST,\n details ?? 'Invalid request',\n { category: 'protocol' }\n );\n }\n\n static methodNotFound(method: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.METHOD_NOT_FOUND,\n `Method not found: ${method}`,\n { category: 'protocol' }\n );\n }\n\n static invalidParams(details?: unknown): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INVALID_PARAMS,\n 'Invalid params',\n { category: 'protocol', details: details as Record<string, unknown> }\n );\n }\n\n static internalError(details?: string): MAPRequestError {\n return new MAPRequestError(\n PROTOCOL_ERROR_CODES.INTERNAL_ERROR,\n details ?? 'Internal error',\n { category: 'internal' }\n );\n }\n\n // ==========================================================================\n // Auth Errors (1xxx)\n // ==========================================================================\n\n static authRequired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_REQUIRED,\n 'Authentication required',\n { category: 'auth' }\n );\n }\n\n static authFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.AUTH_FAILED,\n details ?? 'Authentication failed',\n { category: 'auth' }\n );\n }\n\n static tokenExpired(): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.TOKEN_EXPIRED,\n 'Token expired',\n { category: 'auth', retryable: true }\n );\n }\n\n static permissionDenied(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.PERMISSION_DENIED,\n required ? `Permission denied: ${required}` : 'Permission denied',\n { category: 'auth' }\n );\n }\n\n static insufficientScope(required?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INSUFFICIENT_SCOPE,\n required ? `Insufficient scope: ${required}` : 'Insufficient scope',\n { category: 'auth' }\n );\n }\n\n static methodNotSupported(method: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.METHOD_NOT_SUPPORTED,\n `Authentication method not supported: ${method}`,\n { category: 'auth' }\n );\n }\n\n static invalidCredentials(details?: string): MAPRequestError {\n return new MAPRequestError(\n AUTH_ERROR_CODES.INVALID_CREDENTIALS,\n details ?? 'Invalid credentials',\n { category: 'auth' }\n );\n }\n\n // ==========================================================================\n // Routing Errors (2xxx)\n // ==========================================================================\n\n static addressNotFound(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_NOT_FOUND,\n `Address not found: ${address}`,\n { category: 'routing' }\n );\n }\n\n static agentNotFound(agentId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.AGENT_NOT_FOUND,\n `Agent not found: ${agentId}`,\n { category: 'routing' }\n );\n }\n\n static scopeNotFound(scopeId: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.SCOPE_NOT_FOUND,\n `Scope not found: ${scopeId}`,\n { category: 'routing' }\n );\n }\n\n static deliveryFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.DELIVERY_FAILED,\n details ?? 'Message delivery failed',\n { category: 'routing', retryable: true }\n );\n }\n\n static addressAmbiguous(address: string): MAPRequestError {\n return new MAPRequestError(\n ROUTING_ERROR_CODES.ADDRESS_AMBIGUOUS,\n `Address is ambiguous: ${address}`,\n { category: 'routing' }\n );\n }\n\n // ==========================================================================\n // Agent Errors (3xxx)\n // ==========================================================================\n\n static agentExists(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.AGENT_EXISTS,\n `Agent already exists: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static stateInvalid(currentState: string, requestedAction: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.STATE_INVALID,\n `Cannot ${requestedAction} agent in state: ${currentState}`,\n { category: 'agent' }\n );\n }\n\n static agentNotResponding(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.NOT_RESPONDING,\n `Agent not responding: ${agentId}`,\n { category: 'agent', retryable: true }\n );\n }\n\n static agentTerminated(agentId: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.TERMINATED,\n `Agent terminated: ${agentId}`,\n { category: 'agent' }\n );\n }\n\n static spawnFailed(details?: string): MAPRequestError {\n return new MAPRequestError(\n AGENT_ERROR_CODES.SPAWN_FAILED,\n details ?? 'Failed to spawn agent',\n { category: 'agent' }\n );\n }\n\n // ==========================================================================\n // Resource Errors (4xxx)\n // ==========================================================================\n\n static resourceExhausted(resource?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.EXHAUSTED,\n resource ? `Resource exhausted: ${resource}` : 'Resource exhausted',\n { category: 'resource', retryable: true }\n );\n }\n\n static rateLimited(retryAfterMs?: number): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.RATE_LIMITED,\n 'Rate limited',\n { category: 'resource', retryable: true, retryAfterMs }\n );\n }\n\n static quotaExceeded(quota?: string): MAPRequestError {\n return new MAPRequestError(\n RESOURCE_ERROR_CODES.QUOTA_EXCEEDED,\n quota ? `Quota exceeded: ${quota}` : 'Quota exceeded',\n { category: 'resource' }\n );\n }\n\n // ==========================================================================\n // Federation Errors (5xxx)\n // ==========================================================================\n\n static federationUnavailable(systemId?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_UNAVAILABLE,\n systemId ? `Federation unavailable: ${systemId}` : 'Federation unavailable',\n { category: 'federation', retryable: true }\n );\n }\n\n static federationSystemNotFound(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_SYSTEM_NOT_FOUND,\n `System not found: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationAuthFailed(systemId: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_AUTH_FAILED,\n `Federation authentication failed: ${systemId}`,\n { category: 'federation' }\n );\n }\n\n static federationRouteRejected(systemId: string, reason?: string): MAPRequestError {\n return new MAPRequestError(\n FEDERATION_ERROR_CODES.FEDERATION_ROUTE_REJECTED,\n reason ? `Route rejected by ${systemId}: ${reason}` : `Route rejected by ${systemId}`,\n { category: 'federation' }\n );\n }\n\n // ==========================================================================\n // Utility\n // ==========================================================================\n\n /**\n * Create from a MAP error object\n */\n static fromError(error: MAPError): MAPRequestError {\n return new MAPRequestError(error.code, error.message, error.data);\n }\n\n /**\n * Check if this error is retryable\n */\n get retryable(): boolean {\n return this.data?.retryable ?? false;\n }\n\n /**\n * Get retry delay in milliseconds, if specified\n */\n get retryAfterMs(): number | undefined {\n return this.data?.retryAfterMs;\n }\n\n /**\n * Get error category\n */\n get category(): ErrorCategory | undefined {\n return this.data?.category;\n }\n}\n\n/**\n * Error thrown when a connection is closed unexpectedly\n */\nexport class MAPConnectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MAPConnectionError';\n }\n\n static closed(): MAPConnectionError {\n return new MAPConnectionError('Connection closed');\n }\n\n static timeout(): MAPConnectionError {\n return new MAPConnectionError('Connection timeout');\n }\n}\n\n/**\n * Error thrown when an operation times out\n */\nexport class MAPTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(operation: string, timeoutMs: number) {\n super(`Operation timed out after ${timeoutMs}ms: ${operation}`);\n this.name = 'MAPTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n","/**\n * Agent handler factories\n *\n * Creates JSON-RPC handlers for agent-related methods.\n */\n\nimport type {\n AgentRegistry,\n HandlerContext,\n HandlerRegistry,\n ServerAgentState,\n SessionManager,\n} from \"../types\";\nimport type { AuthManager } from \"../auth\";\nimport type { AuthManagerImpl } from \"../auth/manager\";\nimport { MAPRequestError } from \"../../errors\";\nimport {\n AgentNotFoundError,\n InvalidStateTransitionError,\n InvalidAgentStateError,\n} from \"./registry\";\n\n/**\n * Options for creating agent handlers.\n */\nexport interface AgentHandlerOptions {\n agents: AgentRegistry;\n /**\n * SessionManager for tracking agent-session associations.\n * When provided, uses atomic SessionManager methods instead of direct session mutation.\n * This prevents race conditions and ensures proper cleanup on failure.\n */\n sessions?: SessionManager;\n /**\n * AuthManager for spawn credential delegation.\n * When provided and backed by an AuthProvider, delegated credentials\n * are returned in the spawn response for child agent setup.\n */\n authManager?: AuthManager;\n}\n\n/**\n * Parameters for agent registration.\n */\ninterface RegisterParams {\n name: string;\n role?: string;\n metadata?: Record<string, unknown>;\n /** Capabilities this agent provides (for capability-based discovery) */\n capabilities?: string[];\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: import('../../types').MAPAgentCapabilityDescriptor;\n}\n\n/**\n * Parameters for agent unregistration.\n */\ninterface UnregisterParams {\n agentId: string;\n}\n\n/**\n * Parameters for getting an agent.\n */\ninterface GetParams {\n agentId: string;\n}\n\n/**\n * Parameters for listing agents.\n */\ninterface ListParams {\n state?: ServerAgentState;\n role?: string;\n sessionId?: string;\n scopeId?: string;\n /** Filter by capability (supports glob patterns) */\n capability?: string;\n /** Filter by structured capability ID from capabilityDescriptor */\n capabilityId?: string;\n /** Filter by semantic tags from capabilityDescriptor */\n tags?: string[];\n /** Filter by accepted content type from capabilityDescriptor */\n accepts?: string;\n}\n\n/**\n * Parameters for updating agent state.\n */\ninterface UpdateStateParams {\n agentId: string;\n state: ServerAgentState;\n}\n\n/**\n * Parameters for updating agent metadata.\n */\ninterface UpdateMetadataParams {\n agentId: string;\n metadata: Record<string, unknown>;\n}\n\n/**\n * Parameters for combined agent update (protocol-compliant).\n */\ninterface UpdateParams {\n agentId: string;\n state?: ServerAgentState;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Parameters for spawning a child agent.\n */\ninterface SpawnParams {\n /** Parent agent ID (must belong to the calling session) */\n parent: string;\n /** Name for the child agent */\n name?: string;\n /** Role for the child agent */\n role?: string;\n /** Metadata for the child agent */\n metadata?: Record<string, unknown>;\n /** Structured capability descriptor for rich agent discovery */\n capabilityDescriptor?: import('../../types').MAPAgentCapabilityDescriptor;\n /** Scopes the child should request (for credential delegation) */\n requestedScopes?: string[];\n /** TTL for delegated credentials in minutes */\n ttlMinutes?: number;\n}\n\n/**\n * Create handlers for agent-related methods.\n *\n * Methods:\n * - `map/agents/register` - Register a new agent\n * - `map/agents/unregister` - Unregister an agent\n * - `map/agents/list` - List agents with optional filters\n * - `map/agents/get` - Get a specific agent\n * - `map/agents/update` - Update agent state and/or metadata (protocol method)\n * - `map/agents/update/state` - Update agent state (legacy)\n * - `map/agents/update/metadata` - Update agent metadata (legacy)\n * - `map/agents/spawn` - Spawn a child agent with delegated credentials\n */\nexport function createAgentHandlers(options: AgentHandlerOptions): HandlerRegistry {\n const { agents, sessions, authManager } = options;\n\n return {\n \"map/agents/register\": async (params: unknown, ctx: HandlerContext) => {\n const { name, role, metadata, capabilities, capabilityDescriptor } = params as RegisterParams;\n\n const registeredAgent = agents.register({\n name,\n role,\n metadata,\n sessionId: ctx.session.id,\n capabilities,\n capabilityDescriptor,\n });\n\n // Track agent in session - use SessionManager if available for atomic updates\n if (sessions) {\n sessions.addAgent(ctx.session.id, registeredAgent.id);\n } else {\n // Legacy fallback: direct mutation (not recommended)\n ctx.session.agentIds.push(registeredAgent.id);\n }\n\n // Return protocol-compliant response with agent wrapped\n return {\n agent: {\n id: registeredAgent.id,\n name: registeredAgent.name,\n role: registeredAgent.role,\n state: registeredAgent.state,\n metadata: registeredAgent.metadata,\n capabilities: registeredAgent.capabilities,\n capabilityDescriptor: registeredAgent.capabilityDescriptor,\n visibility: \"public\",\n },\n };\n },\n\n \"map/agents/unregister\": async (params: unknown, ctx: HandlerContext) => {\n const { agentId } = params as UnregisterParams;\n\n const success = agents.unregister(agentId);\n if (!success) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Remove from session tracking - use SessionManager if available\n if (sessions) {\n sessions.removeAgent(ctx.session.id, agentId);\n } else {\n // Legacy fallback: direct mutation (not recommended)\n const index = ctx.session.agentIds.indexOf(agentId);\n if (index !== -1) {\n ctx.session.agentIds.splice(index, 1);\n }\n }\n\n return { success: true };\n },\n\n \"map/agents/list\": async (params: unknown) => {\n const listParams = (params ?? {}) as ListParams;\n\n // Map protocol filter params to server AgentFilter\n // The server AgentFilter uses singular `tag` while protocol uses `tags` array\n const filter: Record<string, unknown> = { ...listParams };\n if (listParams.tags && listParams.tags.length > 0) {\n filter.tag = listParams.tags[0]; // Server filter supports one tag at a time\n }\n\n const agentList = agents.list(filter as any);\n\n // Return protocol-compliant response\n return {\n agents: agentList.map((a) => ({\n id: a.id,\n name: a.name,\n role: a.role,\n state: a.state,\n metadata: a.metadata,\n capabilities: a.capabilities,\n capabilityDescriptor: a.capabilityDescriptor,\n visibility: \"public\",\n })),\n };\n },\n\n \"map/agents/get\": async (params: unknown) => {\n const { agentId } = params as GetParams;\n const agent = agents.get(agentId);\n\n if (!agent) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Return protocol-compliant response\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n role: agent.role,\n state: agent.state,\n metadata: agent.metadata,\n capabilities: agent.capabilities,\n capabilityDescriptor: agent.capabilityDescriptor,\n visibility: \"public\",\n },\n };\n },\n\n \"map/agents/update\": async (params: unknown) => {\n const { agentId, state, metadata } = params as UpdateParams;\n\n let agent = agents.get(agentId);\n if (!agent) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n\n // Update state if provided\n if (state !== undefined) {\n agent = agents.updateState(agentId, state);\n }\n\n // Update metadata if provided\n if (metadata !== undefined) {\n agent = agents.updateMetadata(agentId, metadata);\n }\n\n // Return protocol-compliant response\n return {\n agent: {\n id: agent.id,\n name: agent.name,\n role: agent.role,\n state: agent.state,\n metadata: agent.metadata,\n capabilities: agent.capabilities,\n capabilityDescriptor: agent.capabilityDescriptor,\n visibility: \"public\",\n },\n };\n },\n\n \"map/agents/update/state\": async (params: unknown) => {\n const { agentId, state } = params as UpdateStateParams;\n try {\n return agents.updateState(agentId, state);\n } catch (error) {\n if (error instanceof AgentNotFoundError) {\n throw MAPRequestError.agentNotFound(agentId);\n }\n if (error instanceof InvalidStateTransitionError) {\n throw MAPRequestError.stateInvalid(state, \"transition\");\n }\n if (error instanceof InvalidAgentStateError) {\n throw MAPRequestError.stateInvalid(state, \"update\");\n }\n throw error;\n }\n },\n\n \"map/agents/update/metadata\": async (params: unknown) => {\n const { agentId, metadata } = params as UpdateMetadataParams;\n try {\n return agents.updateMetadata(agentId, metadata);\n } catch (error) {\n if (error instanceof AgentNotFoundError) {\n throw MAPRequestError.agentNotFound(agentId);\n }\n throw error;\n }\n },\n\n \"map/agents/spawn\": async (params: unknown, ctx: HandlerContext) => {\n const { parent, name, role, metadata, capabilityDescriptor, requestedScopes, ttlMinutes } = params as SpawnParams;\n\n // Validate parent agent exists and belongs to calling session\n const parentAgent = agents.get(parent);\n if (!parentAgent) {\n throw new Error(`Parent agent not found: ${parent}`);\n }\n if (parentAgent.sessionId !== ctx.session.id) {\n throw new Error(`Parent agent ${parent} does not belong to this session`);\n }\n\n // Register the child agent\n const childAgent = agents.register({\n name: name ?? `${parentAgent.name}-child`,\n role,\n metadata: {\n ...metadata,\n parentId: parent,\n },\n sessionId: ctx.session.id,\n capabilityDescriptor,\n });\n\n // Track child in session\n if (sessions) {\n sessions.addAgent(ctx.session.id, childAgent.id);\n } else {\n ctx.session.agentIds.push(childAgent.id);\n }\n\n // Delegate credentials if authManager supports it\n let delegatedCredentials: Record<string, unknown> | undefined;\n if (authManager && ctx.session.providers) {\n const manager = authManager as AuthManagerImpl;\n if (typeof manager.delegateForSpawn === 'function') {\n const result = await manager.delegateForSpawn(ctx.session, {\n childAgentId: childAgent.id,\n requestedScopes,\n ttlMinutes,\n });\n if (result) {\n delegatedCredentials = {\n method: result.method,\n credentials: result.credentials,\n ...(result.env && { env: result.env }),\n };\n }\n }\n }\n\n const response: Record<string, unknown> = {\n agent: {\n id: childAgent.id,\n name: childAgent.name,\n role: childAgent.role,\n state: childAgent.state,\n metadata: childAgent.metadata,\n capabilityDescriptor: childAgent.capabilityDescriptor,\n visibility: \"public\",\n },\n };\n if (delegatedCredentials) {\n response.delegatedCredentials = delegatedCredentials;\n }\n return response;\n },\n };\n}\n","/**\n * In-memory SessionStore implementation\n */\n\nimport type {\n ServerSession,\n SessionRole,\n SessionStatus,\n SessionStore,\n} from \"../../types\";\n\n/**\n * In-memory implementation of SessionStore.\n */\nexport class InMemorySessionStore implements SessionStore {\n private readonly sessions: Map<string, ServerSession> = new Map();\n private readonly resumeTokenIndex: Map<string, string> = new Map(); // token -> sessionId\n\n /**\n * Save a session (create or update).\n */\n save(session: ServerSession): void {\n // Remove old resume token mapping if exists\n const existing = this.sessions.get(session.id);\n if (existing?.resumeToken) {\n this.resumeTokenIndex.delete(existing.resumeToken);\n }\n\n // Add new resume token mapping\n if (session.resumeToken) {\n this.resumeTokenIndex.set(session.resumeToken, session.id);\n }\n\n this.sessions.set(session.id, { ...session });\n }\n\n /**\n * Get session by ID.\n */\n get(id: string): ServerSession | undefined {\n const session = this.sessions.get(id);\n return session ? { ...session } : undefined;\n }\n\n /**\n * Get session by resume token.\n */\n getByResumeToken(token: string): ServerSession | undefined {\n const sessionId = this.resumeTokenIndex.get(token);\n if (!sessionId) {\n return undefined;\n }\n return this.get(sessionId);\n }\n\n /**\n * List sessions matching filter criteria.\n */\n list(filter?: { role?: SessionRole; status?: SessionStatus }): ServerSession[] {\n const results: ServerSession[] = [];\n\n for (const session of this.sessions.values()) {\n if (filter?.role !== undefined && session.role !== filter.role) {\n continue;\n }\n if (filter?.status !== undefined && session.status !== filter.status) {\n continue;\n }\n results.push({ ...session });\n }\n\n return results;\n }\n\n /**\n * Delete a session by ID.\n */\n delete(id: string): boolean {\n const session = this.sessions.get(id);\n if (session?.resumeToken) {\n this.resumeTokenIndex.delete(session.resumeToken);\n }\n return this.sessions.delete(id);\n }\n\n /**\n * Clear all sessions.\n */\n clear(): void {\n this.sessions.clear();\n this.resumeTokenIndex.clear();\n }\n\n /**\n * Atomically claim and invalidate a resume token.\n * Returns the session if the token was valid and claimed, undefined if the token\n * was already claimed or doesn't exist. This prevents race conditions.\n */\n claimResumeToken(token: string): ServerSession | undefined {\n const sessionId = this.resumeTokenIndex.get(token);\n if (!sessionId) {\n return undefined;\n }\n\n // Atomically remove the token from the index BEFORE returning the session\n // This ensures no other caller can claim the same token\n this.resumeTokenIndex.delete(token);\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return undefined;\n }\n\n // Also clear the token from the session object\n session.resumeToken = undefined;\n\n return { ...session };\n }\n\n /**\n * Get the number of stored sessions.\n */\n get size(): number {\n return this.sessions.size;\n }\n}\n","/**\n * SessionManager implementation\n *\n * Manages session lifecycle with resume support.\n */\n\nimport type {\n ServerSession,\n SessionRole,\n SessionStatus,\n SessionStore,\n SessionManager,\n SessionManagerOptions,\n ResumeResult,\n EventBus,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemorySessionStore } from \"./stores/in-memory\";\n\n/** Default resume window: 5 minutes */\nconst DEFAULT_RESUME_WINDOW_MS = 5 * 60 * 1000;\n\n/**\n * Session resume guarantees.\n *\n * Documents what state is preserved when a session is resumed via resume token.\n * This is the contract that MAP server implementations MUST honor.\n *\n * @example\n * ```typescript\n * import { RESUME_GUARANTEES } from \"@multi-agent-protocol/sdk/server\";\n *\n * // Check what's guaranteed to be preserved\n * console.log(RESUME_GUARANTEES.preserved);\n * // ['sessionId', 'agentIds', 'subscriptionIds', 'metadata', 'role']\n * ```\n */\nexport const RESUME_GUARANTEES = {\n /**\n * State that MUST be preserved on successful resume.\n */\n preserved: [\n \"sessionId\", // Same session ID\n \"agentIds\", // All registered agent IDs\n \"subscriptionIds\", // All active subscription IDs\n \"metadata\", // Session metadata\n \"role\", // Session role (client/agent/gateway)\n ] as const,\n\n /**\n * State that persists independently (in their own stores).\n * These are NOT lost during disconnect but may need re-wiring on resume.\n */\n persistsIndependently: [\n \"scopeMemberships\", // Persists in ScopeStore, survives disconnect\n \"queuedMessages\", // Persists in MessageQueueStore, delivered on flushQueue()\n ] as const,\n\n /**\n * State that is NOT preserved and must be re-established.\n */\n notPreserved: [\n \"connectionState\", // Transport-level state\n \"pendingRequests\", // In-flight RPC requests\n ] as const,\n\n /**\n * Default resume window in milliseconds.\n * Sessions must resume within this window after disconnect.\n */\n defaultWindowMs: DEFAULT_RESUME_WINDOW_MS,\n\n /**\n * What happens on successful resume:\n * 1. Session status changes from 'disconnected' to 'connected'\n * 2. Resume token is cleared (one-time use)\n * 3. 'session.resumed' event is emitted\n * 4. Client should call flushQueue() for each agent to receive queued messages\n */\n onResume: [\n \"status-restored\",\n \"resume-token-cleared\",\n \"event-emitted\",\n \"queued-messages-available\",\n ] as const,\n} as const;\n\n/**\n * Generate a secure-ish resume token.\n * In production, you might want to use crypto.randomUUID() or similar.\n */\nfunction generateResumeToken(): string {\n return `resume_${ulid()}`;\n}\n\n/**\n * SessionManager implementation.\n *\n * Manages session lifecycle:\n * - Creation with role and metadata\n * - Disconnect with resume token generation\n * - Resume using token\n * - Permanent close\n * - Stale session expiration\n * - Agent and subscription tracking\n *\n * Events emitted:\n * - session.connected\n * - session.disconnected\n * - session.resumed\n * - session.expired\n */\nexport class SessionManagerImpl implements SessionManager {\n private readonly eventBus: EventBus;\n private readonly store: SessionStore;\n private readonly resumeWindowMs: number;\n\n constructor(options: SessionManagerOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemorySessionStore();\n this.resumeWindowMs = options.resumeWindowMs ?? DEFAULT_RESUME_WINDOW_MS;\n }\n\n /**\n * Create a new session.\n */\n create(params: {\n role: SessionRole;\n name?: string;\n metadata?: Record<string, unknown>;\n }): ServerSession {\n const now = Date.now();\n const session: ServerSession = {\n id: ulid(),\n role: params.role,\n name: params.name,\n status: \"connected\",\n connectedAt: now,\n lastActivity: now,\n metadata: params.metadata ?? {},\n agentIds: [],\n subscriptionIds: [],\n };\n\n this.store.save(session);\n\n this.eventBus.emit({\n type: \"session.connected\",\n data: { session },\n source: { sessionId: session.id },\n });\n\n return session;\n }\n\n /**\n * Get session by ID.\n */\n get(id: string): ServerSession | undefined {\n return this.store.get(id);\n }\n\n /**\n * List sessions matching filter criteria.\n */\n list(filter?: {\n role?: SessionRole;\n status?: SessionStatus;\n }): ServerSession[] {\n return this.store.list(filter);\n }\n\n /**\n * Mark session as disconnected (but resumable).\n * @returns Resume token for reconnection\n */\n disconnect(id: string): string | undefined {\n const session = this.store.get(id);\n if (!session) {\n return undefined;\n }\n\n // Already disconnected or expired\n if (session.status !== \"connected\") {\n return session.resumeToken;\n }\n\n const resumeToken = generateResumeToken();\n const updatedSession: ServerSession = {\n ...session,\n status: \"disconnected\",\n disconnectedAt: Date.now(),\n resumeToken,\n };\n\n this.store.save(updatedSession);\n\n this.eventBus.emit({\n type: \"session.disconnected\",\n data: { sessionId: id, resumeToken },\n source: { sessionId: id },\n });\n\n return resumeToken;\n }\n\n /**\n * Resume a disconnected session.\n */\n resume(resumeToken: string): ResumeResult {\n // Use atomic claim if available to prevent race conditions\n // where multiple clients could resume the same session\n let session: ServerSession | undefined;\n if (this.store.claimResumeToken) {\n session = this.store.claimResumeToken(resumeToken);\n } else {\n // Fallback for stores without atomic claim (not recommended)\n session = this.store.getByResumeToken(resumeToken);\n }\n\n if (!session) {\n return { success: false, reason: \"not_found\" };\n }\n\n if (session.status === \"expired\") {\n return { success: false, reason: \"expired\" };\n }\n\n if (session.status === \"connected\") {\n // Already connected - this shouldn't happen with atomic claim,\n // but handle it gracefully for backward compatibility\n return { success: true, session };\n }\n\n // Check if session has expired due to time\n const disconnectedAt = session.disconnectedAt ?? 0;\n if (Date.now() - disconnectedAt > this.resumeWindowMs) {\n // Mark as expired\n const expiredSession: ServerSession = {\n ...session,\n status: \"expired\",\n resumeToken: undefined,\n };\n this.store.save(expiredSession);\n\n this.eventBus.emit({\n type: \"session.expired\",\n data: { sessionId: session.id },\n source: { sessionId: session.id },\n });\n\n return { success: false, reason: \"expired\" };\n }\n\n // Resume the session\n const now = Date.now();\n const resumedSession: ServerSession = {\n ...session,\n status: \"connected\",\n lastActivity: now,\n disconnectedAt: undefined,\n resumeToken: undefined, // Already cleared by claimResumeToken, but be explicit\n };\n\n this.store.save(resumedSession);\n\n this.eventBus.emit({\n type: \"session.resumed\",\n data: { session: resumedSession },\n source: { sessionId: session.id },\n });\n\n return { success: true, session: resumedSession };\n }\n\n /**\n * Permanently close a session (not resumable).\n * @returns Session for cleanup\n */\n close(id: string): ServerSession | undefined {\n const session = this.store.get(id);\n if (!session) {\n return undefined;\n }\n\n this.store.delete(id);\n return session;\n }\n\n /**\n * Expire sessions that have been disconnected too long.\n * @returns Expired session IDs\n */\n expireStale(maxDisconnectMs: number): string[] {\n const now = Date.now();\n const disconnected = this.store.list({ status: \"disconnected\" });\n const expiredIds: string[] = [];\n\n for (const session of disconnected) {\n const disconnectedAt = session.disconnectedAt ?? 0;\n if (now - disconnectedAt > maxDisconnectMs) {\n const expiredSession: ServerSession = {\n ...session,\n status: \"expired\",\n resumeToken: undefined,\n };\n this.store.save(expiredSession);\n\n this.eventBus.emit({\n type: \"session.expired\",\n data: { sessionId: session.id },\n source: { sessionId: session.id },\n });\n\n expiredIds.push(session.id);\n }\n }\n\n return expiredIds;\n }\n\n /**\n * Track agent registration.\n */\n addAgent(sessionId: string, agentId: string): void {\n const session = this.store.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.agentIds.includes(agentId)) {\n const updatedSession: ServerSession = {\n ...session,\n agentIds: [...session.agentIds, agentId],\n };\n this.store.save(updatedSession);\n }\n }\n\n /**\n * Remove agent tracking.\n */\n removeAgent(sessionId: string, agentId: string): void {\n const session = this.store.get(sessionId);\n if (!session) {\n return;\n }\n\n const updatedSession: ServerSession = {\n ...session,\n agentIds: session.agentIds.filter((id) => id !== agentId),\n };\n this.store.save(updatedSession);\n }\n\n /**\n * Track subscription.\n */\n addSubscription(sessionId: string, subscriptionId: string): void {\n const session = this.store.get(sessionId);\n if (!session) {\n return;\n }\n\n if (!session.subscriptionIds.includes(subscriptionId)) {\n const updatedSession: ServerSession = {\n ...session,\n subscriptionIds: [...session.subscriptionIds, subscriptionId],\n };\n this.store.save(updatedSession);\n }\n }\n\n /**\n * Remove subscription tracking.\n */\n removeSubscription(sessionId: string, subscriptionId: string): void {\n const session = this.store.get(sessionId);\n if (!session) {\n return;\n }\n\n const updatedSession: ServerSession = {\n ...session,\n subscriptionIds: session.subscriptionIds.filter(\n (id) => id !== subscriptionId,\n ),\n };\n this.store.save(updatedSession);\n }\n\n /**\n * Update last activity timestamp.\n */\n touch(id: string): void {\n const session = this.store.get(id);\n if (!session) {\n return;\n }\n\n const updatedSession: ServerSession = {\n ...session,\n lastActivity: Date.now(),\n };\n this.store.save(updatedSession);\n }\n}\n","/**\n * In-memory ScopeStore implementation with hierarchy support\n */\n\nimport type { ServerScope, ScopeFilter, ScopeStore } from \"../../types\";\n\n/**\n * In-memory implementation of ScopeStore with hierarchy and membership tracking.\n */\nexport class InMemoryScopeStore implements ScopeStore {\n private readonly scopes: Map<string, ServerScope> = new Map();\n private readonly membership: Map<string, Set<string>> = new Map(); // scopeId -> Set<agentId>\n private readonly agentScopes: Map<string, Set<string>> = new Map(); // agentId -> Set<scopeId>\n\n /**\n * Save a scope (create or update).\n */\n saveScope(scope: ServerScope): void {\n this.scopes.set(scope.id, { ...scope });\n }\n\n /**\n * Get scope by ID.\n */\n getScope(id: string): ServerScope | undefined {\n const scope = this.scopes.get(id);\n return scope ? { ...scope } : undefined;\n }\n\n /**\n * List scopes matching filter criteria.\n */\n listScopes(filter?: ScopeFilter): ServerScope[] {\n const results: ServerScope[] = [];\n\n for (const scope of this.scopes.values()) {\n // Filter by parentId (null means root scopes only)\n if (filter?.parentId !== undefined) {\n if (filter.parentId === null) {\n if (scope.parentId !== undefined) continue;\n } else {\n if (scope.parentId !== filter.parentId) continue;\n }\n }\n\n // Filter by ancestorId (include all descendants of this scope)\n if (filter?.ancestorId !== undefined) {\n const ancestors = this.getAncestors(scope.id);\n if (!ancestors.includes(filter.ancestorId)) continue;\n }\n\n results.push({ ...scope });\n }\n\n return results;\n }\n\n /**\n * Delete a scope by ID.\n */\n deleteScope(id: string): boolean {\n // Clean up membership\n const members = this.membership.get(id);\n if (members) {\n for (const agentId of members) {\n this.agentScopes.get(agentId)?.delete(id);\n }\n this.membership.delete(id);\n }\n\n return this.scopes.delete(id);\n }\n\n /**\n * Get all ancestor scope IDs (parent chain to root).\n */\n getAncestors(scopeId: string): string[] {\n const ancestors: string[] = [];\n let current = this.scopes.get(scopeId);\n\n while (current?.parentId) {\n ancestors.push(current.parentId);\n current = this.scopes.get(current.parentId);\n }\n\n return ancestors;\n }\n\n /**\n * Get all descendant scope IDs (children recursively).\n */\n getDescendants(scopeId: string): string[] {\n const descendants: string[] = [];\n const queue: string[] = [scopeId];\n\n while (queue.length > 0) {\n const currentId = queue.shift()!;\n\n // Find all direct children\n for (const scope of this.scopes.values()) {\n if (scope.parentId === currentId) {\n descendants.push(scope.id);\n queue.push(scope.id);\n }\n }\n }\n\n return descendants;\n }\n\n /**\n * Add agent to scope membership.\n */\n addMember(scopeId: string, agentId: string): void {\n // Add to scope -> agents mapping\n let members = this.membership.get(scopeId);\n if (!members) {\n members = new Set();\n this.membership.set(scopeId, members);\n }\n members.add(agentId);\n\n // Add to agent -> scopes mapping\n let scopes = this.agentScopes.get(agentId);\n if (!scopes) {\n scopes = new Set();\n this.agentScopes.set(agentId, scopes);\n }\n scopes.add(scopeId);\n }\n\n /**\n * Remove agent from scope membership.\n */\n removeMember(scopeId: string, agentId: string): void {\n this.membership.get(scopeId)?.delete(agentId);\n this.agentScopes.get(agentId)?.delete(scopeId);\n }\n\n /**\n * Get all agents in a scope.\n */\n getMembers(scopeId: string, includeDescendants?: boolean): string[] {\n const members = new Set<string>();\n\n // Add direct members\n const directMembers = this.membership.get(scopeId);\n if (directMembers) {\n for (const agentId of directMembers) {\n members.add(agentId);\n }\n }\n\n // Add descendant members if requested\n if (includeDescendants) {\n const descendants = this.getDescendants(scopeId);\n for (const descendantId of descendants) {\n const descendantMembers = this.membership.get(descendantId);\n if (descendantMembers) {\n for (const agentId of descendantMembers) {\n members.add(agentId);\n }\n }\n }\n }\n\n return Array.from(members);\n }\n\n /**\n * Get all scopes an agent belongs to.\n */\n getScopesForAgent(agentId: string): string[] {\n const scopes = this.agentScopes.get(agentId);\n return scopes ? Array.from(scopes) : [];\n }\n\n /**\n * Clear all scopes and membership.\n */\n clear(): void {\n this.scopes.clear();\n this.membership.clear();\n this.agentScopes.clear();\n }\n\n /**\n * Get the number of stored scopes.\n */\n get size(): number {\n return this.scopes.size;\n }\n}\n","/**\n * ScopeManager implementation\n *\n * Manages scopes with parent-child hierarchy support.\n */\n\nimport type {\n ServerScope,\n ScopeFilter,\n ScopeStore,\n ScopeManager,\n ScopeManagerOptions,\n EventBus,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryScopeStore } from \"./stores/in-memory\";\n\n/**\n * Error thrown when a scope is not found.\n */\nexport class ScopeNotFoundError extends Error {\n constructor(scopeId: string) {\n super(`Scope not found: ${scopeId}`);\n this.name = \"ScopeNotFoundError\";\n }\n}\n\n/**\n * Error thrown when parent scope doesn't exist.\n */\nexport class InvalidParentScopeError extends Error {\n constructor(parentId: string) {\n super(`Parent scope not found: ${parentId}`);\n this.name = \"InvalidParentScopeError\";\n }\n}\n\n/**\n * Error thrown when trying to delete a scope that has children.\n */\nexport class ScopeHasChildrenError extends Error {\n constructor(scopeId: string, childCount: number) {\n super(\n `Cannot delete scope '${scopeId}': has ${childCount} child scope(s). ` +\n `Use deleteDescendants: true to cascade delete, or orphanChildren: true to detach children.`,\n );\n this.name = \"ScopeHasChildrenError\";\n }\n}\n\n/**\n * Scope hierarchy default behaviors.\n *\n * Documents the default behavior for scope hierarchy operations.\n * These are the documented guarantees for MAP server implementations.\n *\n * @example\n * ```typescript\n * import { SCOPE_HIERARCHY_DEFAULTS } from \"@multi-agent-protocol/sdk/server\";\n *\n * // Check default delete behavior\n * console.log(SCOPE_HIERARCHY_DEFAULTS.delete.withChildren);\n * // \"error\" - throws ScopeHasChildrenError\n * ```\n */\nexport const SCOPE_HIERARCHY_DEFAULTS = {\n /**\n * Default behavior when deleting a scope.\n */\n delete: {\n /** What happens when scope has children (default: error) */\n withChildren: \"error\" as const,\n /** Available options for handling children */\n options: [\"error\", \"deleteDescendants\", \"orphanChildren\"] as const,\n },\n\n /**\n * Default behavior for getMembers().\n */\n getMembers: {\n /** Whether to include members from descendant scopes (default: false) */\n includeDescendants: false,\n },\n\n /**\n * Default behavior for isMember().\n */\n isMember: {\n /** Whether to check ancestor scope membership (default: false) */\n checkAncestors: false,\n },\n\n /**\n * Membership inheritance rules.\n */\n membership: {\n /** Membership does NOT automatically cascade to child scopes */\n cascadesDown: false,\n /** Membership in child does NOT imply membership in parent */\n cascadesUp: false,\n /** Use checkAncestors/includeDescendants options for virtual inheritance */\n virtualInheritance: true,\n },\n} as const;\n\n/**\n * ScopeManager implementation.\n *\n * Manages scopes with hierarchy:\n * - Creation with optional parent\n * - Hierarchy traversal (ancestors, descendants)\n * - Membership management\n * - Cascade deletion\n *\n * Events emitted:\n * - scope.created\n * - scope.deleted\n * - scope.agent.joined\n * - scope.agent.left\n */\nexport class ScopeManagerImpl implements ScopeManager {\n private readonly eventBus: EventBus;\n private readonly store: ScopeStore;\n\n constructor(options: ScopeManagerOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemoryScopeStore();\n }\n\n /**\n * Create a new scope.\n */\n create(params: {\n name: string;\n metadata?: Record<string, unknown>;\n createdBy?: string;\n parentId?: string;\n }): ServerScope {\n // Validate parent exists if specified\n if (params.parentId) {\n const parent = this.store.getScope(params.parentId);\n if (!parent) {\n throw new InvalidParentScopeError(params.parentId);\n }\n }\n\n const scope: ServerScope = {\n id: ulid(),\n name: params.name,\n metadata: params.metadata ?? {},\n createdAt: Date.now(),\n createdBy: params.createdBy,\n parentId: params.parentId,\n };\n\n this.store.saveScope(scope);\n\n this.eventBus.emit({\n type: \"scope.created\",\n data: { scope },\n source: { scopeId: scope.id },\n });\n\n return scope;\n }\n\n /**\n * Get scope by ID.\n */\n get(id: string): ServerScope | undefined {\n return this.store.getScope(id);\n }\n\n /**\n * List scopes with optional filter.\n */\n list(filter?: ScopeFilter): ServerScope[] {\n return this.store.listScopes(filter);\n }\n\n /**\n * Delete a scope.\n *\n * By default, throws ScopeHasChildrenError if the scope has children.\n * Use options to control behavior:\n *\n * @param opts.deleteDescendants If true, cascade delete all child scopes\n * @param opts.orphanChildren If true, detach children (they become root scopes)\n * @throws {ScopeHasChildrenError} If scope has children and neither option is set\n */\n delete(\n id: string,\n opts?: { deleteDescendants?: boolean; orphanChildren?: boolean },\n ): boolean {\n const scope = this.store.getScope(id);\n if (!scope) {\n return false;\n }\n\n const children = this.getChildren(id);\n const deletedDescendants: string[] = [];\n\n // Check for children - error by default\n if (children.length > 0) {\n if (opts?.deleteDescendants) {\n // Cascade delete all descendants\n const descendants = this.store.getDescendants(id);\n for (const descendantId of descendants) {\n if (this.store.deleteScope(descendantId)) {\n deletedDescendants.push(descendantId);\n }\n }\n } else if (opts?.orphanChildren) {\n // Detach children - they become root scopes\n for (const child of children) {\n const orphanedChild = { ...child, parentId: undefined };\n this.store.saveScope(orphanedChild);\n }\n } else {\n // Error by default - explicit action required\n throw new ScopeHasChildrenError(id, children.length);\n }\n }\n\n const deleted = this.store.deleteScope(id);\n if (deleted) {\n this.eventBus.emit({\n type: \"scope.deleted\",\n data: {\n scopeId: id,\n deletedDescendants:\n deletedDescendants.length > 0 ? deletedDescendants : undefined,\n },\n source: { scopeId: id },\n });\n }\n\n return deleted;\n }\n\n /**\n * Get parent scope.\n */\n getParent(scopeId: string): ServerScope | undefined {\n const scope = this.store.getScope(scopeId);\n if (!scope?.parentId) {\n return undefined;\n }\n return this.store.getScope(scope.parentId);\n }\n\n /**\n * Get direct child scopes.\n */\n getChildren(scopeId: string): ServerScope[] {\n return this.store.listScopes({ parentId: scopeId });\n }\n\n /**\n * Get all ancestor scopes (parent chain to root).\n */\n getAncestors(scopeId: string): ServerScope[] {\n const ancestorIds = this.store.getAncestors(scopeId);\n return ancestorIds\n .map((id) => this.store.getScope(id))\n .filter((s): s is ServerScope => s !== undefined);\n }\n\n /**\n * Get all descendant scopes.\n */\n getDescendants(scopeId: string): ServerScope[] {\n const descendantIds = this.store.getDescendants(scopeId);\n return descendantIds\n .map((id) => this.store.getScope(id))\n .filter((s): s is ServerScope => s !== undefined);\n }\n\n /**\n * Add agent to scope.\n */\n join(scopeId: string, agentId: string): void {\n const scope = this.store.getScope(scopeId);\n if (!scope) {\n throw new ScopeNotFoundError(scopeId);\n }\n\n this.store.addMember(scopeId, agentId);\n\n this.eventBus.emit({\n type: \"scope.agent.joined\",\n data: { scopeId, agentId },\n source: { scopeId, agentId },\n });\n }\n\n /**\n * Remove agent from scope.\n */\n leave(scopeId: string, agentId: string): void {\n const scope = this.store.getScope(scopeId);\n if (!scope) {\n throw new ScopeNotFoundError(scopeId);\n }\n\n this.store.removeMember(scopeId, agentId);\n\n this.eventBus.emit({\n type: \"scope.agent.left\",\n data: { scopeId, agentId },\n source: { scopeId, agentId },\n });\n }\n\n /**\n * Get all agents in a scope.\n * @param opts.includeDescendants If true, include agents from descendant scopes\n */\n getMembers(\n scopeId: string,\n opts?: { includeDescendants?: boolean },\n ): string[] {\n return this.store.getMembers(scopeId, opts?.includeDescendants);\n }\n\n /**\n * Get all scopes an agent belongs to.\n */\n getScopesForAgent(agentId: string): string[] {\n return this.store.getScopesForAgent(agentId);\n }\n\n /**\n * Check if agent is a member of scope.\n * @param opts.checkAncestors If true, also check if agent is member of any ancestor scope\n */\n isMember(\n scopeId: string,\n agentId: string,\n opts?: { checkAncestors?: boolean },\n ): boolean {\n const scopes = this.store.getScopesForAgent(agentId);\n\n // Check direct membership\n if (scopes.includes(scopeId)) {\n return true;\n }\n\n // Check ancestor membership if requested\n if (opts?.checkAncestors) {\n const ancestors = this.store.getAncestors(scopeId);\n for (const ancestorId of ancestors) {\n if (scopes.includes(ancestorId)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Remove agent from all scopes.\n * Used for cleanup when agent is unregistered.\n */\n leaveAll(agentId: string): string[] {\n const scopes = this.store.getScopesForAgent(agentId);\n\n for (const scopeId of scopes) {\n this.store.removeMember(scopeId, agentId);\n\n this.eventBus.emit({\n type: \"scope.agent.left\",\n data: { scopeId, agentId },\n source: { scopeId, agentId },\n });\n }\n\n return scopes;\n }\n}\n","/**\n * Scope handler factories\n *\n * Creates JSON-RPC handlers for scope-related methods.\n */\n\nimport type {\n ScopeManager,\n HandlerContext,\n HandlerRegistry,\n ScopeFilter,\n} from \"../types\";\n\n/**\n * Options for creating scope handlers.\n */\nexport interface ScopeHandlerOptions {\n scopes: ScopeManager;\n}\n\n/**\n * Parameters for scope creation.\n */\ninterface CreateParams {\n name: string;\n metadata?: Record<string, unknown>;\n parentId?: string;\n}\n\n/**\n * Parameters for scope deletion.\n */\ninterface DeleteParams {\n scopeId: string;\n deleteDescendants?: boolean;\n}\n\n/**\n * Parameters for getting a scope.\n */\ninterface GetParams {\n scopeId: string;\n}\n\n/**\n * Parameters for joining a scope.\n */\ninterface JoinParams {\n scopeId: string;\n agentId: string;\n}\n\n/**\n * Parameters for leaving a scope.\n */\ninterface LeaveParams {\n scopeId: string;\n agentId: string;\n}\n\n/**\n * Parameters for getting scope members.\n */\ninterface GetMembersParams {\n scopeId: string;\n includeDescendants?: boolean;\n}\n\n/**\n * Create handlers for scope-related methods.\n *\n * Methods:\n * - `map/scopes/create` - Create a new scope\n * - `map/scopes/delete` - Delete a scope\n * - `map/scopes/list` - List scopes with optional filters\n * - `map/scopes/get` - Get a specific scope\n * - `map/scopes/join` - Add an agent to a scope\n * - `map/scopes/leave` - Remove an agent from a scope\n * - `map/scopes/members` - Get members of a scope\n */\nexport function createScopeHandlers(options: ScopeHandlerOptions): HandlerRegistry {\n const { scopes } = options;\n\n return {\n \"map/scopes/create\": async (params: unknown, ctx: HandlerContext) => {\n const { name, metadata, parentId } = params as CreateParams;\n\n const scope = scopes.create({\n name,\n metadata,\n parentId,\n createdBy: ctx.session.id,\n });\n\n // Return protocol-compliant response\n return {\n scope: {\n id: scope.id,\n name: scope.name,\n metadata: scope.metadata,\n parentId: scope.parentId,\n createdBy: scope.createdBy,\n },\n };\n },\n\n \"map/scopes/delete\": async (params: unknown) => {\n const { scopeId, deleteDescendants } = params as DeleteParams;\n\n const success = scopes.delete(scopeId, { deleteDescendants });\n if (!success) {\n throw new Error(`Scope not found: ${scopeId}`);\n }\n\n return { success: true };\n },\n\n \"map/scopes/list\": async (params: unknown) => {\n const filter = params as ScopeFilter;\n const scopeList = scopes.list(filter);\n\n // Return protocol-compliant response\n return {\n scopes: scopeList.map((s) => ({\n id: s.id,\n name: s.name,\n metadata: s.metadata,\n parentId: s.parentId,\n })),\n };\n },\n\n \"map/scopes/get\": async (params: unknown) => {\n const { scopeId } = params as GetParams;\n const scope = scopes.get(scopeId);\n\n if (!scope) {\n throw new Error(`Scope not found: ${scopeId}`);\n }\n\n // Return protocol-compliant response\n return {\n scope: {\n id: scope.id,\n name: scope.name,\n metadata: scope.metadata,\n parentId: scope.parentId,\n },\n };\n },\n\n \"map/scopes/join\": async (params: unknown) => {\n const { scopeId, agentId } = params as JoinParams;\n scopes.join(scopeId, agentId);\n return { success: true };\n },\n\n \"map/scopes/leave\": async (params: unknown) => {\n const { scopeId, agentId } = params as LeaveParams;\n scopes.leave(scopeId, agentId);\n return { success: true };\n },\n\n \"map/scopes/members\": async (params: unknown) => {\n const { scopeId, includeDescendants } = params as GetMembersParams;\n const members = scopes.getMembers(scopeId, { includeDescendants });\n // Return protocol-compliant response\n return { members };\n },\n };\n}\n","/**\n * Causal Event Buffer\n *\n * Buffers events and releases them in causal order. Events with `causedBy`\n * dependencies are held until all their predecessor events have been seen.\n *\n * This is useful for:\n * - Ensuring events are processed in correct causal order\n * - Handling out-of-order event delivery\n * - Building consistent views from event streams\n */\n\nimport type { Event } from '../types';\n\n/**\n * Event with envelope metadata for causal tracking\n */\nexport interface CausalEvent {\n /** Unique event identifier */\n eventId: string;\n /** Event IDs that must be processed before this event */\n causedBy?: string[];\n /** The event payload */\n event: Event;\n /** Timestamp when the event was received */\n receivedAt?: number;\n}\n\n/**\n * Mode for handling events with multiple causal dependencies.\n * - \"all\": Wait for ALL causes before releasing (stricter, default)\n * - \"any\": Release when ANY cause is seen (more permissive)\n */\nexport type MultiCauseMode = \"all\" | \"any\";\n\n/**\n * Options for CausalEventBuffer\n */\nexport interface CausalEventBufferOptions {\n /**\n * Maximum time (ms) to wait for causal predecessors before releasing anyway.\n * Default: 5000ms. Set to 0 or Infinity to wait indefinitely.\n */\n maxWaitTime?: number;\n\n /**\n * Maximum number of events to buffer before force-releasing oldest.\n * Default: 1000. Prevents unbounded memory growth.\n */\n maxBufferSize?: number;\n\n /**\n * Mode for handling events with multiple causes.\n * - \"all\" (default): Wait for ALL causes before releasing\n * - \"any\": Release when ANY cause is seen\n */\n multiCauseMode?: MultiCauseMode;\n\n /**\n * Callback when an event is released despite missing predecessors (timeout or buffer overflow).\n */\n onForcedRelease?: (event: CausalEvent, missingPredecessors: string[]) => void;\n}\n\n/**\n * Result from pushing an event to the buffer\n */\nexport interface CausalBufferPushResult {\n /** Events that are now ready to be processed in causal order */\n ready: CausalEvent[];\n /** Number of events still waiting for predecessors */\n pending: number;\n}\n\n/**\n * Buffers events and releases them in causal order.\n *\n * Events with `causedBy` dependencies are held until all predecessor events\n * have been seen (pushed to the buffer). Events without dependencies are\n * released immediately.\n *\n * @example\n * ```typescript\n * const buffer = new CausalEventBuffer();\n *\n * // Event B depends on A, but arrives first\n * let result = buffer.push({\n * eventId: 'B',\n * causedBy: ['A'],\n * event: { id: 'B', type: 'effect', timestamp: 2 }\n * });\n * console.log(result.ready); // [] - B is waiting for A\n * console.log(result.pending); // 1\n *\n * // Event A arrives\n * result = buffer.push({\n * eventId: 'A',\n * event: { id: 'A', type: 'cause', timestamp: 1 }\n * });\n * console.log(result.ready); // [A, B] - Both released in order\n * console.log(result.pending); // 0\n * ```\n */\nexport class CausalEventBuffer {\n readonly #options: Required<Omit<CausalEventBufferOptions, 'onForcedRelease'>> & {\n onForcedRelease?: CausalEventBufferOptions['onForcedRelease'];\n };\n\n /** Events seen (by eventId) - used to check if predecessors exist */\n readonly #seen: Set<string> = new Set();\n\n /** Events waiting for predecessors */\n readonly #pending: Map<string, CausalEvent> = new Map();\n\n /** Map from eventId to events waiting for it */\n readonly #waitingFor: Map<string, Set<string>> = new Map();\n\n constructor(options: CausalEventBufferOptions = {}) {\n this.#options = {\n maxWaitTime: options.maxWaitTime ?? 5000,\n maxBufferSize: options.maxBufferSize ?? 1000,\n multiCauseMode: options.multiCauseMode ?? \"all\",\n onForcedRelease: options.onForcedRelease,\n };\n }\n\n /**\n * Get the current multi-cause mode.\n */\n get multiCauseMode(): MultiCauseMode {\n return this.#options.multiCauseMode;\n }\n\n /**\n * Push an event into the buffer.\n *\n * @param event - The event to buffer\n * @returns Events that are ready to be processed (in causal order)\n */\n push(event: CausalEvent): CausalBufferPushResult {\n const ready: CausalEvent[] = [];\n\n // Check if we've already seen this event (deduplication)\n if (this.#seen.has(event.eventId)) {\n return { ready, pending: this.#pending.size };\n }\n\n // Mark as seen\n this.#seen.add(event.eventId);\n\n // Add received timestamp if not present\n if (!event.receivedAt) {\n event = { ...event, receivedAt: Date.now() };\n }\n\n // Check if predecessors are satisfied based on multi-cause mode\n const shouldRelease = this.#shouldReleaseEvent(event);\n\n if (shouldRelease) {\n // No dependencies or dependencies satisfied - release immediately\n ready.push(event);\n\n // Check if this event unblocks any pending events\n this.#releaseWaiting(event.eventId, ready);\n } else {\n // Wait for predecessors\n this.#pending.set(event.eventId, event);\n\n // Track what this event is waiting for\n const predecessors = event.causedBy ?? [];\n for (const predecessorId of predecessors) {\n if (!this.#waitingFor.has(predecessorId)) {\n this.#waitingFor.set(predecessorId, new Set());\n }\n this.#waitingFor.get(predecessorId)!.add(event.eventId);\n }\n }\n\n // Check for buffer overflow\n this.#handleBufferOverflow(ready);\n\n // Check for timeouts\n this.#handleTimeouts(ready);\n\n return { ready, pending: this.#pending.size };\n }\n\n /**\n * Get the number of events waiting for predecessors\n */\n get pendingCount(): number {\n return this.#pending.size;\n }\n\n /**\n * Get the number of unique events seen\n */\n get seenCount(): number {\n return this.#seen.size;\n }\n\n /**\n * Check if a specific event has been seen\n */\n hasSeen(eventId: string): boolean {\n return this.#seen.has(eventId);\n }\n\n /**\n * Force release all pending events, regardless of missing predecessors.\n * Useful for cleanup or when you know no more events are coming.\n *\n * @returns All pending events in the order they would be released\n */\n flush(): CausalEvent[] {\n const ready: CausalEvent[] = [];\n\n // Release all pending events, trying to maintain some order\n // Sort by receivedAt to release in arrival order\n const pendingList = Array.from(this.#pending.values()).sort(\n (a, b) => (a.receivedAt ?? 0) - (b.receivedAt ?? 0)\n );\n\n for (const event of pendingList) {\n const missingPredecessors = this.#getMissingPredecessors(event);\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n ready.push(event);\n }\n\n this.#pending.clear();\n this.#waitingFor.clear();\n\n return ready;\n }\n\n /**\n * Clear all state (seen events, pending events)\n */\n clear(): void {\n this.#seen.clear();\n this.#pending.clear();\n this.#waitingFor.clear();\n }\n\n /**\n * Check if an event should be released based on its predecessors and the multi-cause mode.\n */\n #shouldReleaseEvent(event: CausalEvent): boolean {\n if (!event.causedBy || event.causedBy.length === 0) {\n return true; // No dependencies - release immediately\n }\n\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n if (this.#options.multiCauseMode === \"any\") {\n // \"any\" mode: release if ANY predecessor is satisfied (not missing)\n // If all are missing, we must wait\n return missingPredecessors.length < event.causedBy.length;\n } else {\n // \"all\" mode (default): release only if ALL predecessors are satisfied\n return missingPredecessors.length === 0;\n }\n }\n\n /**\n * Get missing predecessors for an event.\n * A predecessor is considered \"missing\" if it hasn't been released yet\n * (either not seen at all, or seen but still pending).\n */\n #getMissingPredecessors(event: CausalEvent): string[] {\n if (!event.causedBy || event.causedBy.length === 0) {\n return [];\n }\n\n return event.causedBy.filter((predecessorId) => {\n // Predecessor is missing if:\n // 1. We haven't seen it at all, OR\n // 2. We've seen it but it's still pending (waiting for its own predecessors)\n return !this.#seen.has(predecessorId) || this.#pending.has(predecessorId);\n });\n }\n\n /**\n * Release events that were waiting for a specific predecessor\n */\n #releaseWaiting(predecessorId: string, ready: CausalEvent[]): void {\n const waitingEventIds = this.#waitingFor.get(predecessorId);\n if (!waitingEventIds) return;\n\n // Remove this predecessor from the waiting map\n this.#waitingFor.delete(predecessorId);\n\n for (const waitingEventId of waitingEventIds) {\n const waitingEvent = this.#pending.get(waitingEventId);\n if (!waitingEvent) continue;\n\n // Check if predecessors are now satisfied (respects multi-cause mode)\n if (this.#shouldReleaseEvent(waitingEvent)) {\n // Predecessors satisfied - release this event\n this.#pending.delete(waitingEventId);\n\n // Clean up waiting entries for this event's other predecessors\n if (waitingEvent.causedBy) {\n for (const otherPredId of waitingEvent.causedBy) {\n if (otherPredId !== predecessorId) {\n const waiting = this.#waitingFor.get(otherPredId);\n if (waiting) {\n waiting.delete(waitingEventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(otherPredId);\n }\n }\n }\n }\n }\n\n ready.push(waitingEvent);\n\n // Recursively check if this event unblocks others\n this.#releaseWaiting(waitingEventId, ready);\n }\n }\n }\n\n /**\n * Handle buffer overflow by force-releasing oldest events\n */\n #handleBufferOverflow(ready: CausalEvent[]): void {\n while (this.#pending.size > this.#options.maxBufferSize) {\n // Find oldest pending event by receivedAt\n let oldest: CausalEvent | null = null;\n for (const event of this.#pending.values()) {\n if (!oldest || (event.receivedAt ?? 0) < (oldest.receivedAt ?? 0)) {\n oldest = event;\n }\n }\n\n if (oldest) {\n this.#forceRelease(oldest, ready);\n }\n }\n }\n\n /**\n * Handle events that have been waiting too long\n */\n #handleTimeouts(ready: CausalEvent[]): void {\n if (this.#options.maxWaitTime <= 0 || this.#options.maxWaitTime === Infinity) {\n return;\n }\n\n const now = Date.now();\n const toRelease: CausalEvent[] = [];\n\n for (const event of this.#pending.values()) {\n const waitTime = now - (event.receivedAt ?? now);\n if (waitTime >= this.#options.maxWaitTime) {\n toRelease.push(event);\n }\n }\n\n for (const event of toRelease) {\n this.#forceRelease(event, ready);\n }\n }\n\n /**\n * Force release an event despite missing predecessors\n */\n #forceRelease(event: CausalEvent, ready: CausalEvent[]): void {\n const missingPredecessors = this.#getMissingPredecessors(event);\n\n // Remove from pending\n this.#pending.delete(event.eventId);\n\n // Remove from waiting lists\n for (const predecessorId of event.causedBy ?? []) {\n const waiting = this.#waitingFor.get(predecessorId);\n if (waiting) {\n waiting.delete(event.eventId);\n if (waiting.size === 0) {\n this.#waitingFor.delete(predecessorId);\n }\n }\n }\n\n // Notify callback\n if (missingPredecessors.length > 0) {\n this.#options.onForcedRelease?.(event, missingPredecessors);\n }\n\n // Add to ready list\n ready.push(event);\n\n // Check if this unblocks others\n this.#releaseWaiting(event.eventId, ready);\n }\n}\n\n/**\n * Validate that events are in causal order.\n *\n * An event sequence is in causal order if no event appears before\n * any of its predecessors (events in its causedBy array).\n *\n * @param events - Events to validate\n * @returns True if events are in valid causal order\n *\n * @example\n * ```typescript\n * const events = [\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * ];\n * console.log(validateCausalOrder(events)); // true\n *\n * const badOrder = [\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * { eventId: 'A', event: {...} }, // A should come before B\n * ];\n * console.log(validateCausalOrder(badOrder)); // false\n * ```\n */\nexport function validateCausalOrder(events: CausalEvent[]): boolean {\n const seen = new Set<string>();\n\n for (const event of events) {\n // Check all predecessors have been seen\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!seen.has(predecessorId)) {\n return false;\n }\n }\n }\n\n seen.add(event.eventId);\n }\n\n return true;\n}\n\n/**\n * Sort events into causal order using topological sort.\n *\n * If the events form a valid DAG (no cycles), returns them in an order\n * where no event appears before its predecessors. If there are cycles\n * or missing predecessors, throws an error.\n *\n * @param events - Events to sort\n * @returns Events in causal order\n * @throws If events contain cycles or reference missing predecessors\n *\n * @example\n * ```typescript\n * const unordered = [\n * { eventId: 'C', causedBy: ['B'], event: {...} },\n * { eventId: 'A', event: {...} },\n * { eventId: 'B', causedBy: ['A'], event: {...} },\n * ];\n * const ordered = sortCausalOrder(unordered);\n * // ordered = [A, B, C]\n * ```\n */\nexport function sortCausalOrder(events: CausalEvent[]): CausalEvent[] {\n const eventMap = new Map<string, CausalEvent>();\n for (const event of events) {\n eventMap.set(event.eventId, event);\n }\n\n const result: CausalEvent[] = [];\n const visited = new Set<string>();\n const visiting = new Set<string>(); // For cycle detection\n\n function visit(eventId: string): void {\n if (visited.has(eventId)) return;\n\n if (visiting.has(eventId)) {\n throw new Error(`Cycle detected involving event: ${eventId}`);\n }\n\n const event = eventMap.get(eventId);\n if (!event) {\n throw new Error(`Missing event: ${eventId}`);\n }\n\n visiting.add(eventId);\n\n // Visit predecessors first\n if (event.causedBy) {\n for (const predecessorId of event.causedBy) {\n if (!eventMap.has(predecessorId)) {\n throw new Error(`Missing predecessor: ${predecessorId} for event: ${eventId}`);\n }\n visit(predecessorId);\n }\n }\n\n visiting.delete(eventId);\n visited.add(eventId);\n result.push(event);\n }\n\n for (const event of events) {\n visit(event.eventId);\n }\n\n return result;\n}\n","/**\n * In-memory SubscriptionStore implementation\n */\n\nimport type { ServerSubscription, SubscriptionStore } from \"../../types\";\n\n/**\n * In-memory implementation of SubscriptionStore.\n */\nexport class InMemorySubscriptionStore implements SubscriptionStore {\n private readonly subscriptions: Map<string, ServerSubscription> = new Map();\n\n /**\n * Save a subscription (create or update).\n */\n save(subscription: ServerSubscription): void {\n this.subscriptions.set(subscription.id, { ...subscription });\n }\n\n /**\n * Get subscription by ID.\n */\n get(id: string): ServerSubscription | undefined {\n const subscription = this.subscriptions.get(id);\n return subscription ? { ...subscription } : undefined;\n }\n\n /**\n * List subscriptions matching filter criteria.\n */\n list(filter?: { sessionId?: string }): ServerSubscription[] {\n const results: ServerSubscription[] = [];\n\n for (const subscription of this.subscriptions.values()) {\n if (filter?.sessionId !== undefined && subscription.sessionId !== filter.sessionId) {\n continue;\n }\n results.push({ ...subscription });\n }\n\n return results;\n }\n\n /**\n * Delete a subscription by ID.\n */\n delete(id: string): boolean {\n return this.subscriptions.delete(id);\n }\n\n /**\n * Clear all subscriptions.\n */\n clear(): void {\n this.subscriptions.clear();\n }\n\n /**\n * Atomically update the lastEventId for a subscription.\n * This method performs a single atomic read-modify-write operation.\n * @returns The updated subscription, or undefined if not found\n */\n updateLastEventId(id: string, eventId: string): ServerSubscription | undefined {\n const subscription = this.subscriptions.get(id);\n if (!subscription) {\n return undefined;\n }\n // Atomic update - directly mutate the stored object\n subscription.lastEventId = eventId;\n return { ...subscription };\n }\n\n /**\n * Get the number of stored subscriptions.\n */\n get size(): number {\n return this.subscriptions.size;\n }\n}\n","/**\n * SubscriptionManager implementation\n *\n * Manages event subscriptions with causal ordering support.\n */\n\nimport type {\n ServerSubscription,\n SubscriptionFilter,\n MailSubscriptionFilter,\n SubscriptionStore,\n SubscriptionManager,\n SubscriptionManagerOptions,\n MAPEvent,\n EventBus,\n ScopeManager,\n CausalOrderingOptions,\n ReplayOptions,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { CausalEventBuffer, type CausalEvent } from \"../../utils/causal-buffer\";\nimport { InMemorySubscriptionStore } from \"./stores/in-memory\";\n\n/**\n * Internal state for a subscription including its event stream.\n */\ninterface SubscriptionState {\n subscription: ServerSubscription;\n unsubscribe: () => void;\n buffer: CausalEventBuffer;\n eventQueue: MAPEvent[];\n resolvers: Array<(value: IteratorResult<MAPEvent>) => void>;\n closed: boolean;\n}\n\n/**\n * SubscriptionManager implementation.\n *\n * Manages subscriptions to events with:\n * - Event type filtering\n * - Agent filtering\n * - Scope filtering (with nested scope support)\n * - Causal ordering via CausalEventBuffer\n * - Pause/resume support\n * - Async iterable event streams\n */\n/** Default replay options */\nconst DEFAULT_REPLAY_OPTIONS: Required<ReplayOptions> = {\n maxReplayCount: 1000,\n maxReplayAgeMs: 5 * 60 * 1000, // 5 minutes\n applyFilter: true,\n};\n\nexport class SubscriptionManagerImpl implements SubscriptionManager {\n private readonly eventBus: EventBus;\n private readonly store: SubscriptionStore;\n private readonly scopes?: ScopeManager;\n private readonly causalOrdering: Required<CausalOrderingOptions>;\n private readonly defaultReplayOptions: Required<ReplayOptions>;\n private readonly states: Map<string, SubscriptionState> = new Map();\n\n constructor(options: SubscriptionManagerOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemorySubscriptionStore();\n this.scopes = options.scopes;\n this.causalOrdering = {\n enabled: options.causalOrdering?.enabled ?? true,\n maxWaitMs: options.causalOrdering?.maxWaitMs ?? 5000,\n maxBufferSize: options.causalOrdering?.maxBufferSize ?? 1000,\n multiCauseMode: options.causalOrdering?.multiCauseMode ?? \"all\",\n };\n this.defaultReplayOptions = {\n ...DEFAULT_REPLAY_OPTIONS,\n ...options.defaultReplayOptions,\n };\n }\n\n /**\n * Create a new subscription.\n */\n create(params: {\n sessionId: string;\n filter: SubscriptionFilter;\n startAfter?: string;\n }): ServerSubscription {\n const subscription: ServerSubscription = {\n id: ulid(),\n sessionId: params.sessionId,\n filter: params.filter,\n createdAt: Date.now(),\n lastEventId: params.startAfter,\n paused: false,\n };\n\n this.store.save(subscription);\n\n // Create subscription state with event listener\n const state = this.createSubscriptionState(subscription);\n this.states.set(subscription.id, state);\n\n return subscription;\n }\n\n /**\n * Get subscription by ID.\n */\n get(id: string): ServerSubscription | undefined {\n return this.store.get(id);\n }\n\n /**\n * Cancel a subscription.\n */\n cancel(id: string): boolean {\n const state = this.states.get(id);\n if (state) {\n state.unsubscribe();\n state.closed = true;\n // Resolve any waiting iterators\n for (const resolver of state.resolvers) {\n resolver({ value: undefined, done: true });\n }\n state.resolvers = [];\n this.states.delete(id);\n }\n\n return this.store.delete(id);\n }\n\n /**\n * Cancel all subscriptions for a session.\n */\n cancelBySession(sessionId: string): string[] {\n const subscriptions = this.store.list({ sessionId });\n const cancelledIds: string[] = [];\n\n for (const subscription of subscriptions) {\n if (this.cancel(subscription.id)) {\n cancelledIds.push(subscription.id);\n }\n }\n\n return cancelledIds;\n }\n\n /**\n * Pause event delivery.\n */\n pause(id: string): void {\n const subscription = this.store.get(id);\n if (subscription && !subscription.paused) {\n subscription.paused = true;\n subscription.pausedAt = Date.now();\n this.store.save(subscription);\n }\n }\n\n /**\n * Resume event delivery.\n */\n resume(id: string): void {\n const subscription = this.store.get(id);\n if (subscription && subscription.paused) {\n subscription.paused = false;\n subscription.pausedAt = undefined;\n this.store.save(subscription);\n\n // Flush any queued events\n const state = this.states.get(id);\n if (state) {\n this.flushEventQueue(state);\n }\n }\n }\n\n /**\n * Update last delivered event ID.\n */\n acknowledge(id: string, eventId: string): void {\n const subscription = this.store.get(id);\n if (subscription) {\n subscription.lastEventId = eventId;\n this.store.save(subscription);\n }\n }\n\n /**\n * Get last delivered event ID for a subscription.\n */\n getLastEventId(id: string): string | undefined {\n return this.store.get(id)?.lastEventId;\n }\n\n /**\n * Replay missed events to a subscription since its lastEventId.\n * Used on session resume to catch up on events that were missed during disconnect.\n */\n replayEvents(id: string, options?: ReplayOptions): MAPEvent[] {\n const subscription = this.store.get(id);\n if (!subscription) {\n return [];\n }\n\n const opts: Required<ReplayOptions> = {\n ...this.defaultReplayOptions,\n ...options,\n };\n\n // Store original pause state and pause during replay\n // This prevents the live event handler from interfering with replay\n const wasPaused = subscription.paused;\n subscription.paused = true;\n this.store.save(subscription);\n\n // Calculate minimum timestamp for replay\n const minTimestamp = Date.now() - opts.maxReplayAgeMs;\n\n // Query events since lastEventId BEFORE emitting any replay events\n // to avoid the replay events themselves being included or affecting lastEventId\n const events = this.eventBus.getEvents({\n since: subscription.lastEventId,\n limit: opts.maxReplayCount,\n });\n\n // Filter events by age and optionally by subscription filter\n // Also filter out any subscription.replay.* events to avoid self-referential issues\n const filteredEvents = events.filter((event) => {\n // Skip replay events\n if (event.type.startsWith(\"subscription.replay.\")) {\n return false;\n }\n\n // Skip events that are too old\n if (event.timestamp < minTimestamp) {\n return false;\n }\n\n // Apply subscription filter if enabled\n if (opts.applyFilter && !this.matchesFilter(event, subscription.filter)) {\n return false;\n }\n\n return true;\n });\n\n // Emit replay started event\n this.eventBus.emit({\n type: \"subscription.replay.started\",\n data: {\n subscriptionId: id,\n sessionId: subscription.sessionId,\n lastEventId: subscription.lastEventId,\n options: opts,\n },\n });\n\n // Deliver events to the subscription state\n // Use a direct queue approach to avoid triggering the live event handler\n const state = this.states.get(id);\n if (state) {\n for (const event of filteredEvents) {\n // Directly queue events without going through deliverEvent\n // to avoid lastEventId being updated prematurely by concurrent live events\n if (state.resolvers.length > 0) {\n const resolver = state.resolvers.shift()!;\n resolver({ value: event, done: false });\n } else {\n state.eventQueue.push(event);\n }\n }\n\n // Update lastEventId to the last replayed event\n if (filteredEvents.length > 0) {\n const lastEvent = filteredEvents[filteredEvents.length - 1];\n subscription.lastEventId = lastEvent.id;\n }\n\n // Restore original pause state\n subscription.paused = wasPaused;\n this.store.save(subscription);\n state.subscription = subscription;\n } else {\n // No state, just restore pause state\n subscription.paused = wasPaused;\n this.store.save(subscription);\n }\n\n // Emit replay completed event\n this.eventBus.emit({\n type: \"subscription.replay.completed\",\n data: {\n subscriptionId: id,\n sessionId: subscription.sessionId,\n replayedCount: filteredEvents.length,\n lastReplayedEventId: filteredEvents[filteredEvents.length - 1]?.id,\n },\n });\n\n return filteredEvents;\n }\n\n /**\n * Replay missed events to all subscriptions for a session.\n * Convenience method for session resume.\n */\n replaySessionEvents(sessionId: string, options?: ReplayOptions): Map<string, MAPEvent[]> {\n const subscriptions = this.store.list({ sessionId });\n const result = new Map<string, MAPEvent[]>();\n\n for (const subscription of subscriptions) {\n const events = this.replayEvents(subscription.id, options);\n result.set(subscription.id, events);\n }\n\n return result;\n }\n\n /**\n * Find subscriptions that should receive an event.\n */\n match(event: MAPEvent): string[] {\n const subscriptions = this.store.list();\n const matchingIds: string[] = [];\n\n for (const subscription of subscriptions) {\n if (this.matchesFilter(event, subscription.filter)) {\n matchingIds.push(subscription.id);\n }\n }\n\n return matchingIds;\n }\n\n /**\n * Get ordered event stream for a subscription.\n */\n getEventStream(id: string): AsyncIterable<MAPEvent> {\n const state = this.states.get(id);\n if (!state) {\n // Return empty iterable for unknown subscription\n return {\n [Symbol.asyncIterator]: () => ({\n next: async () => ({ value: undefined, done: true as const }),\n }),\n };\n }\n\n return {\n [Symbol.asyncIterator]: () => ({\n next: async (): Promise<IteratorResult<MAPEvent>> => {\n if (state.closed) {\n return { value: undefined, done: true };\n }\n\n // If there are queued events, return the next one\n if (state.eventQueue.length > 0) {\n const event = state.eventQueue.shift()!;\n return { value: event, done: false };\n }\n\n // Wait for next event\n return new Promise<IteratorResult<MAPEvent>>((resolve) => {\n state.resolvers.push(resolve);\n });\n },\n }),\n };\n }\n\n /**\n * Create subscription state with event listener.\n */\n private createSubscriptionState(subscription: ServerSubscription): SubscriptionState {\n const buffer = new CausalEventBuffer({\n maxWaitTime: this.causalOrdering.enabled ? this.causalOrdering.maxWaitMs : 0,\n maxBufferSize: this.causalOrdering.maxBufferSize,\n multiCauseMode: this.causalOrdering.multiCauseMode,\n });\n\n const state: SubscriptionState = {\n subscription,\n buffer,\n eventQueue: [],\n resolvers: [],\n closed: false,\n unsubscribe: () => {}, // Will be set below\n };\n\n // Subscribe to all events\n state.unsubscribe = this.eventBus.on(\"*\", (event) => {\n this.handleEvent(state, event);\n });\n\n return state;\n }\n\n /**\n * Handle an incoming event for a subscription.\n */\n private handleEvent(state: SubscriptionState, event: MAPEvent): void {\n // Check if subscription matches this event\n const subscription = this.store.get(state.subscription.id);\n if (!subscription || !this.matchesFilter(event, subscription.filter)) {\n return;\n }\n\n // Update subscription reference in state\n state.subscription = subscription;\n\n // Check if paused\n if (subscription.paused) {\n return;\n }\n\n // Process through causal buffer if enabled\n if (this.causalOrdering.enabled) {\n // Normalize causedBy to array format\n const causedBy = event.causedBy\n ? Array.isArray(event.causedBy)\n ? event.causedBy\n : [event.causedBy]\n : undefined;\n\n const causalEvent: CausalEvent = {\n eventId: event.id,\n causedBy,\n event: event as any, // MAPEvent is compatible with Event type\n };\n\n const result = state.buffer.push(causalEvent);\n\n // Deliver ready events\n for (const readyEvent of result.ready) {\n this.deliverEvent(state, readyEvent.event as MAPEvent);\n }\n } else {\n // No causal ordering - deliver immediately\n this.deliverEvent(state, event);\n }\n }\n\n /**\n * Deliver an event to the subscription.\n */\n private deliverEvent(state: SubscriptionState, event: MAPEvent): void {\n // Track last delivered event ID for replay support\n // Use atomic update if available to prevent race conditions\n if (this.store.updateLastEventId) {\n const updated = this.store.updateLastEventId(state.subscription.id, event.id);\n if (updated) {\n state.subscription = updated;\n }\n } else {\n // Fallback for stores without atomic update (not recommended)\n const subscription = this.store.get(state.subscription.id);\n if (subscription) {\n subscription.lastEventId = event.id;\n this.store.save(subscription);\n state.subscription = subscription;\n }\n }\n\n // If there are waiting iterators, resolve the first one\n if (state.resolvers.length > 0) {\n const resolver = state.resolvers.shift()!;\n resolver({ value: event, done: false });\n } else {\n // Queue the event for later\n state.eventQueue.push(event);\n }\n }\n\n /**\n * Flush queued events to waiting iterators.\n */\n private flushEventQueue(state: SubscriptionState): void {\n while (state.eventQueue.length > 0 && state.resolvers.length > 0) {\n const event = state.eventQueue.shift()!;\n const resolver = state.resolvers.shift()!;\n resolver({ value: event, done: false });\n }\n }\n\n /**\n * Check if an event matches a subscription filter.\n *\n * Supports:\n * - Basic filters: eventTypes, agents, scopes, messageTypes\n * - Match modes: \"all\" (default) vs \"any\"\n * - Logical operators: $or, $and (can be combined - both must be satisfied)\n * - Nested filters with operators\n */\n private matchesFilter(event: MAPEvent, filter: SubscriptionFilter): boolean {\n // Handle combined $or and $and operators\n // When both are present, the event must satisfy both constraints\n const hasOr = filter.$or && filter.$or.length > 0;\n const hasAnd = filter.$and && filter.$and.length > 0;\n\n if (hasOr && hasAnd) {\n // Both operators present - event must match at least one $or AND all $and filters\n const orMatch = filter.$or!.some((subFilter) => this.matchesFilter(event, subFilter));\n const andMatch = filter.$and!.every((subFilter) => this.matchesFilter(event, subFilter));\n return orMatch && andMatch;\n }\n\n // Handle $or operator alone - match if ANY sub-filter matches\n if (hasOr) {\n return filter.$or!.some((subFilter) => this.matchesFilter(event, subFilter));\n }\n\n // Handle $and operator alone - match if ALL sub-filters match\n if (hasAnd) {\n return filter.$and!.every((subFilter) => this.matchesFilter(event, subFilter));\n }\n\n // Get match mode (default: \"all\")\n const matchMode = filter.match ?? \"all\";\n\n // Collect matching results for each criterion\n const criteria: Array<{ name: string; matches: boolean | null }> = [];\n\n // Check event types\n if (filter.eventTypes && filter.eventTypes.length > 0) {\n const matches = this.matchesEventTypes(event, filter.eventTypes);\n criteria.push({ name: \"eventTypes\", matches });\n }\n\n // Check fromAgents (source agent filter)\n if (filter.fromAgents && filter.fromAgents.length > 0) {\n const eventAgentId = event.source?.agentId;\n const matches = eventAgentId ? filter.fromAgents.includes(eventAgentId) : false;\n criteria.push({ name: \"fromAgents\", matches });\n }\n\n // Check scopes (including nested scopes)\n if (filter.scopes && filter.scopes.length > 0) {\n const matches = this.matchesScopes(event, filter.scopes);\n criteria.push({ name: \"scopes\", matches });\n }\n\n // Check message types (for message events)\n if (filter.messageTypes && filter.messageTypes.length > 0) {\n const matches = this.matchesMessageTypes(event, filter.messageTypes);\n criteria.push({ name: \"messageTypes\", matches });\n }\n\n // Check mail filter (for mail events)\n if (filter.mail) {\n const matches = this.matchesMailFilter(event, filter.mail);\n criteria.push({ name: \"mail\", matches });\n }\n\n // If no criteria specified, match everything\n if (criteria.length === 0) {\n return true;\n }\n\n // Apply match mode\n if (matchMode === \"any\") {\n // Any criterion matching is sufficient\n return criteria.some((c) => c.matches === true);\n } else {\n // All criteria must match (default \"all\" mode)\n return criteria.every((c) => c.matches === true);\n }\n }\n\n /**\n * Normalize event type to use dot notation.\n * Accepts both \"agent.registered\" and \"agent_registered\" for compatibility.\n */\n private normalizeEventType(type: string): string {\n return type.replace(/_/g, \".\");\n }\n\n /**\n * Check if event matches any of the event types.\n * Accepts both dot notation (agent.registered) and underscore notation (agent_registered).\n */\n private matchesEventTypes(event: MAPEvent, eventTypes: string[]): boolean {\n const normalizedEventType = this.normalizeEventType(event.type);\n\n // Normalize all filter types for comparison\n const normalizedFilters = eventTypes.map((t) => this.normalizeEventType(t));\n\n // Direct match\n if (normalizedFilters.includes(normalizedEventType)) {\n return true;\n }\n\n // Check for prefix matches (e.g., \"agent.*\" matches \"agent.registered\")\n return normalizedFilters.some((type) => {\n if (type.endsWith(\".*\")) {\n const prefix = type.slice(0, -2);\n return normalizedEventType.startsWith(prefix + \".\");\n }\n return false;\n });\n }\n\n /**\n * Check if event matches any of the scopes (including nested scopes).\n */\n private matchesScopes(event: MAPEvent, scopes: string[]): boolean {\n const eventScopeId = event.source?.scopeId;\n if (!eventScopeId) {\n return false;\n }\n\n // Check direct scope match\n if (scopes.includes(eventScopeId)) {\n return true;\n }\n\n // Check if event scope is a descendant of any filter scope\n if (this.scopes) {\n for (const filterScopeId of scopes) {\n try {\n const descendants = this.scopes.getDescendants(filterScopeId);\n if (descendants.some((d) => d.id === eventScopeId)) {\n return true;\n }\n } catch {\n // Invalid scope ID - skip this filter scope and continue checking others\n continue;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Check if event matches any of the message types.\n * This checks for a messageType field in the event data.\n */\n private matchesMessageTypes(event: MAPEvent, messageTypes: string[]): boolean {\n // Check if this is a message event with a messageType field\n const eventData = event.data as Record<string, unknown> | undefined;\n if (!eventData) {\n return false;\n }\n\n // Try to extract messageType from event data\n // Common locations: data.messageType, data.message.messageType\n const messageType =\n (eventData.messageType as string) ??\n ((eventData.message as Record<string, unknown> | undefined)?.messageType as string);\n\n if (!messageType) {\n return false;\n }\n\n return messageTypes.includes(messageType);\n }\n\n /**\n * Check if a mail event matches a mail subscription filter.\n * Extracts conversationId, threadId, participantId, and contentType\n * from the event data based on the mail event type.\n */\n private matchesMailFilter(event: MAPEvent, mailFilter: MailSubscriptionFilter): boolean {\n // Only match mail.* events\n if (!event.type.startsWith(\"mail.\")) {\n return false;\n }\n\n const data = event.data as Record<string, unknown> | undefined;\n if (!data) {\n return false;\n }\n\n // Check conversationId (all mail events have this)\n if (mailFilter.conversationId) {\n if (data.conversationId !== mailFilter.conversationId) {\n return false;\n }\n }\n\n // Check threadId - found in turn.threadId or thread.id\n if (mailFilter.threadId) {\n const turn = data.turn as Record<string, unknown> | undefined;\n const thread = data.thread as Record<string, unknown> | undefined;\n const threadId = turn?.threadId ?? thread?.id ?? data.threadId;\n if (threadId !== mailFilter.threadId) {\n return false;\n }\n }\n\n // Check participantId - found in various locations depending on event type\n if (mailFilter.participantId) {\n const participant = data.participant as Record<string, unknown> | undefined;\n const turn = data.turn as Record<string, unknown> | undefined;\n const pid =\n participant?.id ??\n data.participantId ??\n data.createdBy ??\n data.closedBy ??\n turn?.participant;\n if (pid !== mailFilter.participantId) {\n return false;\n }\n }\n\n // Check contentType - found in turn.contentType\n if (mailFilter.contentType) {\n const turn = data.turn as Record<string, unknown> | undefined;\n if (turn?.contentType !== mailFilter.contentType) {\n return false;\n }\n }\n\n return true;\n }\n}\n","/**\n * Subscription handler factories\n *\n * Creates JSON-RPC handlers for subscription-related methods.\n */\n\nimport type {\n SubscriptionManager,\n EventBus,\n HandlerContext,\n HandlerRegistry,\n SubscriptionFilter,\n SessionManager,\n} from \"../types\";\n\n/**\n * Options for creating subscription handlers.\n */\nexport interface SubscriptionHandlerOptions {\n subscriptions: SubscriptionManager;\n eventBus: EventBus;\n /**\n * SessionManager for tracking subscription-session associations.\n * When provided, uses atomic SessionManager methods instead of direct session mutation.\n */\n sessions?: SessionManager;\n}\n\n/**\n * Parameters for subscribing.\n */\ninterface SubscribeParams {\n filter: SubscriptionFilter;\n startAfter?: string;\n}\n\n/**\n * Parameters for unsubscribing.\n */\ninterface UnsubscribeParams {\n subscriptionId: string;\n}\n\n/**\n * Parameters for replaying events.\n */\ninterface ReplayParams {\n subscriptionId: string;\n since?: string;\n until?: string;\n limit?: number;\n}\n\n/**\n * Parameters for acknowledging events.\n */\ninterface AcknowledgeParams {\n subscriptionId: string;\n eventId: string;\n}\n\n/**\n * Parameters for pausing/resuming.\n */\ninterface PauseResumeParams {\n subscriptionId: string;\n}\n\n/**\n * Create handlers for subscription-related methods.\n *\n * Methods:\n * - `map/subscribe` - Create a new subscription\n * - `map/unsubscribe` - Cancel a subscription\n * - `map/replay` - Replay historical events\n * - `map/ack` - Acknowledge received events\n * - `map/pause` - Pause event delivery\n * - `map/resume` - Resume event delivery\n */\nexport function createSubscriptionHandlers(\n options: SubscriptionHandlerOptions\n): HandlerRegistry {\n const { subscriptions, eventBus, sessions } = options;\n\n return {\n \"map/subscribe\": async (params: unknown, ctx: HandlerContext) => {\n const { filter, startAfter } = params as SubscribeParams;\n\n const subscription = subscriptions.create({\n sessionId: ctx.session.id,\n filter,\n startAfter,\n });\n\n // Track subscription in session - use SessionManager if available\n if (sessions) {\n sessions.addSubscription(ctx.session.id, subscription.id);\n } else {\n // Legacy fallback: direct mutation (not recommended)\n ctx.session.subscriptionIds.push(subscription.id);\n }\n\n // Return protocol-compliant response\n return { subscriptionId: subscription.id };\n },\n\n \"map/unsubscribe\": async (params: unknown, ctx: HandlerContext) => {\n const { subscriptionId } = params as UnsubscribeParams;\n\n const success = subscriptions.cancel(subscriptionId);\n if (!success) {\n throw new Error(`Subscription not found: ${subscriptionId}`);\n }\n\n // Remove from session tracking - use SessionManager if available\n if (sessions) {\n sessions.removeSubscription(ctx.session.id, subscriptionId);\n } else {\n // Legacy fallback: direct mutation (not recommended)\n const index = ctx.session.subscriptionIds.indexOf(subscriptionId);\n if (index !== -1) {\n ctx.session.subscriptionIds.splice(index, 1);\n }\n }\n\n return { success: true };\n },\n\n \"map/replay\": async (params: unknown) => {\n const { subscriptionId, since, until, limit } = params as ReplayParams;\n\n // Get subscription to find its filter\n const subscription = subscriptions.get(subscriptionId);\n if (!subscription) {\n throw new Error(`Subscription not found: ${subscriptionId}`);\n }\n\n // Query events from the event bus\n const events = eventBus.getEvents({\n types: subscription.filter.eventTypes,\n since,\n until,\n limit: limit ?? 100,\n });\n\n return events;\n },\n\n \"map/ack\": async (params: unknown) => {\n const { subscriptionId, eventId } = params as AcknowledgeParams;\n subscriptions.acknowledge(subscriptionId, eventId);\n return { success: true };\n },\n\n \"map/pause\": async (params: unknown) => {\n const { subscriptionId } = params as PauseResumeParams;\n subscriptions.pause(subscriptionId);\n return { success: true };\n },\n\n \"map/resume\": async (params: unknown) => {\n const { subscriptionId } = params as PauseResumeParams;\n subscriptions.resume(subscriptionId);\n return { success: true };\n },\n };\n}\n","/**\n * In-memory MessageQueueStore implementation\n */\n\nimport type { QueuedMessage, MessageQueueStore } from \"../../types\";\n\n/**\n * In-memory implementation of MessageQueueStore.\n * Messages are stored in priority queues per agent.\n */\nexport class InMemoryMessageQueueStore implements MessageQueueStore {\n // Map of agentId -> array of queued messages (sorted by priority, then timestamp)\n private readonly queues: Map<string, QueuedMessage[]> = new Map();\n // Index by message ID for quick removal\n private readonly messageIndex: Map<string, string> = new Map(); // messageId -> agentId\n\n /**\n * Enqueue a message for an agent.\n */\n enqueue(msg: QueuedMessage): void {\n const queue = this.queues.get(msg.targetAgentId) ?? [];\n\n // Insert in priority order (lower priority number = higher priority)\n // For same priority, maintain FIFO order by queuedAt\n const priority = msg.message.priority ?? Number.MAX_SAFE_INTEGER;\n let insertIndex = queue.length;\n\n for (let i = 0; i < queue.length; i++) {\n const existing = queue[i];\n const existingPriority = existing.message.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (priority < existingPriority) {\n insertIndex = i;\n break;\n }\n if (priority === existingPriority && msg.queuedAt < existing.queuedAt) {\n insertIndex = i;\n break;\n }\n }\n\n queue.splice(insertIndex, 0, msg);\n this.queues.set(msg.targetAgentId, queue);\n this.messageIndex.set(msg.message.id, msg.targetAgentId);\n }\n\n /**\n * Dequeue messages for an agent (removes from queue).\n */\n dequeue(agentId: string, limit?: number): QueuedMessage[] {\n const queue = this.queues.get(agentId);\n if (!queue || queue.length === 0) {\n return [];\n }\n\n const count = limit ?? queue.length;\n const messages = queue.splice(0, count);\n\n // Clean up index\n for (const msg of messages) {\n this.messageIndex.delete(msg.message.id);\n }\n\n // Remove empty queue\n if (queue.length === 0) {\n this.queues.delete(agentId);\n }\n\n return messages;\n }\n\n /**\n * Peek at queued messages without removing them.\n */\n peek(agentId: string, limit?: number): QueuedMessage[] {\n const queue = this.queues.get(agentId);\n if (!queue || queue.length === 0) {\n return [];\n }\n\n const count = limit ?? queue.length;\n return queue.slice(0, count);\n }\n\n /**\n * Remove a specific message by ID.\n */\n remove(messageId: string): boolean {\n const agentId = this.messageIndex.get(messageId);\n if (!agentId) {\n return false;\n }\n\n const queue = this.queues.get(agentId);\n if (!queue) {\n return false;\n }\n\n const index = queue.findIndex((m) => m.message.id === messageId);\n if (index === -1) {\n return false;\n }\n\n queue.splice(index, 1);\n this.messageIndex.delete(messageId);\n\n // Remove empty queue\n if (queue.length === 0) {\n this.queues.delete(agentId);\n }\n\n return true;\n }\n\n /**\n * Get queue size for a specific agent.\n */\n getQueueSize(agentId: string): number {\n return this.queues.get(agentId)?.length ?? 0;\n }\n\n /**\n * Get total queued messages across all agents.\n */\n getTotalSize(): number {\n let total = 0;\n for (const queue of this.queues.values()) {\n total += queue.length;\n }\n return total;\n }\n\n /**\n * Expire old messages that have passed their TTL.\n * @returns Number of messages expired\n */\n expireOld(): number {\n const now = Date.now();\n let expiredCount = 0;\n\n for (const [agentId, queue] of this.queues.entries()) {\n const validMessages: QueuedMessage[] = [];\n\n for (const msg of queue) {\n if (msg.expiresAt <= now) {\n this.messageIndex.delete(msg.message.id);\n expiredCount++;\n } else {\n validMessages.push(msg);\n }\n }\n\n if (validMessages.length === 0) {\n this.queues.delete(agentId);\n } else if (validMessages.length !== queue.length) {\n this.queues.set(agentId, validMessages);\n }\n }\n\n return expiredCount;\n }\n\n /**\n * Clear all queued messages.\n */\n clear(): void {\n this.queues.clear();\n this.messageIndex.clear();\n }\n\n /**\n * Get queue sizes by agent (for stats).\n */\n getQueueSizesByAgent(): Record<string, number> {\n const result: Record<string, number> = {};\n for (const [agentId, queue] of this.queues.entries()) {\n result[agentId] = queue.length;\n }\n return result;\n }\n}\n","/**\n * MessageRouter implementation\n *\n * Routes messages between agents with queuing support for offline delivery.\n */\n\nimport type {\n ServerMessage,\n QueuedMessage,\n DeliveryHandler,\n MessageQueueStore,\n MessageRouter,\n MessageRouterOptions,\n EventBus,\n AgentRegistry,\n ScopeManager,\n MessageQueueOptions,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryMessageQueueStore } from \"./stores/in-memory\";\n\n/**\n * Default queue options.\n */\nconst DEFAULT_QUEUE_OPTIONS: Required<MessageQueueOptions> = {\n enabled: true,\n maxPerAgent: 100,\n defaultTtlMs: 60000,\n maxTotal: 10000,\n};\n\n/**\n * MessageRouter implementation.\n *\n * Routes messages between agents with:\n * - Direct agent-to-agent messaging\n * - Scope broadcast with optional descendant inclusion\n * - Queuing for offline agents\n * - Priority-based delivery\n * - TTL-based message expiration\n *\n * Events emitted:\n * - message.sent - When a message is created\n * - message.delivered - When a message is delivered to an agent\n * - message.queued - When a message is queued for offline agent\n * - message.expired - When a queued message expires\n */\nexport class MessageRouterImpl implements MessageRouter {\n private readonly eventBus: EventBus;\n private readonly agents: AgentRegistry;\n private readonly scopes: ScopeManager;\n private readonly queueStore: MessageQueueStore;\n private readonly queueOptions: Required<MessageQueueOptions>;\n private deliveryHandler?: DeliveryHandler;\n\n constructor(options: MessageRouterOptions) {\n this.eventBus = options.eventBus;\n this.agents = options.agents;\n this.scopes = options.scopes;\n this.queueStore = options.queueStore ?? new InMemoryMessageQueueStore();\n this.queueOptions = {\n ...DEFAULT_QUEUE_OPTIONS,\n ...options.queue,\n };\n }\n\n /**\n * Send message to a specific agent.\n * @throws Error if validation is enabled and target agent does not exist\n */\n sendToAgent(params: {\n from: string;\n to: string;\n payload: unknown;\n replyTo?: string;\n priority?: number;\n ttlMs?: number;\n /** Optional message type for routing/filtering */\n messageType?: string;\n /** Validate that target agent exists before sending */\n validateTarget?: boolean;\n }): ServerMessage {\n // Validate target agent exists if validation is explicitly enabled\n if (params.validateTarget) {\n const targetAgent = this.agents.get(params.to);\n if (!targetAgent) {\n throw new Error(`Target agent not found: ${params.to}`);\n }\n }\n\n const message: ServerMessage = {\n id: ulid(),\n from: params.from,\n to: params.to,\n payload: params.payload,\n timestamp: Date.now(),\n replyTo: params.replyTo,\n priority: params.priority,\n ttlMs: params.ttlMs,\n messageType: params.messageType,\n };\n\n // Emit message.sent event\n this.eventBus.emit({\n type: \"message.sent\",\n data: { message },\n source: { agentId: params.from },\n });\n\n // Try to deliver to the target agent\n this.deliverToAgent(params.to, message);\n\n return message;\n }\n\n /**\n * Broadcast message to all agents in a scope.\n */\n sendToScope(params: {\n from: string;\n scopeId: string;\n payload: unknown;\n excludeSender?: boolean;\n includeDescendants?: boolean;\n /** Optional message type for routing/filtering */\n messageType?: string;\n }): ServerMessage {\n const message: ServerMessage = {\n id: ulid(),\n from: params.from,\n to: params.scopeId,\n payload: params.payload,\n timestamp: Date.now(),\n messageType: params.messageType,\n };\n\n // Emit message.sent event\n this.eventBus.emit({\n type: \"message.sent\",\n data: { message, scopeId: params.scopeId },\n source: { agentId: params.from, scopeId: params.scopeId },\n });\n\n // Get all members in the scope\n const members = this.scopes.getMembers(params.scopeId, {\n includeDescendants: params.includeDescendants ?? false,\n });\n\n // Deliver to each member\n for (const agentId of members) {\n // Skip sender if requested\n if (params.excludeSender && agentId === params.from) {\n continue;\n }\n\n this.deliverToAgent(agentId, message);\n }\n\n return message;\n }\n\n /**\n * Set the delivery handler callback.\n */\n onDeliver(handler: DeliveryHandler): void {\n this.deliveryHandler = handler;\n }\n\n /**\n * Flush queued messages for an agent (call when agent reconnects).\n * @returns Number of messages delivered\n */\n flushQueue(agentId: string): number {\n if (!this.queueOptions.enabled) {\n return 0;\n }\n\n const queuedMessages = this.queueStore.dequeue(agentId);\n let deliveredCount = 0;\n\n for (const queued of queuedMessages) {\n // Check if message has expired\n if (queued.expiresAt <= Date.now()) {\n this.eventBus.emit({\n type: \"message.expired\",\n data: { messageId: queued.message.id, agentId },\n });\n continue;\n }\n\n // Deliver the message\n if (this.deliveryHandler) {\n this.deliveryHandler(agentId, queued.message);\n this.eventBus.emit({\n type: \"message.delivered\",\n data: { message: queued.message, agentId },\n });\n deliveredCount++;\n }\n }\n\n return deliveredCount;\n }\n\n /**\n * Get queue statistics.\n */\n getQueueStats(): {\n total: number;\n byAgent: Record<string, number>;\n } {\n const store = this.queueStore as InMemoryMessageQueueStore;\n return {\n total: this.queueStore.getTotalSize(),\n byAgent: store.getQueueSizesByAgent?.() ?? {},\n };\n }\n\n /**\n * Deliver a message to an agent, queuing if offline.\n */\n private deliverToAgent(agentId: string, message: ServerMessage): void {\n const agent = this.agents.get(agentId);\n const isOnline = agent && agent.state !== \"stopped\";\n\n if (isOnline && this.deliveryHandler) {\n // Agent is online - deliver immediately\n this.deliveryHandler(agentId, message);\n this.eventBus.emit({\n type: \"message.delivered\",\n data: { message, agentId },\n });\n } else if (this.queueOptions.enabled) {\n // Agent is offline - queue the message\n this.queueMessage(agentId, message);\n }\n }\n\n /**\n * Queue a message for later delivery.\n * @returns true if message was queued, false if dropped\n */\n private queueMessage(agentId: string, message: ServerMessage): boolean {\n // Check total queue limit\n if (this.queueStore.getTotalSize() >= this.queueOptions.maxTotal) {\n // Queue is full - run expiration and try again\n this.queueStore.expireOld();\n\n if (this.queueStore.getTotalSize() >= this.queueOptions.maxTotal) {\n // Still full after expiration - drop the message and emit event\n this.eventBus.emit({\n type: \"message.dropped\",\n data: {\n messageId: message.id,\n from: message.from,\n to: agentId,\n reason: \"queue_full\",\n queueSize: this.queueStore.getTotalSize(),\n maxTotal: this.queueOptions.maxTotal,\n },\n });\n return false;\n }\n }\n\n // Check per-agent limit\n if (this.queueStore.getQueueSize(agentId) >= this.queueOptions.maxPerAgent) {\n // Agent queue is full - drop the message and emit event\n this.eventBus.emit({\n type: \"message.dropped\",\n data: {\n messageId: message.id,\n from: message.from,\n to: agentId,\n reason: \"agent_queue_full\",\n agentQueueSize: this.queueStore.getQueueSize(agentId),\n maxPerAgent: this.queueOptions.maxPerAgent,\n },\n });\n return false;\n }\n\n const ttlMs = message.ttlMs ?? this.queueOptions.defaultTtlMs;\n const now = Date.now();\n\n const queuedMessage: QueuedMessage = {\n message,\n targetAgentId: agentId,\n queuedAt: now,\n expiresAt: now + ttlMs,\n attempts: 0,\n };\n\n this.queueStore.enqueue(queuedMessage);\n\n this.eventBus.emit({\n type: \"message.queued\",\n data: { messageId: message.id, agentId, expiresAt: queuedMessage.expiresAt },\n });\n\n return true;\n }\n\n /**\n * Expire old messages from the queue.\n * @returns Number of messages expired\n */\n expireMessages(): number {\n const expiredCount = this.queueStore.expireOld();\n\n if (expiredCount > 0) {\n this.eventBus.emit({\n type: \"message.expired\",\n data: { count: expiredCount },\n });\n }\n\n return expiredCount;\n }\n}\n","/**\n * Address utilities for recipient disambiguation\n *\n * Provides utilities for parsing and formatting message addresses\n * with type prefixes to distinguish between agent and scope recipients.\n *\n * Format: \"{type}:{id}\"\n * - agent:abc123 -> agent recipient\n * - scope:room-1 -> scope recipient\n */\n\n/** Valid address types */\nexport type AddressType = \"agent\" | \"scope\";\n\n/** Parsed address components */\nexport interface AddressComponents {\n type: AddressType;\n id: string;\n}\n\n/** The separator used in address format */\nconst SEPARATOR = \":\";\n\n/** Valid address types for validation */\nconst VALID_ADDRESS_TYPES: readonly AddressType[] = [\"agent\", \"scope\"];\n\n/**\n * Error thrown when an address format is invalid.\n */\nexport class InvalidAddressError extends Error {\n constructor(address: string, reason: string) {\n super(`Invalid address \"${address}\": ${reason}`);\n this.name = \"InvalidAddressError\";\n }\n}\n\n/**\n * Format an address with type prefix.\n *\n * @param type - The address type (agent or scope)\n * @param id - The entity ID\n * @returns Formatted address string\n * @throws InvalidAddressError if parameters are invalid\n *\n * @example\n * formatAddress(\"agent\", \"abc123\") // \"agent:abc123\"\n * formatAddress(\"scope\", \"room-1\") // \"scope:room-1\"\n */\nexport function formatAddress(type: AddressType, id: string): string {\n if (!id) {\n throw new InvalidAddressError(\"\", \"ID cannot be empty\");\n }\n\n if (id.includes(SEPARATOR)) {\n throw new InvalidAddressError(id, \"ID cannot contain colon separator\");\n }\n\n return `${type}${SEPARATOR}${id}`;\n}\n\n/**\n * Parse an address string into its components.\n *\n * @param address - The address string to parse\n * @returns Parsed address components\n * @throws InvalidAddressError if format is invalid\n *\n * @example\n * parseAddress(\"agent:abc123\") // { type: \"agent\", id: \"abc123\" }\n * parseAddress(\"scope:room-1\") // { type: \"scope\", id: \"room-1\" }\n */\nexport function parseAddress(address: string): AddressComponents {\n const separatorIndex = address.indexOf(SEPARATOR);\n\n if (separatorIndex === -1) {\n throw new InvalidAddressError(address, \"missing type prefix\");\n }\n\n const type = address.slice(0, separatorIndex);\n const id = address.slice(separatorIndex + 1);\n\n if (!VALID_ADDRESS_TYPES.includes(type as AddressType)) {\n throw new InvalidAddressError(address, `invalid type \"${type}\", must be agent or scope`);\n }\n\n if (!id) {\n throw new InvalidAddressError(address, \"ID cannot be empty\");\n }\n\n // Check for extra colons (could be a federated ID embedded)\n // Allow federated IDs in the id portion: agent:system-a:agent:abc123\n // This means the id would be \"system-a:agent:abc123\" which is fine\n\n return {\n type: type as AddressType,\n id,\n };\n}\n\n/**\n * Check if a string is a valid prefixed address.\n *\n * @param address - The string to check\n * @returns true if valid prefixed address format\n *\n * @example\n * isAddress(\"agent:abc123\") // true\n * isAddress(\"scope:room-1\") // true\n * isAddress(\"abc123\") // false (no prefix)\n * isAddress(\"invalid:abc\") // false (invalid type)\n */\nexport function isAddress(address: string): boolean {\n try {\n parseAddress(address);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for an agent.\n *\n * @param address - The address string to check\n * @returns true if address is for an agent\n */\nexport function isAgentAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"agent\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an address is for a scope.\n *\n * @param address - The address string to check\n * @returns true if address is for a scope\n */\nexport function isScopeAddress(address: string): boolean {\n try {\n const parsed = parseAddress(address);\n return parsed.type === \"scope\";\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the ID from an address, or return the original if not prefixed.\n *\n * Useful for backward compatibility when handling both prefixed and unprefixed addresses.\n *\n * @param address - The address string\n * @returns The extracted ID or the original string\n */\nexport function extractId(address: string): string {\n try {\n const parsed = parseAddress(address);\n return parsed.id;\n } catch {\n return address;\n }\n}\n\n/**\n * Extract the type from an address, or return undefined if not prefixed.\n *\n * @param address - The address string\n * @returns The address type or undefined\n */\nexport function extractType(address: string): AddressType | undefined {\n try {\n const parsed = parseAddress(address);\n return parsed.type;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Convenience function to create an agent address.\n *\n * @param agentId - The agent ID\n * @returns Formatted agent address\n */\nexport function toAgent(agentId: string): string {\n return formatAddress(\"agent\", agentId);\n}\n\n/**\n * Convenience function to create a scope address.\n *\n * @param scopeId - The scope ID\n * @returns Formatted scope address\n */\nexport function toScope(scopeId: string): string {\n return formatAddress(\"scope\", scopeId);\n}\n","/**\n * Message handler factories\n *\n * Creates JSON-RPC handlers for message-related methods.\n */\n\nimport type {\n MessageRouter,\n ScopeManager,\n AgentRegistry,\n TurnManager,\n HandlerContext,\n HandlerRegistry,\n} from \"../types\";\nimport type { TurnVisibility } from \"../../types\";\nimport {\n isAddress,\n isAgentAddress,\n isScopeAddress,\n extractId,\n} from \"./address\";\n\n/**\n * Options for creating message handlers.\n */\nexport interface MessageHandlerOptions {\n messages: MessageRouter;\n scopes: ScopeManager;\n /**\n * AgentRegistry for validating addresses.\n * When provided, ambiguous addresses (valid as both agent and scope) will throw an error.\n */\n agents?: AgentRegistry;\n /**\n * TurnManager for mail meta interception.\n * When provided and meta.mail is present on a send, records an intercepted turn.\n */\n turns?: TurnManager;\n}\n\n/**\n * Parameters for sending a message.\n */\ninterface SendParams {\n to: string | string[];\n payload: unknown;\n replyTo?: string;\n priority?: number;\n ttlMs?: number;\n /** Optional message type for routing/filtering */\n messageType?: string;\n /** Optional metadata including mail turn tracking */\n meta?: {\n mail?: {\n conversationId: string;\n threadId?: string;\n inReplyTo?: string;\n visibility?: TurnVisibility;\n };\n };\n}\n\n/**\n * Parameters for sending to a scope.\n */\ninterface SendToScopeParams {\n scopeId: string;\n payload: unknown;\n excludeSender?: boolean;\n includeDescendants?: boolean;\n /** Optional message type for routing/filtering */\n messageType?: string;\n}\n\n/**\n * Create handlers for message-related methods.\n *\n * Methods:\n * - `map/send` - Send a message to agent(s) or scope\n * - `map/send/scope` - Send to all agents in a scope\n */\nexport function createMessageHandlers(options: MessageHandlerOptions): HandlerRegistry {\n const { messages, scopes, agents, turns } = options;\n\n return {\n \"map/send\": async (params: unknown, ctx: HandlerContext) => {\n const { to, payload, replyTo, priority, ttlMs, messageType, meta } =\n params as SendParams;\n\n // Determine sender - use first agent from session, or session ID\n const from = ctx.session.agentIds[0] ?? ctx.session.id;\n\n let result: { messageId: string; delivered?: string[] };\n\n // Handle array of recipients\n if (Array.isArray(to)) {\n const results = [];\n for (const recipient of to) {\n // Check if recipient has address prefix\n if (isScopeAddress(recipient)) {\n const scopeId = extractId(recipient);\n const message = messages.sendToScope({\n from,\n scopeId,\n payload,\n excludeSender: true,\n messageType,\n });\n results.push(message.id);\n } else {\n // Agent address (with or without prefix)\n const agentId = isAgentAddress(recipient) ? extractId(recipient) : recipient;\n const message = messages.sendToAgent({\n from,\n to: agentId,\n payload,\n replyTo,\n priority,\n ttlMs,\n messageType,\n });\n results.push(message.id);\n }\n }\n result = { messageId: results[0], delivered: results };\n } else if (isAddress(to)) {\n if (isScopeAddress(to)) {\n // Prefixed scope address: \"scope:room-1\"\n const scopeId = extractId(to);\n const message = messages.sendToScope({\n from,\n scopeId,\n payload,\n excludeSender: true,\n messageType,\n });\n result = { messageId: message.id };\n } else {\n // Prefixed agent address: \"agent:abc123\"\n const agentId = extractId(to);\n const message = messages.sendToAgent({\n from,\n to: agentId,\n payload,\n replyTo,\n priority,\n ttlMs,\n messageType,\n });\n result = { messageId: message.id };\n }\n } else {\n // Backward compatibility: unprefixed address\n // Check for ambiguous addresses (valid as both scope and agent)\n const scope = scopes.get(to);\n const agent = agents?.get(to);\n\n if (scope && agent) {\n // Ambiguous address - throw error requiring explicit prefix\n throw new Error(\n `Ambiguous address \"${to}\" matches both an agent and a scope. ` +\n `Use \"agent:${to}\" or \"scope:${to}\" to disambiguate.`\n );\n }\n\n if (scope) {\n // Send to scope\n const message = messages.sendToScope({\n from,\n scopeId: to,\n payload,\n excludeSender: true,\n messageType,\n });\n result = { messageId: message.id };\n } else {\n // Send to single agent (unprefixed)\n const message = messages.sendToAgent({\n from,\n to,\n payload,\n replyTo,\n priority,\n ttlMs,\n messageType,\n });\n result = { messageId: message.id };\n }\n }\n\n // Mail meta interception: record turn if mail metadata present\n if (turns && meta?.mail?.conversationId) {\n try {\n turns.recordInterceptedTurn({\n conversationId: meta.mail.conversationId,\n participant: from,\n contentType: \"data\",\n content: payload,\n messageId: result.messageId,\n threadId: meta.mail.threadId,\n inReplyTo: meta.mail.inReplyTo,\n visibility: meta.mail.visibility,\n });\n } catch {\n // Non-blocking: turn recording failure does not affect message delivery\n }\n }\n\n return result;\n },\n\n \"map/send/scope\": async (params: unknown, ctx: HandlerContext) => {\n const { scopeId, payload, excludeSender, includeDescendants, messageType } =\n params as SendToScopeParams;\n\n const from = ctx.session.agentIds[0] ?? ctx.session.id;\n\n const message = messages.sendToScope({\n from,\n scopeId,\n payload,\n excludeSender: excludeSender ?? true,\n includeDescendants,\n messageType,\n });\n\n // Return protocol-compliant response\n return { messageId: message.id };\n },\n };\n}\n","/**\n * In-memory ConversationStore implementation\n */\n\nimport type {\n ServerConversation,\n ConversationFilter,\n ConversationStore,\n ParticipantStore,\n} from \"../../types\";\n\n/**\n * Options for InMemoryConversationStore\n */\nexport interface InMemoryConversationStoreOptions {\n /**\n * ParticipantStore for participant-based filtering.\n * Required only if you use ConversationFilter.participantId.\n */\n participantStore?: ParticipantStore;\n}\n\n/**\n * In-memory implementation of ConversationStore.\n */\nexport class InMemoryConversationStore implements ConversationStore {\n private readonly conversations: Map<string, ServerConversation> = new Map();\n private readonly participantStore?: ParticipantStore;\n\n constructor(options: InMemoryConversationStoreOptions = {}) {\n this.participantStore = options.participantStore;\n }\n\n /**\n * Save a conversation (create or update).\n */\n save(conversation: ServerConversation): void {\n this.conversations.set(conversation.id, { ...conversation });\n }\n\n /**\n * Get conversation by ID.\n */\n get(id: string): ServerConversation | undefined {\n const conversation = this.conversations.get(id);\n return conversation ? { ...conversation } : undefined;\n }\n\n /**\n * List conversations matching filter criteria.\n */\n list(filter?: ConversationFilter): ServerConversation[] {\n const results: ServerConversation[] = [];\n\n // If filtering by participant, get their conversation IDs first\n let participantConversationIds: Set<string> | undefined;\n if (filter?.participantId && this.participantStore) {\n const ids = this.participantStore.getConversationsForParticipant(\n filter.participantId,\n true\n );\n participantConversationIds = new Set(ids);\n }\n\n for (const conversation of this.conversations.values()) {\n // Filter by type\n if (filter?.type && filter.type.length > 0) {\n if (!filter.type.includes(conversation.type)) continue;\n }\n\n // Filter by status\n if (filter?.status && filter.status.length > 0) {\n if (!filter.status.includes(conversation.status)) continue;\n }\n\n // Filter by participant\n if (participantConversationIds !== undefined) {\n if (!participantConversationIds.has(conversation.id)) continue;\n } else if (filter?.participantId) {\n // No participant store available - skip participant filtering\n continue;\n }\n\n // Filter by created after\n if (filter?.createdAfter !== undefined) {\n if (conversation.createdAt <= filter.createdAfter) continue;\n }\n\n // Filter by created before\n if (filter?.createdBefore !== undefined) {\n if (conversation.createdAt >= filter.createdBefore) continue;\n }\n\n // Filter by parent conversation\n if (filter?.parentConversationId !== undefined) {\n if (conversation.parentConversationId !== filter.parentConversationId) continue;\n }\n\n results.push({ ...conversation });\n }\n\n return results;\n }\n\n /**\n * Delete a conversation by ID.\n */\n delete(id: string): boolean {\n return this.conversations.delete(id);\n }\n\n /**\n * Clear all conversations.\n */\n clear(): void {\n this.conversations.clear();\n }\n\n /**\n * Get the number of stored conversations.\n */\n get size(): number {\n return this.conversations.size;\n }\n}\n","/**\n * In-memory TurnStore implementation\n *\n * Supports cursor-based pagination and timestamp range queries.\n */\n\nimport type {\n ServerTurn,\n TurnFilter,\n TurnStore,\n} from \"../../types\";\n\n/**\n * In-memory implementation of TurnStore.\n *\n * Features:\n * - O(1) lookup by ID\n * - Ordered storage per conversation for efficient range queries\n * - Cursor-based pagination via afterTurnId/beforeTurnId\n * - Timestamp range filtering\n */\nexport class InMemoryTurnStore implements TurnStore {\n /** Index by turn ID for O(1) lookup */\n private readonly turns: Map<string, ServerTurn> = new Map();\n /** Ordered turn IDs per conversation (insertion order = chronological) */\n private readonly byConversation: Map<string, string[]> = new Map();\n\n /**\n * Append a turn.\n */\n append(turn: ServerTurn): void {\n // Don't allow duplicate IDs\n if (this.turns.has(turn.id)) {\n return;\n }\n\n this.turns.set(turn.id, { ...turn, metadata: { ...turn.metadata } });\n\n const order = this.byConversation.get(turn.conversationId) ?? [];\n order.push(turn.id);\n this.byConversation.set(turn.conversationId, order);\n }\n\n /**\n * Get a specific turn by ID.\n */\n get(id: string): ServerTurn | undefined {\n const turn = this.turns.get(id);\n return turn ? { ...turn, metadata: { ...turn.metadata } } : undefined;\n }\n\n /**\n * List turns matching filter criteria with pagination.\n */\n list(filter: TurnFilter): ServerTurn[] {\n const order = this.byConversation.get(filter.conversationId);\n if (!order || order.length === 0) {\n return [];\n }\n\n // Determine slice bounds from cursor\n let startIdx = 0;\n let endIdx = order.length;\n\n if (filter.afterTurnId) {\n const idx = order.indexOf(filter.afterTurnId);\n if (idx !== -1) {\n startIdx = idx + 1;\n }\n }\n\n if (filter.beforeTurnId) {\n const idx = order.indexOf(filter.beforeTurnId);\n if (idx !== -1) {\n endIdx = idx;\n }\n }\n\n // Collect matching turns\n const results: ServerTurn[] = [];\n const limit = filter.limit ?? Number.MAX_SAFE_INTEGER;\n const desc = filter.order === \"desc\";\n\n // Iterate in the requested direction\n if (desc) {\n for (let i = endIdx - 1; i >= startIdx && results.length < limit; i--) {\n const turn = this.turns.get(order[i]);\n if (turn && this.matchesTurnFilter(turn, filter)) {\n results.push({ ...turn, metadata: { ...turn.metadata } });\n }\n }\n } else {\n for (let i = startIdx; i < endIdx && results.length < limit; i++) {\n const turn = this.turns.get(order[i]);\n if (turn && this.matchesTurnFilter(turn, filter)) {\n results.push({ ...turn, metadata: { ...turn.metadata } });\n }\n }\n }\n\n return results;\n }\n\n /**\n * Delete a specific turn.\n */\n delete(id: string): boolean {\n const turn = this.turns.get(id);\n if (!turn) return false;\n\n this.turns.delete(id);\n\n const order = this.byConversation.get(turn.conversationId);\n if (order) {\n const idx = order.indexOf(id);\n if (idx !== -1) {\n order.splice(idx, 1);\n }\n if (order.length === 0) {\n this.byConversation.delete(turn.conversationId);\n }\n }\n\n return true;\n }\n\n /**\n * Delete all turns for a conversation.\n */\n deleteByConversation(conversationId: string): number {\n const order = this.byConversation.get(conversationId);\n if (!order) return 0;\n\n const count = order.length;\n for (const id of order) {\n this.turns.delete(id);\n }\n this.byConversation.delete(conversationId);\n\n return count;\n }\n\n /**\n * Count turns in a conversation.\n */\n count(conversationId: string, threadId?: string): number {\n const order = this.byConversation.get(conversationId);\n if (!order) return 0;\n\n if (!threadId) return order.length;\n\n let count = 0;\n for (const id of order) {\n const turn = this.turns.get(id);\n if (turn && turn.threadId === threadId) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * Clear all turns.\n */\n clear(): void {\n this.turns.clear();\n this.byConversation.clear();\n }\n\n /**\n * Get the total number of stored turns.\n */\n get size(): number {\n return this.turns.size;\n }\n\n /**\n * Check if a turn matches the non-cursor/non-conversation filter criteria.\n */\n private matchesTurnFilter(turn: ServerTurn, filter: TurnFilter): boolean {\n // Filter by thread\n if (filter.threadId !== undefined && turn.threadId !== filter.threadId) {\n return false;\n }\n\n // Filter by content types\n if (filter.contentTypes && filter.contentTypes.length > 0) {\n if (!filter.contentTypes.includes(turn.contentType)) {\n return false;\n }\n }\n\n // Filter by participant\n if (filter.participantId !== undefined && turn.participant !== filter.participantId) {\n return false;\n }\n\n // Filter by timestamp range\n if (filter.afterTimestamp !== undefined && turn.timestamp <= filter.afterTimestamp) {\n return false;\n }\n if (filter.beforeTimestamp !== undefined && turn.timestamp >= filter.beforeTimestamp) {\n return false;\n }\n\n return true;\n }\n}\n","/**\n * In-memory ThreadStore implementation\n */\n\nimport type {\n ServerThread,\n ThreadFilter,\n ThreadStore,\n} from \"../../types\";\n\n/**\n * In-memory implementation of ThreadStore.\n */\nexport class InMemoryThreadStore implements ThreadStore {\n private readonly threads: Map<string, ServerThread> = new Map();\n /** Index: conversationId → thread IDs */\n private readonly byConversation: Map<string, Set<string>> = new Map();\n\n /**\n * Save a thread (create or update).\n */\n save(thread: ServerThread): void {\n this.threads.set(thread.id, { ...thread });\n\n // Maintain conversation index\n let ids = this.byConversation.get(thread.conversationId);\n if (!ids) {\n ids = new Set();\n this.byConversation.set(thread.conversationId, ids);\n }\n ids.add(thread.id);\n }\n\n /**\n * Get thread by ID.\n */\n get(id: string): ServerThread | undefined {\n const thread = this.threads.get(id);\n return thread ? { ...thread } : undefined;\n }\n\n /**\n * List threads matching filter criteria.\n */\n list(filter: ThreadFilter): ServerThread[] {\n // Use conversation index for fast lookup\n const ids = this.byConversation.get(filter.conversationId);\n if (!ids) return [];\n\n const results: ServerThread[] = [];\n\n for (const id of ids) {\n const thread = this.threads.get(id);\n if (!thread) continue;\n\n // Filter by parent thread\n if (filter.parentThreadId !== undefined && thread.parentThreadId !== filter.parentThreadId) {\n continue;\n }\n\n results.push({ ...thread });\n }\n\n return results;\n }\n\n /**\n * Delete a thread by ID.\n */\n delete(id: string): boolean {\n const thread = this.threads.get(id);\n if (!thread) return false;\n\n this.threads.delete(id);\n this.byConversation.get(thread.conversationId)?.delete(id);\n\n return true;\n }\n\n /**\n * Delete all threads for a conversation.\n */\n deleteByConversation(conversationId: string): number {\n const ids = this.byConversation.get(conversationId);\n if (!ids) return 0;\n\n const count = ids.size;\n for (const id of ids) {\n this.threads.delete(id);\n }\n this.byConversation.delete(conversationId);\n\n return count;\n }\n\n /**\n * Clear all threads.\n */\n clear(): void {\n this.threads.clear();\n this.byConversation.clear();\n }\n\n /**\n * Get the number of stored threads.\n */\n get size(): number {\n return this.threads.size;\n }\n}\n","/**\n * In-memory ParticipantStore implementation\n *\n * Maintains bidirectional indexes for efficient lookup:\n * - conversation → participants\n * - participant → conversations\n */\n\nimport type {\n ServerParticipant,\n ParticipantFilter,\n ParticipantStore,\n} from \"../../types\";\n\n/**\n * In-memory implementation of ParticipantStore.\n */\nexport class InMemoryParticipantStore implements ParticipantStore {\n /** Primary storage: \"conversationId:participantId\" → participant */\n private readonly participants: Map<string, ServerParticipant> = new Map();\n /** Index: conversationId → participant IDs */\n private readonly byConversation: Map<string, Set<string>> = new Map();\n /** Index: participantId → conversation IDs */\n private readonly byParticipant: Map<string, Set<string>> = new Map();\n\n private key(conversationId: string, participantId: string): string {\n return `${conversationId}:${participantId}`;\n }\n\n /**\n * Save a participant (create or update).\n */\n save(participant: ServerParticipant): void {\n const k = this.key(participant.conversationId, participant.id);\n this.participants.set(k, {\n ...participant,\n permissions: { ...participant.permissions },\n agentInfo: participant.agentInfo ? { ...participant.agentInfo } : undefined,\n });\n\n // Maintain conversation index\n let convSet = this.byConversation.get(participant.conversationId);\n if (!convSet) {\n convSet = new Set();\n this.byConversation.set(participant.conversationId, convSet);\n }\n convSet.add(participant.id);\n\n // Maintain participant index\n let partSet = this.byParticipant.get(participant.id);\n if (!partSet) {\n partSet = new Set();\n this.byParticipant.set(participant.id, partSet);\n }\n partSet.add(participant.conversationId);\n }\n\n /**\n * Get a specific participant in a conversation.\n */\n get(conversationId: string, participantId: string): ServerParticipant | undefined {\n const participant = this.participants.get(this.key(conversationId, participantId));\n return participant ? this.copy(participant) : undefined;\n }\n\n /**\n * List participants matching filter criteria.\n */\n list(filter: ParticipantFilter): ServerParticipant[] {\n let candidates: Iterable<ServerParticipant>;\n\n if (filter.conversationId && filter.participantId) {\n // Exact lookup\n const p = this.participants.get(this.key(filter.conversationId, filter.participantId));\n candidates = p ? [p] : [];\n } else if (filter.conversationId) {\n // All participants in a conversation\n const ids = this.byConversation.get(filter.conversationId);\n candidates = ids\n ? this.iterateByConversation(filter.conversationId, ids)\n : [];\n } else if (filter.participantId) {\n // All conversations for a participant\n const convIds = this.byParticipant.get(filter.participantId);\n candidates = convIds\n ? this.iterateByParticipant(filter.participantId, convIds)\n : [];\n } else {\n candidates = this.participants.values();\n }\n\n const results: ServerParticipant[] = [];\n\n for (const participant of candidates) {\n // Filter by role\n if (filter.role !== undefined && participant.role !== filter.role) continue;\n\n // Filter by active (not left)\n if (filter.active === true && participant.leftAt !== undefined) continue;\n if (filter.active === false && participant.leftAt === undefined) continue;\n\n results.push(this.copy(participant));\n }\n\n return results;\n }\n\n /**\n * Remove a participant from a conversation.\n */\n delete(conversationId: string, participantId: string): boolean {\n const k = this.key(conversationId, participantId);\n if (!this.participants.has(k)) return false;\n\n this.participants.delete(k);\n this.byConversation.get(conversationId)?.delete(participantId);\n this.byParticipant.get(participantId)?.delete(conversationId);\n\n return true;\n }\n\n /**\n * Delete all participants for a conversation.\n */\n deleteByConversation(conversationId: string): number {\n const ids = this.byConversation.get(conversationId);\n if (!ids) return 0;\n\n const count = ids.size;\n for (const participantId of ids) {\n this.participants.delete(this.key(conversationId, participantId));\n this.byParticipant.get(participantId)?.delete(conversationId);\n }\n this.byConversation.delete(conversationId);\n\n return count;\n }\n\n /**\n * Get all conversation IDs a participant belongs to.\n */\n getConversationsForParticipant(participantId: string, active?: boolean): string[] {\n const convIds = this.byParticipant.get(participantId);\n if (!convIds) return [];\n\n if (active === undefined) return Array.from(convIds);\n\n const results: string[] = [];\n for (const convId of convIds) {\n const p = this.participants.get(this.key(convId, participantId));\n if (!p) continue;\n\n if (active && p.leftAt === undefined) results.push(convId);\n else if (!active && p.leftAt !== undefined) results.push(convId);\n }\n return results;\n }\n\n /**\n * Clear all participants.\n */\n clear(): void {\n this.participants.clear();\n this.byConversation.clear();\n this.byParticipant.clear();\n }\n\n /**\n * Get the number of stored participant records.\n */\n get size(): number {\n return this.participants.size;\n }\n\n private copy(participant: ServerParticipant): ServerParticipant {\n return {\n ...participant,\n permissions: { ...participant.permissions },\n agentInfo: participant.agentInfo ? { ...participant.agentInfo } : undefined,\n };\n }\n\n private *iterateByConversation(\n conversationId: string,\n ids: Set<string>\n ): Iterable<ServerParticipant> {\n for (const id of ids) {\n const p = this.participants.get(this.key(conversationId, id));\n if (p) yield p;\n }\n }\n\n private *iterateByParticipant(\n participantId: string,\n convIds: Set<string>\n ): Iterable<ServerParticipant> {\n for (const convId of convIds) {\n const p = this.participants.get(this.key(convId, participantId));\n if (p) yield p;\n }\n }\n}\n","/**\n * ConversationManager implementation\n *\n * Manages conversation lifecycle and participants with event emission.\n */\n\nimport type {\n ServerConversation,\n ServerParticipant,\n ConversationFilter,\n ConversationManager,\n ConversationManagerOptions,\n ConversationGetResult,\n ConversationStore,\n ParticipantStore,\n DefaultParticipantPermissions,\n EventBus,\n} from \"../types\";\nimport type { ConversationType, ParticipantRole } from \"../../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryConversationStore } from \"./stores/in-memory-conversation\";\nimport { InMemoryParticipantStore } from \"./stores/in-memory-participant\";\n\n/**\n * Error thrown when a conversation is not found.\n */\nexport class ConversationNotFoundError extends Error {\n constructor(conversationId: string) {\n super(`Conversation not found: ${conversationId}`);\n this.name = \"ConversationNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a conversation is not in a valid state for the operation.\n */\nexport class ConversationClosedError extends Error {\n constructor(conversationId: string) {\n super(`Conversation is closed: ${conversationId}`);\n this.name = \"ConversationClosedError\";\n }\n}\n\n/**\n * Error thrown when a participant is already in the conversation.\n */\nexport class ParticipantAlreadyJoinedError extends Error {\n constructor(conversationId: string, participantId: string) {\n super(`Participant ${participantId} already in conversation ${conversationId}`);\n this.name = \"ParticipantAlreadyJoinedError\";\n }\n}\n\n/**\n * Error thrown when a participant is not found in the conversation.\n */\nexport class ParticipantNotFoundError extends Error {\n constructor(conversationId: string, participantId: string) {\n super(`Participant ${participantId} not found in conversation ${conversationId}`);\n this.name = \"ParticipantNotFoundError\";\n }\n}\n\nconst DEFAULT_PERMISSIONS: Required<DefaultParticipantPermissions> = {\n canSend: true,\n canObserve: true,\n canInvite: false,\n canRemove: false,\n canCreateThreads: true,\n historyAccess: \"full\",\n canSeeInternal: false,\n};\n\n/**\n * ConversationManager implementation.\n *\n * Manages conversation lifecycle:\n * - Creation with auto-join\n * - Participant join/leave/invite\n * - Closing with status update\n * - Listing with filtering\n */\nexport class ConversationManagerImpl implements ConversationManager {\n private readonly eventBus: EventBus;\n private readonly store: ConversationStore;\n private readonly participantStore: ParticipantStore;\n\n constructor(options: ConversationManagerOptions) {\n this.eventBus = options.eventBus;\n this.participantStore = options.participantStore ?? new InMemoryParticipantStore();\n this.store =\n options.store ??\n new InMemoryConversationStore({ participantStore: this.participantStore });\n }\n\n /**\n * Create a new conversation. Creator auto-joins as initiator.\n */\n create(params: {\n type?: ConversationType;\n subject?: string;\n createdBy: string;\n parentConversationId?: string;\n parentTurnId?: string;\n metadata?: Record<string, unknown>;\n initialParticipants?: Array<{\n id: string;\n type?: \"user\" | \"agent\" | \"system\";\n role?: ParticipantRole;\n permissions?: DefaultParticipantPermissions;\n agentInfo?: { agentId: string; name?: string; role?: string };\n }>;\n }): { conversation: ServerConversation; participant: ServerParticipant } {\n // Validate parent exists if specified\n if (params.parentConversationId) {\n const parent = this.store.get(params.parentConversationId);\n if (!parent) {\n throw new ConversationNotFoundError(params.parentConversationId);\n }\n }\n\n const now = Date.now();\n const conversation: ServerConversation = {\n id: `conv-${ulid()}`,\n type: params.type ?? \"multi-agent\",\n status: \"active\",\n subject: params.subject,\n participantCount: 0,\n parentConversationId: params.parentConversationId,\n parentTurnId: params.parentTurnId,\n createdAt: now,\n updatedAt: now,\n createdBy: params.createdBy,\n metadata: params.metadata ?? {},\n };\n\n this.store.save(conversation);\n\n // Auto-join creator as initiator\n const creator = this.addParticipant(conversation.id, {\n id: params.createdBy,\n type: \"user\",\n role: \"initiator\",\n permissions: DEFAULT_PERMISSIONS,\n });\n\n // Add initial participants\n if (params.initialParticipants) {\n for (const p of params.initialParticipants) {\n this.addParticipant(conversation.id, {\n id: p.id,\n type: p.type ?? \"agent\",\n role: p.role ?? \"assistant\",\n permissions: { ...DEFAULT_PERMISSIONS, ...p.permissions },\n agentInfo: p.agentInfo,\n });\n }\n }\n\n // Re-read to get updated participantCount\n const saved = this.store.get(conversation.id)!;\n\n this.eventBus.emit({\n type: \"mail.created\",\n data: {\n conversationId: saved.id,\n type: saved.type,\n subject: saved.subject,\n createdBy: params.createdBy,\n },\n });\n\n return { conversation: saved, participant: creator };\n }\n\n /**\n * Get conversation by ID with optional includes.\n */\n get(\n id: string,\n include?: {\n participants?: boolean;\n threads?: boolean;\n recentTurns?: number;\n stats?: boolean;\n }\n ): ConversationGetResult | undefined {\n const conversation = this.store.get(id);\n if (!conversation) return undefined;\n\n const result: ConversationGetResult = { conversation };\n\n if (include?.participants) {\n result.participants = this.participantStore.list({\n conversationId: id,\n });\n }\n\n // threads and recentTurns/stats require TurnStore/ThreadStore\n // which are not owned by this manager — handled at handler level\n\n return result;\n }\n\n /**\n * List conversations with filtering.\n */\n list(filter?: ConversationFilter): ServerConversation[] {\n return this.store.list(filter);\n }\n\n /**\n * Close a conversation.\n */\n close(id: string, closedBy: string, reason?: string): ServerConversation {\n const conversation = this.store.get(id);\n if (!conversation) {\n throw new ConversationNotFoundError(id);\n }\n\n if (conversation.status === \"completed\" || conversation.status === \"archived\") {\n throw new ConversationClosedError(id);\n }\n\n const now = Date.now();\n const updated: ServerConversation = {\n ...conversation,\n status: \"completed\",\n closedAt: now,\n updatedAt: now,\n };\n\n this.store.save(updated);\n\n this.eventBus.emit({\n type: \"mail.closed\",\n data: {\n conversationId: id,\n closedBy,\n reason,\n },\n });\n\n return updated;\n }\n\n /**\n * Join a conversation.\n */\n join(params: {\n conversationId: string;\n participantId: string;\n type?: \"user\" | \"agent\" | \"system\";\n role?: ParticipantRole;\n permissions?: DefaultParticipantPermissions;\n agentInfo?: { agentId: string; name?: string; role?: string };\n }): { conversation: ServerConversation; participant: ServerParticipant } {\n const conversation = this.store.get(params.conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(params.conversationId);\n }\n\n if (conversation.status !== \"active\") {\n throw new ConversationClosedError(params.conversationId);\n }\n\n // Check if already joined\n const existing = this.participantStore.get(params.conversationId, params.participantId);\n if (existing && !existing.leftAt) {\n throw new ParticipantAlreadyJoinedError(params.conversationId, params.participantId);\n }\n\n const participant = this.addParticipant(params.conversationId, {\n id: params.participantId,\n type: params.type ?? \"user\",\n role: params.role ?? \"assistant\",\n permissions: { ...DEFAULT_PERMISSIONS, ...params.permissions },\n agentInfo: params.agentInfo,\n });\n\n const updated = this.store.get(params.conversationId)!;\n\n return { conversation: updated, participant };\n }\n\n /**\n * Leave a conversation.\n */\n leave(conversationId: string, participantId: string, reason?: string): void {\n const conversation = this.store.get(conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(conversationId);\n }\n\n const participant = this.participantStore.get(conversationId, participantId);\n if (!participant || participant.leftAt) {\n throw new ParticipantNotFoundError(conversationId, participantId);\n }\n\n const now = Date.now();\n const updated: ServerParticipant = {\n ...participant,\n leftAt: now,\n };\n\n this.participantStore.save(updated);\n\n // Decrement participant count\n const conv = this.store.get(conversationId)!;\n this.store.save({\n ...conv,\n participantCount: Math.max(0, conv.participantCount - 1),\n updatedAt: now,\n });\n\n this.eventBus.emit({\n type: \"mail.participant.left\",\n data: {\n conversationId,\n participantId,\n reason,\n },\n });\n }\n\n /**\n * Invite a participant to a conversation.\n * Same as join but semantically different (another participant initiated it).\n */\n invite(params: {\n conversationId: string;\n participant: {\n id: string;\n type?: \"user\" | \"agent\" | \"system\";\n role?: ParticipantRole;\n permissions?: DefaultParticipantPermissions;\n agentInfo?: { agentId: string; name?: string; role?: string };\n };\n }): ServerParticipant {\n const conversation = this.store.get(params.conversationId);\n if (!conversation) {\n throw new ConversationNotFoundError(params.conversationId);\n }\n\n if (conversation.status !== \"active\") {\n throw new ConversationClosedError(params.conversationId);\n }\n\n const existing = this.participantStore.get(params.conversationId, params.participant.id);\n if (existing && !existing.leftAt) {\n throw new ParticipantAlreadyJoinedError(params.conversationId, params.participant.id);\n }\n\n return this.addParticipant(params.conversationId, {\n id: params.participant.id,\n type: params.participant.type ?? \"agent\",\n role: params.participant.role ?? \"assistant\",\n permissions: { ...DEFAULT_PERMISSIONS, ...params.participant.permissions },\n agentInfo: params.participant.agentInfo,\n });\n }\n\n /**\n * Get a participant in a conversation.\n */\n getParticipant(conversationId: string, participantId: string): ServerParticipant | undefined {\n return this.participantStore.get(conversationId, participantId);\n }\n\n /**\n * List participants in a conversation.\n */\n listParticipants(conversationId: string, active?: boolean): ServerParticipant[] {\n return this.participantStore.list({ conversationId, active });\n }\n\n /**\n * Internal: add a participant and update conversation count.\n */\n private addParticipant(\n conversationId: string,\n params: {\n id: string;\n type: \"user\" | \"agent\" | \"system\";\n role: ParticipantRole;\n permissions: Required<DefaultParticipantPermissions>;\n agentInfo?: { agentId: string; name?: string; role?: string };\n }\n ): ServerParticipant {\n const now = Date.now();\n const participant: ServerParticipant = {\n id: params.id,\n conversationId,\n type: params.type,\n role: params.role,\n joinedAt: now,\n permissions: {\n canSend: params.permissions.canSend,\n canObserve: params.permissions.canObserve,\n canInvite: params.permissions.canInvite,\n canRemove: params.permissions.canRemove,\n canCreateThreads: params.permissions.canCreateThreads,\n historyAccess: params.permissions.historyAccess,\n canSeeInternal: params.permissions.canSeeInternal,\n },\n agentInfo: params.agentInfo,\n };\n\n this.participantStore.save(participant);\n\n // Increment participant count\n const conv = this.store.get(conversationId)!;\n this.store.save({\n ...conv,\n participantCount: conv.participantCount + 1,\n updatedAt: now,\n });\n\n this.eventBus.emit({\n type: \"mail.participant.joined\",\n data: {\n conversationId,\n participant,\n },\n });\n\n return participant;\n }\n}\n","/**\n * TurnManager implementation\n *\n * Manages turn recording, querying, and content type validation.\n */\n\nimport type {\n ServerTurn,\n TurnFilter,\n TurnManager,\n TurnManagerOptions,\n TurnStore,\n ConversationManager,\n EventBus,\n} from \"../types\";\nimport type { TurnStatus, TurnVisibility } from \"../../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryTurnStore } from \"./stores/in-memory-turn\";\n\n/** Well-known content types */\nconst WELL_KNOWN_CONTENT_TYPES = new Set([\"text\", \"data\", \"event\", \"reference\"]);\n\n/**\n * Error thrown when a conversation is not found.\n */\nexport class TurnConversationNotFoundError extends Error {\n constructor(conversationId: string) {\n super(`Conversation not found: ${conversationId}`);\n this.name = \"TurnConversationNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a turn is not found.\n */\nexport class TurnNotFoundError extends Error {\n constructor(turnId: string) {\n super(`Turn not found: ${turnId}`);\n this.name = \"TurnNotFoundError\";\n }\n}\n\n/**\n * Error thrown for invalid content types.\n */\nexport class InvalidContentTypeError extends Error {\n constructor(contentType: string) {\n super(\n `Invalid content type \"${contentType}\": must be a well-known type (text, data, event, reference) or start with \"x-\"`\n );\n this.name = \"InvalidContentTypeError\";\n }\n}\n\n/**\n * Validate a content type.\n * Well-known types: text, data, event, reference\n * Custom types must start with \"x-\"\n */\nexport function validateContentType(contentType: string): void {\n if (WELL_KNOWN_CONTENT_TYPES.has(contentType)) return;\n if (contentType.startsWith(\"x-\") && contentType.length > 2) return;\n throw new InvalidContentTypeError(contentType);\n}\n\n/**\n * TurnManager implementation.\n *\n * Records turns from two sources:\n * - Explicit: direct mail/turn calls\n * - Intercepted: map/send with mail metadata\n *\n * Validates content types and emits events.\n */\nexport class TurnManagerImpl implements TurnManager {\n private readonly eventBus: EventBus;\n private readonly store: TurnStore;\n private readonly conversations: ConversationManager;\n\n constructor(options: TurnManagerOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemoryTurnStore();\n this.conversations = options.conversations;\n }\n\n /**\n * Record a turn (explicit via mail/turn).\n */\n recordTurn(params: {\n conversationId: string;\n participant: string;\n contentType: string;\n content: unknown;\n threadId?: string;\n inReplyTo?: string;\n visibility?: TurnVisibility;\n status?: TurnStatus;\n metadata?: Record<string, unknown>;\n }): ServerTurn {\n this.validateConversation(params.conversationId);\n validateContentType(params.contentType);\n\n const turn: ServerTurn = {\n id: `turn-${ulid()}`,\n conversationId: params.conversationId,\n participant: params.participant,\n timestamp: Date.now(),\n contentType: params.contentType,\n content: params.content,\n threadId: params.threadId,\n inReplyTo: params.inReplyTo,\n source: { type: \"explicit\", method: \"mail/turn\" },\n visibility: params.visibility,\n status: params.status ?? \"complete\",\n metadata: params.metadata ?? {},\n };\n\n this.store.append(turn);\n\n this.eventBus.emit({\n type: \"mail.turn.added\",\n data: {\n conversationId: params.conversationId,\n turn,\n },\n });\n\n return turn;\n }\n\n /**\n * Record an intercepted turn (from map/send with mail meta).\n */\n recordInterceptedTurn(params: {\n conversationId: string;\n participant: string;\n contentType: string;\n content: unknown;\n messageId: string;\n threadId?: string;\n inReplyTo?: string;\n visibility?: TurnVisibility;\n metadata?: Record<string, unknown>;\n }): ServerTurn {\n this.validateConversation(params.conversationId);\n validateContentType(params.contentType);\n\n const turn: ServerTurn = {\n id: `turn-${ulid()}`,\n conversationId: params.conversationId,\n participant: params.participant,\n timestamp: Date.now(),\n contentType: params.contentType,\n content: params.content,\n threadId: params.threadId,\n inReplyTo: params.inReplyTo,\n source: { type: \"intercepted\", messageId: params.messageId },\n visibility: params.visibility,\n status: \"complete\",\n metadata: params.metadata ?? {},\n };\n\n this.store.append(turn);\n\n this.eventBus.emit({\n type: \"mail.turn.added\",\n data: {\n conversationId: params.conversationId,\n turn,\n },\n });\n\n return turn;\n }\n\n /**\n * Get a turn by ID.\n */\n get(id: string): ServerTurn | undefined {\n return this.store.get(id);\n }\n\n /**\n * List turns with filtering and pagination.\n */\n list(filter: TurnFilter): ServerTurn[] {\n return this.store.list(filter);\n }\n\n /**\n * Update turn status (e.g., streaming → complete).\n */\n updateStatus(id: string, status: TurnStatus): ServerTurn {\n const turn = this.store.get(id);\n if (!turn) {\n throw new TurnNotFoundError(id);\n }\n\n const updated: ServerTurn = {\n ...turn,\n status,\n };\n\n // Delete and re-append to update in store\n this.store.delete(id);\n this.store.append(updated);\n\n this.eventBus.emit({\n type: \"mail.turn.updated\",\n data: {\n conversationId: turn.conversationId,\n turnId: id,\n status,\n },\n });\n\n return updated;\n }\n\n /**\n * Count turns in a conversation.\n */\n count(conversationId: string, threadId?: string): number {\n return this.store.count(conversationId, threadId);\n }\n\n /**\n * Validate that a conversation exists and is active.\n */\n private validateConversation(conversationId: string): void {\n const result = this.conversations.get(conversationId);\n if (!result) {\n throw new TurnConversationNotFoundError(conversationId);\n }\n }\n}\n","/**\n * ThreadManager implementation\n *\n * Manages conversation threads with event emission.\n */\n\nimport type {\n ServerThread,\n ThreadManager,\n ThreadManagerOptions,\n ThreadStore,\n TurnStore,\n EventBus,\n} from \"../types\";\nimport { ulid } from \"../../utils/ulid\";\nimport { InMemoryThreadStore } from \"./stores/in-memory-thread\";\n\n/**\n * Error thrown when a thread is not found.\n */\nexport class ThreadNotFoundError extends Error {\n constructor(threadId: string) {\n super(`Thread not found: ${threadId}`);\n this.name = \"ThreadNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a root turn is not found.\n */\nexport class RootTurnNotFoundError extends Error {\n constructor(turnId: string) {\n super(`Root turn not found: ${turnId}`);\n this.name = \"RootTurnNotFoundError\";\n }\n}\n\n/**\n * Error thrown when a root turn doesn't belong to the conversation.\n */\nexport class RootTurnConversationMismatchError extends Error {\n constructor(turnId: string, conversationId: string) {\n super(`Turn ${turnId} does not belong to conversation ${conversationId}`);\n this.name = \"RootTurnConversationMismatchError\";\n }\n}\n\n/**\n * Error thrown when a parent thread is not found.\n */\nexport class ParentThreadNotFoundError extends Error {\n constructor(threadId: string) {\n super(`Parent thread not found: ${threadId}`);\n this.name = \"ParentThreadNotFoundError\";\n }\n}\n\n/**\n * ThreadManager implementation.\n *\n * Manages conversation threads:\n * - Creation with rootTurn validation\n * - Nested threads via parentThreadId\n * - Turn count and participant count tracking\n */\nexport class ThreadManagerImpl implements ThreadManager {\n private readonly eventBus: EventBus;\n private readonly store: ThreadStore;\n private readonly turnStore: TurnStore;\n\n constructor(options: ThreadManagerOptions) {\n this.eventBus = options.eventBus;\n this.store = options.store ?? new InMemoryThreadStore();\n this.turnStore = options.turnStore;\n }\n\n /**\n * Create a thread rooted at a specific turn.\n */\n create(params: {\n conversationId: string;\n rootTurnId: string;\n subject?: string;\n parentThreadId?: string;\n createdBy: string;\n }): ServerThread {\n // Validate root turn exists\n const rootTurn = this.turnStore.get(params.rootTurnId);\n if (!rootTurn) {\n throw new RootTurnNotFoundError(params.rootTurnId);\n }\n\n // Validate root turn belongs to the conversation\n if (rootTurn.conversationId !== params.conversationId) {\n throw new RootTurnConversationMismatchError(params.rootTurnId, params.conversationId);\n }\n\n // Validate parent thread exists if specified\n if (params.parentThreadId) {\n const parent = this.store.get(params.parentThreadId);\n if (!parent) {\n throw new ParentThreadNotFoundError(params.parentThreadId);\n }\n }\n\n const now = Date.now();\n const thread: ServerThread = {\n id: `thread-${ulid()}`,\n conversationId: params.conversationId,\n parentThreadId: params.parentThreadId,\n subject: params.subject,\n rootTurnId: params.rootTurnId,\n turnCount: 0,\n participantCount: 0,\n createdAt: now,\n updatedAt: now,\n createdBy: params.createdBy,\n };\n\n this.store.save(thread);\n\n this.eventBus.emit({\n type: \"mail.thread.created\",\n data: {\n conversationId: params.conversationId,\n thread,\n },\n });\n\n return thread;\n }\n\n /**\n * Get a thread by ID.\n */\n get(id: string): ServerThread | undefined {\n return this.store.get(id);\n }\n\n /**\n * List threads in a conversation.\n */\n list(conversationId: string, parentThreadId?: string): ServerThread[] {\n return this.store.list({ conversationId, parentThreadId });\n }\n\n /**\n * Increment turn count for a thread.\n */\n incrementTurnCount(threadId: string): void {\n const thread = this.store.get(threadId);\n if (!thread) {\n throw new ThreadNotFoundError(threadId);\n }\n\n this.store.save({\n ...thread,\n turnCount: thread.turnCount + 1,\n updatedAt: Date.now(),\n });\n }\n\n /**\n * Increment participant count for a thread.\n */\n incrementParticipantCount(threadId: string): void {\n const thread = this.store.get(threadId);\n if (!thread) {\n throw new ThreadNotFoundError(threadId);\n }\n\n this.store.save({\n ...thread,\n participantCount: thread.participantCount + 1,\n updatedAt: Date.now(),\n });\n }\n}\n","/**\n * Mail handler factories\n *\n * Creates JSON-RPC handlers for all mail/* protocol methods.\n */\n\nimport type {\n ConversationManager,\n TurnManager,\n ThreadManager,\n HandlerContext,\n HandlerRegistry,\n} from \"../types\";\nimport type {\n MailCreateRequestParams,\n MailGetRequestParams,\n MailListRequestParams,\n MailCloseRequestParams,\n MailJoinRequestParams,\n MailLeaveRequestParams,\n MailInviteRequestParams,\n MailTurnRequestParams,\n MailTurnsListRequestParams,\n MailThreadCreateRequestParams,\n MailThreadListRequestParams,\n MailSummaryRequestParams,\n MailReplayRequestParams,\n} from \"../../types\";\nimport { MAIL_ERROR_CODES } from \"../../types\";\nimport { MAPRequestError } from \"../../errors\";\nimport {\n ConversationNotFoundError,\n ConversationClosedError,\n ParticipantAlreadyJoinedError,\n ParticipantNotFoundError,\n} from \"./conversation-manager\";\nimport {\n TurnNotFoundError,\n TurnConversationNotFoundError,\n InvalidContentTypeError,\n} from \"./turn-manager\";\nimport {\n ThreadNotFoundError,\n RootTurnNotFoundError,\n RootTurnConversationMismatchError,\n ParentThreadNotFoundError,\n} from \"./thread-manager\";\n\n/**\n * Options for creating mail handlers.\n */\nexport interface MailHandlerOptions {\n conversations: ConversationManager;\n turns: TurnManager;\n threads: ThreadManager;\n}\n\n/**\n * Derive participant ID from handler context.\n * Uses first registered agent, or session ID as fallback.\n */\nfunction getParticipantId(ctx: HandlerContext): string {\n return ctx.session.agentIds[0] ?? ctx.session.id;\n}\n\n/**\n * Map manager errors to MAPRequestError with mail error codes.\n */\nfunction mapMailError(error: unknown): never {\n if (\n error instanceof ConversationNotFoundError ||\n error instanceof TurnConversationNotFoundError ||\n error instanceof RootTurnConversationMismatchError\n ) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_NOT_FOUND,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof ConversationClosedError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_CLOSED,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof ParticipantNotFoundError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_NOT_A_PARTICIPANT,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof ParticipantAlreadyJoinedError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_PARTICIPANT_ALREADY_JOINED,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof TurnNotFoundError || error instanceof RootTurnNotFoundError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_TURN_NOT_FOUND,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof InvalidContentTypeError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_INVALID_TURN_CONTENT,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n if (error instanceof ThreadNotFoundError || error instanceof ParentThreadNotFoundError) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_THREAD_NOT_FOUND,\n (error as Error).message,\n { category: \"mail\" }\n );\n }\n throw error;\n}\n\n/**\n * Create handlers for mail/* protocol methods.\n *\n * Methods:\n * - `mail/create` - Create a conversation\n * - `mail/get` - Get conversation details\n * - `mail/list` - List conversations\n * - `mail/close` - Close a conversation\n * - `mail/join` - Join a conversation\n * - `mail/leave` - Leave a conversation\n * - `mail/invite` - Invite a participant\n * - `mail/turn` - Record a turn\n * - `mail/turns/list` - List turns\n * - `mail/thread/create` - Create a thread\n * - `mail/thread/list` - List threads\n * - `mail/summary` - Get conversation summary\n * - `mail/replay` - Replay turns\n */\nexport function createMailHandlers(options: MailHandlerOptions): HandlerRegistry {\n const { conversations, turns, threads } = options;\n\n return {\n // =========================================================================\n // Conversation lifecycle\n // =========================================================================\n\n \"mail/create\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailCreateRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n const { conversation, participant } = conversations.create({\n type: p.type,\n subject: p.subject,\n createdBy: participantId,\n parentConversationId: p.parentConversationId,\n parentTurnId: p.parentTurnId,\n initialParticipants: p.initialParticipants?.map((ip) => ({\n id: ip.id,\n role: ip.role,\n permissions: ip.permissions,\n })),\n metadata: p.metadata,\n });\n\n let initialTurn;\n if (p.initialTurn) {\n initialTurn = turns.recordTurn({\n conversationId: conversation.id,\n participant: participantId,\n contentType: p.initialTurn.contentType,\n content: p.initialTurn.content,\n visibility: p.initialTurn.visibility,\n });\n }\n\n return { conversation, participant, initialTurn };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n \"mail/get\": async (params: unknown) => {\n const p = params as MailGetRequestParams;\n\n const result = conversations.get(p.conversationId, {\n participants: p.include?.participants,\n });\n\n if (!result) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_NOT_FOUND,\n `Conversation not found: ${p.conversationId}`,\n { category: \"mail\" }\n );\n }\n\n const response: Record<string, unknown> = {\n conversation: result.conversation,\n };\n\n if (result.participants) {\n response.participants = result.participants;\n }\n\n if (p.include?.threads) {\n response.threads = threads.list(p.conversationId);\n }\n\n if (p.include?.recentTurns) {\n response.recentTurns = turns.list({\n conversationId: p.conversationId,\n limit: p.include.recentTurns,\n order: \"desc\",\n });\n }\n\n if (p.include?.stats) {\n const totalTurns = turns.count(p.conversationId);\n const allThreads = threads.list(p.conversationId);\n const activeParticipants = conversations.listParticipants(p.conversationId, true);\n\n // Count turns by content type\n const allTurns = turns.list({ conversationId: p.conversationId });\n const turnsByContentType: Record<string, number> = {};\n for (const t of allTurns) {\n turnsByContentType[t.contentType] = (turnsByContentType[t.contentType] ?? 0) + 1;\n }\n\n response.stats = {\n totalTurns,\n turnsByContentType,\n activeParticipants: activeParticipants.length,\n threadCount: allThreads.length,\n };\n }\n\n return response;\n },\n\n \"mail/list\": async (params: unknown) => {\n const p = (params ?? {}) as MailListRequestParams;\n const limit = p.limit ?? 50;\n\n const allConversations = conversations.list(p.filter);\n\n // Cursor-based pagination: cursor is the last conversation ID seen\n let startIndex = 0;\n if (p.cursor) {\n const cursorIndex = allConversations.findIndex((c) => c.id === p.cursor);\n if (cursorIndex >= 0) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const page = allConversations.slice(startIndex, startIndex + limit + 1);\n const hasMore = page.length > limit;\n const items = hasMore ? page.slice(0, limit) : page;\n\n return {\n conversations: items,\n hasMore,\n nextCursor: hasMore ? items[items.length - 1].id : undefined,\n };\n },\n\n \"mail/close\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailCloseRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n const conversation = conversations.close(p.conversationId, participantId, p.reason);\n return { conversation };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n // =========================================================================\n // Participants\n // =========================================================================\n\n \"mail/join\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailJoinRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n const { conversation, participant } = conversations.join({\n conversationId: p.conversationId,\n participantId,\n role: p.role,\n });\n\n const response: Record<string, unknown> = { conversation, participant };\n\n if (p.catchUp) {\n const catchUpLimit = p.catchUp.limit ?? 50;\n\n // catchUp.from can be a turn ID (string) or timestamp (number)\n const afterTurnId = typeof p.catchUp.from === \"string\" ? p.catchUp.from : undefined;\n const afterTimestamp = typeof p.catchUp.from === \"number\" ? p.catchUp.from : undefined;\n\n const history = turns.list({\n conversationId: p.conversationId,\n afterTurnId,\n afterTimestamp,\n limit: catchUpLimit + 1,\n order: \"asc\",\n });\n const hasMore = history.length > catchUpLimit;\n const items = hasMore ? history.slice(0, catchUpLimit) : history;\n\n response.history = items;\n if (hasMore) {\n response.historyCursor = items[items.length - 1].id;\n }\n }\n\n return response;\n } catch (error) {\n mapMailError(error);\n }\n },\n\n \"mail/leave\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailLeaveRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n conversations.leave(p.conversationId, participantId, p.reason);\n return { success: true, leftAt: Date.now() };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n \"mail/invite\": async (params: unknown) => {\n const p = params as MailInviteRequestParams;\n\n try {\n const participant = conversations.invite({\n conversationId: p.conversationId,\n participant: {\n id: p.participant.id,\n role: p.participant.role,\n permissions: p.participant.permissions,\n },\n });\n\n return { invited: true, participant };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n // =========================================================================\n // Turns\n // =========================================================================\n\n \"mail/turn\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailTurnRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n const turn = turns.recordTurn({\n conversationId: p.conversationId,\n participant: participantId,\n contentType: p.contentType,\n content: p.content,\n threadId: p.threadId,\n inReplyTo: p.inReplyTo,\n visibility: p.visibility,\n metadata: p.metadata,\n });\n\n // Increment thread turn count (non-fatal)\n if (p.threadId) {\n try {\n threads.incrementTurnCount(p.threadId);\n } catch {\n // Thread increment failure is non-fatal\n }\n }\n\n return { turn };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n \"mail/turns/list\": async (params: unknown) => {\n const p = params as MailTurnsListRequestParams;\n const limit = p.limit ?? 50;\n\n // Validate conversation exists\n const conv = conversations.get(p.conversationId);\n if (!conv) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_NOT_FOUND,\n `Conversation not found: ${p.conversationId}`,\n { category: \"mail\" }\n );\n }\n\n const results = turns.list({\n conversationId: p.conversationId,\n threadId: p.filter?.threadId,\n contentTypes: p.filter?.contentTypes,\n participantId: p.filter?.participantId,\n afterTurnId: p.filter?.afterTurnId,\n beforeTurnId: p.filter?.beforeTurnId,\n afterTimestamp: p.filter?.afterTimestamp,\n beforeTimestamp: p.filter?.beforeTimestamp,\n limit: limit + 1,\n order: p.order,\n });\n\n const hasMore = results.length > limit;\n const items = hasMore ? results.slice(0, limit) : results;\n\n return {\n turns: items,\n hasMore,\n nextCursor: hasMore ? items[items.length - 1].id : undefined,\n };\n },\n\n // =========================================================================\n // Threads\n // =========================================================================\n\n \"mail/thread/create\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as MailThreadCreateRequestParams;\n const participantId = getParticipantId(ctx);\n\n try {\n const thread = threads.create({\n conversationId: p.conversationId,\n rootTurnId: p.rootTurnId,\n subject: p.subject,\n parentThreadId: p.parentThreadId,\n createdBy: participantId,\n });\n\n return { thread };\n } catch (error) {\n mapMailError(error);\n }\n },\n\n \"mail/thread/list\": async (params: unknown) => {\n const p = (params ?? {}) as MailThreadListRequestParams;\n const limit = p.limit ?? 50;\n\n const allThreads = threads.list(p.conversationId, p.parentThreadId);\n\n // Cursor-based pagination\n let startIndex = 0;\n if (p.cursor) {\n const cursorIndex = allThreads.findIndex((t) => t.id === p.cursor);\n if (cursorIndex >= 0) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const page = allThreads.slice(startIndex, startIndex + limit + 1);\n const hasMore = page.length > limit;\n const items = hasMore ? page.slice(0, limit) : page;\n\n return {\n threads: items,\n hasMore,\n nextCursor: hasMore ? items[items.length - 1].id : undefined,\n };\n },\n\n // =========================================================================\n // Summary & Replay\n // =========================================================================\n\n \"mail/summary\": async (params: unknown) => {\n const p = params as MailSummaryRequestParams;\n\n // Validate conversation exists\n const conv = conversations.get(p.conversationId);\n if (!conv) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_NOT_FOUND,\n `Conversation not found: ${p.conversationId}`,\n { category: \"mail\" }\n );\n }\n\n // Placeholder implementation - full AI summarization is optional/future\n return { summary: \"\", generated: false };\n },\n\n \"mail/replay\": async (params: unknown) => {\n const p = params as MailReplayRequestParams;\n const limit = p.limit ?? 50;\n\n // Validate conversation exists\n const conv = conversations.get(p.conversationId);\n if (!conv) {\n throw new MAPRequestError(\n MAIL_ERROR_CODES.MAIL_CONVERSATION_NOT_FOUND,\n `Conversation not found: ${p.conversationId}`,\n { category: \"mail\" }\n );\n }\n\n const results = turns.list({\n conversationId: p.conversationId,\n threadId: p.threadId,\n contentTypes: p.contentTypes,\n afterTurnId: p.fromTurnId,\n afterTimestamp: p.fromTimestamp,\n limit: limit + 1,\n order: \"asc\",\n });\n\n const hasMore = results.length > limit;\n const items = hasMore ? results.slice(0, limit) : results;\n\n return {\n turns: items,\n hasMore,\n nextCursor: hasMore ? items[items.length - 1].id : undefined,\n missedCount: 0,\n };\n },\n };\n}\n","/**\n * RouterConnection implementation\n *\n * JSON-RPC router that dispatches requests to handlers with middleware support.\n */\n\nimport type { Stream, AnyMessage } from \"../../stream\";\nimport type {\n ServerSession,\n SessionManager,\n SessionRole,\n HandlerContext,\n Handler,\n HandlerRegistry,\n Middleware,\n RouterConnection,\n RouterConnectionOptions,\n} from \"../types\";\nimport type { MAPRequestBase, MAPResponse, MAPError } from \"../../types\";\n\n/**\n * JSON-RPC error codes\n */\nconst JSONRPC_ERRORS = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n};\n\n/**\n * RouterConnection implementation.\n *\n * Handles JSON-RPC message routing with:\n * - Request/response correlation\n * - Middleware chain execution\n * - Session management integration\n * - Error handling\n */\nexport class RouterConnectionImpl implements RouterConnection {\n private readonly stream: Stream;\n private readonly handlers: HandlerRegistry;\n private readonly middleware: Middleware[];\n private readonly sessions: SessionManager;\n private readonly role: SessionRole;\n private readonly name?: string;\n private readonly resumeToken?: string;\n private readonly metadata?: Record<string, unknown>;\n\n private _session: ServerSession | null = null;\n private _closed: Promise<void>;\n private _closedResolve!: () => void;\n private _abortController: AbortController;\n private _started = false;\n private _running = false;\n private _isClosed = false;\n\n constructor(options: RouterConnectionOptions) {\n this.stream = options.stream;\n this.handlers = options.handlers;\n this.middleware = options.middleware ?? [];\n this.sessions = options.sessions;\n this.role = options.role;\n this.name = options.name;\n this.resumeToken = options.resumeToken;\n this.metadata = options.metadata;\n\n this._abortController = new AbortController();\n this._closed = new Promise((resolve) => {\n this._closedResolve = resolve;\n });\n }\n\n /**\n * Get the current session.\n */\n get session(): ServerSession {\n if (!this._session) {\n throw new Error(\"Connection not started\");\n }\n return this._session;\n }\n\n /**\n * Promise that resolves when connection closes.\n */\n get closed(): Promise<void> {\n return this._closed;\n }\n\n /**\n * Start processing messages.\n */\n async start(): Promise<void> {\n if (this._started) {\n throw new Error(\"Connection already started\");\n }\n this._started = true;\n\n // Initialize session\n if (this.resumeToken) {\n const result = this.sessions.resume(this.resumeToken);\n if (result.success && result.session) {\n this._session = result.session;\n // Update metadata on resume if provided (e.g., transportType may change)\n if (this.metadata) {\n this._session.metadata = { ...this._session.metadata, ...this.metadata };\n }\n } else {\n // Resume failed - create new session\n this._session = this.sessions.create({\n role: this.role,\n name: this.name,\n metadata: this.metadata,\n });\n }\n } else {\n this._session = this.sessions.create({\n role: this.role,\n name: this.name,\n metadata: this.metadata,\n });\n }\n\n // Start message processing loop\n this._running = true;\n this.processMessages().catch((error) => {\n console.error(\"RouterConnection error:\", error);\n this.close();\n });\n }\n\n /**\n * Stop processing and close the connection.\n */\n async close(): Promise<void> {\n if (this._isClosed) {\n return;\n }\n this._isClosed = true;\n\n this._running = false;\n this._abortController.abort();\n\n // Disconnect session (makes it resumable)\n if (this._session) {\n this.sessions.disconnect(this._session.id);\n }\n\n // Close the stream\n try {\n const writer = this.stream.writable.getWriter();\n await writer.close();\n } catch {\n // Ignore close errors\n }\n\n this._closedResolve();\n }\n\n /**\n * Send a notification to the connected peer.\n */\n async notify(method: string, params: unknown): Promise<void> {\n const notification = {\n jsonrpc: \"2.0\" as const,\n method,\n params,\n };\n\n await this.sendMessage(notification);\n }\n\n /**\n * Main message processing loop.\n */\n private async processMessages(): Promise<void> {\n const reader = this.stream.readable.getReader();\n\n try {\n while (this._running) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n // Touch session on activity\n if (this._session) {\n this.sessions.touch(this._session.id);\n }\n\n // Process the message\n await this.handleMessage(value);\n }\n } catch (error) {\n if (this._running) {\n console.error(\"Error reading from stream:\", error);\n }\n } finally {\n reader.releaseLock();\n this.close();\n }\n }\n\n /**\n * Handle an incoming message.\n */\n private async handleMessage(message: AnyMessage): Promise<void> {\n // Check if it's a request (has id and method)\n if (this.isRequest(message)) {\n await this.handleRequest(message as MAPRequestBase);\n }\n // Notifications (method but no id) are ignored by server\n // Responses (id but no method) are for client-side correlation\n }\n\n /**\n * Check if a message is a request.\n */\n private isRequest(message: AnyMessage): boolean {\n return (\n typeof message === \"object\" &&\n message !== null &&\n \"jsonrpc\" in message &&\n message.jsonrpc === \"2.0\" &&\n \"id\" in message &&\n \"method\" in message\n );\n }\n\n /**\n * Handle a JSON-RPC request.\n */\n private async handleRequest(request: MAPRequestBase): Promise<void> {\n const { id, method, params } = request;\n\n try {\n // Find handler\n const handler = this.handlers[method];\n if (!handler) {\n await this.sendError(id, {\n code: JSONRPC_ERRORS.METHOD_NOT_FOUND,\n message: `Method not found: ${method}`,\n });\n return;\n }\n\n // Create handler context\n const ctx: HandlerContext = {\n session: this._session!,\n requestId: String(id),\n signal: this._abortController.signal,\n };\n\n // Execute through middleware chain\n const result = await this.executeWithMiddleware(\n method,\n params,\n ctx,\n handler\n );\n\n // Send success response\n await this.sendResponse(id, result);\n } catch (error) {\n // Send error response\n const mapError: MAPError = {\n code: JSONRPC_ERRORS.INTERNAL_ERROR,\n message: error instanceof Error ? error.message : \"Internal error\",\n };\n await this.sendError(id, mapError);\n }\n }\n\n /**\n * Execute handler with middleware chain.\n */\n private async executeWithMiddleware(\n method: string,\n params: unknown,\n ctx: HandlerContext,\n handler: Handler\n ): Promise<unknown> {\n // Build middleware chain\n let index = 0;\n\n const next = async (): Promise<unknown> => {\n if (index < this.middleware.length) {\n const middleware = this.middleware[index++];\n return middleware(method, params, ctx, next);\n } else {\n // End of middleware chain - call the handler\n return handler(params, ctx);\n }\n };\n\n return next();\n }\n\n /**\n * Send a success response.\n */\n private async sendResponse(\n id: string | number,\n result: unknown\n ): Promise<void> {\n const response: MAPResponse = {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n await this.sendMessage(response);\n }\n\n /**\n * Send an error response.\n */\n private async sendError(id: string | number, error: MAPError): Promise<void> {\n const response: MAPResponse = {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n await this.sendMessage(response);\n }\n\n /**\n * Send a message to the stream.\n */\n private async sendMessage(message: AnyMessage): Promise<void> {\n const writer = this.stream.writable.getWriter();\n try {\n await writer.write(message);\n } finally {\n writer.releaseLock();\n }\n }\n}\n\n/**\n * Create a RouterConnection.\n */\nexport function createRouterConnection(\n options: RouterConnectionOptions\n): RouterConnection {\n return new RouterConnectionImpl(options);\n}\n","/**\n * Built-in middleware helpers for RouterConnection\n */\n\nimport type { Middleware, HandlerContext } from \"../types\";\n\n/**\n * Create a logging middleware.\n *\n * @param logger - Optional custom logger (defaults to console)\n */\nexport function loggingMiddleware(\n logger: Pick<Console, \"log\" | \"error\"> = console\n): Middleware {\n return async (method, params, ctx, next) => {\n const start = Date.now();\n\n logger.log(\n `[${ctx.requestId}] -> ${method}`,\n params ? JSON.stringify(params).slice(0, 200) : \"\"\n );\n\n try {\n const result = await next();\n const duration = Date.now() - start;\n\n logger.log(`[${ctx.requestId}] <- ${method} OK (${duration}ms)`);\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n\n logger.error(\n `[${ctx.requestId}] <- ${method} ERROR (${duration}ms):`,\n error instanceof Error ? error.message : error\n );\n throw error;\n }\n };\n}\n\n/**\n * Create a timing middleware that adds timing metadata.\n *\n * @param onTiming - Callback with timing data\n */\nexport function timingMiddleware(\n onTiming?: (data: { method: string; durationMs: number; requestId: string }) => void\n): Middleware {\n return async (method, _params, ctx, next) => {\n const start = Date.now();\n\n try {\n return await next();\n } finally {\n const durationMs = Date.now() - start;\n onTiming?.({ method, durationMs, requestId: ctx.requestId });\n }\n };\n}\n\n/**\n * Create a rate limiting middleware.\n *\n * @param options - Rate limit configuration\n */\nexport function rateLimitMiddleware(options: {\n maxRequestsPerSecond: number;\n onLimitExceeded?: (ctx: HandlerContext) => void;\n}): Middleware {\n const requestCounts = new Map<string, { count: number; resetAt: number }>();\n\n return async (method, params, ctx, next) => {\n const sessionId = ctx.session.id;\n const now = Date.now();\n\n let entry = requestCounts.get(sessionId);\n if (!entry || entry.resetAt <= now) {\n entry = { count: 0, resetAt: now + 1000 };\n requestCounts.set(sessionId, entry);\n }\n\n entry.count++;\n\n if (entry.count > options.maxRequestsPerSecond) {\n options.onLimitExceeded?.(ctx);\n throw new Error(\"Rate limit exceeded\");\n }\n\n return next();\n };\n}\n\n/**\n * Create a validation middleware using a schema validator.\n *\n * @param validators - Map of method name to validator function\n */\nexport function validationMiddleware(\n validators: Record<string, (params: unknown) => { valid: boolean; error?: string }>\n): Middleware {\n return async (method, params, _ctx, next) => {\n const validator = validators[method];\n if (validator) {\n const result = validator(params);\n if (!result.valid) {\n throw new Error(`Invalid params: ${result.error ?? \"validation failed\"}`);\n }\n }\n return next();\n };\n}\n\n/**\n * Create a timeout middleware.\n *\n * @param timeoutMs - Timeout in milliseconds\n */\nexport function timeoutMiddleware(timeoutMs: number): Middleware {\n return async (method, params, ctx, next) => {\n const timeoutPromise = new Promise((_, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Request timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n\n // Clean up timer if request completes\n ctx.signal.addEventListener(\"abort\", () => clearTimeout(timer));\n });\n\n return Promise.race([next(), timeoutPromise]);\n };\n}\n\n/**\n * Compose multiple middleware into one.\n */\nexport function composeMiddleware(...middlewares: Middleware[]): Middleware {\n return async (method, params, ctx, next) => {\n let index = 0;\n\n const composed = async (): Promise<unknown> => {\n if (index < middlewares.length) {\n const mw = middlewares[index++];\n return mw(method, params, ctx, composed);\n }\n return next();\n };\n\n return composed();\n };\n}\n","/**\n * Connection handler factories\n *\n * Creates JSON-RPC handlers for connection-related methods.\n */\n\nimport type {\n SessionManager,\n AgentRegistry,\n SubscriptionManager,\n ScopeManager,\n HandlerContext,\n HandlerRegistry,\n} from \"../types\";\nimport type { AuthManager, AuthManagerImpl } from \"../auth\";\nimport type { AuthCredentials, AuthResult } from \"../../types\";\nimport type { ServerSession } from \"../types\";\n\n/**\n * Options for creating connection handlers.\n */\n/**\n * Mail capability configuration for the server.\n * When provided, mail capabilities are included in the connect response.\n */\nexport interface MailCapabilityConfig {\n /** Whether mail is enabled on this server */\n enabled: boolean;\n /** Can create new conversations (default: true) */\n canCreate?: boolean;\n /** Can join existing conversations (default: true) */\n canJoin?: boolean;\n /** Can invite participants (default: true) */\n canInvite?: boolean;\n /** Can view conversation history (default: true) */\n canViewHistory?: boolean;\n /** Can create threads within conversations (default: true) */\n canCreateThreads?: boolean;\n}\n\nexport interface ConnectionHandlerOptions {\n sessions: SessionManager;\n agents?: AgentRegistry;\n subscriptions?: SubscriptionManager;\n scopes?: ScopeManager;\n /** Server name for connect response */\n serverName?: string;\n /** Server version for connect response */\n serverVersion?: string;\n /** Authentication manager (optional) */\n authManager?: AuthManager;\n /** Mail capability configuration (optional). When provided and enabled, mail capabilities are advertised. */\n mailCapabilities?: MailCapabilityConfig;\n /** Credential brokering configuration (optional). When provided and enabled, credential capabilities are advertised. */\n credentialCapabilities?: import(\"../credentials\").CredentialCapabilityConfig;\n /** Workspace capability configuration (optional). When provided and enabled, workspace capabilities are advertised. */\n workspaceCapabilities?: import(\"../workspace\").WorkspaceCapabilityConfig;\n}\n\n/**\n * Parameters for connect request.\n */\ninterface ConnectParams {\n /**\n * Specific agent IDs to reclaim on session resume.\n * If provided, validates that these agents exist and belong to this session.\n * If not provided, all session agents are reclaimed automatically.\n */\n reclaimAgents?: string[];\n /**\n * Authentication credentials.\n */\n auth?: AuthCredentials;\n}\n\n/**\n * After successful auth, store provider data on session and return capability mapping.\n * Returns the capability overlay if the auth method is backed by an AuthProvider.\n */\nfunction storeProviderData(\n authManager: AuthManager,\n session: ServerSession,\n method: string,\n authResult: AuthResult,\n): void {\n if (\n !authResult.success ||\n !authResult.principal ||\n authResult.providerData === undefined\n )\n return;\n\n const manager = authManager as AuthManagerImpl;\n if (typeof manager.getProvider !== \"function\") return;\n\n const provider = manager.getProvider(method);\n if (!provider) return;\n\n // Store provider data on session\n if (!session.providers) session.providers = {};\n session.providers[provider.providerId] = {\n principal: authResult.principal,\n providerData: authResult.providerData,\n };\n}\n\n/**\n * Create handlers for connection-related methods.\n *\n * Methods:\n * - `map/connect` - Get session info (session already created by RouterConnection)\n * - `map/disconnect` - Disconnect the session\n * - `map/session/info` - Get current session information\n */\nexport function createConnectionHandlers(\n options: ConnectionHandlerOptions,\n): HandlerRegistry {\n const {\n sessions,\n agents,\n subscriptions,\n scopes,\n serverName,\n serverVersion,\n authManager,\n mailCapabilities,\n } = options;\n const credentialCapabilities = options.credentialCapabilities;\n const workspaceCapabilities = options.workspaceCapabilities;\n\n return {\n \"map/connect\": async (params: unknown, ctx: HandlerContext) => {\n const { reclaimAgents, auth } = (params ?? {}) as ConnectParams;\n\n // Handle authentication if authManager is configured\n if (authManager) {\n // Check if auth should be bypassed for this transport\n const shouldBypass = authManager.shouldBypass({\n transportType: ctx.session.metadata?.transportType as\n | string\n | undefined,\n });\n\n if (!shouldBypass) {\n if (auth) {\n // Authenticate with provided credentials\n const authResult = await authManager.authenticate(auth, {\n transportType: ctx.session.metadata?.transportType as\n | string\n | undefined,\n });\n\n if (authResult.success && authResult.principal) {\n // Store principal on session\n ctx.session.principal = authResult.principal;\n // Store provider data if auth backed by a provider\n storeProviderData(\n authManager,\n ctx.session,\n auth.method,\n authResult,\n );\n } else if (authManager.config.required) {\n // Auth failed and is required - return auth required response\n return {\n authRequired: authManager.getCapabilities(),\n error: authResult.error,\n };\n }\n } else if (authManager.config.required) {\n // No auth provided but required - return auth required response\n return {\n authRequired: authManager.getCapabilities(),\n };\n }\n }\n }\n\n // Session is already created/resumed by RouterConnection.start()\n // Check if this is a resumed session by looking at whether it has pre-existing agents\n const isResumed = ctx.session.agentIds.length > 0;\n\n // Track which agents were actually reclaimed\n let reclaimedAgents: string[] = [];\n\n // If reclaimAgents is specified, validate and reclaim only those agents\n if (reclaimAgents && reclaimAgents.length > 0 && agents) {\n const errors: string[] = [];\n\n for (const agentId of reclaimAgents) {\n const agent = agents.get(agentId);\n\n if (!agent) {\n errors.push(`Agent not found: ${agentId}`);\n continue;\n }\n\n if (agent.sessionId !== ctx.session.id) {\n errors.push(`Agent ${agentId} belongs to different session`);\n continue;\n }\n\n // Agent exists and belongs to this session\n reclaimedAgents.push(agentId);\n }\n\n // If any errors occurred, throw with all error messages\n if (errors.length > 0) {\n throw new Error(`Failed to reclaim agents: ${errors.join(\"; \")}`);\n }\n } else {\n // No specific agents requested - all session agents are reclaimed\n reclaimedAgents = [...ctx.session.agentIds];\n }\n\n // Build capabilities\n const capabilities: Record<string, unknown> = {\n roles: [ctx.session.role],\n features: [],\n };\n\n // Intersect provider-mapped capabilities into the top-level capabilities.\n // Provider capabilities are resolved server-side and not leaked as separate fields.\n if (authManager && auth && ctx.session.providers) {\n const manager = authManager as AuthManagerImpl;\n if (typeof manager.getCapabilityMapping === \"function\") {\n const mapping = manager.getCapabilityMapping(\n auth.method,\n ctx.session.principal!,\n Object.values(ctx.session.providers)[0]?.providerData,\n );\n if (mapping?.participantCapabilities) {\n Object.assign(capabilities, mapping.participantCapabilities);\n }\n // Store defaultAgentPermissions in session metadata for internal use\n // (e.g. agent registration/spawn) but don't send on the wire\n if (mapping?.defaultAgentPermissions) {\n ctx.session.metadata.defaultAgentPermissions =\n mapping.defaultAgentPermissions;\n }\n }\n }\n\n // Include mail capabilities if configured and enabled\n if (mailCapabilities?.enabled) {\n capabilities.mail = {\n enabled: true,\n canCreate: mailCapabilities.canCreate ?? true,\n canJoin: mailCapabilities.canJoin ?? true,\n canInvite: mailCapabilities.canInvite ?? true,\n canViewHistory: mailCapabilities.canViewHistory ?? true,\n canCreateThreads: mailCapabilities.canCreateThreads ?? true,\n };\n }\n\n // Include credential brokering capabilities if configured and enabled\n if (credentialCapabilities?.enabled) {\n capabilities.credentials = {\n enabled: true,\n canGet: credentialCapabilities.canGet ?? true,\n canList: credentialCapabilities.canList ?? true,\n canStatus: credentialCapabilities.canStatus ?? true,\n };\n }\n\n // Include workspace capabilities if configured and enabled\n if (workspaceCapabilities?.enabled) {\n capabilities.workspace = {\n enabled: true,\n canSearch: workspaceCapabilities.canSearch ?? true,\n canList: workspaceCapabilities.canList ?? true,\n canRead: workspaceCapabilities.canRead ?? true,\n };\n }\n\n // Return protocol-compliant connect response\n return {\n protocolVersion: \"2024-12\",\n sessionId: ctx.session.id,\n participantId: ctx.session.id, // Use session ID as participant ID\n capabilities,\n systemInfo: {\n name: serverName ?? \"MAP Server\",\n version: serverVersion ?? \"1.0.0\",\n },\n reconnected: isResumed,\n ownedAgents: ctx.session.agentIds,\n reclaimedAgents: reclaimedAgents,\n principal: ctx.session.principal,\n };\n },\n\n \"map/authenticate\": async (params: unknown, ctx: HandlerContext) => {\n const credentials = params as AuthCredentials;\n\n if (!authManager) {\n return {\n success: true,\n sessionId: ctx.session.id,\n participantId: ctx.session.id,\n principal: { id: \"anonymous\" },\n };\n }\n\n const authResult = await authManager.authenticate(credentials, {\n transportType: ctx.session.metadata?.transportType as\n | string\n | undefined,\n });\n\n if (authResult.success && authResult.principal) {\n // Store principal on session\n ctx.session.principal = authResult.principal;\n // Store provider data if auth backed by a provider\n storeProviderData(\n authManager,\n ctx.session,\n credentials.method,\n authResult,\n );\n\n return {\n success: true,\n sessionId: ctx.session.id,\n participantId: ctx.session.id,\n principal: authResult.principal,\n };\n }\n\n return {\n success: false,\n error: authResult.error,\n };\n },\n\n \"map/auth/refresh\": async (params: unknown, ctx: HandlerContext) => {\n const credentials = params as AuthCredentials;\n\n if (!authManager) {\n return {\n success: true,\n principal: ctx.session.principal ?? { id: \"anonymous\" },\n };\n }\n\n // Validate the new credentials\n const authResult = await authManager.authenticate(credentials, {\n transportType: ctx.session.metadata?.transportType as\n | string\n | undefined,\n });\n\n if (authResult.success && authResult.principal) {\n // Update principal on session\n ctx.session.principal = authResult.principal;\n // Update provider data if auth backed by a provider\n storeProviderData(\n authManager,\n ctx.session,\n credentials.method,\n authResult,\n );\n\n return {\n success: true,\n principal: authResult.principal,\n };\n }\n\n return {\n success: false,\n error: authResult.error ?? {\n code: \"invalid_credentials\",\n message: \"Token refresh failed\",\n },\n };\n },\n\n \"map/disconnect\": async (_params: unknown, ctx: HandlerContext) => {\n // Disconnect session (makes it resumable)\n // NOTE: We preserve agents, subscriptions, and scope memberships for session resume.\n // They will be reclaimed when the session resumes, or cleaned up by ResourceCleaner\n // if the session expires without resuming.\n const resumeToken = sessions.disconnect(ctx.session.id);\n\n return {\n success: true,\n resumeToken,\n };\n },\n\n \"map/session/info\": async (_params: unknown, ctx: HandlerContext) => {\n return {\n id: ctx.session.id,\n role: ctx.session.role,\n name: ctx.session.name,\n status: ctx.session.status,\n connectedAt: ctx.session.connectedAt,\n lastActivity: ctx.session.lastActivity,\n agentIds: ctx.session.agentIds,\n subscriptionIds: ctx.session.subscriptionIds,\n };\n },\n\n \"map/session/close\": async (_params: unknown, ctx: HandlerContext) => {\n // Permanently close the session (not resumable)\n\n // Clean up all resources\n if (agents) {\n agents.unregisterBySession(ctx.session.id);\n }\n\n if (subscriptions) {\n subscriptions.cancelBySession(ctx.session.id);\n }\n\n if (scopes && agents) {\n for (const agentId of ctx.session.agentIds) {\n scopes.leaveAll(agentId);\n }\n }\n\n // Close session permanently\n sessions.close(ctx.session.id);\n\n return { success: true };\n },\n };\n}\n\n/**\n * Combine all handler factories into a single registry.\n */\nexport function combineHandlers(\n ...registries: HandlerRegistry[]\n): HandlerRegistry {\n const combined: HandlerRegistry = {};\n\n for (const registry of registries) {\n for (const [method, handler] of Object.entries(registry)) {\n if (combined[method]) {\n console.warn(`Handler for ${method} already exists, overwriting`);\n }\n combined[method] = handler;\n }\n }\n\n return combined;\n}\n","/**\n * MAPRouter adapter\n *\n * Converts a MAPRouterInterface implementation to a HandlerRegistry.\n */\n\nimport type {\n MAPRouterInterface,\n HandlerRegistry,\n HandlerContext,\n} from \"../types\";\n\n/**\n * Method name mapping from MAPRouterInterface methods to protocol methods.\n */\nconst METHOD_MAPPING: Record<string, keyof MAPRouterInterface> = {\n \"map/connect\": \"connect\",\n \"map/disconnect\": \"disconnect\",\n \"map/resume\": \"resume\",\n \"map/session/close\": \"close\",\n \"map/agents/register\": \"registerAgent\",\n \"map/agents/unregister\": \"unregisterAgent\",\n \"map/agents/list\": \"listAgents\",\n \"map/agents/get\": \"getAgent\",\n \"map/agents/update/state\": \"updateAgentState\",\n \"map/agents/update/metadata\": \"updateAgentMetadata\",\n \"map/scopes/create\": \"createScope\",\n \"map/scopes/delete\": \"deleteScope\",\n \"map/scopes/list\": \"listScopes\",\n \"map/scopes/get\": \"getScope\",\n \"map/scopes/join\": \"joinScope\",\n \"map/scopes/leave\": \"leaveScope\",\n \"map/send\": \"send\",\n \"map/subscribe\": \"subscribe\",\n \"map/unsubscribe\": \"unsubscribe\",\n \"map/replay\": \"replay\",\n};\n\n/**\n * Convert a MAPRouterInterface implementation to a HandlerRegistry.\n *\n * This allows users to implement the OOP interface and use it with\n * RouterConnection.\n *\n * @param router - The MAPRouterInterface implementation\n * @returns A HandlerRegistry with all protocol methods\n */\nexport function routerToHandlers(router: MAPRouterInterface): HandlerRegistry {\n const handlers: HandlerRegistry = {};\n\n for (const [protocolMethod, interfaceMethod] of Object.entries(METHOD_MAPPING)) {\n const method = router[interfaceMethod];\n if (typeof method === \"function\") {\n // Bind the method to the router instance\n handlers[protocolMethod] = async (params: unknown, ctx: HandlerContext) => {\n return (method as Function).call(router, params, ctx);\n };\n }\n }\n\n return handlers;\n}\n\n/**\n * Get the list of protocol methods supported by MAPRouterInterface.\n */\nexport function getProtocolMethods(): string[] {\n return Object.keys(METHOD_MAPPING);\n}\n\n/**\n * Get the interface method name for a protocol method.\n */\nexport function getInterfaceMethod(\n protocolMethod: string\n): keyof MAPRouterInterface | undefined {\n return METHOD_MAPPING[protocolMethod];\n}\n","/**\n * BaseMAPRouter abstract class\n *\n * Provides default implementations of MAPRouterInterface that delegate\n * to the building blocks. Subclasses can override any method for custom behavior.\n */\n\nimport type {\n MAPRouterInterface,\n BaseMAPRouterOptions,\n HandlerContext,\n AgentRegistry,\n ScopeManager,\n SessionManager,\n SubscriptionManager,\n MessageRouter,\n EventBus,\n RegisteredAgent,\n ServerScope,\n ServerSubscription,\n ServerMessage,\n ServerAgentState,\n AgentFilter,\n ScopeFilter,\n SubscriptionFilter,\n ResumeResult,\n MAPEvent,\n} from \"../types\";\nimport {\n isAddress,\n isAgentAddress,\n isScopeAddress,\n extractId,\n} from \"../messages/address\";\n\n/**\n * Abstract base class implementing MAPRouterInterface.\n *\n * Provides default implementations that delegate to the building blocks.\n * Subclasses can override any method to customize behavior.\n *\n * @example\n * ```typescript\n * class MyRouter extends BaseMAPRouter {\n * async registerAgent(params, ctx) {\n * console.log(\"Registering agent:\", params.name);\n * const agent = await super.registerAgent(params, ctx);\n * console.log(\"Agent registered:\", agent.id);\n * return agent;\n * }\n * }\n * ```\n */\nexport abstract class BaseMAPRouter implements MAPRouterInterface {\n protected readonly agents: AgentRegistry;\n protected readonly scopes: ScopeManager;\n protected readonly sessions: SessionManager;\n protected readonly subscriptions: SubscriptionManager;\n protected readonly messages: MessageRouter;\n protected readonly eventBus: EventBus;\n\n constructor(options: BaseMAPRouterOptions) {\n this.agents = options.agents;\n this.scopes = options.scopes;\n this.sessions = options.sessions;\n this.subscriptions = options.subscriptions;\n this.messages = options.messages;\n this.eventBus = options.eventBus;\n }\n\n // =========================================================================\n // Connection Methods\n // =========================================================================\n\n async connect(\n _params: unknown,\n ctx: HandlerContext\n ): Promise<{ sessionId: string; resumeToken?: string }> {\n return {\n sessionId: ctx.session.id,\n resumeToken: ctx.session.resumeToken,\n };\n }\n\n async disconnect(_params: unknown, ctx: HandlerContext): Promise<void> {\n // Disconnect session (makes it resumable)\n // NOTE: We preserve agents, subscriptions, and scope memberships for session resume.\n // They will be reclaimed when the session resumes, or cleaned up by ResourceCleaner\n // if the session expires without resuming.\n this.sessions.disconnect(ctx.session.id);\n }\n\n async resume(\n params: { resumeToken: string },\n _ctx: HandlerContext\n ): Promise<ResumeResult> {\n return this.sessions.resume(params.resumeToken);\n }\n\n async close(_params: unknown, ctx: HandlerContext): Promise<void> {\n // Permanently close the session (not resumable)\n // This does full cleanup of all resources\n\n // Leave all scopes first (before unregistering agents)\n for (const agentId of ctx.session.agentIds) {\n this.scopes.leaveAll(agentId);\n }\n\n // Unregister all agents for this session\n this.agents.unregisterBySession(ctx.session.id);\n\n // Cancel all subscriptions\n this.subscriptions.cancelBySession(ctx.session.id);\n\n // Close session permanently\n this.sessions.close(ctx.session.id);\n }\n\n // =========================================================================\n // Agent Methods\n // =========================================================================\n\n async registerAgent(\n params: { name: string; role?: string; metadata?: Record<string, unknown> },\n ctx: HandlerContext\n ): Promise<RegisteredAgent> {\n const agent = this.agents.register({\n name: params.name,\n role: params.role,\n metadata: params.metadata,\n sessionId: ctx.session.id,\n });\n\n ctx.session.agentIds.push(agent.id);\n return agent;\n }\n\n async unregisterAgent(\n params: { agentId: string },\n ctx: HandlerContext\n ): Promise<void> {\n const success = this.agents.unregister(params.agentId);\n if (!success) {\n throw new Error(`Agent not found: ${params.agentId}`);\n }\n\n const index = ctx.session.agentIds.indexOf(params.agentId);\n if (index !== -1) {\n ctx.session.agentIds.splice(index, 1);\n }\n\n // Leave all scopes\n this.scopes.leaveAll(params.agentId);\n }\n\n async listAgents(\n params: AgentFilter,\n _ctx: HandlerContext\n ): Promise<RegisteredAgent[]> {\n return this.agents.list(params);\n }\n\n async getAgent(\n params: { agentId: string },\n _ctx: HandlerContext\n ): Promise<RegisteredAgent | undefined> {\n return this.agents.get(params.agentId);\n }\n\n async updateAgentState(\n params: { agentId: string; state: ServerAgentState },\n _ctx: HandlerContext\n ): Promise<RegisteredAgent> {\n return this.agents.updateState(params.agentId, params.state);\n }\n\n async updateAgentMetadata(\n params: { agentId: string; metadata: Record<string, unknown> },\n _ctx: HandlerContext\n ): Promise<RegisteredAgent> {\n return this.agents.updateMetadata(params.agentId, params.metadata);\n }\n\n // =========================================================================\n // Scope Methods\n // =========================================================================\n\n async createScope(\n params: {\n name: string;\n metadata?: Record<string, unknown>;\n parentId?: string;\n },\n ctx: HandlerContext\n ): Promise<ServerScope> {\n return this.scopes.create({\n name: params.name,\n metadata: params.metadata,\n parentId: params.parentId,\n createdBy: ctx.session.id,\n });\n }\n\n async deleteScope(\n params: { scopeId: string; deleteDescendants?: boolean },\n _ctx: HandlerContext\n ): Promise<void> {\n const success = this.scopes.delete(params.scopeId, {\n deleteDescendants: params.deleteDescendants,\n });\n if (!success) {\n throw new Error(`Scope not found: ${params.scopeId}`);\n }\n }\n\n async listScopes(\n params: ScopeFilter,\n _ctx: HandlerContext\n ): Promise<ServerScope[]> {\n return this.scopes.list(params);\n }\n\n async getScope(\n params: { scopeId: string },\n _ctx: HandlerContext\n ): Promise<ServerScope | undefined> {\n return this.scopes.get(params.scopeId);\n }\n\n async joinScope(\n params: { scopeId: string; agentId: string },\n _ctx: HandlerContext\n ): Promise<void> {\n this.scopes.join(params.scopeId, params.agentId);\n }\n\n async leaveScope(\n params: { scopeId: string; agentId: string },\n _ctx: HandlerContext\n ): Promise<void> {\n this.scopes.leave(params.scopeId, params.agentId);\n }\n\n // =========================================================================\n // Message Methods\n // =========================================================================\n\n async send(\n params: {\n to: string | string[];\n payload: unknown;\n replyTo?: string;\n priority?: number;\n },\n ctx: HandlerContext\n ): Promise<ServerMessage> {\n const from = ctx.session.agentIds[0] ?? ctx.session.id;\n\n // Handle single recipient\n if (typeof params.to === \"string\") {\n // Check for prefixed addresses first\n if (isAddress(params.to)) {\n if (isScopeAddress(params.to)) {\n const scopeId = extractId(params.to);\n return this.messages.sendToScope({\n from,\n scopeId,\n payload: params.payload,\n excludeSender: true,\n });\n } else {\n const agentId = extractId(params.to);\n return this.messages.sendToAgent({\n from,\n to: agentId,\n payload: params.payload,\n replyTo: params.replyTo,\n priority: params.priority,\n });\n }\n }\n\n // Backward compatibility: unprefixed address\n // Check if 'to' is a scope ID by trying to get it\n const scope = this.scopes.get(params.to);\n if (scope) {\n return this.messages.sendToScope({\n from,\n scopeId: params.to,\n payload: params.payload,\n excludeSender: true,\n });\n }\n\n // Send to agent (unprefixed)\n return this.messages.sendToAgent({\n from,\n to: params.to,\n payload: params.payload,\n replyTo: params.replyTo,\n priority: params.priority,\n });\n }\n\n // Handle array of recipients\n const firstTo = params.to[0];\n if (!firstTo) {\n throw new Error(\"No recipients specified\");\n }\n\n // Process first recipient (simplified - could be enhanced to return multiple)\n if (isScopeAddress(firstTo)) {\n const scopeId = extractId(firstTo);\n return this.messages.sendToScope({\n from,\n scopeId,\n payload: params.payload,\n excludeSender: true,\n });\n }\n\n const agentId = isAgentAddress(firstTo) ? extractId(firstTo) : firstTo;\n return this.messages.sendToAgent({\n from,\n to: agentId,\n payload: params.payload,\n replyTo: params.replyTo,\n priority: params.priority,\n });\n }\n\n // =========================================================================\n // Subscription Methods\n // =========================================================================\n\n async subscribe(\n params: { filter: SubscriptionFilter; startAfter?: string },\n ctx: HandlerContext\n ): Promise<ServerSubscription> {\n const subscription = this.subscriptions.create({\n sessionId: ctx.session.id,\n filter: params.filter,\n startAfter: params.startAfter,\n });\n\n ctx.session.subscriptionIds.push(subscription.id);\n return subscription;\n }\n\n async unsubscribe(\n params: { subscriptionId: string },\n ctx: HandlerContext\n ): Promise<void> {\n const success = this.subscriptions.cancel(params.subscriptionId);\n if (!success) {\n throw new Error(`Subscription not found: ${params.subscriptionId}`);\n }\n\n const index = ctx.session.subscriptionIds.indexOf(params.subscriptionId);\n if (index !== -1) {\n ctx.session.subscriptionIds.splice(index, 1);\n }\n }\n\n async replay(\n params: { subscriptionId: string; since?: string; until?: string },\n _ctx: HandlerContext\n ): Promise<MAPEvent[]> {\n const subscription = this.subscriptions.get(params.subscriptionId);\n if (!subscription) {\n throw new Error(`Subscription not found: ${params.subscriptionId}`);\n }\n\n return this.eventBus.getEvents({\n types: subscription.filter.eventTypes,\n since: params.since,\n until: params.until,\n limit: 100,\n });\n }\n}\n\n/**\n * A concrete implementation of BaseMAPRouter that can be instantiated directly.\n *\n * Use this when you don't need to customize any behavior.\n */\nexport class DefaultMAPRouter extends BaseMAPRouter {\n // All default implementations from BaseMAPRouter\n}\n","/**\n * Credential brokering handler factories.\n *\n * Creates JSON-RPC handlers for credential-related methods.\n * Agents must first authenticate with `x-agent-iam` so that a token\n * is stored on the session; these handlers read that token to authorize\n * credential requests via the broker.\n */\n\nimport type { HandlerContext, HandlerRegistry, EventBus } from '../types';\nimport type { BrokerLike } from './types';\n\n// =============================================================================\n// Options\n// =============================================================================\n\n/**\n * Options for creating credential brokering handlers.\n */\nexport interface CredentialHandlerOptions {\n /** Broker instance (satisfies BrokerLike — e.g. agent-iam Broker) */\n broker: BrokerLike;\n /** EventBus for audit events (optional) */\n eventBus?: EventBus;\n /** If set, only these providers are available via cred/status */\n allowedProviders?: string[];\n}\n\n// =============================================================================\n// Params\n// =============================================================================\n\ninterface CredGetParams {\n /** Scope to request (e.g. 'github:repo:write') */\n scope: string;\n /** Resource to access (e.g. 'acme-corp/frontend') */\n resource: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Shape expected on token provider data for audit/listing purposes.\n * The concrete type is owned by the auth provider (e.g. AgentIAMToken);\n * we only require the subset needed by credential handlers.\n */\ninterface TokenLike {\n agentId: string;\n scopes: string[];\n constraints?: Record<string, unknown>;\n expiresAt?: string;\n}\n\n/**\n * Extract the agent-iam token from the session's provider data.\n * Throws if the session has not been authenticated with x-agent-iam.\n */\nfunction getTokenFromSession(ctx: HandlerContext): TokenLike {\n const providerData = ctx.session.providers?.['agent-iam']?.providerData;\n if (!providerData) {\n throw new Error(\n 'No agent-iam token on session',\n );\n }\n return providerData as TokenLike;\n}\n\n// =============================================================================\n// Handler Factory\n// =============================================================================\n\n/**\n * Create handlers for credential brokering methods.\n *\n * Methods:\n * - `cred/get` — Request a short-lived credential for a scope + resource\n * - `cred/list` — List available scopes for the current token\n * - `cred/status` — Check broker status and configured providers\n */\nexport function createCredentialHandlers(\n options: CredentialHandlerOptions,\n): HandlerRegistry {\n const { broker, eventBus, allowedProviders } = options;\n\n return {\n 'cred/get': async (params: unknown, ctx: HandlerContext) => {\n const { scope, resource } = (params ?? {}) as Partial<CredGetParams>;\n\n if (!scope || typeof scope !== 'string') {\n throw new Error('Missing required parameter: scope');\n }\n if (!resource || typeof resource !== 'string') {\n throw new Error('Missing required parameter: resource');\n }\n\n const token = getTokenFromSession(ctx);\n\n // Explicit permission check before getCredential so we can emit an\n // accurate denial audit event. getCredential also checks internally,\n // but its errors are indistinguishable from provider failures.\n const check = broker.checkPermission(token, scope, resource);\n\n if (!check.valid) {\n // Emit denial audit event\n if (eventBus) {\n eventBus.emit({\n type: 'credential.denied',\n data: {\n agentId: token.agentId,\n scope,\n resource,\n reason: check.error,\n },\n source: { agentId: token.agentId },\n });\n }\n\n throw new Error(check.error ?? 'Permission denied');\n }\n\n // Get credential from provider\n const credential = await broker.getCredential(token, scope, resource);\n\n // Emit issuance audit event (never include the credential itself)\n if (eventBus) {\n eventBus.emit({\n type: 'credential.issued',\n data: {\n agentId: token.agentId,\n scope,\n resource,\n credentialType: credential.credentialType,\n expiresAt: credential.expiresAt,\n },\n source: { agentId: token.agentId },\n });\n }\n\n return credential;\n },\n\n 'cred/list': async (_params: unknown, ctx: HandlerContext) => {\n const token = getTokenFromSession(ctx);\n\n return {\n agentId: token.agentId,\n scopes: token.scopes,\n constraints: token.constraints,\n expiresAt: token.expiresAt,\n };\n },\n\n // Deliberately does not require authentication — status is public\n // information that helps agents decide whether to authenticate.\n 'cred/status': async () => {\n const status = broker.getStatus();\n\n // Filter to allowed providers if configured\n const providers = allowedProviders\n ? status.providers.filter((p) => allowedProviders.includes(p))\n : status.providers;\n\n return { providers };\n },\n };\n}\n","/**\n * Workspace handler factories\n *\n * Creates JSON-RPC handlers for workspace/* protocol methods.\n */\n\nimport type { HandlerContext, HandlerRegistry } from \"../types\";\nimport type {\n WorkspaceSearchRequestParams,\n WorkspaceListRequestParams,\n WorkspaceReadRequestParams,\n} from \"../../types\";\nimport type { WorkspaceFileService } from \"./types\";\n\n// =============================================================================\n// Options\n// =============================================================================\n\n/**\n * Options for creating workspace handlers.\n */\nexport interface WorkspaceHandlerOptions {\n /** Workspace file service implementation */\n fileService: WorkspaceFileService;\n}\n\n// =============================================================================\n// Handler Factory\n// =============================================================================\n\n/**\n * Create handlers for workspace/* protocol methods.\n *\n * Methods:\n * - `workspace/search` — Search for files matching a query\n * - `workspace/list` — List files in a directory\n * - `workspace/read` — Read file contents\n */\nexport function createWorkspaceHandlers(\n options: WorkspaceHandlerOptions,\n): HandlerRegistry {\n const { fileService } = options;\n\n return {\n \"workspace/search\": async (params: unknown, _ctx: HandlerContext) => {\n const p = (params ?? {}) as Partial<WorkspaceSearchRequestParams>;\n\n if (!p.agentId || typeof p.agentId !== \"string\") {\n throw new Error(\"Missing required parameter: agentId\");\n }\n if (!p.query || typeof p.query !== \"string\") {\n throw new Error(\"Missing required parameter: query\");\n }\n\n const files = await fileService.search(p.agentId, p.query, {\n cwd: p.cwd,\n limit: p.limit,\n });\n\n return { files };\n },\n\n \"workspace/list\": async (params: unknown, _ctx: HandlerContext) => {\n const p = (params ?? {}) as Partial<WorkspaceListRequestParams>;\n\n if (!p.agentId || typeof p.agentId !== \"string\") {\n throw new Error(\"Missing required parameter: agentId\");\n }\n\n const files = await fileService.list(p.agentId, p.directory);\n return { files };\n },\n\n \"workspace/read\": async (params: unknown, _ctx: HandlerContext) => {\n const p = (params ?? {}) as Partial<WorkspaceReadRequestParams>;\n\n if (!p.agentId || typeof p.agentId !== \"string\") {\n throw new Error(\"Missing required parameter: agentId\");\n }\n if (!p.path || typeof p.path !== \"string\") {\n throw new Error(\"Missing required parameter: path\");\n }\n\n const result = await fileService.read(p.agentId, p.path, p.lineRange);\n return result;\n },\n };\n}\n","/**\n * AuthManager implementation\n *\n * Coordinates multiple authenticators and handles the authentication flow.\n * Supports both plain Authenticators and extended AuthProviders.\n */\n\nimport type {\n AuthMethod,\n AuthCredentials,\n AuthResult,\n AuthPrincipal,\n ServerAuthCapabilities,\n} from '../../types';\nimport type {\n Authenticator,\n AuthConfig,\n AuthContext,\n AuthManager,\n AuthManagerOptions,\n AuthProvider,\n CapabilityMapping,\n SpawnDelegationRequest,\n DelegatedCredentials,\n} from './types';\nimport type { ServerSession } from '../types';\n\n/**\n * Check if an authenticator is also an AuthProvider.\n */\nfunction isAuthProvider(auth: Authenticator): auth is AuthProvider {\n return 'providerId' in auth && typeof (auth as AuthProvider).providerId === 'string';\n}\n\n/**\n * Default AuthManager implementation.\n *\n * @example\n * ```typescript\n * const authManager = new AuthManagerImpl({\n * required: true,\n * authenticators: [\n * new JWTAuthenticator({ jwksUrl: '...' }),\n * new APIKeyAuthenticator({ validateKey: async (key) => ... }),\n * ],\n * providers: [\n * new AgentIAMProvider({ secret, systemId: 'my-system' }),\n * ],\n * });\n *\n * await authManager.initialize();\n *\n * const result = await authManager.authenticate(\n * { method: 'x-agent-iam', credential: '...' },\n * { transportType: 'websocket' }\n * );\n * ```\n */\nexport class AuthManagerImpl implements AuthManager {\n readonly config: AuthConfig;\n readonly #authenticatorMap: Map<AuthMethod, Authenticator> = new Map();\n readonly #providerMap: Map<string, AuthProvider> = new Map();\n #initialized = false;\n\n constructor(options: AuthManagerOptions = {}) {\n const authenticators = options.authenticators ?? [];\n const providers = options.providers ?? [];\n\n // Merge providers into authenticators list for the config\n const allAuthenticators = [...authenticators, ...providers];\n\n this.config = {\n required: options.required ?? false,\n authenticators: allAuthenticators,\n oauth2MetadataUrl: options.oauth2MetadataUrl,\n jwksUrl: options.jwksUrl,\n realm: options.realm,\n bypassForTransports: options.bypassForTransports,\n };\n\n // Build method -> authenticator map\n for (const authenticator of allAuthenticators) {\n for (const method of authenticator.methods) {\n if (this.#authenticatorMap.has(method)) {\n console.warn(\n `[AuthManager] Multiple authenticators registered for method '${method}'. ` +\n `Using the first one.`\n );\n continue;\n }\n this.#authenticatorMap.set(method, authenticator);\n }\n }\n\n // Build provider map (by providerId and by method)\n const registerProvider = (provider: AuthProvider) => {\n this.#providerMap.set(provider.providerId, provider);\n for (const method of provider.methods) {\n this.#providerMap.set(`method:${method}`, provider);\n }\n };\n\n for (const provider of providers) {\n registerProvider(provider);\n }\n\n // Auto-detect providers in the authenticators array\n for (const auth of authenticators) {\n if (isAuthProvider(auth)) {\n registerProvider(auth);\n }\n }\n }\n\n /**\n * Get all supported authentication methods.\n */\n get supportedMethods(): AuthMethod[] {\n return Array.from(this.#authenticatorMap.keys());\n }\n\n /**\n * Get server auth capabilities for advertising to clients.\n */\n getCapabilities(): ServerAuthCapabilities {\n return {\n methods: this.supportedMethods,\n required: this.config.required,\n oauth2MetadataUrl: this.config.oauth2MetadataUrl,\n jwksUrl: this.config.jwksUrl,\n realm: this.config.realm,\n };\n }\n\n /**\n * Authenticate credentials.\n */\n async authenticate(\n credentials: AuthCredentials,\n context: AuthContext\n ): Promise<AuthResult> {\n // Check if method is supported\n const authenticator = this.#authenticatorMap.get(credentials.method);\n\n if (!authenticator) {\n return {\n success: false,\n error: {\n code: 'method_not_supported',\n message: `Authentication method '${credentials.method}' is not supported. ` +\n `Supported methods: ${this.supportedMethods.join(', ')}`,\n },\n };\n }\n\n // Delegate to the authenticator\n try {\n return await authenticator.authenticate(credentials, context);\n } catch (error) {\n // Wrap unexpected errors\n console.error('[AuthManager] Authentication error:', error);\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: error instanceof Error ? error.message : 'Authentication failed',\n },\n };\n }\n }\n\n /**\n * Check if auth should be bypassed for a given context.\n */\n shouldBypass(context: AuthContext): boolean {\n // If auth not required, always bypass\n if (!this.config.required) {\n return true;\n }\n\n // Check transport-based bypass\n if (context.transportType && this.config.bypassForTransports) {\n return this.config.bypassForTransports[context.transportType] === true;\n }\n\n return false;\n }\n\n /**\n * Get an AuthProvider by providerId or auth method.\n */\n getProvider(methodOrProviderId: string): AuthProvider | undefined {\n return this.#providerMap.get(methodOrProviderId) ??\n this.#providerMap.get(`method:${methodOrProviderId}`);\n }\n\n /**\n * Get capability mapping for a provider-authenticated principal.\n * Returns undefined if the auth method is not backed by a provider.\n */\n getCapabilityMapping(\n method: string,\n principal: AuthPrincipal,\n providerData: unknown\n ): CapabilityMapping | undefined {\n const provider = this.#providerMap.get(`method:${method}`);\n if (!provider?.mapCapabilities) return undefined;\n return provider.mapCapabilities(principal, providerData);\n }\n\n /**\n * Delegate credentials for a spawned child agent.\n * Uses the primary (first) provider from the session.\n */\n async delegateForSpawn(\n session: ServerSession,\n spawnRequest: SpawnDelegationRequest\n ): Promise<DelegatedCredentials | undefined> {\n if (!session.providers) return undefined;\n\n const entries = Object.entries(session.providers);\n if (entries.length === 0) return undefined;\n\n const [providerId, { principal, providerData }] = entries[0];\n const provider = this.#providerMap.get(providerId);\n if (!provider?.delegateForSpawn) return undefined;\n\n return provider.delegateForSpawn(principal, providerData, spawnRequest);\n }\n\n /**\n * Initialize all authenticators.\n */\n async initialize(): Promise<void> {\n if (this.#initialized) {\n return;\n }\n\n const initPromises = this.config.authenticators\n .filter((auth) => auth.initialize)\n .map((auth) => auth.initialize!());\n\n await Promise.all(initPromises);\n this.#initialized = true;\n }\n\n /**\n * Shutdown all authenticators.\n */\n async shutdown(): Promise<void> {\n const shutdownPromises = this.config.authenticators\n .filter((auth) => auth.shutdown)\n .map((auth) => auth.shutdown!());\n\n await Promise.all(shutdownPromises);\n this.#initialized = false;\n }\n}\n\n/**\n * Create an AuthManager with the given options.\n */\nexport function createAuthManager(options?: AuthManagerOptions): AuthManager {\n return new AuthManagerImpl(options);\n}\n","/**\n * Capability intersection logic for auth providers.\n *\n * When a provider maps external permissions to MAP capabilities,\n * the result is intersected with server defaults using most-restrictive (AND) logic.\n * If either side denies a capability, the result is denied.\n */\n\nimport type {\n ParticipantCapabilities,\n AgentPermissions,\n AgentVisibilityRule,\n ScopeVisibilityRule,\n StructureVisibilityRule,\n AgentMessagingRule,\n ScopeMessagingRule,\n AgentAcceptanceRule,\n ClientAcceptanceRule,\n SystemAcceptanceRule,\n} from '../../types';\n\n/**\n * Boolean AND that treats undefined as \"no opinion\" (permissive).\n * - If either is explicitly false → false\n * - If both are true → true\n * - If one is true and the other undefined → true\n * - If both undefined → undefined\n */\nexport function and(a?: boolean, b?: boolean): boolean | undefined {\n if (a === false || b === false) return false;\n if (a === true && b === true) return true;\n if (a === true) return true;\n if (b === true) return true;\n return undefined;\n}\n\n/**\n * Intersect two ParticipantCapabilities using most-restrictive (AND) logic.\n * If either side denies a capability, the result is denied.\n *\n * Server-config capabilities (mail, streaming, protocols) pass through from base unchanged.\n */\nexport function intersectCapabilities(\n base: ParticipantCapabilities,\n overlay: Partial<ParticipantCapabilities>\n): ParticipantCapabilities {\n return {\n observation: (base.observation || overlay.observation) ? {\n canObserve: and(base.observation?.canObserve, overlay.observation?.canObserve),\n canQuery: and(base.observation?.canQuery, overlay.observation?.canQuery),\n } : undefined,\n messaging: (base.messaging || overlay.messaging) ? {\n canSend: and(base.messaging?.canSend, overlay.messaging?.canSend),\n canReceive: and(base.messaging?.canReceive, overlay.messaging?.canReceive),\n canBroadcast: and(base.messaging?.canBroadcast, overlay.messaging?.canBroadcast),\n } : undefined,\n lifecycle: (base.lifecycle || overlay.lifecycle) ? {\n canSpawn: and(base.lifecycle?.canSpawn, overlay.lifecycle?.canSpawn),\n canRegister: and(base.lifecycle?.canRegister, overlay.lifecycle?.canRegister),\n canUnregister: and(base.lifecycle?.canUnregister, overlay.lifecycle?.canUnregister),\n canSteer: and(base.lifecycle?.canSteer, overlay.lifecycle?.canSteer),\n canStop: and(base.lifecycle?.canStop, overlay.lifecycle?.canStop),\n } : undefined,\n scopes: (base.scopes || overlay.scopes) ? {\n canCreateScopes: and(base.scopes?.canCreateScopes, overlay.scopes?.canCreateScopes),\n canManageScopes: and(base.scopes?.canManageScopes, overlay.scopes?.canManageScopes),\n } : undefined,\n federation: (base.federation || overlay.federation) ? {\n canFederate: and(base.federation?.canFederate, overlay.federation?.canFederate),\n } : undefined,\n // Server-config capabilities pass through unchanged\n mail: base.mail,\n streaming: base.streaming,\n protocols: base.protocols,\n acp: base.acp,\n };\n}\n\n// Restrictiveness ordering for rule-based permission types.\n// Lower index = more restrictive.\nconst VISIBILITY_ORDER: readonly string[] = ['direct', 'hierarchy', 'scoped', 'all'];\nconst SCOPE_VISIBILITY_ORDER: readonly string[] = ['member', 'all'];\nconst STRUCTURE_ORDER: readonly string[] = ['none', 'local', 'full'];\nconst MESSAGING_ORDER: readonly string[] = ['direct', 'hierarchy', 'scoped', 'all'];\nconst SCOPE_MESSAGING_ORDER: readonly string[] = ['member', 'all'];\nconst ACCEPTANCE_ORDER: readonly string[] = ['none', 'all'];\n\n/**\n * Pick the more restrictive of two rule values.\n * If either is an object (explicit include list), it wins as more restrictive than any string rule.\n * If both are strings, the one with lower index in the ordering wins.\n */\nfunction moreRestrictiveRule<T extends string | { include: unknown[] }>(\n a: T | undefined,\n b: T | undefined,\n order: readonly string[]\n): T | undefined {\n if (a === undefined) return b;\n if (b === undefined) return a;\n\n // Object rules ({ include: [...] }) are most restrictive\n if (typeof a === 'object') return a;\n if (typeof b === 'object') return b;\n\n const aIdx = order.indexOf(a as string);\n const bIdx = order.indexOf(b as string);\n\n // Unknown values are treated as least restrictive\n const aEff = aIdx === -1 ? order.length : aIdx;\n const bEff = bIdx === -1 ? order.length : bIdx;\n\n return aEff <= bEff ? a : b;\n}\n\n/**\n * Intersect two AgentPermissions using most-restrictive logic.\n * For rule-based fields, takes the more restrictive rule.\n */\nexport function intersectAgentPermissions(\n base: AgentPermissions,\n overlay: Partial<AgentPermissions>\n): AgentPermissions {\n return {\n canSee: (base.canSee || overlay.canSee) ? {\n agents: moreRestrictiveRule<AgentVisibilityRule>(\n base.canSee?.agents, overlay.canSee?.agents, VISIBILITY_ORDER\n ),\n scopes: moreRestrictiveRule<ScopeVisibilityRule>(\n base.canSee?.scopes, overlay.canSee?.scopes, SCOPE_VISIBILITY_ORDER\n ),\n structure: moreRestrictiveRule<StructureVisibilityRule>(\n base.canSee?.structure, overlay.canSee?.structure, STRUCTURE_ORDER\n ) as StructureVisibilityRule | undefined,\n } : undefined,\n canMessage: (base.canMessage || overlay.canMessage) ? {\n agents: moreRestrictiveRule<AgentMessagingRule>(\n base.canMessage?.agents, overlay.canMessage?.agents, MESSAGING_ORDER\n ),\n scopes: moreRestrictiveRule<ScopeMessagingRule>(\n base.canMessage?.scopes, overlay.canMessage?.scopes, SCOPE_MESSAGING_ORDER\n ),\n } : undefined,\n acceptsFrom: (base.acceptsFrom || overlay.acceptsFrom) ? {\n agents: moreRestrictiveRule<AgentAcceptanceRule>(\n base.acceptsFrom?.agents, overlay.acceptsFrom?.agents, ACCEPTANCE_ORDER\n ),\n clients: moreRestrictiveRule<ClientAcceptanceRule>(\n base.acceptsFrom?.clients, overlay.acceptsFrom?.clients, ACCEPTANCE_ORDER\n ),\n systems: moreRestrictiveRule<SystemAcceptanceRule>(\n base.acceptsFrom?.systems, overlay.acceptsFrom?.systems, ACCEPTANCE_ORDER\n ),\n } : undefined,\n };\n}\n","/**\n * Authentication middleware for RouterConnection\n *\n * Integrates AuthManager with the middleware chain.\n */\n\nimport type { Middleware } from '../types';\nimport type { AuthManager, AuthContext } from './types';\nimport type { AuthCredentials } from '../../types';\n\n/**\n * JSON-RPC error codes for auth errors.\n */\nexport const AUTH_ERRORS = {\n UNAUTHORIZED: -32001,\n FORBIDDEN: -32003,\n} as const;\n\n/**\n * Authentication error.\n */\nexport class AuthenticationError extends Error {\n readonly code: number;\n readonly authErrorCode: string;\n\n constructor(message: string, authErrorCode: string = 'auth_required') {\n super(message);\n this.name = 'AuthenticationError';\n this.code = AUTH_ERRORS.UNAUTHORIZED;\n this.authErrorCode = authErrorCode;\n }\n}\n\n/**\n * Options for auth middleware.\n */\nexport interface AuthMiddlewareOptions {\n /**\n * Methods that don't require authentication.\n * By default, map/connect is allowed (it handles its own auth).\n */\n exemptMethods?: string[];\n\n /**\n * Extract auth context from handler context.\n * Override this if you have custom context with transport info.\n */\n getAuthContext?: (ctx: unknown) => AuthContext;\n}\n\n/**\n * Create an authentication middleware.\n *\n * This middleware checks if the session is authenticated before\n * allowing access to protected methods.\n *\n * @param authManager - The AuthManager to use for auth checks\n * @param options - Middleware options\n * @returns Middleware function\n *\n * @example\n * ```typescript\n * const server = new MAPServer({\n * middleware: [\n * authMiddleware(authManager),\n * ],\n * });\n * ```\n */\nexport function authMiddleware(\n authManager: AuthManager,\n options: AuthMiddlewareOptions = {}\n): Middleware {\n const exemptMethods = new Set(options.exemptMethods ?? [\n 'map/connect',\n 'map/authenticate',\n ]);\n\n return async (method, params, ctx, next) => {\n // Allow exempt methods\n if (exemptMethods.has(method)) {\n return next();\n }\n\n // Check if session has a principal (is authenticated)\n const session = ctx.session as {\n principal?: unknown;\n metadata?: { transportType?: string };\n } | undefined;\n\n if (!session?.principal) {\n // Auth required but session not authenticated\n if (authManager.config.required) {\n // Check if auth should be bypassed for this transport\n const authContext: AuthContext = options.getAuthContext\n ? options.getAuthContext(ctx)\n : { transportType: session?.metadata?.transportType };\n\n if (!authManager.shouldBypass(authContext)) {\n throw new AuthenticationError(\n 'Authentication required',\n 'auth_required'\n );\n }\n }\n }\n\n return next();\n };\n}\n\n/**\n * Create a middleware that logs authentication events.\n */\nexport function authLoggingMiddleware(\n logger: Pick<Console, 'log' | 'warn'> = console\n): Middleware {\n return async (method, _params, ctx, next) => {\n const session = ctx.session as {\n id?: string;\n principal?: { id?: string };\n } | undefined;\n\n const principalId = session?.principal?.id ?? 'anonymous';\n const sessionId = session?.id ?? 'unknown';\n\n logger.log(`[AUTH] ${principalId} (${sessionId}) -> ${method}`);\n\n return next();\n };\n}\n","/**\n * NoAuthAuthenticator - For trusted local connections\n *\n * Allows connections without credentials. Use for:\n * - Local subprocess agents (stdio)\n * - Development/testing\n * - Behind a trusted proxy that handles auth\n */\n\nimport type { AuthCredentials, AuthResult } from '../../../types';\nimport type { Authenticator, AuthContext, AuthenticatorOptions } from '../types';\n\nexport interface NoAuthOptions extends AuthenticatorOptions {\n /**\n * Default principal ID for anonymous connections.\n * @default 'anonymous'\n */\n defaultPrincipalId?: string;\n\n /**\n * Additional claims to include for anonymous principals.\n */\n defaultClaims?: Record<string, unknown>;\n}\n\n/**\n * NoAuthAuthenticator - Allows unauthenticated connections.\n *\n * @example\n * ```typescript\n * const authenticator = new NoAuthAuthenticator({\n * defaultPrincipalId: 'local-agent',\n * });\n * ```\n */\nexport class NoAuthAuthenticator implements Authenticator {\n readonly methods = ['none'] as const;\n readonly #options: NoAuthOptions;\n\n constructor(options: NoAuthOptions = {}) {\n this.#options = options;\n }\n\n async authenticate(\n _credentials: AuthCredentials,\n _context: AuthContext\n ): Promise<AuthResult> {\n return {\n success: true,\n principal: {\n id: this.#options.defaultPrincipalId ?? 'anonymous',\n claims: this.#options.defaultClaims,\n },\n };\n }\n}\n","/**\n * APIKeyAuthenticator - Simple API key authentication\n *\n * Validates API keys against a user-provided validator function.\n */\n\nimport type { AuthCredentials, AuthResult } from '../../../types';\nimport type { Authenticator, AuthContext, AuthenticatorOptions } from '../types';\n\n/**\n * Result of API key validation.\n */\nexport interface APIKeyValidationResult {\n /** Is the key valid? */\n valid: boolean;\n /** Principal ID for this key */\n principalId?: string;\n /** Additional metadata/claims for this key */\n metadata?: Record<string, unknown>;\n /** Error message if invalid */\n error?: string;\n}\n\n/**\n * Function to validate an API key.\n */\nexport type APIKeyValidator = (\n key: string,\n context: AuthContext\n) => Promise<APIKeyValidationResult> | APIKeyValidationResult;\n\nexport interface APIKeyAuthenticatorOptions extends AuthenticatorOptions {\n /**\n * Function to validate API keys.\n * Must return validation result with principal info.\n */\n validateKey: APIKeyValidator;\n\n /**\n * Optional: Extract key from credential string.\n * By default, the entire credential is used as the key.\n *\n * @example Strip 'Bearer ' prefix\n * ```typescript\n * extractKey: (credential) => credential.replace(/^Bearer\\s+/i, '')\n * ```\n */\n extractKey?: (credential: string) => string;\n}\n\n/**\n * APIKeyAuthenticator - Validates API keys.\n *\n * @example With database lookup\n * ```typescript\n * const authenticator = new APIKeyAuthenticator({\n * validateKey: async (key) => {\n * const record = await db.apiKeys.findByHash(hash(key));\n * if (!record || record.revoked) {\n * return { valid: false, error: 'Invalid or revoked API key' };\n * }\n * return {\n * valid: true,\n * principalId: record.ownerId,\n * metadata: { scopes: record.scopes },\n * };\n * },\n * });\n * ```\n *\n * @example With static keys (for testing)\n * ```typescript\n * const validKeys = new Map([\n * ['test-key-1', { principalId: 'user-1' }],\n * ['test-key-2', { principalId: 'user-2' }],\n * ]);\n *\n * const authenticator = new APIKeyAuthenticator({\n * validateKey: (key) => {\n * const record = validKeys.get(key);\n * return record\n * ? { valid: true, ...record }\n * : { valid: false, error: 'Unknown API key' };\n * },\n * });\n * ```\n */\nexport class APIKeyAuthenticator implements Authenticator {\n readonly methods = ['api-key'] as const;\n readonly #options: APIKeyAuthenticatorOptions;\n\n constructor(options: APIKeyAuthenticatorOptions) {\n if (!options.validateKey) {\n throw new Error('APIKeyAuthenticator requires a validateKey function');\n }\n this.#options = options;\n }\n\n async authenticate(\n credentials: AuthCredentials,\n context: AuthContext\n ): Promise<AuthResult> {\n const rawCredential = credentials.credential;\n\n if (!rawCredential) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'API key is required',\n },\n };\n }\n\n // Extract key (optionally transform the credential)\n const key = this.#options.extractKey\n ? this.#options.extractKey(rawCredential)\n : rawCredential;\n\n if (!key) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'API key is required',\n },\n };\n }\n\n // Validate the key\n try {\n const result = await this.#options.validateKey(key, context);\n\n if (!result.valid) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: result.error ?? 'Invalid API key',\n },\n };\n }\n\n return {\n success: true,\n principal: {\n id: result.principalId ?? 'api-key-user',\n claims: result.metadata,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: error instanceof Error ? error.message : 'API key validation failed',\n },\n };\n }\n }\n}\n\n/**\n * Create a simple in-memory API key authenticator for testing.\n *\n * @param keys - Map of API key -> principal ID\n * @returns APIKeyAuthenticator instance\n *\n * @example\n * ```typescript\n * const authenticator = createSimpleAPIKeyAuthenticator({\n * 'test-key-1': 'user-1',\n * 'test-key-2': 'user-2',\n * });\n * ```\n */\nexport function createSimpleAPIKeyAuthenticator(\n keys: Record<string, string>\n): APIKeyAuthenticator {\n const keyMap = new Map(Object.entries(keys));\n\n return new APIKeyAuthenticator({\n validateKey: (key) => {\n const principalId = keyMap.get(key);\n return principalId\n ? { valid: true, principalId }\n : { valid: false, error: 'Unknown API key' };\n },\n });\n}\n","/**\n * JWTAuthenticator - JWT/Bearer token authentication\n *\n * Validates JWT tokens using JWKS (JSON Web Key Set) or static keys.\n * Supports RS256, RS384, RS512, ES256, ES384, ES512, and HS256 algorithms.\n *\n * Requires the 'jose' package: npm install jose\n */\n\nimport type { AuthCredentials, AuthResult } from '../../../types';\nimport type { Authenticator, AuthContext, AuthenticatorOptions, MAPJWTClaims } from '../types';\n\n/**\n * Options for JWTAuthenticator.\n */\nexport interface JWTAuthenticatorOptions extends AuthenticatorOptions {\n /**\n * JWKS URL for fetching public keys.\n * Keys are cached and refreshed automatically.\n *\n * @example 'https://auth.example.com/.well-known/jwks.json'\n */\n jwksUrl?: string;\n\n /**\n * Static JWKS (JSON Web Key Set) if not using a URL.\n * Use this for testing or when keys don't change.\n */\n jwks?: JsonWebKeySet;\n\n /**\n * Symmetric secret for HS256 tokens.\n * Only use this for testing or when tokens are issued by this server.\n */\n secret?: string | Uint8Array;\n\n /**\n * Expected token issuer (iss claim).\n * If provided, tokens with different issuers are rejected.\n */\n issuer?: string | string[];\n\n /**\n * Expected audience (aud claim).\n * If provided, tokens without this audience are rejected.\n */\n audience?: string | string[];\n\n /**\n * Allowed algorithms.\n * @default ['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512']\n */\n algorithms?: string[];\n\n /**\n * Clock tolerance in seconds for exp/nbf validation.\n * @default 60\n */\n clockTolerance?: number;\n\n /**\n * Custom claims validation function.\n * Called after standard validation passes.\n */\n validateClaims?: (claims: MAPJWTClaims) => boolean | Promise<boolean>;\n\n /**\n * Transform claims to principal.\n * By default uses 'sub' as principal ID and 'exp' for expiresAt.\n */\n claimsToPrincipal?: (claims: MAPJWTClaims) => {\n id: string;\n issuer?: string;\n claims?: Record<string, unknown>;\n /** Token expiration timestamp (Unix ms) */\n expiresAt?: number;\n };\n\n /**\n * JWKS cache duration in milliseconds.\n * @default 600000 (10 minutes)\n */\n jwksCacheDuration?: number;\n}\n\n/**\n * JSON Web Key Set structure.\n */\nexport interface JsonWebKeySet {\n keys: JsonWebKey[];\n}\n\n// Lazy-loaded jose module\nlet joseModule: typeof import('jose') | null = null;\n\nasync function getJose(): Promise<typeof import('jose')> {\n if (!joseModule) {\n try {\n joseModule = await import('jose');\n } catch {\n throw new Error(\n 'JWTAuthenticator requires the \"jose\" package. Install it with: npm install jose'\n );\n }\n }\n return joseModule;\n}\n\n/**\n * JWTAuthenticator - Validates JWT bearer tokens.\n *\n * @example With JWKS URL (recommended for production)\n * ```typescript\n * const authenticator = new JWTAuthenticator({\n * jwksUrl: 'https://auth.example.com/.well-known/jwks.json',\n * issuer: 'https://auth.example.com',\n * audience: 'map-server-prod',\n * });\n * ```\n *\n * @example With static secret (for testing)\n * ```typescript\n * const authenticator = new JWTAuthenticator({\n * secret: 'your-256-bit-secret',\n * issuer: 'test-issuer',\n * });\n * ```\n *\n * @example With custom claims validation\n * ```typescript\n * const authenticator = new JWTAuthenticator({\n * jwksUrl: '...',\n * validateClaims: (claims) => {\n * // Require specific scope\n * const scopes = claims.scope?.split(' ') ?? [];\n * return scopes.includes('map:access');\n * },\n * });\n * ```\n */\nexport class JWTAuthenticator implements Authenticator {\n readonly methods = ['bearer'] as const;\n readonly #options: JWTAuthenticatorOptions;\n #jwksCache: { keys: unknown; fetchedAt: number } | null = null;\n\n constructor(options: JWTAuthenticatorOptions = {}) {\n // Validate options\n if (!options.jwksUrl && !options.jwks && !options.secret) {\n throw new Error(\n 'JWTAuthenticator requires one of: jwksUrl, jwks, or secret'\n );\n }\n\n this.#options = {\n algorithms: ['RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512'],\n clockTolerance: 60,\n jwksCacheDuration: 600000, // 10 minutes\n ...options,\n };\n\n // If using secret, allow HS256\n if (options.secret) {\n this.#options.algorithms = ['HS256', ...(this.#options.algorithms ?? [])];\n }\n }\n\n async initialize(): Promise<void> {\n // Pre-fetch JWKS if using URL\n if (this.#options.jwksUrl) {\n await this.#fetchJWKS();\n }\n }\n\n async authenticate(\n credentials: AuthCredentials,\n _context: AuthContext\n ): Promise<AuthResult> {\n const token = credentials.credential;\n\n if (!token) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Bearer token is required',\n },\n };\n }\n\n try {\n const jose = await getJose();\n\n // Get the key source\n const keySource = await this.#getKeySource(jose);\n\n // Verify the token\n const { payload } = await jose.jwtVerify(token, keySource, {\n issuer: this.#options.issuer,\n audience: this.#options.audience,\n algorithms: this.#options.algorithms,\n clockTolerance: this.#options.clockTolerance,\n });\n\n const claims = payload as MAPJWTClaims;\n\n // Custom claims validation\n if (this.#options.validateClaims) {\n const valid = await this.#options.validateClaims(claims);\n if (!valid) {\n return {\n success: false,\n error: {\n code: 'insufficient_scope',\n message: 'Token claims validation failed',\n },\n };\n }\n }\n\n // Transform claims to principal\n const principal = this.#options.claimsToPrincipal\n ? this.#options.claimsToPrincipal(claims)\n : this.#defaultClaimsToPrincipal(claims);\n\n return {\n success: true,\n principal,\n };\n } catch (error) {\n return this.#handleJoseError(error);\n }\n }\n\n /**\n * Get the key source for verification.\n */\n async #getKeySource(jose: typeof import('jose')): Promise<\n ReturnType<typeof jose.createRemoteJWKSet> |\n ReturnType<typeof jose.createLocalJWKSet> |\n Uint8Array\n > {\n // Secret key (HS256)\n if (this.#options.secret) {\n return typeof this.#options.secret === 'string'\n ? new TextEncoder().encode(this.#options.secret)\n : this.#options.secret;\n }\n\n // Static JWKS\n if (this.#options.jwks) {\n return jose.createLocalJWKSet(this.#options.jwks as jose.JSONWebKeySet);\n }\n\n // Remote JWKS\n if (this.#options.jwksUrl) {\n return jose.createRemoteJWKSet(new URL(this.#options.jwksUrl), {\n cacheMaxAge: this.#options.jwksCacheDuration,\n });\n }\n\n throw new Error('No key source configured');\n }\n\n /**\n * Pre-fetch JWKS for faster first authentication.\n */\n async #fetchJWKS(): Promise<void> {\n if (!this.#options.jwksUrl) return;\n\n try {\n const response = await fetch(this.#options.jwksUrl);\n if (!response.ok) {\n console.warn(`[JWTAuthenticator] Failed to fetch JWKS: ${response.status}`);\n return;\n }\n\n const jwks = await response.json();\n this.#jwksCache = {\n keys: jwks,\n fetchedAt: Date.now(),\n };\n } catch (error) {\n console.warn('[JWTAuthenticator] Failed to fetch JWKS:', error);\n }\n }\n\n /**\n * Default claims to principal transformation.\n */\n #defaultClaimsToPrincipal(claims: MAPJWTClaims): {\n id: string;\n issuer?: string;\n claims?: Record<string, unknown>;\n expiresAt?: number;\n } {\n // Convert exp (seconds since epoch) to expiresAt (ms since epoch)\n const expiresAt = claims.exp ? claims.exp * 1000 : undefined;\n\n return {\n id: claims.sub ?? 'unknown',\n issuer: claims.iss,\n claims: {\n scope: claims.scope,\n 'map:capabilities': claims['map:capabilities'],\n // Include other useful claims\n aud: claims.aud,\n exp: claims.exp,\n iat: claims.iat,\n },\n expiresAt,\n };\n }\n\n /**\n * Handle jose library errors.\n */\n #handleJoseError(error: unknown): AuthResult {\n const errorName = error instanceof Error ? error.name : 'UnknownError';\n const errorMessage = error instanceof Error ? error.message : 'Token validation failed';\n\n // Map jose errors to auth error codes\n switch (errorName) {\n case 'JWTExpired':\n return {\n success: false,\n error: {\n code: 'expired',\n message: 'Token has expired',\n },\n };\n\n case 'JWTClaimValidationFailed':\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `Claim validation failed: ${errorMessage}`,\n },\n };\n\n case 'JWSSignatureVerificationFailed':\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Token signature verification failed',\n },\n };\n\n case 'JWKSNoMatchingKey':\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'No matching key found for token',\n },\n };\n\n default:\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: errorMessage,\n },\n };\n }\n }\n}\n","/**\n * MTLSAuthenticator - Mutual TLS (client certificate) authentication\n *\n * Authentication is performed at the transport layer via client certificates.\n * This authenticator validates that mTLS was performed and extracts principal\n * information from the certificate.\n */\n\nimport type { AuthCredentials, AuthResult } from '../../../types';\nimport type { Authenticator, AuthContext, AuthenticatorOptions } from '../types';\n\n/**\n * Options for MTLSAuthenticator.\n */\nexport interface MTLSAuthenticatorOptions extends AuthenticatorOptions {\n /**\n * Extract principal ID from certificate subject.\n * By default, uses the Common Name (CN).\n *\n * @param subject - Certificate subject string (e.g., \"CN=agent-1,O=MyOrg\")\n * @returns Principal ID\n */\n extractPrincipalId?: (subject: string) => string;\n\n /**\n * Validate the certificate.\n * By default, trusts any valid certificate (TLS already validated it).\n *\n * @param cert - Certificate info from context\n * @returns true if valid, false or error message if invalid\n */\n validateCertificate?: (cert: NonNullable<AuthContext['tlsCertificate']>) =>\n boolean | string | Promise<boolean | string>;\n\n /**\n * Allowed certificate fingerprints.\n * If provided, only certificates with matching fingerprints are accepted.\n */\n allowedFingerprints?: string[];\n\n /**\n * Allowed certificate issuers.\n * If provided, only certificates from these issuers are accepted.\n */\n allowedIssuers?: string[];\n}\n\n/**\n * MTLSAuthenticator - Uses client certificate for authentication.\n *\n * The TLS layer must be configured to request and verify client certificates.\n * This authenticator reads the certificate info from the AuthContext and\n * extracts the principal identity.\n *\n * @example Basic usage\n * ```typescript\n * const authenticator = new MTLSAuthenticator();\n *\n * // When accepting connections, provide TLS cert info in context:\n * const context: AuthContext = {\n * transportType: 'websocket',\n * tlsCertificate: {\n * subject: 'CN=agent-worker-01,O=MyOrg',\n * issuer: 'CN=MyCA,O=MyOrg',\n * fingerprint: 'sha256:abc123...',\n * validFrom: new Date(),\n * validTo: new Date(),\n * },\n * };\n * ```\n *\n * @example With fingerprint allowlist\n * ```typescript\n * const authenticator = new MTLSAuthenticator({\n * allowedFingerprints: [\n * 'sha256:abc123...',\n * 'sha256:def456...',\n * ],\n * });\n * ```\n */\nexport class MTLSAuthenticator implements Authenticator {\n readonly methods = ['mtls'] as const;\n readonly #options: MTLSAuthenticatorOptions;\n\n constructor(options: MTLSAuthenticatorOptions = {}) {\n this.#options = options;\n }\n\n async authenticate(\n _credentials: AuthCredentials,\n context: AuthContext\n ): Promise<AuthResult> {\n // mTLS requires certificate info in context\n const cert = context.tlsCertificate;\n\n if (!cert) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Client certificate not provided. mTLS authentication requires a valid client certificate.',\n },\n };\n }\n\n // Check certificate validity period\n const now = new Date();\n if (now < cert.validFrom) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Client certificate is not yet valid',\n },\n };\n }\n\n if (now > cert.validTo) {\n return {\n success: false,\n error: {\n code: 'expired',\n message: 'Client certificate has expired',\n },\n };\n }\n\n // Check fingerprint allowlist\n if (this.#options.allowedFingerprints?.length) {\n if (!this.#options.allowedFingerprints.includes(cert.fingerprint)) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Client certificate fingerprint not in allowlist',\n },\n };\n }\n }\n\n // Check issuer allowlist\n if (this.#options.allowedIssuers?.length) {\n if (!this.#options.allowedIssuers.includes(cert.issuer)) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Client certificate issuer not in allowlist',\n },\n };\n }\n }\n\n // Custom certificate validation\n if (this.#options.validateCertificate) {\n const validationResult = await this.#options.validateCertificate(cert);\n if (validationResult !== true) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: typeof validationResult === 'string'\n ? validationResult\n : 'Certificate validation failed',\n },\n };\n }\n }\n\n // Extract principal ID\n const principalId = this.#options.extractPrincipalId\n ? this.#options.extractPrincipalId(cert.subject)\n : this.#extractCN(cert.subject);\n\n return {\n success: true,\n principal: {\n id: principalId,\n issuer: cert.issuer,\n claims: {\n fingerprint: cert.fingerprint,\n subject: cert.subject,\n validFrom: cert.validFrom.toISOString(),\n validTo: cert.validTo.toISOString(),\n },\n },\n };\n }\n\n /**\n * Extract Common Name (CN) from certificate subject.\n */\n #extractCN(subject: string): string {\n // Parse \"CN=value,O=org,...\" format\n const match = subject.match(/CN=([^,]+)/i);\n return match ? match[1] : subject;\n }\n}\n","/**\n * Maps agent-iam token capabilities to MAP's ParticipantCapabilities and AgentPermissions.\n *\n * Priority:\n * 1. agentCapabilities field on token (explicit override)\n * 2. Scope-based inference from token.scopes\n */\n\nimport type { ParticipantCapabilities, AgentPermissions } from '../../../types';\nimport type { CapabilityMapping } from '../types';\n\n/**\n * Minimal AgentToken shape consumed by the mapper.\n * Avoids hard dependency on agent-iam types at the module level.\n */\nexport interface MappableToken {\n scopes: string[];\n agentCapabilities?: {\n canSpawn?: boolean;\n canFederate?: boolean;\n canCreateScopes?: boolean;\n visibility?: 'public' | 'parent-only' | 'scope' | 'system';\n canMessage?: boolean;\n canReceive?: boolean;\n canObserve?: boolean;\n custom?: Record<string, boolean>;\n };\n}\n\nexport interface AgentIAMCapabilityMapperOptions {\n /** Custom scope-to-capability mappings (overrides defaults) */\n scopeMap?: Record<string, string>;\n}\n\n/**\n * Maps agent-iam token capabilities to MAP's capability model.\n */\nexport class AgentIAMCapabilityMapper {\n constructor(_options: AgentIAMCapabilityMapperOptions = {}) {}\n\n /**\n * Map a token to a CapabilityMapping.\n */\n map(token: MappableToken): CapabilityMapping {\n const participantCapabilities = this.mapToParticipantCapabilities(token);\n const defaultAgentPermissions = this.mapToAgentPermissions(token);\n\n return {\n participantCapabilities,\n ...(defaultAgentPermissions && { defaultAgentPermissions }),\n };\n }\n\n mapToParticipantCapabilities(token: MappableToken): Partial<ParticipantCapabilities> {\n const caps = token.agentCapabilities;\n\n // If agentCapabilities is present, use it directly\n if (caps) {\n return {\n observation: {\n canObserve: caps.canObserve,\n canQuery: caps.canObserve,\n },\n messaging: {\n canSend: caps.canMessage,\n canReceive: caps.canReceive,\n canBroadcast: caps.canMessage,\n },\n lifecycle: {\n canSpawn: caps.canSpawn,\n canRegister: true,\n },\n scopes: {\n canCreateScopes: caps.canCreateScopes,\n },\n federation: {\n canFederate: caps.canFederate,\n },\n };\n }\n\n // Fall back to scope-based inference\n return this.inferFromScopes(token.scopes);\n }\n\n mapToAgentPermissions(token: MappableToken): Partial<AgentPermissions> | undefined {\n const caps = token.agentCapabilities;\n if (!caps) return undefined;\n\n const visibilityToRule: Record<string, 'all' | 'scoped' | 'hierarchy' | 'direct'> = {\n 'public': 'all',\n 'scope': 'scoped',\n 'parent-only': 'hierarchy',\n 'system': 'direct',\n };\n\n const visRule = caps.visibility ? visibilityToRule[caps.visibility] : undefined;\n\n return {\n canSee: {\n agents: visRule,\n scopes: caps.canObserve ? 'all' : 'member',\n },\n canMessage: {\n agents: caps.canMessage ? 'all' : undefined,\n },\n acceptsFrom: {\n agents: caps.canReceive ? 'all' : { include: [] },\n },\n };\n }\n\n private inferFromScopes(scopes: string[]): Partial<ParticipantCapabilities> {\n // Check for wildcard\n if (scopes.some(s => s === 'map:*' || s === '*')) {\n return {\n observation: { canObserve: true, canQuery: true },\n messaging: { canSend: true, canReceive: true, canBroadcast: true },\n lifecycle: { canSpawn: true, canRegister: true },\n scopes: { canCreateScopes: true, canManageScopes: true },\n federation: { canFederate: true },\n };\n }\n\n const result: Partial<ParticipantCapabilities> = {};\n\n for (const scope of scopes) {\n if (scope.startsWith('map:observe')) {\n result.observation = { ...result.observation, canObserve: true, canQuery: true };\n }\n if (scope.startsWith('map:send') || scope.startsWith('map:message')) {\n result.messaging = { ...result.messaging, canSend: true };\n }\n if (scope.startsWith('map:receive')) {\n result.messaging = { ...result.messaging, canReceive: true };\n }\n if (scope.startsWith('map:broadcast')) {\n result.messaging = { ...result.messaging, canBroadcast: true };\n }\n if (scope.startsWith('map:spawn')) {\n result.lifecycle = { ...result.lifecycle, canSpawn: true };\n }\n if (scope.startsWith('map:register')) {\n result.lifecycle = { ...result.lifecycle, canRegister: true };\n }\n if (scope.startsWith('map:scope:create')) {\n result.scopes = { ...result.scopes, canCreateScopes: true };\n }\n if (scope.startsWith('map:scope:manage')) {\n result.scopes = { ...result.scopes, canManageScopes: true };\n }\n if (scope.startsWith('map:federate')) {\n result.federation = { ...result.federation, canFederate: true };\n }\n }\n\n return result;\n }\n}\n","/**\n * AgentIAMProvider — AuthProvider implementation for agent-iam tokens.\n *\n * Accepts a TokenServiceLike instance via constructor injection so the\n * consumer brings their own `agent-iam` dependency (it is not bundled\n * with the MAP SDK).\n *\n * @example\n * ```typescript\n * import { TokenService } from 'agent-iam';\n * import { AgentIAMProvider } from '@multi-agent-protocol/sdk/server/auth';\n *\n * const tokenService = new TokenService(secret);\n * const provider = new AgentIAMProvider({ tokenService, systemId: 'my-system' });\n * ```\n */\n\nimport type {\n AuthMethod,\n AuthCredentials,\n AuthResult,\n AuthPrincipal,\n} from '../../../types';\nimport type {\n AuthContext,\n AuthProvider,\n CapabilityMapping,\n SpawnDelegationRequest,\n DelegatedCredentials,\n FederationContext,\n FederationResult,\n} from '../types';\nimport {\n AgentIAMCapabilityMapper,\n type AgentIAMCapabilityMapperOptions,\n type MappableToken,\n} from './agent-iam-mapper';\nimport type { AgentIAMFederationGateway } from './agent-iam-federation';\n\n// =============================================================================\n// Minimal interfaces consumed by the provider.\n// Match the agent-iam API surface without importing the package.\n// =============================================================================\n\n/**\n * Minimal token shape expected from agent-iam.\n * Extends MappableToken with fields needed for authentication.\n */\nexport interface AgentIAMToken extends MappableToken {\n agentId: string;\n parentId?: string;\n delegatable: boolean;\n maxDelegationDepth: number;\n currentDepth: number;\n expiresAt?: string;\n constraints: Record<string, unknown>;\n signature?: string;\n identity?: {\n systemId: string;\n principalId?: string;\n principalType?: 'human' | 'service' | 'agent';\n tenantId?: string;\n organizationId?: string;\n };\n federation?: {\n crossSystemAllowed: boolean;\n allowedSystems?: string[];\n originSystem?: string;\n hopCount?: number;\n maxHops?: number;\n allowFurtherFederation?: boolean;\n };\n}\n\n/**\n * Minimal TokenService interface.\n * Consumers provide an instance that satisfies this shape\n * (e.g. `new TokenService(secret)` from agent-iam).\n */\nexport interface TokenServiceLike {\n verify(token: AgentIAMToken): { valid: boolean; error?: string };\n serialize(token: AgentIAMToken): string;\n deserialize(serialized: string): AgentIAMToken;\n delegate(parent: AgentIAMToken, request: {\n agentId?: string;\n requestedScopes: string[];\n delegatable?: boolean;\n ttlMinutes?: number;\n inheritIdentity?: boolean;\n agentCapabilities?: Record<string, unknown>;\n }): AgentIAMToken;\n}\n\n// =============================================================================\n// Provider options\n// =============================================================================\n\nexport interface AgentIAMProviderOptions {\n /** A TokenService (or compatible) instance for token operations. */\n tokenService: TokenServiceLike;\n /** Expected system ID — tokens with a mismatched identity.systemId are rejected. */\n systemId?: string;\n /** Expected tenant ID — tokens with a mismatched identity.tenantId are rejected. */\n tenantId?: string;\n /** Options forwarded to the capability mapper. */\n mapperOptions?: AgentIAMCapabilityMapperOptions;\n /** Federation gateway for cross-system token verification and preparation. */\n federationGateway?: AgentIAMFederationGateway;\n}\n\n// =============================================================================\n// AgentIAMProvider\n// =============================================================================\n\nexport class AgentIAMProvider implements AuthProvider {\n readonly methods: readonly AuthMethod[] = ['x-agent-iam'];\n readonly providerId = 'agent-iam';\n\n readonly #tokenService: TokenServiceLike;\n readonly #mapper: AgentIAMCapabilityMapper;\n readonly #systemId?: string;\n readonly #tenantId?: string;\n readonly #federationGateway?: AgentIAMFederationGateway;\n\n constructor(options: AgentIAMProviderOptions) {\n this.#tokenService = options.tokenService;\n this.#systemId = options.systemId;\n this.#tenantId = options.tenantId;\n this.#mapper = new AgentIAMCapabilityMapper(options.mapperOptions);\n this.#federationGateway = options.federationGateway;\n }\n\n // ---------------------------------------------------------------------------\n // Authenticator interface\n // ---------------------------------------------------------------------------\n\n async authenticate(\n credentials: AuthCredentials,\n _context: AuthContext\n ): Promise<AuthResult> {\n const raw = credentials.credential;\n if (typeof raw !== 'string' || raw.length === 0) {\n return {\n success: false,\n error: { code: 'invalid_credentials', message: 'Missing or invalid token' },\n };\n }\n\n // Deserialize\n let token: AgentIAMToken;\n try {\n token = this.#tokenService.deserialize(raw);\n } catch {\n return {\n success: false,\n error: { code: 'invalid_credentials', message: 'Failed to deserialize token' },\n };\n }\n\n // Verify signature + expiry\n const result = this.#tokenService.verify(token);\n if (!result.valid) {\n return {\n success: false,\n error: { code: 'invalid_credentials', message: result.error ?? 'Token verification failed' },\n };\n }\n\n // Validate identity binding (if systemId/tenantId are configured)\n if (this.#systemId && token.identity?.systemId && token.identity.systemId !== this.#systemId) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `Token systemId '${token.identity.systemId}' does not match expected '${this.#systemId}'`,\n },\n };\n }\n\n if (this.#tenantId && token.identity?.tenantId && token.identity.tenantId !== this.#tenantId) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `Token tenantId '${token.identity.tenantId}' does not match expected '${this.#tenantId}'`,\n },\n };\n }\n\n // Build AuthPrincipal\n const principal: AuthPrincipal = {\n id: token.agentId,\n issuer: token.identity?.systemId ?? 'agent-iam',\n claims: {\n scopes: token.scopes,\n delegatable: token.delegatable,\n currentDepth: token.currentDepth,\n ...(token.identity?.principalId && { principalId: token.identity.principalId }),\n ...(token.identity?.principalType && { principalType: token.identity.principalType }),\n ...(token.identity?.organizationId && { organizationId: token.identity.organizationId }),\n },\n };\n\n return {\n success: true,\n principal,\n providerData: token,\n };\n }\n\n // ---------------------------------------------------------------------------\n // AuthProvider extensions\n // ---------------------------------------------------------------------------\n\n mapCapabilities(\n _principal: AuthPrincipal,\n providerData: unknown\n ): CapabilityMapping {\n return this.#mapper.map(providerData as MappableToken);\n }\n\n async delegateForSpawn(\n _parentPrincipal: AuthPrincipal,\n parentProviderData: unknown,\n spawnRequest: SpawnDelegationRequest\n ): Promise<DelegatedCredentials> {\n const parentToken = parentProviderData as AgentIAMToken;\n\n const childToken = this.#tokenService.delegate(parentToken, {\n agentId: spawnRequest.childAgentId,\n requestedScopes: spawnRequest.requestedScopes ?? parentToken.scopes,\n delegatable: true,\n ttlMinutes: spawnRequest.ttlMinutes,\n inheritIdentity: spawnRequest.inheritIdentity ?? true,\n });\n\n const serialized = this.#tokenService.serialize(childToken);\n\n return {\n method: 'x-agent-iam',\n credentials: { token: serialized },\n env: { AGENT_TOKEN: serialized },\n };\n }\n\n async handleFederatedToken(\n sourceSystemId: string,\n token: unknown,\n context: FederationContext\n ): Promise<FederationResult> {\n if (!this.#federationGateway) {\n return { allowed: false, reason: 'Federation gateway not configured' };\n }\n return this.#federationGateway.handleFederatedToken(sourceSystemId, token, context);\n }\n\n async prepareFederatedToken(\n principal: AuthPrincipal,\n providerData: unknown,\n targetSystemId: string\n ): Promise<{ token: string; allowed: boolean; reason?: string }> {\n if (!this.#federationGateway) {\n return { token: '', allowed: false, reason: 'Federation gateway not configured' };\n }\n return this.#federationGateway.prepareFederatedToken(principal, providerData, targetSystemId);\n }\n}\n","/**\n * AgentIAM Federation Gateway — cross-system token verification and preparation.\n *\n * Handles incoming federated tokens (verify with peer's signing key) and\n * prepares outgoing tokens (delegate with local key, short TTL).\n *\n * Each peer system has its own signing key, provided as a TokenServiceLike\n * instance in `peerTokenServices`.\n */\n\nimport type { AuthPrincipal } from '../../../types';\nimport type {\n FederationContext,\n FederationTrustConfig,\n FederationResult,\n} from '../types';\nimport type { TokenServiceLike, AgentIAMToken } from './agent-iam';\n\n// =============================================================================\n// Options\n// =============================================================================\n\nexport interface AgentIAMFederationGatewayOptions {\n /** Local system's TokenService (for delegating outgoing tokens). */\n localTokenService: TokenServiceLike;\n\n /** Local system identifier. */\n localSystemId: string;\n\n /**\n * TokenService instances for each trusted peer system.\n * Key: peer's systemId, Value: TokenService configured with that peer's signing key.\n */\n peerTokenServices: Record<string, TokenServiceLike>;\n\n /**\n * Per-peer trust configuration (scope mapping, max hops).\n * Key: peer's systemId, Value: trust config.\n */\n peerTrustConfigs?: Record<string, FederationTrustConfig>;\n\n /** Default TTL in minutes for federated tokens. Defaults to 60. */\n federatedTokenTTLMinutes?: number;\n\n /** Global max hops override. Defaults to 5. */\n defaultMaxHops?: number;\n}\n\n// =============================================================================\n// Federation Gateway\n// =============================================================================\n\nexport class AgentIAMFederationGateway {\n readonly #localTokenService: TokenServiceLike;\n readonly #localSystemId: string;\n readonly #peerTokenServices: Map<string, TokenServiceLike>;\n readonly #peerTrustConfigs: Map<string, FederationTrustConfig>;\n readonly #federatedTTL: number;\n readonly #defaultMaxHops: number;\n\n constructor(options: AgentIAMFederationGatewayOptions) {\n this.#localTokenService = options.localTokenService;\n this.#localSystemId = options.localSystemId;\n this.#peerTokenServices = new Map(Object.entries(options.peerTokenServices));\n this.#peerTrustConfigs = new Map(\n Object.entries(options.peerTrustConfigs ?? {}),\n );\n this.#federatedTTL = options.federatedTokenTTLMinutes ?? 60;\n this.#defaultMaxHops = options.defaultMaxHops ?? 5;\n }\n\n // ---------------------------------------------------------------------------\n // Incoming: verify a federated token from a peer system\n // ---------------------------------------------------------------------------\n\n async handleFederatedToken(\n sourceSystemId: string,\n token: unknown,\n context: FederationContext,\n ): Promise<FederationResult> {\n // 1. Look up peer TokenService\n const peerTokenService = this.#peerTokenServices.get(sourceSystemId);\n if (!peerTokenService) {\n return { allowed: false, reason: `Unknown peer system: ${sourceSystemId}` };\n }\n\n // 2. Check trusted systems list (from context)\n if (context.trustConfig?.trustedSystems) {\n if (!context.trustConfig.trustedSystems.includes(sourceSystemId)) {\n return { allowed: false, reason: 'Source system not in trusted systems list' };\n }\n }\n\n // 3. Deserialize (string) or use as-is (object)\n let deserializedToken: AgentIAMToken;\n try {\n if (typeof token === 'string') {\n deserializedToken = peerTokenService.deserialize(token);\n } else {\n deserializedToken = token as AgentIAMToken;\n }\n } catch {\n return { allowed: false, reason: 'Failed to deserialize federated token' };\n }\n\n // 4. Verify signature\n const verification = peerTokenService.verify(deserializedToken);\n if (!verification.valid) {\n return {\n allowed: false,\n reason: verification.error ?? 'Token verification failed',\n };\n }\n\n // 5. Check federation.crossSystemAllowed\n if (!deserializedToken.federation?.crossSystemAllowed) {\n return { allowed: false, reason: 'Token does not allow cross-system federation' };\n }\n\n // 6. Check allowedSystems includes local system\n if (\n deserializedToken.federation.allowedSystems &&\n !deserializedToken.federation.allowedSystems.includes(context.localSystemId)\n ) {\n return { allowed: false, reason: 'Local system not in token allowedSystems' };\n }\n\n // 7. Check hop count\n const hopCount = deserializedToken.federation.hopCount ?? 0;\n const maxHops = Math.min(\n deserializedToken.federation.maxHops ?? this.#defaultMaxHops,\n context.trustConfig?.maxHops ?? this.#defaultMaxHops,\n this.#defaultMaxHops,\n );\n if (hopCount >= maxHops) {\n return { allowed: false, reason: 'Max federation hops exceeded' };\n }\n\n // 8. Check allowFurtherFederation (only applies after the first hop)\n if (\n hopCount > 0 &&\n deserializedToken.federation.allowFurtherFederation === false\n ) {\n return { allowed: false, reason: 'Token does not allow further federation' };\n }\n\n // 9. Translate scopes\n const scopeMapping = this.#mergeScopeMapping(sourceSystemId, context);\n const translatedScopes = this.#translateScopes(\n deserializedToken.scopes,\n scopeMapping,\n );\n\n // 10. Build AuthPrincipal\n const principal: AuthPrincipal = {\n id: `federated:${sourceSystemId}:${deserializedToken.agentId}`,\n issuer: sourceSystemId,\n claims: {\n scopes: translatedScopes,\n federatedFrom: sourceSystemId,\n originSystem:\n deserializedToken.federation.originSystem ?? sourceSystemId,\n hopCount: hopCount + 1,\n originalAgentId: deserializedToken.agentId,\n ...(deserializedToken.identity?.principalId && {\n principalId: deserializedToken.identity.principalId,\n }),\n ...(deserializedToken.identity?.principalType && {\n principalType: deserializedToken.identity.principalType,\n }),\n },\n };\n\n // 11. Return success\n return {\n allowed: true,\n principal,\n providerData: deserializedToken,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Outgoing: prepare a token for use in another system\n // ---------------------------------------------------------------------------\n\n async prepareFederatedToken(\n _principal: AuthPrincipal,\n providerData: unknown,\n targetSystemId: string,\n ): Promise<{ token: string; allowed: boolean; reason?: string }> {\n // 1. Extract token\n if (!providerData) {\n return { token: '', allowed: false, reason: 'No token data available' };\n }\n const sourceToken = providerData as AgentIAMToken;\n\n // 2. Check crossSystemAllowed\n if (!sourceToken.federation?.crossSystemAllowed) {\n return {\n token: '',\n allowed: false,\n reason: 'Token does not allow cross-system federation',\n };\n }\n\n // 3. Check allowedSystems includes target\n if (\n sourceToken.federation.allowedSystems &&\n !sourceToken.federation.allowedSystems.includes(targetSystemId)\n ) {\n return {\n token: '',\n allowed: false,\n reason: 'Target system not in token allowedSystems',\n };\n }\n\n // 4. Check allowFurtherFederation (after first hop)\n const hopCount = sourceToken.federation.hopCount ?? 0;\n if (\n hopCount > 0 &&\n sourceToken.federation.allowFurtherFederation === false\n ) {\n return {\n token: '',\n allowed: false,\n reason: 'Token does not allow further federation',\n };\n }\n\n // 5. Check hop count\n const maxHops = sourceToken.federation.maxHops ?? this.#defaultMaxHops;\n if (hopCount >= maxHops) {\n return {\n token: '',\n allowed: false,\n reason: 'Max federation hops exceeded',\n };\n }\n\n // 6. Translate scopes\n const peerTrust = this.#peerTrustConfigs.get(targetSystemId);\n const translatedScopes = this.#translateScopes(\n sourceToken.scopes,\n peerTrust?.scopeMapping,\n );\n\n // 7. Delegate with short TTL\n const delegated = this.#localTokenService.delegate(sourceToken, {\n agentId: sourceToken.agentId,\n requestedScopes: translatedScopes,\n delegatable: false,\n ttlMinutes: this.#federatedTTL,\n inheritIdentity: true,\n });\n\n // 8. Set federation metadata on delegated token\n const withFederation: AgentIAMToken = {\n ...delegated,\n federation: {\n crossSystemAllowed: true,\n originSystem:\n sourceToken.federation.originSystem ?? this.#localSystemId,\n hopCount: hopCount + 1,\n maxHops,\n allowFurtherFederation:\n sourceToken.federation.allowFurtherFederation ?? false,\n allowedSystems: sourceToken.federation.allowedSystems,\n },\n };\n\n // 9. Serialize and return\n const serialized = this.#localTokenService.serialize(withFederation);\n return { token: serialized, allowed: true };\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Merge scope mappings from context trust config and per-peer trust config.\n * Context config takes precedence.\n */\n #mergeScopeMapping(\n peerSystemId: string,\n context: FederationContext,\n ): Record<string, string> | undefined {\n const peerMapping = this.#peerTrustConfigs.get(peerSystemId)?.scopeMapping;\n const contextMapping = context.trustConfig?.scopeMapping;\n\n if (!peerMapping && !contextMapping) return undefined;\n\n return { ...peerMapping, ...contextMapping };\n }\n\n /**\n * Translate scopes using prefix-based mapping.\n * Finds the longest matching prefix and replaces it.\n * Non-matching scopes pass through unchanged.\n */\n #translateScopes(\n scopes: string[],\n scopeMapping: Record<string, string> | undefined,\n ): string[] {\n if (!scopeMapping || Object.keys(scopeMapping).length === 0) {\n return scopes;\n }\n\n return scopes.map((scope) => {\n let bestMatch = '';\n let bestReplacement = '';\n\n for (const [from, to] of Object.entries(scopeMapping)) {\n if (scope.startsWith(from) && from.length > bestMatch.length) {\n bestMatch = from;\n bestReplacement = to;\n }\n }\n\n if (bestMatch) {\n return bestReplacement + scope.slice(bestMatch.length);\n }\n return scope;\n });\n }\n}\n","/**\n * DID:WBA Document Resolution\n *\n * Resolves `did:wba:<domain>:<path>` DIDs to DID Documents by fetching\n * `https://<domain>/<path>/did.json` over HTTPS.\n */\n\nimport type { DIDDocument, DIDVerificationMethod } from '../../types';\n\n/**\n * Options for the DID:WBA resolver.\n */\nexport interface DIDResolverOptions {\n /** Cache TTL for resolved DID documents in ms (default: 300000 = 5 min) */\n cacheTtlMs?: number;\n /** HTTP fetch timeout in ms (default: 10000) */\n timeoutMs?: number;\n /** Custom fetch function (for testing) */\n fetchFn?: typeof globalThis.fetch;\n}\n\n/**\n * Parsed components of a did:wba DID.\n */\nexport interface ParsedDIDWBA {\n /** The domain (e.g., \"agents.example.com\") */\n domain: string;\n /** The path segments (e.g., \"gateway\" or \"agents/worker-01\") */\n path: string;\n}\n\n/**\n * Regex patterns for private/reserved IP ranges that should be blocked\n * to prevent SSRF attacks during DID document resolution.\n */\nconst PRIVATE_IP_PATTERNS = [\n /^127\\./, // Loopback (127.0.0.0/8)\n /^10\\./, // Private Class A (10.0.0.0/8)\n /^172\\.(1[6-9]|2\\d|3[0-1])\\./, // Private Class B (172.16.0.0/12)\n /^192\\.168\\./, // Private Class C (192.168.0.0/16)\n /^169\\.254\\./, // Link-local (169.254.0.0/16, includes AWS metadata)\n /^0\\./, // \"This\" network (0.0.0.0/8)\n /^\\[::1\\]$/, // IPv6 loopback\n /^\\[fc/, // IPv6 unique local\n /^\\[fd/, // IPv6 unique local\n /^\\[fe80:/, // IPv6 link-local\n];\n\nconst BLOCKED_HOSTNAMES = [\n 'localhost',\n 'metadata.google.internal', // GCP metadata\n];\n\n/**\n * Check whether a domain/hostname is safe to fetch (i.e., not a private/reserved address).\n * Returns true if the domain appears safe, false if it looks like an internal address.\n */\nexport function isSafeDomain(domain: string): boolean {\n const lower = domain.toLowerCase();\n\n // Block known internal hostnames\n if (BLOCKED_HOSTNAMES.includes(lower)) {\n return false;\n }\n\n // Block IP address patterns (private/reserved ranges)\n for (const pattern of PRIVATE_IP_PATTERNS) {\n if (pattern.test(lower)) {\n return false;\n }\n }\n\n // Block bare IPs that aren't clearly public (must have at least one dot and a letter for a real domain)\n // This catches numeric-only entries like \"192.0.2.1\" that aren't caught above\n if (/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(lower)) {\n return false; // Block all raw IPv4 addresses — use domain names for DID resolution\n }\n\n return true;\n}\n\n/**\n * Parse a did:wba DID into its components.\n *\n * @example\n * parseDIDWBA(\"did:wba:agents.example.com:gateway\")\n * // → { domain: \"agents.example.com\", path: \"gateway\" }\n *\n * parseDIDWBA(\"did:wba:example.com:agents:worker-01\")\n * // → { domain: \"example.com\", path: \"agents/worker-01\" }\n */\nexport function parseDIDWBA(did: string): ParsedDIDWBA {\n if (!did.startsWith('did:wba:')) {\n throw new Error(`Invalid did:wba DID: must start with \"did:wba:\", got \"${did}\"`);\n }\n\n const rest = did.slice('did:wba:'.length);\n // Split on literal colons first, then decode percent-encoding per segment\n // This preserves the DID delimiter structure while decoding %3A within segments\n // e.g., \"example.com%3A8080:path\" → [\"example.com:8080\", \"path\"]\n const parts = rest.split(':').reduce<string[]>((acc, part) => {\n // If the previous segment ended with a percent-encoded sequence that was split,\n // it means the colon was literal. But per did:wba spec, %3A within a segment\n // means the colon is part of the segment (e.g., domain with port).\n // We decode each part individually.\n const decoded = decodeURIComponent(part);\n acc.push(decoded);\n return acc;\n }, []);\n\n if (parts.length < 2) {\n throw new Error(`Invalid did:wba DID: must have at least domain and path, got \"${did}\"`);\n }\n\n const domain = parts[0];\n const pathSegments = parts.slice(1);\n\n // Reject empty segments and path traversal\n for (const seg of pathSegments) {\n if (!seg) {\n throw new Error(`Invalid did:wba DID: empty path segment in \"${did}\"`);\n }\n if (seg === '.' || seg === '..') {\n throw new Error(`Invalid did:wba DID: path traversal not allowed in \"${did}\"`);\n }\n }\n\n const path = pathSegments.join('/');\n\n if (!domain || !path) {\n throw new Error(`Invalid did:wba DID: domain and path must be non-empty, got \"${did}\"`);\n }\n\n // SSRF protection: reject private/reserved domains\n if (!isSafeDomain(domain)) {\n throw new Error(`Invalid did:wba DID: domain \"${domain}\" is not allowed (private/reserved address)`);\n }\n\n return { domain, path };\n}\n\n/**\n * Construct the HTTPS URL for a did:wba DID document.\n *\n * @example\n * didToUrl(\"did:wba:agents.example.com:gateway\")\n * // → \"https://agents.example.com/gateway/did.json\"\n */\nexport function didToUrl(did: string): string {\n const { domain, path } = parseDIDWBA(did);\n return `https://${domain}/${path}/did.json`;\n}\n\n/**\n * Resolver for did:wba DID Documents.\n *\n * Fetches DID documents over HTTPS and caches them with a configurable TTL.\n */\nexport class DIDWBAResolver {\n private readonly cacheTtlMs: number;\n private readonly timeoutMs: number;\n private readonly fetchFn: typeof globalThis.fetch;\n private readonly cache: Map<string, { doc: DIDDocument; expiresAt: number }> = new Map();\n\n constructor(options?: DIDResolverOptions) {\n this.cacheTtlMs = options?.cacheTtlMs ?? 5 * 60 * 1000; // 5 minutes\n this.timeoutMs = options?.timeoutMs ?? 10_000; // 10 seconds\n this.fetchFn = options?.fetchFn ?? globalThis.fetch;\n }\n\n /**\n * Resolve a did:wba DID to its DID Document.\n *\n * @param did - The DID to resolve (e.g., \"did:wba:agents.example.com:gateway\")\n * @returns The resolved DID Document\n * @throws Error if resolution fails (network, invalid document, etc.)\n */\n async resolve(did: string): Promise<DIDDocument> {\n // Check cache\n const cached = this.cache.get(did);\n if (cached && cached.expiresAt > Date.now()) {\n return cached.doc;\n }\n\n const url = didToUrl(did);\n\n let response: Response;\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n response = await this.fetchFn(url, {\n headers: { 'Accept': 'application/json' },\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timeout);\n }\n } catch (error) {\n throw new Error(\n `Failed to resolve DID document for ${did}: ${(error as Error).message}`\n );\n }\n\n if (!response.ok) {\n throw new Error(\n `Failed to resolve DID document for ${did}: HTTP ${response.status} ${response.statusText}`\n );\n }\n\n let doc: DIDDocument;\n try {\n doc = await response.json() as DIDDocument;\n } catch {\n throw new Error(`Failed to parse DID document for ${did}: invalid JSON`);\n }\n\n // Basic validation\n if (!doc.id) {\n throw new Error(`Invalid DID document for ${did}: missing \"id\" field`);\n }\n if (doc.id !== did) {\n throw new Error(\n `DID document mismatch for ${did}: document \"id\" is \"${doc.id}\"`\n );\n }\n\n // Cache the resolved document\n this.cache.set(did, {\n doc,\n expiresAt: Date.now() + this.cacheTtlMs,\n });\n\n return doc;\n }\n\n /**\n * Extract the MAP federation service endpoint from a DID Document.\n *\n * Looks for a service of type \"MAPFederationEndpoint\".\n * Returns the endpoint URL string, or undefined if not found.\n */\n extractMAPEndpoint(doc: DIDDocument): string | undefined {\n const service = doc.service?.find(\n (s) => s.type === 'MAPFederationEndpoint'\n );\n if (!service) return undefined;\n // serviceEndpoint can be a string or an object — return string URLs only\n return typeof service.serviceEndpoint === 'string'\n ? service.serviceEndpoint\n : undefined;\n }\n\n /**\n * Extract verification keys referenced by the `authentication` relationship.\n */\n extractVerificationKeys(doc: DIDDocument): DIDVerificationMethod[] {\n if (!doc.verificationMethod || !doc.authentication) {\n return [];\n }\n\n return doc.authentication\n .map((authRef) => doc.verificationMethod!.find((vm) => vm.id === authRef))\n .filter((vm): vm is DIDVerificationMethod => vm !== undefined);\n }\n\n /**\n * Clear the resolution cache.\n */\n clearCache(): void {\n this.cache.clear();\n }\n}\n","/**\n * DID:WBA Proof Generation and Verification\n *\n * Generates and verifies cryptographic proofs for DID:WBA authentication.\n * Proofs are JWS compact serializations over (challenge + did + created).\n */\n\nimport type { DIDWBAProof } from '../../types';\nimport type { webcrypto } from 'crypto';\n\n/**\n * Options for generating a DID:WBA proof.\n */\nexport interface ProofGenerationOptions {\n /** The DID being authenticated */\n did: string;\n /** Server-provided challenge nonce */\n challenge: string;\n /** Private key in JWK format */\n privateKey: webcrypto.JsonWebKey;\n /** Proof type (default: \"JsonWebSignature2020\") */\n proofType?: string;\n}\n\n/**\n * Options for verifying a DID:WBA proof.\n */\nexport interface ProofVerificationOptions {\n /** The DID that claims ownership */\n did: string;\n /** The proof to verify */\n proof: DIDWBAProof;\n /** Public key from the DID Document (JWK format) */\n publicKey: webcrypto.JsonWebKey;\n /** Maximum proof age in ms (default: 300000 = 5 min) */\n maxAgeMs?: number;\n}\n\n/**\n * Build the canonical payload string for a DID:WBA proof.\n * The payload is the concatenation of challenge, did, and created timestamp.\n */\nexport function buildProofPayload(did: string, challenge: string, created: string): string {\n return `${challenge}.${did}.${created}`;\n}\n\n/**\n * Generate a DID:WBA proof for federation authentication.\n *\n * @param options - Proof generation options\n * @returns The generated proof\n */\nexport async function generateDIDWBAProof(options: ProofGenerationOptions): Promise<DIDWBAProof> {\n const { did, challenge, privateKey, proofType = \"JsonWebSignature2020\" } = options;\n const created = new Date().toISOString();\n\n const payload = buildProofPayload(did, challenge, created);\n const payloadBytes = new TextEncoder().encode(payload);\n\n // Determine algorithm from key type\n const algorithm = getSigningAlgorithm(privateKey);\n\n // Import the private key\n const cryptoKey = await crypto.subtle.importKey(\n 'jwk',\n privateKey,\n algorithm,\n false,\n ['sign']\n );\n\n // Sign the payload\n const signature = await crypto.subtle.sign(\n algorithm,\n cryptoKey,\n payloadBytes\n );\n\n // Encode as base64url\n const jws = base64UrlEncode(new Uint8Array(signature));\n\n return {\n type: proofType,\n created,\n challenge,\n jws,\n };\n}\n\n/**\n * Verify a DID:WBA proof against a public key.\n *\n * @param options - Proof verification options\n * @returns true if the proof is valid\n */\nexport async function verifyDIDWBAProof(options: ProofVerificationOptions): Promise<boolean> {\n const { did, proof, publicKey, maxAgeMs = 5 * 60 * 1000 } = options;\n\n // Check proof age\n const proofCreated = new Date(proof.created).getTime();\n if (isNaN(proofCreated)) {\n return false;\n }\n const age = Date.now() - proofCreated;\n if (age < 0 || age > maxAgeMs) {\n return false;\n }\n\n // Reconstruct the payload\n const payload = buildProofPayload(did, proof.challenge, proof.created);\n const payloadBytes = new TextEncoder().encode(payload);\n\n // Decode the JWS signature\n let signatureBytes: Uint8Array;\n try {\n signatureBytes = base64UrlDecode(proof.jws);\n } catch {\n return false;\n }\n\n // Determine algorithm from key type\n const algorithm = getSigningAlgorithm(publicKey);\n\n // Import the public key\n let cryptoKey: webcrypto.CryptoKey;\n try {\n cryptoKey = await crypto.subtle.importKey(\n 'jwk',\n publicKey,\n algorithm,\n false,\n ['verify']\n );\n } catch {\n return false;\n }\n\n // Verify the signature\n try {\n return await crypto.subtle.verify(\n algorithm,\n cryptoKey,\n signatureBytes,\n payloadBytes\n );\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Internal Utilities\n// =============================================================================\n\n/**\n * Determine the Web Crypto algorithm parameters from a JWK.\n */\nfunction getSigningAlgorithm(key: webcrypto.JsonWebKey): webcrypto.EcdsaParams & webcrypto.EcKeyImportParams {\n if (key.kty === 'EC') {\n const namedCurve = key.crv ?? 'P-256';\n const hashMap: Record<string, string> = {\n 'P-256': 'SHA-256',\n 'P-384': 'SHA-384',\n 'P-521': 'SHA-512',\n };\n return {\n name: 'ECDSA',\n namedCurve,\n hash: { name: hashMap[namedCurve] ?? 'SHA-256' },\n };\n }\n\n throw new Error(`Unsupported key type: ${key.kty}. Only EC keys are currently supported.`);\n}\n\n/**\n * Base64url encode a Uint8Array.\n */\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\n/**\n * Base64url decode a string to Uint8Array.\n */\nfunction base64UrlDecode(str: string): Uint8Array {\n // Add padding\n let base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n while (base64.length % 4 !== 0) {\n base64 += '=';\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","/**\n * Federation challenge nonce utilities.\n *\n * Generates and validates challenge nonces for federation authentication.\n * Nonces embed a timestamp for age validation.\n */\n\nimport { ulid } from '../utils/ulid';\n\n/**\n * Generate a federation challenge nonce.\n *\n * Format: `map_chal_<ulid>` — the ULID provides both uniqueness and an embedded timestamp.\n */\nexport function generateFederationChallenge(): string {\n return `map_chal_${ulid()}`;\n}\n\n/**\n * Validate that a challenge nonce is not too old.\n *\n * @param challenge - The challenge string to validate\n * @param maxAgeMs - Maximum age in milliseconds (default: 5 minutes)\n * @returns true if the challenge is valid and within the age limit\n */\nexport function validateChallengeAge(\n challenge: string,\n maxAgeMs: number = 5 * 60 * 1000\n): boolean {\n if (!challenge || !challenge.startsWith('map_chal_')) {\n return false;\n }\n\n // Extract ULID portion\n const ulidPart = challenge.slice('map_chal_'.length);\n if (ulidPart.length !== 26) {\n return false;\n }\n\n // Decode ULID timestamp (first 10 chars encode 48-bit Unix ms timestamp)\n const ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n const chars = ulidPart.toUpperCase();\n let timestamp = 0;\n for (let i = 0; i < 10; i++) {\n const idx = ENCODING.indexOf(chars[i]);\n if (idx === -1) return false;\n timestamp = timestamp * 32 + idx;\n }\n\n const age = Date.now() - timestamp;\n return age >= 0 && age <= maxAgeMs;\n}\n","/**\n * DID:WBA Authenticator for MAP Server\n *\n * Authenticates federation connections using did:wba credentials.\n * Resolves DID documents over HTTPS, extracts verification keys,\n * and verifies cryptographic proofs.\n */\n\nimport type { AuthMethod, AuthCredentials, AuthResult } from '../../types';\nimport type { Authenticator, AuthContext } from './types';\nimport { DIDWBAResolver, parseDIDWBA } from '../../federation/did-wba/resolver';\nimport type { DIDResolverOptions } from '../../federation/did-wba/resolver';\nimport { verifyDIDWBAProof } from '../../federation/did-wba/proof';\nimport { generateFederationChallenge, validateChallengeAge } from '../../federation/challenge';\n\n/**\n * Options for the DID:WBA authenticator.\n */\nexport interface DIDWBAAuthenticatorOptions {\n /** DID resolver options (cache TTL, timeout, custom fetch) */\n resolver?: DIDResolverOptions;\n /** Trusted domain patterns (e.g., [\"*.example.com\", \"partner.org\"]) */\n trustedDomains?: string[];\n /** Challenge nonce TTL in ms (default: 300000 = 5 min) */\n challengeTtlMs?: number;\n}\n\n/**\n * Authenticator that validates did:wba credentials for federation.\n *\n * Authentication flow:\n * 1. Parse DID from credentials\n * 2. Validate DID matches trusted domain patterns (if configured)\n * 3. Resolve DID document via HTTPS\n * 4. Extract verification key from authentication relationship\n * 5. Verify proof signature\n * 6. Return authenticated principal\n */\nexport class DIDWBAAuthenticator implements Authenticator {\n readonly methods: readonly AuthMethod[] = ['did:wba' as AuthMethod];\n\n private readonly resolver: DIDWBAResolver;\n private readonly trustedDomains?: string[];\n private readonly challengeTtlMs: number;\n\n constructor(options?: DIDWBAAuthenticatorOptions) {\n this.resolver = new DIDWBAResolver(options?.resolver);\n this.trustedDomains = options?.trustedDomains;\n this.challengeTtlMs = options?.challengeTtlMs ?? 5 * 60 * 1000;\n }\n\n /**\n * Authenticate did:wba credentials.\n */\n async authenticate(\n credentials: AuthCredentials,\n _context: AuthContext\n ): Promise<AuthResult> {\n if (credentials.method !== 'did:wba') {\n return {\n success: false,\n error: { code: 'method_not_supported', message: 'Expected did:wba method' },\n };\n }\n\n // Extract DID and proof from metadata\n const did = credentials.metadata?.did as string | undefined;\n const proof = credentials.metadata?.proof as {\n type: string;\n created: string;\n challenge: string;\n jws: string;\n } | undefined;\n\n if (!did || !proof) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'did:wba credentials require \"did\" and \"proof\" in metadata',\n },\n };\n }\n\n // Validate DID format\n let domain: string;\n try {\n const parsed = parseDIDWBA(did);\n domain = parsed.domain;\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `Invalid DID format: ${(error as Error).message}`,\n },\n };\n }\n\n // Check trusted domains\n if (this.trustedDomains && !this.isTrustedDomain(domain)) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `Domain \"${domain}\" is not in the trusted domains list`,\n },\n };\n }\n\n // Validate challenge freshness\n if (!validateChallengeAge(proof.challenge, this.challengeTtlMs)) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Challenge nonce is expired or invalid',\n },\n };\n }\n\n // Resolve DID document\n let doc;\n try {\n doc = await this.resolver.resolve(did);\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: `DID resolution failed: ${(error as Error).message}`,\n },\n };\n }\n\n // Extract verification keys\n const keys = this.resolver.extractVerificationKeys(doc);\n if (keys.length === 0) {\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'No verification keys found in DID document',\n },\n };\n }\n\n // Try each verification key until one succeeds\n for (const key of keys) {\n if (!key.publicKeyJwk) continue;\n\n try {\n const valid = await verifyDIDWBAProof({\n did,\n proof,\n publicKey: key.publicKeyJwk as JsonWebKey,\n maxAgeMs: this.challengeTtlMs,\n });\n\n if (valid) {\n return {\n success: true,\n principal: {\n id: did,\n issuer: `https://${domain}`,\n claims: {\n domain,\n verificationMethod: key.id,\n },\n },\n };\n }\n } catch {\n // Try next key\n continue;\n }\n }\n\n return {\n success: false,\n error: {\n code: 'invalid_credentials',\n message: 'Proof verification failed against all available keys',\n },\n };\n }\n\n /**\n * Generate a challenge nonce for DID:WBA authentication.\n */\n generateChallenge(): string {\n return generateFederationChallenge();\n }\n\n /**\n * Check if a domain matches the trusted domain patterns.\n */\n isTrustedDomain(domain: string): boolean {\n if (!this.trustedDomains) return true;\n\n return this.trustedDomains.some((pattern) => {\n if (pattern.startsWith('*.')) {\n // Wildcard subdomain match\n const suffix = pattern.slice(2);\n return domain === suffix || domain.endsWith(`.${suffix}`);\n }\n return domain === pattern;\n });\n }\n\n async initialize(): Promise<void> {\n // No async initialization needed\n }\n\n async shutdown(): Promise<void> {\n this.resolver.clearCache();\n }\n}\n","/**\n * MAPServer - Convenience wrapper for MAP Server SDK building blocks\n *\n * Provides a simplified API for creating MAP servers while preserving\n * access to all underlying building blocks for advanced use cases.\n */\n\nimport type { Stream } from \"../stream\";\nimport { NOTIFICATION_METHODS } from \"../types\";\nimport type {\n EventBus,\n AgentRegistry,\n ScopeManager,\n SessionManager,\n SubscriptionManager,\n MessageRouter,\n HandlerRegistry,\n Middleware,\n MAPEvent,\n ServerSubscription,\n EventStore,\n AgentStore,\n SessionStore,\n ScopeStore,\n SubscriptionStore,\n MessageQueueStore,\n} from \"./types\";\nimport type { ParticipantCapabilities } from \"../types\";\nimport type {\n ConversationManager,\n TurnManager,\n ThreadManager,\n ConversationStore,\n TurnStore,\n ThreadStore,\n ParticipantStore,\n} from \"./types\";\nimport { EventBusImpl } from \"./events\";\nimport { AgentRegistryImpl, createAgentHandlers } from \"./agents\";\nimport { SessionManagerImpl } from \"./sessions\";\nimport { ScopeManagerImpl, createScopeHandlers } from \"./scopes\";\nimport { SubscriptionManagerImpl, createSubscriptionHandlers } from \"./subscriptions\";\nimport { MessageRouterImpl, createMessageHandlers } from \"./messages\";\nimport {\n ConversationManagerImpl,\n TurnManagerImpl,\n ThreadManagerImpl,\n InMemoryTurnStore,\n createMailHandlers,\n} from \"./mail\";\nimport {\n RouterConnectionImpl,\n combineHandlers,\n createConnectionHandlers,\n} from \"./router\";\nimport type { MailCapabilityConfig } from \"./router/handlers\";\nimport { createCredentialHandlers } from \"./credentials\";\nimport { createWorkspaceHandlers } from \"./workspace\";\nimport type { WorkspaceCapabilityConfig, WorkspaceFileService } from \"./workspace\";\nimport { AuthManagerImpl, authMiddleware } from \"./auth\";\nimport type { AuthManager } from \"./auth\";\n\n/**\n * Options for MAPServer\n */\nexport interface MAPServerOptions {\n // === Basic Config ===\n /** Server name for connect responses */\n name?: string;\n /** Server version for connect responses */\n version?: string;\n\n // === Building Block Overrides ===\n /** Replace EventBus entirely */\n eventBus?: EventBus;\n /** Replace AgentRegistry entirely */\n agents?: AgentRegistry;\n /** Replace ScopeManager entirely */\n scopes?: ScopeManager;\n /** Replace SessionManager entirely */\n sessions?: SessionManager;\n /** Replace SubscriptionManager entirely */\n subscriptions?: SubscriptionManager;\n /** Replace MessageRouter entirely */\n messages?: MessageRouter;\n\n // === Storage Overrides ===\n /** Custom stores (uses default impl with your store) */\n stores?: {\n events?: EventStore;\n agents?: AgentStore;\n sessions?: SessionStore;\n scopes?: ScopeStore;\n subscriptions?: SubscriptionStore;\n messages?: MessageQueueStore;\n };\n\n // === Handler Customization ===\n /** Replace all handlers entirely */\n handlers?: HandlerRegistry;\n /** Add handlers to defaults (merged after built-in handlers) */\n additionalHandlers?: HandlerRegistry;\n /** Middleware chain (applied to all requests) */\n middleware?: Middleware[];\n\n // === Event Delivery ===\n /** Event delivery configuration */\n eventDelivery?: {\n /** Enable automatic event delivery (default: true) */\n enabled?: boolean;\n /** Custom filter for event delivery */\n filter?: (event: MAPEvent, subscription: ServerSubscription) => boolean;\n };\n\n // === Session/Cleanup Config ===\n /** Session resume window in ms (default: 5 minutes) */\n resumeWindowMs?: number;\n\n // === Capabilities ===\n /** Server capabilities advertised to clients */\n capabilities?: ParticipantCapabilities;\n\n // === Authentication ===\n /**\n * Authentication configuration.\n * If not provided, no authentication is enforced.\n *\n * @example\n * ```typescript\n * auth: {\n * required: true,\n * authenticators: [\n * new JWTAuthenticator({ jwksUrl: '...' }),\n * new APIKeyAuthenticator({ validateKey: ... }),\n * ],\n * }\n * ```\n */\n auth?: {\n /** Is authentication required for connections? */\n required?: boolean;\n /** Registered authenticators */\n authenticators?: import('./auth').Authenticator[];\n /** OAuth2 authorization server metadata URL */\n oauth2MetadataUrl?: string;\n /** JWKS URL for token verification */\n jwksUrl?: string;\n /** Server realm identifier */\n realm?: string;\n /** Transports that bypass auth (e.g., { stdio: true }) */\n bypassForTransports?: Record<string, boolean>;\n /**\n * Auth expiration notification configuration.\n * If enabled, the server will send `map/auth/expiring` notifications\n * before tokens expire, giving clients time to refresh.\n */\n expirationNotification?: {\n /** Enable expiration notifications (default: true if auth is configured) */\n enabled?: boolean;\n /** How often to check for expiring tokens in ms (default: 30000) */\n checkIntervalMs?: number;\n /** How far in advance to notify before expiration in ms (default: 300000 = 5 min) */\n notifyBeforeMs?: number;\n };\n };\n\n // === Mail Config ===\n /** Mail feature configuration. Omit or set enabled=false to disable mail. */\n mail?: {\n /** Enable the mail feature (default: false) */\n enabled?: boolean;\n /** Mail capability overrides for connect handshake */\n capabilities?: Omit<MailCapabilityConfig, \"enabled\">;\n /** Custom stores for mail data */\n stores?: {\n conversations?: ConversationStore;\n turns?: TurnStore;\n threads?: ThreadStore;\n participants?: ParticipantStore;\n };\n /** Replace ConversationManager entirely */\n conversations?: ConversationManager;\n /** Replace TurnManager entirely */\n turns?: TurnManager;\n /** Replace ThreadManager entirely */\n threads?: ThreadManager;\n };\n\n // === Credential Brokering Config ===\n /**\n * Credential brokering configuration. Omit or set enabled=false to disable.\n * When enabled, `broker` must be provided.\n */\n credentials?: {\n /** Enable credential brokering (default: false) */\n enabled?: boolean;\n /** Broker instance (e.g. agent-iam Broker). Required when enabled=true. */\n broker?: import('./credentials').BrokerLike;\n /** Credential capability overrides for connect handshake */\n capabilities?: Omit<import('./credentials').CredentialCapabilityConfig, 'enabled'>;\n /** If set, only these providers are visible */\n allowedProviders?: string[];\n };\n\n // === Workspace Config ===\n /** Workspace file access configuration. Omit or set enabled=false to disable. */\n workspace?: {\n /** Enable workspace file access (default: false) */\n enabled?: boolean;\n /** File service implementation. Required when enabled=true. */\n fileService?: WorkspaceFileService;\n /** Workspace capability overrides for connect handshake */\n capabilities?: Omit<WorkspaceCapabilityConfig, 'enabled'>;\n };\n}\n\n/**\n * Options for accepting a connection\n */\nexport interface AcceptOptions {\n /** Connection role (default: 'agent') */\n role?: \"client\" | \"agent\" | \"gateway\";\n /** Name for the session */\n name?: string;\n /** Resume token for reconnection */\n resumeToken?: string;\n /**\n * Transport type for auth bypass configuration.\n * Common values: 'websocket', 'stdio', 'inprocess'\n */\n transportType?: string;\n /** Additional metadata for the session */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Options for closing the server\n */\nexport interface CloseOptions {\n /** Timeout for graceful shutdown in ms (default: 5000) */\n timeout?: number;\n /** Force close without waiting for graceful disconnect */\n force?: boolean;\n}\n\n/**\n * MAPServer - A convenience wrapper that wires together all MAP Server SDK\n * building blocks with sensible defaults.\n *\n * @example Simple usage\n * ```typescript\n * const server = new MAPServer({ name: 'MyServer' });\n *\n * // Accept connections\n * wss.on('connection', (ws) => {\n * const stream = websocketToStream(ws);\n * server.accept(stream).start();\n * });\n * ```\n *\n * @example With custom storage\n * ```typescript\n * const server = new MAPServer({\n * name: 'PersistentServer',\n * stores: {\n * agents: new PostgresAgentStore(db),\n * events: new RedisEventStore(redis),\n * }\n * });\n * ```\n *\n * @example Direct access to building blocks\n * ```typescript\n * server.agents.list();\n * server.eventBus.on('agent.registered', console.log);\n * ```\n */\nexport class MAPServer {\n // === Building Blocks (readonly access) ===\n readonly eventBus: EventBus;\n readonly agents: AgentRegistry;\n readonly scopes: ScopeManager;\n readonly sessions: SessionManager;\n readonly subscriptions: SubscriptionManager;\n readonly messages: MessageRouter;\n readonly handlers: HandlerRegistry;\n /** Authentication manager (if auth is configured) */\n readonly auth: AuthManager | null;\n /** Mail managers (null if mail is disabled) */\n readonly conversations: ConversationManager | null;\n readonly turns: TurnManager | null;\n readonly threads: ThreadManager | null;\n\n // === Private State ===\n readonly #options: MAPServerOptions;\n readonly #routers: Map<string, RouterConnectionImpl> = new Map();\n readonly #sessionToRouter: Map<string, string> = new Map(); // sessionId -> routerId for O(1) lookup\n readonly #subscriptionSequences: Map<string, number> = new Map();\n #eventDeliveryUnsubscribe?: () => void;\n #sessionTrackingUnsubscribe?: () => void;\n #authExpirationInterval?: ReturnType<typeof setInterval>;\n #notifiedSessions: Set<string> = new Set(); // Sessions that have been notified about expiring auth\n #nextRouterId = 1;\n\n constructor(options: MAPServerOptions = {}) {\n // Create building blocks in dependency order\n this.eventBus =\n options.eventBus ??\n new EventBusImpl({\n store: options.stores?.events,\n });\n\n this.sessions =\n options.sessions ??\n new SessionManagerImpl({\n eventBus: this.eventBus,\n store: options.stores?.sessions,\n resumeWindowMs: options.resumeWindowMs,\n });\n\n this.agents =\n options.agents ??\n new AgentRegistryImpl({\n eventBus: this.eventBus,\n store: options.stores?.agents,\n });\n\n this.scopes =\n options.scopes ??\n new ScopeManagerImpl({\n eventBus: this.eventBus,\n store: options.stores?.scopes,\n });\n\n this.subscriptions =\n options.subscriptions ??\n new SubscriptionManagerImpl({\n eventBus: this.eventBus,\n scopes: this.scopes,\n store: options.stores?.subscriptions,\n });\n\n this.messages =\n options.messages ??\n new MessageRouterImpl({\n eventBus: this.eventBus,\n agents: this.agents,\n scopes: this.scopes,\n queueStore: options.stores?.messages,\n });\n\n // Create mail managers if enabled\n if (options.mail?.enabled) {\n const turnStore = options.mail.stores?.turns ?? new InMemoryTurnStore();\n this.conversations =\n options.mail.conversations ??\n new ConversationManagerImpl({\n eventBus: this.eventBus,\n store: options.mail.stores?.conversations,\n participantStore: options.mail.stores?.participants,\n });\n this.turns =\n options.mail.turns ??\n new TurnManagerImpl({\n eventBus: this.eventBus,\n store: turnStore,\n conversations: this.conversations,\n });\n this.threads =\n options.mail.threads ??\n new ThreadManagerImpl({\n eventBus: this.eventBus,\n store: options.mail.stores?.threads,\n turnStore,\n });\n } else {\n this.conversations = null;\n this.turns = null;\n this.threads = null;\n }\n\n // Validate credential brokering config\n if (options.credentials?.enabled && !options.credentials.broker) {\n throw new Error(\n 'MAPServer: credentials.broker is required when credentials.enabled is true',\n );\n }\n\n // Validate workspace config\n if (options.workspace?.enabled && !options.workspace.fileService) {\n throw new Error(\n 'MAPServer: workspace.fileService is required when workspace.enabled is true',\n );\n }\n\n // Set up authentication if configured\n if (options.auth?.authenticators?.length) {\n this.auth = new AuthManagerImpl({\n required: options.auth.required ?? false,\n authenticators: options.auth.authenticators,\n oauth2MetadataUrl: options.auth.oauth2MetadataUrl,\n jwksUrl: options.auth.jwksUrl,\n realm: options.auth.realm,\n bypassForTransports: options.auth.bypassForTransports,\n });\n } else {\n this.auth = null;\n }\n\n // Build middleware chain (auth middleware first if configured)\n const middleware: Middleware[] = [];\n if (this.auth) {\n middleware.push(authMiddleware(this.auth));\n }\n if (options.middleware) {\n middleware.push(...options.middleware);\n }\n\n // Compose handlers\n this.handlers =\n options.handlers ??\n combineHandlers(\n createConnectionHandlers({\n sessions: this.sessions,\n agents: this.agents,\n subscriptions: this.subscriptions,\n scopes: this.scopes,\n serverName: options.name ?? \"MAPServer\",\n serverVersion: options.version ?? \"1.0.0\",\n authManager: this.auth ?? undefined,\n mailCapabilities: options.mail?.enabled\n ? { enabled: true, ...options.mail.capabilities }\n : undefined,\n credentialCapabilities: options.credentials?.enabled\n ? { enabled: true, ...options.credentials.capabilities }\n : undefined,\n workspaceCapabilities: options.workspace?.enabled\n ? { enabled: true, ...options.workspace.capabilities }\n : undefined,\n }),\n createAgentHandlers({ agents: this.agents, sessions: this.sessions }),\n createScopeHandlers({ scopes: this.scopes }),\n createMessageHandlers({\n messages: this.messages,\n scopes: this.scopes,\n agents: this.agents,\n turns: this.turns ?? undefined,\n }),\n createSubscriptionHandlers({\n subscriptions: this.subscriptions,\n eventBus: this.eventBus,\n sessions: this.sessions,\n }),\n ...(this.conversations && this.turns && this.threads\n ? [\n createMailHandlers({\n conversations: this.conversations,\n turns: this.turns,\n threads: this.threads,\n }),\n ]\n : []),\n ...(options.credentials?.enabled\n ? [\n createCredentialHandlers({\n broker: options.credentials.broker!,\n eventBus: this.eventBus,\n allowedProviders: options.credentials.allowedProviders,\n }),\n ]\n : []),\n ...(options.workspace?.enabled\n ? [\n createWorkspaceHandlers({\n fileService: options.workspace.fileService!,\n }),\n ]\n : []),\n options.additionalHandlers ?? {}\n );\n\n // Store middleware for router creation\n this.#options = { ...options, middleware };\n\n // Wire event delivery\n if (options.eventDelivery?.enabled !== false) {\n this.#wireEventDelivery();\n }\n\n // Wire session tracking for O(1) router lookup\n this.#wireSessionTracking();\n\n // Start auth expiration monitoring if configured\n if (this.auth && options.auth?.expirationNotification?.enabled !== false) {\n this.startAuthExpirationMonitor();\n }\n }\n\n // === Connection Tracking ===\n\n /**\n * Get active connections by ID\n */\n get connections(): ReadonlyMap<string, RouterConnectionImpl> {\n return this.#routers;\n }\n\n // === Connection Lifecycle ===\n\n /**\n * Accept a new connection.\n *\n * Creates a RouterConnection, tracks it, and sets up cleanup on close.\n * The returned router must have `start()` called to begin processing.\n *\n * @param stream - Bidirectional message stream\n * @param options - Connection options\n * @returns RouterConnection ready to start\n *\n * @example\n * ```typescript\n * const router = server.accept(stream, { role: 'agent' });\n * router.start();\n * ```\n */\n accept(stream: Stream, options?: AcceptOptions): RouterConnectionImpl {\n const routerId = `router-${this.#nextRouterId++}`;\n\n // Build metadata including transportType\n const metadata: Record<string, unknown> = {\n ...options?.metadata,\n };\n if (options?.transportType) {\n metadata.transportType = options.transportType;\n }\n\n const router = new RouterConnectionImpl({\n stream,\n handlers: this.handlers,\n sessions: this.sessions,\n middleware: this.#options.middleware,\n role: options?.role ?? \"agent\",\n name: options?.name,\n resumeToken: options?.resumeToken,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n });\n\n // Track the router\n this.#routers.set(routerId, router);\n\n // Auto-cleanup on close\n router.closed.then(() => {\n // Clean up session mapping if exists (use try-catch since session may not exist)\n try {\n const sessionId = router.session?.id;\n if (sessionId) {\n this.#sessionToRouter.delete(sessionId);\n }\n } catch {\n // Session not established, nothing to clean\n }\n this.#routers.delete(routerId);\n });\n\n // Store routerId on router for session tracking callback\n (router as RouterConnectionImpl & { __routerId?: string }).__routerId = routerId;\n\n return router;\n }\n\n /**\n * Close the server.\n *\n * Gracefully disconnects all clients with optional timeout.\n *\n * @param options - Close options\n *\n * @example\n * ```typescript\n * // Graceful shutdown\n * await server.close();\n *\n * // Force shutdown\n * await server.close({ force: true });\n *\n * // Custom timeout\n * await server.close({ timeout: 10000 });\n * ```\n */\n async close(options?: CloseOptions): Promise<void> {\n const { timeout = 5000, force = false } = options ?? {};\n\n // Stop event delivery\n if (this.#eventDeliveryUnsubscribe) {\n this.#eventDeliveryUnsubscribe();\n this.#eventDeliveryUnsubscribe = undefined;\n }\n\n // Stop session tracking\n if (this.#sessionTrackingUnsubscribe) {\n this.#sessionTrackingUnsubscribe();\n this.#sessionTrackingUnsubscribe = undefined;\n }\n\n // Stop auth expiration monitoring\n this.stopAuthExpirationMonitor();\n\n const routers = Array.from(this.#routers.values());\n\n if (force) {\n // Immediately close all\n await Promise.all(routers.map((r) => r.close()));\n // Force-expire all disconnected sessions\n this.sessions.expireStale(0);\n return;\n }\n\n // Graceful: attempt close with timeout\n const closePromises = routers.map(async (router) => {\n try {\n await Promise.race([\n router.close(),\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error(\"Timeout\")), timeout)\n ),\n ]);\n } catch {\n // Force close on timeout\n await router.close();\n }\n });\n\n await Promise.all(closePromises);\n\n // Expire disconnected sessions on graceful shutdown\n this.sessions.expireStale(0);\n }\n\n // === Convenience Methods ===\n\n /**\n * Subscribe to events.\n *\n * Convenience method that delegates to eventBus.on().\n *\n * @param type - Event type(s) to listen for, or '*' for all\n * @param handler - Callback invoked for each matching event\n * @returns Unsubscribe function\n */\n on(\n type: string | string[],\n handler: (event: MAPEvent) => void\n ): () => void {\n return this.eventBus.on(type, handler);\n }\n\n /**\n * Emit an event.\n *\n * Convenience method that delegates to eventBus.emit().\n *\n * @param event - Event to emit (id and timestamp are added automatically)\n * @returns The complete event with id and timestamp\n */\n emit(event: Omit<MAPEvent, \"id\" | \"timestamp\">): MAPEvent {\n return this.eventBus.emit(event);\n }\n\n // === Private Methods ===\n\n /**\n * Wire automatic event delivery from EventBus to subscriptions\n */\n #wireEventDelivery(): void {\n this.#eventDeliveryUnsubscribe = this.eventBus.on(\"*\", (event: MAPEvent) => {\n // Find matching subscriptions\n const matchingSubIds = this.subscriptions.match(event);\n\n for (const subId of matchingSubIds) {\n const subscription = this.subscriptions.get(subId);\n if (!subscription || subscription.paused) continue;\n\n // Apply custom filter if provided\n if (this.#options.eventDelivery?.filter) {\n if (!this.#options.eventDelivery.filter(event, subscription)) {\n continue;\n }\n }\n\n // Find the router for this subscription's session\n const router = this.#findRouterForSession(subscription.sessionId);\n if (!router) continue;\n\n // Increment sequence number\n const seq = (this.#subscriptionSequences.get(subId) ?? 0) + 1;\n this.#subscriptionSequences.set(subId, seq);\n\n // Send notification (remove dead connections on error)\n router\n .notify(NOTIFICATION_METHODS.EVENT, {\n subscriptionId: subId,\n sequenceNumber: seq,\n eventId: event.id,\n timestamp: event.timestamp,\n event,\n })\n .catch(() => {\n // Remove dead connection on notification failure\n this.#removeDeadConnection(subscription.sessionId);\n });\n }\n });\n }\n\n /**\n * Find the RouterConnection for a given session ID (O(1) lookup with fallback)\n */\n #findRouterForSession(sessionId: string): RouterConnectionImpl | undefined {\n // Try O(1) lookup first\n const routerId = this.#sessionToRouter.get(sessionId);\n if (routerId) {\n const router = this.#routers.get(routerId);\n if (router) return router;\n }\n\n // Fallback: O(n) search and cache the result\n for (const [id, router] of this.#routers.entries()) {\n try {\n if (router.session?.id === sessionId) {\n // Cache for future lookups\n this.#sessionToRouter.set(sessionId, id);\n return router;\n }\n } catch {\n // Session not available yet, skip this router\n }\n }\n return undefined;\n }\n\n /**\n * Wire session tracking to maintain session ID -> router ID mapping\n */\n #wireSessionTracking(): void {\n this.#sessionTrackingUnsubscribe = this.eventBus.on(\n \"session.connected\",\n (event: MAPEvent) => {\n // Session.connected event data is { session: ServerSession }\n const data = event.data as { session?: { id?: string } } | undefined;\n const sessionId = data?.session?.id;\n if (!sessionId) return;\n\n // Find the router that just established this session\n for (const router of this.#routers.values()) {\n try {\n if (router.session?.id === sessionId) {\n const routerId = (router as RouterConnectionImpl & { __routerId?: string }).__routerId;\n if (routerId) {\n this.#sessionToRouter.set(sessionId, routerId);\n }\n break;\n }\n } catch {\n // Session not available yet, skip this router\n }\n }\n }\n );\n }\n\n /**\n * Remove a dead connection by session ID\n */\n #removeDeadConnection(sessionId: string): void {\n const routerId = this.#sessionToRouter.get(sessionId);\n if (routerId) {\n const router = this.#routers.get(routerId);\n if (router) {\n // Close the dead router (this triggers cleanup in the closed promise)\n router.close().catch(() => {\n // Ignore close errors\n });\n }\n this.#sessionToRouter.delete(sessionId);\n }\n }\n\n /**\n * Start auth expiration monitoring.\n *\n * Periodically checks for sessions with expiring auth and sends\n * `map/auth/expiring` notifications to give clients time to refresh.\n *\n * @param options - Override default configuration\n */\n startAuthExpirationMonitor(options?: {\n checkIntervalMs?: number;\n notifyBeforeMs?: number;\n }): void {\n if (this.#authExpirationInterval) {\n return; // Already running\n }\n\n const checkIntervalMs = options?.checkIntervalMs ??\n this.#options.auth?.expirationNotification?.checkIntervalMs ?? 30000;\n const notifyBeforeMs = options?.notifyBeforeMs ??\n this.#options.auth?.expirationNotification?.notifyBeforeMs ?? 300000; // 5 minutes\n\n this.#authExpirationInterval = setInterval(() => {\n this.#checkAuthExpiration(notifyBeforeMs);\n }, checkIntervalMs);\n }\n\n /**\n * Stop auth expiration monitoring.\n */\n stopAuthExpirationMonitor(): void {\n if (this.#authExpirationInterval) {\n clearInterval(this.#authExpirationInterval);\n this.#authExpirationInterval = undefined;\n }\n this.#notifiedSessions.clear();\n }\n\n /**\n * Check for sessions with expiring auth and send notifications.\n */\n #checkAuthExpiration(notifyBeforeMs: number): void {\n const now = Date.now();\n const expirationThreshold = now + notifyBeforeMs;\n\n for (const router of this.#routers.values()) {\n try {\n const session = router.session;\n if (!session?.principal?.expiresAt) {\n continue;\n }\n\n const expiresAt = session.principal.expiresAt;\n\n // Skip if already notified or not expiring soon\n if (this.#notifiedSessions.has(session.id)) {\n // Clear notification flag if token was refreshed (expiresAt changed)\n continue;\n }\n\n // Check if expiring within threshold\n if (expiresAt <= expirationThreshold && expiresAt > now) {\n // Send expiring notification\n router\n .notify(NOTIFICATION_METHODS.AUTH_EXPIRING, {\n expiresAt,\n expiresInMs: expiresAt - now,\n })\n .then(() => {\n this.#notifiedSessions.add(session.id);\n })\n .catch(() => {\n // Connection may be dead\n this.#removeDeadConnection(session.id);\n });\n }\n } catch {\n // Session not available, skip\n }\n }\n\n // Clean up notified sessions that are no longer active\n for (const sessionId of this.#notifiedSessions) {\n if (!this.#sessionToRouter.has(sessionId)) {\n this.#notifiedSessions.delete(sessionId);\n }\n }\n }\n}\n","/**\n * PermissionChecker implementation\n *\n * Provides method-level and resource-level permission checking.\n */\n\nimport type {\n PermissionResult,\n PermissionChecker,\n PermissionRule,\n PermissionCheckerOptions,\n ServerSession,\n} from \"../types\";\n\n/**\n * Simple glob pattern matching.\n * Supports * for single segment and ** for multiple segments.\n */\nfunction matchesGlob(pattern: string, value: string): boolean {\n // Convert glob pattern to regex\n const regexStr = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape regex special chars except * and /\n .replace(/\\*\\*/g, \"<<DOUBLE_STAR>>\") // Placeholder for **\n .replace(/\\*/g, \"[^/]*\") // * matches anything except /\n .replace(/<<DOUBLE_STAR>>/g, \".*\"); // ** matches anything including /\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(value);\n}\n\n/**\n * PermissionChecker implementation.\n *\n * Supports:\n * - Method-level access control with glob patterns\n * - Role-based access\n * - Custom check functions\n * - Scope-level permissions\n * - Agent-to-agent permissions\n */\nexport class PermissionCheckerImpl implements PermissionChecker {\n private readonly rules: PermissionRule[];\n private readonly defaultAllow: boolean;\n\n constructor(options: PermissionCheckerOptions) {\n this.rules = options.rules;\n this.defaultAllow = options.defaultAllow ?? false;\n }\n\n /**\n * Check if a session can call a specific method.\n */\n canCallMethod(session: ServerSession, method: string): PermissionResult {\n // Find matching rules\n const matchingRules = this.rules.filter((rule) => {\n if (!rule.method) return false;\n return matchesGlob(rule.method, method);\n });\n\n // No matching rules - use default\n if (matchingRules.length === 0) {\n return {\n allowed: this.defaultAllow,\n reason: this.defaultAllow\n ? undefined\n : `No permission rule for ${method}`,\n };\n }\n\n // Check each matching rule\n for (const rule of matchingRules) {\n // Check role requirement\n if (rule.roles && rule.roles.length > 0) {\n if (!rule.roles.includes(session.role)) {\n continue; // Role doesn't match, try next rule\n }\n }\n\n // Check custom function\n if (rule.check) {\n const result = rule.check(session, undefined);\n if (result.allowed) {\n return result;\n }\n // Custom check denied, continue to next rule\n continue;\n }\n\n // Rule matches and no custom check - allow\n return { allowed: true };\n }\n\n // No rule allowed access\n return {\n allowed: false,\n reason: `Access denied for role '${session.role}' to method '${method}'`,\n };\n }\n\n /**\n * Check if a session can access a scope with a specific action.\n */\n canAccessScope(\n session: ServerSession,\n scopeId: string,\n action: string,\n ): PermissionResult {\n // Build a virtual method name for scope access\n const virtualMethod = `scope/${scopeId}/${action}`;\n\n // Find rules that match scope access patterns\n const matchingRules = this.rules.filter((rule) => {\n if (!rule.method) return false;\n // Match patterns like \"scope/*\", \"scope/**\", or specific scope IDs\n return matchesGlob(rule.method, virtualMethod);\n });\n\n if (matchingRules.length === 0) {\n return {\n allowed: this.defaultAllow,\n reason: this.defaultAllow\n ? undefined\n : `No permission rule for scope access: ${scopeId}/${action}`,\n };\n }\n\n for (const rule of matchingRules) {\n if (rule.roles && rule.roles.length > 0) {\n if (!rule.roles.includes(session.role)) {\n continue;\n }\n }\n\n if (rule.check) {\n const result = rule.check(session, { scopeId, action });\n if (result.allowed) {\n return result;\n }\n continue;\n }\n\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Access denied for role '${session.role}' to scope '${scopeId}' action '${action}'`,\n };\n }\n\n /**\n * Check if an agent can perform an action on a target.\n */\n canAgentPerform(\n agentId: string,\n action: string,\n targetId: string,\n ): PermissionResult {\n // Build a virtual method name for agent-to-agent actions\n const virtualMethod = `agent/${action}`;\n\n // Find rules that match agent action patterns\n const matchingRules = this.rules.filter((rule) => {\n if (!rule.method) return false;\n return matchesGlob(rule.method, virtualMethod);\n });\n\n if (matchingRules.length === 0) {\n return {\n allowed: this.defaultAllow,\n reason: this.defaultAllow\n ? undefined\n : `No permission rule for agent action: ${action}`,\n };\n }\n\n for (const rule of matchingRules) {\n // Agent rules don't have session, so skip role checks\n // Use custom check for fine-grained agent permissions\n if (rule.check) {\n // Pass agent context to custom check\n const mockSession = { agentId } as unknown as ServerSession;\n const result = rule.check(mockSession, { agentId, action, targetId });\n if (result.allowed) {\n return result;\n }\n continue;\n }\n\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: `Agent '${agentId}' denied action '${action}' on '${targetId}'`,\n };\n }\n}\n\n/**\n * Baseline permission rules for MAP protocol methods.\n *\n * These rules define the recommended starting point for MAP server permissions:\n * - Connection methods: available to all roles\n * - Agent registration: only agents can register/unregister\n * - Agent observation: all roles can list/get agents\n * - Agent state changes: only agents can update their state\n * - Scope operations: all roles can manage scopes\n * - Messaging: all roles can send messages\n * - Subscriptions: all roles can subscribe to events\n *\n * Use these rules as a starting point and customize as needed.\n *\n * @example\n * ```typescript\n * import { BASELINE_PERMISSION_RULES, PermissionCheckerImpl } from \"@multi-agent-protocol/sdk/server\";\n *\n * const checker = new PermissionCheckerImpl({\n * rules: [\n * ...BASELINE_PERMISSION_RULES,\n * // Add custom rules\n * { method: \"custom/*\", roles: [\"agent\"] },\n * ],\n * });\n * ```\n */\nexport const BASELINE_PERMISSION_RULES: PermissionRule[] = [\n // Connection methods - available to all\n { method: \"map/connect\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/disconnect\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/session/*\", roles: [\"client\", \"agent\", \"gateway\"] },\n\n // Agent registration - only agents can register\n { method: \"map/agents/register\", roles: [\"agent\"] },\n { method: \"map/agents/unregister\", roles: [\"agent\"] },\n\n // Agent observation - clients and agents can observe\n { method: \"map/agents/list\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/agents/get\", roles: [\"client\", \"agent\", \"gateway\"] },\n\n // Agent state changes - only the owning agent\n { method: \"map/agents/update\", roles: [\"agent\"] },\n { method: \"map/agents/update/*\", roles: [\"agent\"] },\n\n // Scope operations - all participants\n { method: \"map/scopes/*\", roles: [\"client\", \"agent\", \"gateway\"] },\n\n // Messaging - all participants\n { method: \"map/send\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/send/*\", roles: [\"client\", \"agent\", \"gateway\"] },\n\n // Subscriptions - all participants\n { method: \"map/subscribe\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/unsubscribe\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/replay\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/ack\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/pause\", roles: [\"client\", \"agent\", \"gateway\"] },\n { method: \"map/resume\", roles: [\"client\", \"agent\", \"gateway\"] },\n];\n\n/**\n * Create a PermissionChecker with baseline rules for MAP methods.\n *\n * @param overrides Optional overrides for rules or default behavior\n * @returns PermissionChecker instance with baseline + override rules\n */\nexport function createDefaultPermissionChecker(\n overrides?: Partial<PermissionCheckerOptions>,\n): PermissionCheckerImpl {\n return new PermissionCheckerImpl({\n rules: [...BASELINE_PERMISSION_RULES, ...(overrides?.rules ?? [])],\n defaultAllow: overrides?.defaultAllow ?? false,\n });\n}\n","/**\n * Permission middleware for RouterConnection\n *\n * Integrates PermissionChecker with the middleware chain.\n */\n\nimport type { PermissionChecker, Middleware } from \"../types\";\n\n/**\n * JSON-RPC error codes for permission errors.\n */\nconst PERMISSION_ERRORS = {\n FORBIDDEN: -32000,\n UNAUTHORIZED: -32001,\n};\n\n/**\n * Permission denied error.\n */\nexport class PermissionDeniedError extends Error {\n readonly code: number;\n\n constructor(message: string) {\n super(message);\n this.name = \"PermissionDeniedError\";\n this.code = PERMISSION_ERRORS.FORBIDDEN;\n }\n}\n\n/**\n * Create a permission middleware that checks method access.\n *\n * @param checker - The PermissionChecker to use for access control\n * @returns Middleware function that denies unauthorized access\n */\nexport function permissionMiddleware(checker: PermissionChecker): Middleware {\n return async (method, params, ctx, next) => {\n const result = checker.canCallMethod(ctx.session, method);\n\n if (!result.allowed) {\n throw new PermissionDeniedError(\n result.reason ?? `Permission denied for method: ${method}`\n );\n }\n\n return next();\n };\n}\n\n/**\n * Create a middleware that logs permission checks.\n *\n * @param checker - The PermissionChecker to use\n * @param logger - Optional logger (defaults to console)\n */\nexport function permissionLoggingMiddleware(\n checker: PermissionChecker,\n logger: Pick<Console, \"log\" | \"warn\"> = console\n): Middleware {\n return async (method, params, ctx, next) => {\n const result = checker.canCallMethod(ctx.session, method);\n\n if (result.allowed) {\n logger.log(\n `[PERMISSION] Allowed: ${ctx.session.role} -> ${method}`\n );\n } else {\n logger.warn(\n `[PERMISSION] Denied: ${ctx.session.role} -> ${method}: ${result.reason}`\n );\n throw new PermissionDeniedError(\n result.reason ?? `Permission denied for method: ${method}`\n );\n }\n\n return next();\n };\n}\n\n/**\n * Create a middleware that only checks specific methods.\n *\n * @param checker - The PermissionChecker to use\n * @param methodPatterns - Glob patterns for methods to check\n */\nexport function selectivePermissionMiddleware(\n checker: PermissionChecker,\n methodPatterns: string[]\n): Middleware {\n return async (method, params, ctx, next) => {\n // Check if method matches any pattern\n const shouldCheck = methodPatterns.some((pattern) => {\n // Simple glob matching\n const regex = new RegExp(\n \"^\" +\n pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \".*\")\n .replace(/\\*/g, \"[^/]*\") +\n \"$\"\n );\n return regex.test(method);\n });\n\n if (!shouldCheck) {\n // Skip permission check for non-matching methods\n return next();\n }\n\n const result = checker.canCallMethod(ctx.session, method);\n\n if (!result.allowed) {\n throw new PermissionDeniedError(\n result.reason ?? `Permission denied for method: ${method}`\n );\n }\n\n return next();\n };\n}\n","/**\n * ResourceCleaner implementation\n *\n * Handles cleanup of stale sessions, orphaned agents, subscriptions, and expired messages.\n */\n\nimport type {\n SessionManager,\n AgentRegistry,\n SubscriptionManager,\n ScopeManager,\n CleanupStrategy,\n CleanupThresholds,\n CleanupStats,\n ResourceCleaner,\n ResourceCleanerOptions,\n} from \"../types\";\nimport type { MessageRouterImpl } from \"../messages/router\";\n\n/**\n * Default cleanup thresholds.\n */\nconst DEFAULT_THRESHOLDS: Required<CleanupThresholds> = {\n sessionDisconnectMs: 5 * 60 * 1000, // 5 minutes\n sessionInactiveMs: 30 * 60 * 1000, // 30 minutes\n intervalMs: 60 * 1000, // 1 minute\n};\n\n/**\n * ResourceCleaner implementation.\n *\n * Runs cleanup cycles to remove:\n * - Stale disconnected sessions\n * - Orphaned agents (from closed sessions)\n * - Orphaned subscriptions (from closed sessions)\n * - Expired queued messages\n */\nexport class ResourceCleanerImpl implements ResourceCleaner {\n private readonly sessions: SessionManager;\n private readonly agents: AgentRegistry;\n private readonly subscriptions: SubscriptionManager;\n private readonly messages: MessageRouterImpl;\n private readonly scopes?: ScopeManager;\n private readonly thresholds: Required<CleanupThresholds>;\n private readonly strategy: CleanupStrategy;\n\n private _running = false;\n private _intervalId?: ReturnType<typeof setInterval>;\n\n constructor(options: ResourceCleanerOptions) {\n this.sessions = options.sessions;\n this.agents = options.agents;\n this.subscriptions = options.subscriptions;\n this.messages = options.messages as MessageRouterImpl;\n this.scopes = options.scopes;\n this.thresholds = {\n ...DEFAULT_THRESHOLDS,\n ...options.thresholds,\n };\n this.strategy = options.strategy ?? {};\n }\n\n /**\n * Whether automatic cleanup is running.\n */\n get running(): boolean {\n return this._running;\n }\n\n /**\n * Run one cleanup cycle.\n */\n async run(): Promise<CleanupStats> {\n const stats: CleanupStats = {\n sessionsExpired: 0,\n agentsUnregistered: 0,\n subscriptionsCancelled: 0,\n messagesExpired: 0,\n };\n\n // 1. Expire stale disconnected sessions\n const expiredSessionIds = this.sessions.expireStale(\n this.thresholds.sessionDisconnectMs\n );\n stats.sessionsExpired = expiredSessionIds.length;\n\n // Notify strategy for each expired session\n if (this.strategy.onStaleSession) {\n for (const sessionId of expiredSessionIds) {\n const session = this.sessions.get(sessionId);\n if (session) {\n this.strategy.onStaleSession(session);\n }\n }\n }\n\n // 2. Unregister orphaned agents (from expired sessions)\n for (const sessionId of expiredSessionIds) {\n // Get agents BEFORE unregistering for strategy callbacks\n const agentsToClean = this.agents.list({ sessionId });\n\n // Notify strategy BEFORE unregistering\n if (this.strategy.onOrphanedAgent) {\n for (const agent of agentsToClean) {\n this.strategy.onOrphanedAgent(agent);\n }\n }\n\n // Clean up scope memberships BEFORE unregistering agents\n if (this.scopes) {\n for (const agent of agentsToClean) {\n this.scopes.leaveAll(agent.id);\n }\n }\n\n const unregisteredIds = this.agents.unregisterBySession(sessionId);\n stats.agentsUnregistered += unregisteredIds.length;\n }\n\n // 3. Cancel orphaned subscriptions (from expired sessions)\n for (const sessionId of expiredSessionIds) {\n // Get subscriptions BEFORE cancelling for strategy callbacks\n // Access via store since SubscriptionManager doesn't expose list()\n const store = (this.subscriptions as any).store;\n const subsToCancel = store?.list?.({ sessionId }) ?? [];\n\n // Notify strategy BEFORE cancelling\n if (this.strategy.onOrphanedSubscription) {\n for (const subscription of subsToCancel) {\n this.strategy.onOrphanedSubscription(subscription);\n }\n }\n\n const cancelledIds = this.subscriptions.cancelBySession(sessionId);\n stats.subscriptionsCancelled += cancelledIds.length;\n }\n\n // 4. Expire old queued messages\n if (this.messages.expireMessages) {\n const expiredCount = this.messages.expireMessages();\n stats.messagesExpired = expiredCount;\n\n if (this.strategy.onExpiredMessages && expiredCount > 0) {\n this.strategy.onExpiredMessages(expiredCount);\n }\n }\n\n return stats;\n }\n\n /**\n * Start automatic cleanup interval.\n */\n start(): void {\n if (this._running) {\n return;\n }\n\n if (this.thresholds.intervalMs <= 0) {\n // Manual only mode\n return;\n }\n\n this._running = true;\n this._intervalId = setInterval(() => {\n this.run().catch((error) => {\n console.error(\"ResourceCleaner error:\", error);\n });\n }, this.thresholds.intervalMs);\n }\n\n /**\n * Stop automatic cleanup.\n */\n stop(): void {\n if (!this._running) {\n return;\n }\n\n this._running = false;\n if (this._intervalId) {\n clearInterval(this._intervalId);\n this._intervalId = undefined;\n }\n }\n}\n","/**\n * OutageBuffer implementation\n *\n * Buffers messages during peer outages for delivery on reconnect.\n */\n\nimport type {\n OutageBuffer,\n OutageBufferStats,\n ServerFederationEnvelope,\n} from \"../types\";\n\n/**\n * Default maximum messages per system.\n */\nconst DEFAULT_MAX_MESSAGES = 1000;\n\n/**\n * OutageBuffer options.\n */\nexport interface OutageBufferOptions {\n /** Maximum messages to buffer per system */\n maxMessages?: number;\n}\n\n/**\n * OutageBuffer implementation.\n *\n * Provides FIFO buffering of federation messages during peer outages.\n * When buffer is full, oldest messages are dropped.\n *\n * @example\n * ```typescript\n * const buffer = new OutageBufferImpl({ maxMessages: 100 });\n *\n * // Buffer message during outage\n * buffer.add(\"peer-system\", envelope);\n *\n * // On reconnect, flush and send\n * const pending = buffer.flush(\"peer-system\");\n * for (const msg of pending) {\n * await connection.send(msg);\n * }\n * ```\n */\nexport class OutageBufferImpl implements OutageBuffer {\n private readonly queues: Map<string, ServerFederationEnvelope[]> = new Map();\n private readonly maxMessages: number;\n\n constructor(options?: OutageBufferOptions) {\n this.maxMessages = options?.maxMessages ?? DEFAULT_MAX_MESSAGES;\n }\n\n /**\n * Add message to buffer for a system.\n *\n * If the buffer is full, the oldest message is dropped.\n */\n add(systemId: string, envelope: ServerFederationEnvelope): void {\n let queue = this.queues.get(systemId);\n if (!queue) {\n queue = [];\n this.queues.set(systemId, queue);\n }\n\n // Drop oldest if at capacity\n if (queue.length >= this.maxMessages) {\n queue.shift();\n }\n\n queue.push(envelope);\n }\n\n /**\n * Flush all buffered messages for a system.\n *\n * Returns messages in FIFO order and clears the buffer.\n */\n flush(systemId: string): ServerFederationEnvelope[] {\n const queue = this.queues.get(systemId);\n if (!queue) {\n return [];\n }\n\n this.queues.delete(systemId);\n return queue;\n }\n\n /**\n * Get buffer statistics.\n */\n stats(): OutageBufferStats {\n let total = 0;\n const bySystem: Record<string, number> = {};\n\n for (const [systemId, queue] of this.queues) {\n bySystem[systemId] = queue.length;\n total += queue.length;\n }\n\n return { total, bySystem };\n }\n\n /**\n * Clear all buffered messages.\n */\n clear(): void {\n this.queues.clear();\n }\n\n /**\n * Clear buffered messages for a specific system.\n */\n clearSystem(systemId: string): void {\n this.queues.delete(systemId);\n }\n}\n","/**\n * FederationGateway implementation\n *\n * Manages connections between MAP systems for federation.\n */\n\nimport type {\n FederationGateway,\n FederationGatewayOptions,\n PeerConnection,\n PeerMessageHandler,\n ServerFederationEnvelope,\n OutageBuffer,\n} from \"../types\";\nimport { OutageBufferImpl } from \"./buffer\";\n\n/**\n * Default maximum hops for loop prevention.\n */\nconst DEFAULT_MAX_HOPS = 5;\n\n/**\n * Error thrown when routing would exceed max hops.\n */\nexport class MaxHopsExceededError extends Error {\n constructor(systemId: string, maxHops: number) {\n super(`Max hops (${maxHops}) exceeded routing to ${systemId}`);\n this.name = \"MaxHopsExceededError\";\n }\n}\n\n/**\n * Error thrown when routing would create a loop.\n */\nexport class RoutingLoopError extends Error {\n constructor(systemId: string, path: string[]) {\n super(`Routing loop detected: ${path.join(\" -> \")} -> ${systemId}`);\n this.name = \"RoutingLoopError\";\n }\n}\n\n/**\n * Error thrown when peer is not found.\n */\nexport class PeerNotFoundError extends Error {\n constructor(systemId: string) {\n super(`Peer not found: ${systemId}`);\n this.name = \"PeerNotFoundError\";\n }\n}\n\n/**\n * Transport interface for peer communication.\n *\n * Implement this for different transport mechanisms (WebSocket, HTTP, etc.)\n */\nexport interface PeerTransport {\n /** Send message to peer */\n send(envelope: ServerFederationEnvelope): Promise<void>;\n /** Close the transport */\n close(): void;\n}\n\n/**\n * Internal peer state with transport.\n */\ninterface PeerState {\n connection: PeerConnection;\n transport?: PeerTransport;\n}\n\n/**\n * FederationGateway implementation.\n *\n * Manages peer connections and message routing between federated MAP systems.\n *\n * @example\n * ```typescript\n * const gateway = new FederationGatewayImpl({\n * systemId: \"system-a\",\n * buffer: { maxMessages: 1000 },\n * });\n *\n * // Connect to peer\n * await gateway.connectPeer({\n * systemId: \"system-b\",\n * endpoint: \"wss://system-b.example.com/map\",\n * });\n *\n * // Handle incoming messages\n * gateway.onPeerMessage((from, envelope) => {\n * console.log(\"Message from\", from, envelope);\n * });\n *\n * // Route message to peer\n * await gateway.routeToPeer(\"system-b\", {\n * payload: { type: \"event\", data: {} },\n * routing: { from: \"system-a\", to: \"system-b\", hops: [], maxHops: 5 },\n * timestamp: Date.now(),\n * });\n * ```\n */\nexport class FederationGatewayImpl implements FederationGateway {\n readonly systemId: string;\n readonly buffer: OutageBuffer;\n\n private readonly peers: Map<string, PeerState> = new Map();\n private readonly messageHandlers: Set<PeerMessageHandler> = new Set();\n private readonly maxHops: number;\n\n constructor(options: FederationGatewayOptions) {\n this.systemId = options.systemId;\n this.buffer = new OutageBufferImpl(options.buffer);\n this.maxHops = DEFAULT_MAX_HOPS;\n }\n\n /**\n * Connect to a peer system.\n *\n * This is a placeholder that creates the peer entry.\n * In production, this would establish the actual transport connection.\n */\n async connectPeer(params: {\n systemId: string;\n endpoint: string;\n credentials?: unknown;\n transport?: PeerTransport;\n }): Promise<PeerConnection> {\n // Check if already connected\n const existing = this.peers.get(params.systemId);\n if (existing?.connection.status === \"connected\") {\n return existing.connection;\n }\n\n // Create peer connection\n const connection: PeerConnection = {\n systemId: params.systemId,\n endpoint: params.endpoint,\n status: \"connecting\",\n };\n\n this.peers.set(params.systemId, {\n connection,\n transport: params.transport,\n });\n\n // Mark as connected (in real impl, this happens after transport handshake)\n connection.status = \"connected\";\n connection.connectedAt = Date.now();\n connection.lastActivity = Date.now();\n\n // Flush any buffered messages\n const buffered = this.buffer.flush(params.systemId);\n if (buffered.length > 0 && params.transport) {\n for (const envelope of buffered) {\n await params.transport.send(envelope);\n }\n }\n\n return connection;\n }\n\n /**\n * Route message to a peer system.\n *\n * If peer is connected, sends immediately.\n * If peer is disconnected, buffers for later delivery.\n * Validates hop count and loop detection before routing.\n */\n async routeToPeer(\n systemId: string,\n envelope: ServerFederationEnvelope\n ): Promise<void> {\n // Validate routing\n this.validateRouting(systemId, envelope);\n\n // Add this system to hops\n const updatedEnvelope: ServerFederationEnvelope = {\n ...envelope,\n routing: {\n ...envelope.routing,\n hops: [...envelope.routing.hops, this.systemId],\n },\n };\n\n const peer = this.peers.get(systemId);\n\n if (!peer || peer.connection.status !== \"connected\") {\n // Buffer for later\n this.buffer.add(systemId, updatedEnvelope);\n return;\n }\n\n // Send via transport\n if (peer.transport) {\n await peer.transport.send(updatedEnvelope);\n peer.connection.lastActivity = Date.now();\n } else {\n // No transport, buffer instead\n this.buffer.add(systemId, updatedEnvelope);\n }\n }\n\n /**\n * Register handler for incoming peer messages.\n */\n onPeerMessage(handler: PeerMessageHandler): void {\n this.messageHandlers.add(handler);\n }\n\n /**\n * Remove a peer message handler.\n */\n offPeerMessage(handler: PeerMessageHandler): void {\n this.messageHandlers.delete(handler);\n }\n\n /**\n * Handle an incoming message from a peer.\n *\n * This should be called by the transport when a message arrives.\n */\n handleIncomingMessage(\n from: string,\n envelope: ServerFederationEnvelope\n ): void {\n // Update peer activity\n const peer = this.peers.get(from);\n if (peer) {\n peer.connection.lastActivity = Date.now();\n }\n\n // Notify handlers\n for (const handler of this.messageHandlers) {\n try {\n handler(from, envelope);\n } catch (error) {\n console.error(\"FederationGateway message handler error:\", error);\n }\n }\n }\n\n /**\n * List all peer connections.\n */\n listPeers(): PeerConnection[] {\n return Array.from(this.peers.values()).map((p) => p.connection);\n }\n\n /**\n * Get a specific peer connection.\n */\n getPeer(systemId: string): PeerConnection | undefined {\n return this.peers.get(systemId)?.connection;\n }\n\n /**\n * Disconnect from a peer system.\n */\n disconnectPeer(systemId: string): void {\n const peer = this.peers.get(systemId);\n if (!peer) {\n return;\n }\n\n // Close transport if exists\n if (peer.transport) {\n peer.transport.close();\n }\n\n // Mark as disconnected\n peer.connection.status = \"disconnected\";\n this.peers.delete(systemId);\n }\n\n /**\n * Mark a peer as disconnected (e.g., on connection drop).\n *\n * The peer entry is kept for potential reconnection,\n * and messages will be buffered.\n */\n markPeerDisconnected(systemId: string): void {\n const peer = this.peers.get(systemId);\n if (peer) {\n peer.connection.status = \"disconnected\";\n peer.transport = undefined;\n }\n }\n\n /**\n * Validate routing before sending.\n *\n * Throws if max hops exceeded or loop detected.\n */\n private validateRouting(\n targetSystem: string,\n envelope: ServerFederationEnvelope\n ): void {\n const hops = envelope.routing.hops;\n const maxHops = envelope.routing.maxHops ?? this.maxHops;\n\n // Check hop count (current hops + 1 for this hop)\n if (hops.length >= maxHops) {\n throw new MaxHopsExceededError(targetSystem, maxHops);\n }\n\n // Check for loop (target already in path)\n if (hops.includes(targetSystem)) {\n throw new RoutingLoopError(targetSystem, hops);\n }\n\n // Check if we've already been in the path\n if (hops.includes(this.systemId)) {\n throw new RoutingLoopError(this.systemId, hops);\n }\n }\n\n /**\n * Create an envelope for sending.\n */\n createEnvelope(\n to: string,\n payload: unknown,\n maxHops?: number\n ): ServerFederationEnvelope {\n return {\n payload,\n routing: {\n from: this.systemId,\n to,\n hops: [],\n maxHops: maxHops ?? this.maxHops,\n },\n timestamp: Date.now(),\n };\n }\n}\n","/**\n * Federated ID utilities\n *\n * Standardized format for remote entity IDs in federation.\n * Format: \"{systemId}:{entityType}:{entityId}\"\n *\n * Examples:\n * - \"system-west:agent:agent-123\"\n * - \"system-east:scope:room-456\"\n */\n\n/**\n * Entity types supported in federated IDs.\n */\nexport type FederatedEntityType = \"agent\" | \"scope\" | \"message\";\n\n/**\n * Parsed federated ID components.\n */\nexport interface FederatedIdComponents {\n /** The originating system ID */\n systemId: string;\n /** The entity type */\n entityType: FederatedEntityType;\n /** The original entity ID in the source system */\n entityId: string;\n}\n\n/**\n * Error thrown when a federated ID is invalid.\n */\nexport class InvalidFederatedIdError extends Error {\n constructor(id: string, reason: string) {\n super(`Invalid federated ID \"${id}\": ${reason}`);\n this.name = \"InvalidFederatedIdError\";\n }\n}\n\n/**\n * Separator used in federated IDs.\n */\nconst SEPARATOR = \":\";\n\n/**\n * Valid entity types.\n */\nconst VALID_ENTITY_TYPES: readonly FederatedEntityType[] = [\"agent\", \"scope\", \"message\"];\n\n/**\n * Check if a string is a valid entity type.\n */\nfunction isValidEntityType(type: string): type is FederatedEntityType {\n return VALID_ENTITY_TYPES.includes(type as FederatedEntityType);\n}\n\n/**\n * Create a federated ID from components.\n *\n * @example\n * ```typescript\n * const id = formatFederatedId(\"system-west\", \"agent\", \"agent-123\");\n * // => \"system-west:agent:agent-123\"\n * ```\n */\nexport function formatFederatedId(\n systemId: string,\n entityType: FederatedEntityType,\n entityId: string\n): string {\n // Validate components\n if (!systemId || systemId.includes(SEPARATOR)) {\n throw new InvalidFederatedIdError(\n `${systemId}:${entityType}:${entityId}`,\n \"systemId cannot be empty or contain ':'\"\n );\n }\n if (!entityId || entityId.includes(SEPARATOR)) {\n throw new InvalidFederatedIdError(\n `${systemId}:${entityType}:${entityId}`,\n \"entityId cannot be empty or contain ':'\"\n );\n }\n\n return `${systemId}${SEPARATOR}${entityType}${SEPARATOR}${entityId}`;\n}\n\n/**\n * Parse a federated ID into its components.\n *\n * @throws InvalidFederatedIdError if the ID is not valid\n *\n * @example\n * ```typescript\n * const { systemId, entityType, entityId } = parseFederatedId(\"system-west:agent:agent-123\");\n * // => { systemId: \"system-west\", entityType: \"agent\", entityId: \"agent-123\" }\n * ```\n */\nexport function parseFederatedId(id: string): FederatedIdComponents {\n const parts = id.split(SEPARATOR);\n\n if (parts.length !== 3) {\n throw new InvalidFederatedIdError(\n id,\n `expected format \"systemId:entityType:entityId\", got ${parts.length} parts`\n );\n }\n\n const [systemId, entityType, entityId] = parts;\n\n if (!systemId) {\n throw new InvalidFederatedIdError(id, \"systemId cannot be empty\");\n }\n\n if (!isValidEntityType(entityType)) {\n throw new InvalidFederatedIdError(\n id,\n `entityType must be one of: ${VALID_ENTITY_TYPES.join(\", \")}`\n );\n }\n\n if (!entityId) {\n throw new InvalidFederatedIdError(id, \"entityId cannot be empty\");\n }\n\n return { systemId, entityType, entityId };\n}\n\n/**\n * Check if a string is a valid federated ID.\n *\n * @example\n * ```typescript\n * isFederatedId(\"system-west:agent:agent-123\"); // true\n * isFederatedId(\"agent-123\"); // false\n * ```\n */\nexport function isFederatedId(id: string): boolean {\n try {\n parseFederatedId(id);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a federated ID is for a specific entity type.\n *\n * @example\n * ```typescript\n * isFederatedAgent(\"system-west:agent:agent-123\"); // true\n * isFederatedAgent(\"system-west:scope:room-456\"); // false\n * ```\n */\nexport function isFederatedAgent(id: string): boolean {\n try {\n const { entityType } = parseFederatedId(id);\n return entityType === \"agent\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a federated ID is for a scope.\n */\nexport function isFederatedScope(id: string): boolean {\n try {\n const { entityType } = parseFederatedId(id);\n return entityType === \"scope\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a federated ID is from a specific system.\n */\nexport function isFromSystem(id: string, systemId: string): boolean {\n try {\n const parsed = parseFederatedId(id);\n return parsed.systemId === systemId;\n } catch {\n return false;\n }\n}\n\n/**\n * Extract the original entity ID from a federated ID.\n * Returns the original ID if not a federated ID.\n */\nexport function extractEntityId(id: string): string {\n try {\n const { entityId } = parseFederatedId(id);\n return entityId;\n } catch {\n return id;\n }\n}\n\n/**\n * Extract the system ID from a federated ID.\n * Returns undefined if not a federated ID.\n */\nexport function extractSystemId(id: string): string | undefined {\n try {\n const { systemId } = parseFederatedId(id);\n return systemId;\n } catch {\n return undefined;\n }\n}\n","/**\n * FederatedAgentRegistry decorator\n *\n * Wraps an AgentRegistry to add federation capabilities.\n */\n\nimport type {\n AgentRegistry,\n RegisteredAgent,\n AgentFilter,\n ServerAgentState,\n FederatedAgentRegistryOptions,\n FederatedAgentSyncOptions,\n FederationGateway,\n} from \"../../types\";\nimport {\n formatFederatedId,\n parseFederatedId,\n isFederatedId,\n isFromSystem,\n} from \"../federated-id\";\n\n/**\n * Default sync options - all syncing enabled.\n */\nconst DEFAULT_SYNC_OPTIONS: Required<FederatedAgentSyncOptions> = {\n onRegister: true,\n onStateChange: true,\n includeRemote: true,\n};\n\n/**\n * FederatedAgentRegistry decorator.\n *\n * Wraps a local AgentRegistry and adds federation capabilities:\n * - Broadcasts local agent changes to peers\n * - Tracks remote agents from peers\n * - Merges remote agents into list() results\n *\n * @example\n * ```typescript\n * const local = new AgentRegistryImpl({ eventBus });\n * const federated = new FederatedAgentRegistry({\n * local,\n * gateway,\n * sync: { onRegister: true, includeRemote: true },\n * });\n *\n * // Use like normal AgentRegistry\n * const agent = federated.register({ name: \"Alice\", sessionId: \"s1\" });\n * // Agent is automatically broadcast to peers\n * ```\n */\nexport class FederatedAgentRegistry implements AgentRegistry {\n private readonly local: AgentRegistry;\n private readonly gateway: FederationGateway;\n private readonly sync: Required<FederatedAgentSyncOptions>;\n\n /** Remote agents from peer systems */\n private readonly remoteAgents: Map<string, RegisteredAgent> = new Map();\n\n constructor(options: FederatedAgentRegistryOptions) {\n this.local = options.local;\n this.gateway = options.gateway;\n this.sync = { ...DEFAULT_SYNC_OPTIONS, ...options.sync };\n\n // Listen for incoming peer messages\n this.gateway.onPeerMessage(this.handlePeerMessage.bind(this));\n }\n\n /**\n * Register a new agent.\n * Broadcasts to peers if onRegister sync is enabled.\n */\n register(params: {\n name: string;\n role?: string;\n metadata?: Record<string, unknown>;\n sessionId: string;\n }): RegisteredAgent {\n const agent = this.local.register(params);\n\n if (this.sync.onRegister) {\n this.broadcastAgentEvent(\"agent.registered\", agent);\n }\n\n return agent;\n }\n\n /**\n * Get agent by ID.\n * Checks both local and remote agents.\n */\n get(id: string): RegisteredAgent | undefined {\n // Check local first\n const local = this.local.get(id);\n if (local) return local;\n\n // Check remote\n if (this.sync.includeRemote) {\n return this.remoteAgents.get(id);\n }\n\n return undefined;\n }\n\n /**\n * List agents matching filter.\n * Includes remote agents if includeRemote sync is enabled.\n */\n list(filter?: AgentFilter): RegisteredAgent[] {\n const localAgents = this.local.list(filter);\n\n if (!this.sync.includeRemote) {\n return localAgents;\n }\n\n // Merge with remote agents\n const remoteAgents = this.filterRemoteAgents(filter);\n return [...localAgents, ...remoteAgents];\n }\n\n /**\n * Unregister an agent.\n * Broadcasts to peers if onRegister sync is enabled.\n */\n unregister(id: string): boolean {\n // Can't unregister remote agents locally\n if (this.remoteAgents.has(id)) {\n return false;\n }\n\n const agent = this.local.get(id);\n const success = this.local.unregister(id);\n\n if (success && agent && this.sync.onRegister) {\n this.broadcastAgentEvent(\"agent.unregistered\", agent);\n }\n\n return success;\n }\n\n /**\n * Update agent state.\n * Broadcasts to peers if onStateChange sync is enabled.\n */\n updateState(id: string, state: ServerAgentState): RegisteredAgent {\n // Can't update remote agents locally\n if (this.remoteAgents.has(id)) {\n throw new Error(`Cannot update remote agent: ${id}`);\n }\n\n const agent = this.local.updateState(id, state);\n\n if (this.sync.onStateChange) {\n this.broadcastAgentEvent(\"agent.state.changed\", agent);\n }\n\n return agent;\n }\n\n /**\n * Update agent metadata.\n * Broadcasts to peers if onStateChange sync is enabled.\n */\n updateMetadata(id: string, metadata: Record<string, unknown>): RegisteredAgent {\n // Can't update remote agents locally\n if (this.remoteAgents.has(id)) {\n throw new Error(`Cannot update remote agent: ${id}`);\n }\n\n const agent = this.local.updateMetadata(id, metadata);\n\n if (this.sync.onStateChange) {\n this.broadcastAgentEvent(\"agent.metadata.changed\", agent);\n }\n\n return agent;\n }\n\n /**\n * Unregister all agents for a session.\n * Broadcasts each unregistration to peers.\n */\n unregisterBySession(sessionId: string): string[] {\n const agents = this.local.list({ sessionId });\n const unregisteredIds = this.local.unregisterBySession(sessionId);\n\n if (this.sync.onRegister && unregisteredIds.length > 0) {\n for (const agent of agents) {\n if (unregisteredIds.includes(agent.id)) {\n this.broadcastAgentEvent(\"agent.unregistered\", agent);\n }\n }\n }\n\n return unregisteredIds;\n }\n\n /**\n * Check if an agent is remote.\n */\n isRemote(agentId: string): boolean {\n return this.remoteAgents.has(agentId);\n }\n\n /**\n * Get all remote agents.\n */\n getRemoteAgents(): RegisteredAgent[] {\n return Array.from(this.remoteAgents.values());\n }\n\n /**\n * Clear all remote agents from a specific system.\n */\n clearRemoteSystem(systemId: string): void {\n for (const [id] of this.remoteAgents) {\n if (isFromSystem(id, systemId)) {\n this.remoteAgents.delete(id);\n }\n }\n }\n\n /**\n * Broadcast an agent event to all peers.\n */\n private broadcastAgentEvent(\n type: \"agent.registered\" | \"agent.unregistered\" | \"agent.state.changed\" | \"agent.metadata.changed\",\n agent: RegisteredAgent\n ): void {\n const peers = this.gateway.listPeers();\n for (const peer of peers) {\n if (peer.status === \"connected\") {\n const envelope = this.gateway.createEnvelope(peer.systemId, {\n type,\n agent: {\n ...agent,\n // Mark as coming from this system\n metadata: {\n ...agent.metadata,\n _federatedFrom: (this.gateway as any).systemId,\n },\n },\n });\n\n this.gateway.routeToPeer(peer.systemId, envelope).catch((err) => {\n console.error(`Failed to sync agent to ${peer.systemId}:`, err);\n });\n }\n }\n }\n\n /**\n * Handle incoming peer messages.\n */\n private handlePeerMessage(\n from: string,\n envelope: { payload: unknown }\n ): void {\n const payload = envelope.payload as {\n type: string;\n agent?: RegisteredAgent;\n };\n\n if (!payload.type?.startsWith(\"agent.\") || !payload.agent) {\n return;\n }\n\n const remoteAgent = payload.agent;\n // Use standardized federated ID format: {systemId}:agent:{entityId}\n const remoteId = formatFederatedId(from, \"agent\", remoteAgent.id);\n\n switch (payload.type) {\n case \"agent.registered\":\n this.remoteAgents.set(remoteId, {\n ...remoteAgent,\n id: remoteId,\n metadata: {\n ...remoteAgent.metadata,\n _federatedFrom: from,\n _originalId: remoteAgent.id,\n },\n });\n break;\n\n case \"agent.unregistered\":\n this.remoteAgents.delete(remoteId);\n break;\n\n case \"agent.state.changed\":\n case \"agent.metadata.changed\":\n if (this.remoteAgents.has(remoteId)) {\n this.remoteAgents.set(remoteId, {\n ...remoteAgent,\n id: remoteId,\n metadata: {\n ...remoteAgent.metadata,\n _federatedFrom: from,\n _originalId: remoteAgent.id,\n },\n });\n }\n break;\n }\n }\n\n /**\n * Filter remote agents by criteria.\n */\n private filterRemoteAgents(filter?: AgentFilter): RegisteredAgent[] {\n if (!filter) {\n return Array.from(this.remoteAgents.values());\n }\n\n return Array.from(this.remoteAgents.values()).filter((agent) => {\n if (filter.role && agent.role !== filter.role) return false;\n if (filter.state && agent.state !== filter.state) return false;\n if (filter.sessionId && agent.sessionId !== filter.sessionId) return false;\n if (filter.scopeId) {\n // Can't filter remote agents by scope easily\n // Would need to track scope membership from remote\n return false;\n }\n return true;\n });\n }\n}\n","/**\n * FederatedScopeManager decorator\n *\n * Wraps a ScopeManager to add federation capabilities.\n */\n\nimport type {\n ScopeManager,\n ServerScope,\n ScopeFilter,\n FederatedScopeManagerOptions,\n FederatedScopeSyncOptions,\n FederationGateway,\n} from \"../../types\";\nimport {\n formatFederatedId,\n isFromSystem,\n} from \"../federated-id\";\n\n/**\n * Default sync options - all syncing enabled.\n */\nconst DEFAULT_SYNC_OPTIONS: Required<FederatedScopeSyncOptions> = {\n onCreateScope: true,\n onMembershipChange: true,\n includeRemote: true,\n};\n\n/**\n * Remote scope with additional tracking.\n */\ninterface RemoteScope extends ServerScope {\n members: Set<string>;\n}\n\n/**\n * FederatedScopeManager decorator.\n *\n * Wraps a local ScopeManager and adds federation capabilities:\n * - Broadcasts local scope changes to peers\n * - Tracks remote scopes from peers\n * - Merges remote scopes into list() results\n *\n * @example\n * ```typescript\n * const local = new ScopeManagerImpl({ eventBus });\n * const federated = new FederatedScopeManager({\n * local,\n * gateway,\n * sync: { onCreateScope: true, includeRemote: true },\n * });\n *\n * // Use like normal ScopeManager\n * const scope = federated.create({ name: \"team-room\", createdBy: \"agent1\" });\n * // Scope is automatically broadcast to peers\n * ```\n */\nexport class FederatedScopeManager implements ScopeManager {\n private readonly local: ScopeManager;\n private readonly gateway: FederationGateway;\n private readonly sync: Required<FederatedScopeSyncOptions>;\n\n /** Remote scopes from peer systems */\n private readonly remoteScopes: Map<string, RemoteScope> = new Map();\n\n constructor(options: FederatedScopeManagerOptions) {\n this.local = options.local;\n this.gateway = options.gateway;\n this.sync = { ...DEFAULT_SYNC_OPTIONS, ...options.sync };\n\n // Listen for incoming peer messages\n this.gateway.onPeerMessage(this.handlePeerMessage.bind(this));\n }\n\n /**\n * Create a new scope.\n * Broadcasts to peers if onCreateScope sync is enabled.\n */\n create(params: {\n name: string;\n metadata?: Record<string, unknown>;\n createdBy?: string;\n parentId?: string;\n }): ServerScope {\n const scope = this.local.create(params);\n\n if (this.sync.onCreateScope) {\n this.broadcastScopeEvent(\"scope.created\", scope);\n }\n\n return scope;\n }\n\n /**\n * Get scope by ID.\n * Checks both local and remote scopes.\n */\n get(id: string): ServerScope | undefined {\n // Check local first\n const local = this.local.get(id);\n if (local) return local;\n\n // Check remote\n if (this.sync.includeRemote) {\n return this.remoteScopes.get(id);\n }\n\n return undefined;\n }\n\n /**\n * List scopes with optional filter.\n * Includes remote scopes if includeRemote sync is enabled.\n */\n list(filter?: ScopeFilter): ServerScope[] {\n const localScopes = this.local.list(filter);\n\n if (!this.sync.includeRemote) {\n return localScopes;\n }\n\n // Merge with remote scopes\n const remoteScopes = this.filterRemoteScopes(filter);\n return [...localScopes, ...remoteScopes];\n }\n\n /**\n * Delete a scope.\n * Broadcasts to peers if onCreateScope sync is enabled.\n */\n delete(id: string, opts?: { deleteDescendants?: boolean }): boolean {\n // Can't delete remote scopes locally\n if (this.remoteScopes.has(id)) {\n return false;\n }\n\n const scope = this.local.get(id);\n const success = this.local.delete(id, opts);\n\n if (success && scope && this.sync.onCreateScope) {\n this.broadcastScopeEvent(\"scope.deleted\", scope);\n }\n\n return success;\n }\n\n /**\n * Get parent scope.\n */\n getParent(scopeId: string): ServerScope | undefined {\n // Check if it's a remote scope\n const remote = this.remoteScopes.get(scopeId);\n if (remote?.parentId) {\n return this.remoteScopes.get(remote.parentId) ?? this.local.get(remote.parentId);\n }\n\n return this.local.getParent(scopeId);\n }\n\n /**\n * Get child scopes.\n */\n getChildren(scopeId: string): ServerScope[] {\n const localChildren = this.local.getChildren(scopeId);\n\n if (!this.sync.includeRemote) {\n return localChildren;\n }\n\n // Include remote children\n const remoteChildren = Array.from(this.remoteScopes.values()).filter(\n (s) => s.parentId === scopeId\n );\n\n return [...localChildren, ...remoteChildren];\n }\n\n /**\n * Get all ancestor scopes.\n */\n getAncestors(scopeId: string): ServerScope[] {\n // For remote scopes, just return empty (hierarchy tracking is complex across systems)\n if (this.remoteScopes.has(scopeId)) {\n return [];\n }\n\n return this.local.getAncestors(scopeId);\n }\n\n /**\n * Get all descendant scopes.\n */\n getDescendants(scopeId: string): ServerScope[] {\n // For remote scopes, just return empty\n if (this.remoteScopes.has(scopeId)) {\n return [];\n }\n\n return this.local.getDescendants(scopeId);\n }\n\n /**\n * Add agent to scope.\n * Broadcasts to peers if onMembershipChange sync is enabled.\n */\n join(scopeId: string, agentId: string): void {\n // Can't join remote scopes locally\n if (this.remoteScopes.has(scopeId)) {\n throw new Error(`Cannot join remote scope: ${scopeId}`);\n }\n\n this.local.join(scopeId, agentId);\n\n if (this.sync.onMembershipChange) {\n const scope = this.local.get(scopeId);\n if (scope) {\n this.broadcastMembershipEvent(\"scope.agent.joined\", scope, agentId);\n }\n }\n }\n\n /**\n * Remove agent from scope.\n * Broadcasts to peers if onMembershipChange sync is enabled.\n */\n leave(scopeId: string, agentId: string): void {\n // Can't leave remote scopes locally\n if (this.remoteScopes.has(scopeId)) {\n throw new Error(`Cannot leave remote scope: ${scopeId}`);\n }\n\n this.local.leave(scopeId, agentId);\n\n if (this.sync.onMembershipChange) {\n const scope = this.local.get(scopeId);\n if (scope) {\n this.broadcastMembershipEvent(\"scope.agent.left\", scope, agentId);\n }\n }\n }\n\n /**\n * Remove agent from all scopes.\n */\n leaveAll(agentId: string): void {\n // Get scopes before leaving\n const scopeIds = this.local.getScopesForAgent?.(agentId) ?? [];\n\n // Leave all local scopes\n for (const scopeId of scopeIds) {\n this.leave(scopeId, agentId);\n }\n }\n\n /**\n * Get all agents in a scope.\n */\n getMembers(\n scopeId: string,\n opts?: { includeDescendants?: boolean }\n ): string[] {\n // For remote scopes, return tracked members\n const remote = this.remoteScopes.get(scopeId);\n if (remote) {\n return Array.from(remote.members);\n }\n\n return this.local.getMembers(scopeId, opts);\n }\n\n /**\n * Get all scopes an agent belongs to.\n */\n getScopesForAgent?(agentId: string): string[] {\n const localScopes = this.local.getScopesForAgent?.(agentId) ?? [];\n\n if (!this.sync.includeRemote) {\n return localScopes;\n }\n\n // Include remote scopes\n const remoteScopes: string[] = [];\n for (const [id, scope] of this.remoteScopes) {\n if (scope.members.has(agentId)) {\n remoteScopes.push(id);\n }\n }\n\n return [...localScopes, ...remoteScopes];\n }\n\n /**\n * Check if a scope is remote.\n */\n isRemote(scopeId: string): boolean {\n return this.remoteScopes.has(scopeId);\n }\n\n /**\n * Get all remote scopes.\n */\n getRemoteScopes(): ServerScope[] {\n return Array.from(this.remoteScopes.values());\n }\n\n /**\n * Clear all remote scopes from a specific system.\n */\n clearRemoteSystem(systemId: string): void {\n for (const [id] of this.remoteScopes) {\n if (isFromSystem(id, systemId)) {\n this.remoteScopes.delete(id);\n }\n }\n }\n\n /**\n * Broadcast a scope event to all peers.\n */\n private broadcastScopeEvent(\n type: \"scope.created\" | \"scope.deleted\",\n scope: ServerScope\n ): void {\n const peers = this.gateway.listPeers();\n for (const peer of peers) {\n if (peer.status === \"connected\") {\n const envelope = this.gateway.createEnvelope(peer.systemId, {\n type,\n scope: {\n ...scope,\n metadata: {\n ...scope.metadata,\n _federatedFrom: (this.gateway as any).systemId,\n },\n },\n });\n\n this.gateway.routeToPeer(peer.systemId, envelope).catch((err) => {\n console.error(`Failed to sync scope to ${peer.systemId}:`, err);\n });\n }\n }\n }\n\n /**\n * Broadcast a membership event to all peers.\n */\n private broadcastMembershipEvent(\n type: \"scope.agent.joined\" | \"scope.agent.left\",\n scope: ServerScope,\n agentId: string\n ): void {\n const peers = this.gateway.listPeers();\n for (const peer of peers) {\n if (peer.status === \"connected\") {\n const envelope = this.gateway.createEnvelope(peer.systemId, {\n type,\n scopeId: scope.id,\n agentId,\n });\n\n this.gateway.routeToPeer(peer.systemId, envelope).catch((err) => {\n console.error(`Failed to sync membership to ${peer.systemId}:`, err);\n });\n }\n }\n }\n\n /**\n * Handle incoming peer messages.\n */\n private handlePeerMessage(\n from: string,\n envelope: { payload: unknown }\n ): void {\n const payload = envelope.payload as {\n type: string;\n scope?: ServerScope;\n scopeId?: string;\n agentId?: string;\n };\n\n if (!payload.type?.startsWith(\"scope.\")) {\n return;\n }\n\n switch (payload.type) {\n case \"scope.created\":\n if (payload.scope) {\n // Use standardized federated ID format: {systemId}:scope:{entityId}\n const remoteId = formatFederatedId(from, \"scope\", payload.scope.id);\n this.remoteScopes.set(remoteId, {\n ...payload.scope,\n id: remoteId,\n metadata: {\n ...payload.scope.metadata,\n _federatedFrom: from,\n _originalId: payload.scope.id,\n },\n members: new Set(),\n });\n }\n break;\n\n case \"scope.deleted\":\n if (payload.scope) {\n const remoteId = formatFederatedId(from, \"scope\", payload.scope.id);\n this.remoteScopes.delete(remoteId);\n }\n break;\n\n case \"scope.agent.joined\":\n if (payload.scopeId && payload.agentId) {\n const remoteId = formatFederatedId(from, \"scope\", payload.scopeId);\n const scope = this.remoteScopes.get(remoteId);\n if (scope) {\n scope.members.add(payload.agentId);\n }\n }\n break;\n\n case \"scope.agent.left\":\n if (payload.scopeId && payload.agentId) {\n const remoteId = formatFederatedId(from, \"scope\", payload.scopeId);\n const scope = this.remoteScopes.get(remoteId);\n if (scope) {\n scope.members.delete(payload.agentId);\n }\n }\n break;\n }\n }\n\n /**\n * Filter remote scopes by criteria.\n */\n private filterRemoteScopes(filter?: ScopeFilter): ServerScope[] {\n if (!filter) {\n return Array.from(this.remoteScopes.values());\n }\n\n return Array.from(this.remoteScopes.values()).filter((scope) => {\n if (filter.parentId !== undefined) {\n if (filter.parentId === null && scope.parentId) return false;\n if (filter.parentId !== null && scope.parentId !== filter.parentId) return false;\n }\n // Can't filter by ancestorId for remote scopes\n return true;\n });\n }\n}\n","/**\n * FederatedMessageRouter decorator\n *\n * Wraps a MessageRouter to add federation capabilities.\n */\n\nimport type {\n MessageRouter,\n ServerMessage,\n DeliveryHandler,\n FederatedMessageRouterOptions,\n FederationGateway,\n AgentRegistry,\n} from \"../../types\";\nimport {\n formatFederatedId,\n parseFederatedId,\n isFederatedId,\n isFederatedAgent,\n} from \"../federated-id\";\n\n/**\n * FederatedMessageRouter decorator.\n *\n * Wraps a local MessageRouter and adds federation capabilities:\n * - Routes messages to remote agents via the gateway\n * - Handles incoming messages from peers\n * - Determines if targets are local or remote\n *\n * @example\n * ```typescript\n * const local = new MessageRouterImpl({ eventBus, agents, scopes });\n * const federated = new FederatedMessageRouter({\n * local,\n * gateway,\n * agents: federatedAgentRegistry, // Should be a FederatedAgentRegistry\n * });\n *\n * // Routes automatically to correct destination\n * federated.sendToAgent({\n * from: \"local-agent\",\n * to: \"system-b:agent:agent-1\", // Goes via gateway\n * payload: { text: \"Hello!\" },\n * });\n * ```\n */\nexport class FederatedMessageRouter implements MessageRouter {\n private readonly local: MessageRouter;\n private readonly gateway: FederationGateway;\n private readonly agents: AgentRegistry;\n private readonly deliveryHandlers: Set<DeliveryHandler> = new Set();\n\n constructor(options: FederatedMessageRouterOptions) {\n this.local = options.local;\n this.gateway = options.gateway;\n this.agents = options.agents;\n\n // Listen for incoming peer messages\n this.gateway.onPeerMessage(this.handlePeerMessage.bind(this));\n\n // Forward local delivery events\n this.local.onDeliver((message) => {\n for (const handler of this.deliveryHandlers) {\n try {\n handler(message);\n } catch (error) {\n console.error(\"FederatedMessageRouter delivery handler error:\", error);\n }\n }\n });\n }\n\n /**\n * Send to a specific agent.\n * Routes to remote system if target is a remote agent.\n */\n sendToAgent(params: {\n from: string;\n to: string;\n payload: unknown;\n replyTo?: string;\n priority?: number;\n ttlMs?: number;\n }): ServerMessage {\n // Check if target is remote\n if (this.isRemoteAgent(params.to)) {\n return this.sendToRemoteAgent(params);\n }\n\n // Local delivery\n return this.local.sendToAgent(params);\n }\n\n /**\n * Broadcast to all agents in a scope.\n * Only sends to local scope members.\n */\n sendToScope(params: {\n from: string;\n scopeId: string;\n payload: unknown;\n excludeSender?: boolean;\n includeDescendants?: boolean;\n }): ServerMessage {\n // For now, only local scope broadcast is supported\n // Cross-system scope membership would need additional tracking\n return this.local.sendToScope(params);\n }\n\n /**\n * Set delivery callback.\n */\n onDeliver(handler: DeliveryHandler): void {\n this.deliveryHandlers.add(handler);\n }\n\n /**\n * Remove delivery callback.\n */\n offDeliver(handler: DeliveryHandler): void {\n this.deliveryHandlers.delete(handler);\n }\n\n /**\n * Flush queued messages for an agent.\n */\n flushQueue(agentId: string): number {\n // Can't flush remote agent queues\n if (this.isRemoteAgent(agentId)) {\n return 0;\n }\n\n return this.local.flushQueue(agentId);\n }\n\n /**\n * Get queue stats.\n */\n getQueueStats(): { total: number; byAgent: Record<string, number> } {\n return this.local.getQueueStats();\n }\n\n /**\n * Check if an agent ID refers to a remote agent.\n * Uses the standardized federated ID format: {systemId}:agent:{entityId}\n */\n isRemoteAgent(agentId: string): boolean {\n return isFederatedAgent(agentId);\n }\n\n /**\n * Parse remote agent ID to get system and original agent ID.\n * Uses the standardized federated ID format: {systemId}:agent:{entityId}\n */\n parseRemoteAgentId(remoteId: string): { systemId: string; originalId: string } | null {\n if (!isFederatedAgent(remoteId)) {\n return null;\n }\n\n try {\n const parsed = parseFederatedId(remoteId);\n return {\n systemId: parsed.systemId,\n originalId: parsed.entityId,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Send message to a remote agent via the gateway.\n */\n private sendToRemoteAgent(params: {\n from: string;\n to: string;\n payload: unknown;\n replyTo?: string;\n priority?: number;\n ttlMs?: number;\n }): ServerMessage {\n const parsed = this.parseRemoteAgentId(params.to);\n if (!parsed) {\n throw new Error(`Invalid remote agent ID: ${params.to}`);\n }\n\n // Create message object\n const message: ServerMessage = {\n id: this.generateMessageId(),\n from: params.from,\n to: params.to,\n payload: params.payload,\n timestamp: Date.now(),\n replyTo: params.replyTo,\n priority: params.priority ?? 0,\n };\n\n // Route via gateway\n const envelope = this.gateway.createEnvelope(parsed.systemId, {\n type: \"message\",\n message: {\n ...message,\n // Translate the target to original ID for the remote system\n to: parsed.originalId,\n },\n });\n\n this.gateway.routeToPeer(parsed.systemId, envelope).catch((err) => {\n console.error(`Failed to route message to ${parsed.systemId}:`, err);\n });\n\n return message;\n }\n\n /**\n * Handle incoming peer messages.\n */\n private handlePeerMessage(\n from: string,\n envelope: { payload: unknown }\n ): void {\n const payload = envelope.payload as {\n type: string;\n message?: ServerMessage;\n };\n\n if (payload.type !== \"message\" || !payload.message) {\n return;\n }\n\n const message = payload.message;\n\n // Check if target is a local agent\n const localAgent = this.agents.get(message.to);\n if (!localAgent) {\n // Target not found locally\n console.warn(`Received federated message for unknown agent: ${message.to}`);\n return;\n }\n\n // Update message metadata with federated ID format\n const federatedMessage: ServerMessage = {\n ...message,\n from: formatFederatedId(from, \"agent\", message.from),\n metadata: {\n ...(message.metadata ?? {}),\n _federatedFrom: from,\n _originalFrom: message.from,\n },\n };\n\n // Deliver locally\n for (const handler of this.deliveryHandlers) {\n try {\n handler(federatedMessage);\n } catch (error) {\n console.error(\"FederatedMessageRouter delivery handler error:\", error);\n }\n }\n }\n\n /**\n * Generate a unique message ID.\n */\n private generateMessageId(): string {\n // Simple ID generation - in production use ulid or similar\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n }\n}\n","/**\n * Federation handlers\n *\n * Handler factory for federation-specific protocol methods.\n */\n\nimport type {\n HandlerRegistry,\n HandlerContext,\n FederationGateway,\n PeerConnection,\n ServerFederationEnvelope,\n} from \"../types\";\nimport type { AuthManager } from \"../auth/types\";\nimport type { FederationAuth } from \"../../types\";\nimport { generateFederationChallenge } from \"../../federation/challenge\";\n\n/**\n * Options for creating federation handlers.\n */\nexport interface FederationHandlerOptions {\n /** The federation gateway */\n gateway: FederationGateway;\n /** Auth manager for single-request federation authentication */\n authManager?: AuthManager;\n}\n\n/**\n * Error thrown when federation operation fails.\n */\nexport class FederationError extends Error {\n readonly code: number;\n\n constructor(message: string, code: number = -32000) {\n super(message);\n this.name = \"FederationError\";\n this.code = code;\n }\n}\n\n/**\n * Error thrown when caller doesn't have federation permissions.\n */\nexport class FederationPermissionError extends FederationError {\n constructor(message: string = \"Federation operations require gateway role\") {\n super(message, -32003);\n this.name = \"FederationPermissionError\";\n }\n}\n\n/**\n * Create handlers for federation protocol methods.\n *\n * @example\n * ```typescript\n * const federationHandlers = createFederationHandlers({ gateway });\n *\n * const allHandlers = combineHandlers(\n * createAgentHandlers({ agents, eventBus }),\n * createScopeHandlers({ scopes, eventBus }),\n * federationHandlers,\n * );\n * ```\n */\nexport function createFederationHandlers(\n options: FederationHandlerOptions\n): HandlerRegistry {\n const { gateway } = options;\n\n return {\n /**\n * Connect to a peer system.\n *\n * Supports single-request authentication: if `auth` is provided in params,\n * the server attempts immediate authentication in the same round trip.\n * If auth is not provided or fails recoverably, returns `authRequired`\n * for the client to retry with credentials.\n *\n * @param params.systemId - ID of the peer system\n * @param params.endpoint - WebSocket or other endpoint URL\n * @param params.auth - Optional authentication credentials (single-request auth)\n * @param params.credentials - Legacy authentication credentials\n * @returns The peer connection with optional auth result\n */\n \"map/federation/connect\": async (\n params: {\n systemId: string;\n endpoint: string;\n auth?: FederationAuth;\n credentials?: unknown;\n authContext?: { source: string; challenge?: string };\n systemInfo?: { name: string; version: string; endpoint: string };\n protocolVersion?: string;\n exposure?: Record<string, unknown>;\n },\n ctx: HandlerContext\n ): Promise<PeerConnection & {\n connected: boolean;\n principal?: { id: string; issuer?: string; claims?: Record<string, unknown> };\n authRequired?: { methods: string[]; challenge?: string; required: boolean };\n }> => {\n validateGatewayRole(ctx);\n\n if (!params.systemId) {\n throw new FederationError(\"systemId is required\");\n }\n if (!params.endpoint) {\n throw new FederationError(\"endpoint is required\");\n }\n\n const { authManager } = options;\n\n // Single-request auth: if credentials provided, attempt immediate authentication\n if (params.auth && authManager) {\n const authResult = await authManager.authenticate(\n {\n method: params.auth.method as any,\n credential: params.auth.credentials,\n metadata: params.auth.metadata,\n },\n {\n transportType: 'federation',\n metadata: { systemId: params.systemId, endpoint: params.endpoint },\n }\n );\n\n if (!authResult.success) {\n // Recoverable failure — return authRequired so client can retry\n return {\n systemId: params.systemId,\n endpoint: params.endpoint,\n status: \"disconnected\",\n connected: false,\n authRequired: {\n methods: authManager.supportedMethods,\n challenge: generateFederationChallenge(),\n required: true,\n },\n };\n }\n\n // Auth succeeded — connect with principal\n try {\n const peer = await gateway.connectPeer({\n systemId: params.systemId,\n endpoint: params.endpoint,\n credentials: params.auth.credentials,\n });\n return {\n ...peer,\n connected: true,\n principal: authResult.principal,\n sessionId: `fed_${params.systemId}_${Date.now()}`,\n };\n } catch (error) {\n throw new FederationError(\n `Failed to connect to peer ${params.systemId}: ${(error as Error).message}`\n );\n }\n }\n\n // No auth provided — check if auth is required\n if (authManager && authManager.config.required) {\n return {\n systemId: params.systemId,\n endpoint: params.endpoint,\n status: \"disconnected\",\n connected: false,\n authRequired: {\n methods: authManager.supportedMethods,\n challenge: generateFederationChallenge(),\n required: true,\n },\n };\n }\n\n // No auth required — proceed with existing behavior (backwards-compatible)\n try {\n const peer = await gateway.connectPeer({\n systemId: params.systemId,\n endpoint: params.endpoint,\n credentials: params.credentials,\n });\n return { ...peer, connected: true };\n } catch (error) {\n throw new FederationError(\n `Failed to connect to peer ${params.systemId}: ${(error as Error).message}`\n );\n }\n },\n\n /**\n * Disconnect from a peer system.\n *\n * @param params.systemId - ID of the peer system to disconnect\n */\n \"map/federation/disconnect\": async (\n params: { systemId: string },\n ctx: HandlerContext\n ): Promise<void> => {\n validateGatewayRole(ctx);\n\n if (!params.systemId) {\n throw new FederationError(\"systemId is required\");\n }\n\n gateway.disconnectPeer(params.systemId);\n },\n\n /**\n * List connected peer systems.\n *\n * @returns Array of peer connections\n */\n \"map/federation/list\": async (\n _params: unknown,\n ctx: HandlerContext\n ): Promise<PeerConnection[]> => {\n validateGatewayRole(ctx);\n\n return gateway.listPeers();\n },\n\n /**\n * Route a message to a peer system.\n *\n * @param params.systemId - Target peer system ID\n * @param params.payload - Message payload to send\n * @param params.maxHops - Maximum number of hops (for loop prevention)\n */\n \"map/federation/route\": async (\n params: {\n systemId: string;\n payload: unknown;\n maxHops?: number;\n },\n ctx: HandlerContext\n ): Promise<{ queued: boolean }> => {\n validateGatewayRole(ctx);\n\n if (!params.systemId) {\n throw new FederationError(\"systemId is required\");\n }\n if (params.payload === undefined) {\n throw new FederationError(\"payload is required\");\n }\n\n const envelope: ServerFederationEnvelope = {\n payload: params.payload,\n routing: {\n from: (gateway as any).systemId,\n to: params.systemId,\n hops: [],\n maxHops: params.maxHops ?? 5,\n },\n timestamp: Date.now(),\n };\n\n try {\n await gateway.routeToPeer(params.systemId, envelope);\n\n // Check if it was queued (peer not connected) or sent\n const peer = gateway.listPeers().find((p) => p.systemId === params.systemId);\n const queued = !peer || peer.status !== \"connected\";\n\n return { queued };\n } catch (error) {\n throw new FederationError(\n `Failed to route to ${params.systemId}: ${(error as Error).message}`\n );\n }\n },\n\n /**\n * Get buffer statistics.\n *\n * @returns Buffer stats including total messages and per-system counts\n */\n \"map/federation/buffer/stats\": async (\n _params: unknown,\n ctx: HandlerContext\n ): Promise<{ total: number; bySystem: Record<string, number> }> => {\n validateGatewayRole(ctx);\n\n return gateway.buffer.stats();\n },\n\n /**\n * Flush buffered messages for a peer.\n *\n * @param params.systemId - Peer system to flush buffer for\n * @returns Number of messages that were buffered\n */\n \"map/federation/buffer/flush\": async (\n params: { systemId: string },\n ctx: HandlerContext\n ): Promise<{ count: number }> => {\n validateGatewayRole(ctx);\n\n if (!params.systemId) {\n throw new FederationError(\"systemId is required\");\n }\n\n const messages = gateway.buffer.flush(params.systemId);\n return { count: messages.length };\n },\n };\n}\n\n/**\n * Validate that the session has gateway role.\n */\nfunction validateGatewayRole(ctx: HandlerContext): void {\n if (ctx.session.role !== \"gateway\") {\n throw new FederationPermissionError();\n }\n}\n","/**\n * In-memory trajectory store implementation.\n */\n\nimport type { TrajectoryCheckpoint } from \"../../../types\";\nimport type { TrajectoryStore, TrajectoryFilter } from \"../../types\";\n\nexport class InMemoryTrajectoryStore implements TrajectoryStore {\n private checkpoints = new Map<string, TrajectoryCheckpoint>();\n\n save(checkpoint: TrajectoryCheckpoint): void {\n this.checkpoints.set(checkpoint.id, checkpoint);\n }\n\n get(id: string): TrajectoryCheckpoint | undefined {\n return this.checkpoints.get(id);\n }\n\n list(filter?: TrajectoryFilter): TrajectoryCheckpoint[] {\n let results = Array.from(this.checkpoints.values());\n\n if (filter?.agentId) {\n results = results.filter((c) => c.agentId === filter.agentId);\n }\n if (filter?.sessionId) {\n results = results.filter((c) => c.sessionId === filter.sessionId);\n }\n if (filter?.afterTimestamp) {\n results = results.filter((c) => c.timestamp > filter.afterTimestamp!);\n }\n if (filter?.beforeTimestamp) {\n results = results.filter((c) => c.timestamp < filter.beforeTimestamp!);\n }\n\n // Sort by timestamp descending (newest first)\n results.sort((a, b) => b.timestamp - a.timestamp);\n\n return results;\n }\n\n delete(id: string): boolean {\n return this.checkpoints.delete(id);\n }\n\n clear(): void {\n this.checkpoints.clear();\n }\n}\n","/**\n * Trajectory manager implementation.\n *\n * Manages checkpoint lifecycle and content retrieval.\n * Emits events via EventBus for subscriber notifications.\n */\n\nimport type { TrajectoryCheckpoint, TrajectoryContentField, TrajectoryContentResult } from \"../../types\";\nimport { EVENT_TYPES, TRAJECTORY_ERROR_CODES } from \"../../types\";\nimport { MAPRequestError } from \"../../errors\";\nimport type {\n TrajectoryManager,\n TrajectoryManagerOptions,\n TrajectoryContentProvider,\n TrajectoryFilter,\n EventBus,\n TrajectoryStore,\n} from \"../types\";\n\nexport class TrajectoryManagerImpl implements TrajectoryManager {\n private store: TrajectoryStore;\n private eventBus: EventBus;\n private contentProvider?: TrajectoryContentProvider;\n\n constructor(options: TrajectoryManagerOptions) {\n this.store = options.store;\n this.eventBus = options.eventBus;\n this.contentProvider = options.contentProvider;\n }\n\n reportCheckpoint(\n checkpoint: Omit<TrajectoryCheckpoint, \"timestamp\"> & { timestamp?: number },\n reportedBy: string\n ): TrajectoryCheckpoint {\n const stored: TrajectoryCheckpoint = {\n ...checkpoint,\n timestamp: checkpoint.timestamp ?? Date.now(),\n };\n\n this.store.save(stored);\n\n // Emit trajectory.checkpoint event\n this.eventBus.emit({\n type: EVENT_TYPES.TRAJECTORY_CHECKPOINT,\n data: { checkpoint: stored },\n source: { agentId: reportedBy },\n });\n\n return stored;\n }\n\n get(id: string): TrajectoryCheckpoint | undefined {\n return this.store.get(id);\n }\n\n list(\n filter?: TrajectoryFilter,\n limit = 50,\n cursor?: string\n ): { checkpoints: TrajectoryCheckpoint[]; hasMore: boolean; nextCursor?: string } {\n const all = this.store.list(filter);\n\n // Cursor-based pagination: cursor is the last checkpoint ID seen\n let startIndex = 0;\n if (cursor) {\n const cursorIndex = all.findIndex((c) => c.id === cursor);\n if (cursorIndex >= 0) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const page = all.slice(startIndex, startIndex + limit + 1);\n const hasMore = page.length > limit;\n const items = hasMore ? page.slice(0, limit) : page;\n\n return {\n checkpoints: items,\n hasMore,\n nextCursor: hasMore ? items[items.length - 1].id : undefined,\n };\n }\n\n setContentProvider(provider: TrajectoryContentProvider): void {\n this.contentProvider = provider;\n }\n\n async requestContent(\n checkpointId: string,\n include?: TrajectoryContentField[]\n ): Promise<TrajectoryContentResult> {\n // Verify checkpoint exists\n const checkpoint = this.store.get(checkpointId);\n if (!checkpoint) {\n throw new MAPRequestError(\n TRAJECTORY_ERROR_CODES.TRAJECTORY_CHECKPOINT_NOT_FOUND,\n `Checkpoint not found: ${checkpointId}`,\n { category: \"trajectory\" }\n );\n }\n\n if (!this.contentProvider) {\n throw new MAPRequestError(\n TRAJECTORY_ERROR_CODES.TRAJECTORY_CONTENT_UNAVAILABLE,\n \"No content provider configured\",\n { category: \"trajectory\" }\n );\n }\n\n return this.contentProvider.getContent(checkpointId, include);\n }\n}\n","/**\n * Trajectory handler factories.\n *\n * Creates JSON-RPC handlers for all trajectory/* protocol methods.\n */\n\nimport type { TrajectoryManager, HandlerContext, HandlerRegistry } from \"../types\";\nimport type {\n TrajectoryCheckpointRequestParams,\n TrajectoryListRequestParams,\n TrajectoryGetRequestParams,\n TrajectoryContentRequestParams,\n} from \"../../types\";\nimport { TRAJECTORY_ERROR_CODES } from \"../../types\";\nimport { MAPRequestError } from \"../../errors\";\n\n/**\n * Options for creating trajectory handlers.\n */\nexport interface TrajectoryHandlerOptions {\n trajectory: TrajectoryManager;\n}\n\n/**\n * Derive agent ID from handler context.\n * Uses first registered agent, or session ID as fallback.\n */\nfunction getAgentId(ctx: HandlerContext): string {\n return ctx.session.agentIds[0] ?? ctx.session.id;\n}\n\n/**\n * Create handlers for trajectory/* protocol methods.\n *\n * Methods:\n * - `trajectory/checkpoint` - Report a checkpoint\n * - `trajectory/list` - List checkpoints\n * - `trajectory/get` - Get a checkpoint\n * - `trajectory/content` - Request checkpoint content\n */\nexport function createTrajectoryHandlers(\n options: TrajectoryHandlerOptions\n): HandlerRegistry {\n const { trajectory } = options;\n\n return {\n \"trajectory/checkpoint\": async (params: unknown, ctx: HandlerContext) => {\n const p = params as TrajectoryCheckpointRequestParams;\n const agentId = getAgentId(ctx);\n\n const checkpoint = trajectory.reportCheckpoint(p.checkpoint, agentId);\n return { checkpoint };\n },\n\n \"trajectory/list\": async (params: unknown) => {\n const p = (params ?? {}) as TrajectoryListRequestParams;\n const limit = p.limit ?? 50;\n\n const result = trajectory.list(p.filter, limit, p.cursor);\n return result;\n },\n\n \"trajectory/get\": async (params: unknown) => {\n const p = params as TrajectoryGetRequestParams;\n\n const checkpoint = trajectory.get(p.checkpointId);\n if (!checkpoint) {\n throw new MAPRequestError(\n TRAJECTORY_ERROR_CODES.TRAJECTORY_CHECKPOINT_NOT_FOUND,\n `Checkpoint not found: ${p.checkpointId}`,\n { category: \"trajectory\" }\n );\n }\n\n return { checkpoint };\n },\n\n \"trajectory/content\": async (params: unknown) => {\n const p = params as TrajectoryContentRequestParams;\n\n const content = await trajectory.requestContent(\n p.checkpointId,\n p.include\n );\n\n return { content };\n },\n };\n}\n","/**\n * Validation middleware using Zod schemas\n *\n * Provides runtime validation of request parameters before handlers execute.\n * Returns standardized INVALID_PARAMS errors with detailed error information.\n */\n\nimport { z, type ZodSchema, type ZodError } from \"zod\";\nimport type { Middleware } from \"../types\";\nimport { MAPRequestError } from \"../../errors\";\n\n// ===========================================================================\n// Request Parameter Schemas\n// ===========================================================================\n\n/**\n * Schema for map/agents/register\n */\nexport const AgentsRegisterParamsSchema = z\n .object({\n name: z.string().min(1, \"Agent name is required\"),\n role: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n capabilities: z.array(z.string()).optional(),\n })\n .strict();\n\n/**\n * Schema for map/agents/unregister\n */\nexport const AgentsUnregisterParamsSchema = z\n .object({\n agentId: z.string().min(1, \"Agent ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/agents/get\n */\nexport const AgentsGetParamsSchema = z\n .object({\n agentId: z.string().min(1, \"Agent ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/agents/list\n */\nexport const AgentsListParamsSchema = z\n .object({\n state: z\n .union([\n z.enum([\"idle\", \"busy\", \"suspended\", \"stopped\"]),\n z.string().startsWith(\"custom:\"),\n ])\n .optional(),\n role: z.string().optional(),\n sessionId: z.string().optional(),\n scopeId: z.string().optional(),\n capability: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/agents/update\n */\nexport const AgentsUpdateParamsSchema = z\n .object({\n agentId: z.string().min(1, \"Agent ID is required\"),\n state: z\n .union([\n z.enum([\"idle\", \"busy\", \"suspended\", \"stopped\"]),\n z.string().startsWith(\"custom:\"),\n ])\n .optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict()\n .refine((data) => data.state !== undefined || data.metadata !== undefined, {\n message: \"At least one of 'state' or 'metadata' is required\",\n });\n\n/**\n * Schema for map/agents/update/state\n */\nexport const AgentsUpdateStateParamsSchema = z\n .object({\n agentId: z.string().min(1, \"Agent ID is required\"),\n state: z.union([\n z.enum([\"idle\", \"busy\", \"suspended\", \"stopped\"]),\n z.string().startsWith(\"custom:\"),\n ]),\n })\n .strict();\n\n/**\n * Schema for map/agents/update/metadata\n */\nexport const AgentsUpdateMetadataParamsSchema = z\n .object({\n agentId: z.string().min(1, \"Agent ID is required\"),\n metadata: z.record(z.unknown()),\n })\n .strict();\n\n/**\n * Schema for map/scopes/create\n */\nexport const ScopesCreateParamsSchema = z\n .object({\n name: z.string().min(1, \"Scope name is required\"),\n metadata: z.record(z.unknown()).optional(),\n parentId: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/scopes/delete\n */\nexport const ScopesDeleteParamsSchema = z\n .object({\n scopeId: z.string().min(1, \"Scope ID is required\"),\n deleteDescendants: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Schema for map/scopes/get\n */\nexport const ScopesGetParamsSchema = z\n .object({\n scopeId: z.string().min(1, \"Scope ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/scopes/list\n */\nexport const ScopesListParamsSchema = z\n .object({\n parentId: z.string().nullable().optional(),\n ancestorId: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/scopes/join\n */\nexport const ScopesJoinParamsSchema = z\n .object({\n scopeId: z.string().min(1, \"Scope ID is required\"),\n agentId: z.string().min(1, \"Agent ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/scopes/leave\n */\nexport const ScopesLeaveParamsSchema = z\n .object({\n scopeId: z.string().min(1, \"Scope ID is required\"),\n agentId: z.string().min(1, \"Agent ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/scopes/members\n */\nexport const ScopesMembersParamsSchema = z\n .object({\n scopeId: z.string().min(1, \"Scope ID is required\"),\n includeDescendants: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Recursive schema for subscription filter (supports $or/$and)\n */\nconst baseSubscriptionFilterSchema = z.object({\n eventTypes: z.array(z.string()).optional(),\n scopes: z.array(z.string()).optional(),\n fromAgents: z.array(z.string()).optional(),\n includeChildren: z.boolean().optional(),\n match: z.enum([\"any\", \"all\"]).optional(),\n messageTypes: z.array(z.string()).optional(),\n});\n\n// Use lazy for recursive types\nexport const SubscriptionFilterParamsSchema: z.ZodType<{\n eventTypes?: string[];\n scopes?: string[];\n fromAgents?: string[];\n includeChildren?: boolean;\n match?: \"any\" | \"all\";\n messageTypes?: string[];\n $or?: unknown[];\n $and?: unknown[];\n}> = baseSubscriptionFilterSchema.extend({\n $or: z.lazy(() => z.array(SubscriptionFilterParamsSchema)).optional(),\n $and: z.lazy(() => z.array(SubscriptionFilterParamsSchema)).optional(),\n});\n\n/**\n * Schema for map/subscriptions/subscribe\n */\nexport const SubscribeParamsSchema = z\n .object({\n filter: SubscriptionFilterParamsSchema,\n startAfter: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/subscriptions/unsubscribe\n */\nexport const UnsubscribeParamsSchema = z\n .object({\n subscriptionId: z.string().min(1, \"Subscription ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/subscriptions/pause\n */\nexport const SubscriptionsPauseParamsSchema = z\n .object({\n subscriptionId: z.string().min(1, \"Subscription ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/subscriptions/resume\n */\nexport const SubscriptionsResumeParamsSchema = z\n .object({\n subscriptionId: z.string().min(1, \"Subscription ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/send\n */\nexport const SendParamsSchema = z\n .object({\n to: z.union([z.string(), z.array(z.string()).min(1)]),\n payload: z.unknown(),\n replyTo: z.string().optional(),\n priority: z.number().int().optional(),\n ttlMs: z.number().int().positive().optional(),\n messageType: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/connect\n */\nexport const ConnectParamsSchema = z\n .object({\n role: z.enum([\"client\", \"agent\", \"gateway\"]).optional(),\n name: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n resumeToken: z.string().optional(),\n auth: z\n .object({\n method: z.enum([\"bearer\", \"api-key\", \"mtls\", \"none\"]),\n credential: z.string().optional(),\n })\n .optional(),\n })\n .strict();\n\n/**\n * Schema for map/authenticate\n */\nexport const AuthenticateParamsSchema = z\n .object({\n method: z.enum([\"bearer\", \"api-key\", \"mtls\", \"none\"]),\n credential: z.string().optional(),\n })\n .strict();\n\n/**\n * Schema for map/session/list - no params required\n */\nexport const SessionListParamsSchema = z.object({}).strict().optional();\n\n/**\n * Schema for map/session/load\n */\nexport const SessionLoadParamsSchema = z\n .object({\n sessionId: z.string().min(1, \"Session ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/session/close\n */\nexport const SessionCloseParamsSchema = z\n .object({\n sessionId: z.string().min(1, \"Session ID is required\"),\n })\n .strict();\n\n/**\n * Schema for map/inject (testing)\n */\nexport const InjectParamsSchema = z\n .object({\n type: z.string().min(1, \"Event type is required\"),\n data: z.unknown(),\n source: z\n .object({\n agentId: z.string().optional(),\n scopeId: z.string().optional(),\n sessionId: z.string().optional(),\n })\n .optional(),\n causedBy: z.union([z.string(), z.array(z.string())]).optional(),\n })\n .strict();\n\n// ===========================================================================\n// Method to Schema Mapping\n// ===========================================================================\n\n/**\n * Default schema mapping for all standard MAP methods.\n */\nexport const DEFAULT_VALIDATION_SCHEMAS: Record<string, ZodSchema> = {\n // Agent methods\n \"map/agents/register\": AgentsRegisterParamsSchema,\n \"map/agents/unregister\": AgentsUnregisterParamsSchema,\n \"map/agents/get\": AgentsGetParamsSchema,\n \"map/agents/list\": AgentsListParamsSchema,\n \"map/agents/update\": AgentsUpdateParamsSchema,\n \"map/agents/update/state\": AgentsUpdateStateParamsSchema,\n \"map/agents/update/metadata\": AgentsUpdateMetadataParamsSchema,\n\n // Scope methods\n \"map/scopes/create\": ScopesCreateParamsSchema,\n \"map/scopes/delete\": ScopesDeleteParamsSchema,\n \"map/scopes/get\": ScopesGetParamsSchema,\n \"map/scopes/list\": ScopesListParamsSchema,\n \"map/scopes/join\": ScopesJoinParamsSchema,\n \"map/scopes/leave\": ScopesLeaveParamsSchema,\n \"map/scopes/members\": ScopesMembersParamsSchema,\n\n // Subscription methods\n \"map/subscriptions/subscribe\": SubscribeParamsSchema,\n \"map/subscriptions/unsubscribe\": UnsubscribeParamsSchema,\n \"map/subscriptions/pause\": SubscriptionsPauseParamsSchema,\n \"map/subscriptions/resume\": SubscriptionsResumeParamsSchema,\n\n // Messaging methods\n \"map/send\": SendParamsSchema,\n\n // Connection methods\n \"map/connect\": ConnectParamsSchema,\n \"map/authenticate\": AuthenticateParamsSchema,\n\n // Session methods\n \"map/session/list\": SessionListParamsSchema,\n \"map/session/load\": SessionLoadParamsSchema,\n \"map/session/close\": SessionCloseParamsSchema,\n\n // Testing methods\n \"map/inject\": InjectParamsSchema,\n};\n\n// ===========================================================================\n// Error Formatting\n// ===========================================================================\n\n/**\n * Format Zod errors into a readable details object.\n */\nfunction formatZodError(error: ZodError): Record<string, unknown> {\n const issues = error.issues.map((issue) => ({\n path: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n code: issue.code,\n }));\n\n return {\n issues,\n // Provide a summary message\n summary: issues.map((i) => `${i.path}: ${i.message}`).join(\"; \"),\n };\n}\n\n// ===========================================================================\n// Middleware Factory\n// ===========================================================================\n\n/**\n * Options for the Zod validation middleware.\n */\nexport interface ZodValidationMiddlewareOptions {\n /**\n * Schema mapping for methods. Defaults to DEFAULT_VALIDATION_SCHEMAS.\n */\n schemas?: Record<string, ZodSchema>;\n\n /**\n * Methods to skip validation for (e.g., custom methods).\n */\n skipMethods?: string[];\n\n /**\n * If true, throws for methods with no schema defined.\n * If false (default), allows methods without schemas to pass.\n */\n strictMode?: boolean;\n\n /**\n * Custom error callback for logging/monitoring.\n */\n onValidationError?: (\n method: string,\n params: unknown,\n error: ZodError\n ) => void;\n}\n\n/**\n * Create a validation middleware using Zod schemas.\n *\n * This middleware validates request parameters before handlers execute,\n * returning standardized INVALID_PARAMS errors with detailed error information.\n *\n * @example\n * ```typescript\n * import { zodValidationMiddleware, DEFAULT_VALIDATION_SCHEMAS } from './middleware/validation';\n *\n * const middleware = zodValidationMiddleware({\n * schemas: {\n * ...DEFAULT_VALIDATION_SCHEMAS,\n * 'custom/method': myCustomSchema,\n * },\n * });\n * ```\n */\nexport function zodValidationMiddleware(\n options: ZodValidationMiddlewareOptions = {}\n): Middleware {\n const {\n schemas = DEFAULT_VALIDATION_SCHEMAS,\n skipMethods = [],\n strictMode = false,\n onValidationError,\n } = options;\n\n const skipSet = new Set(skipMethods);\n\n return async (method, params, _ctx, next) => {\n // Skip validation for specified methods\n if (skipSet.has(method)) {\n return next();\n }\n\n const schema = schemas[method];\n\n // No schema for this method\n if (!schema) {\n if (strictMode) {\n throw MAPRequestError.invalidParams({\n error: `No validation schema defined for method: ${method}`,\n });\n }\n return next();\n }\n\n // Validate params\n const result = schema.safeParse(params ?? {});\n\n if (!result.success) {\n // Call error callback if provided\n onValidationError?.(method, params, result.error);\n\n // Throw INVALID_PARAMS error with detailed information\n throw MAPRequestError.invalidParams(formatZodError(result.error));\n }\n\n return next();\n };\n}\n\n// ===========================================================================\n// Re-export from router/middleware for convenience\n// ===========================================================================\n\nexport {\n loggingMiddleware,\n timingMiddleware,\n rateLimitMiddleware,\n timeoutMiddleware,\n composeMiddleware,\n} from \"../router/middleware\";\n"]}
|