@google/gemini-cli-core 0.1.12-nightly.250714.b018e2d3 → 0.1.13

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 (178) hide show
  1. package/README.md +8 -2
  2. package/dist/google-gemini-cli-core-0.1.12.tgz +0 -0
  3. package/dist/src/code_assist/oauth2.js +39 -5
  4. package/dist/src/code_assist/oauth2.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.test.js +8 -3
  6. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  7. package/dist/src/code_assist/server.test.js +10 -2
  8. package/dist/src/code_assist/server.test.js.map +1 -1
  9. package/dist/src/config/config.d.ts +28 -5
  10. package/dist/src/config/config.js +34 -18
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/config.test.js +28 -3
  13. package/dist/src/config/config.test.js.map +1 -1
  14. package/dist/src/core/client.d.ts +3 -1
  15. package/dist/src/core/client.js +38 -1
  16. package/dist/src/core/client.js.map +1 -1
  17. package/dist/src/core/client.test.js +94 -37
  18. package/dist/src/core/client.test.js.map +1 -1
  19. package/dist/src/core/contentGenerator.d.ts +2 -1
  20. package/dist/src/core/contentGenerator.js +4 -3
  21. package/dist/src/core/contentGenerator.js.map +1 -1
  22. package/dist/src/core/contentGenerator.test.js +12 -5
  23. package/dist/src/core/contentGenerator.test.js.map +1 -1
  24. package/dist/src/core/coreToolScheduler.js +14 -1
  25. package/dist/src/core/coreToolScheduler.js.map +1 -1
  26. package/dist/src/core/coreToolScheduler.test.js +84 -2
  27. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  28. package/dist/src/core/modelCheck.d.ts +1 -1
  29. package/dist/src/core/modelCheck.js +10 -3
  30. package/dist/src/core/modelCheck.js.map +1 -1
  31. package/dist/src/core/nonInteractiveToolExecutor.test.js +3 -0
  32. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  33. package/dist/src/core/turn.d.ts +6 -2
  34. package/dist/src/core/turn.js +1 -0
  35. package/dist/src/core/turn.js.map +1 -1
  36. package/dist/src/index.d.ts +9 -0
  37. package/dist/src/index.js +8 -0
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  40. package/dist/src/mcp/oauth-provider.js +446 -0
  41. package/dist/src/mcp/oauth-provider.js.map +1 -0
  42. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  43. package/dist/src/mcp/oauth-provider.test.js +520 -0
  44. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  45. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  46. package/dist/src/mcp/oauth-token-storage.js +149 -0
  47. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  48. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  49. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  50. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  51. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  52. package/dist/src/mcp/oauth-utils.js +183 -0
  53. package/dist/src/mcp/oauth-utils.js.map +1 -0
  54. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  55. package/dist/src/mcp/oauth-utils.test.js +144 -0
  56. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  57. package/dist/src/services/gitService.js +1 -5
  58. package/dist/src/services/gitService.js.map +1 -1
  59. package/dist/src/services/gitService.test.js +1 -6
  60. package/dist/src/services/gitService.test.js.map +1 -1
  61. package/dist/src/services/ideContext.d.ts +126 -0
  62. package/dist/src/services/ideContext.js +98 -0
  63. package/dist/src/services/ideContext.js.map +1 -0
  64. package/dist/src/services/ideContext.test.d.ts +6 -0
  65. package/dist/src/services/ideContext.test.js +111 -0
  66. package/dist/src/services/ideContext.test.js.map +1 -0
  67. package/dist/src/services/loopDetectionService.d.ts +51 -0
  68. package/dist/src/services/loopDetectionService.js +232 -0
  69. package/dist/src/services/loopDetectionService.js.map +1 -0
  70. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  71. package/dist/src/services/loopDetectionService.test.js +339 -0
  72. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  73. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +4 -1
  74. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +54 -4
  75. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  76. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
  77. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +9 -0
  78. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  79. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  80. package/dist/src/telemetry/integration.test.circular.js +53 -0
  81. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  82. package/dist/src/telemetry/loggers.d.ts +2 -1
  83. package/dist/src/telemetry/loggers.js +17 -1
  84. package/dist/src/telemetry/loggers.js.map +1 -1
  85. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  86. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  87. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  88. package/dist/src/telemetry/types.d.ts +12 -1
  89. package/dist/src/telemetry/types.js +16 -0
  90. package/dist/src/telemetry/types.js.map +1 -1
  91. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  92. package/dist/src/telemetry/uiTelemetry.js +7 -0
  93. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  94. package/dist/src/telemetry/uiTelemetry.test.js +92 -0
  95. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  96. package/dist/src/tools/edit.d.ts +7 -12
  97. package/dist/src/tools/edit.js +24 -28
  98. package/dist/src/tools/edit.js.map +1 -1
  99. package/dist/src/tools/glob.d.ts +1 -14
  100. package/dist/src/tools/glob.js +13 -36
  101. package/dist/src/tools/glob.js.map +1 -1
  102. package/dist/src/tools/glob.test.js +4 -3
  103. package/dist/src/tools/glob.test.js.map +1 -1
  104. package/dist/src/tools/grep.d.ts +3 -6
  105. package/dist/src/tools/grep.js +12 -18
  106. package/dist/src/tools/grep.js.map +1 -1
  107. package/dist/src/tools/grep.test.js +4 -1
  108. package/dist/src/tools/grep.test.js.map +1 -1
  109. package/dist/src/tools/ls.d.ts +1 -12
  110. package/dist/src/tools/ls.js +8 -30
  111. package/dist/src/tools/ls.js.map +1 -1
  112. package/dist/src/tools/mcp-client.d.ts +55 -1
  113. package/dist/src/tools/mcp-client.js +165 -140
  114. package/dist/src/tools/mcp-client.js.map +1 -1
  115. package/dist/src/tools/mcp-client.test.js +127 -624
  116. package/dist/src/tools/mcp-client.test.js.map +1 -1
  117. package/dist/src/tools/mcp-tool.d.ts +11 -5
  118. package/dist/src/tools/mcp-tool.js +33 -9
  119. package/dist/src/tools/mcp-tool.js.map +1 -1
  120. package/dist/src/tools/mcp-tool.test.js +40 -24
  121. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  122. package/dist/src/tools/memoryTool.js +2 -2
  123. package/dist/src/tools/memoryTool.js.map +1 -1
  124. package/dist/src/tools/read-file.d.ts +3 -3
  125. package/dist/src/tools/read-file.js +10 -10
  126. package/dist/src/tools/read-file.js.map +1 -1
  127. package/dist/src/tools/read-file.test.js +2 -1
  128. package/dist/src/tools/read-file.test.js.map +1 -1
  129. package/dist/src/tools/read-many-files.d.ts +1 -7
  130. package/dist/src/tools/read-many-files.js +12 -21
  131. package/dist/src/tools/read-many-files.js.map +1 -1
  132. package/dist/src/tools/read-many-files.test.js +2 -1
  133. package/dist/src/tools/read-many-files.test.js.map +1 -1
  134. package/dist/src/tools/shell.js +11 -4
  135. package/dist/src/tools/shell.js.map +1 -1
  136. package/dist/src/tools/shell.test.js +60 -0
  137. package/dist/src/tools/shell.test.js.map +1 -1
  138. package/dist/src/tools/tool-registry.d.ts +0 -1
  139. package/dist/src/tools/tool-registry.js +12 -9
  140. package/dist/src/tools/tool-registry.js.map +1 -1
  141. package/dist/src/tools/tool-registry.test.js +109 -38
  142. package/dist/src/tools/tool-registry.test.js.map +1 -1
  143. package/dist/src/tools/tools.d.ts +37 -2
  144. package/dist/src/tools/tools.js +25 -2
  145. package/dist/src/tools/tools.js.map +1 -1
  146. package/dist/src/tools/web-fetch.js +7 -2
  147. package/dist/src/tools/web-fetch.js.map +1 -1
  148. package/dist/src/tools/web-fetch.test.js +1 -0
  149. package/dist/src/tools/web-fetch.test.js.map +1 -1
  150. package/dist/src/tools/web-search.js +2 -2
  151. package/dist/src/tools/web-search.js.map +1 -1
  152. package/dist/src/tools/write-file.d.ts +0 -8
  153. package/dist/src/tools/write-file.js +14 -23
  154. package/dist/src/tools/write-file.js.map +1 -1
  155. package/dist/src/utils/browser.d.ts +13 -0
  156. package/dist/src/utils/browser.js +49 -0
  157. package/dist/src/utils/browser.js.map +1 -0
  158. package/dist/src/utils/errors.js +4 -4
  159. package/dist/src/utils/errors.js.map +1 -1
  160. package/dist/src/utils/fileUtils.js +2 -2
  161. package/dist/src/utils/fileUtils.js.map +1 -1
  162. package/dist/src/utils/quotaErrorDetection.js +2 -9
  163. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  164. package/dist/src/utils/retry.d.ts +6 -0
  165. package/dist/src/utils/retry.js +1 -1
  166. package/dist/src/utils/retry.js.map +1 -1
  167. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  168. package/dist/src/utils/safeJsonStringify.js +25 -0
  169. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  170. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  171. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  172. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  173. package/dist/src/utils/summarizer.d.ts +1 -1
  174. package/dist/src/utils/summarizer.js +10 -9
  175. package/dist/src/utils/summarizer.js.map +1 -1
  176. package/dist/src/utils/summarizer.test.js +1 -1
  177. package/dist/tsconfig.tsbuildinfo +1 -1
  178. package/package.json +3 -3
@@ -0,0 +1,520 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import * as http from 'node:http';
8
+ import * as crypto from 'node:crypto';
9
+ import open from 'open';
10
+ import { MCPOAuthProvider, } from './oauth-provider.js';
11
+ import { MCPOAuthTokenStorage } from './oauth-token-storage.js';
12
+ // Mock dependencies
13
+ vi.mock('open');
14
+ vi.mock('node:crypto');
15
+ vi.mock('./oauth-token-storage.js');
16
+ // Mock fetch globally
17
+ const mockFetch = vi.fn();
18
+ global.fetch = mockFetch;
19
+ // Define a reusable mock server with .listen, .close, and .on methods
20
+ const mockHttpServer = {
21
+ listen: vi.fn(),
22
+ close: vi.fn(),
23
+ on: vi.fn(),
24
+ };
25
+ vi.mock('node:http', () => ({
26
+ createServer: vi.fn(() => mockHttpServer),
27
+ }));
28
+ describe('MCPOAuthProvider', () => {
29
+ const mockConfig = {
30
+ enabled: true,
31
+ clientId: 'test-client-id',
32
+ clientSecret: 'test-client-secret',
33
+ authorizationUrl: 'https://auth.example.com/authorize',
34
+ tokenUrl: 'https://auth.example.com/token',
35
+ scopes: ['read', 'write'],
36
+ redirectUri: 'http://localhost:7777/oauth/callback',
37
+ };
38
+ const mockToken = {
39
+ accessToken: 'access_token_123',
40
+ refreshToken: 'refresh_token_456',
41
+ tokenType: 'Bearer',
42
+ scope: 'read write',
43
+ expiresAt: Date.now() + 3600000,
44
+ };
45
+ const mockTokenResponse = {
46
+ access_token: 'access_token_123',
47
+ token_type: 'Bearer',
48
+ expires_in: 3600,
49
+ refresh_token: 'refresh_token_456',
50
+ scope: 'read write',
51
+ };
52
+ beforeEach(() => {
53
+ vi.clearAllMocks();
54
+ vi.spyOn(console, 'log').mockImplementation(() => { });
55
+ vi.spyOn(console, 'warn').mockImplementation(() => { });
56
+ vi.spyOn(console, 'error').mockImplementation(() => { });
57
+ // Mock crypto functions
58
+ vi.mocked(crypto.randomBytes).mockImplementation((size) => {
59
+ if (size === 32)
60
+ return Buffer.from('code_verifier_mock_32_bytes_long');
61
+ if (size === 16)
62
+ return Buffer.from('state_mock_16_by');
63
+ return Buffer.alloc(size);
64
+ });
65
+ vi.mocked(crypto.createHash).mockReturnValue({
66
+ update: vi.fn().mockReturnThis(),
67
+ digest: vi.fn().mockReturnValue('code_challenge_mock'),
68
+ });
69
+ // Mock randomBytes to return predictable values for state
70
+ vi.mocked(crypto.randomBytes).mockImplementation((size) => {
71
+ if (size === 32) {
72
+ return Buffer.from('mock_code_verifier_32_bytes_long_string');
73
+ }
74
+ else if (size === 16) {
75
+ return Buffer.from('mock_state_16_bytes');
76
+ }
77
+ return Buffer.alloc(size);
78
+ });
79
+ // Mock token storage
80
+ vi.mocked(MCPOAuthTokenStorage.saveToken).mockResolvedValue(undefined);
81
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(null);
82
+ });
83
+ afterEach(() => {
84
+ vi.restoreAllMocks();
85
+ });
86
+ describe('authenticate', () => {
87
+ it('should perform complete OAuth flow with PKCE', async () => {
88
+ // Mock HTTP server callback
89
+ let callbackHandler;
90
+ vi.mocked(http.createServer).mockImplementation((handler) => {
91
+ callbackHandler = handler;
92
+ return mockHttpServer;
93
+ });
94
+ mockHttpServer.listen.mockImplementation((port, callback) => {
95
+ callback?.();
96
+ // Simulate OAuth callback
97
+ setTimeout(() => {
98
+ const mockReq = {
99
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
100
+ };
101
+ const mockRes = {
102
+ writeHead: vi.fn(),
103
+ end: vi.fn(),
104
+ };
105
+ callbackHandler(mockReq, mockRes);
106
+ }, 10);
107
+ });
108
+ // Mock token exchange
109
+ mockFetch.mockResolvedValueOnce({
110
+ ok: true,
111
+ json: () => Promise.resolve(mockTokenResponse),
112
+ });
113
+ const result = await MCPOAuthProvider.authenticate('test-server', mockConfig);
114
+ expect(result).toEqual({
115
+ accessToken: 'access_token_123',
116
+ refreshToken: 'refresh_token_456',
117
+ tokenType: 'Bearer',
118
+ scope: 'read write',
119
+ expiresAt: expect.any(Number),
120
+ });
121
+ expect(open).toHaveBeenCalledWith(expect.stringContaining('authorize'));
122
+ expect(MCPOAuthTokenStorage.saveToken).toHaveBeenCalledWith('test-server', expect.objectContaining({ accessToken: 'access_token_123' }), 'test-client-id', 'https://auth.example.com/token');
123
+ });
124
+ it('should handle OAuth discovery when no authorization URL provided', async () => {
125
+ // Use a mutable config object
126
+ const configWithoutAuth = { ...mockConfig };
127
+ delete configWithoutAuth.authorizationUrl;
128
+ delete configWithoutAuth.tokenUrl;
129
+ const mockResourceMetadata = {
130
+ authorization_servers: ['https://discovered.auth.com'],
131
+ };
132
+ const mockAuthServerMetadata = {
133
+ authorization_endpoint: 'https://discovered.auth.com/authorize',
134
+ token_endpoint: 'https://discovered.auth.com/token',
135
+ scopes_supported: ['read', 'write'],
136
+ };
137
+ mockFetch
138
+ .mockResolvedValueOnce({
139
+ ok: true,
140
+ json: () => Promise.resolve(mockResourceMetadata),
141
+ })
142
+ .mockResolvedValueOnce({
143
+ ok: true,
144
+ json: () => Promise.resolve(mockAuthServerMetadata),
145
+ });
146
+ // Patch config after discovery
147
+ configWithoutAuth.authorizationUrl =
148
+ mockAuthServerMetadata.authorization_endpoint;
149
+ configWithoutAuth.tokenUrl = mockAuthServerMetadata.token_endpoint;
150
+ configWithoutAuth.scopes = mockAuthServerMetadata.scopes_supported;
151
+ // Setup callback handler
152
+ let callbackHandler;
153
+ vi.mocked(http.createServer).mockImplementation((handler) => {
154
+ callbackHandler = handler;
155
+ return mockHttpServer;
156
+ });
157
+ mockHttpServer.listen.mockImplementation((port, callback) => {
158
+ callback?.();
159
+ setTimeout(() => {
160
+ const mockReq = {
161
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
162
+ };
163
+ const mockRes = {
164
+ writeHead: vi.fn(),
165
+ end: vi.fn(),
166
+ };
167
+ callbackHandler(mockReq, mockRes);
168
+ }, 10);
169
+ });
170
+ // Mock token exchange with discovered endpoint
171
+ mockFetch.mockResolvedValueOnce({
172
+ ok: true,
173
+ json: () => Promise.resolve(mockTokenResponse),
174
+ });
175
+ const result = await MCPOAuthProvider.authenticate('test-server', configWithoutAuth, 'https://api.example.com');
176
+ expect(result).toBeDefined();
177
+ expect(mockFetch).toHaveBeenCalledWith('https://discovered.auth.com/token', expect.objectContaining({
178
+ method: 'POST',
179
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
180
+ }));
181
+ });
182
+ it('should perform dynamic client registration when no client ID provided', async () => {
183
+ const configWithoutClient = { ...mockConfig };
184
+ delete configWithoutClient.clientId;
185
+ const mockRegistrationResponse = {
186
+ client_id: 'dynamic_client_id',
187
+ client_secret: 'dynamic_client_secret',
188
+ redirect_uris: ['http://localhost:7777/oauth/callback'],
189
+ grant_types: ['authorization_code', 'refresh_token'],
190
+ response_types: ['code'],
191
+ token_endpoint_auth_method: 'none',
192
+ };
193
+ const mockAuthServerMetadata = {
194
+ authorization_endpoint: 'https://auth.example.com/authorize',
195
+ token_endpoint: 'https://auth.example.com/token',
196
+ registration_endpoint: 'https://auth.example.com/register',
197
+ };
198
+ mockFetch
199
+ .mockResolvedValueOnce({
200
+ ok: true,
201
+ json: () => Promise.resolve(mockAuthServerMetadata),
202
+ })
203
+ .mockResolvedValueOnce({
204
+ ok: true,
205
+ json: () => Promise.resolve(mockRegistrationResponse),
206
+ });
207
+ // Setup callback handler
208
+ let callbackHandler;
209
+ vi.mocked(http.createServer).mockImplementation((handler) => {
210
+ callbackHandler = handler;
211
+ return mockHttpServer;
212
+ });
213
+ mockHttpServer.listen.mockImplementation((port, callback) => {
214
+ callback?.();
215
+ setTimeout(() => {
216
+ const mockReq = {
217
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
218
+ };
219
+ const mockRes = {
220
+ writeHead: vi.fn(),
221
+ end: vi.fn(),
222
+ };
223
+ callbackHandler(mockReq, mockRes);
224
+ }, 10);
225
+ });
226
+ // Mock token exchange
227
+ mockFetch.mockResolvedValueOnce({
228
+ ok: true,
229
+ json: () => Promise.resolve(mockTokenResponse),
230
+ });
231
+ const result = await MCPOAuthProvider.authenticate('test-server', configWithoutClient);
232
+ expect(result).toBeDefined();
233
+ expect(mockFetch).toHaveBeenCalledWith('https://auth.example.com/register', expect.objectContaining({
234
+ method: 'POST',
235
+ headers: { 'Content-Type': 'application/json' },
236
+ }));
237
+ });
238
+ it('should handle OAuth callback errors', async () => {
239
+ let callbackHandler;
240
+ vi.mocked(http.createServer).mockImplementation((handler) => {
241
+ callbackHandler = handler;
242
+ return mockHttpServer;
243
+ });
244
+ mockHttpServer.listen.mockImplementation((port, callback) => {
245
+ callback?.();
246
+ setTimeout(() => {
247
+ const mockReq = {
248
+ url: '/oauth/callback?error=access_denied&error_description=User%20denied%20access',
249
+ };
250
+ const mockRes = {
251
+ writeHead: vi.fn(),
252
+ end: vi.fn(),
253
+ };
254
+ callbackHandler(mockReq, mockRes);
255
+ }, 10);
256
+ });
257
+ await expect(MCPOAuthProvider.authenticate('test-server', mockConfig)).rejects.toThrow('OAuth error: access_denied');
258
+ });
259
+ it('should handle state mismatch in callback', async () => {
260
+ let callbackHandler;
261
+ vi.mocked(http.createServer).mockImplementation((handler) => {
262
+ callbackHandler = handler;
263
+ return mockHttpServer;
264
+ });
265
+ mockHttpServer.listen.mockImplementation((port, callback) => {
266
+ callback?.();
267
+ setTimeout(() => {
268
+ const mockReq = {
269
+ url: '/oauth/callback?code=auth_code_123&state=wrong_state',
270
+ };
271
+ const mockRes = {
272
+ writeHead: vi.fn(),
273
+ end: vi.fn(),
274
+ };
275
+ callbackHandler(mockReq, mockRes);
276
+ }, 10);
277
+ });
278
+ await expect(MCPOAuthProvider.authenticate('test-server', mockConfig)).rejects.toThrow('State mismatch - possible CSRF attack');
279
+ });
280
+ it('should handle token exchange failure', async () => {
281
+ let callbackHandler;
282
+ vi.mocked(http.createServer).mockImplementation((handler) => {
283
+ callbackHandler = handler;
284
+ return mockHttpServer;
285
+ });
286
+ mockHttpServer.listen.mockImplementation((port, callback) => {
287
+ callback?.();
288
+ setTimeout(() => {
289
+ const mockReq = {
290
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
291
+ };
292
+ const mockRes = {
293
+ writeHead: vi.fn(),
294
+ end: vi.fn(),
295
+ };
296
+ callbackHandler(mockReq, mockRes);
297
+ }, 10);
298
+ });
299
+ mockFetch.mockResolvedValueOnce({
300
+ ok: false,
301
+ status: 400,
302
+ text: () => Promise.resolve('Invalid grant'),
303
+ });
304
+ await expect(MCPOAuthProvider.authenticate('test-server', mockConfig)).rejects.toThrow('Token exchange failed: 400 - Invalid grant');
305
+ });
306
+ it('should handle callback timeout', async () => {
307
+ vi.mocked(http.createServer).mockImplementation(() => mockHttpServer);
308
+ mockHttpServer.listen.mockImplementation((port, callback) => {
309
+ callback?.();
310
+ // Don't trigger callback - simulate timeout
311
+ });
312
+ // Mock setTimeout to trigger timeout immediately
313
+ const originalSetTimeout = global.setTimeout;
314
+ global.setTimeout = vi.fn((callback, delay) => {
315
+ if (delay === 5 * 60 * 1000) {
316
+ // 5 minute timeout
317
+ callback();
318
+ }
319
+ return originalSetTimeout(callback, 0);
320
+ });
321
+ await expect(MCPOAuthProvider.authenticate('test-server', mockConfig)).rejects.toThrow('OAuth callback timeout');
322
+ global.setTimeout = originalSetTimeout;
323
+ });
324
+ });
325
+ describe('refreshAccessToken', () => {
326
+ it('should refresh token successfully', async () => {
327
+ const refreshResponse = {
328
+ access_token: 'new_access_token',
329
+ token_type: 'Bearer',
330
+ expires_in: 3600,
331
+ refresh_token: 'new_refresh_token',
332
+ };
333
+ mockFetch.mockResolvedValueOnce({
334
+ ok: true,
335
+ json: () => Promise.resolve(refreshResponse),
336
+ });
337
+ const result = await MCPOAuthProvider.refreshAccessToken(mockConfig, 'old_refresh_token', 'https://auth.example.com/token');
338
+ expect(result).toEqual(refreshResponse);
339
+ expect(mockFetch).toHaveBeenCalledWith('https://auth.example.com/token', expect.objectContaining({
340
+ method: 'POST',
341
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
342
+ body: expect.stringContaining('grant_type=refresh_token'),
343
+ }));
344
+ });
345
+ it('should include client secret in refresh request when available', async () => {
346
+ mockFetch.mockResolvedValueOnce({
347
+ ok: true,
348
+ json: () => Promise.resolve(mockTokenResponse),
349
+ });
350
+ await MCPOAuthProvider.refreshAccessToken(mockConfig, 'refresh_token', 'https://auth.example.com/token');
351
+ const fetchCall = mockFetch.mock.calls[0];
352
+ expect(fetchCall[1].body).toContain('client_secret=test-client-secret');
353
+ });
354
+ it('should handle refresh token failure', async () => {
355
+ mockFetch.mockResolvedValueOnce({
356
+ ok: false,
357
+ status: 400,
358
+ text: () => Promise.resolve('Invalid refresh token'),
359
+ });
360
+ await expect(MCPOAuthProvider.refreshAccessToken(mockConfig, 'invalid_refresh_token', 'https://auth.example.com/token')).rejects.toThrow('Token refresh failed: 400 - Invalid refresh token');
361
+ });
362
+ });
363
+ describe('getValidToken', () => {
364
+ it('should return valid token when not expired', async () => {
365
+ const validCredentials = {
366
+ serverName: 'test-server',
367
+ token: mockToken,
368
+ clientId: 'test-client-id',
369
+ tokenUrl: 'https://auth.example.com/token',
370
+ updatedAt: Date.now(),
371
+ };
372
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(validCredentials);
373
+ vi.mocked(MCPOAuthTokenStorage.isTokenExpired).mockReturnValue(false);
374
+ const result = await MCPOAuthProvider.getValidToken('test-server', mockConfig);
375
+ expect(result).toBe('access_token_123');
376
+ });
377
+ it('should refresh expired token and return new token', async () => {
378
+ const expiredCredentials = {
379
+ serverName: 'test-server',
380
+ token: { ...mockToken, expiresAt: Date.now() - 3600000 },
381
+ clientId: 'test-client-id',
382
+ tokenUrl: 'https://auth.example.com/token',
383
+ updatedAt: Date.now(),
384
+ };
385
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(expiredCredentials);
386
+ vi.mocked(MCPOAuthTokenStorage.isTokenExpired).mockReturnValue(true);
387
+ const refreshResponse = {
388
+ access_token: 'new_access_token',
389
+ token_type: 'Bearer',
390
+ expires_in: 3600,
391
+ refresh_token: 'new_refresh_token',
392
+ };
393
+ mockFetch.mockResolvedValueOnce({
394
+ ok: true,
395
+ json: () => Promise.resolve(refreshResponse),
396
+ });
397
+ const result = await MCPOAuthProvider.getValidToken('test-server', mockConfig);
398
+ expect(result).toBe('new_access_token');
399
+ expect(MCPOAuthTokenStorage.saveToken).toHaveBeenCalledWith('test-server', expect.objectContaining({ accessToken: 'new_access_token' }), 'test-client-id', 'https://auth.example.com/token');
400
+ });
401
+ it('should return null when no credentials exist', async () => {
402
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(null);
403
+ const result = await MCPOAuthProvider.getValidToken('test-server', mockConfig);
404
+ expect(result).toBeNull();
405
+ });
406
+ it('should handle refresh failure and remove invalid token', async () => {
407
+ const expiredCredentials = {
408
+ serverName: 'test-server',
409
+ token: { ...mockToken, expiresAt: Date.now() - 3600000 },
410
+ clientId: 'test-client-id',
411
+ tokenUrl: 'https://auth.example.com/token',
412
+ updatedAt: Date.now(),
413
+ };
414
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(expiredCredentials);
415
+ vi.mocked(MCPOAuthTokenStorage.isTokenExpired).mockReturnValue(true);
416
+ vi.mocked(MCPOAuthTokenStorage.removeToken).mockResolvedValue(undefined);
417
+ mockFetch.mockResolvedValueOnce({
418
+ ok: false,
419
+ status: 400,
420
+ text: () => Promise.resolve('Invalid refresh token'),
421
+ });
422
+ const result = await MCPOAuthProvider.getValidToken('test-server', mockConfig);
423
+ expect(result).toBeNull();
424
+ expect(MCPOAuthTokenStorage.removeToken).toHaveBeenCalledWith('test-server');
425
+ expect(console.error).toHaveBeenCalledWith(expect.stringContaining('Failed to refresh token'));
426
+ });
427
+ it('should return null for token without refresh capability', async () => {
428
+ const tokenWithoutRefresh = {
429
+ serverName: 'test-server',
430
+ token: {
431
+ ...mockToken,
432
+ refreshToken: undefined,
433
+ expiresAt: Date.now() - 3600000,
434
+ },
435
+ clientId: 'test-client-id',
436
+ tokenUrl: 'https://auth.example.com/token',
437
+ updatedAt: Date.now(),
438
+ };
439
+ vi.mocked(MCPOAuthTokenStorage.getToken).mockResolvedValue(tokenWithoutRefresh);
440
+ vi.mocked(MCPOAuthTokenStorage.isTokenExpired).mockReturnValue(true);
441
+ const result = await MCPOAuthProvider.getValidToken('test-server', mockConfig);
442
+ expect(result).toBeNull();
443
+ });
444
+ });
445
+ describe('PKCE parameter generation', () => {
446
+ it('should generate valid PKCE parameters', async () => {
447
+ // Test is implicit in the authenticate flow tests, but we can verify
448
+ // the crypto mocks are called correctly
449
+ let callbackHandler;
450
+ vi.mocked(http.createServer).mockImplementation((handler) => {
451
+ callbackHandler = handler;
452
+ return mockHttpServer;
453
+ });
454
+ mockHttpServer.listen.mockImplementation((port, callback) => {
455
+ callback?.();
456
+ setTimeout(() => {
457
+ const mockReq = {
458
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
459
+ };
460
+ const mockRes = {
461
+ writeHead: vi.fn(),
462
+ end: vi.fn(),
463
+ };
464
+ callbackHandler(mockReq, mockRes);
465
+ }, 10);
466
+ });
467
+ mockFetch.mockResolvedValueOnce({
468
+ ok: true,
469
+ json: () => Promise.resolve(mockTokenResponse),
470
+ });
471
+ await MCPOAuthProvider.authenticate('test-server', mockConfig);
472
+ expect(crypto.randomBytes).toHaveBeenCalledWith(32); // code verifier
473
+ expect(crypto.randomBytes).toHaveBeenCalledWith(16); // state
474
+ expect(crypto.createHash).toHaveBeenCalledWith('sha256');
475
+ });
476
+ });
477
+ describe('Authorization URL building', () => {
478
+ it('should build correct authorization URL with all parameters', async () => {
479
+ // Mock to capture the URL that would be opened
480
+ let capturedUrl;
481
+ vi.mocked(open).mockImplementation((url) => {
482
+ capturedUrl = url;
483
+ // Return a minimal mock ChildProcess
484
+ return Promise.resolve({
485
+ pid: 1234,
486
+ });
487
+ });
488
+ let callbackHandler;
489
+ vi.mocked(http.createServer).mockImplementation((handler) => {
490
+ callbackHandler = handler;
491
+ return mockHttpServer;
492
+ });
493
+ mockHttpServer.listen.mockImplementation((port, callback) => {
494
+ callback?.();
495
+ setTimeout(() => {
496
+ const mockReq = {
497
+ url: '/oauth/callback?code=auth_code_123&state=bW9ja19zdGF0ZV8xNl9ieXRlcw',
498
+ };
499
+ const mockRes = {
500
+ writeHead: vi.fn(),
501
+ end: vi.fn(),
502
+ };
503
+ callbackHandler(mockReq, mockRes);
504
+ }, 10);
505
+ });
506
+ mockFetch.mockResolvedValueOnce({
507
+ ok: true,
508
+ json: () => Promise.resolve(mockTokenResponse),
509
+ });
510
+ await MCPOAuthProvider.authenticate('test-server', mockConfig);
511
+ expect(capturedUrl).toContain('response_type=code');
512
+ expect(capturedUrl).toContain('client_id=test-client-id');
513
+ expect(capturedUrl).toContain('code_challenge=code_challenge_mock');
514
+ expect(capturedUrl).toContain('code_challenge_method=S256');
515
+ expect(capturedUrl).toContain('scope=read+write');
516
+ expect(capturedUrl).toContain('resource=https%3A%2F%2Fauth.example.com');
517
+ });
518
+ });
519
+ });
520
+ //# sourceMappingURL=oauth-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/oauth-provider.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,gBAAgB,GAIjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAiB,MAAM,0BAA0B,CAAC;AAE/E,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChB,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACvB,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAEpC,sBAAsB;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;AAEzB,sEAAsE;AACtE,MAAM,cAAc,GAAG;IACrB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;IACf,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;CACZ,CAAC;AACF,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC;CAC1C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,UAAU,GAAmB;QACjC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,gBAAgB;QAC1B,YAAY,EAAE,oBAAoB;QAClC,gBAAgB,EAAE,oCAAoC;QACtD,QAAQ,EAAE,gCAAgC;QAC1C,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,WAAW,EAAE,sCAAsC;KACpD,CAAC;IAEF,MAAM,SAAS,GAAkB;QAC/B,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,mBAAmB;QACjC,SAAS,EAAE,QAAQ;QACnB,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;KAChC,CAAC;IAEF,MAAM,iBAAiB,GAAuB;QAC5C,YAAY,EAAE,kBAAkB;QAChC,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,mBAAmB;QAClC,KAAK,EAAE,YAAY;KACpB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAExD,wBAAwB;QACxB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAY,EAAE,EAAE;YAChE,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACxE,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC;YAC3C,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;YAChC,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,qBAAqB,CAAC;SAC7B,CAAC,CAAC;QAE7B,0DAA0D;QAC1D,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE;YACxD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBACvB,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACvE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,4BAA4B;YAC5B,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,0BAA0B;gBAC1B,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAChD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;gBACrB,WAAW,EAAE,kBAAkB;gBAC/B,YAAY,EAAE,mBAAmB;gBACjC,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aAC9B,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACzD,aAAa,EACb,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,EAC5D,gBAAgB,EAChB,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,8BAA8B;YAC9B,MAAM,iBAAiB,GAAmB,EAAE,GAAG,UAAU,EAAE,CAAC;YAC5D,OAAO,iBAAiB,CAAC,gBAAgB,CAAC;YAC1C,OAAO,iBAAiB,CAAC,QAAQ,CAAC;YAElC,MAAM,oBAAoB,GAAG;gBAC3B,qBAAqB,EAAE,CAAC,6BAA6B,CAAC;aACvD,CAAC;YAEF,MAAM,sBAAsB,GAAG;gBAC7B,sBAAsB,EAAE,uCAAuC;gBAC/D,cAAc,EAAE,mCAAmC;gBACnD,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aACpC,CAAC;YAEF,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;aAClD,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC;aACpD,CAAC,CAAC;YAEL,+BAA+B;YAC/B,iBAAiB,CAAC,gBAAgB;gBAChC,sBAAsB,CAAC,sBAAsB,CAAC;YAChD,iBAAiB,CAAC,QAAQ,GAAG,sBAAsB,CAAC,cAAc,CAAC;YACnE,iBAAiB,CAAC,MAAM,GAAG,sBAAsB,CAAC,gBAAgB,CAAC;YAEnE,yBAAyB;YACzB,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAChD,aAAa,EACb,iBAAiB,EACjB,yBAAyB,CAC1B,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,mCAAmC,EACnC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;aACjE,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,mBAAmB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;YAC9C,OAAO,mBAAmB,CAAC,QAAQ,CAAC;YAEpC,MAAM,wBAAwB,GAAoC;gBAChE,SAAS,EAAE,mBAAmB;gBAC9B,aAAa,EAAE,uBAAuB;gBACtC,aAAa,EAAE,CAAC,sCAAsC,CAAC;gBACvD,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;gBACpD,cAAc,EAAE,CAAC,MAAM,CAAC;gBACxB,0BAA0B,EAAE,MAAM;aACnC,CAAC;YAEF,MAAM,sBAAsB,GAAG;gBAC7B,sBAAsB,EAAE,oCAAoC;gBAC5D,cAAc,EAAE,gCAAgC;gBAChD,qBAAqB,EAAE,mCAAmC;aAC3D,CAAC;YAEF,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC;aACpD,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC;aACtD,CAAC,CAAC;YAEL,yBAAyB;YACzB,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAChD,aAAa,EACb,mBAAmB,CACpB,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,mCAAmC,EACnC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,8EAA8E;qBACpF,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CACV,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,sDAAsD;qBAC5D,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,CACV,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,MAAM,MAAM,CACV,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAC7C,GAAG,EAAE,CAAC,cAAwC,CAC/C,CAAC;YAEF,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,4CAA4C;YAC9C,CAAC,CAAC,CAAC;YAEH,iDAAiD;YACjD,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC;YAC7C,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBAC5C,IAAI,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;oBAC5B,mBAAmB;oBACnB,QAAQ,EAAE,CAAC;gBACb,CAAC;gBACD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC,CAAiC,CAAC;YAEnC,MAAM,MAAM,CACV,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YAE5C,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,eAAe,GAAG;gBACtB,YAAY,EAAE,kBAAkB;gBAChC,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,mBAAmB;aACnC,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CACtD,UAAU,EACV,mBAAmB,EACnB,gCAAgC,CACjC,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACxC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,gCAAgC,EAChC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;gBAChE,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,0BAA0B,CAAC;aAC1D,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,gBAAgB,CAAC,kBAAkB,CACvC,UAAU,EACV,eAAe,EACf,gCAAgC,CACjC,CAAC;YAEF,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;aACrD,CAAC,CAAC;YAEH,MAAM,MAAM,CACV,gBAAgB,CAAC,kBAAkB,CACjC,UAAU,EACV,uBAAuB,EACvB,gCAAgC,CACjC,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,gBAAgB,GAAG;gBACvB,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACxD,gBAAgB,CACjB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CACjD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,kBAAkB,GAAG;gBACzB,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE;gBACxD,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACxD,kBAAkB,CACnB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAErE,MAAM,eAAe,GAAG;gBACtB,YAAY,EAAE,kBAAkB;gBAChC,UAAU,EAAE,QAAQ;gBACpB,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,mBAAmB;aACnC,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CACjD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACxC,MAAM,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACzD,aAAa,EACb,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,EAC5D,gBAAgB,EAChB,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CACjD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,kBAAkB,GAAG;gBACzB,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE;gBACxD,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACxD,kBAAkB,CACnB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEzE,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC;aACrD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CACjD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAC3D,aAAa,CACd,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACxC,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CACnD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,mBAAmB,GAAG;gBAC1B,UAAU,EAAE,aAAa;gBACzB,KAAK,EAAE;oBACL,GAAG,SAAS;oBACZ,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;iBAChC;gBACD,QAAQ,EAAE,gBAAgB;gBAC1B,QAAQ,EAAE,gCAAgC;gBAC1C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CACxD,mBAAmB,CACpB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,aAAa,CACjD,aAAa,EACb,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,qEAAqE;YACrE,wCAAwC;YACxC,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAE/D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;YACrE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YAC7D,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,+CAA+C;YAC/C,IAAI,WAAmB,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAG,EAAE,EAAE;gBACzC,WAAW,GAAG,GAAG,CAAC;gBAClB,qCAAqC;gBACrC,OAAO,OAAO,CAAC,OAAO,CAAC;oBACrB,GAAG,EAAE,IAAI;iBACyC,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,IAAI,eAAwB,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1D,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,cAAwC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1D,QAAQ,EAAE,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,OAAO,GAAG;wBACd,GAAG,EAAE,qEAAqE;qBAC3E,CAAC;oBACF,MAAM,OAAO,GAAG;wBACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;wBAClB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;qBACb,CAAC;oBACD,eAAwD,CACvD,OAAO,EACP,OAAO,CACR,CAAC;gBACJ,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,gBAAgB,CAAC,YAAY,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAE/D,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YACrD,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YAC3D,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;YACrE,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC7D,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACnD,MAAM,CAAC,WAAY,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Interface for MCP OAuth tokens.
8
+ */
9
+ export interface MCPOAuthToken {
10
+ accessToken: string;
11
+ refreshToken?: string;
12
+ expiresAt?: number;
13
+ tokenType: string;
14
+ scope?: string;
15
+ }
16
+ /**
17
+ * Interface for stored MCP OAuth credentials.
18
+ */
19
+ export interface MCPOAuthCredentials {
20
+ serverName: string;
21
+ token: MCPOAuthToken;
22
+ clientId?: string;
23
+ tokenUrl?: string;
24
+ updatedAt: number;
25
+ }
26
+ /**
27
+ * Class for managing MCP OAuth token storage and retrieval.
28
+ */
29
+ export declare class MCPOAuthTokenStorage {
30
+ private static readonly TOKEN_FILE;
31
+ private static readonly CONFIG_DIR;
32
+ /**
33
+ * Get the path to the token storage file.
34
+ *
35
+ * @returns The full path to the token storage file
36
+ */
37
+ private static getTokenFilePath;
38
+ /**
39
+ * Ensure the config directory exists.
40
+ */
41
+ private static ensureConfigDir;
42
+ /**
43
+ * Load all stored MCP OAuth tokens.
44
+ *
45
+ * @returns A map of server names to credentials
46
+ */
47
+ static loadTokens(): Promise<Map<string, MCPOAuthCredentials>>;
48
+ /**
49
+ * Save a token for a specific MCP server.
50
+ *
51
+ * @param serverName The name of the MCP server
52
+ * @param token The OAuth token to save
53
+ * @param clientId Optional client ID used for this token
54
+ * @param tokenUrl Optional token URL used for this token
55
+ */
56
+ static saveToken(serverName: string, token: MCPOAuthToken, clientId?: string, tokenUrl?: string): Promise<void>;
57
+ /**
58
+ * Get a token for a specific MCP server.
59
+ *
60
+ * @param serverName The name of the MCP server
61
+ * @returns The stored credentials or null if not found
62
+ */
63
+ static getToken(serverName: string): Promise<MCPOAuthCredentials | null>;
64
+ /**
65
+ * Remove a token for a specific MCP server.
66
+ *
67
+ * @param serverName The name of the MCP server
68
+ */
69
+ static removeToken(serverName: string): Promise<void>;
70
+ /**
71
+ * Check if a token is expired.
72
+ *
73
+ * @param token The token to check
74
+ * @returns True if the token is expired
75
+ */
76
+ static isTokenExpired(token: MCPOAuthToken): boolean;
77
+ /**
78
+ * Clear all stored MCP OAuth tokens.
79
+ */
80
+ static clearAllTokens(): Promise<void>;
81
+ }