@kya-os/mcp-i-core 1.1.0 → 1.1.1-canary.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/__tests__/utils/mock-providers.d.ts +102 -0
  2. package/dist/__tests__/utils/mock-providers.d.ts.map +1 -0
  3. package/dist/__tests__/utils/mock-providers.js +270 -0
  4. package/dist/__tests__/utils/mock-providers.js.map +1 -0
  5. package/dist/cache/tool-protection-cache.d.ts +73 -0
  6. package/dist/cache/tool-protection-cache.d.ts.map +1 -0
  7. package/dist/cache/tool-protection-cache.js +83 -0
  8. package/dist/cache/tool-protection-cache.js.map +1 -0
  9. package/dist/compliance/index.d.ts +8 -0
  10. package/dist/compliance/index.d.ts.map +1 -0
  11. package/dist/compliance/index.js +24 -0
  12. package/dist/compliance/index.js.map +1 -0
  13. package/dist/compliance/schema-registry.d.ts +50 -0
  14. package/dist/compliance/schema-registry.d.ts.map +1 -0
  15. package/dist/compliance/schema-registry.js +438 -0
  16. package/dist/compliance/schema-registry.js.map +1 -0
  17. package/dist/compliance/schema-verifier-v2.d.ts +110 -0
  18. package/dist/compliance/schema-verifier-v2.d.ts.map +1 -0
  19. package/dist/compliance/schema-verifier-v2.js +510 -0
  20. package/dist/compliance/schema-verifier-v2.js.map +1 -0
  21. package/dist/compliance/schema-verifier.d.ts +110 -0
  22. package/dist/compliance/schema-verifier.d.ts.map +1 -0
  23. package/dist/compliance/schema-verifier.js +518 -0
  24. package/dist/compliance/schema-verifier.js.map +1 -0
  25. package/dist/delegation/bitstring.d.ts +139 -0
  26. package/dist/delegation/bitstring.d.ts.map +1 -0
  27. package/dist/delegation/bitstring.js +213 -0
  28. package/dist/delegation/bitstring.js.map +1 -0
  29. package/dist/delegation/cascading-revocation.d.ts +162 -0
  30. package/dist/delegation/cascading-revocation.d.ts.map +1 -0
  31. package/dist/delegation/cascading-revocation.js +263 -0
  32. package/dist/delegation/cascading-revocation.js.map +1 -0
  33. package/dist/delegation/delegation-graph.d.ts +178 -0
  34. package/dist/delegation/delegation-graph.d.ts.map +1 -0
  35. package/dist/delegation/delegation-graph.js +209 -0
  36. package/dist/delegation/delegation-graph.js.map +1 -0
  37. package/dist/delegation/index.d.ts +14 -0
  38. package/dist/delegation/index.d.ts.map +1 -0
  39. package/dist/delegation/index.js +30 -0
  40. package/dist/delegation/index.js.map +1 -0
  41. package/dist/delegation/statuslist-manager.d.ts +148 -0
  42. package/dist/delegation/statuslist-manager.d.ts.map +1 -0
  43. package/dist/delegation/statuslist-manager.js +221 -0
  44. package/dist/delegation/statuslist-manager.js.map +1 -0
  45. package/dist/delegation/storage/index.d.ts +9 -0
  46. package/dist/delegation/storage/index.d.ts.map +1 -0
  47. package/dist/delegation/storage/index.js +25 -0
  48. package/dist/delegation/storage/index.js.map +1 -0
  49. package/dist/delegation/storage/memory-graph-storage.d.ts +70 -0
  50. package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -0
  51. package/dist/delegation/storage/memory-graph-storage.js +149 -0
  52. package/dist/delegation/storage/memory-graph-storage.js.map +1 -0
  53. package/dist/delegation/storage/memory-statuslist-storage.d.ts +49 -0
  54. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -0
  55. package/dist/delegation/storage/memory-statuslist-storage.js +67 -0
  56. package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -0
  57. package/dist/delegation/utils.d.ts +19 -0
  58. package/dist/delegation/utils.d.ts.map +1 -0
  59. package/dist/delegation/utils.js +48 -0
  60. package/dist/delegation/utils.js.map +1 -0
  61. package/dist/delegation/vc-issuer.d.ts +135 -0
  62. package/dist/delegation/vc-issuer.d.ts.map +1 -0
  63. package/dist/delegation/vc-issuer.js +140 -0
  64. package/dist/delegation/vc-issuer.js.map +1 -0
  65. package/dist/delegation/vc-verifier.d.ts +213 -0
  66. package/dist/delegation/vc-verifier.d.ts.map +1 -0
  67. package/dist/delegation/vc-verifier.js +354 -0
  68. package/dist/delegation/vc-verifier.js.map +1 -0
  69. package/dist/index.d.ts +16 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +64 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/providers/base.d.ts +1 -1
  74. package/dist/providers/base.d.ts.map +1 -1
  75. package/dist/providers/memory.js +2 -2
  76. package/dist/providers/memory.js.map +1 -1
  77. package/dist/runtime/base.d.ts +12 -0
  78. package/dist/runtime/base.d.ts.map +1 -1
  79. package/dist/runtime/base.js +96 -2
  80. package/dist/runtime/base.js.map +1 -1
  81. package/dist/services/tool-protection.service.d.ts +55 -0
  82. package/dist/services/tool-protection.service.d.ts.map +1 -0
  83. package/dist/services/tool-protection.service.js +158 -0
  84. package/dist/services/tool-protection.service.js.map +1 -0
  85. package/dist/types/tool-protection.d.ts +103 -0
  86. package/dist/types/tool-protection.d.ts.map +1 -0
  87. package/dist/types/tool-protection.js +41 -0
  88. package/dist/types/tool-protection.js.map +1 -0
  89. package/dist/utils/cors.d.ts +44 -0
  90. package/dist/utils/cors.d.ts.map +1 -0
  91. package/dist/utils/cors.js +71 -0
  92. package/dist/utils/cors.js.map +1 -0
  93. package/dist/utils/index.d.ts +5 -0
  94. package/dist/utils/index.d.ts.map +1 -0
  95. package/dist/utils/index.js +21 -0
  96. package/dist/utils/index.js.map +1 -0
  97. package/package.json +9 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitstring.d.ts","sourceRoot":"","sources":["../../src/delegation/bitstring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD;AAED;;;;;GAKG;AACH,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;IAQ7C;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAiB3C;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAW9B;;;;OAIG;IACH,UAAU,IAAI,MAAM,EAAE;IAUtB;;;;;;;;OAQG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ/B;;;;;OAKG;WACU,MAAM,CACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,gBAAgB,CAAC;IAc5B;;OAEG;IACH,UAAU,IAAI,UAAU;IAIxB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAa9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B;;;;;;;;OAQG;IACH,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;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,qBAAqB,GAClC,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ /**
3
+ * Bitstring Utilities for StatusList2021
4
+ *
5
+ * Implements GZIP compression + base64url encoding for efficient status lists.
6
+ * Per W3C StatusList2021 spec, each bit represents credential status:
7
+ * - 0: Not revoked/suspended
8
+ * - 1: Revoked/suspended
9
+ *
10
+ * Related Spec: W3C StatusList2021
11
+ * Python Reference: Delegation-Revocation.md
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.BitstringManager = void 0;
15
+ exports.isIndexSet = isIndexSet;
16
+ /**
17
+ * Bitstring encoder/decoder
18
+ *
19
+ * Manages a bitstring for credential status tracking.
20
+ * Platform-agnostic - requires compression functions to be injected.
21
+ */
22
+ class BitstringManager {
23
+ compressor;
24
+ decompressor;
25
+ bits;
26
+ size;
27
+ constructor(size, compressor, decompressor) {
28
+ this.compressor = compressor;
29
+ this.decompressor = decompressor;
30
+ this.size = size;
31
+ // Allocate bytes (8 bits per byte)
32
+ const byteCount = Math.ceil(size / 8);
33
+ this.bits = new Uint8Array(byteCount);
34
+ }
35
+ /**
36
+ * Set a bit at a specific index
37
+ *
38
+ * @param index - The bit index (0-based)
39
+ * @param value - true to set (revoked), false to clear (active)
40
+ */
41
+ setBit(index, value) {
42
+ if (index < 0 || index >= this.size) {
43
+ throw new Error(`Bit index ${index} out of range (0-${this.size - 1})`);
44
+ }
45
+ const byteIndex = Math.floor(index / 8);
46
+ const bitIndex = index % 8;
47
+ if (value) {
48
+ // Set bit to 1
49
+ this.bits[byteIndex] |= 1 << bitIndex;
50
+ }
51
+ else {
52
+ // Clear bit to 0
53
+ this.bits[byteIndex] &= ~(1 << bitIndex);
54
+ }
55
+ }
56
+ /**
57
+ * Get a bit at a specific index
58
+ *
59
+ * @param index - The bit index (0-based)
60
+ * @returns true if set (revoked), false if clear (active)
61
+ */
62
+ getBit(index) {
63
+ if (index < 0 || index >= this.size) {
64
+ throw new Error(`Bit index ${index} out of range (0-${this.size - 1})`);
65
+ }
66
+ const byteIndex = Math.floor(index / 8);
67
+ const bitIndex = index % 8;
68
+ return (this.bits[byteIndex] & (1 << bitIndex)) !== 0;
69
+ }
70
+ /**
71
+ * Get all set bit indices
72
+ *
73
+ * @returns Array of indices where bits are set to 1
74
+ */
75
+ getSetBits() {
76
+ const setBits = [];
77
+ for (let i = 0; i < this.size; i++) {
78
+ if (this.getBit(i)) {
79
+ setBits.push(i);
80
+ }
81
+ }
82
+ return setBits;
83
+ }
84
+ /**
85
+ * Encode bitstring to base64url (GZIP compressed)
86
+ *
87
+ * Per StatusList2021 spec:
88
+ * 1. GZIP compress the bitstring
89
+ * 2. Base64url encode the compressed data
90
+ *
91
+ * @returns Base64url-encoded compressed bitstring
92
+ */
93
+ async encode() {
94
+ // Step 1: GZIP compress
95
+ const compressed = await this.compressor.compress(this.bits);
96
+ // Step 2: Base64url encode
97
+ return this.base64urlEncode(compressed);
98
+ }
99
+ /**
100
+ * Decode base64url bitstring (GZIP compressed)
101
+ *
102
+ * @param encodedList - Base64url-encoded compressed bitstring
103
+ * @returns BitstringManager instance
104
+ */
105
+ static async decode(encodedList, compressor, decompressor) {
106
+ // Step 1: Base64url decode
107
+ const compressed = BitstringManager.base64urlDecode(encodedList);
108
+ // Step 2: GZIP decompress
109
+ const decompressed = await decompressor.decompress(compressed);
110
+ // Step 3: Create manager with decoded bits
111
+ const size = decompressed.length * 8;
112
+ const manager = new BitstringManager(size, compressor, decompressor);
113
+ manager.bits = decompressed;
114
+ return manager;
115
+ }
116
+ /**
117
+ * Get the raw bitstring
118
+ */
119
+ getRawBits() {
120
+ return this.bits;
121
+ }
122
+ /**
123
+ * Get the size (number of bits)
124
+ */
125
+ getSize() {
126
+ return this.size;
127
+ }
128
+ /**
129
+ * Base64url encode (RFC 4648)
130
+ *
131
+ * Platform-agnostic implementation.
132
+ */
133
+ base64urlEncode(data) {
134
+ // Convert to base64
135
+ const base64 = this.bytesToBase64(data);
136
+ // Convert base64 to base64url
137
+ return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
138
+ }
139
+ /**
140
+ * Base64url decode (RFC 4648)
141
+ */
142
+ static base64urlDecode(encoded) {
143
+ // Convert base64url to base64
144
+ let base64 = encoded.replace(/-/g, '+').replace(/_/g, '/');
145
+ // Add padding if needed
146
+ while (base64.length % 4 !== 0) {
147
+ base64 += '=';
148
+ }
149
+ // Convert base64 to bytes
150
+ return BitstringManager.base64ToBytes(base64);
151
+ }
152
+ /**
153
+ * Convert bytes to base64
154
+ *
155
+ * Platform-agnostic implementation (works in Node and browsers/Cloudflare)
156
+ */
157
+ bytesToBase64(bytes) {
158
+ const binary = Array.from(bytes)
159
+ .map((byte) => String.fromCharCode(byte))
160
+ .join('');
161
+ return btoa(binary);
162
+ }
163
+ /**
164
+ * Convert base64 to bytes
165
+ */
166
+ static base64ToBytes(base64) {
167
+ const binary = atob(base64);
168
+ const bytes = new Uint8Array(binary.length);
169
+ for (let i = 0; i < binary.length; i++) {
170
+ bytes[i] = binary.charCodeAt(i);
171
+ }
172
+ return bytes;
173
+ }
174
+ /**
175
+ * Create a bitstring from a list of indices to set
176
+ *
177
+ * @param size - Total size of the bitstring
178
+ * @param setBits - Indices to set to 1
179
+ * @param compressor - Compression function
180
+ * @param decompressor - Decompression function
181
+ * @returns BitstringManager instance
182
+ */
183
+ static fromSetBits(size, setBits, compressor, decompressor) {
184
+ const manager = new BitstringManager(size, compressor, decompressor);
185
+ for (const index of setBits) {
186
+ manager.setBit(index, true);
187
+ }
188
+ return manager;
189
+ }
190
+ }
191
+ exports.BitstringManager = BitstringManager;
192
+ /**
193
+ * Helper to check if an index is set in an encoded status list
194
+ *
195
+ * Convenience function for quick status checks without creating a full manager.
196
+ *
197
+ * @param encodedList - Base64url-encoded compressed bitstring
198
+ * @param index - The bit index to check
199
+ * @param decompressor - Decompression function
200
+ * @returns true if bit is set (revoked), false otherwise
201
+ */
202
+ async function isIndexSet(encodedList, index, decompressor) {
203
+ // Decode without needing compressor (we're only reading)
204
+ const compressed = BitstringManager['base64urlDecode'](encodedList);
205
+ const decompressed = await decompressor.decompress(compressed);
206
+ const byteIndex = Math.floor(index / 8);
207
+ const bitIndex = index % 8;
208
+ if (byteIndex >= decompressed.length) {
209
+ return false; // Out of range = not set
210
+ }
211
+ return (decompressed[byteIndex] & (1 << bitIndex)) !== 0;
212
+ }
213
+ //# 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,162 @@
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
+ * SOLID Principles:
8
+ * - Single Responsibility: Only handles cascading revocation logic
9
+ * - Open/Closed: Extensible via hooks/callbacks
10
+ * - Liskov Substitution: Works with any graph/statuslist implementations
11
+ * - Interface Segregation: Minimal interface
12
+ * - Dependency Inversion: Depends on abstractions (graph, statuslist)
13
+ *
14
+ * Related Spec: MCP-I §4.4, Delegation Chains
15
+ * Python Reference: Delegation-Revocation.md:45-67
16
+ */
17
+ import { DelegationGraphManager } from './delegation-graph';
18
+ import { StatusList2021Manager } from './statuslist-manager';
19
+ /**
20
+ * Revocation event for auditing/logging
21
+ */
22
+ export interface RevocationEvent {
23
+ /** Delegation ID that was revoked */
24
+ delegationId: string;
25
+ /** Whether this was the root of the cascade or a child */
26
+ isRoot: boolean;
27
+ /** Parent delegation ID (if cascaded) */
28
+ parentId?: string;
29
+ /** Timestamp */
30
+ timestamp: number;
31
+ /** Reason for revocation */
32
+ reason?: string;
33
+ }
34
+ /**
35
+ * Revocation hook function
36
+ *
37
+ * Called for each delegation during cascading revocation.
38
+ * Useful for auditing, logging, or custom logic.
39
+ */
40
+ export type RevocationHook = (event: RevocationEvent) => Promise<void> | void;
41
+ /**
42
+ * Options for cascading revocation
43
+ */
44
+ export interface CascadingRevocationOptions {
45
+ /** Reason for revocation (for audit trail) */
46
+ reason?: string;
47
+ /** Optional hook called for each revocation */
48
+ onRevoke?: RevocationHook;
49
+ /** Maximum depth to cascade (prevents infinite loops) */
50
+ maxDepth?: number;
51
+ /** Dry run - don't actually revoke, just return what would be revoked */
52
+ dryRun?: boolean;
53
+ }
54
+ /**
55
+ * Cascading Revocation Manager
56
+ *
57
+ * Coordinates revocation across the delegation graph.
58
+ * Per Delegation-Revocation.md:45-67:
59
+ * - When parent revoked → all descendants revoked
60
+ * - Uses StatusList2021 for efficient updates
61
+ * - Maintains audit trail
62
+ */
63
+ export declare class CascadingRevocationManager {
64
+ private graph;
65
+ private statusList;
66
+ constructor(graph: DelegationGraphManager, statusList: StatusList2021Manager);
67
+ /**
68
+ * Revoke a delegation and all its descendants
69
+ *
70
+ * Per Delegation-Revocation.md:56-67:
71
+ * 1. Revoke the target delegation
72
+ * 2. Find all descendants
73
+ * 3. Revoke each descendant
74
+ * 4. Trigger hooks for auditing
75
+ *
76
+ * @param delegationId - The delegation ID to revoke
77
+ * @param options - Revocation options
78
+ * @returns Array of revoked delegation IDs
79
+ */
80
+ revokeDelegation(delegationId: string, options?: CascadingRevocationOptions): Promise<RevocationEvent[]>;
81
+ /**
82
+ * Revoke a single node
83
+ *
84
+ * @param node - The delegation node
85
+ * @param isRoot - Whether this is the root of the cascade
86
+ * @param reason - Reason for revocation
87
+ * @param dryRun - If true, don't actually revoke
88
+ * @param parentId - Parent ID if cascaded
89
+ * @returns Revocation event
90
+ */
91
+ private revokeNode;
92
+ /**
93
+ * Restore (un-revoke) a delegation
94
+ *
95
+ * Note: This does NOT cascade to children.
96
+ * Only the specific delegation is restored.
97
+ *
98
+ * @param delegationId - The delegation ID to restore
99
+ * @returns Revocation event
100
+ */
101
+ restoreDelegation(delegationId: string): Promise<RevocationEvent>;
102
+ /**
103
+ * Check if a delegation is revoked
104
+ *
105
+ * Checks both:
106
+ * 1. The delegation itself
107
+ * 2. Any of its ancestors (cascading check)
108
+ *
109
+ * Per Delegation-Revocation.md:56: If any ancestor is revoked, this is revoked.
110
+ *
111
+ * @param delegationId - The delegation ID
112
+ * @returns true if revoked (directly or via cascade)
113
+ */
114
+ isRevoked(delegationId: string): Promise<{
115
+ revoked: boolean;
116
+ reason?: string;
117
+ revokedAncestor?: string;
118
+ }>;
119
+ /**
120
+ * Get all revoked delegations in a subtree
121
+ *
122
+ * @param rootId - The root delegation ID
123
+ * @returns Array of revoked delegation IDs
124
+ */
125
+ getRevokedInSubtree(rootId: string): Promise<string[]>;
126
+ /**
127
+ * Parse credential status from stored ID
128
+ *
129
+ * The credentialStatusId is stored as a composite:
130
+ * "statusListUrl#index"
131
+ *
132
+ * @param credentialStatusId - The stored credential status ID
133
+ * @returns Parsed CredentialStatus, or null if invalid
134
+ */
135
+ private parseCredentialStatus;
136
+ /**
137
+ * Validate that a delegation can be used
138
+ *
139
+ * Checks:
140
+ * 1. The delegation itself is not revoked
141
+ * 2. No ancestors are revoked
142
+ * 3. The chain is valid
143
+ *
144
+ * @param delegationId - The delegation ID
145
+ * @returns Validation result
146
+ */
147
+ validateDelegation(delegationId: string): Promise<{
148
+ valid: boolean;
149
+ reason?: string;
150
+ }>;
151
+ }
152
+ /**
153
+ * Create a cascading revocation manager
154
+ *
155
+ * Convenience factory function.
156
+ *
157
+ * @param graph - Delegation graph manager
158
+ * @param statusList - StatusList2021 manager
159
+ * @returns CascadingRevocationManager instance
160
+ */
161
+ export declare function createCascadingRevocationManager(graph: DelegationGraphManager, statusList: StatusList2021Manager): CascadingRevocationManager;
162
+ //# 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;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,sBAAsB,EAAkB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IAErB,0DAA0D;IAC1D,MAAM,EAAE,OAAO,CAAC;IAEhB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAElB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,UAAU;gBADV,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,qBAAqB;IAG3C;;;;;;;;;;;;OAYG;IACG,gBAAgB,CACpB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,eAAe,EAAE,CAAC;IAqD7B;;;;;;;;;OASG;YACW,UAAU;IA8BxB;;;;;;;;OAQG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuBvE;;;;;;;;;;;OAWG;IACG,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;IA2BF;;;;;OAKG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqB5D;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;QACtD,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CAoBH;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,qBAAqB,GAChC,0BAA0B,CAE5B"}
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ /**
3
+ * Cascading Revocation Manager
4
+ *
5
+ * Implements cascading revocation per Python POC design.
6
+ * When a parent delegation is revoked, all children are automatically revoked.
7
+ *
8
+ * SOLID Principles:
9
+ * - Single Responsibility: Only handles cascading revocation logic
10
+ * - Open/Closed: Extensible via hooks/callbacks
11
+ * - Liskov Substitution: Works with any graph/statuslist implementations
12
+ * - Interface Segregation: Minimal interface
13
+ * - Dependency Inversion: Depends on abstractions (graph, statuslist)
14
+ *
15
+ * Related Spec: MCP-I §4.4, Delegation Chains
16
+ * Python Reference: Delegation-Revocation.md:45-67
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.CascadingRevocationManager = void 0;
20
+ exports.createCascadingRevocationManager = createCascadingRevocationManager;
21
+ /**
22
+ * Cascading Revocation Manager
23
+ *
24
+ * Coordinates revocation across the delegation graph.
25
+ * Per Delegation-Revocation.md:45-67:
26
+ * - When parent revoked → all descendants revoked
27
+ * - Uses StatusList2021 for efficient updates
28
+ * - Maintains audit trail
29
+ */
30
+ class CascadingRevocationManager {
31
+ graph;
32
+ statusList;
33
+ constructor(graph, statusList) {
34
+ this.graph = graph;
35
+ this.statusList = statusList;
36
+ }
37
+ /**
38
+ * Revoke a delegation and all its descendants
39
+ *
40
+ * Per Delegation-Revocation.md:56-67:
41
+ * 1. Revoke the target delegation
42
+ * 2. Find all descendants
43
+ * 3. Revoke each descendant
44
+ * 4. Trigger hooks for auditing
45
+ *
46
+ * @param delegationId - The delegation ID to revoke
47
+ * @param options - Revocation options
48
+ * @returns Array of revoked delegation IDs
49
+ */
50
+ async revokeDelegation(delegationId, options = {}) {
51
+ const maxDepth = options.maxDepth || 100; // Safety limit
52
+ const events = [];
53
+ // Get the target delegation
54
+ const targetNode = await this.graph.getNode(delegationId);
55
+ if (!targetNode) {
56
+ throw new Error(`Delegation not found: ${delegationId}`);
57
+ }
58
+ // Check depth to prevent infinite loops
59
+ const depth = await this.graph.getDepth(delegationId);
60
+ if (depth > maxDepth) {
61
+ throw new Error(`Delegation depth ${depth} exceeds maximum ${maxDepth}`);
62
+ }
63
+ // Revoke the target delegation
64
+ const rootEvent = await this.revokeNode(targetNode, true, options.reason, options.dryRun);
65
+ events.push(rootEvent);
66
+ if (options.onRevoke) {
67
+ await options.onRevoke(rootEvent);
68
+ }
69
+ // Get all descendants
70
+ const descendants = await this.graph.getDescendants(delegationId);
71
+ // Revoke each descendant
72
+ for (const descendant of descendants) {
73
+ const event = await this.revokeNode(descendant, false, `Cascaded from ${delegationId}`, options.dryRun, delegationId);
74
+ events.push(event);
75
+ if (options.onRevoke) {
76
+ await options.onRevoke(event);
77
+ }
78
+ }
79
+ return events;
80
+ }
81
+ /**
82
+ * Revoke a single node
83
+ *
84
+ * @param node - The delegation node
85
+ * @param isRoot - Whether this is the root of the cascade
86
+ * @param reason - Reason for revocation
87
+ * @param dryRun - If true, don't actually revoke
88
+ * @param parentId - Parent ID if cascaded
89
+ * @returns Revocation event
90
+ */
91
+ async revokeNode(node, isRoot, reason, dryRun, parentId) {
92
+ const event = {
93
+ delegationId: node.id,
94
+ isRoot,
95
+ parentId,
96
+ timestamp: Date.now(),
97
+ reason,
98
+ };
99
+ if (dryRun) {
100
+ return event;
101
+ }
102
+ // Parse the credential status from the node
103
+ if (node.credentialStatusId) {
104
+ const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
105
+ if (credentialStatus) {
106
+ await this.statusList.updateStatus(credentialStatus, true);
107
+ }
108
+ }
109
+ return event;
110
+ }
111
+ /**
112
+ * Restore (un-revoke) a delegation
113
+ *
114
+ * Note: This does NOT cascade to children.
115
+ * Only the specific delegation is restored.
116
+ *
117
+ * @param delegationId - The delegation ID to restore
118
+ * @returns Revocation event
119
+ */
120
+ async restoreDelegation(delegationId) {
121
+ const node = await this.graph.getNode(delegationId);
122
+ if (!node) {
123
+ throw new Error(`Delegation not found: ${delegationId}`);
124
+ }
125
+ const event = {
126
+ delegationId: node.id,
127
+ isRoot: true,
128
+ timestamp: Date.now(),
129
+ reason: 'Restored',
130
+ };
131
+ if (node.credentialStatusId) {
132
+ const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
133
+ if (credentialStatus) {
134
+ await this.statusList.updateStatus(credentialStatus, false);
135
+ }
136
+ }
137
+ return event;
138
+ }
139
+ /**
140
+ * Check if a delegation is revoked
141
+ *
142
+ * Checks both:
143
+ * 1. The delegation itself
144
+ * 2. Any of its ancestors (cascading check)
145
+ *
146
+ * Per Delegation-Revocation.md:56: If any ancestor is revoked, this is revoked.
147
+ *
148
+ * @param delegationId - The delegation ID
149
+ * @returns true if revoked (directly or via cascade)
150
+ */
151
+ async isRevoked(delegationId) {
152
+ // Get the chain from root to this delegation
153
+ const chain = await this.graph.getChain(delegationId);
154
+ // Check each node in the chain (bottom-up, most specific first)
155
+ for (const node of chain.reverse()) {
156
+ if (node.credentialStatusId) {
157
+ const credentialStatus = this.parseCredentialStatus(node.credentialStatusId);
158
+ if (credentialStatus) {
159
+ const isRevoked = await this.statusList.checkStatus(credentialStatus);
160
+ if (isRevoked) {
161
+ return {
162
+ revoked: true,
163
+ reason: node.id === delegationId
164
+ ? 'Directly revoked'
165
+ : 'Ancestor revoked',
166
+ revokedAncestor: node.id === delegationId ? undefined : node.id,
167
+ };
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return { revoked: false };
173
+ }
174
+ /**
175
+ * Get all revoked delegations in a subtree
176
+ *
177
+ * @param rootId - The root delegation ID
178
+ * @returns Array of revoked delegation IDs
179
+ */
180
+ async getRevokedInSubtree(rootId) {
181
+ const descendants = await this.graph.getDescendants(rootId);
182
+ const revoked = [];
183
+ // Check root
184
+ const rootRevoked = await this.isRevoked(rootId);
185
+ if (rootRevoked.revoked) {
186
+ revoked.push(rootId);
187
+ }
188
+ // Check each descendant
189
+ for (const node of descendants) {
190
+ const isRevoked = await this.isRevoked(node.id);
191
+ if (isRevoked.revoked) {
192
+ revoked.push(node.id);
193
+ }
194
+ }
195
+ return revoked;
196
+ }
197
+ /**
198
+ * Parse credential status from stored ID
199
+ *
200
+ * The credentialStatusId is stored as a composite:
201
+ * "statusListUrl#index"
202
+ *
203
+ * @param credentialStatusId - The stored credential status ID
204
+ * @returns Parsed CredentialStatus, or null if invalid
205
+ */
206
+ parseCredentialStatus(credentialStatusId) {
207
+ const match = credentialStatusId.match(/^(.+)#(\d+)$/);
208
+ if (!match)
209
+ return null;
210
+ const [, statusListCredential, indexStr] = match;
211
+ const index = parseInt(indexStr, 10);
212
+ return {
213
+ id: credentialStatusId,
214
+ type: 'StatusList2021Entry',
215
+ statusPurpose: 'revocation', // Assume revocation (could be enhanced)
216
+ statusListIndex: index.toString(),
217
+ statusListCredential,
218
+ };
219
+ }
220
+ /**
221
+ * Validate that a delegation can be used
222
+ *
223
+ * Checks:
224
+ * 1. The delegation itself is not revoked
225
+ * 2. No ancestors are revoked
226
+ * 3. The chain is valid
227
+ *
228
+ * @param delegationId - The delegation ID
229
+ * @returns Validation result
230
+ */
231
+ async validateDelegation(delegationId) {
232
+ // Check if revoked
233
+ const revokedCheck = await this.isRevoked(delegationId);
234
+ if (revokedCheck.revoked) {
235
+ return {
236
+ valid: false,
237
+ reason: revokedCheck.revokedAncestor
238
+ ? `Ancestor ${revokedCheck.revokedAncestor} is revoked`
239
+ : 'Delegation is revoked',
240
+ };
241
+ }
242
+ // Validate chain structure
243
+ const chainValidation = await this.graph.validateChain(delegationId);
244
+ if (!chainValidation.valid) {
245
+ return chainValidation;
246
+ }
247
+ return { valid: true };
248
+ }
249
+ }
250
+ exports.CascadingRevocationManager = CascadingRevocationManager;
251
+ /**
252
+ * Create a cascading revocation manager
253
+ *
254
+ * Convenience factory function.
255
+ *
256
+ * @param graph - Delegation graph manager
257
+ * @param statusList - StatusList2021 manager
258
+ * @returns CascadingRevocationManager instance
259
+ */
260
+ function createCascadingRevocationManager(graph, statusList) {
261
+ return new CascadingRevocationManager(graph, statusList);
262
+ }
263
+ //# sourceMappingURL=cascading-revocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascading-revocation.js","sourceRoot":"","sources":["../../src/delegation/cascading-revocation.ts"],"names":[],"mappings":"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"}