@kya-os/mcp 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -0
- package/LICENSE +21 -0
- package/README.md +135 -0
- package/dist/auth/handshake.d.ts +119 -0
- package/dist/auth/handshake.d.ts.map +1 -0
- package/dist/auth/handshake.js +267 -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 +150 -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 +157 -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 +79 -0
- package/dist/delegation/outbound-headers.d.ts.map +1 -0
- package/dist/delegation/outbound-headers.js +138 -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 +47 -0
- package/dist/delegation/statuslist-manager.d.ts.map +1 -0
- package/dist/delegation/statuslist-manager.js +139 -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/errors.d.ts +42 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +45 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -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 +12 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +12 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/mcpi-transport.d.ts +39 -0
- package/dist/middleware/mcpi-transport.d.ts.map +1 -0
- package/dist/middleware/mcpi-transport.js +121 -0
- package/dist/middleware/mcpi-transport.js.map +1 -0
- package/dist/middleware/with-mcpi-server.d.ts +78 -0
- package/dist/middleware/with-mcpi-server.d.ts.map +1 -0
- package/dist/middleware/with-mcpi-server.js +109 -0
- package/dist/middleware/with-mcpi-server.js.map +1 -0
- package/dist/middleware/with-mcpi.d.ts +202 -0
- package/dist/middleware/with-mcpi.d.ts.map +1 -0
- package/dist/middleware/with-mcpi.js +625 -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 +4 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +4 -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/providers/node-crypto.d.ts +26 -0
- package/dist/providers/node-crypto.d.ts.map +1 -0
- package/dist/providers/node-crypto.js +69 -0
- package/dist/providers/node-crypto.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 +83 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +267 -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 +154 -0
- package/dist/utils/crypto-service.js.map +1 -0
- package/dist/utils/did-helpers.d.ts +168 -0
- package/dist/utils/did-helpers.d.ts.map +1 -0
- package/dist/utils/did-helpers.js +211 -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 +115 -0
- package/schemas/README.md +117 -0
- package/schemas/delegation-credential.json +312 -0
- package/schemas/detached-proof.json +97 -0
- package/schemas/handshake-request.json +84 -0
- package/schemas/handshake-response.json +67 -0
- package/schemas/well-known-mcpi.json +176 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization types for the auth module.
|
|
3
|
+
*
|
|
4
|
+
* Minimal interfaces required by the auth handshake.
|
|
5
|
+
*/
|
|
6
|
+
import type { DelegationRecord } from '../types/protocol.js';
|
|
7
|
+
export interface VerifyDelegationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
delegation?: DelegationRecord;
|
|
10
|
+
credential?: {
|
|
11
|
+
agent_did: string;
|
|
12
|
+
user_did: string;
|
|
13
|
+
scopes: string[];
|
|
14
|
+
authorization: {
|
|
15
|
+
type: 'oauth' | 'oauth2' | 'password' | 'credential' | 'webauthn' | 'siwe' | 'none';
|
|
16
|
+
provider?: string;
|
|
17
|
+
credentialType?: string;
|
|
18
|
+
rpId?: string;
|
|
19
|
+
userVerification?: 'required' | 'preferred' | 'discouraged';
|
|
20
|
+
chainId?: number;
|
|
21
|
+
domain?: string;
|
|
22
|
+
};
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
reason?: string;
|
|
26
|
+
cached?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface DelegationVerifier {
|
|
29
|
+
verify(agentDid: string, scopes: string[]): Promise<VerifyDelegationResult>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,CAAC,EAAE;QACX,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,aAAa,EAAE;YACb,IAAI,EACA,OAAO,GACP,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,UAAU,GACV,MAAM,GACN,MAAM,CAAC;YACX,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,cAAc,CAAC,EAAE,MAAM,CAAC;YACxB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,gBAAgB,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,CAAC;YAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Audience Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates if a delegation's audience matches the server DID.
|
|
5
|
+
* Supports both single server DID and multiple server DIDs.
|
|
6
|
+
*/
|
|
7
|
+
import type { DelegationRecord } from '../types/protocol.js';
|
|
8
|
+
export declare function verifyDelegationAudience(delegation: DelegationRecord, serverDid: string): boolean;
|
|
9
|
+
//# sourceMappingURL=audience-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audience-validator.d.ts","sourceRoot":"","sources":["../../src/delegation/audience-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAWT"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Audience Validation
|
|
3
|
+
*
|
|
4
|
+
* Validates if a delegation's audience matches the server DID.
|
|
5
|
+
* Supports both single server DID and multiple server DIDs.
|
|
6
|
+
*/
|
|
7
|
+
export function verifyDelegationAudience(delegation, serverDid) {
|
|
8
|
+
if (!delegation.constraints.audience) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
const audience = delegation.constraints.audience;
|
|
12
|
+
if (typeof audience === 'string') {
|
|
13
|
+
return audience === serverDid;
|
|
14
|
+
}
|
|
15
|
+
return audience.includes(serverDid);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=audience-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audience-validator.js","sourceRoot":"","sources":["../../src/delegation/audience-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,UAAU,wBAAwB,CACtC,UAA4B,EAC5B,SAAiB;IAEjB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC;IACjD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,KAAK,SAAS,CAAC;IAChC,CAAC;IAED,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitstring Utilities for StatusList2021
|
|
3
|
+
*
|
|
4
|
+
* Implements GZIP compression + base64url encoding for efficient status lists.
|
|
5
|
+
* Per W3C StatusList2021 spec, each bit represents credential status:
|
|
6
|
+
* - 0: Not revoked/suspended
|
|
7
|
+
* - 1: Revoked/suspended
|
|
8
|
+
*
|
|
9
|
+
* Related Spec: W3C StatusList2021
|
|
10
|
+
*/
|
|
11
|
+
export interface CompressionFunction {
|
|
12
|
+
compress(data: Uint8Array): Promise<Uint8Array>;
|
|
13
|
+
}
|
|
14
|
+
export interface DecompressionFunction {
|
|
15
|
+
decompress(data: Uint8Array): Promise<Uint8Array>;
|
|
16
|
+
}
|
|
17
|
+
export declare class BitstringManager {
|
|
18
|
+
private compressor;
|
|
19
|
+
private decompressor;
|
|
20
|
+
private bits;
|
|
21
|
+
private size;
|
|
22
|
+
constructor(size: number, compressor: CompressionFunction, decompressor: DecompressionFunction);
|
|
23
|
+
setBit(index: number, value: boolean): void;
|
|
24
|
+
getBit(index: number): boolean;
|
|
25
|
+
getSetBits(): number[];
|
|
26
|
+
encode(): Promise<string>;
|
|
27
|
+
static decode(encodedList: string, compressor: CompressionFunction, decompressor: DecompressionFunction): Promise<BitstringManager>;
|
|
28
|
+
getRawBits(): Uint8Array;
|
|
29
|
+
getSize(): number;
|
|
30
|
+
private base64urlEncode;
|
|
31
|
+
private static base64urlDecode;
|
|
32
|
+
private bytesToBase64;
|
|
33
|
+
private static base64ToBytes;
|
|
34
|
+
static fromSetBits(size: number, setBits: number[], compressor: CompressionFunction, decompressor: DecompressionFunction): BitstringManager;
|
|
35
|
+
}
|
|
36
|
+
export declare function isIndexSet(encodedList: string, index: number, decompressor: DecompressionFunction): Promise<boolean>;
|
|
37
|
+
//# sourceMappingURL=bitstring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitstring.d.ts","sourceRoot":"","sources":["../../src/delegation/bitstring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD;AAED,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IANtB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAS;gBAGnB,IAAI,EAAE,MAAM,EACJ,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB;IAO7C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAe3C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAW9B,UAAU,IAAI,MAAM,EAAE;IAUhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;WAKlB,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,gBAAgB,CAAC;IAU5B,UAAU,IAAI,UAAU;IAIxB,OAAO,IAAI,MAAM;IAIjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,MAAM,CAAC,eAAe;IAQ9B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,MAAM,CAAC,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB,GAClC,gBAAgB;CAOpB;AAED,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,OAAO,CAAC,CAYlB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitstring Utilities for StatusList2021
|
|
3
|
+
*
|
|
4
|
+
* Implements GZIP compression + base64url encoding for efficient status lists.
|
|
5
|
+
* Per W3C StatusList2021 spec, each bit represents credential status:
|
|
6
|
+
* - 0: Not revoked/suspended
|
|
7
|
+
* - 1: Revoked/suspended
|
|
8
|
+
*
|
|
9
|
+
* Related Spec: W3C StatusList2021
|
|
10
|
+
*/
|
|
11
|
+
export class BitstringManager {
|
|
12
|
+
compressor;
|
|
13
|
+
decompressor;
|
|
14
|
+
bits;
|
|
15
|
+
size;
|
|
16
|
+
constructor(size, compressor, decompressor) {
|
|
17
|
+
this.compressor = compressor;
|
|
18
|
+
this.decompressor = decompressor;
|
|
19
|
+
this.size = size;
|
|
20
|
+
const byteCount = Math.ceil(size / 8);
|
|
21
|
+
this.bits = new Uint8Array(byteCount);
|
|
22
|
+
}
|
|
23
|
+
setBit(index, value) {
|
|
24
|
+
if (index < 0 || index >= this.size) {
|
|
25
|
+
throw new Error(`Bit index ${index} out of range (0-${this.size - 1})`);
|
|
26
|
+
}
|
|
27
|
+
const byteIndex = Math.floor(index / 8);
|
|
28
|
+
const bitIndex = index % 8;
|
|
29
|
+
if (value) {
|
|
30
|
+
this.bits[byteIndex] |= 1 << bitIndex;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.bits[byteIndex] &= ~(1 << bitIndex);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
getBit(index) {
|
|
37
|
+
if (index < 0 || index >= this.size) {
|
|
38
|
+
throw new Error(`Bit index ${index} out of range (0-${this.size - 1})`);
|
|
39
|
+
}
|
|
40
|
+
const byteIndex = Math.floor(index / 8);
|
|
41
|
+
const bitIndex = index % 8;
|
|
42
|
+
return (this.bits[byteIndex] & (1 << bitIndex)) !== 0;
|
|
43
|
+
}
|
|
44
|
+
getSetBits() {
|
|
45
|
+
const setBits = [];
|
|
46
|
+
for (let i = 0; i < this.size; i++) {
|
|
47
|
+
if (this.getBit(i)) {
|
|
48
|
+
setBits.push(i);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return setBits;
|
|
52
|
+
}
|
|
53
|
+
async encode() {
|
|
54
|
+
const compressed = await this.compressor.compress(this.bits);
|
|
55
|
+
return this.base64urlEncode(compressed);
|
|
56
|
+
}
|
|
57
|
+
static async decode(encodedList, compressor, decompressor) {
|
|
58
|
+
const compressed = BitstringManager.base64urlDecode(encodedList);
|
|
59
|
+
const decompressed = await decompressor.decompress(compressed);
|
|
60
|
+
const size = decompressed.length * 8;
|
|
61
|
+
const manager = new BitstringManager(size, compressor, decompressor);
|
|
62
|
+
manager.bits = decompressed;
|
|
63
|
+
return manager;
|
|
64
|
+
}
|
|
65
|
+
getRawBits() {
|
|
66
|
+
return this.bits;
|
|
67
|
+
}
|
|
68
|
+
getSize() {
|
|
69
|
+
return this.size;
|
|
70
|
+
}
|
|
71
|
+
base64urlEncode(data) {
|
|
72
|
+
const base64 = this.bytesToBase64(data);
|
|
73
|
+
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
74
|
+
}
|
|
75
|
+
static base64urlDecode(encoded) {
|
|
76
|
+
let base64 = encoded.replace(/-/g, '+').replace(/_/g, '/');
|
|
77
|
+
while (base64.length % 4 !== 0) {
|
|
78
|
+
base64 += '=';
|
|
79
|
+
}
|
|
80
|
+
return BitstringManager.base64ToBytes(base64);
|
|
81
|
+
}
|
|
82
|
+
bytesToBase64(bytes) {
|
|
83
|
+
const binary = Array.from(bytes)
|
|
84
|
+
.map((byte) => String.fromCharCode(byte))
|
|
85
|
+
.join('');
|
|
86
|
+
return btoa(binary);
|
|
87
|
+
}
|
|
88
|
+
static base64ToBytes(base64) {
|
|
89
|
+
let standardBase64 = base64.replace(/-/g, '+').replace(/_/g, '/');
|
|
90
|
+
const paddingNeeded = (4 - (standardBase64.length % 4)) % 4;
|
|
91
|
+
standardBase64 += '='.repeat(paddingNeeded);
|
|
92
|
+
const binary = atob(standardBase64);
|
|
93
|
+
const bytes = new Uint8Array(binary.length);
|
|
94
|
+
for (let i = 0; i < binary.length; i++) {
|
|
95
|
+
bytes[i] = binary.charCodeAt(i);
|
|
96
|
+
}
|
|
97
|
+
return bytes;
|
|
98
|
+
}
|
|
99
|
+
static fromSetBits(size, setBits, compressor, decompressor) {
|
|
100
|
+
const manager = new BitstringManager(size, compressor, decompressor);
|
|
101
|
+
for (const index of setBits) {
|
|
102
|
+
manager.setBit(index, true);
|
|
103
|
+
}
|
|
104
|
+
return manager;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function isIndexSet(encodedList, index, decompressor) {
|
|
108
|
+
const compressed = BitstringManager['base64urlDecode'](encodedList);
|
|
109
|
+
const decompressed = await decompressor.decompress(compressed);
|
|
110
|
+
const byteIndex = Math.floor(index / 8);
|
|
111
|
+
const bitIndex = index % 8;
|
|
112
|
+
if (byteIndex >= decompressed.length) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return (decompressed[byteIndex] & (1 << bitIndex)) !== 0;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=bitstring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bitstring.js","sourceRoot":"","sources":["../../src/delegation/bitstring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascading Revocation Manager
|
|
3
|
+
*
|
|
4
|
+
* Implements cascading revocation per Python POC design.
|
|
5
|
+
* When a parent delegation is revoked, all children are automatically revoked.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I §4.4, Delegation Chains
|
|
8
|
+
*/
|
|
9
|
+
import { DelegationGraphManager } from './delegation-graph.js';
|
|
10
|
+
import { StatusList2021Manager } from './statuslist-manager.js';
|
|
11
|
+
export interface RevocationEvent {
|
|
12
|
+
delegationId: string;
|
|
13
|
+
isRoot: boolean;
|
|
14
|
+
parentId?: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
reason?: string;
|
|
17
|
+
}
|
|
18
|
+
export type RevocationHook = (event: RevocationEvent) => Promise<void> | void;
|
|
19
|
+
export interface CascadingRevocationOptions {
|
|
20
|
+
reason?: string;
|
|
21
|
+
onRevoke?: RevocationHook;
|
|
22
|
+
maxDepth?: number;
|
|
23
|
+
dryRun?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare class CascadingRevocationManager {
|
|
26
|
+
private graph;
|
|
27
|
+
private statusList;
|
|
28
|
+
constructor(graph: DelegationGraphManager, statusList: StatusList2021Manager);
|
|
29
|
+
revokeDelegation(delegationId: string, options?: CascadingRevocationOptions): Promise<RevocationEvent[]>;
|
|
30
|
+
private revokeNode;
|
|
31
|
+
restoreDelegation(delegationId: string): Promise<RevocationEvent>;
|
|
32
|
+
isRevoked(delegationId: string): Promise<{
|
|
33
|
+
revoked: boolean;
|
|
34
|
+
reason?: string;
|
|
35
|
+
revokedAncestor?: string;
|
|
36
|
+
}>;
|
|
37
|
+
getRevokedInSubtree(rootId: string): Promise<string[]>;
|
|
38
|
+
private parseCredentialStatus;
|
|
39
|
+
validateDelegation(delegationId: string): Promise<{
|
|
40
|
+
valid: boolean;
|
|
41
|
+
reason?: string;
|
|
42
|
+
}>;
|
|
43
|
+
}
|
|
44
|
+
export declare function createCascadingRevocationManager(graph: DelegationGraphManager, statusList: StatusList2021Manager): CascadingRevocationManager;
|
|
45
|
+
//# sourceMappingURL=cascading-revocation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascading-revocation.d.ts","sourceRoot":"","sources":["../../src/delegation/cascading-revocation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,sBAAsB,EAAuB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE9E,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;gBADV,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,qBAAqB;IAGrC,gBAAgB,CACpB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,eAAe,EAAE,CAAC;YA8Cf,UAAU;IA6BlB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuBjE,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAwBI,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB5D,OAAO,CAAC,qBAAqB;IAgBvB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAkB7F;AAED,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,qBAAqB,GAChC,0BAA0B,CAE5B"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cascading Revocation Manager
|
|
3
|
+
*
|
|
4
|
+
* Implements cascading revocation per Python POC design.
|
|
5
|
+
* When a parent delegation is revoked, all children are automatically revoked.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I §4.4, Delegation Chains
|
|
8
|
+
*/
|
|
9
|
+
export class CascadingRevocationManager {
|
|
10
|
+
graph;
|
|
11
|
+
statusList;
|
|
12
|
+
constructor(graph, statusList) {
|
|
13
|
+
this.graph = graph;
|
|
14
|
+
this.statusList = statusList;
|
|
15
|
+
}
|
|
16
|
+
async revokeDelegation(delegationId, options = {}) {
|
|
17
|
+
const maxDepth = options.maxDepth || 100;
|
|
18
|
+
const events = [];
|
|
19
|
+
const targetNode = await this.graph.getNode(delegationId);
|
|
20
|
+
if (!targetNode) {
|
|
21
|
+
throw new Error(`Delegation not found: ${delegationId}`);
|
|
22
|
+
}
|
|
23
|
+
const depth = await this.graph.getDepth(delegationId);
|
|
24
|
+
if (depth > maxDepth) {
|
|
25
|
+
throw new Error(`Delegation depth ${depth} exceeds maximum ${maxDepth}`);
|
|
26
|
+
}
|
|
27
|
+
const rootEvent = await this.revokeNode(targetNode, true, options.reason, options.dryRun);
|
|
28
|
+
events.push(rootEvent);
|
|
29
|
+
if (options.onRevoke) {
|
|
30
|
+
await options.onRevoke(rootEvent);
|
|
31
|
+
}
|
|
32
|
+
const descendants = await this.graph.getDescendants(delegationId);
|
|
33
|
+
for (const descendant of descendants) {
|
|
34
|
+
const event = await this.revokeNode(descendant, false, `Cascaded from ${delegationId}`, options.dryRun, delegationId);
|
|
35
|
+
events.push(event);
|
|
36
|
+
if (options.onRevoke) {
|
|
37
|
+
await options.onRevoke(event);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return events;
|
|
41
|
+
}
|
|
42
|
+
async revokeNode(node, isRoot, reason, dryRun, parentId) {
|
|
43
|
+
const event = {
|
|
44
|
+
delegationId: node.id,
|
|
45
|
+
isRoot,
|
|
46
|
+
parentId,
|
|
47
|
+
timestamp: Date.now(),
|
|
48
|
+
reason,
|
|
49
|
+
};
|
|
50
|
+
if (dryRun) {
|
|
51
|
+
return event;
|
|
52
|
+
}
|
|
53
|
+
if (node.credentialStatusId) {
|
|
54
|
+
const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
|
|
55
|
+
if (credentialStatus) {
|
|
56
|
+
await this.statusList.updateStatus(credentialStatus, true);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return event;
|
|
60
|
+
}
|
|
61
|
+
async restoreDelegation(delegationId) {
|
|
62
|
+
const node = await this.graph.getNode(delegationId);
|
|
63
|
+
if (!node) {
|
|
64
|
+
throw new Error(`Delegation not found: ${delegationId}`);
|
|
65
|
+
}
|
|
66
|
+
const event = {
|
|
67
|
+
delegationId: node.id,
|
|
68
|
+
isRoot: true,
|
|
69
|
+
timestamp: Date.now(),
|
|
70
|
+
reason: 'Restored',
|
|
71
|
+
};
|
|
72
|
+
if (node.credentialStatusId) {
|
|
73
|
+
const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
|
|
74
|
+
if (credentialStatus) {
|
|
75
|
+
await this.statusList.updateStatus(credentialStatus, false);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return event;
|
|
79
|
+
}
|
|
80
|
+
async isRevoked(delegationId) {
|
|
81
|
+
// Walk root → target so ancestor revocation is detected before the
|
|
82
|
+
// target's own (cascade-set) bit. getChain() already returns root-first order.
|
|
83
|
+
const chain = await this.graph.getChain(delegationId);
|
|
84
|
+
for (const node of chain) {
|
|
85
|
+
if (node.credentialStatusId) {
|
|
86
|
+
const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
|
|
87
|
+
if (credentialStatus) {
|
|
88
|
+
const isRevoked = await this.statusList.checkStatus(credentialStatus);
|
|
89
|
+
if (isRevoked) {
|
|
90
|
+
return {
|
|
91
|
+
revoked: true,
|
|
92
|
+
reason: node.id === delegationId ? 'Directly revoked' : 'Ancestor revoked',
|
|
93
|
+
revokedAncestor: node.id === delegationId ? undefined : node.id,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { revoked: false };
|
|
100
|
+
}
|
|
101
|
+
async getRevokedInSubtree(rootId) {
|
|
102
|
+
const descendants = await this.graph.getDescendants(rootId);
|
|
103
|
+
const revoked = [];
|
|
104
|
+
const rootRevoked = await this.isRevoked(rootId);
|
|
105
|
+
if (rootRevoked.revoked) {
|
|
106
|
+
revoked.push(rootId);
|
|
107
|
+
}
|
|
108
|
+
for (const node of descendants) {
|
|
109
|
+
const isRevoked = await this.isRevoked(node.id);
|
|
110
|
+
if (isRevoked.revoked) {
|
|
111
|
+
revoked.push(node.id);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return revoked;
|
|
115
|
+
}
|
|
116
|
+
parseCredentialStatus(credentialStatusId) {
|
|
117
|
+
const match = credentialStatusId.match(/^(.+)#(\d+)$/);
|
|
118
|
+
if (!match)
|
|
119
|
+
return null;
|
|
120
|
+
const [, statusListCredential, indexStr] = match;
|
|
121
|
+
const index = parseInt(indexStr, 10);
|
|
122
|
+
return {
|
|
123
|
+
id: credentialStatusId,
|
|
124
|
+
type: 'StatusList2021Entry',
|
|
125
|
+
statusPurpose: 'revocation',
|
|
126
|
+
statusListIndex: index.toString(),
|
|
127
|
+
statusListCredential: statusListCredential,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async validateDelegation(delegationId) {
|
|
131
|
+
const revokedCheck = await this.isRevoked(delegationId);
|
|
132
|
+
if (revokedCheck.revoked) {
|
|
133
|
+
return {
|
|
134
|
+
valid: false,
|
|
135
|
+
reason: revokedCheck.revokedAncestor
|
|
136
|
+
? `Ancestor ${revokedCheck.revokedAncestor} is revoked`
|
|
137
|
+
: 'Delegation is revoked',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const chainValidation = await this.graph.validateChain(delegationId);
|
|
141
|
+
if (!chainValidation.valid) {
|
|
142
|
+
return chainValidation;
|
|
143
|
+
}
|
|
144
|
+
return { valid: true };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function createCascadingRevocationManager(graph, statusList) {
|
|
148
|
+
return new CascadingRevocationManager(graph, statusList);
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=cascading-revocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cascading-revocation.js","sourceRoot":"","sources":["../../src/delegation/cascading-revocation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAuBH,MAAM,OAAO,0BAA0B;IAE3B;IACA;IAFV,YACU,KAA6B,EAC7B,UAAiC;QADjC,UAAK,GAAL,KAAK,CAAwB;QAC7B,eAAU,GAAV,UAAU,CAAuB;IACxC,CAAC;IAEJ,KAAK,CAAC,gBAAgB,CACpB,YAAoB,EACpB,UAAsC,EAAE;QAExC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC;QACzC,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CACrC,UAAU,EACV,IAAI,EACJ,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAElE,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CACjC,UAAU,EACV,KAAK,EACL,iBAAiB,YAAY,EAAE,EAC/B,OAAO,CAAC,MAAM,EACd,YAAY,CACb,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,IAAoB,EACpB,MAAe,EACf,MAAe,EACf,MAAgB,EAChB,QAAiB;QAEjB,MAAM,KAAK,GAAoB;YAC7B,YAAY,EAAE,IAAI,CAAC,EAAE;YACrB,MAAM;YACN,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM;SACP,CAAC;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7E,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,YAAoB;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,KAAK,GAAoB;YAC7B,YAAY,EAAE,IAAI,CAAC,EAAE;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,MAAM,EAAE,UAAU;SACnB,CAAC;QAEF,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7E,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAoB;QAKlC,mEAAmE;QACnE,+EAA+E;QAC/E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC7E,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;oBACtE,IAAI,SAAS,EAAE,CAAC;wBACd,OAAO;4BACL,OAAO,EAAE,IAAI;4BACb,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB;4BAC1E,eAAe,EAAE,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;yBAChE,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChD,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,qBAAqB,CAAC,kBAA0B;QACtD,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,CAAC,EAAE,oBAAoB,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAS,EAAE,EAAE,CAAC,CAAC;QAEtC,OAAO;YACL,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,qBAAqB;YAC3B,aAAa,EAAE,YAAY;YAC3B,eAAe,EAAE,KAAK,CAAC,QAAQ,EAAE;YACjC,oBAAoB,EAAE,oBAAqB;SAC5C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,YAAY,CAAC,eAAe;oBAClC,CAAC,CAAC,YAAY,YAAY,CAAC,eAAe,aAAa;oBACvD,CAAC,CAAC,uBAAuB;aAC5B,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC3B,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAA6B,EAC7B,UAAiC;IAEjC,OAAO,IAAI,0BAA0B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Graph Manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks parent-child relationships between delegation credentials.
|
|
5
|
+
* Critical for cascading revocation per Delegation-Revocation.md.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I §4.4, Delegation Chains
|
|
8
|
+
*/
|
|
9
|
+
export interface DelegationNode {
|
|
10
|
+
id: string;
|
|
11
|
+
parentId: string | null;
|
|
12
|
+
children: string[];
|
|
13
|
+
issuerDid: string;
|
|
14
|
+
subjectDid: string;
|
|
15
|
+
credentialStatusId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DelegationGraphStorageProvider {
|
|
18
|
+
getNode(delegationId: string): Promise<DelegationNode | null>;
|
|
19
|
+
setNode(node: DelegationNode): Promise<void>;
|
|
20
|
+
getChildren(delegationId: string): Promise<DelegationNode[]>;
|
|
21
|
+
getChain(delegationId: string): Promise<DelegationNode[]>;
|
|
22
|
+
getDescendants(delegationId: string): Promise<DelegationNode[]>;
|
|
23
|
+
deleteNode(delegationId: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare class DelegationGraphManager {
|
|
26
|
+
private storage;
|
|
27
|
+
constructor(storage: DelegationGraphStorageProvider);
|
|
28
|
+
registerDelegation(params: {
|
|
29
|
+
id: string;
|
|
30
|
+
parentId: string | null;
|
|
31
|
+
issuerDid: string;
|
|
32
|
+
subjectDid: string;
|
|
33
|
+
credentialStatusId?: string;
|
|
34
|
+
}): Promise<DelegationNode>;
|
|
35
|
+
private addChildToParent;
|
|
36
|
+
getNode(delegationId: string): Promise<DelegationNode | null>;
|
|
37
|
+
getChildren(delegationId: string): Promise<DelegationNode[]>;
|
|
38
|
+
getDescendants(delegationId: string): Promise<DelegationNode[]>;
|
|
39
|
+
getChain(delegationId: string): Promise<DelegationNode[]>;
|
|
40
|
+
isAncestor(ancestorId: string, descendantId: string): Promise<boolean>;
|
|
41
|
+
getDepth(delegationId: string): Promise<number>;
|
|
42
|
+
validateChain(delegationId: string): Promise<{
|
|
43
|
+
valid: boolean;
|
|
44
|
+
reason?: string;
|
|
45
|
+
}>;
|
|
46
|
+
removeDelegation(delegationId: string): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
export declare function createDelegationGraph(storage: DelegationGraphStorageProvider): DelegationGraphManager;
|
|
49
|
+
//# sourceMappingURL=delegation-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-graph.d.ts","sourceRoot":"","sources":["../../src/delegation/delegation-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC1D,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAChE,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,qBAAa,sBAAsB;IACrB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,8BAA8B;IAErD,kBAAkB,CAAC,MAAM,EAAE;QAC/B,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,GAAG,OAAO,CAAC,cAAc,CAAC;YAmBb,gBAAgB;IAYxB,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI7D,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI5D,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI/D,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIzD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/C,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BjF,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc5D;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,8BAA8B,GACtC,sBAAsB,CAExB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Graph Manager
|
|
3
|
+
*
|
|
4
|
+
* Tracks parent-child relationships between delegation credentials.
|
|
5
|
+
* Critical for cascading revocation per Delegation-Revocation.md.
|
|
6
|
+
*
|
|
7
|
+
* Related Spec: MCP-I §4.4, Delegation Chains
|
|
8
|
+
*/
|
|
9
|
+
export class DelegationGraphManager {
|
|
10
|
+
storage;
|
|
11
|
+
constructor(storage) {
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
}
|
|
14
|
+
async registerDelegation(params) {
|
|
15
|
+
const node = {
|
|
16
|
+
id: params.id,
|
|
17
|
+
parentId: params.parentId,
|
|
18
|
+
children: [],
|
|
19
|
+
issuerDid: params.issuerDid,
|
|
20
|
+
subjectDid: params.subjectDid,
|
|
21
|
+
credentialStatusId: params.credentialStatusId,
|
|
22
|
+
};
|
|
23
|
+
await this.storage.setNode(node);
|
|
24
|
+
if (params.parentId) {
|
|
25
|
+
await this.addChildToParent(params.parentId, params.id);
|
|
26
|
+
}
|
|
27
|
+
return node;
|
|
28
|
+
}
|
|
29
|
+
async addChildToParent(parentId, childId) {
|
|
30
|
+
const parent = await this.storage.getNode(parentId);
|
|
31
|
+
if (!parent) {
|
|
32
|
+
throw new Error(`Parent delegation not found: ${parentId}`);
|
|
33
|
+
}
|
|
34
|
+
if (!parent.children.includes(childId)) {
|
|
35
|
+
parent.children.push(childId);
|
|
36
|
+
await this.storage.setNode(parent);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async getNode(delegationId) {
|
|
40
|
+
return this.storage.getNode(delegationId);
|
|
41
|
+
}
|
|
42
|
+
async getChildren(delegationId) {
|
|
43
|
+
return this.storage.getChildren(delegationId);
|
|
44
|
+
}
|
|
45
|
+
async getDescendants(delegationId) {
|
|
46
|
+
return this.storage.getDescendants(delegationId);
|
|
47
|
+
}
|
|
48
|
+
async getChain(delegationId) {
|
|
49
|
+
return this.storage.getChain(delegationId);
|
|
50
|
+
}
|
|
51
|
+
async isAncestor(ancestorId, descendantId) {
|
|
52
|
+
const chain = await this.getChain(descendantId);
|
|
53
|
+
return chain.some((node) => node.id === ancestorId);
|
|
54
|
+
}
|
|
55
|
+
async getDepth(delegationId) {
|
|
56
|
+
const chain = await this.getChain(delegationId);
|
|
57
|
+
return chain.length - 1;
|
|
58
|
+
}
|
|
59
|
+
async validateChain(delegationId) {
|
|
60
|
+
const chain = await this.getChain(delegationId);
|
|
61
|
+
if (chain.length === 0) {
|
|
62
|
+
return { valid: false, reason: 'Delegation not found' };
|
|
63
|
+
}
|
|
64
|
+
for (let i = 1; i < chain.length; i++) {
|
|
65
|
+
const parent = chain[i - 1];
|
|
66
|
+
const child = chain[i];
|
|
67
|
+
if (child.issuerDid !== parent.subjectDid) {
|
|
68
|
+
return {
|
|
69
|
+
valid: false,
|
|
70
|
+
reason: `Invalid chain: ${child.id} issued by ${child.issuerDid} but parent ${parent.id} subject is ${parent.subjectDid}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (child.parentId !== parent.id) {
|
|
74
|
+
return {
|
|
75
|
+
valid: false,
|
|
76
|
+
reason: `Invalid chain: ${child.id} parentId=${child.parentId} but actual parent is ${parent.id}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { valid: true };
|
|
81
|
+
}
|
|
82
|
+
async removeDelegation(delegationId) {
|
|
83
|
+
const node = await this.storage.getNode(delegationId);
|
|
84
|
+
if (!node)
|
|
85
|
+
return;
|
|
86
|
+
if (node.parentId) {
|
|
87
|
+
const parent = await this.storage.getNode(node.parentId);
|
|
88
|
+
if (parent) {
|
|
89
|
+
parent.children = parent.children.filter((id) => id !== delegationId);
|
|
90
|
+
await this.storage.setNode(parent);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
await this.storage.deleteNode(delegationId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function createDelegationGraph(storage) {
|
|
97
|
+
return new DelegationGraphManager(storage);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=delegation-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegation-graph.js","sourceRoot":"","sources":["../../src/delegation/delegation-graph.ts"],"names":[],"mappings":"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"}
|