@machina.ai/cell-cli-core 1.20.2-rc1 → 1.25.0-rc1

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