@kya-os/mcp-i-core 1.3.7-canary.0 → 1.3.7-canary.clientinfo.20251126041014

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 (236) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-test$colon$coverage.log +4239 -0
  3. package/.turbo/turbo-test.log +2973 -0
  4. package/COMPLIANCE_IMPROVEMENT_REPORT.md +483 -0
  5. package/Composer 3.md +615 -0
  6. package/GPT-5.md +1169 -0
  7. package/OPUS-plan.md +352 -0
  8. package/PHASE_3_AND_4.1_SUMMARY.md +585 -0
  9. package/PHASE_3_SUMMARY.md +317 -0
  10. package/PHASE_4.1.3_SUMMARY.md +428 -0
  11. package/PHASE_4.1_COMPLETE.md +525 -0
  12. package/PHASE_4_USER_DID_IDENTITY_LINKING_PLAN.md +1240 -0
  13. package/SCHEMA_COMPLIANCE_REPORT.md +275 -0
  14. package/TEST_PLAN.md +571 -0
  15. package/coverage/coverage-final.json +57 -0
  16. package/dist/__tests__/utils/mock-providers.d.ts +1 -2
  17. package/dist/__tests__/utils/mock-providers.d.ts.map +1 -1
  18. package/dist/__tests__/utils/mock-providers.js.map +1 -1
  19. package/dist/cache/oauth-config-cache.d.ts +69 -0
  20. package/dist/cache/oauth-config-cache.d.ts.map +1 -0
  21. package/dist/cache/oauth-config-cache.js +76 -0
  22. package/dist/cache/oauth-config-cache.js.map +1 -0
  23. package/dist/identity/idp-token-resolver.d.ts +53 -0
  24. package/dist/identity/idp-token-resolver.d.ts.map +1 -0
  25. package/dist/identity/idp-token-resolver.js +108 -0
  26. package/dist/identity/idp-token-resolver.js.map +1 -0
  27. package/dist/identity/idp-token-storage.interface.d.ts +42 -0
  28. package/dist/identity/idp-token-storage.interface.d.ts.map +1 -0
  29. package/dist/identity/idp-token-storage.interface.js +12 -0
  30. package/dist/identity/idp-token-storage.interface.js.map +1 -0
  31. package/dist/identity/user-did-manager.d.ts +39 -1
  32. package/dist/identity/user-did-manager.d.ts.map +1 -1
  33. package/dist/identity/user-did-manager.js +69 -3
  34. package/dist/identity/user-did-manager.js.map +1 -1
  35. package/dist/index.d.ts +24 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +43 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/runtime/audit-logger.d.ts +37 -0
  40. package/dist/runtime/audit-logger.d.ts.map +1 -0
  41. package/dist/runtime/audit-logger.js +9 -0
  42. package/dist/runtime/audit-logger.js.map +1 -0
  43. package/dist/runtime/base.d.ts +19 -2
  44. package/dist/runtime/base.d.ts.map +1 -1
  45. package/dist/runtime/base.js +227 -11
  46. package/dist/runtime/base.js.map +1 -1
  47. package/dist/services/access-control.service.d.ts.map +1 -1
  48. package/dist/services/access-control.service.js +199 -15
  49. package/dist/services/access-control.service.js.map +1 -1
  50. package/dist/services/authorization/authorization-registry.d.ts +29 -0
  51. package/dist/services/authorization/authorization-registry.d.ts.map +1 -0
  52. package/dist/services/authorization/authorization-registry.js +57 -0
  53. package/dist/services/authorization/authorization-registry.js.map +1 -0
  54. package/dist/services/authorization/types.d.ts +53 -0
  55. package/dist/services/authorization/types.d.ts.map +1 -0
  56. package/dist/services/authorization/types.js +10 -0
  57. package/dist/services/authorization/types.js.map +1 -0
  58. package/dist/services/batch-delegation.service.d.ts +53 -0
  59. package/dist/services/batch-delegation.service.d.ts.map +1 -0
  60. package/dist/services/batch-delegation.service.js +95 -0
  61. package/dist/services/batch-delegation.service.js.map +1 -0
  62. package/dist/services/index.d.ts +2 -0
  63. package/dist/services/index.d.ts.map +1 -1
  64. package/dist/services/index.js +4 -1
  65. package/dist/services/index.js.map +1 -1
  66. package/dist/services/oauth-config.service.d.ts +53 -0
  67. package/dist/services/oauth-config.service.d.ts.map +1 -0
  68. package/dist/services/oauth-config.service.js +141 -0
  69. package/dist/services/oauth-config.service.js.map +1 -0
  70. package/dist/services/oauth-provider-registry.d.ts +88 -0
  71. package/dist/services/oauth-provider-registry.d.ts.map +1 -0
  72. package/dist/services/oauth-provider-registry.js +128 -0
  73. package/dist/services/oauth-provider-registry.js.map +1 -0
  74. package/dist/services/oauth-service.d.ts +77 -0
  75. package/dist/services/oauth-service.d.ts.map +1 -0
  76. package/dist/services/oauth-service.js +373 -0
  77. package/dist/services/oauth-service.js.map +1 -0
  78. package/dist/services/oauth-token-retrieval.service.d.ts +49 -0
  79. package/dist/services/oauth-token-retrieval.service.d.ts.map +1 -0
  80. package/dist/services/oauth-token-retrieval.service.js +150 -0
  81. package/dist/services/oauth-token-retrieval.service.js.map +1 -0
  82. package/dist/services/provider-resolver.d.ts +48 -0
  83. package/dist/services/provider-resolver.d.ts.map +1 -0
  84. package/dist/services/provider-resolver.js +121 -0
  85. package/dist/services/provider-resolver.js.map +1 -0
  86. package/dist/services/provider-validator.d.ts +55 -0
  87. package/dist/services/provider-validator.d.ts.map +1 -0
  88. package/dist/services/provider-validator.js +135 -0
  89. package/dist/services/provider-validator.js.map +1 -0
  90. package/dist/services/session-registration.service.d.ts +80 -0
  91. package/dist/services/session-registration.service.d.ts.map +1 -0
  92. package/dist/services/session-registration.service.js +228 -0
  93. package/dist/services/session-registration.service.js.map +1 -0
  94. package/dist/services/tool-context-builder.d.ts +57 -0
  95. package/dist/services/tool-context-builder.d.ts.map +1 -0
  96. package/dist/services/tool-context-builder.js +125 -0
  97. package/dist/services/tool-context-builder.js.map +1 -0
  98. package/dist/services/tool-protection.service.d.ts +27 -0
  99. package/dist/services/tool-protection.service.d.ts.map +1 -1
  100. package/dist/services/tool-protection.service.js +194 -4
  101. package/dist/services/tool-protection.service.js.map +1 -1
  102. package/dist/types/oauth-required-error.d.ts +40 -0
  103. package/dist/types/oauth-required-error.d.ts.map +1 -0
  104. package/dist/types/oauth-required-error.js +40 -0
  105. package/dist/types/oauth-required-error.js.map +1 -0
  106. package/dist/utils/did-helpers.d.ts +33 -0
  107. package/dist/utils/did-helpers.d.ts.map +1 -1
  108. package/dist/utils/did-helpers.js +40 -0
  109. package/dist/utils/did-helpers.js.map +1 -1
  110. package/dist/utils/index.d.ts +1 -0
  111. package/dist/utils/index.d.ts.map +1 -1
  112. package/dist/utils/index.js +1 -0
  113. package/dist/utils/index.js.map +1 -1
  114. package/docs/API_REFERENCE.md +1362 -0
  115. package/docs/COMPLIANCE_MATRIX.md +691 -0
  116. package/docs/STATUSLIST2021_GUIDE.md +696 -0
  117. package/docs/W3C_VC_DELEGATION_GUIDE.md +710 -0
  118. package/package.json +23 -54
  119. package/scripts/audit-compliance.ts +724 -0
  120. package/src/__tests__/cache/tool-protection-cache.test.ts +640 -0
  121. package/src/__tests__/config/provider-runtime-config.test.ts +309 -0
  122. package/src/__tests__/delegation-e2e.test.ts +690 -0
  123. package/src/__tests__/identity/user-did-manager.test.ts +213 -0
  124. package/src/__tests__/index.test.ts +56 -0
  125. package/src/__tests__/integration/full-flow.test.ts +776 -0
  126. package/src/__tests__/integration.test.ts +281 -0
  127. package/src/__tests__/providers/base.test.ts +173 -0
  128. package/src/__tests__/providers/memory.test.ts +319 -0
  129. package/src/__tests__/regression/phase2-regression.test.ts +429 -0
  130. package/src/__tests__/runtime/audit-logger.test.ts +154 -0
  131. package/src/__tests__/runtime/base-extensions.test.ts +593 -0
  132. package/src/__tests__/runtime/base.test.ts +869 -0
  133. package/src/__tests__/runtime/delegation-flow.test.ts +164 -0
  134. package/src/__tests__/runtime/proof-client-did.test.ts +375 -0
  135. package/src/__tests__/runtime/route-interception.test.ts +686 -0
  136. package/src/__tests__/runtime/tool-protection-enforcement.test.ts +908 -0
  137. package/src/__tests__/services/agentshield-integration.test.ts +784 -0
  138. package/src/__tests__/services/cache-busting.test.ts +125 -0
  139. package/src/__tests__/services/oauth-service-pkce.test.ts +556 -0
  140. package/src/__tests__/services/provider-resolver-edge-cases.test.ts +591 -0
  141. package/src/__tests__/services/tool-protection-oauth-provider.test.ts +480 -0
  142. package/src/__tests__/services/tool-protection.service.test.ts +1366 -0
  143. package/src/__tests__/utils/mock-providers.ts +340 -0
  144. package/src/cache/oauth-config-cache.d.ts +69 -0
  145. package/src/cache/oauth-config-cache.d.ts.map +1 -0
  146. package/src/cache/oauth-config-cache.js.map +1 -0
  147. package/src/cache/oauth-config-cache.ts +123 -0
  148. package/src/cache/tool-protection-cache.ts +171 -0
  149. package/src/compliance/EXAMPLE.md +412 -0
  150. package/src/compliance/__tests__/schema-verifier.test.ts +797 -0
  151. package/src/compliance/index.ts +8 -0
  152. package/src/compliance/schema-registry.ts +460 -0
  153. package/src/compliance/schema-verifier.ts +708 -0
  154. package/src/config/__tests__/remote-config.spec.ts +268 -0
  155. package/src/config/remote-config.ts +174 -0
  156. package/src/config.ts +309 -0
  157. package/src/delegation/__tests__/audience-validator.test.ts +112 -0
  158. package/src/delegation/__tests__/bitstring.test.ts +346 -0
  159. package/src/delegation/__tests__/cascading-revocation.test.ts +628 -0
  160. package/src/delegation/__tests__/delegation-graph.test.ts +584 -0
  161. package/src/delegation/__tests__/utils.test.ts +152 -0
  162. package/src/delegation/__tests__/vc-issuer.test.ts +442 -0
  163. package/src/delegation/__tests__/vc-verifier.test.ts +922 -0
  164. package/src/delegation/audience-validator.ts +52 -0
  165. package/src/delegation/bitstring.ts +278 -0
  166. package/src/delegation/cascading-revocation.ts +370 -0
  167. package/src/delegation/delegation-graph.ts +299 -0
  168. package/src/delegation/index.ts +14 -0
  169. package/src/delegation/statuslist-manager.ts +353 -0
  170. package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +366 -0
  171. package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +228 -0
  172. package/src/delegation/storage/index.ts +9 -0
  173. package/src/delegation/storage/memory-graph-storage.ts +178 -0
  174. package/src/delegation/storage/memory-statuslist-storage.ts +77 -0
  175. package/src/delegation/utils.ts +42 -0
  176. package/src/delegation/vc-issuer.ts +232 -0
  177. package/src/delegation/vc-verifier.ts +568 -0
  178. package/src/identity/idp-token-resolver.ts +147 -0
  179. package/src/identity/idp-token-storage.interface.ts +59 -0
  180. package/src/identity/user-did-manager.ts +370 -0
  181. package/src/index.ts +271 -0
  182. package/src/providers/base.d.ts +91 -0
  183. package/src/providers/base.d.ts.map +1 -0
  184. package/src/providers/base.js.map +1 -0
  185. package/src/providers/base.ts +96 -0
  186. package/src/providers/memory.ts +142 -0
  187. package/src/runtime/audit-logger.ts +39 -0
  188. package/src/runtime/base.ts +1329 -0
  189. package/src/services/__tests__/access-control.integration.test.ts +443 -0
  190. package/src/services/__tests__/access-control.proof-response-validation.test.ts +578 -0
  191. package/src/services/__tests__/access-control.service.test.ts +970 -0
  192. package/src/services/__tests__/batch-delegation.service.test.ts +351 -0
  193. package/src/services/__tests__/crypto.service.test.ts +531 -0
  194. package/src/services/__tests__/oauth-provider-registry.test.ts +142 -0
  195. package/src/services/__tests__/proof-verifier.integration.test.ts +485 -0
  196. package/src/services/__tests__/proof-verifier.test.ts +489 -0
  197. package/src/services/__tests__/provider-resolution.integration.test.ts +202 -0
  198. package/src/services/__tests__/provider-resolver.test.ts +213 -0
  199. package/src/services/__tests__/storage.service.test.ts +358 -0
  200. package/src/services/access-control.service.ts +990 -0
  201. package/src/services/authorization/authorization-registry.ts +66 -0
  202. package/src/services/authorization/types.ts +71 -0
  203. package/src/services/batch-delegation.service.ts +137 -0
  204. package/src/services/crypto.service.ts +302 -0
  205. package/src/services/errors.ts +76 -0
  206. package/src/services/index.ts +18 -0
  207. package/src/services/oauth-config.service.d.ts +53 -0
  208. package/src/services/oauth-config.service.d.ts.map +1 -0
  209. package/src/services/oauth-config.service.js.map +1 -0
  210. package/src/services/oauth-config.service.ts +192 -0
  211. package/src/services/oauth-provider-registry.d.ts +57 -0
  212. package/src/services/oauth-provider-registry.d.ts.map +1 -0
  213. package/src/services/oauth-provider-registry.js.map +1 -0
  214. package/src/services/oauth-provider-registry.ts +141 -0
  215. package/src/services/oauth-service.ts +544 -0
  216. package/src/services/oauth-token-retrieval.service.ts +245 -0
  217. package/src/services/proof-verifier.ts +478 -0
  218. package/src/services/provider-resolver.d.ts +48 -0
  219. package/src/services/provider-resolver.d.ts.map +1 -0
  220. package/src/services/provider-resolver.js.map +1 -0
  221. package/src/services/provider-resolver.ts +146 -0
  222. package/src/services/provider-validator.ts +170 -0
  223. package/src/services/session-registration.service.ts +317 -0
  224. package/src/services/storage.service.ts +566 -0
  225. package/src/services/tool-context-builder.ts +172 -0
  226. package/src/services/tool-protection.service.ts +982 -0
  227. package/src/types/oauth-required-error.ts +63 -0
  228. package/src/types/tool-protection.ts +155 -0
  229. package/src/utils/__tests__/did-helpers.test.ts +101 -0
  230. package/src/utils/base64.ts +148 -0
  231. package/src/utils/cors.ts +83 -0
  232. package/src/utils/did-helpers.ts +150 -0
  233. package/src/utils/index.ts +8 -0
  234. package/src/utils/storage-keys.ts +278 -0
  235. package/tsconfig.json +21 -0
  236. package/vitest.config.ts +56 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * IDP Token Storage Interface
3
+ *
4
+ * Platform-agnostic interface for storing and retrieving IDP tokens.
5
+ * Platform-specific implementations (Cloudflare KV, Node.js database, etc.)
6
+ * implement this interface.
7
+ *
8
+ * @package @kya-os/mcp-i-core
9
+ */
10
+
11
+ import type { IdpTokens } from "@kya-os/contracts/config";
12
+
13
+ /**
14
+ * Interface for IDP token storage
15
+ */
16
+ export interface IIdpTokenStorage {
17
+ /**
18
+ * Store IDP tokens
19
+ *
20
+ * @param userDid - User DID to associate tokens with
21
+ * @param provider - OAuth provider name
22
+ * @param scopes - Scopes granted for these tokens
23
+ * @param tokens - IDP tokens to store
24
+ */
25
+ storeToken(
26
+ userDid: string,
27
+ provider: string,
28
+ scopes: string[],
29
+ tokens: IdpTokens
30
+ ): Promise<void>;
31
+
32
+ /**
33
+ * Retrieve IDP tokens
34
+ *
35
+ * @param userDid - User DID to retrieve tokens for
36
+ * @param provider - OAuth provider name
37
+ * @param scopes - Scopes to retrieve tokens for
38
+ * @returns IDP tokens or null if not found
39
+ */
40
+ getToken(
41
+ userDid: string,
42
+ provider: string,
43
+ scopes: string[]
44
+ ): Promise<IdpTokens | null>;
45
+
46
+ /**
47
+ * Delete IDP tokens
48
+ *
49
+ * @param userDid - User DID
50
+ * @param provider - OAuth provider name
51
+ * @param scopes - Scopes
52
+ */
53
+ deleteToken(
54
+ userDid: string,
55
+ provider: string,
56
+ scopes: string[]
57
+ ): Promise<void>;
58
+ }
59
+
@@ -0,0 +1,370 @@
1
+ /**
2
+ * User DID Manager
3
+ *
4
+ * Handles ephemeral user DID generation for MCP-I sessions.
5
+ * Generates did:key DIDs for users when they join a chat session.
6
+ *
7
+ * This enables tracking which client/user initiated tool calls without
8
+ * requiring user registration or persistent identity.
9
+ */
10
+
11
+ import { CryptoProvider } from '../providers/base';
12
+
13
+ /**
14
+ * OAuth identity for persistent user DID lookup
15
+ */
16
+ export interface OAuthIdentity {
17
+ /**
18
+ * OAuth provider name (e.g., "google", "github", "microsoft")
19
+ */
20
+ provider: string;
21
+
22
+ /**
23
+ * OAuth subject identifier (unique user ID from provider)
24
+ */
25
+ subject: string;
26
+
27
+ /**
28
+ * User's email address from OAuth provider (optional)
29
+ */
30
+ email?: string;
31
+
32
+ /**
33
+ * User's display name from OAuth provider (optional)
34
+ */
35
+ name?: string;
36
+ }
37
+
38
+ /**
39
+ * User DID storage interface
40
+ */
41
+ export interface UserDidStorage {
42
+ /**
43
+ * Get user DID for a session
44
+ */
45
+ get(sessionId: string): Promise<string | null>;
46
+
47
+ /**
48
+ * Store user DID for a session
49
+ */
50
+ set(sessionId: string, did: string, ttl?: number): Promise<void>;
51
+
52
+ /**
53
+ * Delete user DID for a session
54
+ */
55
+ delete(sessionId: string): Promise<void>;
56
+
57
+ /**
58
+ * Get user DID by OAuth identity (optional - for persistent user DID lookup)
59
+ * If not implemented, OAuth-based lookup will be skipped
60
+ */
61
+ getByOAuth?(provider: string, subject: string): Promise<string | null>;
62
+
63
+ /**
64
+ * Store user DID mapping for OAuth identity (optional - for persistent user DID storage)
65
+ * If not implemented, OAuth-based storage will be skipped
66
+ */
67
+ setByOAuth?(provider: string, subject: string, did: string, ttl?: number): Promise<void>;
68
+ }
69
+
70
+ /**
71
+ * User DID Manager configuration
72
+ */
73
+ export interface UserDidManagerConfig {
74
+ /**
75
+ * Storage provider for user DIDs (optional)
76
+ * If not provided, user DIDs are ephemeral (not persisted)
77
+ */
78
+ storage?: UserDidStorage;
79
+
80
+ /**
81
+ * Crypto provider for DID generation
82
+ */
83
+ crypto: CryptoProvider;
84
+
85
+ /**
86
+ * Generate did:web format instead of did:key (requires additional setup)
87
+ */
88
+ useDidWeb?: boolean;
89
+
90
+ /**
91
+ * Base URL for did:web (required if useDidWeb is true)
92
+ */
93
+ didWebBaseUrl?: string;
94
+ }
95
+
96
+ /**
97
+ * User DID Manager
98
+ *
99
+ * Generates and manages user DIDs for MCP-I sessions.
100
+ * Supports both ephemeral (did:key) and persistent (did:web) formats.
101
+ */
102
+ export class UserDidManager {
103
+ private config: UserDidManagerConfig;
104
+ private sessionDidCache = new Map<string, string>();
105
+
106
+ constructor(config: UserDidManagerConfig) {
107
+ this.config = config;
108
+ }
109
+
110
+ /**
111
+ * Generate or retrieve user DID for a session
112
+ *
113
+ * If a user DID already exists for the session, it is returned.
114
+ * If OAuth identity is provided, checks for persistent user DID mapping first.
115
+ * Otherwise, a new ephemeral did:key is generated.
116
+ *
117
+ * @param sessionId - MCP session ID
118
+ * @param oauthIdentity - Optional OAuth identity for persistent user DID lookup
119
+ * @returns User DID (did:key format)
120
+ *
121
+ * @remarks
122
+ * - If OAuth identity provided, checks for existing mapping first
123
+ * - Falls back to ephemeral DID generation if OAuth unavailable
124
+ * - Caches result in session storage for performance
125
+ */
126
+ async getOrCreateUserDid(sessionId: string, oauthIdentity?: OAuthIdentity | null): Promise<string> {
127
+ // Check cache first
128
+ if (this.sessionDidCache.has(sessionId)) {
129
+ return this.sessionDidCache.get(sessionId)!;
130
+ }
131
+
132
+ // PRIORITY 1: If OAuth identity provided, check for persistent user DID mapping
133
+ if (oauthIdentity && oauthIdentity.provider && oauthIdentity.subject && this.config.storage?.getByOAuth) {
134
+ try {
135
+ const persistentUserDid = await this.config.storage.getByOAuth(
136
+ oauthIdentity.provider,
137
+ oauthIdentity.subject
138
+ );
139
+ if (persistentUserDid) {
140
+ console.log('[UserDidManager] Found persistent user DID from OAuth mapping:', {
141
+ provider: oauthIdentity.provider,
142
+ userDid: persistentUserDid.substring(0, 20) + '...',
143
+ });
144
+ // Cache it for this session
145
+ this.sessionDidCache.set(sessionId, persistentUserDid);
146
+ // Also store in session storage for faster future lookups
147
+ if (this.config.storage) {
148
+ try {
149
+ await this.config.storage.set(sessionId, persistentUserDid, 1800); // 30 minutes TTL
150
+ } catch (error) {
151
+ // Log but continue - DID is cached and will be returned
152
+ console.warn('[UserDidManager] Failed to cache persistent DID in session storage:', error);
153
+ }
154
+ }
155
+ return persistentUserDid;
156
+ }
157
+ } catch (error) {
158
+ // Log but continue - will check session storage or generate new DID
159
+ console.warn('[UserDidManager] OAuth lookup failed, falling back to session storage:', error);
160
+ }
161
+ }
162
+
163
+ // PRIORITY 2: Check session storage if available
164
+ if (this.config.storage) {
165
+ try {
166
+ const storedDid = await this.config.storage.get(sessionId);
167
+ if (storedDid) {
168
+ this.sessionDidCache.set(sessionId, storedDid);
169
+ // If OAuth identity provided but no persistent mapping found, create one now
170
+ if (oauthIdentity && oauthIdentity.provider && oauthIdentity.subject && this.config.storage.setByOAuth) {
171
+ try {
172
+ await this.config.storage.setByOAuth(
173
+ oauthIdentity.provider,
174
+ oauthIdentity.subject,
175
+ storedDid,
176
+ 90 * 24 * 60 * 60 // 90 days TTL for persistent mapping
177
+ );
178
+ console.log('[UserDidManager] Created persistent OAuth mapping for existing user DID:', {
179
+ provider: oauthIdentity.provider,
180
+ userDid: storedDid.substring(0, 20) + '...',
181
+ });
182
+ } catch (error) {
183
+ // Log but continue - mapping creation failed, but DID is still valid
184
+ console.warn('[UserDidManager] Failed to create OAuth mapping:', error);
185
+ }
186
+ }
187
+ return storedDid;
188
+ }
189
+ } catch (error) {
190
+ // Log but continue - will generate new DID
191
+ console.warn('[UserDidManager] Storage.get failed, generating new DID:', error);
192
+ }
193
+ }
194
+
195
+ // PRIORITY 3: Generate new user DID
196
+ const userDid = await this.generateUserDid();
197
+
198
+ // Cache it
199
+ this.sessionDidCache.set(sessionId, userDid);
200
+
201
+ // Store it if storage is available
202
+ if (this.config.storage) {
203
+ try {
204
+ await this.config.storage.set(sessionId, userDid, 1800); // 30 minutes TTL
205
+ } catch (error) {
206
+ // Log but continue - DID is cached and will be returned
207
+ console.warn('[UserDidManager] Storage.set failed, continuing with cached DID:', error);
208
+ }
209
+ }
210
+
211
+ // If OAuth identity provided, create persistent mapping
212
+ if (oauthIdentity && oauthIdentity.provider && oauthIdentity.subject && this.config.storage?.setByOAuth) {
213
+ try {
214
+ await this.config.storage.setByOAuth(
215
+ oauthIdentity.provider,
216
+ oauthIdentity.subject,
217
+ userDid,
218
+ 90 * 24 * 60 * 60 // 90 days TTL for persistent mapping
219
+ );
220
+ console.log('[UserDidManager] Created persistent OAuth mapping for new user DID:', {
221
+ provider: oauthIdentity.provider,
222
+ userDid: userDid.substring(0, 20) + '...',
223
+ });
224
+ } catch (error) {
225
+ // Log but continue - mapping creation failed, but DID is still valid
226
+ console.warn('[UserDidManager] Failed to create OAuth mapping:', error);
227
+ }
228
+ }
229
+
230
+ return userDid;
231
+ }
232
+
233
+ /**
234
+ * Generate a new ephemeral user DID
235
+ *
236
+ * Uses did:key format by default for simplicity.
237
+ * did:web can be used if configured, but requires additional setup.
238
+ */
239
+ private async generateUserDid(): Promise<string> {
240
+ if (this.config.useDidWeb && this.config.didWebBaseUrl) {
241
+ // Generate did:web (requires web server setup)
242
+ // For now, fall back to did:key
243
+ // TODO: Implement did:web generation if needed
244
+ console.warn('[UserDidManager] did:web not yet implemented, using did:key');
245
+ }
246
+
247
+ // Generate Ed25519 keypair for user DID
248
+ const keyPair = await this.config.crypto.generateKeyPair();
249
+
250
+ // Extract public key bytes (32 bytes for Ed25519)
251
+ const publicKeyBytes = this.base64ToBytes(keyPair.publicKey);
252
+
253
+ // Generate did:key from public key
254
+ return this.generateDidKeyFromPublicKey(publicKeyBytes);
255
+ }
256
+
257
+ /**
258
+ * Generate did:key from Ed25519 public key bytes
259
+ * Following spec: https://w3c-ccg.github.io/did-method-key/
260
+ *
261
+ * Format: did:key:z<multibase-base58btc(<multicodec-ed25519-pub><publicKey>)>
262
+ */
263
+ private generateDidKeyFromPublicKey(publicKeyBytes: Uint8Array): string {
264
+ // Ed25519 multicodec prefix (0xed 0x01)
265
+ const multicodecPrefix = new Uint8Array([0xed, 0x01]);
266
+
267
+ // Combine prefix + public key
268
+ const multicodecKey = new Uint8Array(multicodecPrefix.length + publicKeyBytes.length);
269
+ multicodecKey.set(multicodecPrefix);
270
+ multicodecKey.set(publicKeyBytes, multicodecPrefix.length);
271
+
272
+ // Base58 encode (using a simple implementation)
273
+ // Note: For production, consider using base-x library
274
+ const base58Encoded = this.base58Encode(multicodecKey);
275
+
276
+ // Add multibase prefix 'z' for base58-btc
277
+ return `did:key:z${base58Encoded}`;
278
+ }
279
+
280
+ /**
281
+ * Base58 encode (Bitcoin alphabet)
282
+ * Simple implementation for did:key generation
283
+ */
284
+ private base58Encode(bytes: Uint8Array): string {
285
+ const alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
286
+ let num = BigInt(0);
287
+
288
+ // Convert bytes to big integer
289
+ for (let i = 0; i < bytes.length; i++) {
290
+ num = num * BigInt(256) + BigInt(bytes[i]);
291
+ }
292
+
293
+ // Convert to base58
294
+ let result = '';
295
+ while (num > 0) {
296
+ result = alphabet[Number(num % BigInt(58))] + result;
297
+ num = num / BigInt(58);
298
+ }
299
+
300
+ // Add leading zeros
301
+ for (let i = 0; i < bytes.length && bytes[i] === 0; i++) {
302
+ result = '1' + result;
303
+ }
304
+
305
+ return result;
306
+ }
307
+
308
+ /**
309
+ * Convert base64 string to Uint8Array
310
+ */
311
+ private base64ToBytes(base64: string): Uint8Array {
312
+ if (typeof Buffer !== 'undefined') {
313
+ // Node.js environment
314
+ return new Uint8Array(Buffer.from(base64, 'base64'));
315
+ } else {
316
+ // Browser/Workers environment
317
+ const binaryString = atob(base64);
318
+ const bytes = new Uint8Array(binaryString.length);
319
+ for (let i = 0; i < binaryString.length; i++) {
320
+ bytes[i] = binaryString.charCodeAt(i);
321
+ }
322
+ return bytes;
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Get user DID for a session without creating one
328
+ */
329
+ async getUserDid(sessionId: string): Promise<string | null> {
330
+ // Check cache
331
+ if (this.sessionDidCache.has(sessionId)) {
332
+ return this.sessionDidCache.get(sessionId)!;
333
+ }
334
+
335
+ // Check storage
336
+ if (this.config.storage) {
337
+ const storedDid = await this.config.storage.get(sessionId);
338
+ if (storedDid) {
339
+ this.sessionDidCache.set(sessionId, storedDid);
340
+ return storedDid;
341
+ }
342
+ }
343
+
344
+ return null;
345
+ }
346
+
347
+ /**
348
+ * Clear user DID for a session
349
+ */
350
+ async clearUserDid(sessionId: string): Promise<void> {
351
+ this.sessionDidCache.delete(sessionId);
352
+
353
+ if (this.config.storage) {
354
+ try {
355
+ await this.config.storage.delete(sessionId);
356
+ } catch (error) {
357
+ // Log but continue - cache is already cleared
358
+ console.warn('[UserDidManager] Storage.delete failed, continuing:', error);
359
+ }
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Clear all cached user DIDs (useful for testing)
365
+ */
366
+ clearCache(): void {
367
+ this.sessionDidCache.clear();
368
+ }
369
+ }
370
+
package/src/index.ts ADDED
@@ -0,0 +1,271 @@
1
+ /**
2
+ * @kya-os/mcp-i-core
3
+ *
4
+ * Core provider-based architecture for MCP-I framework.
5
+ * Platform-agnostic runtime that can be extended for any environment.
6
+ */
7
+
8
+ // Base providers
9
+ export {
10
+ CryptoProvider,
11
+ ClockProvider,
12
+ FetchProvider,
13
+ StorageProvider,
14
+ NonceCacheProvider,
15
+ IdentityProvider,
16
+ type AgentIdentity,
17
+ } from "./providers/base";
18
+
19
+ // Memory providers
20
+ export {
21
+ MemoryStorageProvider,
22
+ MemoryNonceCacheProvider,
23
+ MemoryIdentityProvider,
24
+ } from "./providers/memory";
25
+
26
+ // Runtime
27
+ export { MCPIRuntimeBase } from "./runtime/base";
28
+ export type { RuntimeWithAccessControl } from "./runtime/base";
29
+
30
+ // Audit Logger Interface
31
+ export type { IAuditLogger } from "./runtime/audit-logger";
32
+
33
+ // Utilities
34
+ export * from "./utils";
35
+ // Tool Protection
36
+ export { ToolProtectionService } from "./services/tool-protection.service";
37
+
38
+ // Crypto Service
39
+ export { CryptoService } from "./services/crypto.service";
40
+
41
+ export type { Ed25519JWK, ParsedJWS } from "./services/crypto.service";
42
+
43
+ // Proof Verifier Service
44
+ export { ProofVerifier } from "./services/proof-verifier";
45
+
46
+ export type {
47
+ ProofVerificationResult,
48
+ ProofVerifierConfig,
49
+ } from "./services/proof-verifier";
50
+
51
+ // Access Control API Service (stub for Phase 3)
52
+ export { AccessControlApiService } from "./services/access-control.service";
53
+
54
+ export type {
55
+ AccessControlApiServiceConfig,
56
+ AccessControlApiServiceMetrics,
57
+ } from "./services/access-control.service";
58
+
59
+ // Session Registration Service
60
+ export {
61
+ SessionRegistrationService,
62
+ createSessionRegistrationService,
63
+ } from "./services/session-registration.service";
64
+
65
+ export type {
66
+ SessionRegistrationServiceConfig,
67
+ SessionRegistrationResult,
68
+ } from "./services/session-registration.service";
69
+
70
+ // OAuth Config Service (Phase 1)
71
+ export { OAuthConfigService } from "./services/oauth-config.service";
72
+
73
+ export type { OAuthConfigServiceConfig } from "./services/oauth-config.service";
74
+
75
+ // OAuth Service (Phase 1)
76
+ export { OAuthService } from "./services/oauth-service";
77
+
78
+ export type { OAuthServiceConfig } from "./services/oauth-service";
79
+
80
+ // Tool Context Builder (Phase 1)
81
+ export { ToolContextBuilder } from "./services/tool-context-builder";
82
+
83
+ export type { ToolContextBuilderConfig } from "./services/tool-context-builder";
84
+
85
+ // OAuth Provider Registry (Phase 2)
86
+ export { OAuthProviderRegistry } from "./services/oauth-provider-registry";
87
+
88
+ // Provider Resolver (Phase 2)
89
+ export { ProviderResolver } from "./services/provider-resolver";
90
+
91
+ // Provider Validator (Phase 3)
92
+ export { ProviderValidator, ProviderValidationError } from "./services/provider-validator";
93
+
94
+ // OAuth Token Retrieval Service (Phase 3)
95
+ export { OAuthTokenRetrievalService } from "./services/oauth-token-retrieval.service";
96
+ export type { OAuthTokenRetrievalServiceConfig } from "./services/oauth-token-retrieval.service";
97
+
98
+ // Batch Delegation Service (Phase 2)
99
+ export { BatchDelegationService } from "./services/batch-delegation.service";
100
+ export type { ToolGroup } from "./services/batch-delegation.service";
101
+
102
+ // OAuth Config Cache
103
+ export {
104
+ InMemoryOAuthConfigCache,
105
+ NoOpOAuthConfigCache,
106
+ } from "./cache/oauth-config-cache";
107
+
108
+ export type { OAuthConfigCache } from "./cache/oauth-config-cache";
109
+
110
+ // Storage Service Factory
111
+ export {
112
+ createStorageProviders,
113
+ StorageKeyHelpers,
114
+ migrateLegacyKeys,
115
+ } from "./services/storage.service";
116
+
117
+ export type {
118
+ StorageServiceConfig,
119
+ StorageProviders,
120
+ } from "./services/storage.service";
121
+
122
+ // Proof Verification Errors
123
+ export {
124
+ ProofVerificationError,
125
+ PROOF_VERIFICATION_ERROR_CODES,
126
+ createProofVerificationError,
127
+ } from "./services/errors";
128
+
129
+ export type { ProofVerificationErrorCode } from "./services/errors";
130
+
131
+ export {
132
+ ToolProtectionCache,
133
+ InMemoryToolProtectionCache,
134
+ NoOpToolProtectionCache,
135
+ } from "./cache/tool-protection-cache";
136
+
137
+ export type {
138
+ ToolProtection,
139
+ ToolProtectionConfig,
140
+ ToolProtectionServiceConfig,
141
+ } from "./types/tool-protection";
142
+
143
+ export { DelegationRequiredError } from "./types/tool-protection";
144
+ export { OAuthRequiredError } from "./types/oauth-required-error";
145
+ export type { OAuthRequiredErrorOptions } from "./types/oauth-required-error";
146
+
147
+ // Delegation (W3C VC-based)
148
+ export {
149
+ DelegationCredentialIssuer,
150
+ createDelegationIssuer,
151
+ type IssueDelegationOptions,
152
+ type VCSigningFunction,
153
+ type IdentityProvider as DelegationIdentityProvider,
154
+ } from "./delegation/vc-issuer";
155
+
156
+ export {
157
+ DelegationCredentialVerifier,
158
+ createDelegationVerifier,
159
+ type DelegationVCVerificationResult,
160
+ type VerifyDelegationVCOptions,
161
+ type DIDResolver,
162
+ type DIDDocument,
163
+ type VerificationMethod,
164
+ type StatusListResolver,
165
+ type SignatureVerificationFunction,
166
+ } from "./delegation/vc-verifier";
167
+
168
+ // StatusList2021
169
+ export {
170
+ StatusList2021Manager,
171
+ createStatusListManager,
172
+ type StatusListStorageProvider,
173
+ type StatusListIdentityProvider,
174
+ } from "./delegation/statuslist-manager";
175
+
176
+ export {
177
+ BitstringManager,
178
+ isIndexSet,
179
+ type CompressionFunction,
180
+ type DecompressionFunction,
181
+ } from "./delegation/bitstring";
182
+
183
+ // Delegation Graph & Cascading Revocation
184
+ export {
185
+ DelegationGraphManager,
186
+ createDelegationGraph,
187
+ type DelegationNode,
188
+ type DelegationGraphStorageProvider,
189
+ } from "./delegation/delegation-graph";
190
+
191
+ export {
192
+ CascadingRevocationManager,
193
+ createCascadingRevocationManager,
194
+ type RevocationEvent,
195
+ type RevocationHook,
196
+ type CascadingRevocationOptions,
197
+ } from "./delegation/cascading-revocation";
198
+
199
+ // Storage Implementations (for testing and examples)
200
+ export { MemoryStatusListStorage } from "./delegation/storage/memory-statuslist-storage";
201
+
202
+ export { MemoryDelegationGraphStorage } from "./delegation/storage/memory-graph-storage";
203
+
204
+ // Compliance Verification (with JSON Schema draft-07 support)
205
+ export {
206
+ SchemaVerifier,
207
+ createSchemaVerifier,
208
+ type SchemaMetadata,
209
+ type FieldComplianceResult,
210
+ type SchemaComplianceReport,
211
+ type FullComplianceReport,
212
+ } from "./compliance/schema-verifier";
213
+
214
+ export {
215
+ SCHEMA_REGISTRY,
216
+ getAllSchemas,
217
+ getSchemasByCategory,
218
+ getSchemaById,
219
+ getCriticalSchemas,
220
+ getSchemaStats,
221
+ } from "./compliance/schema-registry";
222
+
223
+ export { canonicalizeJSON } from "./delegation/utils";
224
+
225
+ // Re-export commonly used types from contracts
226
+ // Note: @kya-os/contracts exports are at the root level
227
+ import type {
228
+ HandshakeRequest,
229
+ SessionContext,
230
+ NonceCache,
231
+ NonceCacheEntry,
232
+ NonceCacheConfig,
233
+ ProofMeta,
234
+ DetachedProof,
235
+ CanonicalHashes,
236
+ AuditRecord,
237
+ } from "@kya-os/contracts";
238
+
239
+ export type {
240
+ HandshakeRequest,
241
+ SessionContext,
242
+ NonceCache,
243
+ NonceCacheEntry,
244
+ NonceCacheConfig,
245
+ ProofMeta,
246
+ DetachedProof,
247
+ CanonicalHashes,
248
+ AuditRecord,
249
+ };
250
+
251
+ // Configuration types and utilities
252
+ export * from "./config";
253
+
254
+ // Remote configuration fetching
255
+ export {
256
+ fetchRemoteConfig,
257
+ type RemoteConfigCache,
258
+ type RemoteConfigOptions,
259
+ } from "./config/remote-config";
260
+
261
+ // User DID Manager (Phase 4)
262
+ export { UserDidManager } from "./identity/user-did-manager";
263
+ export type {
264
+ UserDidStorage,
265
+ UserDidManagerConfig,
266
+ } from "./identity/user-did-manager";
267
+
268
+ // IDP Token Resolver (Phase 1 - MH-7)
269
+ export { IdpTokenResolver } from "./identity/idp-token-resolver";
270
+ export type { IdpTokenResolverConfig } from "./identity/idp-token-resolver";
271
+ export type { IIdpTokenStorage } from "./identity/idp-token-storage.interface";