@mcp-i/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +390 -0
- package/dist/auth/handshake.d.ts +104 -0
- package/dist/auth/handshake.d.ts.map +1 -0
- package/dist/auth/handshake.js +230 -0
- package/dist/auth/handshake.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/types.d.ts +31 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +7 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/delegation/audience-validator.d.ts +9 -0
- package/dist/delegation/audience-validator.d.ts.map +1 -0
- package/dist/delegation/audience-validator.js +17 -0
- package/dist/delegation/audience-validator.js.map +1 -0
- package/dist/delegation/bitstring.d.ts +37 -0
- package/dist/delegation/bitstring.d.ts.map +1 -0
- package/dist/delegation/bitstring.js +117 -0
- package/dist/delegation/bitstring.js.map +1 -0
- package/dist/delegation/cascading-revocation.d.ts +45 -0
- package/dist/delegation/cascading-revocation.d.ts.map +1 -0
- package/dist/delegation/cascading-revocation.js +148 -0
- package/dist/delegation/cascading-revocation.js.map +1 -0
- package/dist/delegation/delegation-graph.d.ts +49 -0
- package/dist/delegation/delegation-graph.d.ts.map +1 -0
- package/dist/delegation/delegation-graph.js +99 -0
- package/dist/delegation/delegation-graph.js.map +1 -0
- package/dist/delegation/did-key-resolver.d.ts +64 -0
- package/dist/delegation/did-key-resolver.d.ts.map +1 -0
- package/dist/delegation/did-key-resolver.js +154 -0
- package/dist/delegation/did-key-resolver.js.map +1 -0
- package/dist/delegation/did-web-resolver.d.ts +83 -0
- package/dist/delegation/did-web-resolver.d.ts.map +1 -0
- package/dist/delegation/did-web-resolver.js +218 -0
- package/dist/delegation/did-web-resolver.js.map +1 -0
- package/dist/delegation/index.d.ts +21 -0
- package/dist/delegation/index.d.ts.map +1 -0
- package/dist/delegation/index.js +21 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/delegation/outbound-headers.d.ts +81 -0
- package/dist/delegation/outbound-headers.d.ts.map +1 -0
- package/dist/delegation/outbound-headers.js +139 -0
- package/dist/delegation/outbound-headers.js.map +1 -0
- package/dist/delegation/outbound-proof.d.ts +43 -0
- package/dist/delegation/outbound-proof.d.ts.map +1 -0
- package/dist/delegation/outbound-proof.js +52 -0
- package/dist/delegation/outbound-proof.js.map +1 -0
- package/dist/delegation/statuslist-manager.d.ts +44 -0
- package/dist/delegation/statuslist-manager.d.ts.map +1 -0
- package/dist/delegation/statuslist-manager.js +126 -0
- package/dist/delegation/statuslist-manager.js.map +1 -0
- package/dist/delegation/storage/memory-graph-storage.d.ts +70 -0
- package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -0
- package/dist/delegation/storage/memory-graph-storage.js +145 -0
- package/dist/delegation/storage/memory-graph-storage.js.map +1 -0
- package/dist/delegation/storage/memory-statuslist-storage.d.ts +19 -0
- package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -0
- package/dist/delegation/storage/memory-statuslist-storage.js +33 -0
- package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -0
- package/dist/delegation/utils.d.ts +49 -0
- package/dist/delegation/utils.d.ts.map +1 -0
- package/dist/delegation/utils.js +131 -0
- package/dist/delegation/utils.js.map +1 -0
- package/dist/delegation/vc-issuer.d.ts +56 -0
- package/dist/delegation/vc-issuer.d.ts.map +1 -0
- package/dist/delegation/vc-issuer.js +80 -0
- package/dist/delegation/vc-issuer.js.map +1 -0
- package/dist/delegation/vc-verifier.d.ts +112 -0
- package/dist/delegation/vc-verifier.d.ts.map +1 -0
- package/dist/delegation/vc-verifier.js +280 -0
- package/dist/delegation/vc-verifier.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +23 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +82 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +7 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/with-mcpi.d.ts +152 -0
- package/dist/middleware/with-mcpi.d.ts.map +1 -0
- package/dist/middleware/with-mcpi.js +472 -0
- package/dist/middleware/with-mcpi.js.map +1 -0
- package/dist/proof/errors.d.ts +49 -0
- package/dist/proof/errors.d.ts.map +1 -0
- package/dist/proof/errors.js +61 -0
- package/dist/proof/errors.js.map +1 -0
- package/dist/proof/generator.d.ts +65 -0
- package/dist/proof/generator.d.ts.map +1 -0
- package/dist/proof/generator.js +163 -0
- package/dist/proof/generator.js.map +1 -0
- package/dist/proof/index.d.ts +4 -0
- package/dist/proof/index.d.ts.map +1 -0
- package/dist/proof/index.js +4 -0
- package/dist/proof/index.js.map +1 -0
- package/dist/proof/verifier.d.ts +108 -0
- package/dist/proof/verifier.d.ts.map +1 -0
- package/dist/proof/verifier.js +299 -0
- package/dist/proof/verifier.js.map +1 -0
- package/dist/providers/base.d.ts +64 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +19 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/memory.d.ts +33 -0
- package/dist/providers/memory.d.ts.map +1 -0
- package/dist/providers/memory.js +102 -0
- package/dist/providers/memory.js.map +1 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +2 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +77 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/types/protocol.d.ts +320 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +229 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/utils/base58.d.ts +31 -0
- package/dist/utils/base58.d.ts.map +1 -0
- package/dist/utils/base58.js +104 -0
- package/dist/utils/base58.js.map +1 -0
- package/dist/utils/base64.d.ts +13 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +99 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/crypto-service.d.ts +37 -0
- package/dist/utils/crypto-service.d.ts.map +1 -0
- package/dist/utils/crypto-service.js +153 -0
- package/dist/utils/crypto-service.js.map +1 -0
- package/dist/utils/did-helpers.d.ts +156 -0
- package/dist/utils/did-helpers.d.ts.map +1 -0
- package/dist/utils/did-helpers.js +193 -0
- package/dist/utils/did-helpers.js.map +1 -0
- package/dist/utils/ed25519-constants.d.ts +18 -0
- package/dist/utils/ed25519-constants.d.ts.map +1 -0
- package/dist/utils/ed25519-constants.js +21 -0
- package/dist/utils/ed25519-constants.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +105 -0
- package/src/__tests__/integration/full-flow.test.ts +362 -0
- package/src/__tests__/providers/base.test.ts +173 -0
- package/src/__tests__/providers/memory.test.ts +332 -0
- package/src/__tests__/utils/mock-providers.ts +319 -0
- package/src/__tests__/utils/node-crypto-provider.ts +93 -0
- package/src/auth/handshake.ts +411 -0
- package/src/auth/index.ts +11 -0
- package/src/auth/types.ts +40 -0
- package/src/delegation/__tests__/audience-validator.test.ts +110 -0
- package/src/delegation/__tests__/bitstring.test.ts +346 -0
- package/src/delegation/__tests__/cascading-revocation.test.ts +624 -0
- package/src/delegation/__tests__/delegation-graph.test.ts +623 -0
- package/src/delegation/__tests__/did-key-resolver.test.ts +265 -0
- package/src/delegation/__tests__/did-web-resolver.test.ts +467 -0
- package/src/delegation/__tests__/outbound-headers.test.ts +230 -0
- package/src/delegation/__tests__/outbound-proof.test.ts +179 -0
- package/src/delegation/__tests__/statuslist-manager.test.ts +515 -0
- package/src/delegation/__tests__/utils.test.ts +185 -0
- package/src/delegation/__tests__/vc-issuer.test.ts +487 -0
- package/src/delegation/__tests__/vc-verifier.test.ts +1029 -0
- package/src/delegation/audience-validator.ts +24 -0
- package/src/delegation/bitstring.ts +160 -0
- package/src/delegation/cascading-revocation.ts +224 -0
- package/src/delegation/delegation-graph.ts +143 -0
- package/src/delegation/did-key-resolver.ts +181 -0
- package/src/delegation/did-web-resolver.ts +270 -0
- package/src/delegation/index.ts +33 -0
- package/src/delegation/outbound-headers.ts +193 -0
- package/src/delegation/outbound-proof.ts +90 -0
- package/src/delegation/statuslist-manager.ts +219 -0
- package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +366 -0
- package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +228 -0
- package/src/delegation/storage/memory-graph-storage.ts +178 -0
- package/src/delegation/storage/memory-statuslist-storage.ts +42 -0
- package/src/delegation/utils.ts +189 -0
- package/src/delegation/vc-issuer.ts +137 -0
- package/src/delegation/vc-verifier.ts +440 -0
- package/src/index.ts +264 -0
- package/src/logging/__tests__/logger.test.ts +366 -0
- package/src/logging/index.ts +6 -0
- package/src/logging/logger.ts +91 -0
- package/src/middleware/__tests__/with-mcpi.test.ts +504 -0
- package/src/middleware/index.ts +16 -0
- package/src/middleware/with-mcpi.ts +766 -0
- package/src/proof/__tests__/proof-generator.test.ts +483 -0
- package/src/proof/__tests__/verifier.test.ts +488 -0
- package/src/proof/errors.ts +75 -0
- package/src/proof/generator.ts +255 -0
- package/src/proof/index.ts +22 -0
- package/src/proof/verifier.ts +449 -0
- package/src/providers/base.ts +68 -0
- package/src/providers/index.ts +15 -0
- package/src/providers/memory.ts +130 -0
- package/src/session/__tests__/session-manager.test.ts +342 -0
- package/src/session/index.ts +7 -0
- package/src/session/manager.ts +332 -0
- package/src/types/protocol.ts +596 -0
- package/src/utils/__tests__/base58.test.ts +281 -0
- package/src/utils/__tests__/base64.test.ts +239 -0
- package/src/utils/__tests__/crypto-service.test.ts +530 -0
- package/src/utils/__tests__/did-helpers.test.ts +156 -0
- package/src/utils/base58.ts +115 -0
- package/src/utils/base64.ts +116 -0
- package/src/utils/crypto-service.ts +209 -0
- package/src/utils/did-helpers.ts +210 -0
- package/src/utils/ed25519-constants.ts +23 -0
- package/src/utils/index.ts +9 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Management — Platform-agnostic Protocol Reference
|
|
3
|
+
*
|
|
4
|
+
* Handles handshake enforcement, session management, and nonce validation
|
|
5
|
+
* according to MCP-I requirements 4.5–4.9 and 19.1–19.2.
|
|
6
|
+
*
|
|
7
|
+
* Platform adapters inject a CryptoProvider for all random byte generation.
|
|
8
|
+
* The static generateNonce() uses globalThis.crypto (available Node 20+ and
|
|
9
|
+
* Cloudflare Workers) to remain synchronous without platform-specific imports.
|
|
10
|
+
*/
|
|
11
|
+
import type { HandshakeRequest, SessionContext, NonceCache } from '../types/protocol.js';
|
|
12
|
+
import type { CryptoProvider } from '../providers/base.js';
|
|
13
|
+
export interface SessionConfig {
|
|
14
|
+
timestampSkewSeconds?: number;
|
|
15
|
+
sessionTtlMinutes?: number;
|
|
16
|
+
absoluteSessionLifetime?: number;
|
|
17
|
+
nonceCache?: NonceCache;
|
|
18
|
+
serverDid?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface HandshakeResult {
|
|
21
|
+
success: boolean;
|
|
22
|
+
session?: SessionContext;
|
|
23
|
+
error?: {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
remediation?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare class SessionManager {
|
|
30
|
+
private config;
|
|
31
|
+
private cryptoProvider;
|
|
32
|
+
private sessions;
|
|
33
|
+
constructor(cryptoProvider: CryptoProvider, config?: SessionConfig);
|
|
34
|
+
setServerDid(serverDid: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Validate an MCP-I handshake request and create a session.
|
|
37
|
+
*
|
|
38
|
+
* Performs the following checks:
|
|
39
|
+
* - Timestamp within acceptable skew window
|
|
40
|
+
* - Audience matches server DID (if configured)
|
|
41
|
+
* - Nonce not previously used (replay protection)
|
|
42
|
+
*
|
|
43
|
+
* @param request - The handshake request containing nonce, audience, timestamp, and optional agentDid
|
|
44
|
+
* @returns Result object with success flag, session on success, or error details on failure
|
|
45
|
+
*/
|
|
46
|
+
validateHandshake(request: HandshakeRequest): Promise<HandshakeResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Retrieve a session by ID, checking for expiration.
|
|
49
|
+
*
|
|
50
|
+
* Updates lastActivity timestamp on successful retrieval (sliding window expiry).
|
|
51
|
+
* Returns null if session doesn't exist, has exceeded idle TTL, or has exceeded
|
|
52
|
+
* absolute lifetime (if configured).
|
|
53
|
+
*
|
|
54
|
+
* @param sessionId - The session ID (e.g., "mcpi_...")
|
|
55
|
+
* @returns Session context if valid, null if expired or not found
|
|
56
|
+
*/
|
|
57
|
+
getSession(sessionId: string): Promise<SessionContext | null>;
|
|
58
|
+
private generateSessionId;
|
|
59
|
+
private generateClientId;
|
|
60
|
+
private normalizeClientInfoString;
|
|
61
|
+
private buildClientInfo;
|
|
62
|
+
static generateNonce(): string;
|
|
63
|
+
cleanup(): Promise<void>;
|
|
64
|
+
getStats(): {
|
|
65
|
+
activeSessions: number;
|
|
66
|
+
config: {
|
|
67
|
+
timestampSkewSeconds: number;
|
|
68
|
+
sessionTtlMinutes: number;
|
|
69
|
+
absoluteSessionLifetime?: number;
|
|
70
|
+
cacheType: string;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
clearSessions(): void;
|
|
74
|
+
}
|
|
75
|
+
export declare function createHandshakeRequest(audience: string): HandshakeRequest;
|
|
76
|
+
export declare function validateHandshakeFormat(request: unknown): request is HandshakeRequest;
|
|
77
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,UAAU,EACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,aAAa;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAGZ;IACF,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,cAAc,EAAE,cAAc,EAAE,MAAM,GAAE,aAAkB;IAqBtE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;;;;;;;OAUG;IACG,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgF5E;;;;;;;;;OASG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YA2BrD,iBAAiB;YAWjB,gBAAgB;IAQ9B,OAAO,CAAC,yBAAyB;YAMnB,eAAe;IA2B7B,MAAM,CAAC,aAAa,IAAI,MAAM;IAaxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB9B,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE;YACN,oBAAoB,EAAE,MAAM,CAAC;YAC7B,iBAAiB,EAAE,MAAM,CAAC;YAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;YACjC,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH;IAYD,aAAa,IAAI,IAAI;CAGtB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAMzE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAYrF"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Management — Platform-agnostic Protocol Reference
|
|
3
|
+
*
|
|
4
|
+
* Handles handshake enforcement, session management, and nonce validation
|
|
5
|
+
* according to MCP-I requirements 4.5–4.9 and 19.1–19.2.
|
|
6
|
+
*
|
|
7
|
+
* Platform adapters inject a CryptoProvider for all random byte generation.
|
|
8
|
+
* The static generateNonce() uses globalThis.crypto (available Node 20+ and
|
|
9
|
+
* Cloudflare Workers) to remain synchronous without platform-specific imports.
|
|
10
|
+
*/
|
|
11
|
+
import { MemoryNonceCacheProvider } from '../providers/memory.js';
|
|
12
|
+
import { logger } from '../logging/index.js';
|
|
13
|
+
export class SessionManager {
|
|
14
|
+
config;
|
|
15
|
+
cryptoProvider;
|
|
16
|
+
sessions = new Map();
|
|
17
|
+
constructor(cryptoProvider, config = {}) {
|
|
18
|
+
this.cryptoProvider = cryptoProvider;
|
|
19
|
+
this.config = {
|
|
20
|
+
timestampSkewSeconds: config.timestampSkewSeconds ?? 120,
|
|
21
|
+
sessionTtlMinutes: config.sessionTtlMinutes ?? 30,
|
|
22
|
+
nonceCache: config.nonceCache ?? new MemoryNonceCacheProvider(),
|
|
23
|
+
...(config.absoluteSessionLifetime !== undefined && {
|
|
24
|
+
absoluteSessionLifetime: config.absoluteSessionLifetime,
|
|
25
|
+
}),
|
|
26
|
+
...(config.serverDid !== undefined && { serverDid: config.serverDid }),
|
|
27
|
+
};
|
|
28
|
+
if (this.config.nonceCache instanceof MemoryNonceCacheProvider) {
|
|
29
|
+
logger.warn('[SessionManager] Using MemoryNonceCacheProvider — not suitable for ' +
|
|
30
|
+
'multi-instance deployments. Use Redis, DynamoDB, or Cloudflare KV ' +
|
|
31
|
+
'for production.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
setServerDid(serverDid) {
|
|
35
|
+
this.config.serverDid = serverDid;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Validate an MCP-I handshake request and create a session.
|
|
39
|
+
*
|
|
40
|
+
* Performs the following checks:
|
|
41
|
+
* - Timestamp within acceptable skew window
|
|
42
|
+
* - Audience matches server DID (if configured)
|
|
43
|
+
* - Nonce not previously used (replay protection)
|
|
44
|
+
*
|
|
45
|
+
* @param request - The handshake request containing nonce, audience, timestamp, and optional agentDid
|
|
46
|
+
* @returns Result object with success flag, session on success, or error details on failure
|
|
47
|
+
*/
|
|
48
|
+
async validateHandshake(request) {
|
|
49
|
+
try {
|
|
50
|
+
const now = Math.floor(Date.now() / 1000);
|
|
51
|
+
const timeDiff = Math.abs(now - request.timestamp);
|
|
52
|
+
if (timeDiff > this.config.timestampSkewSeconds) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: {
|
|
56
|
+
code: 'XMCP_I_EHANDSHAKE',
|
|
57
|
+
message: `Timestamp outside acceptable range (±${this.config.timestampSkewSeconds}s)`,
|
|
58
|
+
remediation: `Check NTP sync on client and server. Current server time: ${now}, received: ${request.timestamp}, diff: ${timeDiff}s. Adjust timestampSkewSeconds if needed.`,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Validate audience matches this server's DID (SPEC.md §4 MUST)
|
|
63
|
+
if (this.config.serverDid && request.audience !== this.config.serverDid) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: {
|
|
67
|
+
code: 'MCPI_AUDIENCE_MISMATCH',
|
|
68
|
+
message: `Audience mismatch: expected ${this.config.serverDid}, got ${request.audience}`,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const nonceExists = await this.config.nonceCache.has(request.nonce, request.agentDid);
|
|
73
|
+
if (nonceExists) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
error: {
|
|
77
|
+
code: 'XMCP_I_EHANDSHAKE',
|
|
78
|
+
message: 'Nonce already used (replay attack prevention)',
|
|
79
|
+
remediation: 'Generate a new unique nonce for each request',
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const nonceTtlSeconds = this.config.sessionTtlMinutes * 60 + 60;
|
|
84
|
+
await this.config.nonceCache.add(request.nonce, nonceTtlSeconds, request.agentDid);
|
|
85
|
+
const sessionId = await this.generateSessionId();
|
|
86
|
+
const clientInfo = await this.buildClientInfo(request);
|
|
87
|
+
const session = {
|
|
88
|
+
sessionId,
|
|
89
|
+
audience: request.audience,
|
|
90
|
+
nonce: request.nonce,
|
|
91
|
+
timestamp: request.timestamp,
|
|
92
|
+
createdAt: now,
|
|
93
|
+
lastActivity: now,
|
|
94
|
+
ttlMinutes: this.config.sessionTtlMinutes,
|
|
95
|
+
identityState: 'anonymous',
|
|
96
|
+
agentDid: request.agentDid,
|
|
97
|
+
...(this.config.serverDid && { serverDid: this.config.serverDid }),
|
|
98
|
+
...(clientInfo && { clientInfo }),
|
|
99
|
+
};
|
|
100
|
+
this.sessions.set(sessionId, session);
|
|
101
|
+
return { success: true, session };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
error: {
|
|
107
|
+
code: 'XMCP_I_EHANDSHAKE',
|
|
108
|
+
message: `Handshake validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Retrieve a session by ID, checking for expiration.
|
|
115
|
+
*
|
|
116
|
+
* Updates lastActivity timestamp on successful retrieval (sliding window expiry).
|
|
117
|
+
* Returns null if session doesn't exist, has exceeded idle TTL, or has exceeded
|
|
118
|
+
* absolute lifetime (if configured).
|
|
119
|
+
*
|
|
120
|
+
* @param sessionId - The session ID (e.g., "mcpi_...")
|
|
121
|
+
* @returns Session context if valid, null if expired or not found
|
|
122
|
+
*/
|
|
123
|
+
async getSession(sessionId) {
|
|
124
|
+
const session = this.sessions.get(sessionId);
|
|
125
|
+
if (!session)
|
|
126
|
+
return null;
|
|
127
|
+
const now = Math.floor(Date.now() / 1000);
|
|
128
|
+
const idleTimeSeconds = now - session.lastActivity;
|
|
129
|
+
const maxIdleSeconds = session.ttlMinutes * 60;
|
|
130
|
+
if (idleTimeSeconds > maxIdleSeconds) {
|
|
131
|
+
this.sessions.delete(sessionId);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (this.config.absoluteSessionLifetime !== undefined) {
|
|
135
|
+
const sessionAgeSeconds = now - session.createdAt;
|
|
136
|
+
const maxAgeSeconds = this.config.absoluteSessionLifetime * 60;
|
|
137
|
+
if (sessionAgeSeconds > maxAgeSeconds) {
|
|
138
|
+
this.sessions.delete(sessionId);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
session.lastActivity = now;
|
|
143
|
+
this.sessions.set(sessionId, session);
|
|
144
|
+
return session;
|
|
145
|
+
}
|
|
146
|
+
async generateSessionId() {
|
|
147
|
+
const bytes = await this.cryptoProvider.randomBytes(16);
|
|
148
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
149
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
150
|
+
const hex = Array.from(bytes)
|
|
151
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
152
|
+
.join('');
|
|
153
|
+
const uuid = `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
154
|
+
return `mcpi_${uuid}`;
|
|
155
|
+
}
|
|
156
|
+
async generateClientId() {
|
|
157
|
+
const bytes = await this.cryptoProvider.randomBytes(6);
|
|
158
|
+
const hex = Array.from(bytes)
|
|
159
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
160
|
+
.join('');
|
|
161
|
+
return `client_${hex}`;
|
|
162
|
+
}
|
|
163
|
+
normalizeClientInfoString(value) {
|
|
164
|
+
if (typeof value !== 'string')
|
|
165
|
+
return undefined;
|
|
166
|
+
const trimmed = value.trim();
|
|
167
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
168
|
+
}
|
|
169
|
+
async buildClientInfo(request) {
|
|
170
|
+
const hasMetadata = !!request.clientInfo ||
|
|
171
|
+
typeof request.clientProtocolVersion === 'string' ||
|
|
172
|
+
request.clientCapabilities !== undefined;
|
|
173
|
+
if (!hasMetadata)
|
|
174
|
+
return undefined;
|
|
175
|
+
const source = request.clientInfo;
|
|
176
|
+
return {
|
|
177
|
+
name: this.normalizeClientInfoString(source?.name) ?? 'unknown',
|
|
178
|
+
title: this.normalizeClientInfoString(source?.title),
|
|
179
|
+
version: this.normalizeClientInfoString(source?.version),
|
|
180
|
+
platform: this.normalizeClientInfoString(source?.platform),
|
|
181
|
+
vendor: this.normalizeClientInfoString(source?.vendor),
|
|
182
|
+
persistentId: this.normalizeClientInfoString(source?.persistentId),
|
|
183
|
+
clientId: this.normalizeClientInfoString(source?.clientId) ??
|
|
184
|
+
(await this.generateClientId()),
|
|
185
|
+
protocolVersion: this.normalizeClientInfoString(request.clientProtocolVersion),
|
|
186
|
+
capabilities: request.clientCapabilities,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
static generateNonce() {
|
|
190
|
+
const buffer = new Uint8Array(16);
|
|
191
|
+
globalThis.crypto.getRandomValues(buffer);
|
|
192
|
+
let binaryStr = '';
|
|
193
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
194
|
+
binaryStr += String.fromCharCode(buffer[i]);
|
|
195
|
+
}
|
|
196
|
+
return btoa(binaryStr)
|
|
197
|
+
.replace(/\+/g, '-')
|
|
198
|
+
.replace(/\//g, '_')
|
|
199
|
+
.replace(/=/g, '');
|
|
200
|
+
}
|
|
201
|
+
async cleanup() {
|
|
202
|
+
const now = Math.floor(Date.now() / 1000);
|
|
203
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
204
|
+
const idleTimeSeconds = now - session.lastActivity;
|
|
205
|
+
const maxIdleSeconds = session.ttlMinutes * 60;
|
|
206
|
+
let expired = idleTimeSeconds > maxIdleSeconds;
|
|
207
|
+
if (!expired && this.config.absoluteSessionLifetime !== undefined) {
|
|
208
|
+
const sessionAgeSeconds = now - session.createdAt;
|
|
209
|
+
const maxAgeSeconds = this.config.absoluteSessionLifetime * 60;
|
|
210
|
+
expired = sessionAgeSeconds > maxAgeSeconds;
|
|
211
|
+
}
|
|
212
|
+
if (expired) {
|
|
213
|
+
this.sessions.delete(sessionId);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
await this.config.nonceCache.cleanup();
|
|
217
|
+
}
|
|
218
|
+
getStats() {
|
|
219
|
+
return {
|
|
220
|
+
activeSessions: this.sessions.size,
|
|
221
|
+
config: {
|
|
222
|
+
timestampSkewSeconds: this.config.timestampSkewSeconds,
|
|
223
|
+
sessionTtlMinutes: this.config.sessionTtlMinutes,
|
|
224
|
+
absoluteSessionLifetime: this.config.absoluteSessionLifetime,
|
|
225
|
+
cacheType: this.config.nonceCache.constructor.name,
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
clearSessions() {
|
|
230
|
+
this.sessions.clear();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export function createHandshakeRequest(audience) {
|
|
234
|
+
return {
|
|
235
|
+
nonce: SessionManager.generateNonce(),
|
|
236
|
+
audience,
|
|
237
|
+
timestamp: Math.floor(Date.now() / 1000),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
export function validateHandshakeFormat(request) {
|
|
241
|
+
return (typeof request === 'object' &&
|
|
242
|
+
request !== null &&
|
|
243
|
+
typeof request['nonce'] === 'string' &&
|
|
244
|
+
request['nonce'].length > 0 &&
|
|
245
|
+
typeof request['audience'] === 'string' &&
|
|
246
|
+
request['audience'].length > 0 &&
|
|
247
|
+
typeof request['timestamp'] === 'number' &&
|
|
248
|
+
request['timestamp'] > 0 &&
|
|
249
|
+
Number.isInteger(request['timestamp']));
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP-I Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Inlined type definitions for the MCP-I protocol reference implementation.
|
|
5
|
+
* All types are pure TypeScript — no external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I §3, §4, §5, §6
|
|
8
|
+
*/
|
|
9
|
+
export interface CrispBudget {
|
|
10
|
+
unit: 'USD' | 'ops' | 'points';
|
|
11
|
+
cap: number;
|
|
12
|
+
window?: {
|
|
13
|
+
kind: 'rolling' | 'fixed';
|
|
14
|
+
durationSec: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface CrispScope {
|
|
18
|
+
resource: string;
|
|
19
|
+
matcher: 'exact' | 'prefix' | 'regex';
|
|
20
|
+
constraints?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface DelegationConstraints {
|
|
23
|
+
notBefore?: number;
|
|
24
|
+
notAfter?: number;
|
|
25
|
+
scopes?: string[];
|
|
26
|
+
audience?: string | string[];
|
|
27
|
+
crisp?: {
|
|
28
|
+
budget?: CrispBudget;
|
|
29
|
+
scopes: CrispScope[];
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
};
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
export type DelegationStatus = 'active' | 'revoked' | 'expired';
|
|
35
|
+
export interface DelegationRecord {
|
|
36
|
+
id: string;
|
|
37
|
+
issuerDid: string;
|
|
38
|
+
subjectDid: string;
|
|
39
|
+
controller?: string;
|
|
40
|
+
vcId: string;
|
|
41
|
+
parentId?: string;
|
|
42
|
+
constraints: DelegationConstraints;
|
|
43
|
+
signature: string;
|
|
44
|
+
status: DelegationStatus;
|
|
45
|
+
createdAt?: number;
|
|
46
|
+
revokedAt?: number;
|
|
47
|
+
revokedReason?: string;
|
|
48
|
+
metadata?: Record<string, unknown>;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
export interface Proof {
|
|
52
|
+
type: string;
|
|
53
|
+
created?: string;
|
|
54
|
+
verificationMethod?: string;
|
|
55
|
+
proofPurpose?: string;
|
|
56
|
+
proofValue?: string;
|
|
57
|
+
jws?: string;
|
|
58
|
+
[key: string]: unknown;
|
|
59
|
+
}
|
|
60
|
+
export interface CredentialStatus {
|
|
61
|
+
id: string;
|
|
62
|
+
type: 'StatusList2021Entry';
|
|
63
|
+
statusPurpose: 'revocation' | 'suspension';
|
|
64
|
+
statusListIndex: string;
|
|
65
|
+
statusListCredential: string;
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}
|
|
68
|
+
export interface DelegationCredentialSubject {
|
|
69
|
+
id: string;
|
|
70
|
+
delegation: {
|
|
71
|
+
id: string;
|
|
72
|
+
issuerDid: string;
|
|
73
|
+
subjectDid: string;
|
|
74
|
+
userDid?: string;
|
|
75
|
+
userIdentifier?: string;
|
|
76
|
+
sessionId?: string;
|
|
77
|
+
scopes?: string[];
|
|
78
|
+
controller?: string;
|
|
79
|
+
parentId?: string;
|
|
80
|
+
constraints: DelegationConstraints;
|
|
81
|
+
status: DelegationStatus;
|
|
82
|
+
createdAt?: number;
|
|
83
|
+
metadata?: Record<string, unknown>;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export interface DelegationCredential {
|
|
87
|
+
'@context': (string | Record<string, unknown>)[];
|
|
88
|
+
id?: string;
|
|
89
|
+
type: string[];
|
|
90
|
+
issuer: string | {
|
|
91
|
+
id: string;
|
|
92
|
+
[key: string]: unknown;
|
|
93
|
+
};
|
|
94
|
+
issuanceDate: string;
|
|
95
|
+
expirationDate?: string;
|
|
96
|
+
credentialSubject: DelegationCredentialSubject;
|
|
97
|
+
credentialStatus?: CredentialStatus;
|
|
98
|
+
proof?: Proof;
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
export declare const DELEGATION_CREDENTIAL_CONTEXT: "https://schema.modelcontextprotocol-identity.io/xmcp-i/credentials/delegation.v1.0.0.json";
|
|
102
|
+
export interface StatusList2021Credential {
|
|
103
|
+
'@context': (string | Record<string, unknown>)[];
|
|
104
|
+
id: string;
|
|
105
|
+
type: string[];
|
|
106
|
+
issuer: string | {
|
|
107
|
+
id: string;
|
|
108
|
+
};
|
|
109
|
+
issuanceDate: string;
|
|
110
|
+
credentialSubject: {
|
|
111
|
+
id?: string;
|
|
112
|
+
type: 'StatusList2021';
|
|
113
|
+
statusPurpose: 'revocation' | 'suspension';
|
|
114
|
+
encodedList: string;
|
|
115
|
+
};
|
|
116
|
+
proof?: Record<string, unknown>;
|
|
117
|
+
[key: string]: unknown;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Wrap a DelegationRecord in an unsigned W3C VC structure.
|
|
121
|
+
*/
|
|
122
|
+
export declare function wrapDelegationAsVC(delegation: DelegationRecord, options?: {
|
|
123
|
+
id?: string;
|
|
124
|
+
issuanceDate?: string;
|
|
125
|
+
expirationDate?: string;
|
|
126
|
+
credentialStatus?: CredentialStatus;
|
|
127
|
+
userDid?: string;
|
|
128
|
+
userIdentifier?: string;
|
|
129
|
+
sessionId?: string;
|
|
130
|
+
scopes?: string[];
|
|
131
|
+
}): Omit<DelegationCredential, 'proof'>;
|
|
132
|
+
/**
|
|
133
|
+
* Extract a DelegationRecord from a DelegationCredential.
|
|
134
|
+
*/
|
|
135
|
+
export declare function extractDelegationFromVC(vc: DelegationCredential): DelegationRecord;
|
|
136
|
+
/**
|
|
137
|
+
* Check if a DelegationCredential is expired.
|
|
138
|
+
*/
|
|
139
|
+
export declare function isDelegationCredentialExpired(vc: DelegationCredential): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Check if a DelegationCredential is not yet valid.
|
|
142
|
+
*/
|
|
143
|
+
export declare function isDelegationCredentialNotYetValid(vc: DelegationCredential): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Validate a DelegationCredential.
|
|
146
|
+
* Returns a Zod-compatible result shape.
|
|
147
|
+
*/
|
|
148
|
+
export declare function validateDelegationCredential(vc: unknown): {
|
|
149
|
+
success: boolean;
|
|
150
|
+
error?: {
|
|
151
|
+
message: string;
|
|
152
|
+
};
|
|
153
|
+
data?: DelegationCredential;
|
|
154
|
+
};
|
|
155
|
+
export interface MCPClientInfo {
|
|
156
|
+
name: string;
|
|
157
|
+
title?: string;
|
|
158
|
+
version?: string;
|
|
159
|
+
platform?: string;
|
|
160
|
+
vendor?: string;
|
|
161
|
+
persistentId?: string;
|
|
162
|
+
}
|
|
163
|
+
export interface MCPClientSessionInfo extends MCPClientInfo {
|
|
164
|
+
clientId: string;
|
|
165
|
+
protocolVersion?: string;
|
|
166
|
+
capabilities?: Record<string, unknown>;
|
|
167
|
+
}
|
|
168
|
+
export interface HandshakeRequest {
|
|
169
|
+
nonce: string;
|
|
170
|
+
audience: string;
|
|
171
|
+
timestamp: number;
|
|
172
|
+
agentDid?: string;
|
|
173
|
+
clientInfo?: MCPClientInfo & {
|
|
174
|
+
clientId?: string;
|
|
175
|
+
};
|
|
176
|
+
clientProtocolVersion?: string;
|
|
177
|
+
clientCapabilities?: Record<string, unknown>;
|
|
178
|
+
}
|
|
179
|
+
export type SessionIdentityState = 'anonymous' | 'authenticated';
|
|
180
|
+
export interface SessionContext {
|
|
181
|
+
sessionId: string;
|
|
182
|
+
audience: string;
|
|
183
|
+
nonce: string;
|
|
184
|
+
timestamp: number;
|
|
185
|
+
createdAt: number;
|
|
186
|
+
lastActivity: number;
|
|
187
|
+
ttlMinutes: number;
|
|
188
|
+
agentDid?: string;
|
|
189
|
+
serverDid?: string;
|
|
190
|
+
clientDid?: string;
|
|
191
|
+
userDid?: string;
|
|
192
|
+
clientInfo?: MCPClientSessionInfo;
|
|
193
|
+
identityState: SessionIdentityState;
|
|
194
|
+
oauthIdentity?: {
|
|
195
|
+
provider: string;
|
|
196
|
+
subject: string;
|
|
197
|
+
email?: string;
|
|
198
|
+
name?: string;
|
|
199
|
+
};
|
|
200
|
+
delegationRef?: string;
|
|
201
|
+
delegationChain?: string;
|
|
202
|
+
delegationScopes?: string[];
|
|
203
|
+
[key: string]: unknown;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Nonce cache interface for replay prevention.
|
|
207
|
+
*/
|
|
208
|
+
export interface NonceCache {
|
|
209
|
+
has(nonce: string, agentDid?: string): Promise<boolean>;
|
|
210
|
+
add(nonce: string, ttl: number, agentDid?: string): Promise<void>;
|
|
211
|
+
cleanup(): Promise<void>;
|
|
212
|
+
}
|
|
213
|
+
export declare const DEFAULT_SESSION_TTL_MINUTES = 30;
|
|
214
|
+
export declare const DEFAULT_TIMESTAMP_SKEW_SECONDS = 120;
|
|
215
|
+
export declare const NONCE_LENGTH_BYTES = 16;
|
|
216
|
+
export interface ProofMeta {
|
|
217
|
+
did: string;
|
|
218
|
+
kid: string;
|
|
219
|
+
ts: number;
|
|
220
|
+
nonce: string;
|
|
221
|
+
audience: string;
|
|
222
|
+
sessionId: string;
|
|
223
|
+
requestHash: string;
|
|
224
|
+
responseHash: string;
|
|
225
|
+
scopeId?: string;
|
|
226
|
+
delegationRef?: string;
|
|
227
|
+
clientDid?: string;
|
|
228
|
+
}
|
|
229
|
+
export interface DetachedProof {
|
|
230
|
+
jws: string;
|
|
231
|
+
meta: ProofMeta;
|
|
232
|
+
}
|
|
233
|
+
export interface CanonicalHashes {
|
|
234
|
+
requestHash: string;
|
|
235
|
+
responseHash: string;
|
|
236
|
+
}
|
|
237
|
+
export interface AuditRecord {
|
|
238
|
+
version: 'audit.v1';
|
|
239
|
+
ts: number;
|
|
240
|
+
session: string;
|
|
241
|
+
audience: string;
|
|
242
|
+
did: string;
|
|
243
|
+
kid: string;
|
|
244
|
+
reqHash: string;
|
|
245
|
+
resHash: string;
|
|
246
|
+
verified: 'yes' | 'no';
|
|
247
|
+
scope: string;
|
|
248
|
+
}
|
|
249
|
+
export interface AuditContext {
|
|
250
|
+
identity: {
|
|
251
|
+
did: string;
|
|
252
|
+
kid: string;
|
|
253
|
+
[key: string]: unknown;
|
|
254
|
+
};
|
|
255
|
+
session: {
|
|
256
|
+
sessionId: string;
|
|
257
|
+
audience: string;
|
|
258
|
+
[key: string]: unknown;
|
|
259
|
+
};
|
|
260
|
+
requestHash: string;
|
|
261
|
+
responseHash: string;
|
|
262
|
+
verified: 'yes' | 'no';
|
|
263
|
+
scopeId?: string;
|
|
264
|
+
}
|
|
265
|
+
export interface AuditEventContext {
|
|
266
|
+
eventType: string;
|
|
267
|
+
identity: {
|
|
268
|
+
did: string;
|
|
269
|
+
kid: string;
|
|
270
|
+
[key: string]: unknown;
|
|
271
|
+
};
|
|
272
|
+
session: {
|
|
273
|
+
sessionId: string;
|
|
274
|
+
audience: string;
|
|
275
|
+
[key: string]: unknown;
|
|
276
|
+
};
|
|
277
|
+
eventData?: Record<string, unknown>;
|
|
278
|
+
}
|
|
279
|
+
export interface AuthorizationDisplay {
|
|
280
|
+
title?: string;
|
|
281
|
+
hint?: Array<'link' | 'qr' | 'code'>;
|
|
282
|
+
authorizationCode?: string;
|
|
283
|
+
qrUrl?: string;
|
|
284
|
+
[key: string]: unknown;
|
|
285
|
+
}
|
|
286
|
+
export interface NeedsAuthorizationError {
|
|
287
|
+
error: 'needs_authorization';
|
|
288
|
+
message: string;
|
|
289
|
+
authorizationUrl: string;
|
|
290
|
+
resumeToken: string;
|
|
291
|
+
expiresAt: number;
|
|
292
|
+
scopes: string[];
|
|
293
|
+
display?: AuthorizationDisplay;
|
|
294
|
+
context?: Record<string, unknown>;
|
|
295
|
+
[key: string]: unknown;
|
|
296
|
+
}
|
|
297
|
+
export declare function createNeedsAuthorizationError(config: {
|
|
298
|
+
message: string;
|
|
299
|
+
authorizationUrl: string;
|
|
300
|
+
resumeToken: string;
|
|
301
|
+
expiresAt: number;
|
|
302
|
+
scopes: string[];
|
|
303
|
+
display?: AuthorizationDisplay;
|
|
304
|
+
}): NeedsAuthorizationError;
|
|
305
|
+
export declare function isNeedsAuthorizationError(error: unknown): error is NeedsAuthorizationError;
|
|
306
|
+
/**
|
|
307
|
+
* Validate a DetachedProof structure.
|
|
308
|
+
* Returns a Zod-compatible result shape.
|
|
309
|
+
*/
|
|
310
|
+
export declare function validateDetachedProof(proof: unknown): {
|
|
311
|
+
success: boolean;
|
|
312
|
+
error?: {
|
|
313
|
+
message: string;
|
|
314
|
+
errors?: Array<{
|
|
315
|
+
message: string;
|
|
316
|
+
}>;
|
|
317
|
+
};
|
|
318
|
+
data?: DetachedProof;
|
|
319
|
+
};
|
|
320
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/types/protocol.ts"],"names":[],"mappings":"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"}
|