@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,128 @@
1
+ "use strict";
2
+ /**
3
+ * OAuth Provider Registry
4
+ *
5
+ * Manages OAuth provider configurations loaded from AgentShield API.
6
+ * Provides efficient lookup and caching of provider configurations.
7
+ *
8
+ * @package @kya-os/mcp-i-core
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.OAuthProviderRegistry = void 0;
12
+ /**
13
+ * Registry for OAuth providers
14
+ *
15
+ * Wraps OAuthConfigService to provide a simple lookup interface
16
+ * for provider configurations.
17
+ */
18
+ class OAuthProviderRegistry {
19
+ configService;
20
+ validator;
21
+ providers = new Map();
22
+ _configuredProvider = null;
23
+ constructor(configService, validator) {
24
+ this.configService = configService;
25
+ this.validator = validator;
26
+ }
27
+ /**
28
+ * Load providers from AgentShield API
29
+ *
30
+ * Fetches OAuth configuration and caches providers in memory.
31
+ * Clears existing providers before loading new ones.
32
+ * Also stores the configured provider from the API response.
33
+ *
34
+ * @param projectId - Project ID to load providers for
35
+ */
36
+ async loadFromAgentShield(projectId) {
37
+ const config = await this.configService.getOAuthConfig(projectId);
38
+ // Clear existing providers
39
+ this.providers.clear();
40
+ // Store the configured provider from API response
41
+ // This is the provider the user has explicitly configured in AgentShield dashboard
42
+ this._configuredProvider = config.configuredProvider || null;
43
+ // Register all providers from config
44
+ for (const [name, providerConfig] of Object.entries(config.providers)) {
45
+ this.providers.set(name, providerConfig);
46
+ }
47
+ }
48
+ /**
49
+ * Get the explicitly configured provider for this project
50
+ *
51
+ * Returns the provider that the user has configured in AgentShield dashboard.
52
+ * Used by ProviderResolver as fallback when tool doesn't specify oauthProvider.
53
+ *
54
+ * @returns Configured provider name, or null if no provider is configured
55
+ */
56
+ getConfiguredProvider() {
57
+ return this._configuredProvider;
58
+ }
59
+ /**
60
+ * Get provider by name
61
+ *
62
+ * @param name - Provider name (e.g., "github", "google")
63
+ * @returns Provider configuration or null if not found
64
+ */
65
+ getProvider(name) {
66
+ return this.providers.get(name) || null;
67
+ }
68
+ /**
69
+ * Get all providers
70
+ *
71
+ * @returns Array of all registered provider configurations
72
+ */
73
+ getAllProviders() {
74
+ return Array.from(this.providers.values());
75
+ }
76
+ /**
77
+ * Check if provider exists
78
+ *
79
+ * @param name - Provider name to check
80
+ * @returns True if provider is registered, false otherwise
81
+ */
82
+ hasProvider(name) {
83
+ return this.providers.has(name);
84
+ }
85
+ /**
86
+ * Get all provider names
87
+ *
88
+ * @returns Array of provider names
89
+ */
90
+ getProviderNames() {
91
+ return Array.from(this.providers.keys());
92
+ }
93
+ /**
94
+ * Register a custom provider with validation
95
+ *
96
+ * @param name - Provider name (e.g., "custom-idp")
97
+ * @param provider - Provider configuration
98
+ * @throws ProviderValidationError if validation fails
99
+ */
100
+ registerCustomProvider(name, provider) {
101
+ // Validate provider configuration if validator is available
102
+ if (this.validator) {
103
+ this.validator.validate(provider, name);
104
+ }
105
+ // Register provider
106
+ this.providers.set(name, provider);
107
+ }
108
+ /**
109
+ * Get provider with custom parameters merged
110
+ *
111
+ * Convenience method that returns provider config with custom parameters
112
+ * already applied to authorization URL building context.
113
+ *
114
+ * @param name - Provider name
115
+ * @returns Provider configuration with custom params, or null if not found
116
+ */
117
+ getProviderWithParams(name) {
118
+ const provider = this.getProvider(name);
119
+ if (!provider) {
120
+ return null;
121
+ }
122
+ // Return provider as-is (customParams are already in the config)
123
+ // This method exists for future extensibility if we need to merge params
124
+ return provider;
125
+ }
126
+ }
127
+ exports.OAuthProviderRegistry = OAuthProviderRegistry;
128
+ //# sourceMappingURL=oauth-provider-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider-registry.js","sourceRoot":"","sources":["../../src/services/oauth-provider-registry.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAMH;;;;;GAKG;AACH,MAAa,qBAAqB;IAKtB;IACA;IALF,SAAS,GAA+B,IAAI,GAAG,EAAE,CAAC;IAClD,mBAAmB,GAAkB,IAAI,CAAC;IAElD,YACU,aAAiC,EACjC,SAA6B;QAD7B,kBAAa,GAAb,aAAa,CAAoB;QACjC,cAAS,GAAT,SAAS,CAAoB;IACpC,CAAC;IAEJ;;;;;;;;OAQG;IACH,KAAK,CAAC,mBAAmB,CAAC,SAAiB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAElE,2BAA2B;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,kDAAkD;QAClD,mFAAmF;QACnF,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC;QAE7D,qCAAqC;QACrC,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,qBAAqB;QACnB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,sBAAsB,CAAC,IAAY,EAAE,QAAuB;QAC1D,4DAA4D;QAC5D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;;;OAQG;IACH,qBAAqB,CAAC,IAAY;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iEAAiE;QACjE,yEAAyE;QACzE,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAxHD,sDAwHC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * OAuth Service
3
+ *
4
+ * Handles OAuth token exchange and refresh using PKCE (Proof Key for Code Exchange).
5
+ * Supports both direct PKCE exchange with OAuth providers and proxy mode via AgentShield.
6
+ *
7
+ * @package @kya-os/mcp-i-core
8
+ */
9
+ import type { FetchProvider } from "../providers/base.js";
10
+ import type { OAuthConfigService } from "./oauth-config.service.js";
11
+ import type { IdpTokens } from "@kya-os/contracts/config";
12
+ export interface OAuthServiceConfig {
13
+ /** OAuth config service for fetching provider configurations */
14
+ configService: OAuthConfigService;
15
+ /** Fetch provider for making HTTP requests */
16
+ fetchProvider: FetchProvider;
17
+ /** AgentShield API URL (for proxy mode) */
18
+ agentShieldApiUrl: string;
19
+ /** AgentShield API key (for proxy mode) */
20
+ agentShieldApiKey: string;
21
+ /** Project ID for fetching OAuth config */
22
+ projectId: string;
23
+ /** Optional logger callback for diagnostics */
24
+ logger?: (message: string, data?: unknown) => void;
25
+ }
26
+ /**
27
+ * Service for OAuth token exchange and refresh
28
+ */
29
+ export declare class OAuthService {
30
+ private config;
31
+ constructor(config: OAuthServiceConfig);
32
+ /**
33
+ * Exchange authorization code for IDP tokens using PKCE
34
+ *
35
+ * For PKCE providers: Exchanges code directly with OAuth provider (no client secret)
36
+ * For proxy mode: Exchanges code via AgentShield API
37
+ *
38
+ * @param provider - OAuth provider name (e.g., "github", "google")
39
+ * @param code - Authorization code from OAuth callback
40
+ * @param codeVerifier - PKCE code verifier (optional for non-PKCE providers in proxy mode)
41
+ * @param redirectUri - Redirect URI used in authorization request
42
+ * @returns IDP tokens (access_token, refresh_token, expires_at, etc.)
43
+ */
44
+ exchangeToken(provider: string, code: string, codeVerifier?: string, redirectUri?: string): Promise<IdpTokens>;
45
+ /**
46
+ * Exchange token directly with OAuth provider using PKCE
47
+ */
48
+ private exchangeTokenPKCE;
49
+ /**
50
+ * Exchange token via AgentShield proxy (for providers that require proxy mode)
51
+ *
52
+ * Note: For Phase 3 two-step flow, OAuth tokens are retrieved separately via
53
+ * OAuthTokenRetrievalService in the callback handler. This method maintains
54
+ * backward compatibility for direct proxy mode usage.
55
+ */
56
+ private exchangeTokenProxy;
57
+ /**
58
+ * Refresh IDP access token using refresh token
59
+ *
60
+ * For PKCE providers: Refreshes directly with OAuth provider
61
+ * For proxy mode: Refreshes via AgentShield API
62
+ *
63
+ * @param provider - OAuth provider name
64
+ * @param refreshToken - Refresh token from previous token exchange
65
+ * @returns New IDP tokens or null if refresh failed
66
+ */
67
+ refreshToken(provider: string, refreshToken: string): Promise<IdpTokens | null>;
68
+ /**
69
+ * Refresh token directly with OAuth provider using PKCE
70
+ */
71
+ private refreshTokenPKCE;
72
+ /**
73
+ * Refresh token via AgentShield proxy
74
+ */
75
+ private refreshTokenProxy;
76
+ }
77
+ //# sourceMappingURL=oauth-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-service.d.ts","sourceRoot":"","sources":["../../src/services/oauth-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,0BAA0B,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,aAAa,EAAE,kBAAkB,CAAC;IAElC,8CAA8C;IAC9C,aAAa,EAAE,aAAa,CAAC;IAE7B,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAE1B,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAE1B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAElB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpD;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAEZ;gBAEU,MAAM,EAAE,kBAAkB;IAWtC;;;;;;;;;;;OAWG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,CAAC;IAyCrB;;OAEG;YACW,iBAAiB;IAsH/B;;;;;;OAMG;YACW,kBAAkB;IAyGhC;;;;;;;;;OASG;IACG,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA2B5B;;OAEG;YACW,gBAAgB;IAuE9B;;OAEG;YACW,iBAAiB;CAkFhC"}
@@ -0,0 +1,373 @@
1
+ "use strict";
2
+ /**
3
+ * OAuth Service
4
+ *
5
+ * Handles OAuth token exchange and refresh using PKCE (Proof Key for Code Exchange).
6
+ * Supports both direct PKCE exchange with OAuth providers and proxy mode via AgentShield.
7
+ *
8
+ * @package @kya-os/mcp-i-core
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.OAuthService = void 0;
12
+ /**
13
+ * Service for OAuth token exchange and refresh
14
+ */
15
+ class OAuthService {
16
+ config;
17
+ constructor(config) {
18
+ this.config = {
19
+ configService: config.configService,
20
+ fetchProvider: config.fetchProvider,
21
+ agentShieldApiUrl: config.agentShieldApiUrl,
22
+ agentShieldApiKey: config.agentShieldApiKey,
23
+ projectId: config.projectId,
24
+ logger: config.logger || (() => { }),
25
+ };
26
+ }
27
+ /**
28
+ * Exchange authorization code for IDP tokens using PKCE
29
+ *
30
+ * For PKCE providers: Exchanges code directly with OAuth provider (no client secret)
31
+ * For proxy mode: Exchanges code via AgentShield API
32
+ *
33
+ * @param provider - OAuth provider name (e.g., "github", "google")
34
+ * @param code - Authorization code from OAuth callback
35
+ * @param codeVerifier - PKCE code verifier (optional for non-PKCE providers in proxy mode)
36
+ * @param redirectUri - Redirect URI used in authorization request
37
+ * @returns IDP tokens (access_token, refresh_token, expires_at, etc.)
38
+ */
39
+ async exchangeToken(provider, code, codeVerifier, redirectUri) {
40
+ // Fetch provider config
41
+ const oauthConfig = await this.config.configService.getOAuthConfig(this.config.projectId);
42
+ const providerConfig = oauthConfig.providers[provider];
43
+ if (!providerConfig) {
44
+ throw new Error(`Provider "${provider}" not configured for project "${this.config.projectId}"`);
45
+ }
46
+ // For PKCE providers, require codeVerifier
47
+ if (providerConfig.supportsPKCE && !providerConfig.proxyMode) {
48
+ if (!codeVerifier) {
49
+ throw new Error(`Provider "${provider}" requires PKCE code_verifier for token exchange`);
50
+ }
51
+ return this.exchangeTokenPKCE(providerConfig, code, codeVerifier, redirectUri || "");
52
+ }
53
+ // For proxy mode, codeVerifier is optional (only included if PKCE is supported)
54
+ if (providerConfig.proxyMode) {
55
+ return this.exchangeTokenProxy(providerConfig, code, codeVerifier, redirectUri || "");
56
+ }
57
+ throw new Error(`Provider "${provider}" configuration is invalid: must support PKCE or use proxy mode`);
58
+ }
59
+ /**
60
+ * Exchange token directly with OAuth provider using PKCE
61
+ */
62
+ async exchangeTokenPKCE(providerConfig, code, codeVerifier, redirectUri) {
63
+ this.config.logger("[OAuthService] Exchanging token with PKCE", {
64
+ provider: providerConfig.authorizationUrl,
65
+ tokenUrl: providerConfig.tokenUrl,
66
+ hasClientSecret: !!providerConfig.clientSecret,
67
+ });
68
+ // Build token exchange parameters
69
+ // Note: GitHub OAuth Apps require client_secret even with PKCE
70
+ // (GitHub Apps can use PKCE without client_secret, but OAuth Apps cannot)
71
+ const params = {
72
+ grant_type: "authorization_code",
73
+ code,
74
+ redirect_uri: redirectUri,
75
+ client_id: providerConfig.clientId,
76
+ code_verifier: codeVerifier,
77
+ };
78
+ // Include client_secret if provider has one configured
79
+ // This is required for GitHub OAuth Apps and other providers that need it
80
+ if (providerConfig.clientSecret) {
81
+ params.client_secret = providerConfig.clientSecret;
82
+ }
83
+ const response = await this.config.fetchProvider.fetch(providerConfig.tokenUrl, {
84
+ method: "POST",
85
+ headers: {
86
+ "Content-Type": "application/x-www-form-urlencoded",
87
+ Accept: "application/json",
88
+ },
89
+ body: new URLSearchParams(params).toString(),
90
+ });
91
+ if (!response.ok) {
92
+ const errorText = await response.text().catch(() => "Unknown error");
93
+ let errorData;
94
+ try {
95
+ errorData = JSON.parse(errorText);
96
+ }
97
+ catch {
98
+ errorData = { error: errorText };
99
+ }
100
+ const errorMessage = errorData.error_description || errorData.error || errorText;
101
+ this.config.logger("[OAuthService] Token exchange failed", {
102
+ status: response.status,
103
+ error: errorMessage,
104
+ provider: providerConfig.tokenUrl,
105
+ });
106
+ throw new Error(`Token exchange failed: ${errorMessage} (${response.status})`);
107
+ }
108
+ const tokens = await response.json();
109
+ // GitHub returns errors with 200 status - check for error field first
110
+ if (tokens.error) {
111
+ this.config.logger("[OAuthService] Token exchange returned error (200 status)", {
112
+ error: tokens.error,
113
+ errorDescription: tokens.error_description,
114
+ errorUri: tokens.error_uri,
115
+ provider: providerConfig.tokenUrl,
116
+ responseKeys: Object.keys(tokens),
117
+ });
118
+ throw new Error(`Token exchange failed: ${tokens.error_description || tokens.error}`);
119
+ }
120
+ // Validate required fields
121
+ if (!tokens.access_token) {
122
+ this.config.logger("[OAuthService] Token response missing access_token", {
123
+ responseKeys: Object.keys(tokens),
124
+ provider: providerConfig.tokenUrl,
125
+ });
126
+ throw new Error("Token response missing access_token");
127
+ }
128
+ // Calculate expiration timestamp
129
+ const expiresIn = tokens.expires_in || 3600; // Default 1 hour
130
+ const expiresAt = Date.now() + expiresIn * 1000;
131
+ const idpTokens = {
132
+ access_token: tokens.access_token,
133
+ refresh_token: tokens.refresh_token,
134
+ expires_in: expiresIn,
135
+ expires_at: expiresAt,
136
+ token_type: tokens.token_type || "Bearer",
137
+ scope: tokens.scope,
138
+ };
139
+ this.config.logger("[OAuthService] Token exchange successful", {
140
+ provider: providerConfig.tokenUrl,
141
+ expiresAt: new Date(expiresAt).toISOString(),
142
+ hasRefreshToken: !!idpTokens.refresh_token,
143
+ });
144
+ return idpTokens;
145
+ }
146
+ /**
147
+ * Exchange token via AgentShield proxy (for providers that require proxy mode)
148
+ *
149
+ * Note: For Phase 3 two-step flow, OAuth tokens are retrieved separately via
150
+ * OAuthTokenRetrievalService in the callback handler. This method maintains
151
+ * backward compatibility for direct proxy mode usage.
152
+ */
153
+ async exchangeTokenProxy(providerConfig, code, codeVerifier, redirectUri) {
154
+ // Exchange via AgentShield proxy endpoint
155
+ const proxyUrl = `${this.config.agentShieldApiUrl}/api/v1/oauth/token`;
156
+ this.config.logger("[OAuthService] Exchanging token via proxy", {
157
+ proxyUrl,
158
+ provider: providerConfig.authorizationUrl,
159
+ hasCodeVerifier: !!codeVerifier,
160
+ supportsPKCE: providerConfig.supportsPKCE,
161
+ });
162
+ // Build request body - only include code_verifier if PKCE is supported and provided
163
+ const requestBody = {
164
+ grant_type: "authorization_code",
165
+ code,
166
+ redirect_uri: redirectUri || "",
167
+ provider: providerConfig.authorizationUrl,
168
+ project_id: this.config.projectId,
169
+ };
170
+ // Include code_verifier only if provider supports PKCE and verifier is provided
171
+ if (providerConfig.supportsPKCE && codeVerifier) {
172
+ requestBody.code_verifier = codeVerifier;
173
+ }
174
+ const response = await this.config.fetchProvider.fetch(proxyUrl, {
175
+ method: "POST",
176
+ headers: {
177
+ "Content-Type": "application/json",
178
+ Authorization: `Bearer ${this.config.agentShieldApiKey}`,
179
+ },
180
+ body: JSON.stringify(requestBody),
181
+ });
182
+ if (!response.ok) {
183
+ const errorText = await response.text().catch(() => "Unknown error");
184
+ let errorData;
185
+ try {
186
+ errorData = JSON.parse(errorText);
187
+ }
188
+ catch {
189
+ errorData = { error: errorText };
190
+ }
191
+ const errorMessage = errorData.error_description || errorData.error || errorText;
192
+ this.config.logger("[OAuthService] Proxy token exchange failed", {
193
+ status: response.status,
194
+ error: errorMessage,
195
+ proxyUrl,
196
+ });
197
+ throw new Error(`Proxy token exchange failed: ${errorMessage} (${response.status})`);
198
+ }
199
+ const result = await response.json();
200
+ const tokens = result.data || result;
201
+ // Validate required fields
202
+ if (!tokens.access_token) {
203
+ throw new Error("Proxy token response missing access_token");
204
+ }
205
+ // Calculate expiration timestamp
206
+ const expiresIn = tokens.expires_in || 3600; // Default 1 hour
207
+ const expiresAt = Date.now() + expiresIn * 1000;
208
+ const idpTokens = {
209
+ access_token: tokens.access_token,
210
+ refresh_token: tokens.refresh_token,
211
+ expires_in: expiresIn,
212
+ expires_at: expiresAt,
213
+ token_type: tokens.token_type || "Bearer",
214
+ scope: tokens.scope,
215
+ };
216
+ this.config.logger("[OAuthService] Proxy token exchange successful", {
217
+ proxyUrl,
218
+ expiresAt: new Date(expiresAt).toISOString(),
219
+ hasRefreshToken: !!idpTokens.refresh_token,
220
+ });
221
+ return idpTokens;
222
+ }
223
+ /**
224
+ * Refresh IDP access token using refresh token
225
+ *
226
+ * For PKCE providers: Refreshes directly with OAuth provider
227
+ * For proxy mode: Refreshes via AgentShield API
228
+ *
229
+ * @param provider - OAuth provider name
230
+ * @param refreshToken - Refresh token from previous token exchange
231
+ * @returns New IDP tokens or null if refresh failed
232
+ */
233
+ async refreshToken(provider, refreshToken) {
234
+ // Fetch provider config
235
+ const oauthConfig = await this.config.configService.getOAuthConfig(this.config.projectId);
236
+ const providerConfig = oauthConfig.providers[provider];
237
+ if (!providerConfig) {
238
+ this.config.logger("[OAuthService] Provider not found for refresh", {
239
+ provider,
240
+ });
241
+ return null;
242
+ }
243
+ // For PKCE providers, refresh directly with OAuth provider
244
+ if (providerConfig.supportsPKCE && !providerConfig.proxyMode) {
245
+ return this.refreshTokenPKCE(providerConfig, refreshToken);
246
+ }
247
+ // For proxy mode, refresh via AgentShield
248
+ if (providerConfig.proxyMode) {
249
+ return this.refreshTokenProxy(providerConfig, refreshToken);
250
+ }
251
+ return null;
252
+ }
253
+ /**
254
+ * Refresh token directly with OAuth provider using PKCE
255
+ */
256
+ async refreshTokenPKCE(providerConfig, refreshToken) {
257
+ this.config.logger("[OAuthService] Refreshing token with PKCE", {
258
+ provider: providerConfig.tokenUrl,
259
+ });
260
+ try {
261
+ const response = await this.config.fetchProvider.fetch(providerConfig.tokenUrl, {
262
+ method: "POST",
263
+ headers: {
264
+ "Content-Type": "application/x-www-form-urlencoded",
265
+ Accept: "application/json",
266
+ },
267
+ body: new URLSearchParams({
268
+ grant_type: "refresh_token",
269
+ refresh_token: refreshToken,
270
+ client_id: providerConfig.clientId,
271
+ }).toString(),
272
+ });
273
+ if (!response.ok) {
274
+ this.config.logger("[OAuthService] Token refresh failed", {
275
+ status: response.status,
276
+ provider: providerConfig.tokenUrl,
277
+ });
278
+ return null;
279
+ }
280
+ const tokens = await response.json();
281
+ if (!tokens.access_token) {
282
+ this.config.logger("[OAuthService] Token refresh response missing access_token");
283
+ return null;
284
+ }
285
+ // Calculate expiration timestamp
286
+ const expiresIn = tokens.expires_in || 3600; // Default 1 hour
287
+ const expiresAt = Date.now() + expiresIn * 1000;
288
+ const idpTokens = {
289
+ access_token: tokens.access_token,
290
+ refresh_token: tokens.refresh_token || refreshToken, // Use new refresh token if provided, otherwise keep old one
291
+ expires_in: expiresIn,
292
+ expires_at: expiresAt,
293
+ token_type: tokens.token_type || "Bearer",
294
+ scope: tokens.scope,
295
+ };
296
+ this.config.logger("[OAuthService] Token refresh successful", {
297
+ provider: providerConfig.tokenUrl,
298
+ expiresAt: new Date(expiresAt).toISOString(),
299
+ });
300
+ return idpTokens;
301
+ }
302
+ catch (error) {
303
+ this.config.logger("[OAuthService] Token refresh error", {
304
+ error: error instanceof Error ? error.message : String(error),
305
+ provider: providerConfig.tokenUrl,
306
+ });
307
+ return null;
308
+ }
309
+ }
310
+ /**
311
+ * Refresh token via AgentShield proxy
312
+ */
313
+ async refreshTokenProxy(providerConfig, refreshToken) {
314
+ const proxyUrl = `${this.config.agentShieldApiUrl}/api/v1/oauth/token`;
315
+ this.config.logger("[OAuthService] Refreshing token via proxy", {
316
+ proxyUrl,
317
+ provider: providerConfig.authorizationUrl,
318
+ });
319
+ try {
320
+ const response = await this.config.fetchProvider.fetch(proxyUrl, {
321
+ method: "POST",
322
+ headers: {
323
+ "Content-Type": "application/json",
324
+ Authorization: `Bearer ${this.config.agentShieldApiKey}`,
325
+ },
326
+ body: JSON.stringify({
327
+ grant_type: "refresh_token",
328
+ refresh_token: refreshToken,
329
+ provider: providerConfig.authorizationUrl,
330
+ project_id: this.config.projectId,
331
+ }),
332
+ });
333
+ if (!response.ok) {
334
+ this.config.logger("[OAuthService] Proxy token refresh failed", {
335
+ status: response.status,
336
+ proxyUrl,
337
+ });
338
+ return null;
339
+ }
340
+ const result = await response.json();
341
+ const tokens = result.data || result;
342
+ if (!tokens.access_token) {
343
+ this.config.logger("[OAuthService] Proxy token refresh response missing access_token");
344
+ return null;
345
+ }
346
+ // Calculate expiration timestamp
347
+ const expiresIn = tokens.expires_in || 3600; // Default 1 hour
348
+ const expiresAt = Date.now() + expiresIn * 1000;
349
+ const idpTokens = {
350
+ access_token: tokens.access_token,
351
+ refresh_token: tokens.refresh_token || refreshToken,
352
+ expires_in: expiresIn,
353
+ expires_at: expiresAt,
354
+ token_type: tokens.token_type || "Bearer",
355
+ scope: tokens.scope,
356
+ };
357
+ this.config.logger("[OAuthService] Proxy token refresh successful", {
358
+ proxyUrl,
359
+ expiresAt: new Date(expiresAt).toISOString(),
360
+ });
361
+ return idpTokens;
362
+ }
363
+ catch (error) {
364
+ this.config.logger("[OAuthService] Proxy token refresh error", {
365
+ error: error instanceof Error ? error.message : String(error),
366
+ proxyUrl,
367
+ });
368
+ return null;
369
+ }
370
+ }
371
+ }
372
+ exports.OAuthService = OAuthService;
373
+ //# sourceMappingURL=oauth-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-service.js","sourceRoot":"","sources":["../../src/services/oauth-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OAuth Token Retrieval Service
3
+ *
4
+ * Retrieves OAuth tokens from AgentShield after receiving delegation token.
5
+ * Implements the two-step token flow for Phase 3 custom IDP support.
6
+ *
7
+ * @package @kya-os/mcp-i-core
8
+ */
9
+ import type { IdpTokens } from "@kya-os/contracts/config";
10
+ /**
11
+ * Configuration for OAuthTokenRetrievalService
12
+ */
13
+ export interface OAuthTokenRetrievalServiceConfig {
14
+ /** AgentShield API base URL */
15
+ baseUrl: string;
16
+ /** Fetch implementation */
17
+ fetchProvider: typeof fetch;
18
+ /** Optional logger callback */
19
+ logger?: (message: string, data?: any) => void;
20
+ /** Optional retry configuration */
21
+ retryConfig?: {
22
+ maxRetries?: number;
23
+ retryDelay?: number;
24
+ retryBackoff?: number;
25
+ };
26
+ }
27
+ /**
28
+ * Service for retrieving OAuth tokens from AgentShield
29
+ */
30
+ export declare class OAuthTokenRetrievalService {
31
+ private config;
32
+ constructor(config: OAuthTokenRetrievalServiceConfig);
33
+ /**
34
+ * Retrieve OAuth tokens from AgentShield
35
+ *
36
+ * @param delegationId - Delegation ID from token exchange response
37
+ * @param delegationToken - Delegation token (JWT) for authorization
38
+ * @returns OAuth tokens mapped to IdpTokens format, or null if unavailable
39
+ */
40
+ retrieveTokens(delegationId: string, delegationToken: string): Promise<IdpTokens | null>;
41
+ /**
42
+ * Map AgentShield response to IdpTokens format
43
+ *
44
+ * @param data - Response data from AgentShield
45
+ * @returns IdpTokens object
46
+ */
47
+ private mapToIdpTokens;
48
+ }
49
+ //# sourceMappingURL=oauth-token-retrieval.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-token-retrieval.service.d.ts","sourceRoot":"","sources":["../../src/services/oauth-token-retrieval.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,aAAa,EAAE,OAAO,KAAK,CAAC;IAC5B,+BAA+B;IAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/C,mCAAmC;IACnC,WAAW,CAAC,EAAE;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAiCD;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAEZ;gBAEU,MAAM,EAAE,gCAAgC;IAmBpD;;;;;;OAMG;IACG,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAqH5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;CAuBvB"}