@google/gemini-cli-core 0.1.12 → 0.1.13-nightly.250727.3e81359c

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 (309) 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 +107 -10
  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 +55 -11
  21. package/dist/src/config/config.js +85 -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 +88 -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 +15 -0
  73. package/dist/src/index.js +17 -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/prompts/mcp-prompts.d.ts +8 -0
  100. package/dist/src/prompts/mcp-prompts.js +13 -0
  101. package/dist/src/prompts/mcp-prompts.js.map +1 -0
  102. package/dist/src/prompts/prompt-registry.d.ts +26 -0
  103. package/dist/src/prompts/prompt-registry.js +47 -0
  104. package/dist/src/prompts/prompt-registry.js.map +1 -0
  105. package/dist/src/services/fileDiscoveryService.test.js +101 -60
  106. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  107. package/dist/src/services/gitService.js +1 -5
  108. package/dist/src/services/gitService.js.map +1 -1
  109. package/dist/src/services/gitService.test.js +68 -92
  110. package/dist/src/services/gitService.test.js.map +1 -1
  111. package/dist/src/services/loopDetectionService.d.ts +94 -0
  112. package/dist/src/services/loopDetectionService.js +318 -0
  113. package/dist/src/services/loopDetectionService.js.map +1 -0
  114. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  115. package/dist/src/services/loopDetectionService.test.js +266 -0
  116. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  117. package/dist/src/services/shellExecutionService.d.ts +70 -0
  118. package/dist/src/services/shellExecutionService.js +152 -0
  119. package/dist/src/services/shellExecutionService.js.map +1 -0
  120. package/dist/src/services/shellExecutionService.test.d.ts +6 -0
  121. package/dist/src/services/shellExecutionService.test.js +258 -0
  122. package/dist/src/services/shellExecutionService.test.js.map +1 -0
  123. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -1
  124. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +69 -4
  125. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  126. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +4 -1
  127. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +9 -0
  128. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  129. package/dist/src/telemetry/constants.d.ts +1 -0
  130. package/dist/src/telemetry/constants.js +1 -0
  131. package/dist/src/telemetry/constants.js.map +1 -1
  132. package/dist/src/telemetry/file-exporters.d.ts +28 -0
  133. package/dist/src/telemetry/file-exporters.js +62 -0
  134. package/dist/src/telemetry/file-exporters.js.map +1 -0
  135. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  136. package/dist/src/telemetry/integration.test.circular.js +53 -0
  137. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  138. package/dist/src/telemetry/loggers.d.ts +3 -1
  139. package/dist/src/telemetry/loggers.js +34 -2
  140. package/dist/src/telemetry/loggers.js.map +1 -1
  141. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  142. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  143. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  144. package/dist/src/telemetry/sdk.js +17 -6
  145. package/dist/src/telemetry/sdk.js.map +1 -1
  146. package/dist/src/telemetry/types.d.ts +19 -1
  147. package/dist/src/telemetry/types.js +28 -0
  148. package/dist/src/telemetry/types.js.map +1 -1
  149. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  150. package/dist/src/telemetry/uiTelemetry.js +7 -0
  151. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  152. package/dist/src/telemetry/uiTelemetry.test.js +92 -0
  153. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  154. package/dist/src/tools/edit.d.ts +7 -12
  155. package/dist/src/tools/edit.js +34 -32
  156. package/dist/src/tools/edit.js.map +1 -1
  157. package/dist/src/tools/edit.test.js +12 -0
  158. package/dist/src/tools/edit.test.js.map +1 -1
  159. package/dist/src/tools/glob.d.ts +1 -14
  160. package/dist/src/tools/glob.js +13 -36
  161. package/dist/src/tools/glob.js.map +1 -1
  162. package/dist/src/tools/glob.test.js +11 -7
  163. package/dist/src/tools/glob.test.js.map +1 -1
  164. package/dist/src/tools/grep.d.ts +3 -6
  165. package/dist/src/tools/grep.js +12 -18
  166. package/dist/src/tools/grep.js.map +1 -1
  167. package/dist/src/tools/grep.test.js +9 -6
  168. package/dist/src/tools/grep.test.js.map +1 -1
  169. package/dist/src/tools/ls.d.ts +6 -14
  170. package/dist/src/tools/ls.js +47 -40
  171. package/dist/src/tools/ls.js.map +1 -1
  172. package/dist/src/tools/mcp-client.d.ts +83 -1
  173. package/dist/src/tools/mcp-client.js +613 -148
  174. package/dist/src/tools/mcp-client.js.map +1 -1
  175. package/dist/src/tools/mcp-client.test.js +211 -616
  176. package/dist/src/tools/mcp-client.test.js.map +1 -1
  177. package/dist/src/tools/mcp-tool.d.ts +11 -5
  178. package/dist/src/tools/mcp-tool.js +34 -10
  179. package/dist/src/tools/mcp-tool.js.map +1 -1
  180. package/dist/src/tools/mcp-tool.test.js +74 -24
  181. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  182. package/dist/src/tools/memoryTool.js +2 -2
  183. package/dist/src/tools/memoryTool.js.map +1 -1
  184. package/dist/src/tools/modifiable-tool.test.js +51 -62
  185. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  186. package/dist/src/tools/read-file.d.ts +3 -3
  187. package/dist/src/tools/read-file.js +10 -10
  188. package/dist/src/tools/read-file.js.map +1 -1
  189. package/dist/src/tools/read-file.test.js +100 -70
  190. package/dist/src/tools/read-file.test.js.map +1 -1
  191. package/dist/src/tools/read-many-files.d.ts +6 -10
  192. package/dist/src/tools/read-many-files.js +74 -43
  193. package/dist/src/tools/read-many-files.js.map +1 -1
  194. package/dist/src/tools/read-many-files.test.js +7 -3
  195. package/dist/src/tools/read-many-files.test.js.map +1 -1
  196. package/dist/src/tools/shell.d.ts +3 -23
  197. package/dist/src/tools/shell.js +169 -293
  198. package/dist/src/tools/shell.js.map +1 -1
  199. package/dist/src/tools/shell.test.js +255 -333
  200. package/dist/src/tools/shell.test.js.map +1 -1
  201. package/dist/src/tools/tool-registry.d.ts +13 -2
  202. package/dist/src/tools/tool-registry.js +57 -10
  203. package/dist/src/tools/tool-registry.js.map +1 -1
  204. package/dist/src/tools/tool-registry.test.js +112 -41
  205. package/dist/src/tools/tool-registry.test.js.map +1 -1
  206. package/dist/src/tools/tools.d.ts +37 -2
  207. package/dist/src/tools/tools.js +25 -2
  208. package/dist/src/tools/tools.js.map +1 -1
  209. package/dist/src/tools/web-fetch.js +7 -2
  210. package/dist/src/tools/web-fetch.js.map +1 -1
  211. package/dist/src/tools/web-fetch.test.js +1 -0
  212. package/dist/src/tools/web-fetch.test.js.map +1 -1
  213. package/dist/src/tools/web-search.js +2 -2
  214. package/dist/src/tools/web-search.js.map +1 -1
  215. package/dist/src/tools/write-file.d.ts +0 -8
  216. package/dist/src/tools/write-file.js +14 -23
  217. package/dist/src/tools/write-file.js.map +1 -1
  218. package/dist/src/utils/bfsFileSearch.d.ts +2 -0
  219. package/dist/src/utils/bfsFileSearch.js +4 -1
  220. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  221. package/dist/src/utils/bfsFileSearch.test.js +108 -105
  222. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  223. package/dist/src/utils/browser.d.ts +13 -0
  224. package/dist/src/utils/browser.js +49 -0
  225. package/dist/src/utils/browser.js.map +1 -0
  226. package/dist/src/utils/editCorrector.js +4 -4
  227. package/dist/src/utils/editCorrector.js.map +1 -1
  228. package/dist/src/utils/editCorrector.test.js +1 -1
  229. package/dist/src/utils/editor.js +16 -10
  230. package/dist/src/utils/editor.js.map +1 -1
  231. package/dist/src/utils/editor.test.js +128 -28
  232. package/dist/src/utils/editor.test.js.map +1 -1
  233. package/dist/src/utils/errorReporting.d.ts +1 -1
  234. package/dist/src/utils/errorReporting.js +2 -2
  235. package/dist/src/utils/errorReporting.js.map +1 -1
  236. package/dist/src/utils/errorReporting.test.js +44 -38
  237. package/dist/src/utils/errorReporting.test.js.map +1 -1
  238. package/dist/src/utils/errors.js +4 -4
  239. package/dist/src/utils/errors.js.map +1 -1
  240. package/dist/src/utils/fileUtils.d.ts +4 -4
  241. package/dist/src/utils/fileUtils.js +33 -17
  242. package/dist/src/utils/fileUtils.js.map +1 -1
  243. package/dist/src/utils/fileUtils.test.js +37 -37
  244. package/dist/src/utils/fileUtils.test.js.map +1 -1
  245. package/dist/src/utils/formatters.d.ts +6 -0
  246. package/dist/src/utils/formatters.js +16 -0
  247. package/dist/src/utils/formatters.js.map +1 -0
  248. package/dist/src/utils/getFolderStructure.d.ts +3 -2
  249. package/dist/src/utils/getFolderStructure.js +27 -28
  250. package/dist/src/utils/getFolderStructure.js.map +1 -1
  251. package/dist/src/utils/getFolderStructure.test.js +169 -187
  252. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  253. package/dist/src/utils/gitIgnoreParser.js +4 -7
  254. package/dist/src/utils/gitIgnoreParser.js.map +1 -1
  255. package/dist/src/utils/gitIgnoreParser.test.js +70 -61
  256. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
  257. package/dist/src/utils/memoryDiscovery.d.ts +2 -1
  258. package/dist/src/utils/memoryDiscovery.js +11 -5
  259. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  260. package/dist/src/utils/memoryDiscovery.test.js +160 -371
  261. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  262. package/dist/src/utils/partUtils.d.ts +14 -0
  263. package/dist/src/utils/partUtils.js +65 -0
  264. package/dist/src/utils/partUtils.js.map +1 -0
  265. package/dist/src/utils/partUtils.test.d.ts +6 -0
  266. package/dist/src/utils/partUtils.test.js +130 -0
  267. package/dist/src/utils/partUtils.test.js.map +1 -0
  268. package/dist/src/utils/paths.d.ts +11 -0
  269. package/dist/src/utils/paths.js +17 -1
  270. package/dist/src/utils/paths.js.map +1 -1
  271. package/dist/src/utils/quotaErrorDetection.js +2 -11
  272. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  273. package/dist/src/utils/retry.d.ts +6 -0
  274. package/dist/src/utils/retry.js +2 -2
  275. package/dist/src/utils/retry.js.map +1 -1
  276. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  277. package/dist/src/utils/safeJsonStringify.js +25 -0
  278. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  279. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  280. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  281. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  282. package/dist/src/utils/schemaValidator.d.ts +1 -1
  283. package/dist/src/utils/schemaValidator.js +6 -3
  284. package/dist/src/utils/schemaValidator.js.map +1 -1
  285. package/dist/src/utils/shell-utils.d.ts +44 -0
  286. package/dist/src/utils/shell-utils.js +243 -0
  287. package/dist/src/utils/shell-utils.js.map +1 -0
  288. package/dist/src/utils/shell-utils.test.d.ts +6 -0
  289. package/dist/src/utils/shell-utils.test.js +450 -0
  290. package/dist/src/utils/shell-utils.test.js.map +1 -0
  291. package/dist/src/utils/summarizer.d.ts +1 -1
  292. package/dist/src/utils/summarizer.js +11 -39
  293. package/dist/src/utils/summarizer.js.map +1 -1
  294. package/dist/src/utils/summarizer.test.js +1 -1
  295. package/dist/src/utils/systemEncoding.d.ts +40 -0
  296. package/dist/src/utils/systemEncoding.js +149 -0
  297. package/dist/src/utils/systemEncoding.js.map +1 -0
  298. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  299. package/dist/src/utils/systemEncoding.test.js +368 -0
  300. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  301. package/dist/src/utils/textUtils.d.ts +13 -0
  302. package/dist/src/utils/textUtils.js +28 -0
  303. package/dist/src/utils/textUtils.js.map +1 -0
  304. package/dist/tsconfig.tsbuildinfo +1 -1
  305. package/package.json +4 -3
  306. package/dist/google-gemini-cli-core-0.1.11.tgz +0 -0
  307. package/dist/src/core/geminiRequest.test.js +0 -72
  308. package/dist/src/core/geminiRequest.test.js.map +0 -1
  309. /package/dist/src/{core/geminiRequest.test.d.ts → ide/ideContext.test.d.ts} +0 -0
@@ -0,0 +1,183 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { getErrorMessage } from '../utils/errors.js';
7
+ /**
8
+ * Utility class for common OAuth operations.
9
+ */
10
+ export class OAuthUtils {
11
+ /**
12
+ * Construct well-known OAuth endpoint URLs.
13
+ */
14
+ static buildWellKnownUrls(baseUrl) {
15
+ const serverUrl = new URL(baseUrl);
16
+ const base = `${serverUrl.protocol}//${serverUrl.host}`;
17
+ return {
18
+ protectedResource: new URL('/.well-known/oauth-protected-resource', base).toString(),
19
+ authorizationServer: new URL('/.well-known/oauth-authorization-server', base).toString(),
20
+ };
21
+ }
22
+ /**
23
+ * Fetch OAuth protected resource metadata.
24
+ *
25
+ * @param resourceMetadataUrl The protected resource metadata URL
26
+ * @returns The protected resource metadata or null if not available
27
+ */
28
+ static async fetchProtectedResourceMetadata(resourceMetadataUrl) {
29
+ try {
30
+ const response = await fetch(resourceMetadataUrl);
31
+ if (!response.ok) {
32
+ return null;
33
+ }
34
+ return (await response.json());
35
+ }
36
+ catch (error) {
37
+ console.debug(`Failed to fetch protected resource metadata from ${resourceMetadataUrl}: ${getErrorMessage(error)}`);
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Fetch OAuth authorization server metadata.
43
+ *
44
+ * @param authServerMetadataUrl The authorization server metadata URL
45
+ * @returns The authorization server metadata or null if not available
46
+ */
47
+ static async fetchAuthorizationServerMetadata(authServerMetadataUrl) {
48
+ try {
49
+ const response = await fetch(authServerMetadataUrl);
50
+ if (!response.ok) {
51
+ return null;
52
+ }
53
+ return (await response.json());
54
+ }
55
+ catch (error) {
56
+ console.debug(`Failed to fetch authorization server metadata from ${authServerMetadataUrl}: ${getErrorMessage(error)}`);
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Convert authorization server metadata to OAuth configuration.
62
+ *
63
+ * @param metadata The authorization server metadata
64
+ * @returns The OAuth configuration
65
+ */
66
+ static metadataToOAuthConfig(metadata) {
67
+ return {
68
+ authorizationUrl: metadata.authorization_endpoint,
69
+ tokenUrl: metadata.token_endpoint,
70
+ scopes: metadata.scopes_supported || [],
71
+ };
72
+ }
73
+ /**
74
+ * Discover OAuth configuration using the standard well-known endpoints.
75
+ *
76
+ * @param serverUrl The base URL of the server
77
+ * @returns The discovered OAuth configuration or null if not available
78
+ */
79
+ static async discoverOAuthConfig(serverUrl) {
80
+ try {
81
+ const wellKnownUrls = this.buildWellKnownUrls(serverUrl);
82
+ // First, try to get the protected resource metadata
83
+ const resourceMetadata = await this.fetchProtectedResourceMetadata(wellKnownUrls.protectedResource);
84
+ if (resourceMetadata?.authorization_servers?.length) {
85
+ // Use the first authorization server
86
+ const authServerUrl = resourceMetadata.authorization_servers[0];
87
+ const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
88
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
89
+ if (authServerMetadata) {
90
+ const config = this.metadataToOAuthConfig(authServerMetadata);
91
+ if (authServerMetadata.registration_endpoint) {
92
+ console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
93
+ }
94
+ return config;
95
+ }
96
+ }
97
+ // Fallback: try /.well-known/oauth-authorization-server at the base URL
98
+ console.debug(`Trying OAuth discovery fallback at ${wellKnownUrls.authorizationServer}`);
99
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(wellKnownUrls.authorizationServer);
100
+ if (authServerMetadata) {
101
+ const config = this.metadataToOAuthConfig(authServerMetadata);
102
+ if (authServerMetadata.registration_endpoint) {
103
+ console.log('Dynamic client registration is supported at:', authServerMetadata.registration_endpoint);
104
+ }
105
+ return config;
106
+ }
107
+ return null;
108
+ }
109
+ catch (error) {
110
+ console.debug(`Failed to discover OAuth configuration: ${getErrorMessage(error)}`);
111
+ return null;
112
+ }
113
+ }
114
+ /**
115
+ * Parse WWW-Authenticate header to extract OAuth information.
116
+ *
117
+ * @param header The WWW-Authenticate header value
118
+ * @returns The resource metadata URI if found
119
+ */
120
+ static parseWWWAuthenticateHeader(header) {
121
+ // Parse Bearer realm and resource_metadata_uri
122
+ const match = header.match(/resource_metadata_uri="([^"]+)"/);
123
+ if (match) {
124
+ return match[1];
125
+ }
126
+ return null;
127
+ }
128
+ /**
129
+ * Discover OAuth configuration from WWW-Authenticate header.
130
+ *
131
+ * @param wwwAuthenticate The WWW-Authenticate header value
132
+ * @returns The discovered OAuth configuration or null if not available
133
+ */
134
+ static async discoverOAuthFromWWWAuthenticate(wwwAuthenticate) {
135
+ const resourceMetadataUri = this.parseWWWAuthenticateHeader(wwwAuthenticate);
136
+ if (!resourceMetadataUri) {
137
+ return null;
138
+ }
139
+ console.log(`Found resource metadata URI from www-authenticate header: ${resourceMetadataUri}`);
140
+ const resourceMetadata = await this.fetchProtectedResourceMetadata(resourceMetadataUri);
141
+ if (!resourceMetadata?.authorization_servers?.length) {
142
+ return null;
143
+ }
144
+ const authServerUrl = resourceMetadata.authorization_servers[0];
145
+ const authServerMetadataUrl = new URL('/.well-known/oauth-authorization-server', authServerUrl).toString();
146
+ const authServerMetadata = await this.fetchAuthorizationServerMetadata(authServerMetadataUrl);
147
+ if (authServerMetadata) {
148
+ console.log('OAuth configuration discovered successfully from www-authenticate header');
149
+ return this.metadataToOAuthConfig(authServerMetadata);
150
+ }
151
+ return null;
152
+ }
153
+ /**
154
+ * Extract base URL from an MCP server URL.
155
+ *
156
+ * @param mcpServerUrl The MCP server URL
157
+ * @returns The base URL
158
+ */
159
+ static extractBaseUrl(mcpServerUrl) {
160
+ const serverUrl = new URL(mcpServerUrl);
161
+ return `${serverUrl.protocol}//${serverUrl.host}`;
162
+ }
163
+ /**
164
+ * Check if a URL is an SSE endpoint.
165
+ *
166
+ * @param url The URL to check
167
+ * @returns True if the URL appears to be an SSE endpoint
168
+ */
169
+ static isSSEEndpoint(url) {
170
+ return url.includes('/sse') || !url.includes('/mcp');
171
+ }
172
+ /**
173
+ * Build a resource parameter for OAuth requests.
174
+ *
175
+ * @param endpointUrl The endpoint URL
176
+ * @returns The resource parameter value
177
+ */
178
+ static buildResourceParameter(endpointUrl) {
179
+ const url = new URL(endpointUrl);
180
+ return `${url.protocol}//${url.host}`;
181
+ }
182
+ }
183
+ //# sourceMappingURL=oauth-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-utils.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.ts"],"names":[],"mappings":"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"}
@@ -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,144 @@
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 { OAuthUtils, } from './oauth-utils.js';
8
+ // Mock fetch globally
9
+ const mockFetch = vi.fn();
10
+ global.fetch = mockFetch;
11
+ describe('OAuthUtils', () => {
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ vi.spyOn(console, 'debug').mockImplementation(() => { });
15
+ vi.spyOn(console, 'error').mockImplementation(() => { });
16
+ vi.spyOn(console, 'log').mockImplementation(() => { });
17
+ });
18
+ afterEach(() => {
19
+ vi.restoreAllMocks();
20
+ });
21
+ describe('buildWellKnownUrls', () => {
22
+ it('should build correct well-known URLs', () => {
23
+ const urls = OAuthUtils.buildWellKnownUrls('https://example.com/path');
24
+ expect(urls.protectedResource).toBe('https://example.com/.well-known/oauth-protected-resource');
25
+ expect(urls.authorizationServer).toBe('https://example.com/.well-known/oauth-authorization-server');
26
+ });
27
+ });
28
+ describe('fetchProtectedResourceMetadata', () => {
29
+ const mockResourceMetadata = {
30
+ resource: 'https://api.example.com',
31
+ authorization_servers: ['https://auth.example.com'],
32
+ bearer_methods_supported: ['header'],
33
+ };
34
+ it('should fetch protected resource metadata successfully', async () => {
35
+ mockFetch.mockResolvedValueOnce({
36
+ ok: true,
37
+ json: () => Promise.resolve(mockResourceMetadata),
38
+ });
39
+ const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
40
+ expect(result).toEqual(mockResourceMetadata);
41
+ });
42
+ it('should return null when fetch fails', async () => {
43
+ mockFetch.mockResolvedValueOnce({
44
+ ok: false,
45
+ });
46
+ const result = await OAuthUtils.fetchProtectedResourceMetadata('https://example.com/.well-known/oauth-protected-resource');
47
+ expect(result).toBeNull();
48
+ });
49
+ });
50
+ describe('fetchAuthorizationServerMetadata', () => {
51
+ const mockAuthServerMetadata = {
52
+ issuer: 'https://auth.example.com',
53
+ authorization_endpoint: 'https://auth.example.com/authorize',
54
+ token_endpoint: 'https://auth.example.com/token',
55
+ scopes_supported: ['read', 'write'],
56
+ };
57
+ it('should fetch authorization server metadata successfully', async () => {
58
+ mockFetch.mockResolvedValueOnce({
59
+ ok: true,
60
+ json: () => Promise.resolve(mockAuthServerMetadata),
61
+ });
62
+ const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
63
+ expect(result).toEqual(mockAuthServerMetadata);
64
+ });
65
+ it('should return null when fetch fails', async () => {
66
+ mockFetch.mockResolvedValueOnce({
67
+ ok: false,
68
+ });
69
+ const result = await OAuthUtils.fetchAuthorizationServerMetadata('https://auth.example.com/.well-known/oauth-authorization-server');
70
+ expect(result).toBeNull();
71
+ });
72
+ });
73
+ describe('metadataToOAuthConfig', () => {
74
+ it('should convert metadata to OAuth config', () => {
75
+ const metadata = {
76
+ issuer: 'https://auth.example.com',
77
+ authorization_endpoint: 'https://auth.example.com/authorize',
78
+ token_endpoint: 'https://auth.example.com/token',
79
+ scopes_supported: ['read', 'write'],
80
+ };
81
+ const config = OAuthUtils.metadataToOAuthConfig(metadata);
82
+ expect(config).toEqual({
83
+ authorizationUrl: 'https://auth.example.com/authorize',
84
+ tokenUrl: 'https://auth.example.com/token',
85
+ scopes: ['read', 'write'],
86
+ });
87
+ });
88
+ it('should handle empty scopes', () => {
89
+ const metadata = {
90
+ issuer: 'https://auth.example.com',
91
+ authorization_endpoint: 'https://auth.example.com/authorize',
92
+ token_endpoint: 'https://auth.example.com/token',
93
+ };
94
+ const config = OAuthUtils.metadataToOAuthConfig(metadata);
95
+ expect(config.scopes).toEqual([]);
96
+ });
97
+ });
98
+ describe('parseWWWAuthenticateHeader', () => {
99
+ it('should parse resource metadata URI from WWW-Authenticate header', () => {
100
+ const header = 'Bearer realm="example", resource_metadata_uri="https://example.com/.well-known/oauth-protected-resource"';
101
+ const result = OAuthUtils.parseWWWAuthenticateHeader(header);
102
+ expect(result).toBe('https://example.com/.well-known/oauth-protected-resource');
103
+ });
104
+ it('should return null when no resource metadata URI is found', () => {
105
+ const header = 'Bearer realm="example"';
106
+ const result = OAuthUtils.parseWWWAuthenticateHeader(header);
107
+ expect(result).toBeNull();
108
+ });
109
+ });
110
+ describe('extractBaseUrl', () => {
111
+ it('should extract base URL from MCP server URL', () => {
112
+ const result = OAuthUtils.extractBaseUrl('https://example.com/mcp/v1');
113
+ expect(result).toBe('https://example.com');
114
+ });
115
+ it('should handle URLs with ports', () => {
116
+ const result = OAuthUtils.extractBaseUrl('https://example.com:8080/mcp/v1');
117
+ expect(result).toBe('https://example.com:8080');
118
+ });
119
+ });
120
+ describe('isSSEEndpoint', () => {
121
+ it('should return true for SSE endpoints', () => {
122
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/sse')).toBe(true);
123
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api/v1/sse')).toBe(true);
124
+ });
125
+ it('should return true for non-MCP endpoints', () => {
126
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api')).toBe(true);
127
+ });
128
+ it('should return false for MCP endpoints', () => {
129
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/mcp')).toBe(false);
130
+ expect(OAuthUtils.isSSEEndpoint('https://example.com/api/mcp/v1')).toBe(false);
131
+ });
132
+ });
133
+ describe('buildResourceParameter', () => {
134
+ it('should build resource parameter from endpoint URL', () => {
135
+ const result = OAuthUtils.buildResourceParameter('https://example.com/oauth/token');
136
+ expect(result).toBe('https://example.com');
137
+ });
138
+ it('should handle URLs with ports', () => {
139
+ const result = OAuthUtils.buildResourceParameter('https://example.com:8080/oauth/token');
140
+ expect(result).toBe('https://example.com:8080');
141
+ });
142
+ });
143
+ });
144
+ //# sourceMappingURL=oauth-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-utils.test.js","sourceRoot":"","sources":["../../../src/mcp/oauth-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Config } from '../config/config.js';
7
+ import { DiscoveredMCPPrompt } from '../tools/mcp-client.js';
8
+ export declare function getMCPServerPrompts(config: Config, serverName: string): DiscoveredMCPPrompt[];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export function getMCPServerPrompts(config, serverName) {
7
+ const promptRegistry = config.getPromptRegistry();
8
+ if (!promptRegistry) {
9
+ return [];
10
+ }
11
+ return promptRegistry.getPromptsByServer(serverName);
12
+ }
13
+ //# sourceMappingURL=mcp-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-prompts.js","sourceRoot":"","sources":["../../../src/prompts/mcp-prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,UAAkB;IAElB,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAClD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { DiscoveredMCPPrompt } from '../tools/mcp-client.js';
7
+ export declare class PromptRegistry {
8
+ private prompts;
9
+ /**
10
+ * Registers a prompt definition.
11
+ * @param prompt - The prompt object containing schema and execution logic.
12
+ */
13
+ registerPrompt(prompt: DiscoveredMCPPrompt): void;
14
+ /**
15
+ * Returns an array of all registered and discovered prompt instances.
16
+ */
17
+ getAllPrompts(): DiscoveredMCPPrompt[];
18
+ /**
19
+ * Get the definition of a specific prompt.
20
+ */
21
+ getPrompt(name: string): DiscoveredMCPPrompt | undefined;
22
+ /**
23
+ * Returns an array of prompts registered from a specific MCP server.
24
+ */
25
+ getPromptsByServer(serverName: string): DiscoveredMCPPrompt[];
26
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export class PromptRegistry {
7
+ prompts = new Map();
8
+ /**
9
+ * Registers a prompt definition.
10
+ * @param prompt - The prompt object containing schema and execution logic.
11
+ */
12
+ registerPrompt(prompt) {
13
+ if (this.prompts.has(prompt.name)) {
14
+ const newName = `${prompt.serverName}_${prompt.name}`;
15
+ console.warn(`Prompt with name "${prompt.name}" is already registered. Renaming to "${newName}".`);
16
+ this.prompts.set(newName, { ...prompt, name: newName });
17
+ }
18
+ else {
19
+ this.prompts.set(prompt.name, prompt);
20
+ }
21
+ }
22
+ /**
23
+ * Returns an array of all registered and discovered prompt instances.
24
+ */
25
+ getAllPrompts() {
26
+ return Array.from(this.prompts.values()).sort((a, b) => a.name.localeCompare(b.name));
27
+ }
28
+ /**
29
+ * Get the definition of a specific prompt.
30
+ */
31
+ getPrompt(name) {
32
+ return this.prompts.get(name);
33
+ }
34
+ /**
35
+ * Returns an array of prompts registered from a specific MCP server.
36
+ */
37
+ getPromptsByServer(serverName) {
38
+ const serverPrompts = [];
39
+ for (const prompt of this.prompts.values()) {
40
+ if (prompt.serverName === serverName) {
41
+ serverPrompts.push(prompt);
42
+ }
43
+ }
44
+ return serverPrompts.sort((a, b) => a.name.localeCompare(b.name));
45
+ }
46
+ }
47
+ //# sourceMappingURL=prompt-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-registry.js","sourceRoot":"","sources":["../../../src/prompts/prompt-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAqC,IAAI,GAAG,EAAE,CAAC;IAE9D;;;OAGG;IACH,cAAc,CAAC,MAA2B;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CACV,qBAAqB,MAAM,CAAC,IAAI,yCAAyC,OAAO,IAAI,CACrF,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrD,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAAkB;QACnC,MAAM,aAAa,GAA0B,EAAE,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,CAAC;CACF"}