@office-ai/aioncli-core 0.18.7 → 0.24.0-preview.1

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 (890) hide show
  1. package/dist/docs/CONTRIBUTING.md +546 -0
  2. package/dist/docs/architecture.md +80 -0
  3. package/dist/docs/assets/connected_devtools.png +0 -0
  4. package/dist/docs/assets/gemini-screenshot.png +0 -0
  5. package/dist/docs/assets/release_patch.png +0 -0
  6. package/dist/docs/assets/theme-ansi-light.png +0 -0
  7. package/dist/docs/assets/theme-ansi.png +0 -0
  8. package/dist/docs/assets/theme-atom-one.png +0 -0
  9. package/dist/docs/assets/theme-ayu-light.png +0 -0
  10. package/dist/docs/assets/theme-ayu.png +0 -0
  11. package/dist/docs/assets/theme-custom.png +0 -0
  12. package/dist/docs/assets/theme-default-light.png +0 -0
  13. package/dist/docs/assets/theme-default.png +0 -0
  14. package/dist/docs/assets/theme-dracula.png +0 -0
  15. package/dist/docs/assets/theme-github-light.png +0 -0
  16. package/dist/docs/assets/theme-github.png +0 -0
  17. package/dist/docs/assets/theme-google-light.png +0 -0
  18. package/dist/docs/assets/theme-xcode-light.png +0 -0
  19. package/dist/docs/changelogs/index.md +592 -0
  20. package/dist/docs/changelogs/latest.md +225 -0
  21. package/dist/docs/changelogs/preview.md +129 -0
  22. package/dist/docs/changelogs/releases.md +896 -0
  23. package/dist/docs/cli/authentication.md +3 -0
  24. package/dist/docs/cli/checkpointing.md +94 -0
  25. package/dist/docs/cli/commands.md +354 -0
  26. package/dist/docs/cli/configuration.md +780 -0
  27. package/dist/docs/cli/custom-commands.md +315 -0
  28. package/dist/docs/cli/enterprise.md +565 -0
  29. package/dist/docs/cli/gemini-ignore.md +71 -0
  30. package/dist/docs/cli/gemini-md.md +108 -0
  31. package/dist/docs/cli/generation-settings.md +210 -0
  32. package/dist/docs/cli/headless.md +388 -0
  33. package/dist/docs/cli/index.md +63 -0
  34. package/dist/docs/cli/keyboard-shortcuts.md +143 -0
  35. package/dist/docs/cli/model-routing.md +37 -0
  36. package/dist/docs/cli/model.md +62 -0
  37. package/dist/docs/cli/sandbox.md +171 -0
  38. package/dist/docs/cli/session-management.md +158 -0
  39. package/dist/docs/cli/settings.md +114 -0
  40. package/dist/docs/cli/skills.md +156 -0
  41. package/dist/docs/cli/system-prompt.md +93 -0
  42. package/dist/docs/cli/telemetry.md +791 -0
  43. package/dist/docs/cli/themes.md +237 -0
  44. package/dist/docs/cli/token-caching.md +20 -0
  45. package/dist/docs/cli/trusted-folders.md +95 -0
  46. package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
  47. package/dist/docs/cli/tutorials.md +87 -0
  48. package/dist/docs/cli/uninstall.md +47 -0
  49. package/dist/docs/core/index.md +101 -0
  50. package/dist/docs/core/memport.md +244 -0
  51. package/dist/docs/core/policy-engine.md +267 -0
  52. package/dist/docs/core/tools-api.md +131 -0
  53. package/dist/docs/examples/proxy-script.md +83 -0
  54. package/dist/docs/extension.md +160 -0
  55. package/dist/docs/extensions/extension-releasing.md +183 -0
  56. package/dist/docs/extensions/getting-started-extensions.md +245 -0
  57. package/dist/docs/extensions/index.md +293 -0
  58. package/dist/docs/faq.md +154 -0
  59. package/dist/docs/get-started/authentication.md +321 -0
  60. package/dist/docs/get-started/configuration-v1.md +888 -0
  61. package/dist/docs/get-started/configuration.md +1536 -0
  62. package/dist/docs/get-started/deployment.md +143 -0
  63. package/dist/docs/get-started/examples.md +219 -0
  64. package/dist/docs/get-started/gemini-3.md +116 -0
  65. package/dist/docs/get-started/index.md +71 -0
  66. package/dist/docs/get-started/installation.md +141 -0
  67. package/dist/docs/hooks/best-practices.md +856 -0
  68. package/dist/docs/hooks/index.md +687 -0
  69. package/dist/docs/hooks/reference.md +168 -0
  70. package/dist/docs/hooks/writing-hooks.md +1026 -0
  71. package/dist/docs/ide-integration/ide-companion-spec.md +267 -0
  72. package/dist/docs/ide-integration/index.md +202 -0
  73. package/dist/docs/index.md +147 -0
  74. package/dist/docs/integration-tests.md +211 -0
  75. package/dist/docs/issue-and-pr-automation.md +134 -0
  76. package/dist/docs/local-development.md +128 -0
  77. package/dist/docs/mermaid/context.mmd +103 -0
  78. package/dist/docs/mermaid/render-path.mmd +64 -0
  79. package/dist/docs/npm.md +62 -0
  80. package/dist/docs/quota-and-pricing.md +158 -0
  81. package/dist/docs/release-confidence.md +164 -0
  82. package/dist/docs/releases.md +540 -0
  83. package/dist/docs/sidebar.json +301 -0
  84. package/dist/docs/tools/file-system.md +217 -0
  85. package/dist/docs/tools/index.md +95 -0
  86. package/dist/docs/tools/mcp-server.md +1044 -0
  87. package/dist/docs/tools/memory.md +54 -0
  88. package/dist/docs/tools/shell.md +260 -0
  89. package/dist/docs/tools/todos.md +57 -0
  90. package/dist/docs/tools/web-fetch.md +59 -0
  91. package/dist/docs/tools/web-search.md +42 -0
  92. package/dist/docs/tos-privacy.md +96 -0
  93. package/dist/docs/troubleshooting.md +158 -0
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.js +1 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/src/agents/a2a-client-manager.d.ts +78 -0
  98. package/dist/src/agents/a2a-client-manager.js +295 -0
  99. package/dist/src/agents/a2a-client-manager.js.map +1 -0
  100. package/dist/src/agents/a2a-client-manager.test.d.ts +6 -0
  101. package/dist/src/agents/a2a-client-manager.test.js +237 -0
  102. package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
  103. package/dist/src/agents/a2aUtils.d.ts +28 -0
  104. package/dist/src/agents/a2aUtils.js +111 -0
  105. package/dist/src/agents/a2aUtils.js.map +1 -0
  106. package/dist/src/agents/a2aUtils.test.d.ts +6 -0
  107. package/dist/src/agents/a2aUtils.test.js +147 -0
  108. package/dist/src/agents/a2aUtils.test.js.map +1 -0
  109. package/dist/src/agents/codebase-investigator.d.ts +2 -2
  110. package/dist/src/agents/codebase-investigator.js +5 -4
  111. package/dist/src/agents/codebase-investigator.js.map +1 -1
  112. package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
  113. package/dist/src/agents/delegate-to-agent-tool.js +115 -0
  114. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
  115. package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
  116. package/dist/src/agents/delegate-to-agent-tool.test.js +165 -0
  117. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
  118. package/dist/src/agents/introspection-agent.d.ts +23 -0
  119. package/dist/src/agents/introspection-agent.js +72 -0
  120. package/dist/src/agents/introspection-agent.js.map +1 -0
  121. package/dist/src/agents/introspection-agent.test.d.ts +6 -0
  122. package/dist/src/agents/introspection-agent.test.js +47 -0
  123. package/dist/src/agents/introspection-agent.test.js.map +1 -0
  124. package/dist/src/agents/local-executor.d.ts +108 -0
  125. package/dist/src/agents/local-executor.js +801 -0
  126. package/dist/src/agents/local-executor.js.map +1 -0
  127. package/dist/src/agents/local-executor.test.d.ts +6 -0
  128. package/dist/src/agents/local-executor.test.js +1380 -0
  129. package/dist/src/agents/local-executor.test.js.map +1 -0
  130. package/dist/src/agents/local-invocation.d.ts +45 -0
  131. package/dist/src/agents/local-invocation.js +101 -0
  132. package/dist/src/agents/local-invocation.js.map +1 -0
  133. package/dist/src/agents/local-invocation.test.d.ts +6 -0
  134. package/dist/src/agents/local-invocation.test.js +218 -0
  135. package/dist/src/agents/local-invocation.test.js.map +1 -0
  136. package/dist/src/agents/registry.d.ts +25 -1
  137. package/dist/src/agents/registry.js +149 -5
  138. package/dist/src/agents/registry.js.map +1 -1
  139. package/dist/src/agents/registry.test.js +247 -25
  140. package/dist/src/agents/registry.test.js.map +1 -1
  141. package/dist/src/agents/remote-invocation.d.ts +35 -0
  142. package/dist/src/agents/remote-invocation.js +129 -0
  143. package/dist/src/agents/remote-invocation.js.map +1 -0
  144. package/dist/src/agents/remote-invocation.test.d.ts +6 -0
  145. package/dist/src/agents/remote-invocation.test.js +201 -0
  146. package/dist/src/agents/remote-invocation.test.js.map +1 -0
  147. package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
  148. package/dist/src/agents/subagent-tool-wrapper.js +11 -6
  149. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  150. package/dist/src/agents/subagent-tool-wrapper.test.js +25 -17
  151. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  152. package/dist/src/agents/toml-loader.d.ts +74 -0
  153. package/dist/src/agents/toml-loader.js +248 -0
  154. package/dist/src/agents/toml-loader.js.map +1 -0
  155. package/dist/src/agents/toml-loader.test.d.ts +6 -0
  156. package/dist/src/agents/toml-loader.test.js +309 -0
  157. package/dist/src/agents/toml-loader.test.js.map +1 -0
  158. package/dist/src/agents/types.d.ts +18 -4
  159. package/dist/src/availability/errorClassification.d.ts +7 -0
  160. package/dist/src/availability/errorClassification.js +20 -0
  161. package/dist/src/availability/errorClassification.js.map +1 -0
  162. package/dist/src/availability/modelAvailabilityService.d.ts +36 -0
  163. package/dist/src/availability/modelAvailabilityService.js +87 -0
  164. package/dist/src/availability/modelAvailabilityService.js.map +1 -0
  165. package/dist/src/availability/modelAvailabilityService.test.d.ts +6 -0
  166. package/dist/src/availability/modelAvailabilityService.test.js +140 -0
  167. package/dist/src/availability/modelAvailabilityService.test.js.map +1 -0
  168. package/dist/src/availability/modelPolicy.d.ts +49 -0
  169. package/dist/src/availability/modelPolicy.js +7 -0
  170. package/dist/src/availability/modelPolicy.js.map +1 -0
  171. package/dist/src/availability/policyCatalog.d.ts +23 -0
  172. package/dist/src/availability/policyCatalog.js +82 -0
  173. package/dist/src/availability/policyCatalog.js.map +1 -0
  174. package/dist/src/availability/policyCatalog.test.d.ts +6 -0
  175. package/dist/src/availability/policyCatalog.test.js +70 -0
  176. package/dist/src/availability/policyCatalog.test.js.map +1 -0
  177. package/dist/src/availability/policyHelpers.d.ts +52 -0
  178. package/dist/src/availability/policyHelpers.js +136 -0
  179. package/dist/src/availability/policyHelpers.js.map +1 -0
  180. package/dist/src/availability/policyHelpers.test.d.ts +6 -0
  181. package/dist/src/availability/policyHelpers.test.js +182 -0
  182. package/dist/src/availability/policyHelpers.test.js.map +1 -0
  183. package/dist/src/availability/testUtils.d.ts +10 -0
  184. package/dist/src/availability/testUtils.js +22 -0
  185. package/dist/src/availability/testUtils.js.map +1 -0
  186. package/dist/src/code_assist/experiments/client_metadata.js +3 -2
  187. package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
  188. package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
  189. package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
  190. package/dist/src/code_assist/experiments/experiments.js +2 -2
  191. package/dist/src/code_assist/experiments/experiments.js.map +1 -1
  192. package/dist/src/code_assist/oauth2.d.ts +2 -0
  193. package/dist/src/code_assist/oauth2.js +73 -17
  194. package/dist/src/code_assist/oauth2.js.map +1 -1
  195. package/dist/src/code_assist/oauth2.test.js +195 -18
  196. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  197. package/dist/src/code_assist/server.d.ts +10 -1
  198. package/dist/src/code_assist/server.js +81 -15
  199. package/dist/src/code_assist/server.js.map +1 -1
  200. package/dist/src/code_assist/server.test.js +221 -25
  201. package/dist/src/code_assist/server.test.js.map +1 -1
  202. package/dist/src/code_assist/setup.js +6 -4
  203. package/dist/src/code_assist/setup.js.map +1 -1
  204. package/dist/src/code_assist/setup.test.js +63 -0
  205. package/dist/src/code_assist/setup.test.js.map +1 -1
  206. package/dist/src/code_assist/telemetry.d.ts +14 -0
  207. package/dist/src/code_assist/telemetry.js +156 -0
  208. package/dist/src/code_assist/telemetry.js.map +1 -0
  209. package/dist/src/code_assist/telemetry.test.d.ts +6 -0
  210. package/dist/src/code_assist/telemetry.test.js +300 -0
  211. package/dist/src/code_assist/telemetry.test.js.map +1 -0
  212. package/dist/src/code_assist/types.d.ts +84 -1
  213. package/dist/src/code_assist/types.js +21 -0
  214. package/dist/src/code_assist/types.js.map +1 -1
  215. package/dist/src/commands/init.d.ts +7 -0
  216. package/dist/src/commands/init.js +53 -0
  217. package/dist/src/commands/init.js.map +1 -0
  218. package/dist/src/commands/init.test.d.ts +6 -0
  219. package/dist/src/commands/init.test.js +25 -0
  220. package/dist/src/commands/init.test.js.map +1 -0
  221. package/dist/src/commands/restore.d.ts +9 -0
  222. package/dist/src/commands/restore.js +46 -0
  223. package/dist/src/commands/restore.js.map +1 -0
  224. package/dist/src/commands/restore.test.d.ts +6 -0
  225. package/dist/src/commands/restore.test.js +137 -0
  226. package/dist/src/commands/restore.test.js.map +1 -0
  227. package/dist/src/commands/types.d.ts +41 -0
  228. package/dist/src/commands/types.js +7 -0
  229. package/dist/src/commands/types.js.map +1 -0
  230. package/dist/src/config/config.d.ts +120 -23
  231. package/dist/src/config/config.js +336 -116
  232. package/dist/src/config/config.js.map +1 -1
  233. package/dist/src/config/config.test.js +373 -95
  234. package/dist/src/config/config.test.js.map +1 -1
  235. package/dist/src/config/defaultModelConfigs.js +46 -0
  236. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  237. package/dist/src/config/flashFallback.test.js +11 -35
  238. package/dist/src/config/flashFallback.test.js.map +1 -1
  239. package/dist/src/config/models.d.ts +29 -15
  240. package/dist/src/config/models.js +78 -28
  241. package/dist/src/config/models.js.map +1 -1
  242. package/dist/src/config/models.test.js +91 -77
  243. package/dist/src/config/models.test.js.map +1 -1
  244. package/dist/src/config/storage.d.ts +4 -0
  245. package/dist/src/config/storage.js +12 -0
  246. package/dist/src/config/storage.js.map +1 -1
  247. package/dist/src/config/storage.test.js +16 -0
  248. package/dist/src/config/storage.test.js.map +1 -1
  249. package/dist/src/confirmation-bus/message-bus.d.ts +6 -0
  250. package/dist/src/confirmation-bus/message-bus.js +66 -3
  251. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  252. package/dist/src/confirmation-bus/types.d.ts +29 -2
  253. package/dist/src/confirmation-bus/types.js +3 -0
  254. package/dist/src/confirmation-bus/types.js.map +1 -1
  255. package/dist/src/core/baseLlmClient.d.ts +30 -2
  256. package/dist/src/core/baseLlmClient.js +107 -49
  257. package/dist/src/core/baseLlmClient.js.map +1 -1
  258. package/dist/src/core/baseLlmClient.test.js +271 -13
  259. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  260. package/dist/src/core/client.d.ts +5 -1
  261. package/dist/src/core/client.js +241 -63
  262. package/dist/src/core/client.js.map +1 -1
  263. package/dist/src/core/client.test.js +462 -72
  264. package/dist/src/core/client.test.js.map +1 -1
  265. package/dist/src/core/clientHookTriggers.d.ts +36 -0
  266. package/dist/src/core/clientHookTriggers.js +76 -0
  267. package/dist/src/core/clientHookTriggers.js.map +1 -0
  268. package/dist/src/core/contentGenerator.js +17 -4
  269. package/dist/src/core/contentGenerator.js.map +1 -1
  270. package/dist/src/core/contentGenerator.test.js +132 -3
  271. package/dist/src/core/contentGenerator.test.js.map +1 -1
  272. package/dist/src/core/coreToolHookTriggers.d.ts +55 -0
  273. package/dist/src/core/coreToolHookTriggers.js +304 -0
  274. package/dist/src/core/coreToolHookTriggers.js.map +1 -0
  275. package/dist/src/core/coreToolHookTriggers.test.d.ts +6 -0
  276. package/dist/src/core/coreToolHookTriggers.test.js +191 -0
  277. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -0
  278. package/dist/src/core/coreToolScheduler.d.ts +6 -85
  279. package/dist/src/core/coreToolScheduler.js +69 -267
  280. package/dist/src/core/coreToolScheduler.js.map +1 -1
  281. package/dist/src/core/coreToolScheduler.test.js +161 -346
  282. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  283. package/dist/src/core/geminiChat.js +132 -76
  284. package/dist/src/core/geminiChat.js.map +1 -1
  285. package/dist/src/core/geminiChat.test.js +240 -257
  286. package/dist/src/core/geminiChat.test.js.map +1 -1
  287. package/dist/src/core/geminiChatHookTriggers.d.ts +64 -0
  288. package/dist/src/core/geminiChatHookTriggers.js +136 -0
  289. package/dist/src/core/geminiChatHookTriggers.js.map +1 -0
  290. package/dist/src/core/geminiChat_network_retry.test.d.ts +6 -0
  291. package/dist/src/core/geminiChat_network_retry.test.js +196 -0
  292. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -0
  293. package/dist/src/core/logger.js.map +1 -1
  294. package/dist/src/core/loggingContentGenerator.js +23 -6
  295. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  296. package/dist/src/core/nonInteractiveToolExecutor.test.js +13 -8
  297. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  298. package/dist/src/core/prompts.js +82 -26
  299. package/dist/src/core/prompts.js.map +1 -1
  300. package/dist/src/core/prompts.test.js +102 -3
  301. package/dist/src/core/prompts.test.js.map +1 -1
  302. package/dist/src/core/sessionHookTriggers.d.ts +29 -0
  303. package/dist/src/core/sessionHookTriggers.js +75 -0
  304. package/dist/src/core/sessionHookTriggers.js.map +1 -0
  305. package/dist/src/core/turn.d.ts +34 -21
  306. package/dist/src/core/turn.js +33 -13
  307. package/dist/src/core/turn.js.map +1 -1
  308. package/dist/src/core/turn.test.js +0 -5
  309. package/dist/src/core/turn.test.js.map +1 -1
  310. package/dist/src/fallback/handler.js +101 -93
  311. package/dist/src/fallback/handler.js.map +1 -1
  312. package/dist/src/fallback/handler.test.js +186 -173
  313. package/dist/src/fallback/handler.test.js.map +1 -1
  314. package/dist/src/fallback/types.d.ts +8 -0
  315. package/dist/src/generated/git-commit.d.ts +3 -3
  316. package/dist/src/generated/git-commit.js +3 -3
  317. package/dist/src/generated/git-commit.js.map +1 -1
  318. package/dist/src/hooks/hookAggregator.js +7 -0
  319. package/dist/src/hooks/hookAggregator.js.map +1 -1
  320. package/dist/src/hooks/hookEventHandler.d.ts +113 -0
  321. package/dist/src/hooks/hookEventHandler.js +571 -0
  322. package/dist/src/hooks/hookEventHandler.js.map +1 -0
  323. package/dist/src/hooks/hookEventHandler.test.d.ts +6 -0
  324. package/dist/src/hooks/hookEventHandler.test.js +461 -0
  325. package/dist/src/hooks/hookEventHandler.test.js.map +1 -0
  326. package/dist/src/hooks/hookPlanner.d.ts +1 -5
  327. package/dist/src/hooks/hookPlanner.js +2 -7
  328. package/dist/src/hooks/hookPlanner.js.map +1 -1
  329. package/dist/src/hooks/hookPlanner.test.js +62 -2
  330. package/dist/src/hooks/hookPlanner.test.js.map +1 -1
  331. package/dist/src/hooks/hookRegistry.d.ts +6 -18
  332. package/dist/src/hooks/hookRegistry.js +49 -35
  333. package/dist/src/hooks/hookRegistry.js.map +1 -1
  334. package/dist/src/hooks/hookRegistry.test.js +167 -8
  335. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  336. package/dist/src/hooks/hookRunner.d.ts +5 -3
  337. package/dist/src/hooks/hookRunner.js +74 -18
  338. package/dist/src/hooks/hookRunner.js.map +1 -1
  339. package/dist/src/hooks/hookRunner.test.js +174 -36
  340. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  341. package/dist/src/hooks/hookSystem.d.ts +40 -0
  342. package/dist/src/hooks/hookSystem.js +65 -0
  343. package/dist/src/hooks/hookSystem.js.map +1 -0
  344. package/dist/src/hooks/hookSystem.test.d.ts +6 -0
  345. package/dist/src/hooks/hookSystem.test.js +319 -0
  346. package/dist/src/hooks/hookSystem.test.js.map +1 -0
  347. package/dist/src/hooks/index.d.ts +17 -0
  348. package/dist/src/hooks/index.js +18 -0
  349. package/dist/src/hooks/index.js.map +1 -0
  350. package/dist/src/hooks/trustedHooks.d.ts +28 -0
  351. package/dist/src/hooks/trustedHooks.js +90 -0
  352. package/dist/src/hooks/trustedHooks.js.map +1 -0
  353. package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
  354. package/dist/src/hooks/trustedHooks.test.js +154 -0
  355. package/dist/src/hooks/trustedHooks.test.js.map +1 -0
  356. package/dist/src/hooks/types.d.ts +21 -11
  357. package/dist/src/hooks/types.js +31 -27
  358. package/dist/src/hooks/types.js.map +1 -1
  359. package/dist/src/hooks/types.test.js +5 -24
  360. package/dist/src/hooks/types.test.js.map +1 -1
  361. package/dist/src/ide/detect-ide.test.js +32 -1
  362. package/dist/src/ide/detect-ide.test.js.map +1 -1
  363. package/dist/src/ide/ide-client.js +9 -4
  364. package/dist/src/ide/ide-client.js.map +1 -1
  365. package/dist/src/ide/ide-client.test.js +17 -0
  366. package/dist/src/ide/ide-client.test.js.map +1 -1
  367. package/dist/src/ide/ide-installer.test.js +1 -1
  368. package/dist/src/ide/ide-installer.test.js.map +1 -1
  369. package/dist/src/ide/types.d.ts +4 -4
  370. package/dist/src/index.d.ts +17 -1
  371. package/dist/src/index.js +18 -2
  372. package/dist/src/index.js.map +1 -1
  373. package/dist/src/mcp/auth-provider.d.ts +16 -0
  374. package/dist/src/mcp/auth-provider.js +7 -0
  375. package/dist/src/mcp/auth-provider.js.map +1 -0
  376. package/dist/src/mcp/google-auth-provider.d.ts +10 -2
  377. package/dist/src/mcp/google-auth-provider.js +28 -0
  378. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  379. package/dist/src/mcp/google-auth-provider.test.js +45 -0
  380. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  381. package/dist/src/mcp/oauth-provider.js +6 -2
  382. package/dist/src/mcp/oauth-provider.js.map +1 -1
  383. package/dist/src/mcp/oauth-provider.test.js +4 -1
  384. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  385. package/dist/src/mcp/oauth-utils.d.ts +8 -1
  386. package/dist/src/mcp/oauth-utils.js +31 -2
  387. package/dist/src/mcp/oauth-utils.js.map +1 -1
  388. package/dist/src/mcp/oauth-utils.test.js +42 -0
  389. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  390. package/dist/src/mcp/sa-impersonation-provider.d.ts +2 -2
  391. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  392. package/dist/src/mcp/token-storage/hybrid-token-storage.js +1 -1
  393. package/dist/src/mcp/token-storage/hybrid-token-storage.js.map +1 -1
  394. package/dist/src/mcp/token-storage/keychain-token-storage.js +1 -1
  395. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  396. package/dist/src/output/json-formatter.d.ts +2 -2
  397. package/dist/src/output/json-formatter.js +6 -3
  398. package/dist/src/output/json-formatter.js.map +1 -1
  399. package/dist/src/output/json-formatter.test.js +37 -9
  400. package/dist/src/output/json-formatter.test.js.map +1 -1
  401. package/dist/src/output/stream-json-formatter.js +6 -0
  402. package/dist/src/output/stream-json-formatter.js.map +1 -1
  403. package/dist/src/output/stream-json-formatter.test.js +98 -100
  404. package/dist/src/output/stream-json-formatter.test.js.map +1 -1
  405. package/dist/src/output/types.d.ts +3 -0
  406. package/dist/src/output/types.js.map +1 -1
  407. package/dist/src/policy/config.js +140 -15
  408. package/dist/src/policy/config.js.map +1 -1
  409. package/dist/src/policy/config.test.js +21 -0
  410. package/dist/src/policy/config.test.js.map +1 -1
  411. package/dist/src/policy/persistence.test.d.ts +6 -0
  412. package/dist/src/policy/persistence.test.js +154 -0
  413. package/dist/src/policy/persistence.test.js.map +1 -0
  414. package/dist/src/policy/policies/agent.toml +31 -0
  415. package/dist/src/policy/policies/read-only.toml +5 -0
  416. package/dist/src/policy/policies/write.toml +5 -0
  417. package/dist/src/policy/policies/yolo.toml +1 -0
  418. package/dist/src/policy/policy-engine.d.ts +30 -1
  419. package/dist/src/policy/policy-engine.js +192 -5
  420. package/dist/src/policy/policy-engine.js.map +1 -1
  421. package/dist/src/policy/policy-engine.test.js +520 -3
  422. package/dist/src/policy/policy-engine.test.js.map +1 -1
  423. package/dist/src/policy/policy-updater.test.d.ts +6 -0
  424. package/dist/src/policy/policy-updater.test.js +116 -0
  425. package/dist/src/policy/policy-updater.test.js.map +1 -0
  426. package/dist/src/policy/shell-safety.test.d.ts +6 -0
  427. package/dist/src/policy/shell-safety.test.js +75 -0
  428. package/dist/src/policy/shell-safety.test.js.map +1 -0
  429. package/dist/src/policy/toml-loader.d.ts +3 -5
  430. package/dist/src/policy/toml-loader.js +12 -60
  431. package/dist/src/policy/toml-loader.js.map +1 -1
  432. package/dist/src/policy/toml-loader.test.js +38 -7
  433. package/dist/src/policy/toml-loader.test.js.map +1 -1
  434. package/dist/src/policy/types.d.ts +72 -1
  435. package/dist/src/policy/types.js +21 -0
  436. package/dist/src/policy/types.js.map +1 -1
  437. package/dist/src/policy/utils.d.ts +21 -0
  438. package/dist/src/policy/utils.js +42 -0
  439. package/dist/src/policy/utils.js.map +1 -0
  440. package/dist/src/policy/utils.test.d.ts +6 -0
  441. package/dist/src/policy/utils.test.js +64 -0
  442. package/dist/src/policy/utils.test.js.map +1 -0
  443. package/dist/src/resources/resource-registry.d.ts +30 -0
  444. package/dist/src/resources/resource-registry.js +57 -0
  445. package/dist/src/resources/resource-registry.js.map +1 -0
  446. package/dist/src/resources/resource-registry.test.d.ts +6 -0
  447. package/dist/src/resources/resource-registry.test.js +54 -0
  448. package/dist/src/resources/resource-registry.test.js.map +1 -0
  449. package/dist/src/routing/modelRouterService.js +0 -15
  450. package/dist/src/routing/modelRouterService.js.map +1 -1
  451. package/dist/src/routing/modelRouterService.test.js +0 -62
  452. package/dist/src/routing/modelRouterService.test.js.map +1 -1
  453. package/dist/src/routing/strategies/classifierStrategy.js +10 -21
  454. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  455. package/dist/src/routing/strategies/classifierStrategy.test.js +2 -1
  456. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  457. package/dist/src/routing/strategies/compositeStrategy.js +4 -2
  458. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
  459. package/dist/src/routing/strategies/compositeStrategy.test.js +11 -10
  460. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
  461. package/dist/src/routing/strategies/fallbackStrategy.js +20 -12
  462. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  463. package/dist/src/routing/strategies/fallbackStrategy.test.js +63 -39
  464. package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
  465. package/dist/src/routing/strategies/overrideStrategy.js +3 -2
  466. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  467. package/dist/src/safety/checker-runner.js +17 -6
  468. package/dist/src/safety/checker-runner.js.map +1 -1
  469. package/dist/src/scheduler/tool-executor.d.ts +22 -0
  470. package/dist/src/scheduler/tool-executor.js +198 -0
  471. package/dist/src/scheduler/tool-executor.js.map +1 -0
  472. package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
  473. package/dist/src/scheduler/tool-executor.test.js +231 -0
  474. package/dist/src/scheduler/tool-executor.test.js.map +1 -0
  475. package/dist/src/scheduler/types.d.ts +95 -0
  476. package/dist/src/scheduler/types.js +7 -0
  477. package/dist/src/scheduler/types.js.map +1 -0
  478. package/dist/src/services/chatCompressionService.d.ts +1 -0
  479. package/dist/src/services/chatCompressionService.js +38 -8
  480. package/dist/src/services/chatCompressionService.js.map +1 -1
  481. package/dist/src/services/chatCompressionService.test.js +35 -31
  482. package/dist/src/services/chatCompressionService.test.js.map +1 -1
  483. package/dist/src/services/chatRecordingService.d.ts +14 -0
  484. package/dist/src/services/chatRecordingService.js +37 -0
  485. package/dist/src/services/chatRecordingService.js.map +1 -1
  486. package/dist/src/services/contextManager.d.ts +29 -0
  487. package/dist/src/services/contextManager.js +71 -0
  488. package/dist/src/services/contextManager.js.map +1 -0
  489. package/dist/src/services/contextManager.test.d.ts +6 -0
  490. package/dist/src/services/contextManager.test.js +104 -0
  491. package/dist/src/services/contextManager.test.js.map +1 -0
  492. package/dist/src/services/environmentSanitization.d.ts +15 -0
  493. package/dist/src/services/environmentSanitization.js +141 -0
  494. package/dist/src/services/environmentSanitization.js.map +1 -0
  495. package/dist/src/services/environmentSanitization.test.d.ts +6 -0
  496. package/dist/src/services/environmentSanitization.test.js +284 -0
  497. package/dist/src/services/environmentSanitization.test.js.map +1 -0
  498. package/dist/src/services/fileSystemService.d.ts +0 -9
  499. package/dist/src/services/fileSystemService.js +0 -11
  500. package/dist/src/services/fileSystemService.js.map +1 -1
  501. package/dist/src/services/gitService.js +18 -2
  502. package/dist/src/services/gitService.js.map +1 -1
  503. package/dist/src/services/gitService.test.js +56 -0
  504. package/dist/src/services/gitService.test.js.map +1 -1
  505. package/dist/src/services/loopDetectionService.js +5 -4
  506. package/dist/src/services/loopDetectionService.js.map +1 -1
  507. package/dist/src/services/loopDetectionService.test.js +14 -8
  508. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  509. package/dist/src/services/modelConfig.golden.test.js +32 -0
  510. package/dist/src/services/modelConfig.golden.test.js.map +1 -1
  511. package/dist/src/services/modelConfig.integration.test.js +1 -1
  512. package/dist/src/services/modelConfig.integration.test.js.map +1 -1
  513. package/dist/src/services/modelConfigService.d.ts +4 -0
  514. package/dist/src/services/modelConfigService.js +8 -3
  515. package/dist/src/services/modelConfigService.js.map +1 -1
  516. package/dist/src/services/modelConfigService.test.js +221 -0
  517. package/dist/src/services/modelConfigService.test.js.map +1 -1
  518. package/dist/src/services/modelConfigServiceTestUtils.d.ts +10 -0
  519. package/dist/src/services/modelConfigServiceTestUtils.js +17 -0
  520. package/dist/src/services/modelConfigServiceTestUtils.js.map +1 -0
  521. package/dist/src/services/sessionSummaryService.d.ts +28 -0
  522. package/dist/src/services/sessionSummaryService.js +131 -0
  523. package/dist/src/services/sessionSummaryService.js.map +1 -0
  524. package/dist/src/services/sessionSummaryService.test.d.ts +6 -0
  525. package/dist/src/services/sessionSummaryService.test.js +785 -0
  526. package/dist/src/services/sessionSummaryService.test.js.map +1 -0
  527. package/dist/src/services/sessionSummaryUtils.d.ts +16 -0
  528. package/dist/src/services/sessionSummaryUtils.js +129 -0
  529. package/dist/src/services/sessionSummaryUtils.js.map +1 -0
  530. package/dist/src/services/sessionSummaryUtils.test.d.ts +6 -0
  531. package/dist/src/services/sessionSummaryUtils.test.js +137 -0
  532. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -0
  533. package/dist/src/services/shellExecutionService.d.ts +4 -0
  534. package/dist/src/services/shellExecutionService.js +45 -27
  535. package/dist/src/services/shellExecutionService.js.map +1 -1
  536. package/dist/src/services/shellExecutionService.test.js +240 -8
  537. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  538. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +238 -0
  539. package/dist/src/services/test-data/resolved-aliases.golden.json +36 -0
  540. package/dist/src/skills/skillLoader.d.ts +28 -0
  541. package/dist/src/skills/skillLoader.js +77 -0
  542. package/dist/src/skills/skillLoader.js.map +1 -0
  543. package/dist/src/skills/skillLoader.test.d.ts +1 -0
  544. package/dist/src/skills/skillLoader.test.js +2 -0
  545. package/dist/src/skills/skillLoader.test.js.map +1 -0
  546. package/dist/src/skills/skillManager.d.ts +51 -0
  547. package/dist/src/skills/skillManager.js +89 -0
  548. package/dist/src/skills/skillManager.js.map +1 -0
  549. package/dist/src/skills/skillManager.test.d.ts +6 -0
  550. package/dist/src/skills/skillManager.test.js +128 -0
  551. package/dist/src/skills/skillManager.test.js.map +1 -0
  552. package/dist/src/telemetry/activity-detector.test.js.map +1 -1
  553. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +11 -7
  554. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +127 -47
  555. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  556. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +105 -18
  557. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  558. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +9 -3
  559. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +20 -5
  560. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  561. package/dist/src/telemetry/config.js +2 -0
  562. package/dist/src/telemetry/config.js.map +1 -1
  563. package/dist/src/telemetry/config.test.js +25 -0
  564. package/dist/src/telemetry/config.test.js.map +1 -1
  565. package/dist/src/telemetry/gcp-exporters.d.ts +4 -3
  566. package/dist/src/telemetry/gcp-exporters.js +8 -4
  567. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  568. package/dist/src/telemetry/index.d.ts +2 -1
  569. package/dist/src/telemetry/index.js +2 -1
  570. package/dist/src/telemetry/index.js.map +1 -1
  571. package/dist/src/telemetry/loggers.d.ts +5 -3
  572. package/dist/src/telemetry/loggers.js +353 -334
  573. package/dist/src/telemetry/loggers.js.map +1 -1
  574. package/dist/src/telemetry/loggers.test.circular.js +1 -0
  575. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  576. package/dist/src/telemetry/loggers.test.js +238 -31
  577. package/dist/src/telemetry/loggers.test.js.map +1 -1
  578. package/dist/src/telemetry/metrics.d.ts +22 -0
  579. package/dist/src/telemetry/metrics.js +32 -0
  580. package/dist/src/telemetry/metrics.js.map +1 -1
  581. package/dist/src/telemetry/metrics.test.js +64 -0
  582. package/dist/src/telemetry/metrics.test.js.map +1 -1
  583. package/dist/src/telemetry/sanitize.d.ts +25 -0
  584. package/dist/src/telemetry/sanitize.js +48 -0
  585. package/dist/src/telemetry/sanitize.js.map +1 -0
  586. package/dist/src/telemetry/sanitize.test.d.ts +6 -0
  587. package/dist/src/telemetry/sanitize.test.js +279 -0
  588. package/dist/src/telemetry/sanitize.test.js.map +1 -0
  589. package/dist/src/telemetry/sdk.d.ts +9 -2
  590. package/dist/src/telemetry/sdk.js +142 -17
  591. package/dist/src/telemetry/sdk.js.map +1 -1
  592. package/dist/src/telemetry/sdk.test.js +130 -28
  593. package/dist/src/telemetry/sdk.test.js.map +1 -1
  594. package/dist/src/telemetry/semantic.js +1 -1
  595. package/dist/src/telemetry/semantic.js.map +1 -1
  596. package/dist/src/telemetry/startupProfiler.d.ts +51 -0
  597. package/dist/src/telemetry/startupProfiler.js +170 -0
  598. package/dist/src/telemetry/startupProfiler.js.map +1 -0
  599. package/dist/src/telemetry/startupProfiler.test.d.ts +6 -0
  600. package/dist/src/telemetry/startupProfiler.test.js +285 -0
  601. package/dist/src/telemetry/startupProfiler.test.js.map +1 -0
  602. package/dist/src/telemetry/telemetry.test.js +10 -3
  603. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  604. package/dist/src/telemetry/trace.js +2 -2
  605. package/dist/src/telemetry/trace.js.map +1 -1
  606. package/dist/src/telemetry/types.d.ts +62 -16
  607. package/dist/src/telemetry/types.js +157 -27
  608. package/dist/src/telemetry/types.js.map +1 -1
  609. package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
  610. package/dist/src/telemetry/uiTelemetry.js +2 -0
  611. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  612. package/dist/src/telemetry/uiTelemetry.test.js +4 -0
  613. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  614. package/dist/src/test-utils/mock-message-bus.d.ts +61 -0
  615. package/dist/src/test-utils/mock-message-bus.js +160 -0
  616. package/dist/src/test-utils/mock-message-bus.js.map +1 -0
  617. package/dist/src/test-utils/mock-tool.d.ts +5 -3
  618. package/dist/src/test-utils/mock-tool.js +12 -11
  619. package/dist/src/test-utils/mock-tool.js.map +1 -1
  620. package/dist/src/tools/activate-skill.d.ts +27 -0
  621. package/dist/src/tools/activate-skill.js +120 -0
  622. package/dist/src/tools/activate-skill.js.map +1 -0
  623. package/dist/src/tools/activate-skill.test.d.ts +6 -0
  624. package/dist/src/tools/activate-skill.test.js +95 -0
  625. package/dist/src/tools/activate-skill.test.js.map +1 -0
  626. package/dist/src/tools/confirmation-policy.test.d.ts +6 -0
  627. package/dist/src/tools/confirmation-policy.test.js +142 -0
  628. package/dist/src/tools/confirmation-policy.test.js.map +1 -0
  629. package/dist/src/tools/edit.d.ts +27 -5
  630. package/dist/src/tools/edit.js +449 -137
  631. package/dist/src/tools/edit.js.map +1 -1
  632. package/dist/src/tools/edit.test.js +258 -526
  633. package/dist/src/tools/edit.test.js.map +1 -1
  634. package/dist/src/tools/get-internal-docs.d.ts +27 -0
  635. package/dist/src/tools/get-internal-docs.js +129 -0
  636. package/dist/src/tools/get-internal-docs.js.map +1 -0
  637. package/dist/src/tools/get-internal-docs.test.d.ts +6 -0
  638. package/dist/src/tools/get-internal-docs.test.js +57 -0
  639. package/dist/src/tools/get-internal-docs.test.js.map +1 -0
  640. package/dist/src/tools/glob.d.ts +2 -2
  641. package/dist/src/tools/glob.js +1 -1
  642. package/dist/src/tools/glob.js.map +1 -1
  643. package/dist/src/tools/glob.test.js +2 -1
  644. package/dist/src/tools/glob.test.js.map +1 -1
  645. package/dist/src/tools/grep.d.ts +2 -2
  646. package/dist/src/tools/grep.js +1 -1
  647. package/dist/src/tools/grep.js.map +1 -1
  648. package/dist/src/tools/grep.test.js +5 -4
  649. package/dist/src/tools/grep.test.js.map +1 -1
  650. package/dist/src/tools/ls.d.ts +2 -2
  651. package/dist/src/tools/ls.js +2 -2
  652. package/dist/src/tools/ls.js.map +1 -1
  653. package/dist/src/tools/ls.test.js +2 -1
  654. package/dist/src/tools/ls.test.js.map +1 -1
  655. package/dist/src/tools/mcp-client-manager.d.ts +3 -1
  656. package/dist/src/tools/mcp-client-manager.js +42 -9
  657. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  658. package/dist/src/tools/mcp-client-manager.test.js +66 -10
  659. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  660. package/dist/src/tools/mcp-client.d.ts +44 -6
  661. package/dist/src/tools/mcp-client.js +476 -176
  662. package/dist/src/tools/mcp-client.js.map +1 -1
  663. package/dist/src/tools/mcp-client.test.js +633 -36
  664. package/dist/src/tools/mcp-client.test.js.map +1 -1
  665. package/dist/src/tools/mcp-tool.d.ts +2 -2
  666. package/dist/src/tools/mcp-tool.js +20 -7
  667. package/dist/src/tools/mcp-tool.js.map +1 -1
  668. package/dist/src/tools/mcp-tool.test.js +35 -5
  669. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  670. package/dist/src/tools/memoryTool.d.ts +3 -3
  671. package/dist/src/tools/memoryTool.js +3 -4
  672. package/dist/src/tools/memoryTool.js.map +1 -1
  673. package/dist/src/tools/memoryTool.test.js +5 -2
  674. package/dist/src/tools/memoryTool.test.js.map +1 -1
  675. package/dist/src/tools/message-bus-integration.test.js +10 -37
  676. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  677. package/dist/src/tools/modifiable-tool.js.map +1 -1
  678. package/dist/src/tools/modifiable-tool.test.js +22 -13
  679. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  680. package/dist/src/tools/read-file.d.ts +2 -2
  681. package/dist/src/tools/read-file.js +2 -2
  682. package/dist/src/tools/read-file.js.map +1 -1
  683. package/dist/src/tools/read-file.test.js +3 -2
  684. package/dist/src/tools/read-file.test.js.map +1 -1
  685. package/dist/src/tools/read-many-files.d.ts +2 -2
  686. package/dist/src/tools/read-many-files.js +7 -6
  687. package/dist/src/tools/read-many-files.js.map +1 -1
  688. package/dist/src/tools/read-many-files.test.js +4 -3
  689. package/dist/src/tools/read-many-files.test.js.map +1 -1
  690. package/dist/src/tools/ripGrep.d.ts +3 -2
  691. package/dist/src/tools/ripGrep.js +18 -7
  692. package/dist/src/tools/ripGrep.js.map +1 -1
  693. package/dist/src/tools/ripGrep.test.js +60 -4
  694. package/dist/src/tools/ripGrep.test.js.map +1 -1
  695. package/dist/src/tools/shell.d.ts +5 -7
  696. package/dist/src/tools/shell.js +77 -51
  697. package/dist/src/tools/shell.js.map +1 -1
  698. package/dist/src/tools/shell.test.js +59 -63
  699. package/dist/src/tools/shell.test.js.map +1 -1
  700. package/dist/src/tools/tool-error.d.ts +2 -1
  701. package/dist/src/tools/tool-error.js +2 -0
  702. package/dist/src/tools/tool-error.js.map +1 -1
  703. package/dist/src/tools/tool-names.d.ts +17 -0
  704. package/dist/src/tools/tool-names.js +59 -0
  705. package/dist/src/tools/tool-names.js.map +1 -1
  706. package/dist/src/tools/tool-names.test.d.ts +6 -0
  707. package/dist/src/tools/tool-names.test.js +43 -0
  708. package/dist/src/tools/tool-names.test.js.map +1 -0
  709. package/dist/src/tools/tool-registry.d.ts +11 -7
  710. package/dist/src/tools/tool-registry.js +15 -10
  711. package/dist/src/tools/tool-registry.js.map +1 -1
  712. package/dist/src/tools/tool-registry.test.js +16 -11
  713. package/dist/src/tools/tool-registry.test.js.map +1 -1
  714. package/dist/src/tools/tools.d.ts +25 -6
  715. package/dist/src/tools/tools.js +44 -25
  716. package/dist/src/tools/tools.js.map +1 -1
  717. package/dist/src/tools/tools.test.js +3 -1
  718. package/dist/src/tools/tools.test.js.map +1 -1
  719. package/dist/src/tools/web-fetch.d.ts +2 -2
  720. package/dist/src/tools/web-fetch.js +22 -9
  721. package/dist/src/tools/web-fetch.js.map +1 -1
  722. package/dist/src/tools/web-fetch.test.js +18 -19
  723. package/dist/src/tools/web-fetch.test.js.map +1 -1
  724. package/dist/src/tools/web-search.d.ts +2 -2
  725. package/dist/src/tools/web-search.js +5 -5
  726. package/dist/src/tools/web-search.js.map +1 -1
  727. package/dist/src/tools/web-search.test.js +2 -1
  728. package/dist/src/tools/web-search.test.js.map +1 -1
  729. package/dist/src/tools/write-file.d.ts +2 -2
  730. package/dist/src/tools/write-file.js +10 -4
  731. package/dist/src/tools/write-file.js.map +1 -1
  732. package/dist/src/tools/write-file.test.js +4 -1
  733. package/dist/src/tools/write-file.test.js.map +1 -1
  734. package/dist/src/tools/write-todos.d.ts +2 -2
  735. package/dist/src/tools/write-todos.js +5 -4
  736. package/dist/src/tools/write-todos.js.map +1 -1
  737. package/dist/src/tools/write-todos.test.js +2 -1
  738. package/dist/src/tools/write-todos.test.js.map +1 -1
  739. package/dist/src/utils/bfsFileSearch.d.ts +8 -0
  740. package/dist/src/utils/bfsFileSearch.js +63 -23
  741. package/dist/src/utils/bfsFileSearch.js.map +1 -1
  742. package/dist/src/utils/bfsFileSearch.test.js +65 -1
  743. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  744. package/dist/src/utils/checkpointUtils.d.ts +82 -0
  745. package/dist/src/utils/checkpointUtils.js +117 -0
  746. package/dist/src/utils/checkpointUtils.js.map +1 -0
  747. package/dist/src/utils/checkpointUtils.test.d.ts +6 -0
  748. package/dist/src/utils/checkpointUtils.test.js +229 -0
  749. package/dist/src/utils/checkpointUtils.test.js.map +1 -0
  750. package/dist/src/utils/customHeaderUtils.d.ts +9 -0
  751. package/dist/src/utils/customHeaderUtils.js +34 -0
  752. package/dist/src/utils/customHeaderUtils.js.map +1 -0
  753. package/dist/src/utils/customHeaderUtils.test.d.ts +6 -0
  754. package/dist/src/utils/customHeaderUtils.test.js +77 -0
  755. package/dist/src/utils/customHeaderUtils.test.js.map +1 -0
  756. package/dist/src/utils/debugLogger.d.ts +3 -0
  757. package/dist/src/utils/debugLogger.js +28 -0
  758. package/dist/src/utils/debugLogger.js.map +1 -1
  759. package/dist/src/utils/editCorrector.js +6 -5
  760. package/dist/src/utils/editCorrector.js.map +1 -1
  761. package/dist/src/utils/editCorrector.test.js +7 -3
  762. package/dist/src/utils/editCorrector.test.js.map +1 -1
  763. package/dist/src/utils/editor.d.ts +9 -1
  764. package/dist/src/utils/editor.js +23 -14
  765. package/dist/src/utils/editor.js.map +1 -1
  766. package/dist/src/utils/environmentContext.d.ts +1 -0
  767. package/dist/src/utils/environmentContext.js +4 -0
  768. package/dist/src/utils/environmentContext.js.map +1 -1
  769. package/dist/src/utils/environmentContext.test.js +2 -0
  770. package/dist/src/utils/environmentContext.test.js.map +1 -1
  771. package/dist/src/utils/errorReporting.d.ts +1 -1
  772. package/dist/src/utils/errorReporting.js +13 -12
  773. package/dist/src/utils/errorReporting.js.map +1 -1
  774. package/dist/src/utils/errorReporting.test.js +17 -14
  775. package/dist/src/utils/errorReporting.test.js.map +1 -1
  776. package/dist/src/utils/errors.d.ts +8 -0
  777. package/dist/src/utils/errors.js +39 -2
  778. package/dist/src/utils/errors.js.map +1 -1
  779. package/dist/src/utils/errors.test.d.ts +6 -0
  780. package/dist/src/utils/errors.test.js +155 -0
  781. package/dist/src/utils/errors.test.js.map +1 -0
  782. package/dist/src/utils/events.d.ts +49 -19
  783. package/dist/src/utils/events.js +21 -9
  784. package/dist/src/utils/events.js.map +1 -1
  785. package/dist/src/utils/events.test.js +25 -0
  786. package/dist/src/utils/events.test.js.map +1 -1
  787. package/dist/src/utils/exitCodes.d.ts +12 -0
  788. package/dist/src/utils/exitCodes.js +13 -0
  789. package/dist/src/utils/exitCodes.js.map +1 -0
  790. package/dist/src/utils/extensionLoader.d.ts +2 -2
  791. package/dist/src/utils/extensionLoader.js +5 -6
  792. package/dist/src/utils/extensionLoader.js.map +1 -1
  793. package/dist/src/utils/extensionLoader.test.js +11 -0
  794. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  795. package/dist/src/utils/fetch.d.ts +1 -1
  796. package/dist/src/utils/fetch.js +3 -3
  797. package/dist/src/utils/fetch.js.map +1 -1
  798. package/dist/src/utils/fileUtils.d.ts +4 -0
  799. package/dist/src/utils/fileUtils.js +53 -0
  800. package/dist/src/utils/fileUtils.js.map +1 -1
  801. package/dist/src/utils/fileUtils.test.js +127 -1
  802. package/dist/src/utils/fileUtils.test.js.map +1 -1
  803. package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
  804. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  805. package/dist/src/utils/flashFallback.test.js +1 -1
  806. package/dist/src/utils/flashFallback.test.js.map +1 -1
  807. package/dist/src/utils/geminiIgnoreParser.d.ts +11 -0
  808. package/dist/src/utils/geminiIgnoreParser.js +20 -0
  809. package/dist/src/utils/geminiIgnoreParser.js.map +1 -1
  810. package/dist/src/utils/geminiIgnoreParser.test.js +48 -0
  811. package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -1
  812. package/dist/src/utils/generateContentResponseUtilities.d.ts +3 -1
  813. package/dist/src/utils/generateContentResponseUtilities.js +106 -0
  814. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  815. package/dist/src/utils/generateContentResponseUtilities.test.js +279 -2
  816. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  817. package/dist/src/utils/getFolderStructure.js +7 -2
  818. package/dist/src/utils/getFolderStructure.js.map +1 -1
  819. package/dist/src/utils/googleErrors.js +31 -18
  820. package/dist/src/utils/googleErrors.js.map +1 -1
  821. package/dist/src/utils/googleErrors.test.js +10 -2
  822. package/dist/src/utils/googleErrors.test.js.map +1 -1
  823. package/dist/src/utils/googleQuotaErrors.d.ts +3 -3
  824. package/dist/src/utils/googleQuotaErrors.js +32 -6
  825. package/dist/src/utils/googleQuotaErrors.js.map +1 -1
  826. package/dist/src/utils/googleQuotaErrors.test.js +94 -2
  827. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
  828. package/dist/src/utils/memoryDiscovery.d.ts +5 -0
  829. package/dist/src/utils/memoryDiscovery.js +9 -5
  830. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  831. package/dist/src/utils/memoryDiscovery.test.js +31 -1
  832. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  833. package/dist/src/utils/nextSpeakerChecker.test.js +4 -0
  834. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
  835. package/dist/src/utils/package.d.ts +14 -0
  836. package/dist/src/utils/package.js +15 -2
  837. package/dist/src/utils/package.js.map +1 -1
  838. package/dist/src/utils/pathCorrector.js +12 -2
  839. package/dist/src/utils/pathCorrector.js.map +1 -1
  840. package/dist/src/utils/pathCorrector.test.js +6 -2
  841. package/dist/src/utils/pathCorrector.test.js.map +1 -1
  842. package/dist/src/utils/retry.d.ts +11 -0
  843. package/dist/src/utils/retry.js +62 -21
  844. package/dist/src/utils/retry.js.map +1 -1
  845. package/dist/src/utils/retry.test.js +170 -10
  846. package/dist/src/utils/retry.test.js.map +1 -1
  847. package/dist/src/utils/schemaValidator.d.ts +1 -1
  848. package/dist/src/utils/schemaValidator.js +1 -1
  849. package/dist/src/utils/shell-permissions.d.ts +52 -0
  850. package/dist/src/utils/shell-permissions.js +188 -0
  851. package/dist/src/utils/shell-permissions.js.map +1 -0
  852. package/dist/src/utils/shell-permissions.test.d.ts +6 -0
  853. package/dist/src/utils/shell-permissions.test.js +369 -0
  854. package/dist/src/utils/shell-permissions.test.js.map +1 -0
  855. package/dist/src/utils/shell-utils.d.ts +16 -47
  856. package/dist/src/utils/shell-utils.js +99 -195
  857. package/dist/src/utils/shell-utils.js.map +1 -1
  858. package/dist/src/utils/shell-utils.test.js +99 -288
  859. package/dist/src/utils/shell-utils.test.js.map +1 -1
  860. package/dist/src/utils/stdio.d.ts +2 -2
  861. package/dist/src/utils/stdio.js +2 -2
  862. package/dist/src/utils/stdio.js.map +1 -1
  863. package/dist/src/utils/stdio.test.js +5 -5
  864. package/dist/src/utils/stdio.test.js.map +1 -1
  865. package/dist/src/utils/summarizer.test.js +3 -2
  866. package/dist/src/utils/summarizer.test.js.map +1 -1
  867. package/dist/src/utils/terminal.d.ts +4 -0
  868. package/dist/src/utils/terminal.js +12 -0
  869. package/dist/src/utils/terminal.js.map +1 -1
  870. package/dist/src/utils/terminalSerializer.test.js +17 -0
  871. package/dist/src/utils/terminalSerializer.test.js.map +1 -1
  872. package/dist/src/utils/tokenCalculation.d.ts +19 -0
  873. package/dist/src/utils/tokenCalculation.js +85 -0
  874. package/dist/src/utils/tokenCalculation.js.map +1 -0
  875. package/dist/src/utils/tokenCalculation.test.d.ts +6 -0
  876. package/dist/src/utils/tokenCalculation.test.js +87 -0
  877. package/dist/src/utils/tokenCalculation.test.js.map +1 -0
  878. package/dist/src/utils/tool-utils.d.ts +9 -0
  879. package/dist/src/utils/tool-utils.js +29 -0
  880. package/dist/src/utils/tool-utils.js.map +1 -1
  881. package/dist/src/utils/tool-utils.test.js +17 -2
  882. package/dist/src/utils/tool-utils.test.js.map +1 -1
  883. package/dist/src/utils/version.d.ts +6 -0
  884. package/dist/src/utils/version.js +15 -0
  885. package/dist/src/utils/version.js.map +1 -0
  886. package/dist/src/utils/version.test.d.ts +6 -0
  887. package/dist/src/utils/version.test.js +39 -0
  888. package/dist/src/utils/version.test.js.map +1 -0
  889. package/dist/tsconfig.tsbuildinfo +1 -1
  890. package/package.json +8 -7
@@ -4,10 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
7
+ import { AjvJsonSchemaValidator } from '@modelcontextprotocol/sdk/validation/ajv';
7
8
  import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
8
9
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
9
10
  import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
10
- import { ListRootsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
11
+ import { ListResourcesResultSchema, ListRootsRequestSchema, ReadResourceResultSchema, ResourceListChangedNotificationSchema, ToolListChangedNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
11
12
  import { parse } from 'shell-quote';
12
13
  import { AuthProviderType } from '../config/config.js';
13
14
  import { GoogleCredentialProvider } from '../mcp/google-auth-provider.js';
@@ -18,9 +19,11 @@ import { pathToFileURL } from 'node:url';
18
19
  import { MCPOAuthProvider } from '../mcp/oauth-provider.js';
19
20
  import { MCPOAuthTokenStorage } from '../mcp/oauth-token-storage.js';
20
21
  import { OAuthUtils } from '../mcp/oauth-utils.js';
21
- import { getErrorMessage } from '../utils/errors.js';
22
+ import { getErrorMessage, isAuthenticationError, UnauthorizedError, } from '../utils/errors.js';
22
23
  import { debugLogger } from '../utils/debugLogger.js';
24
+ import {} from '../confirmation-bus/message-bus.js';
23
25
  import { coreEvents } from '../utils/events.js';
26
+ import { sanitizeEnvironment, } from '../services/environmentSanitization.js';
24
27
  export const MCP_DEFAULT_TIMEOUT_MSEC = 10 * 60 * 1000; // default to 10 minutes
25
28
  /**
26
29
  * Enum representing the connection status of an MCP server
@@ -59,18 +62,28 @@ export class McpClient {
59
62
  serverConfig;
60
63
  toolRegistry;
61
64
  promptRegistry;
65
+ resourceRegistry;
62
66
  workspaceContext;
67
+ cliConfig;
63
68
  debugMode;
69
+ onToolsUpdated;
64
70
  client;
65
71
  transport;
66
72
  status = MCPServerStatus.DISCONNECTED;
67
- constructor(serverName, serverConfig, toolRegistry, promptRegistry, workspaceContext, debugMode) {
73
+ isRefreshingTools = false;
74
+ pendingToolRefresh = false;
75
+ isRefreshingResources = false;
76
+ pendingResourceRefresh = false;
77
+ constructor(serverName, serverConfig, toolRegistry, promptRegistry, resourceRegistry, workspaceContext, cliConfig, debugMode, onToolsUpdated) {
68
78
  this.serverName = serverName;
69
79
  this.serverConfig = serverConfig;
70
80
  this.toolRegistry = toolRegistry;
71
81
  this.promptRegistry = promptRegistry;
82
+ this.resourceRegistry = resourceRegistry;
72
83
  this.workspaceContext = workspaceContext;
84
+ this.cliConfig = cliConfig;
73
85
  this.debugMode = debugMode;
86
+ this.onToolsUpdated = onToolsUpdated;
74
87
  }
75
88
  /**
76
89
  * Connects to the MCP server.
@@ -81,7 +94,8 @@ export class McpClient {
81
94
  }
82
95
  this.updateStatus(MCPServerStatus.CONNECTING);
83
96
  try {
84
- this.client = await connectToMcpServer(this.serverName, this.serverConfig, this.debugMode, this.workspaceContext);
97
+ this.client = await connectToMcpServer(this.serverName, this.serverConfig, this.debugMode, this.workspaceContext, this.cliConfig.sanitizationConfig);
98
+ this.registerNotificationHandlers();
85
99
  const originalOnError = this.client.onerror;
86
100
  this.client.onerror = (error) => {
87
101
  if (this.status !== MCPServerStatus.CONNECTED) {
@@ -106,8 +120,10 @@ export class McpClient {
106
120
  this.assertConnected();
107
121
  const prompts = await this.discoverPrompts();
108
122
  const tools = await this.discoverTools(cliConfig);
109
- if (prompts.length === 0 && tools.length === 0) {
110
- throw new Error('No prompts or tools found on the server.');
123
+ const resources = await this.discoverResources();
124
+ this.updateResourceRegistry(resources);
125
+ if (prompts.length === 0 && tools.length === 0 && resources.length === 0) {
126
+ throw new Error('No prompts, tools, or resources found on the server.');
111
127
  }
112
128
  for (const tool of tools) {
113
129
  this.toolRegistry.registerTool(tool);
@@ -123,6 +139,7 @@ export class McpClient {
123
139
  }
124
140
  this.toolRegistry.removeMcpToolsByServer(this.serverName);
125
141
  this.promptRegistry.removePromptsByServer(this.serverName);
142
+ this.resourceRegistry.removeResourcesByServer(this.serverName);
126
143
  this.updateStatus(MCPServerStatus.DISCONNECTING);
127
144
  const client = this.client;
128
145
  this.client = undefined;
@@ -149,17 +166,157 @@ export class McpClient {
149
166
  throw new Error(`Client is not connected, must connect before interacting with the server. Current state is ${this.status}`);
150
167
  }
151
168
  }
152
- async discoverTools(cliConfig) {
169
+ async discoverTools(cliConfig, options) {
153
170
  this.assertConnected();
154
- return discoverTools(this.serverName, this.serverConfig, this.client, cliConfig, this.toolRegistry.getMessageBus());
171
+ return discoverTools(this.serverName, this.serverConfig, this.client, cliConfig, this.toolRegistry.getMessageBus(), options ?? {
172
+ timeout: this.serverConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
173
+ });
155
174
  }
156
175
  async discoverPrompts() {
157
176
  this.assertConnected();
158
177
  return discoverPrompts(this.serverName, this.client, this.promptRegistry);
159
178
  }
179
+ async discoverResources() {
180
+ this.assertConnected();
181
+ return discoverResources(this.serverName, this.client);
182
+ }
183
+ updateResourceRegistry(resources) {
184
+ this.resourceRegistry.setResourcesForServer(this.serverName, resources);
185
+ }
186
+ async readResource(uri) {
187
+ this.assertConnected();
188
+ return this.client.request({
189
+ method: 'resources/read',
190
+ params: { uri },
191
+ }, ReadResourceResultSchema);
192
+ }
193
+ /**
194
+ * Registers notification handlers for dynamic updates from the MCP server.
195
+ * This includes handlers for tool list changes and resource list changes.
196
+ */
197
+ registerNotificationHandlers() {
198
+ if (!this.client) {
199
+ return;
200
+ }
201
+ const capabilities = this.client.getServerCapabilities();
202
+ if (capabilities?.tools?.listChanged) {
203
+ debugLogger.log(`Server '${this.serverName}' supports tool updates. Listening for changes...`);
204
+ this.client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
205
+ debugLogger.log(`🔔 Received tool update notification from '${this.serverName}'`);
206
+ await this.refreshTools();
207
+ });
208
+ }
209
+ if (capabilities?.resources?.listChanged) {
210
+ debugLogger.log(`Server '${this.serverName}' supports resource updates. Listening for changes...`);
211
+ this.client.setNotificationHandler(ResourceListChangedNotificationSchema, async () => {
212
+ debugLogger.log(`🔔 Received resource update notification from '${this.serverName}'`);
213
+ await this.refreshResources();
214
+ });
215
+ }
216
+ }
217
+ /**
218
+ * Refreshes the resources for this server by re-querying the MCP `resources/list` endpoint.
219
+ *
220
+ * This method implements a **Coalescing Pattern** to handle rapid bursts of notifications
221
+ * (e.g., during server startup or bulk updates) without overwhelming the server or
222
+ * creating race conditions in the ResourceRegistry.
223
+ */
224
+ async refreshResources() {
225
+ if (this.isRefreshingResources) {
226
+ debugLogger.log(`Resource refresh for '${this.serverName}' is already in progress. Pending update.`);
227
+ this.pendingResourceRefresh = true;
228
+ return;
229
+ }
230
+ this.isRefreshingResources = true;
231
+ try {
232
+ do {
233
+ this.pendingResourceRefresh = false;
234
+ if (this.status !== MCPServerStatus.CONNECTED || !this.client)
235
+ break;
236
+ const timeoutMs = this.serverConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC;
237
+ const abortController = new AbortController();
238
+ const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);
239
+ let newResources;
240
+ try {
241
+ newResources = await this.discoverResources();
242
+ }
243
+ catch (err) {
244
+ debugLogger.error(`Resource discovery failed during refresh: ${getErrorMessage(err)}`);
245
+ clearTimeout(timeoutId);
246
+ break;
247
+ }
248
+ this.updateResourceRegistry(newResources);
249
+ clearTimeout(timeoutId);
250
+ coreEvents.emitFeedback('info', `Resources updated for server: ${this.serverName}`);
251
+ } while (this.pendingResourceRefresh);
252
+ }
253
+ catch (error) {
254
+ debugLogger.error(`Critical error in resource refresh loop for ${this.serverName}: ${getErrorMessage(error)}`);
255
+ }
256
+ finally {
257
+ this.isRefreshingResources = false;
258
+ this.pendingResourceRefresh = false;
259
+ }
260
+ }
160
261
  getServerConfig() {
161
262
  return this.serverConfig;
162
263
  }
264
+ getInstructions() {
265
+ return this.client?.getInstructions();
266
+ }
267
+ /**
268
+ * Refreshes the tools for this server by re-querying the MCP `tools/list` endpoint.
269
+ *
270
+ * This method implements a **Coalescing Pattern** to handle rapid bursts of notifications
271
+ * (e.g., during server startup or bulk updates) without overwhelming the server or
272
+ * creating race conditions in the global ToolRegistry.
273
+ */
274
+ async refreshTools() {
275
+ if (this.isRefreshingTools) {
276
+ debugLogger.log(`Tool refresh for '${this.serverName}' is already in progress. Pending update.`);
277
+ this.pendingToolRefresh = true;
278
+ return;
279
+ }
280
+ this.isRefreshingTools = true;
281
+ try {
282
+ do {
283
+ this.pendingToolRefresh = false;
284
+ if (this.status !== MCPServerStatus.CONNECTED || !this.client)
285
+ break;
286
+ const timeoutMs = this.serverConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC;
287
+ const abortController = new AbortController();
288
+ const timeoutId = setTimeout(() => abortController.abort(), timeoutMs);
289
+ let newTools;
290
+ try {
291
+ newTools = await this.discoverTools(this.cliConfig, {
292
+ signal: abortController.signal,
293
+ });
294
+ }
295
+ catch (err) {
296
+ debugLogger.error(`Discovery failed during refresh: ${getErrorMessage(err)}`);
297
+ clearTimeout(timeoutId);
298
+ break;
299
+ }
300
+ this.toolRegistry.removeMcpToolsByServer(this.serverName);
301
+ for (const tool of newTools) {
302
+ this.toolRegistry.registerTool(tool);
303
+ }
304
+ this.toolRegistry.sortTools();
305
+ if (this.onToolsUpdated) {
306
+ await this.onToolsUpdated(abortController.signal);
307
+ }
308
+ clearTimeout(timeoutId);
309
+ coreEvents.emitFeedback('info', `Tools updated for server: ${this.serverName}`);
310
+ } while (this.pendingToolRefresh);
311
+ }
312
+ catch (error) {
313
+ debugLogger.error(`Critical error in refresh loop for ${this.serverName}: ${getErrorMessage(error)}`);
314
+ }
315
+ finally {
316
+ this.isRefreshingTools = false;
317
+ this.pendingToolRefresh = false;
318
+ }
319
+ }
163
320
  }
164
321
  /**
165
322
  * Map to track the status of each MCP server within the core package
@@ -318,21 +475,6 @@ function createAuthProvider(mcpServerConfig) {
318
475
  }
319
476
  return undefined;
320
477
  }
321
- /**
322
- * Create a transport for URL based servers (remote servers).
323
- *
324
- * @param mcpServerConfig The MCP server configuration
325
- * @param transportOptions The transport options
326
- */
327
- function createUrlTransport(mcpServerConfig, transportOptions) {
328
- if (mcpServerConfig.httpUrl) {
329
- return new StreamableHTTPClientTransport(new URL(mcpServerConfig.httpUrl), transportOptions);
330
- }
331
- if (mcpServerConfig.url) {
332
- return new SSEClientTransport(new URL(mcpServerConfig.url), transportOptions);
333
- }
334
- throw new Error('No URL configured for MCP Server');
335
- }
336
478
  /**
337
479
  * Create a transport with OAuth token for the given server configuration.
338
480
  *
@@ -349,7 +491,7 @@ async function createTransportWithOAuth(mcpServerName, mcpServerConfig, accessTo
349
491
  const transportOptions = {
350
492
  requestInit: createTransportRequestInit(mcpServerConfig, headers),
351
493
  };
352
- return createUrlTransport(mcpServerConfig, transportOptions);
494
+ return createUrlTransport(mcpServerName, mcpServerConfig, transportOptions);
353
495
  }
354
496
  catch (error) {
355
497
  coreEvents.emitFeedback('error', `Failed to create OAuth transport for server '${mcpServerName}': ${getErrorMessage(error)}`, error);
@@ -377,6 +519,33 @@ export async function discoverMcpTools(mcpServers, mcpServerCommand, toolRegistr
377
519
  mcpDiscoveryState = MCPDiscoveryState.COMPLETED;
378
520
  }
379
521
  }
522
+ /**
523
+ * A tolerant JSON Schema validator for MCP tool output schemas.
524
+ *
525
+ * Some MCP servers (e.g. third‑party extensions) return complex schemas that
526
+ * include `$defs` / `$ref` chains which can occasionally trip AJV's resolver,
527
+ * causing discovery to fail. This wrapper keeps the default AJV validator for
528
+ * normal operation but falls back to a no‑op validator any time schema
529
+ * compilation throws, so we can still list and use the tool while emitting a
530
+ * debug log.
531
+ */
532
+ class LenientJsonSchemaValidator {
533
+ ajvValidator = new AjvJsonSchemaValidator();
534
+ getValidator(schema) {
535
+ try {
536
+ return this.ajvValidator.getValidator(schema);
537
+ }
538
+ catch (error) {
539
+ debugLogger.warn(`Failed to compile MCP tool output schema (${schema?.['$id'] ?? '<no $id>'}): ${error instanceof Error ? error.message : String(error)}. ` +
540
+ 'Skipping output validation for this tool.');
541
+ return (input) => ({
542
+ valid: true,
543
+ data: input,
544
+ errorMessage: undefined,
545
+ });
546
+ }
547
+ }
548
+ }
380
549
  /** Visible for Testing */
381
550
  export function populateMcpServerCommand(mcpServers, mcpServerCommand) {
382
551
  if (mcpServerCommand) {
@@ -407,14 +576,14 @@ export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolReg
407
576
  updateMCPServerStatus(mcpServerName, MCPServerStatus.CONNECTING);
408
577
  let mcpClient;
409
578
  try {
410
- mcpClient = await connectToMcpServer(mcpServerName, mcpServerConfig, debugMode, workspaceContext);
579
+ mcpClient = await connectToMcpServer(mcpServerName, mcpServerConfig, debugMode, workspaceContext, cliConfig.sanitizationConfig);
411
580
  mcpClient.onerror = (error) => {
412
581
  coreEvents.emitFeedback('error', `MCP ERROR (${mcpServerName}):`, error);
413
582
  updateMCPServerStatus(mcpServerName, MCPServerStatus.DISCONNECTED);
414
583
  };
415
584
  // Attempt to discover both prompts and tools
416
585
  const prompts = await discoverPrompts(mcpServerName, mcpClient, promptRegistry);
417
- const tools = await discoverTools(mcpServerName, mcpServerConfig, mcpClient, cliConfig, toolRegistry.getMessageBus());
586
+ const tools = await discoverTools(mcpServerName, mcpServerConfig, mcpClient, cliConfig, toolRegistry.getMessageBus(), { timeout: mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC });
418
587
  // If we have neither prompts nor tools, it's a failed discovery
419
588
  if (prompts.length === 0 && tools.length === 0) {
420
589
  throw new Error('No prompts or tools found on the server.');
@@ -429,6 +598,7 @@ export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolReg
429
598
  }
430
599
  catch (error) {
431
600
  if (mcpClient) {
601
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
432
602
  mcpClient.close();
433
603
  }
434
604
  coreEvents.emitFeedback('error', `Error connecting to MCP server '${mcpServerName}': ${getErrorMessage(error)}`, error);
@@ -448,12 +618,12 @@ export async function connectAndDiscover(mcpServerName, mcpServerConfig, toolReg
448
618
  * @returns A promise that resolves to an array of discovered and enabled tools.
449
619
  * @throws An error if no enabled tools are found or if the server provides invalid function declarations.
450
620
  */
451
- export async function discoverTools(mcpServerName, mcpServerConfig, mcpClient, cliConfig, messageBus) {
621
+ export async function discoverTools(mcpServerName, mcpServerConfig, mcpClient, cliConfig, messageBus, options) {
452
622
  try {
453
623
  // Only request tools if the server supports them.
454
624
  if (mcpClient.getServerCapabilities()?.tools == null)
455
625
  return [];
456
- const response = await mcpClient.listTools({});
626
+ const response = await mcpClient.listTools({}, options);
457
627
  const discoveredTools = [];
458
628
  for (const toolDef of response.tools) {
459
629
  try {
@@ -461,7 +631,7 @@ export async function discoverTools(mcpServerName, mcpServerConfig, mcpClient, c
461
631
  continue;
462
632
  }
463
633
  const mcpCallableTool = new McpCallableTool(mcpClient, toolDef, mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC);
464
- const tool = new DiscoveredMCPTool(mcpCallableTool, mcpServerName, toolDef.name, toolDef.description ?? '', toolDef.inputSchema ?? { type: 'object', properties: {} }, mcpServerConfig.trust, undefined, cliConfig, mcpServerConfig.extension?.name, mcpServerConfig.extension?.id, messageBus);
634
+ const tool = new DiscoveredMCPTool(mcpCallableTool, mcpServerName, toolDef.name, toolDef.description ?? '', toolDef.inputSchema ?? { type: 'object', properties: {} }, messageBus, mcpServerConfig.trust, undefined, cliConfig, mcpServerConfig.extension?.name, mcpServerConfig.extension?.id);
465
635
  discoveredTools.push(tool);
466
636
  }
467
637
  catch (error) {
@@ -568,6 +738,35 @@ export async function discoverPrompts(mcpServerName, mcpClient, promptRegistry)
568
738
  return [];
569
739
  }
570
740
  }
741
+ export async function discoverResources(mcpServerName, mcpClient) {
742
+ if (mcpClient.getServerCapabilities()?.resources == null) {
743
+ return [];
744
+ }
745
+ const resources = await listResources(mcpServerName, mcpClient);
746
+ return resources;
747
+ }
748
+ async function listResources(mcpServerName, mcpClient) {
749
+ const resources = [];
750
+ let cursor;
751
+ try {
752
+ do {
753
+ const response = await mcpClient.request({
754
+ method: 'resources/list',
755
+ params: cursor ? { cursor } : {},
756
+ }, ListResourcesResultSchema);
757
+ resources.push(...(response.resources ?? []));
758
+ cursor = response.nextCursor ?? undefined;
759
+ } while (cursor);
760
+ }
761
+ catch (error) {
762
+ if (error instanceof Error && error.message?.includes('Method not found')) {
763
+ return [];
764
+ }
765
+ coreEvents.emitFeedback('error', `Error discovering resources from ${mcpServerName}: ${getErrorMessage(error)}`, error);
766
+ throw error;
767
+ }
768
+ return resources;
769
+ }
571
770
  /**
572
771
  * Invokes a prompt on a connected MCP client.
573
772
  *
@@ -608,6 +807,116 @@ export async function invokeMcpPrompt(mcpServerName, mcpClient, promptName, prom
608
807
  export function hasNetworkTransport(config) {
609
808
  return !!(config.url || config.httpUrl);
610
809
  }
810
+ /**
811
+ * Helper function to retrieve a stored OAuth token for an MCP server.
812
+ * Handles token validation and refresh automatically.
813
+ *
814
+ * @param serverName The name of the MCP server
815
+ * @returns The valid access token, or null if no token is stored
816
+ */
817
+ async function getStoredOAuthToken(serverName) {
818
+ const tokenStorage = new MCPOAuthTokenStorage();
819
+ const credentials = await tokenStorage.getCredentials(serverName);
820
+ if (!credentials)
821
+ return null;
822
+ const authProvider = new MCPOAuthProvider(tokenStorage);
823
+ return authProvider.getValidToken(serverName, {
824
+ // Pass client ID if available
825
+ clientId: credentials.clientId,
826
+ });
827
+ }
828
+ /**
829
+ * Helper function to create an SSE transport with optional OAuth authentication.
830
+ *
831
+ * @param config The MCP server configuration
832
+ * @param accessToken Optional OAuth access token for authentication
833
+ * @returns A configured SSE transport ready for connection
834
+ */
835
+ function createSSETransportWithAuth(config, accessToken) {
836
+ const headers = {
837
+ ...config.headers,
838
+ ...(accessToken ? { Authorization: `Bearer ${accessToken}` } : {}),
839
+ };
840
+ const options = {};
841
+ if (Object.keys(headers).length > 0) {
842
+ options.requestInit = { headers };
843
+ }
844
+ return new SSEClientTransport(new URL(config.url), options);
845
+ }
846
+ /**
847
+ * Helper function to connect a client using SSE transport with optional OAuth.
848
+ *
849
+ * @param client The MCP client to connect
850
+ * @param config The MCP server configuration
851
+ * @param accessToken Optional OAuth access token for authentication
852
+ */
853
+ async function connectWithSSETransport(client, config, accessToken) {
854
+ const transport = createSSETransportWithAuth(config, accessToken);
855
+ await client.connect(transport, {
856
+ timeout: config.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
857
+ });
858
+ }
859
+ /**
860
+ * Helper function to show authentication required message and throw error.
861
+ * Checks if there's a stored token that was rejected (requires re-auth).
862
+ *
863
+ * @param serverName The name of the MCP server
864
+ * @throws Always throws an error with authentication instructions
865
+ */
866
+ async function showAuthRequiredMessage(serverName) {
867
+ const hasRejectedToken = !!(await getStoredOAuthToken(serverName));
868
+ const message = hasRejectedToken
869
+ ? `MCP server '${serverName}' rejected stored OAuth token. Please re-authenticate using: /mcp auth ${serverName}`
870
+ : `MCP server '${serverName}' requires authentication using: /mcp auth ${serverName}`;
871
+ coreEvents.emitFeedback('info', message);
872
+ throw new UnauthorizedError(message);
873
+ }
874
+ /**
875
+ * Helper function to retry connection with OAuth token after authentication.
876
+ * Handles both HTTP and SSE transports based on what previously failed.
877
+ *
878
+ * @param client The MCP client to connect
879
+ * @param serverName The name of the MCP server
880
+ * @param config The MCP server configuration
881
+ * @param accessToken The OAuth access token to use
882
+ * @param httpReturned404 Whether the HTTP transport returned 404 (indicating SSE-only server)
883
+ */
884
+ async function retryWithOAuth(client, serverName, config, accessToken, httpReturned404) {
885
+ if (httpReturned404) {
886
+ // HTTP returned 404, only try SSE
887
+ debugLogger.log(`Retrying SSE connection to '${serverName}' with OAuth token...`);
888
+ await connectWithSSETransport(client, config, accessToken);
889
+ debugLogger.log(`Successfully connected to '${serverName}' using SSE with OAuth.`);
890
+ return;
891
+ }
892
+ // HTTP returned 401, try HTTP with OAuth first
893
+ debugLogger.log(`Retrying connection to '${serverName}' with OAuth token...`);
894
+ const httpTransport = await createTransportWithOAuth(serverName, config, accessToken);
895
+ if (!httpTransport) {
896
+ throw new Error(`Failed to create OAuth transport for server '${serverName}'`);
897
+ }
898
+ try {
899
+ await client.connect(httpTransport, {
900
+ timeout: config.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
901
+ });
902
+ debugLogger.log(`Successfully connected to '${serverName}' using HTTP with OAuth.`);
903
+ }
904
+ catch (httpError) {
905
+ await httpTransport.close();
906
+ // If HTTP+OAuth returns 404 and auto-detection enabled, try SSE+OAuth
907
+ if (String(httpError).includes('404') &&
908
+ config.url &&
909
+ !config.type &&
910
+ !config.httpUrl) {
911
+ debugLogger.log(`HTTP with OAuth returned 404, trying SSE with OAuth...`);
912
+ await connectWithSSETransport(client, config, accessToken);
913
+ debugLogger.log(`Successfully connected to '${serverName}' using SSE with OAuth.`);
914
+ }
915
+ else {
916
+ throw httpError;
917
+ }
918
+ }
919
+ }
611
920
  /**
612
921
  * Creates and connects an MCP client to a server based on the provided configuration.
613
922
  * It determines the appropriate transport (Stdio, SSE, or Streamable HTTP) and
@@ -618,10 +927,13 @@ export function hasNetworkTransport(config) {
618
927
  * @returns A promise that resolves to a connected MCP `Client` instance.
619
928
  * @throws An error if the connection fails or the configuration is invalid.
620
929
  */
621
- export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMode, workspaceContext) {
930
+ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMode, workspaceContext, sanitizationConfig) {
622
931
  const mcpClient = new Client({
623
932
  name: 'gemini-cli-mcp-client',
624
933
  version: '0.0.1',
934
+ }, {
935
+ // Use a tolerant validator so bad output schemas don't block discovery.
936
+ jsonSchemaValidator: new LenientJsonSchemaValidator(),
625
937
  });
626
938
  mcpClient.registerCapabilities({
627
939
  roots: {
@@ -664,8 +976,11 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
664
976
  unlistenDirectories?.();
665
977
  unlistenDirectories = undefined;
666
978
  };
979
+ let firstAttemptError = null;
980
+ let httpReturned404 = false; // Track if HTTP returned 404 to skip it in OAuth retry
981
+ let sseError = null; // Track SSE fallback error
667
982
  try {
668
- const transport = await createTransport(mcpServerName, mcpServerConfig, debugMode);
983
+ const transport = await createTransport(mcpServerName, mcpServerConfig, debugMode, sanitizationConfig);
669
984
  try {
670
985
  await mcpClient.connect(transport, {
671
986
  timeout: mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
@@ -674,52 +989,92 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
674
989
  }
675
990
  catch (error) {
676
991
  await transport.close();
992
+ firstAttemptError = error;
677
993
  throw error;
678
994
  }
679
995
  }
680
- catch (error) {
996
+ catch (initialError) {
997
+ let error = initialError;
998
+ // Check if this is a 401 error FIRST (before attempting SSE fallback)
999
+ // This ensures OAuth flow happens before we try SSE
1000
+ if (isAuthenticationError(error) && hasNetworkTransport(mcpServerConfig)) {
1001
+ // Continue to OAuth handling below (after SSE fallback section)
1002
+ }
1003
+ else if (
1004
+ // If not 401, and HTTP failed with url without explicit type, try SSE fallback
1005
+ firstAttemptError &&
1006
+ mcpServerConfig.url &&
1007
+ !mcpServerConfig.type &&
1008
+ !mcpServerConfig.httpUrl) {
1009
+ // Check if HTTP returned 404 - if so, we know it's not an HTTP server
1010
+ httpReturned404 = String(firstAttemptError).includes('404');
1011
+ const logMessage = httpReturned404
1012
+ ? `HTTP returned 404, trying SSE transport...`
1013
+ : `HTTP connection failed, attempting SSE fallback...`;
1014
+ debugLogger.log(`MCP server '${mcpServerName}': ${logMessage}`);
1015
+ try {
1016
+ // Try SSE with stored OAuth token if available
1017
+ // This ensures that SSE fallback works for authenticated servers
1018
+ await connectWithSSETransport(mcpClient, mcpServerConfig, await getStoredOAuthToken(mcpServerName));
1019
+ debugLogger.log(`MCP server '${mcpServerName}': Successfully connected using SSE transport.`);
1020
+ return mcpClient;
1021
+ }
1022
+ catch (sseFallbackError) {
1023
+ sseError = sseFallbackError;
1024
+ // If SSE also returned 401, handle OAuth below
1025
+ if (isAuthenticationError(sseError)) {
1026
+ debugLogger.log(`MCP server '${mcpServerName}': SSE returned 401, OAuth authentication required.`);
1027
+ // Update error to be the SSE error for OAuth handling
1028
+ error = sseError;
1029
+ // Continue to OAuth handling below
1030
+ }
1031
+ else {
1032
+ debugLogger.log(`MCP server '${mcpServerName}': SSE fallback also failed.`);
1033
+ // Both failed without 401, throw the original error
1034
+ throw firstAttemptError;
1035
+ }
1036
+ }
1037
+ }
681
1038
  // Check if this is a 401 error that might indicate OAuth is required
682
- const errorString = String(error);
683
- if (errorString.includes('401') && hasNetworkTransport(mcpServerConfig)) {
1039
+ if (isAuthenticationError(error) && hasNetworkTransport(mcpServerConfig)) {
684
1040
  mcpServerRequiresOAuth.set(mcpServerName, true);
685
- // Only trigger automatic OAuth discovery for HTTP servers or when OAuth is explicitly configured
686
- // For SSE servers, we should not trigger new OAuth flows automatically
687
- const shouldTriggerOAuth = mcpServerConfig.httpUrl || mcpServerConfig.oauth?.enabled;
1041
+ // Only trigger automatic OAuth if explicitly enabled in config
1042
+ // Otherwise, show error and tell user to run /mcp auth command
1043
+ const shouldTriggerOAuth = mcpServerConfig.oauth?.enabled;
688
1044
  if (!shouldTriggerOAuth) {
689
- // For SSE servers without explicit OAuth config, if a token was found but rejected, report it accurately.
690
- const tokenStorage = new MCPOAuthTokenStorage();
691
- const credentials = await tokenStorage.getCredentials(mcpServerName);
692
- if (credentials) {
693
- const authProvider = new MCPOAuthProvider(tokenStorage);
694
- const hasStoredTokens = await authProvider.getValidToken(mcpServerName, {
695
- // Pass client ID if available
696
- clientId: credentials.clientId,
697
- });
698
- if (hasStoredTokens) {
699
- coreEvents.emitFeedback('error', `Stored OAuth token for SSE server '${mcpServerName}' was rejected. ` +
700
- `Please re-authenticate using: /mcp auth ${mcpServerName}`);
701
- }
702
- else {
703
- coreEvents.emitFeedback('error', `401 error received for SSE server '${mcpServerName}' without OAuth configuration. ` +
704
- `Please authenticate using: /mcp auth ${mcpServerName}`);
705
- }
706
- }
707
- throw new Error(`401 error received for SSE server '${mcpServerName}' without OAuth configuration. ` +
708
- `Please authenticate using: /mcp auth ${mcpServerName}`);
1045
+ await showAuthRequiredMessage(mcpServerName);
709
1046
  }
710
1047
  // Try to extract www-authenticate header from the error
1048
+ const errorString = String(error);
711
1049
  let wwwAuthenticate = extractWWWAuthenticateHeader(errorString);
712
1050
  // If we didn't get the header from the error string, try to get it from the server
713
1051
  if (!wwwAuthenticate && hasNetworkTransport(mcpServerConfig)) {
714
1052
  debugLogger.log(`No www-authenticate header in error, trying to fetch it from server...`);
715
1053
  try {
716
1054
  const urlToFetch = mcpServerConfig.httpUrl || mcpServerConfig.url;
1055
+ // Determine correct Accept header based on what transport failed
1056
+ let acceptHeader;
1057
+ if (mcpServerConfig.httpUrl) {
1058
+ acceptHeader = 'application/json';
1059
+ }
1060
+ else if (mcpServerConfig.type === 'http') {
1061
+ acceptHeader = 'application/json';
1062
+ }
1063
+ else if (mcpServerConfig.type === 'sse') {
1064
+ acceptHeader = 'text/event-stream';
1065
+ }
1066
+ else if (httpReturned404) {
1067
+ // HTTP failed with 404, SSE returned 401 - use SSE header
1068
+ acceptHeader = 'text/event-stream';
1069
+ }
1070
+ else {
1071
+ // HTTP returned 401 - use HTTP header
1072
+ acceptHeader = 'application/json';
1073
+ }
717
1074
  const response = await fetch(urlToFetch, {
718
1075
  method: 'HEAD',
719
1076
  headers: {
720
- Accept: mcpServerConfig.httpUrl
721
- ? 'application/json'
722
- : 'text/event-stream',
1077
+ Accept: acceptHeader,
723
1078
  },
724
1079
  signal: AbortSignal.timeout(5000),
725
1080
  });
@@ -740,38 +1095,12 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
740
1095
  const oauthSuccess = await handleAutomaticOAuth(mcpServerName, mcpServerConfig, wwwAuthenticate);
741
1096
  if (oauthSuccess) {
742
1097
  // Retry connection with OAuth token
743
- debugLogger.log(`Retrying connection to '${mcpServerName}' with OAuth token...`);
744
- // Get the valid token - we need to create a proper OAuth config
745
- // The token should already be available from the authentication process
746
- const tokenStorage = new MCPOAuthTokenStorage();
747
- const credentials = await tokenStorage.getCredentials(mcpServerName);
748
- if (credentials) {
749
- const authProvider = new MCPOAuthProvider(tokenStorage);
750
- const accessToken = await authProvider.getValidToken(mcpServerName, {
751
- // Pass client ID if available
752
- clientId: credentials.clientId,
753
- });
754
- if (accessToken) {
755
- // Create transport with OAuth token
756
- const oauthTransport = await createTransportWithOAuth(mcpServerName, mcpServerConfig, accessToken);
757
- if (oauthTransport) {
758
- await mcpClient.connect(oauthTransport, {
759
- timeout: mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
760
- });
761
- // Connection successful with OAuth
762
- return mcpClient;
763
- }
764
- else {
765
- throw new Error(`Failed to create OAuth transport for server '${mcpServerName}'`);
766
- }
767
- }
768
- else {
769
- throw new Error(`Failed to get OAuth token for server '${mcpServerName}'`);
770
- }
771
- }
772
- else {
773
- throw new Error(`Failed to get credentials for server '${mcpServerName}' after successful OAuth authentication`);
1098
+ const accessToken = await getStoredOAuthToken(mcpServerName);
1099
+ if (!accessToken) {
1100
+ throw new Error(`Failed to get OAuth token for server '${mcpServerName}'`);
774
1101
  }
1102
+ await retryWithOAuth(mcpClient, mcpServerName, mcpServerConfig, accessToken, httpReturned404);
1103
+ return mcpClient;
775
1104
  }
776
1105
  else {
777
1106
  throw new Error(`Failed to handle automatic OAuth for server '${mcpServerName}'`);
@@ -779,29 +1108,10 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
779
1108
  }
780
1109
  else {
781
1110
  // No www-authenticate header found, but we got a 401
782
- // Only try OAuth discovery for HTTP servers or when OAuth is explicitly configured
783
- // For SSE servers, we should not trigger new OAuth flows automatically
784
- const shouldTryDiscovery = mcpServerConfig.httpUrl || mcpServerConfig.oauth?.enabled;
1111
+ // Only try OAuth discovery when OAuth is explicitly enabled in config
1112
+ const shouldTryDiscovery = mcpServerConfig.oauth?.enabled;
785
1113
  if (!shouldTryDiscovery) {
786
- const tokenStorage = new MCPOAuthTokenStorage();
787
- const credentials = await tokenStorage.getCredentials(mcpServerName);
788
- if (credentials) {
789
- const authProvider = new MCPOAuthProvider(tokenStorage);
790
- const hasStoredTokens = await authProvider.getValidToken(mcpServerName, {
791
- // Pass client ID if available
792
- clientId: credentials.clientId,
793
- });
794
- if (hasStoredTokens) {
795
- coreEvents.emitFeedback('error', `Stored OAuth token for SSE server '${mcpServerName}' was rejected. ` +
796
- `Please re-authenticate using: /mcp auth ${mcpServerName}`);
797
- }
798
- else {
799
- coreEvents.emitFeedback('error', `401 error received for SSE server '${mcpServerName}' without OAuth configuration. ` +
800
- `Please authenticate using: /mcp auth ${mcpServerName}`);
801
- }
802
- }
803
- throw new Error(`401 error received for SSE server '${mcpServerName}' without OAuth configuration. ` +
804
- `Please authenticate using: /mcp auth ${mcpServerName}`);
1114
+ await showAuthRequiredMessage(mcpServerName);
805
1115
  }
806
1116
  // For SSE/HTTP servers, try to discover OAuth configuration from the base URL
807
1117
  debugLogger.log(`🔍 Attempting OAuth discovery for '${mcpServerName}'...`);
@@ -826,35 +1136,20 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
826
1136
  const authProvider = new MCPOAuthProvider(new MCPOAuthTokenStorage());
827
1137
  await authProvider.authenticate(mcpServerName, oauthAuthConfig, authServerUrl);
828
1138
  // Retry connection with OAuth token
829
- const tokenStorage = new MCPOAuthTokenStorage();
830
- const credentials = await tokenStorage.getCredentials(mcpServerName);
831
- if (credentials) {
832
- const authProvider = new MCPOAuthProvider(tokenStorage);
833
- const accessToken = await authProvider.getValidToken(mcpServerName, {
834
- // Pass client ID if available
835
- clientId: credentials.clientId,
836
- });
837
- if (accessToken) {
838
- // Create transport with OAuth token
839
- const oauthTransport = await createTransportWithOAuth(mcpServerName, mcpServerConfig, accessToken);
840
- if (oauthTransport) {
841
- await mcpClient.connect(oauthTransport, {
842
- timeout: mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
843
- });
844
- // Connection successful with OAuth
845
- return mcpClient;
846
- }
847
- else {
848
- throw new Error(`Failed to create OAuth transport for server '${mcpServerName}'`);
849
- }
850
- }
851
- else {
852
- throw new Error(`Failed to get OAuth token for server '${mcpServerName}'`);
853
- }
1139
+ const accessToken = await getStoredOAuthToken(mcpServerName);
1140
+ if (!accessToken) {
1141
+ throw new Error(`Failed to get OAuth token for server '${mcpServerName}'`);
854
1142
  }
855
- else {
856
- throw new Error(`Failed to get stored credentials for server '${mcpServerName}'`);
1143
+ // Create transport with OAuth token
1144
+ const oauthTransport = await createTransportWithOAuth(mcpServerName, mcpServerConfig, accessToken);
1145
+ if (!oauthTransport) {
1146
+ throw new Error(`Failed to create OAuth transport for server '${mcpServerName}'`);
857
1147
  }
1148
+ await mcpClient.connect(oauthTransport, {
1149
+ timeout: mcpServerConfig.timeout ?? MCP_DEFAULT_TIMEOUT_MSEC,
1150
+ });
1151
+ // Connection successful with OAuth
1152
+ return mcpClient;
858
1153
  }
859
1154
  else {
860
1155
  throw new Error(`OAuth configuration failed for '${mcpServerName}'. Please authenticate manually with /mcp auth ${mcpServerName}`);
@@ -867,26 +1162,41 @@ export async function connectToMcpServer(mcpServerName, mcpServerConfig, debugMo
867
1162
  }
868
1163
  else {
869
1164
  // Handle other connection errors
870
- // Create a concise error message
871
- const errorMessage = error.message || String(error);
872
- const isNetworkError = errorMessage.includes('ENOTFOUND') ||
873
- errorMessage.includes('ECONNREFUSED');
874
- let conciseError;
875
- if (isNetworkError) {
876
- conciseError = `Cannot connect to '${mcpServerName}' - server may be down or URL incorrect`;
877
- }
878
- else {
879
- conciseError = `Connection failed for '${mcpServerName}': ${errorMessage}`;
880
- }
881
- if (process.env['SANDBOX']) {
882
- conciseError += ` (check sandbox availability)`;
883
- }
884
- throw new Error(conciseError);
1165
+ // Re-throw the original error to preserve its structure
1166
+ throw error;
1167
+ }
1168
+ }
1169
+ }
1170
+ /**
1171
+ * Helper function to create the appropriate transport based on config
1172
+ * This handles the logic for httpUrl/url/type consistently
1173
+ */
1174
+ function createUrlTransport(mcpServerName, mcpServerConfig, transportOptions) {
1175
+ // Priority 1: httpUrl (deprecated)
1176
+ if (mcpServerConfig.httpUrl) {
1177
+ if (mcpServerConfig.url) {
1178
+ debugLogger.warn(`MCP server '${mcpServerName}': Both 'httpUrl' and 'url' are configured. ` +
1179
+ `Using deprecated 'httpUrl'. Please migrate to 'url' with 'type: "http"'.`);
1180
+ }
1181
+ return new StreamableHTTPClientTransport(new URL(mcpServerConfig.httpUrl), transportOptions);
1182
+ }
1183
+ // Priority 2 & 3: url with explicit type
1184
+ if (mcpServerConfig.url && mcpServerConfig.type) {
1185
+ if (mcpServerConfig.type === 'http') {
1186
+ return new StreamableHTTPClientTransport(new URL(mcpServerConfig.url), transportOptions);
1187
+ }
1188
+ else if (mcpServerConfig.type === 'sse') {
1189
+ return new SSEClientTransport(new URL(mcpServerConfig.url), transportOptions);
885
1190
  }
886
1191
  }
1192
+ // Priority 4: url without type (default to HTTP)
1193
+ if (mcpServerConfig.url) {
1194
+ return new StreamableHTTPClientTransport(new URL(mcpServerConfig.url), transportOptions);
1195
+ }
1196
+ throw new Error(`No URL configured for MCP server '${mcpServerName}'`);
887
1197
  }
888
1198
  /** Visible for Testing */
889
- export async function createTransport(mcpServerName, mcpServerConfig, debugMode) {
1199
+ export async function createTransport(mcpServerName, mcpServerConfig, debugMode, sanitizationConfig) {
890
1200
  const noUrl = !mcpServerConfig.url && !mcpServerConfig.httpUrl;
891
1201
  if (noUrl) {
892
1202
  if (mcpServerConfig.authProviderType === AuthProviderType.GOOGLE_CREDENTIALS) {
@@ -899,37 +1209,27 @@ export async function createTransport(mcpServerName, mcpServerConfig, debugMode)
899
1209
  }
900
1210
  if (mcpServerConfig.httpUrl || mcpServerConfig.url) {
901
1211
  const authProvider = createAuthProvider(mcpServerConfig);
902
- const headers = {};
1212
+ const headers = (await authProvider?.getRequestHeaders?.()) ?? {};
903
1213
  if (authProvider === undefined) {
904
1214
  // Check if we have OAuth configuration or stored tokens
905
1215
  let accessToken = null;
906
- let hasOAuthConfig = mcpServerConfig.oauth?.enabled;
907
- if (hasOAuthConfig && mcpServerConfig.oauth) {
1216
+ if (mcpServerConfig.oauth?.enabled && mcpServerConfig.oauth) {
908
1217
  const tokenStorage = new MCPOAuthTokenStorage();
909
1218
  const mcpAuthProvider = new MCPOAuthProvider(tokenStorage);
910
1219
  accessToken = await mcpAuthProvider.getValidToken(mcpServerName, mcpServerConfig.oauth);
911
1220
  if (!accessToken) {
912
- throw new Error(`MCP server '${mcpServerName}' requires OAuth authentication. ` +
913
- `Please authenticate using the /mcp auth command.`);
1221
+ // Emit info message (not error) since this is expected behavior
1222
+ coreEvents.emitFeedback('info', `MCP server '${mcpServerName}' requires authentication using: /mcp auth ${mcpServerName}`);
914
1223
  }
915
1224
  }
916
1225
  else {
917
1226
  // Check if we have stored OAuth tokens for this server (from previous authentication)
918
- const tokenStorage = new MCPOAuthTokenStorage();
919
- const credentials = await tokenStorage.getCredentials(mcpServerName);
920
- if (credentials) {
921
- const mcpAuthProvider = new MCPOAuthProvider(tokenStorage);
922
- accessToken = await mcpAuthProvider.getValidToken(mcpServerName, {
923
- // Pass client ID if available
924
- clientId: credentials.clientId,
925
- });
926
- if (accessToken) {
927
- hasOAuthConfig = true;
928
- debugLogger.log(`Found stored OAuth token for server '${mcpServerName}'`);
929
- }
1227
+ accessToken = await getStoredOAuthToken(mcpServerName);
1228
+ if (accessToken) {
1229
+ debugLogger.log(`Found stored OAuth token for server '${mcpServerName}'`);
930
1230
  }
931
1231
  }
932
- if (hasOAuthConfig && accessToken) {
1232
+ if (accessToken) {
933
1233
  headers['Authorization'] = `Bearer ${accessToken}`;
934
1234
  }
935
1235
  }
@@ -937,14 +1237,14 @@ export async function createTransport(mcpServerName, mcpServerConfig, debugMode)
937
1237
  requestInit: createTransportRequestInit(mcpServerConfig, headers),
938
1238
  authProvider,
939
1239
  };
940
- return createUrlTransport(mcpServerConfig, transportOptions);
1240
+ return createUrlTransport(mcpServerName, mcpServerConfig, transportOptions);
941
1241
  }
942
1242
  if (mcpServerConfig.command) {
943
1243
  const transport = new StdioClientTransport({
944
1244
  command: mcpServerConfig.command,
945
1245
  args: mcpServerConfig.args || [],
946
1246
  env: {
947
- ...process.env,
1247
+ ...sanitizeEnvironment(process.env, sanitizationConfig),
948
1248
  ...(mcpServerConfig.env || {}),
949
1249
  },
950
1250
  cwd: mcpServerConfig.cwd,