@kya-os/mcp-i-core 1.3.10-canary.clientinfo.20251126124133 → 1.3.11

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 (90) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.turbo/turbo-build.log +1 -1
  3. package/.turbo/turbo-test$colon$coverage.log +3419 -3072
  4. package/.turbo/turbo-test.log +1805 -1680
  5. package/coverage/coverage-final.json +59 -56
  6. package/dist/config/remote-config.d.ts +51 -0
  7. package/dist/config/remote-config.d.ts.map +1 -1
  8. package/dist/config/remote-config.js +74 -0
  9. package/dist/config/remote-config.js.map +1 -1
  10. package/dist/config.d.ts +1 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +4 -1
  13. package/dist/config.js.map +1 -1
  14. package/dist/delegation/did-key-resolver.d.ts +64 -0
  15. package/dist/delegation/did-key-resolver.d.ts.map +1 -0
  16. package/dist/delegation/did-key-resolver.js +159 -0
  17. package/dist/delegation/did-key-resolver.js.map +1 -0
  18. package/dist/delegation/utils.d.ts +76 -0
  19. package/dist/delegation/utils.d.ts.map +1 -1
  20. package/dist/delegation/utils.js +117 -0
  21. package/dist/delegation/utils.js.map +1 -1
  22. package/dist/identity/idp-token-resolver.d.ts +17 -1
  23. package/dist/identity/idp-token-resolver.d.ts.map +1 -1
  24. package/dist/identity/idp-token-resolver.js +34 -6
  25. package/dist/identity/idp-token-resolver.js.map +1 -1
  26. package/dist/identity/idp-token-storage.interface.d.ts +38 -7
  27. package/dist/identity/idp-token-storage.interface.d.ts.map +1 -1
  28. package/dist/identity/idp-token-storage.interface.js +2 -0
  29. package/dist/identity/idp-token-storage.interface.js.map +1 -1
  30. package/dist/identity/user-did-manager.d.ts +95 -12
  31. package/dist/identity/user-did-manager.d.ts.map +1 -1
  32. package/dist/identity/user-did-manager.js +107 -25
  33. package/dist/identity/user-did-manager.js.map +1 -1
  34. package/dist/index.d.ts +6 -3
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +24 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/runtime/base.d.ts +25 -8
  39. package/dist/runtime/base.d.ts.map +1 -1
  40. package/dist/runtime/base.js +74 -21
  41. package/dist/runtime/base.js.map +1 -1
  42. package/dist/services/session-registration.service.d.ts.map +1 -1
  43. package/dist/services/session-registration.service.js +10 -90
  44. package/dist/services/session-registration.service.js.map +1 -1
  45. package/dist/services/tool-context-builder.d.ts +18 -1
  46. package/dist/services/tool-context-builder.d.ts.map +1 -1
  47. package/dist/services/tool-context-builder.js +63 -10
  48. package/dist/services/tool-context-builder.js.map +1 -1
  49. package/dist/services/tool-protection.service.d.ts +6 -3
  50. package/dist/services/tool-protection.service.d.ts.map +1 -1
  51. package/dist/services/tool-protection.service.js +89 -34
  52. package/dist/services/tool-protection.service.js.map +1 -1
  53. package/dist/utils/base58.d.ts +31 -0
  54. package/dist/utils/base58.d.ts.map +1 -0
  55. package/dist/utils/base58.js +103 -0
  56. package/dist/utils/base58.js.map +1 -0
  57. package/dist/utils/did-helpers.d.ts +33 -0
  58. package/dist/utils/did-helpers.d.ts.map +1 -1
  59. package/dist/utils/did-helpers.js +53 -0
  60. package/dist/utils/did-helpers.js.map +1 -1
  61. package/package.json +3 -3
  62. package/src/__tests__/identity/user-did-manager.test.ts +64 -45
  63. package/src/__tests__/integration/full-flow.test.ts +23 -10
  64. package/src/__tests__/runtime/base-extensions.test.ts +23 -21
  65. package/src/__tests__/runtime/proof-client-did.test.ts +19 -18
  66. package/src/__tests__/services/agentshield-integration.test.ts +10 -3
  67. package/src/__tests__/services/tool-protection-merged-config.test.ts +485 -0
  68. package/src/__tests__/services/tool-protection.service.test.ts +18 -11
  69. package/src/config/__tests__/merged-config.spec.ts +445 -0
  70. package/src/config/remote-config.ts +90 -0
  71. package/src/config.ts +3 -0
  72. package/src/delegation/__tests__/did-key-resolver.test.ts +265 -0
  73. package/src/delegation/__tests__/vc-issuer.test.ts +1 -1
  74. package/src/delegation/did-key-resolver.ts +179 -0
  75. package/src/delegation/utils.ts +179 -0
  76. package/src/identity/idp-token-resolver.ts +41 -7
  77. package/src/identity/idp-token-storage.interface.ts +42 -7
  78. package/src/identity/user-did-manager.ts +185 -29
  79. package/src/index.ts +42 -3
  80. package/src/runtime/base.ts +84 -21
  81. package/src/services/session-registration.service.ts +26 -121
  82. package/src/services/tool-context-builder.ts +75 -10
  83. package/src/services/tool-protection.service.ts +176 -88
  84. package/src/utils/__tests__/did-helpers.test.ts +55 -0
  85. package/src/utils/base58.ts +109 -0
  86. package/src/utils/did-helpers.ts +60 -0
  87. package/dist/__tests__/utils/mock-providers.d.ts +0 -103
  88. package/dist/__tests__/utils/mock-providers.d.ts.map +0 -1
  89. package/dist/__tests__/utils/mock-providers.js +0 -293
  90. package/dist/__tests__/utils/mock-providers.js.map +0 -1
@@ -7,6 +7,8 @@
7
7
  * @package @kya-os/mcp-i-core/utils
8
8
  */
9
9
 
10
+ import { base58Encode } from "./base58";
11
+
10
12
  /**
11
13
  * Check if a string is a valid DID format
12
14
  *
@@ -148,3 +150,61 @@ export function extractAgentSlug(did: string): string {
148
150
  return extractAgentId(did);
149
151
  }
150
152
 
153
+ /**
154
+ * Ed25519 multicodec prefix for did:key encoding
155
+ * As per https://w3c-ccg.github.io/did-method-key/
156
+ */
157
+ const ED25519_MULTICODEC_PREFIX = new Uint8Array([0xed, 0x01]);
158
+
159
+ /**
160
+ * Generate a did:key from Ed25519 public key bytes
161
+ *
162
+ * Following spec: https://w3c-ccg.github.io/did-method-key/
163
+ * Format: did:key:z<multibase-base58btc(<multicodec-ed25519-pub><publicKey>)>
164
+ *
165
+ * @param publicKeyBytes - Ed25519 public key as Uint8Array (32 bytes)
166
+ * @returns did:key string
167
+ *
168
+ * @example
169
+ * ```typescript
170
+ * const publicKey = new Uint8Array(32); // 32-byte Ed25519 public key
171
+ * const did = generateDidKeyFromBytes(publicKey);
172
+ * // did = "did:key:z6Mk..."
173
+ * ```
174
+ */
175
+ export function generateDidKeyFromBytes(publicKeyBytes: Uint8Array): string {
176
+ // Combine multicodec prefix + public key
177
+ const multicodecKey = new Uint8Array(
178
+ ED25519_MULTICODEC_PREFIX.length + publicKeyBytes.length
179
+ );
180
+ multicodecKey.set(ED25519_MULTICODEC_PREFIX);
181
+ multicodecKey.set(publicKeyBytes, ED25519_MULTICODEC_PREFIX.length);
182
+
183
+ // Base58-btc encode and add multibase prefix 'z'
184
+ const base58Encoded = base58Encode(multicodecKey);
185
+ return `did:key:z${base58Encoded}`;
186
+ }
187
+
188
+ /**
189
+ * Generate a did:key from base64-encoded Ed25519 public key
190
+ *
191
+ * Convenience wrapper around generateDidKeyFromBytes for base64-encoded keys.
192
+ *
193
+ * @param publicKeyBase64 - Ed25519 public key as base64 string
194
+ * @returns did:key string
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * const publicKeyBase64 = "...base64 encoded key...";
199
+ * const did = generateDidKeyFromBase64(publicKeyBase64);
200
+ * // did = "did:key:z6Mk..."
201
+ * ```
202
+ */
203
+ export function generateDidKeyFromBase64(publicKeyBase64: string): string {
204
+ // Decode base64 to bytes
205
+ const publicKeyBytes = Uint8Array.from(atob(publicKeyBase64), (c) =>
206
+ c.charCodeAt(0)
207
+ );
208
+ return generateDidKeyFromBytes(publicKeyBytes);
209
+ }
210
+
@@ -1,103 +0,0 @@
1
- /**
2
- * Mock Providers for Testing
3
- *
4
- * These mock implementations allow controlled testing of the runtime
5
- * and other components that depend on providers.
6
- */
7
- import { CryptoProvider, ClockProvider, FetchProvider, StorageProvider, NonceCacheProvider, IdentityProvider, AgentIdentity } from '../../providers/base';
8
- /**
9
- * Mock Crypto Provider
10
- */
11
- export declare class MockCryptoProvider extends CryptoProvider {
12
- sign(data: Uint8Array, privateKey: string): Promise<Uint8Array>;
13
- verify(data: Uint8Array, signature: Uint8Array, publicKey: string): Promise<boolean>;
14
- generateKeyPair(): Promise<{
15
- privateKey: string;
16
- publicKey: string;
17
- }>;
18
- hash(data: Uint8Array): Promise<Uint8Array>;
19
- randomBytes(length: number): Promise<Uint8Array>;
20
- }
21
- /**
22
- * Mock Clock Provider
23
- */
24
- export declare class MockClockProvider extends ClockProvider {
25
- private currentTime;
26
- setTime(timestamp: number): void;
27
- now(): number;
28
- isWithinSkew(timestamp: number, skewSeconds: number): boolean;
29
- hasExpired(expiresAt: number): boolean;
30
- calculateExpiry(ttlSeconds: number): number;
31
- format(timestamp: number): string;
32
- }
33
- /**
34
- * Mock Fetch Provider
35
- */
36
- export declare class MockFetchProvider extends FetchProvider {
37
- private didDocuments;
38
- private statusLists;
39
- private delegationChains;
40
- fetch: (url: string, options?: any) => Promise<Response>;
41
- constructor();
42
- setDIDDocument(did: string, doc: any): void;
43
- setStatusList(url: string, list: any): void;
44
- setDelegationChain(id: string, chain: any[]): void;
45
- resolveDID(did: string): Promise<any>;
46
- fetchStatusList(url: string): Promise<any>;
47
- fetchDelegationChain(id: string): Promise<any[]>;
48
- }
49
- /**
50
- * Mock Storage Provider
51
- */
52
- export declare class MockStorageProvider extends StorageProvider {
53
- private store;
54
- get(key: string): Promise<string | null>;
55
- set(key: string, value: string): Promise<void>;
56
- delete(key: string): Promise<void>;
57
- exists(key: string): Promise<boolean>;
58
- list(prefix?: string): Promise<string[]>;
59
- clear(): void;
60
- }
61
- /**
62
- * Mock Nonce Cache Provider
63
- */
64
- export declare class MockNonceCacheProvider extends NonceCacheProvider {
65
- private nonces;
66
- cleanupCalled: boolean;
67
- destroyCalled: boolean;
68
- private clock?;
69
- setClock(clock: ClockProvider): void;
70
- has(nonce: string, agentDid?: string): Promise<boolean>;
71
- add(nonce: string, ttlSeconds: number, agentDid?: string): Promise<void>;
72
- cleanup(): Promise<void>;
73
- destroy(): Promise<void>;
74
- clear(): void;
75
- size(): number;
76
- }
77
- /**
78
- * Mock Identity Provider
79
- */
80
- export declare class MockIdentityProvider extends IdentityProvider {
81
- private identity?;
82
- rotateKeysCalled: boolean;
83
- deleteIdentityCalled: boolean;
84
- private rotateCount;
85
- constructor(identity?: AgentIdentity);
86
- getIdentity(): Promise<AgentIdentity>;
87
- saveIdentity(identity: AgentIdentity): Promise<void>;
88
- rotateKeys(): Promise<AgentIdentity>;
89
- deleteIdentity(): Promise<void>;
90
- setIdentity(identity: AgentIdentity): void;
91
- }
92
- /**
93
- * Create a full set of mock providers for testing
94
- */
95
- export declare function createMockProviders(): {
96
- cryptoProvider: MockCryptoProvider;
97
- clockProvider: MockClockProvider;
98
- fetchProvider: MockFetchProvider;
99
- storageProvider: MockStorageProvider;
100
- nonceCacheProvider: MockNonceCacheProvider;
101
- identityProvider: MockIdentityProvider;
102
- };
103
- //# sourceMappingURL=mock-providers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-providers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/mock-providers.ts"],"names":[],"mappings":"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"}
@@ -1,293 +0,0 @@
1
- "use strict";
2
- /**
3
- * Mock Providers for Testing
4
- *
5
- * These mock implementations allow controlled testing of the runtime
6
- * and other components that depend on providers.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.MockIdentityProvider = exports.MockNonceCacheProvider = exports.MockStorageProvider = exports.MockFetchProvider = exports.MockClockProvider = exports.MockCryptoProvider = void 0;
10
- exports.createMockProviders = createMockProviders;
11
- const vitest_1 = require("vitest");
12
- const base_1 = require("../../providers/base");
13
- /**
14
- * Mock Crypto Provider
15
- */
16
- class MockCryptoProvider extends base_1.CryptoProvider {
17
- async sign(data, privateKey) {
18
- // Simple mock signature
19
- return new Uint8Array([1, 2, 3, 4, 5]);
20
- }
21
- async verify(data, signature, publicKey) {
22
- // Simple verification - check signature matches expected pattern
23
- // In real implementation, this would verify cryptographic signature
24
- return signature.length === 5 && signature[0] === 1 && signature[1] === 2;
25
- }
26
- async generateKeyPair() {
27
- // Generate valid base64-encoded keys for testing
28
- // Ed25519 keys are 32 bytes, so we generate 32 random bytes and encode them
29
- const randomBytes = new Uint8Array(32);
30
- for (let i = 0; i < 32; i++) {
31
- randomBytes[i] = Math.floor(Math.random() * 256);
32
- }
33
- // Convert to base64 using Node.js Buffer (works in Node.js test environment)
34
- const base64PrivateKey = Buffer.from(randomBytes).toString('base64');
35
- // Generate a different public key (Ed25519 public key is also 32 bytes)
36
- const publicBytes = new Uint8Array(32);
37
- for (let i = 0; i < 32; i++) {
38
- publicBytes[i] = Math.floor(Math.random() * 256);
39
- }
40
- const base64PublicKey = Buffer.from(publicBytes).toString('base64');
41
- return {
42
- privateKey: base64PrivateKey,
43
- publicKey: base64PublicKey
44
- };
45
- }
46
- async hash(data) {
47
- // Simple mock hash
48
- return new Uint8Array([9, 8, 7, 6, 5]);
49
- }
50
- async randomBytes(length) {
51
- const bytes = new Uint8Array(length);
52
- for (let i = 0; i < length; i++) {
53
- bytes[i] = Math.floor(Math.random() * 256);
54
- }
55
- return bytes;
56
- }
57
- }
58
- exports.MockCryptoProvider = MockCryptoProvider;
59
- /**
60
- * Mock Clock Provider
61
- */
62
- class MockClockProvider extends base_1.ClockProvider {
63
- currentTime = Date.now();
64
- setTime(timestamp) {
65
- this.currentTime = timestamp;
66
- }
67
- now() {
68
- return this.currentTime;
69
- }
70
- isWithinSkew(timestamp, skewSeconds) {
71
- const diff = Math.abs(this.currentTime - timestamp);
72
- return diff <= skewSeconds * 1000;
73
- }
74
- hasExpired(expiresAt) {
75
- return this.currentTime > expiresAt;
76
- }
77
- calculateExpiry(ttlSeconds) {
78
- return this.currentTime + (ttlSeconds * 1000);
79
- }
80
- format(timestamp) {
81
- return new Date(timestamp).toISOString();
82
- }
83
- }
84
- exports.MockClockProvider = MockClockProvider;
85
- /**
86
- * Mock Fetch Provider
87
- */
88
- class MockFetchProvider extends base_1.FetchProvider {
89
- didDocuments = new Map();
90
- statusLists = new Map();
91
- delegationChains = new Map();
92
- fetch;
93
- constructor() {
94
- super();
95
- // Initialize fetch as a vi.fn() in constructor to ensure it's always mockable
96
- this.fetch = vitest_1.vi.fn(async (url, options) => {
97
- // Simple mock Response
98
- return new Response(JSON.stringify({ url, options }), {
99
- status: 200,
100
- headers: { 'Content-Type': 'application/json' }
101
- });
102
- });
103
- }
104
- // Test helpers
105
- setDIDDocument(did, doc) {
106
- this.didDocuments.set(did, doc);
107
- }
108
- setStatusList(url, list) {
109
- this.statusLists.set(url, list);
110
- }
111
- setDelegationChain(id, chain) {
112
- this.delegationChains.set(id, chain);
113
- }
114
- async resolveDID(did) {
115
- const doc = this.didDocuments.get(did);
116
- if (!doc) {
117
- throw new Error(`DID ${did} not found`);
118
- }
119
- return doc;
120
- }
121
- async fetchStatusList(url) {
122
- const list = this.statusLists.get(url);
123
- if (!list) {
124
- throw new Error(`Status list ${url} not found`);
125
- }
126
- return list;
127
- }
128
- async fetchDelegationChain(id) {
129
- const chain = this.delegationChains.get(id);
130
- if (!chain) {
131
- throw new Error(`Delegation chain ${id} not found`);
132
- }
133
- return chain;
134
- }
135
- }
136
- exports.MockFetchProvider = MockFetchProvider;
137
- /**
138
- * Mock Storage Provider
139
- */
140
- class MockStorageProvider extends base_1.StorageProvider {
141
- store = new Map();
142
- async get(key) {
143
- return this.store.get(key) || null;
144
- }
145
- async set(key, value) {
146
- this.store.set(key, value);
147
- }
148
- async delete(key) {
149
- this.store.delete(key);
150
- }
151
- async exists(key) {
152
- return this.store.has(key);
153
- }
154
- async list(prefix) {
155
- const keys = Array.from(this.store.keys());
156
- if (prefix) {
157
- return keys.filter(k => k.startsWith(prefix));
158
- }
159
- return keys;
160
- }
161
- // Test helper
162
- clear() {
163
- this.store.clear();
164
- }
165
- }
166
- exports.MockStorageProvider = MockStorageProvider;
167
- /**
168
- * Mock Nonce Cache Provider
169
- */
170
- class MockNonceCacheProvider extends base_1.NonceCacheProvider {
171
- nonces = new Map();
172
- cleanupCalled = false;
173
- destroyCalled = false;
174
- clock;
175
- setClock(clock) {
176
- this.clock = clock;
177
- }
178
- async has(nonce, agentDid) {
179
- const key = agentDid ? `nonce:${agentDid}:${nonce}` : `nonce:${nonce}`;
180
- const expiry = this.nonces.get(key);
181
- if (!expiry)
182
- return false;
183
- const now = this.clock ? this.clock.now() : Date.now();
184
- if (now > expiry) {
185
- this.nonces.delete(key);
186
- return false;
187
- }
188
- return true;
189
- }
190
- async add(nonce, ttlSeconds, agentDid) {
191
- const key = agentDid ? `nonce:${agentDid}:${nonce}` : `nonce:${nonce}`;
192
- // Convert TTL seconds to absolute expiration timestamp for storage
193
- const now = this.clock ? this.clock.now() : Date.now();
194
- const expiresAt = now + (ttlSeconds * 1000);
195
- this.nonces.set(key, expiresAt);
196
- }
197
- async cleanup() {
198
- this.cleanupCalled = true;
199
- const now = this.clock ? this.clock.now() : Date.now();
200
- for (const [nonce, expiry] of this.nonces) {
201
- if (now > expiry) {
202
- this.nonces.delete(nonce);
203
- }
204
- }
205
- }
206
- async destroy() {
207
- this.destroyCalled = true;
208
- this.nonces.clear();
209
- }
210
- // Test helper
211
- clear() {
212
- this.nonces.clear();
213
- }
214
- size() {
215
- return this.nonces.size;
216
- }
217
- }
218
- exports.MockNonceCacheProvider = MockNonceCacheProvider;
219
- /**
220
- * Mock Identity Provider
221
- */
222
- class MockIdentityProvider extends base_1.IdentityProvider {
223
- identity;
224
- rotateKeysCalled = false;
225
- deleteIdentityCalled = false;
226
- rotateCount = 0;
227
- constructor(identity) {
228
- super();
229
- this.identity = identity;
230
- }
231
- async getIdentity() {
232
- if (!this.identity) {
233
- this.identity = {
234
- did: 'did:key:zmock123',
235
- kid: 'did:key:zmock123#key-1',
236
- privateKey: 'mock-private-key',
237
- publicKey: 'mock-public-key',
238
- createdAt: new Date().toISOString(),
239
- type: 'development',
240
- metadata: { mock: true }
241
- };
242
- }
243
- return this.identity;
244
- }
245
- async saveIdentity(identity) {
246
- this.identity = identity;
247
- }
248
- async rotateKeys() {
249
- this.rotateKeysCalled = true;
250
- this.rotateCount++;
251
- this.identity = {
252
- did: `did:key:zmock456-${this.rotateCount}`,
253
- kid: `did:key:zmock456-${this.rotateCount}#key-1`,
254
- privateKey: `mock-private-key-rotated-${this.rotateCount}`,
255
- publicKey: `mock-public-key-rotated-${this.rotateCount}`,
256
- createdAt: new Date().toISOString(),
257
- type: 'development',
258
- metadata: { mock: true, rotated: true, rotateCount: this.rotateCount }
259
- };
260
- return this.identity;
261
- }
262
- async deleteIdentity() {
263
- this.deleteIdentityCalled = true;
264
- this.identity = undefined;
265
- }
266
- // Test helper
267
- setIdentity(identity) {
268
- this.identity = identity;
269
- }
270
- }
271
- exports.MockIdentityProvider = MockIdentityProvider;
272
- /**
273
- * Create a full set of mock providers for testing
274
- */
275
- function createMockProviders() {
276
- const cryptoProvider = new MockCryptoProvider();
277
- const clockProvider = new MockClockProvider();
278
- const fetchProvider = new MockFetchProvider();
279
- const storageProvider = new MockStorageProvider();
280
- const nonceCacheProvider = new MockNonceCacheProvider();
281
- const identityProvider = new MockIdentityProvider();
282
- // Connect nonce cache to clock for consistent time
283
- nonceCacheProvider.setClock(clockProvider);
284
- return {
285
- cryptoProvider,
286
- clockProvider,
287
- fetchProvider,
288
- storageProvider,
289
- nonceCacheProvider,
290
- identityProvider
291
- };
292
- }
293
- //# sourceMappingURL=mock-providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock-providers.js","sourceRoot":"","sources":["../../../src/__tests__/utils/mock-providers.ts"],"names":[],"mappings":"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"}