@google/gemini-cli-core 0.1.12 → 0.1.14

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 (287) hide show
  1. package/README.md +30 -3
  2. package/dist/google-gemini-cli-core-0.1.13.tgz +0 -0
  3. package/dist/src/code_assist/codeAssist.js +2 -2
  4. package/dist/src/code_assist/codeAssist.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.js +46 -5
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +100 -3
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/code_assist/server.d.ts +4 -6
  10. package/dist/src/code_assist/server.js +4 -69
  11. package/dist/src/code_assist/server.js.map +1 -1
  12. package/dist/src/code_assist/server.test.js +10 -2
  13. package/dist/src/code_assist/server.test.js.map +1 -1
  14. package/dist/src/code_assist/setup.d.ts +6 -1
  15. package/dist/src/code_assist/setup.js +4 -1
  16. package/dist/src/code_assist/setup.js.map +1 -1
  17. package/dist/src/code_assist/setup.test.js +4 -1
  18. package/dist/src/code_assist/setup.test.js.map +1 -1
  19. package/dist/src/code_assist/types.d.ts +2 -2
  20. package/dist/src/config/config.d.ts +52 -11
  21. package/dist/src/config/config.js +79 -33
  22. package/dist/src/config/config.js.map +1 -1
  23. package/dist/src/config/config.test.js +29 -26
  24. package/dist/src/config/config.test.js.map +1 -1
  25. package/dist/src/config/flashFallback.test.js +1 -1
  26. package/dist/src/config/flashFallback.test.js.map +1 -1
  27. package/dist/src/core/client.d.ts +8 -3
  28. package/dist/src/core/client.js +62 -3
  29. package/dist/src/core/client.js.map +1 -1
  30. package/dist/src/core/client.test.js +145 -37
  31. package/dist/src/core/client.test.js.map +1 -1
  32. package/dist/src/core/contentGenerator.d.ts +3 -2
  33. package/dist/src/core/contentGenerator.js +5 -4
  34. package/dist/src/core/contentGenerator.js.map +1 -1
  35. package/dist/src/core/contentGenerator.test.js +12 -5
  36. package/dist/src/core/contentGenerator.test.js.map +1 -1
  37. package/dist/src/core/coreToolScheduler.js +14 -1
  38. package/dist/src/core/coreToolScheduler.js.map +1 -1
  39. package/dist/src/core/coreToolScheduler.test.js +84 -2
  40. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  41. package/dist/src/core/geminiChat.d.ts +4 -3
  42. package/dist/src/core/geminiChat.js +8 -11
  43. package/dist/src/core/geminiChat.js.map +1 -1
  44. package/dist/src/core/geminiRequest.js +2 -37
  45. package/dist/src/core/geminiRequest.js.map +1 -1
  46. package/dist/src/core/logger.js +6 -0
  47. package/dist/src/core/logger.js.map +1 -1
  48. package/dist/src/core/logger.test.js +1 -1
  49. package/dist/src/core/logger.test.js.map +1 -1
  50. package/dist/src/core/modelCheck.d.ts +1 -1
  51. package/dist/src/core/modelCheck.js +10 -3
  52. package/dist/src/core/modelCheck.js.map +1 -1
  53. package/dist/src/core/nonInteractiveToolExecutor.test.js +8 -5
  54. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  55. package/dist/src/core/prompts.js +42 -18
  56. package/dist/src/core/prompts.js.map +1 -1
  57. package/dist/src/core/prompts.test.js +121 -4
  58. package/dist/src/core/prompts.test.js.map +1 -1
  59. package/dist/src/core/turn.d.ts +12 -3
  60. package/dist/src/core/turn.js +10 -0
  61. package/dist/src/core/turn.js.map +1 -1
  62. package/dist/src/core/turn.test.js +129 -0
  63. package/dist/src/core/turn.test.js.map +1 -1
  64. package/dist/src/ide/ide-client.d.ts +28 -0
  65. package/dist/src/ide/ide-client.js +79 -0
  66. package/dist/src/ide/ide-client.js.map +1 -0
  67. package/dist/src/ide/ideContext.d.ts +174 -0
  68. package/dist/src/ide/ideContext.js +101 -0
  69. package/dist/src/ide/ideContext.js.map +1 -0
  70. package/dist/src/ide/ideContext.test.js +111 -0
  71. package/dist/src/ide/ideContext.test.js.map +1 -0
  72. package/dist/src/index.d.ts +11 -0
  73. package/dist/src/index.js +11 -0
  74. package/dist/src/index.js.map +1 -1
  75. package/dist/src/mcp/google-auth-provider.d.ts +23 -0
  76. package/dist/src/mcp/google-auth-provider.js +63 -0
  77. package/dist/src/mcp/google-auth-provider.js.map +1 -0
  78. package/dist/src/mcp/google-auth-provider.test.d.ts +6 -0
  79. package/dist/src/mcp/google-auth-provider.test.js +54 -0
  80. package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
  81. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  82. package/dist/src/mcp/oauth-provider.js +446 -0
  83. package/dist/src/mcp/oauth-provider.js.map +1 -0
  84. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  85. package/dist/src/mcp/oauth-provider.test.js +520 -0
  86. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  87. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  88. package/dist/src/mcp/oauth-token-storage.js +149 -0
  89. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  90. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  91. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  92. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  93. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  94. package/dist/src/mcp/oauth-utils.js +183 -0
  95. package/dist/src/mcp/oauth-utils.js.map +1 -0
  96. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  97. package/dist/src/mcp/oauth-utils.test.js +144 -0
  98. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  99. package/dist/src/services/gitService.js +1 -5
  100. package/dist/src/services/gitService.js.map +1 -1
  101. package/dist/src/services/gitService.test.js +1 -6
  102. package/dist/src/services/gitService.test.js.map +1 -1
  103. package/dist/src/services/loopDetectionService.d.ts +94 -0
  104. package/dist/src/services/loopDetectionService.js +318 -0
  105. package/dist/src/services/loopDetectionService.js.map +1 -0
  106. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  107. package/dist/src/services/loopDetectionService.test.js +266 -0
  108. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  109. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -1
  110. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +69 -4
  111. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  112. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
  113. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +9 -0
  114. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  115. package/dist/src/telemetry/constants.d.ts +1 -0
  116. package/dist/src/telemetry/constants.js +1 -0
  117. package/dist/src/telemetry/constants.js.map +1 -1
  118. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  119. package/dist/src/telemetry/file-exporters.js +62 -0
  120. package/dist/src/telemetry/file-exporters.js.map +1 -0
  121. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  122. package/dist/src/telemetry/integration.test.circular.js +53 -0
  123. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  124. package/dist/src/telemetry/loggers.d.ts +3 -1
  125. package/dist/src/telemetry/loggers.js +34 -2
  126. package/dist/src/telemetry/loggers.js.map +1 -1
  127. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  128. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  129. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  130. package/dist/src/telemetry/sdk.js +17 -6
  131. package/dist/src/telemetry/sdk.js.map +1 -1
  132. package/dist/src/telemetry/types.d.ts +19 -1
  133. package/dist/src/telemetry/types.js +28 -0
  134. package/dist/src/telemetry/types.js.map +1 -1
  135. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  136. package/dist/src/telemetry/uiTelemetry.js +7 -0
  137. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  138. package/dist/src/telemetry/uiTelemetry.test.js +92 -0
  139. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  140. package/dist/src/tools/edit.d.ts +7 -12
  141. package/dist/src/tools/edit.js +34 -32
  142. package/dist/src/tools/edit.js.map +1 -1
  143. package/dist/src/tools/edit.test.js +12 -0
  144. package/dist/src/tools/edit.test.js.map +1 -1
  145. package/dist/src/tools/glob.d.ts +1 -14
  146. package/dist/src/tools/glob.js +13 -36
  147. package/dist/src/tools/glob.js.map +1 -1
  148. package/dist/src/tools/glob.test.js +4 -3
  149. package/dist/src/tools/glob.test.js.map +1 -1
  150. package/dist/src/tools/grep.d.ts +3 -6
  151. package/dist/src/tools/grep.js +12 -18
  152. package/dist/src/tools/grep.js.map +1 -1
  153. package/dist/src/tools/grep.test.js +5 -2
  154. package/dist/src/tools/grep.test.js.map +1 -1
  155. package/dist/src/tools/ls.d.ts +6 -14
  156. package/dist/src/tools/ls.js +47 -40
  157. package/dist/src/tools/ls.js.map +1 -1
  158. package/dist/src/tools/mcp-client.d.ts +59 -1
  159. package/dist/src/tools/mcp-client.js +557 -146
  160. package/dist/src/tools/mcp-client.js.map +1 -1
  161. package/dist/src/tools/mcp-client.test.js +166 -623
  162. package/dist/src/tools/mcp-client.test.js.map +1 -1
  163. package/dist/src/tools/mcp-tool.d.ts +11 -5
  164. package/dist/src/tools/mcp-tool.js +34 -10
  165. package/dist/src/tools/mcp-tool.js.map +1 -1
  166. package/dist/src/tools/mcp-tool.test.js +74 -24
  167. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  168. package/dist/src/tools/memoryTool.js +2 -2
  169. package/dist/src/tools/memoryTool.js.map +1 -1
  170. package/dist/src/tools/read-file.d.ts +3 -3
  171. package/dist/src/tools/read-file.js +10 -10
  172. package/dist/src/tools/read-file.js.map +1 -1
  173. package/dist/src/tools/read-file.test.js +100 -70
  174. package/dist/src/tools/read-file.test.js.map +1 -1
  175. package/dist/src/tools/read-many-files.d.ts +6 -10
  176. package/dist/src/tools/read-many-files.js +74 -43
  177. package/dist/src/tools/read-many-files.js.map +1 -1
  178. package/dist/src/tools/read-many-files.test.js +7 -3
  179. package/dist/src/tools/read-many-files.test.js.map +1 -1
  180. package/dist/src/tools/shell.d.ts +2 -23
  181. package/dist/src/tools/shell.js +58 -138
  182. package/dist/src/tools/shell.js.map +1 -1
  183. package/dist/src/tools/shell.test.js +85 -311
  184. package/dist/src/tools/shell.test.js.map +1 -1
  185. package/dist/src/tools/tool-registry.d.ts +13 -2
  186. package/dist/src/tools/tool-registry.js +57 -10
  187. package/dist/src/tools/tool-registry.js.map +1 -1
  188. package/dist/src/tools/tool-registry.test.js +112 -41
  189. package/dist/src/tools/tool-registry.test.js.map +1 -1
  190. package/dist/src/tools/tools.d.ts +37 -2
  191. package/dist/src/tools/tools.js +25 -2
  192. package/dist/src/tools/tools.js.map +1 -1
  193. package/dist/src/tools/web-fetch.js +7 -2
  194. package/dist/src/tools/web-fetch.js.map +1 -1
  195. package/dist/src/tools/web-fetch.test.js +1 -0
  196. package/dist/src/tools/web-fetch.test.js.map +1 -1
  197. package/dist/src/tools/web-search.js +2 -2
  198. package/dist/src/tools/web-search.js.map +1 -1
  199. package/dist/src/tools/write-file.d.ts +0 -8
  200. package/dist/src/tools/write-file.js +14 -23
  201. package/dist/src/tools/write-file.js.map +1 -1
  202. package/dist/src/utils/bfsFileSearch.d.ts +2 -0
  203. package/dist/src/utils/bfsFileSearch.js +4 -1
  204. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  205. package/dist/src/utils/bfsFileSearch.test.js +108 -105
  206. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  207. package/dist/src/utils/browser.d.ts +13 -0
  208. package/dist/src/utils/browser.js +49 -0
  209. package/dist/src/utils/browser.js.map +1 -0
  210. package/dist/src/utils/editCorrector.js +4 -4
  211. package/dist/src/utils/editCorrector.js.map +1 -1
  212. package/dist/src/utils/editCorrector.test.js +1 -1
  213. package/dist/src/utils/editor.js +16 -10
  214. package/dist/src/utils/editor.js.map +1 -1
  215. package/dist/src/utils/editor.test.js +128 -28
  216. package/dist/src/utils/editor.test.js.map +1 -1
  217. package/dist/src/utils/errorReporting.d.ts +1 -1
  218. package/dist/src/utils/errorReporting.js +2 -2
  219. package/dist/src/utils/errorReporting.js.map +1 -1
  220. package/dist/src/utils/errorReporting.test.js +44 -38
  221. package/dist/src/utils/errorReporting.test.js.map +1 -1
  222. package/dist/src/utils/errors.js +4 -4
  223. package/dist/src/utils/errors.js.map +1 -1
  224. package/dist/src/utils/fileUtils.d.ts +4 -4
  225. package/dist/src/utils/fileUtils.js +33 -17
  226. package/dist/src/utils/fileUtils.js.map +1 -1
  227. package/dist/src/utils/fileUtils.test.js +37 -37
  228. package/dist/src/utils/fileUtils.test.js.map +1 -1
  229. package/dist/src/utils/getFolderStructure.d.ts +3 -2
  230. package/dist/src/utils/getFolderStructure.js +27 -28
  231. package/dist/src/utils/getFolderStructure.js.map +1 -1
  232. package/dist/src/utils/getFolderStructure.test.js +169 -187
  233. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  234. package/dist/src/utils/gitIgnoreParser.js +4 -7
  235. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  236. package/dist/src/utils/gitIgnoreParser.test.js +70 -61
  237. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  238. package/dist/src/utils/memoryDiscovery.d.ts +2 -1
  239. package/dist/src/utils/memoryDiscovery.js +11 -5
  240. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  241. package/dist/src/utils/memoryDiscovery.test.js +160 -371
  242. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  243. package/dist/src/utils/partUtils.d.ts +14 -0
  244. package/dist/src/utils/partUtils.js +65 -0
  245. package/dist/src/utils/partUtils.js.map +1 -0
  246. package/dist/src/utils/partUtils.test.d.ts +6 -0
  247. package/dist/src/utils/partUtils.test.js +130 -0
  248. package/dist/src/utils/partUtils.test.js.map +1 -0
  249. package/dist/src/utils/paths.d.ts +11 -0
  250. package/dist/src/utils/paths.js +17 -1
  251. package/dist/src/utils/paths.js.map +1 -1
  252. package/dist/src/utils/quotaErrorDetection.js +2 -11
  253. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  254. package/dist/src/utils/retry.d.ts +6 -0
  255. package/dist/src/utils/retry.js +2 -2
  256. package/dist/src/utils/retry.js.map +1 -1
  257. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  258. package/dist/src/utils/safeJsonStringify.js +25 -0
  259. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  260. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  261. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  262. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  263. package/dist/src/utils/schemaValidator.d.ts +1 -1
  264. package/dist/src/utils/schemaValidator.js +6 -3
  265. package/dist/src/utils/schemaValidator.js.map +1 -1
  266. package/dist/src/utils/shell-utils.d.ts +44 -0
  267. package/dist/src/utils/shell-utils.js +243 -0
  268. package/dist/src/utils/shell-utils.js.map +1 -0
  269. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  270. package/dist/src/utils/shell-utils.test.js +450 -0
  271. package/dist/src/utils/shell-utils.test.js.map +1 -0
  272. package/dist/src/utils/summarizer.d.ts +1 -1
  273. package/dist/src/utils/summarizer.js +11 -39
  274. package/dist/src/utils/summarizer.js.map +1 -1
  275. package/dist/src/utils/summarizer.test.js +1 -1
  276. package/dist/src/utils/systemEncoding.d.ts +40 -0
  277. package/dist/src/utils/systemEncoding.js +149 -0
  278. package/dist/src/utils/systemEncoding.js.map +1 -0
  279. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  280. package/dist/src/utils/systemEncoding.test.js +368 -0
  281. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  282. package/dist/tsconfig.tsbuildinfo +1 -1
  283. package/package.json +4 -3
  284. package/dist/google-gemini-cli-core-0.1.11.tgz +0 -0
  285. package/dist/src/core/geminiRequest.test.js +0 -72
  286. package/dist/src/core/geminiRequest.test.js.map +0 -1
  287. /package/dist/src/{core/geminiRequest.test.d.ts → ide/ideContext.test.d.ts} +0 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
7
+ import { createIdeContextStore } from './ideContext.js';
8
+ describe('ideContext - Active File', () => {
9
+ let ideContext;
10
+ beforeEach(() => {
11
+ // Create a fresh, isolated instance for each test
12
+ ideContext = createIdeContextStore();
13
+ });
14
+ it('should return undefined initially for active file context', () => {
15
+ expect(ideContext.getOpenFilesContext()).toBeUndefined();
16
+ });
17
+ it('should set and retrieve the active file context', () => {
18
+ const testFile = {
19
+ activeFile: '/path/to/test/file.ts',
20
+ selectedText: '1234',
21
+ };
22
+ ideContext.setOpenFilesContext(testFile);
23
+ const activeFile = ideContext.getOpenFilesContext();
24
+ expect(activeFile).toEqual(testFile);
25
+ });
26
+ it('should update the active file context when called multiple times', () => {
27
+ const firstFile = {
28
+ activeFile: '/path/to/first.js',
29
+ selectedText: '1234',
30
+ };
31
+ ideContext.setOpenFilesContext(firstFile);
32
+ const secondFile = {
33
+ activeFile: '/path/to/second.py',
34
+ cursor: { line: 20, character: 30 },
35
+ };
36
+ ideContext.setOpenFilesContext(secondFile);
37
+ const activeFile = ideContext.getOpenFilesContext();
38
+ expect(activeFile).toEqual(secondFile);
39
+ });
40
+ it('should handle empty string for file path', () => {
41
+ const testFile = {
42
+ activeFile: '',
43
+ selectedText: '1234',
44
+ };
45
+ ideContext.setOpenFilesContext(testFile);
46
+ expect(ideContext.getOpenFilesContext()).toEqual(testFile);
47
+ });
48
+ it('should notify subscribers when active file context changes', () => {
49
+ const subscriber1 = vi.fn();
50
+ const subscriber2 = vi.fn();
51
+ ideContext.subscribeToOpenFiles(subscriber1);
52
+ ideContext.subscribeToOpenFiles(subscriber2);
53
+ const testFile = {
54
+ activeFile: '/path/to/subscribed.ts',
55
+ cursor: { line: 15, character: 25 },
56
+ };
57
+ ideContext.setOpenFilesContext(testFile);
58
+ expect(subscriber1).toHaveBeenCalledTimes(1);
59
+ expect(subscriber1).toHaveBeenCalledWith(testFile);
60
+ expect(subscriber2).toHaveBeenCalledTimes(1);
61
+ expect(subscriber2).toHaveBeenCalledWith(testFile);
62
+ // Test with another update
63
+ const newFile = {
64
+ activeFile: '/path/to/new.js',
65
+ selectedText: '1234',
66
+ };
67
+ ideContext.setOpenFilesContext(newFile);
68
+ expect(subscriber1).toHaveBeenCalledTimes(2);
69
+ expect(subscriber1).toHaveBeenCalledWith(newFile);
70
+ expect(subscriber2).toHaveBeenCalledTimes(2);
71
+ expect(subscriber2).toHaveBeenCalledWith(newFile);
72
+ });
73
+ it('should stop notifying a subscriber after unsubscribe', () => {
74
+ const subscriber1 = vi.fn();
75
+ const subscriber2 = vi.fn();
76
+ const unsubscribe1 = ideContext.subscribeToOpenFiles(subscriber1);
77
+ ideContext.subscribeToOpenFiles(subscriber2);
78
+ ideContext.setOpenFilesContext({
79
+ activeFile: '/path/to/file1.txt',
80
+ selectedText: '1234',
81
+ });
82
+ expect(subscriber1).toHaveBeenCalledTimes(1);
83
+ expect(subscriber2).toHaveBeenCalledTimes(1);
84
+ unsubscribe1();
85
+ ideContext.setOpenFilesContext({
86
+ activeFile: '/path/to/file2.txt',
87
+ selectedText: '1234',
88
+ });
89
+ expect(subscriber1).toHaveBeenCalledTimes(1); // Should not be called again
90
+ expect(subscriber2).toHaveBeenCalledTimes(2);
91
+ });
92
+ it('should allow the cursor to be optional', () => {
93
+ const testFile = {
94
+ activeFile: '/path/to/test/file.ts',
95
+ };
96
+ ideContext.setOpenFilesContext(testFile);
97
+ const activeFile = ideContext.getOpenFilesContext();
98
+ expect(activeFile).toEqual(testFile);
99
+ });
100
+ it('should clear the active file context', () => {
101
+ const testFile = {
102
+ activeFile: '/path/to/test/file.ts',
103
+ selectedText: '1234',
104
+ };
105
+ ideContext.setOpenFilesContext(testFile);
106
+ expect(ideContext.getOpenFilesContext()).toEqual(testFile);
107
+ ideContext.clearOpenFilesContext();
108
+ expect(ideContext.getOpenFilesContext()).toBeUndefined();
109
+ });
110
+ });
111
+ //# sourceMappingURL=ideContext.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ideContext.test.js","sourceRoot":"","sources":["../../../src/ide/ideContext.test.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,13 @@ export * from './utils/memoryDiscovery.js';
26
26
  export * from './utils/gitIgnoreParser.js';
27
27
  export * from './utils/editor.js';
28
28
  export * from './utils/quotaErrorDetection.js';
29
+ export * from './utils/fileUtils.js';
30
+ export * from './utils/retry.js';
31
+ export * from './utils/systemEncoding.js';
29
32
  export * from './services/fileDiscoveryService.js';
30
33
  export * from './services/gitService.js';
34
+ export * from './ide/ide-client.js';
35
+ export * from './ide/ideContext.js';
31
36
  export * from './tools/tools.js';
32
37
  export * from './tools/tool-registry.js';
33
38
  export * from './tools/read-file.js';
@@ -43,5 +48,11 @@ export * from './tools/web-search.js';
43
48
  export * from './tools/read-many-files.js';
44
49
  export * from './tools/mcp-client.js';
45
50
  export * from './tools/mcp-tool.js';
51
+ export { MCPOAuthProvider } from './mcp/oauth-provider.js';
52
+ export { MCPOAuthToken, MCPOAuthCredentials, MCPOAuthTokenStorage, } from './mcp/oauth-token-storage.js';
53
+ export type { MCPOAuthConfig } from './mcp/oauth-provider.js';
54
+ export type { OAuthAuthorizationServerMetadata, OAuthProtectedResourceMetadata, } from './mcp/oauth-utils.js';
55
+ export { OAuthUtils } from './mcp/oauth-utils.js';
46
56
  export * from './telemetry/index.js';
47
57
  export { sessionId } from './utils/session.js';
58
+ export * from './utils/browser.js';
package/dist/src/index.js CHANGED
@@ -29,9 +29,15 @@ export * from './utils/memoryDiscovery.js';
29
29
  export * from './utils/gitIgnoreParser.js';
30
30
  export * from './utils/editor.js';
31
31
  export * from './utils/quotaErrorDetection.js';
32
+ export * from './utils/fileUtils.js';
33
+ export * from './utils/retry.js';
34
+ export * from './utils/systemEncoding.js';
32
35
  // Export services
33
36
  export * from './services/fileDiscoveryService.js';
34
37
  export * from './services/gitService.js';
38
+ // Export IDE specific logic
39
+ export * from './ide/ide-client.js';
40
+ export * from './ide/ideContext.js';
35
41
  // Export base tool definitions
36
42
  export * from './tools/tools.js';
37
43
  export * from './tools/tool-registry.js';
@@ -49,7 +55,12 @@ export * from './tools/web-search.js';
49
55
  export * from './tools/read-many-files.js';
50
56
  export * from './tools/mcp-client.js';
51
57
  export * from './tools/mcp-tool.js';
58
+ // MCP OAuth
59
+ export { MCPOAuthProvider } from './mcp/oauth-provider.js';
60
+ export { MCPOAuthTokenStorage, } from './mcp/oauth-token-storage.js';
61
+ export { OAuthUtils } from './mcp/oauth-utils.js';
52
62
  // Export telemetry functions
53
63
  export * from './telemetry/index.js';
54
64
  export { sessionId } from './utils/session.js';
65
+ export * from './utils/browser.js';
55
66
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AAEnC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAE/C,kBAAkB;AAClB,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AAEzC,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AAEpC,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,cAAc,oBAAoB,CAAC;AAEnC,oBAAoB;AACpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AAErD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AAEvC,mBAAmB;AACnB,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,kBAAkB;AAClB,cAAc,oCAAoC,CAAC;AACnD,cAAc,0BAA0B,CAAC;AAEzC,4BAA4B;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AAEpC,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AAEzC,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AAEpC,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAGL,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAMtC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,6BAA6B;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js';
7
+ import { OAuthClientInformation, OAuthClientInformationFull, OAuthClientMetadata, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
8
+ import { MCPServerConfig } from '../config/config.js';
9
+ export declare class GoogleCredentialProvider implements OAuthClientProvider {
10
+ private readonly config?;
11
+ private readonly auth;
12
+ readonly redirectUrl = "";
13
+ readonly clientMetadata: OAuthClientMetadata;
14
+ private _clientInformation?;
15
+ constructor(config?: MCPServerConfig | undefined);
16
+ clientInformation(): OAuthClientInformation | undefined;
17
+ saveClientInformation(clientInformation: OAuthClientInformationFull): void;
18
+ tokens(): Promise<OAuthTokens | undefined>;
19
+ saveTokens(_tokens: OAuthTokens): void;
20
+ redirectToAuthorization(_authorizationUrl: URL): void;
21
+ saveCodeVerifier(_codeVerifier: string): void;
22
+ codeVerifier(): string;
23
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { GoogleAuth } from 'google-auth-library';
7
+ export class GoogleCredentialProvider {
8
+ config;
9
+ auth;
10
+ // Properties required by OAuthClientProvider, with no-op values
11
+ redirectUrl = '';
12
+ clientMetadata = {
13
+ client_name: 'Gemini CLI (Google ADC)',
14
+ redirect_uris: [],
15
+ grant_types: [],
16
+ response_types: [],
17
+ token_endpoint_auth_method: 'none',
18
+ };
19
+ _clientInformation;
20
+ constructor(config) {
21
+ this.config = config;
22
+ const scopes = this.config?.oauth?.scopes;
23
+ if (!scopes || scopes.length === 0) {
24
+ throw new Error('Scopes must be provided in the oauth config for Google Credentials provider');
25
+ }
26
+ this.auth = new GoogleAuth({
27
+ scopes,
28
+ });
29
+ }
30
+ clientInformation() {
31
+ return this._clientInformation;
32
+ }
33
+ saveClientInformation(clientInformation) {
34
+ this._clientInformation = clientInformation;
35
+ }
36
+ async tokens() {
37
+ const client = await this.auth.getClient();
38
+ const accessTokenResponse = await client.getAccessToken();
39
+ if (!accessTokenResponse.token) {
40
+ console.error('Failed to get access token from Google ADC');
41
+ return undefined;
42
+ }
43
+ const tokens = {
44
+ access_token: accessTokenResponse.token,
45
+ token_type: 'Bearer',
46
+ };
47
+ return tokens;
48
+ }
49
+ saveTokens(_tokens) {
50
+ // No-op, ADC manages tokens.
51
+ }
52
+ redirectToAuthorization(_authorizationUrl) {
53
+ // No-op
54
+ }
55
+ saveCodeVerifier(_codeVerifier) {
56
+ // No-op
57
+ }
58
+ codeVerifier() {
59
+ // No-op
60
+ return '';
61
+ }
62
+ }
63
+ //# sourceMappingURL=google-auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth-provider.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,OAAO,wBAAwB;IAcN;IAbZ,IAAI,CAAa;IAElC,gEAAgE;IACvD,WAAW,GAAG,EAAE,CAAC;IACjB,cAAc,GAAwB;QAC7C,WAAW,EAAE,yBAAyB;QACtC,aAAa,EAAE,EAAE;QACjB,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,EAAE;QAClB,0BAA0B,EAAE,MAAM;KACnC,CAAC;IACM,kBAAkB,CAA8B;IAExD,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;QAC1C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC;YACzB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,qBAAqB,CAAC,iBAA6C;QACjE,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3C,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE1D,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC5D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAgB;YAC1B,YAAY,EAAE,mBAAmB,CAAC,KAAK;YACvC,UAAU,EAAE,QAAQ;SACrB,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,UAAU,CAAC,OAAoB;QAC7B,6BAA6B;IAC/B,CAAC;IAED,uBAAuB,CAAC,iBAAsB;QAC5C,QAAQ;IACV,CAAC;IAED,gBAAgB,CAAC,aAAqB;QACpC,QAAQ;IACV,CAAC;IAED,YAAY;QACV,QAAQ;QACR,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { GoogleAuth } from 'google-auth-library';
7
+ import { GoogleCredentialProvider } from './google-auth-provider.js';
8
+ import { vi, describe, beforeEach, it, expect } from 'vitest';
9
+ vi.mock('google-auth-library');
10
+ describe('GoogleCredentialProvider', () => {
11
+ it('should throw an error if no scopes are provided', () => {
12
+ expect(() => new GoogleCredentialProvider()).toThrow('Scopes must be provided in the oauth config for Google Credentials provider');
13
+ });
14
+ it('should use scopes from the config if provided', () => {
15
+ const config = {
16
+ oauth: {
17
+ scopes: ['scope1', 'scope2'],
18
+ },
19
+ };
20
+ new GoogleCredentialProvider(config);
21
+ expect(GoogleAuth).toHaveBeenCalledWith({
22
+ scopes: ['scope1', 'scope2'],
23
+ });
24
+ });
25
+ describe('with provider instance', () => {
26
+ let provider;
27
+ beforeEach(() => {
28
+ const config = {
29
+ oauth: {
30
+ scopes: ['scope1', 'scope2'],
31
+ },
32
+ };
33
+ provider = new GoogleCredentialProvider(config);
34
+ vi.clearAllMocks();
35
+ });
36
+ it('should return credentials', async () => {
37
+ const mockClient = {
38
+ getAccessToken: vi.fn().mockResolvedValue({ token: 'test-token' }),
39
+ };
40
+ GoogleAuth.prototype.getClient.mockResolvedValue(mockClient);
41
+ const credentials = await provider.tokens();
42
+ expect(credentials?.access_token).toBe('test-token');
43
+ });
44
+ it('should return undefined if access token is not available', async () => {
45
+ const mockClient = {
46
+ getAccessToken: vi.fn().mockResolvedValue({ token: null }),
47
+ };
48
+ GoogleAuth.prototype.getClient.mockResolvedValue(mockClient);
49
+ const credentials = await provider.tokens();
50
+ expect(credentials).toBeUndefined();
51
+ });
52
+ });
53
+ });
54
+ //# sourceMappingURL=google-auth-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-auth-provider.test.js","sourceRoot":"","sources":["../../../src/mcp/google-auth-provider.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAGpE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAE/B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAClD,6EAA6E,CAC9E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,MAAM,GAAG;YACb,KAAK,EAAE;gBACL,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;aAC7B;SACiB,CAAC;QACrB,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,IAAI,QAAkC,CAAC;QAEvC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,MAAM,GAAG;gBACb,KAAK,EAAE;oBACL,MAAM,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;iBAC7B;aACiB,CAAC;YACrB,QAAQ,GAAG,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;YAChD,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,UAAU,GAAG;gBACjB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;aACnE,CAAC;YACD,UAAU,CAAC,SAAS,CAAC,SAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;YAE5C,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,UAAU,GAAG;gBACjB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aAC3D,CAAC;YACD,UAAU,CAAC,SAAS,CAAC,SAAkB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MCPOAuthToken } from './oauth-token-storage.js';
7
+ /**
8
+ * OAuth configuration for an MCP server.
9
+ */
10
+ export interface MCPOAuthConfig {
11
+ enabled?: boolean;
12
+ clientId?: string;
13
+ clientSecret?: string;
14
+ authorizationUrl?: string;
15
+ tokenUrl?: string;
16
+ scopes?: string[];
17
+ redirectUri?: string;
18
+ tokenParamName?: string;
19
+ }
20
+ /**
21
+ * OAuth authorization response.
22
+ */
23
+ export interface OAuthAuthorizationResponse {
24
+ code: string;
25
+ state: string;
26
+ }
27
+ /**
28
+ * OAuth token response from the authorization server.
29
+ */
30
+ export interface OAuthTokenResponse {
31
+ access_token: string;
32
+ token_type: string;
33
+ expires_in?: number;
34
+ refresh_token?: string;
35
+ scope?: string;
36
+ }
37
+ /**
38
+ * Dynamic client registration request.
39
+ */
40
+ export interface OAuthClientRegistrationRequest {
41
+ client_name: string;
42
+ redirect_uris: string[];
43
+ grant_types: string[];
44
+ response_types: string[];
45
+ token_endpoint_auth_method: string;
46
+ code_challenge_method?: string[];
47
+ scope?: string;
48
+ }
49
+ /**
50
+ * Dynamic client registration response.
51
+ */
52
+ export interface OAuthClientRegistrationResponse {
53
+ client_id: string;
54
+ client_secret?: string;
55
+ client_id_issued_at?: number;
56
+ client_secret_expires_at?: number;
57
+ redirect_uris: string[];
58
+ grant_types: string[];
59
+ response_types: string[];
60
+ token_endpoint_auth_method: string;
61
+ code_challenge_method?: string[];
62
+ scope?: string;
63
+ }
64
+ /**
65
+ * Provider for handling OAuth authentication for MCP servers.
66
+ */
67
+ export declare class MCPOAuthProvider {
68
+ private static readonly REDIRECT_PORT;
69
+ private static readonly REDIRECT_PATH;
70
+ private static readonly HTTP_OK;
71
+ private static readonly HTTP_REDIRECT;
72
+ /**
73
+ * Register a client dynamically with the OAuth server.
74
+ *
75
+ * @param registrationUrl The client registration endpoint URL
76
+ * @param config OAuth configuration
77
+ * @returns The registered client information
78
+ */
79
+ private static registerClient;
80
+ /**
81
+ * Discover OAuth configuration from an MCP server URL.
82
+ *
83
+ * @param mcpServerUrl The MCP server URL
84
+ * @returns OAuth configuration if discovered, null otherwise
85
+ */
86
+ private static discoverOAuthFromMCPServer;
87
+ /**
88
+ * Generate PKCE parameters for OAuth flow.
89
+ *
90
+ * @returns PKCE parameters including code verifier, challenge, and state
91
+ */
92
+ private static generatePKCEParams;
93
+ /**
94
+ * Start a local HTTP server to handle OAuth callback.
95
+ *
96
+ * @param expectedState The state parameter to validate
97
+ * @returns Promise that resolves with the authorization code
98
+ */
99
+ private static startCallbackServer;
100
+ /**
101
+ * Build the authorization URL with PKCE parameters.
102
+ *
103
+ * @param config OAuth configuration
104
+ * @param pkceParams PKCE parameters
105
+ * @returns The authorization URL
106
+ */
107
+ private static buildAuthorizationUrl;
108
+ /**
109
+ * Exchange authorization code for tokens.
110
+ *
111
+ * @param config OAuth configuration
112
+ * @param code Authorization code
113
+ * @param codeVerifier PKCE code verifier
114
+ * @returns The token response
115
+ */
116
+ private static exchangeCodeForToken;
117
+ /**
118
+ * Refresh an access token using a refresh token.
119
+ *
120
+ * @param config OAuth configuration
121
+ * @param refreshToken The refresh token
122
+ * @returns The new token response
123
+ */
124
+ static refreshAccessToken(config: MCPOAuthConfig, refreshToken: string, tokenUrl: string): Promise<OAuthTokenResponse>;
125
+ /**
126
+ * Perform the full OAuth authorization code flow with PKCE.
127
+ *
128
+ * @param serverName The name of the MCP server
129
+ * @param config OAuth configuration
130
+ * @param mcpServerUrl Optional MCP server URL for OAuth discovery
131
+ * @returns The obtained OAuth token
132
+ */
133
+ static authenticate(serverName: string, config: MCPOAuthConfig, mcpServerUrl?: string): Promise<MCPOAuthToken>;
134
+ /**
135
+ * Get a valid access token for an MCP server, refreshing if necessary.
136
+ *
137
+ * @param serverName The name of the MCP server
138
+ * @param config OAuth configuration
139
+ * @returns A valid access token or null if not authenticated
140
+ */
141
+ static getValidToken(serverName: string, config: MCPOAuthConfig): Promise<string | null>;
142
+ }