@kya-os/mcp-i 1.6.2-canary.0 → 1.6.2-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.
@@ -111,6 +111,18 @@ export declare class IdentityManager {
111
111
  * Default identity manager instance
112
112
  */
113
113
  export declare const defaultIdentityManager: IdentityManager;
114
+ /**
115
+ * Extract agent ID from DID
116
+ * @deprecated Use extractAgentId from @kya-os/mcp-i-core/utils/did-helpers instead
117
+ * This re-export is maintained for backward compatibility
118
+ */
119
+ export { extractAgentId } from '@kya-os/mcp-i-core/utils/did-helpers';
120
+ /**
121
+ * Extract agent slug from DID
122
+ * @deprecated Use extractAgentSlug from @kya-os/mcp-i-core/utils/did-helpers instead
123
+ * This re-export is maintained for backward compatibility
124
+ */
125
+ export { extractAgentSlug } from '@kya-os/mcp-i-core/utils/did-helpers';
114
126
  /**
115
127
  * Convenience function to ensure identity
116
128
  */
@@ -6,7 +6,7 @@
6
6
  * and production environments according to requirements 4.1-4.4.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.defaultIdentityManager = exports.IdentityManager = exports.IDENTITY_ERRORS = void 0;
9
+ exports.extractAgentSlug = exports.extractAgentId = exports.defaultIdentityManager = exports.IdentityManager = exports.IDENTITY_ERRORS = void 0;
10
10
  exports.ensureIdentity = ensureIdentity;
11
11
  const promises_1 = require("fs/promises");
12
12
  const fs_1 = require("fs");
@@ -291,6 +291,20 @@ exports.IdentityManager = IdentityManager;
291
291
  * Default identity manager instance
292
292
  */
293
293
  exports.defaultIdentityManager = new IdentityManager();
294
+ /**
295
+ * Extract agent ID from DID
296
+ * @deprecated Use extractAgentId from @kya-os/mcp-i-core/utils/did-helpers instead
297
+ * This re-export is maintained for backward compatibility
298
+ */
299
+ var did_helpers_1 = require("@kya-os/mcp-i-core/utils/did-helpers");
300
+ Object.defineProperty(exports, "extractAgentId", { enumerable: true, get: function () { return did_helpers_1.extractAgentId; } });
301
+ /**
302
+ * Extract agent slug from DID
303
+ * @deprecated Use extractAgentSlug from @kya-os/mcp-i-core/utils/did-helpers instead
304
+ * This re-export is maintained for backward compatibility
305
+ */
306
+ var did_helpers_2 = require("@kya-os/mcp-i-core/utils/did-helpers");
307
+ Object.defineProperty(exports, "extractAgentSlug", { enumerable: true, get: function () { return did_helpers_2.extractAgentSlug; } });
294
308
  /**
295
309
  * Convenience function to ensure identity
296
310
  */
@@ -4,14 +4,13 @@
4
4
  * Node.js-specific runtime that extends the core runtime with Node.js providers.
5
5
  * Provides backward compatibility by accepting legacy configuration format.
6
6
  */
7
- import { MCPIRuntimeBase, AccessControlApiService, ProofVerifier } from '@kya-os/mcp-i-core';
8
- import type { MCPIRuntimeConfig } from './mcpi-runtime';
7
+ import { MCPIRuntimeBase, AccessControlApiService, ProofVerifier } from "@kya-os/mcp-i-core";
8
+ import type { MCPIRuntimeConfig } from "./mcpi-runtime";
9
9
  /**
10
10
  * Node.js-specific runtime implementation
11
11
  */
12
12
  export declare class MCPINodeRuntimeWrapper extends MCPIRuntimeBase {
13
13
  private legacyConfig;
14
- protected accessControlService?: AccessControlApiService;
15
14
  constructor(config?: MCPIRuntimeConfig);
16
15
  /**
17
16
  * Set AccessControlApiService (for testing or manual injection)
@@ -21,8 +21,7 @@ function createProvidersFromConfig(config) {
21
21
  const cryptoProvider = new node_providers_1.NodeCryptoProvider();
22
22
  const clockProvider = new node_providers_1.NodeClockProvider();
23
23
  const fetchProvider = new node_providers_1.NodeFetchProvider();
24
- const identityPath = config.identity?.devIdentityPath ||
25
- path_1.default.join(process.cwd(), '.mcp-i');
24
+ const identityPath = config.identity?.devIdentityPath || path_1.default.join(process.cwd(), ".mcp-i");
26
25
  const storageProvider = new node_providers_1.FileStorageProvider(identityPath);
27
26
  const identityProvider = new node_providers_1.FileIdentityProvider(identityPath, cryptoProvider);
28
27
  const nonceCacheProvider = (0, node_providers_1.getNonceCacheProvider)();
@@ -33,21 +32,25 @@ function createProvidersFromConfig(config) {
33
32
  storageProvider,
34
33
  nonceCacheProvider,
35
34
  identityProvider,
36
- environment: config.identity?.environment || 'development',
35
+ environment: config.identity?.environment || "development",
37
36
  session: {
38
37
  timestampSkewSeconds: config.session?.timestampSkewSeconds || 120,
39
- ttlMinutes: config.session?.sessionTtlMinutes || 30
38
+ ttlMinutes: config.session?.sessionTtlMinutes || 30,
40
39
  },
41
- audit: config.audit ? {
42
- enabled: config.audit.enabled !== false,
43
- logFunction: config.audit.logFunction,
44
- includePayloads: config.audit.includePayloads,
45
- includeProofHashes: config.audit.includeProofHashes
46
- } : undefined,
47
- wellKnown: config.wellKnown ? {
48
- enabled: true,
49
- serviceName: config.wellKnown.agentMetadata?.name
50
- } : undefined
40
+ audit: config.audit
41
+ ? {
42
+ enabled: config.audit.enabled !== false,
43
+ logFunction: config.audit.logFunction,
44
+ includePayloads: config.audit.includePayloads,
45
+ includeProofHashes: config.audit.includeProofHashes,
46
+ }
47
+ : undefined,
48
+ wellKnown: config.wellKnown
49
+ ? {
50
+ enabled: true,
51
+ serviceName: config.wellKnown.agentMetadata?.name,
52
+ }
53
+ : undefined,
51
54
  };
52
55
  }
53
56
  /**
@@ -55,7 +58,7 @@ function createProvidersFromConfig(config) {
55
58
  */
56
59
  class MCPINodeRuntimeWrapper extends mcp_i_core_1.MCPIRuntimeBase {
57
60
  legacyConfig;
58
- accessControlService; // Access control API service
61
+ // accessControlService is inherited from MCPIRuntimeBase (protected), no need to redeclare
59
62
  // proofVerifier is inherited from MCPIRuntimeBase (protected), no need to redeclare
60
63
  constructor(config = {}) {
61
64
  const coreConfig = createProvidersFromConfig(config);
@@ -72,14 +75,14 @@ class MCPINodeRuntimeWrapper extends mcp_i_core_1.MCPIRuntimeBase {
72
75
  });
73
76
  // Instantiate AccessControlApiService if API key is available
74
77
  const apiKey = process.env.AGENTSHIELD_API_KEY;
75
- const apiUrl = process.env.AGENTSHIELD_API_URL || 'https://kya.vouched.id';
78
+ const apiUrl = process.env.AGENTSHIELD_API_URL || "https://kya.vouched.id";
76
79
  if (apiKey) {
77
80
  this.accessControlService = new mcp_i_core_1.AccessControlApiService({
78
81
  baseUrl: apiUrl,
79
82
  apiKey,
80
83
  fetchProvider: coreConfig.fetchProvider,
81
84
  logger: (msg, data) => {
82
- if (coreConfig.environment === 'development') {
85
+ if (coreConfig.environment === "development") {
83
86
  console.log(`[AccessControl] ${msg}`, data);
84
87
  }
85
88
  },
@@ -208,7 +208,13 @@ class MCPIRuntime {
208
208
  data = this.demoManager.addIdentityBadgeToResponse(data);
209
209
  }
210
210
  // Create response with proof
211
- const response = await (0, proof_1.createProofResponse)(request, data, this.cachedIdentity, session, options);
211
+ const proofOptions = {
212
+ ...options,
213
+ ...(session && session.clientDid
214
+ ? { clientDid: session.clientDid }
215
+ : {}),
216
+ };
217
+ const response = await (0, proof_1.createProofResponse)(request, data, this.cachedIdentity, session, proofOptions);
212
218
  // Update debug state with latest proof
213
219
  if (this.debugManager && response.meta?.proof) {
214
220
  this.debugManager.updateDebugState(response.meta.proof, session);
@@ -52,6 +52,19 @@ export declare class SessionManager {
52
52
  * Generate a unique session ID
53
53
  */
54
54
  private generateSessionId;
55
+ /**
56
+ * Generate a deterministic client identifier when the client
57
+ * does not provide one during the handshake.
58
+ */
59
+ private generateClientId;
60
+ /**
61
+ * Normalize string fields from handshake metadata
62
+ */
63
+ private normalizeClientInfoString;
64
+ /**
65
+ * Build MCP client metadata for the session when provided during handshake
66
+ */
67
+ private buildClientInfo;
55
68
  /**
56
69
  * Generate a cryptographically secure nonce
57
70
  */
@@ -76,6 +76,7 @@ class SessionManager {
76
76
  await this.config.nonceCache.add(request.nonce, nonceTtlSeconds, request.agentDid);
77
77
  // Generate session ID
78
78
  const sessionId = this.generateSessionId();
79
+ const clientInfo = this.buildClientInfo(request);
79
80
  // Create session context
80
81
  const session = {
81
82
  sessionId,
@@ -87,6 +88,7 @@ class SessionManager {
87
88
  ttlMinutes: this.config.sessionTtlMinutes,
88
89
  agentDid: request.agentDid, // Pass through agent DID for delegation verification
89
90
  ...(this.config.serverDid && { serverDid: this.config.serverDid }), // Include server DID if provided
91
+ ...(clientInfo && { clientInfo }),
90
92
  };
91
93
  // Store session
92
94
  this.sessions.set(sessionId, session);
@@ -143,6 +145,47 @@ class SessionManager {
143
145
  const random = (0, crypto_1.randomBytes)(8).toString("hex");
144
146
  return `sess_${timestamp}_${random}`;
145
147
  }
148
+ /**
149
+ * Generate a deterministic client identifier when the client
150
+ * does not provide one during the handshake.
151
+ */
152
+ generateClientId() {
153
+ return `client_${(0, crypto_1.randomBytes)(6).toString("hex")}`;
154
+ }
155
+ /**
156
+ * Normalize string fields from handshake metadata
157
+ */
158
+ normalizeClientInfoString(value) {
159
+ if (typeof value !== "string") {
160
+ return undefined;
161
+ }
162
+ const trimmed = value.trim();
163
+ return trimmed.length > 0 ? trimmed : undefined;
164
+ }
165
+ /**
166
+ * Build MCP client metadata for the session when provided during handshake
167
+ */
168
+ buildClientInfo(request) {
169
+ const hasMetadata = !!request.clientInfo ||
170
+ typeof request.clientProtocolVersion === "string" ||
171
+ request.clientCapabilities !== undefined;
172
+ if (!hasMetadata) {
173
+ return undefined;
174
+ }
175
+ const source = request.clientInfo;
176
+ return {
177
+ name: this.normalizeClientInfoString(source?.name) ?? "unknown",
178
+ title: this.normalizeClientInfoString(source?.title),
179
+ version: this.normalizeClientInfoString(source?.version),
180
+ platform: this.normalizeClientInfoString(source?.platform),
181
+ vendor: this.normalizeClientInfoString(source?.vendor),
182
+ persistentId: this.normalizeClientInfoString(source?.persistentId),
183
+ clientId: this.normalizeClientInfoString(source?.clientId) ??
184
+ this.generateClientId(),
185
+ protocolVersion: this.normalizeClientInfoString(request.clientProtocolVersion),
186
+ capabilities: request.clientCapabilities,
187
+ };
188
+ }
146
189
  /**
147
190
  * Generate a cryptographically secure nonce
148
191
  */