@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.
- package/dist/docs/AFTER_MERGE_PROMPT.md +26 -0
- package/dist/docs/CHANGES.md +124 -0
- package/dist/docs/api-proxy.md +27 -0
- package/dist/docs/architecture.md +80 -0
- package/dist/docs/assets/connected_devtools.png +0 -0
- package/dist/docs/assets/gemini-screenshot.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-logs.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-metrics.png +0 -0
- package/dist/docs/assets/monitoring-dashboard-overview.png +0 -0
- package/dist/docs/assets/release_patch.png +0 -0
- package/dist/docs/assets/theme-ansi-light.png +0 -0
- package/dist/docs/assets/theme-ansi.png +0 -0
- package/dist/docs/assets/theme-atom-one.png +0 -0
- package/dist/docs/assets/theme-ayu-light.png +0 -0
- package/dist/docs/assets/theme-ayu.png +0 -0
- package/dist/docs/assets/theme-custom.png +0 -0
- package/dist/docs/assets/theme-default-light.png +0 -0
- package/dist/docs/assets/theme-default.png +0 -0
- package/dist/docs/assets/theme-dracula.png +0 -0
- package/dist/docs/assets/theme-github-light.png +0 -0
- package/dist/docs/assets/theme-github.png +0 -0
- package/dist/docs/assets/theme-google-light.png +0 -0
- package/dist/docs/assets/theme-xcode-light.png +0 -0
- package/dist/docs/changelogs/index.md +612 -0
- package/dist/docs/changelogs/latest.md +153 -0
- package/dist/docs/changelogs/preview.md +131 -0
- package/dist/docs/changelogs/releases.md +1162 -0
- package/dist/docs/cli/authentication.md +3 -0
- package/dist/docs/cli/checkpointing.md +94 -0
- package/dist/docs/cli/commands.md +357 -0
- package/dist/docs/cli/custom-commands.md +315 -0
- package/dist/docs/cli/enterprise.md +564 -0
- package/dist/docs/cli/gemini-ignore.md +71 -0
- package/dist/docs/cli/gemini-md.md +109 -0
- package/dist/docs/cli/generation-settings.md +210 -0
- package/dist/docs/cli/headless.md +388 -0
- package/dist/docs/cli/index.md +63 -0
- package/dist/docs/cli/keyboard-shortcuts.md +136 -0
- package/dist/docs/cli/model-routing.md +37 -0
- package/dist/docs/cli/model.md +62 -0
- package/dist/docs/cli/sandbox.md +171 -0
- package/dist/docs/cli/session-management.md +158 -0
- package/dist/docs/cli/settings.md +148 -0
- package/dist/docs/cli/skills.md +188 -0
- package/dist/docs/cli/system-prompt.md +94 -0
- package/dist/docs/cli/telemetry.md +813 -0
- package/dist/docs/cli/themes.md +237 -0
- package/dist/docs/cli/token-caching.md +20 -0
- package/dist/docs/cli/trusted-folders.md +95 -0
- package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
- package/dist/docs/cli/tutorials.md +87 -0
- package/dist/docs/cli/uninstall.md +47 -0
- package/dist/docs/core/index.md +101 -0
- package/dist/docs/core/memport.md +246 -0
- package/dist/docs/core/policy-engine.md +268 -0
- package/dist/docs/core/tools-api.md +131 -0
- package/dist/docs/examples/proxy-script.md +83 -0
- package/dist/docs/extensions/extension-releasing.md +183 -0
- package/dist/docs/extensions/getting-started-extensions.md +244 -0
- package/dist/docs/extensions/index.md +343 -0
- package/dist/docs/faq.md +153 -0
- package/dist/docs/get-started/authentication.md +321 -0
- package/dist/docs/get-started/configuration-v1.md +890 -0
- package/dist/docs/get-started/configuration.md +1643 -0
- package/dist/docs/get-started/examples.md +218 -0
- package/dist/docs/get-started/gemini-3.md +101 -0
- package/dist/docs/get-started/index.md +71 -0
- package/dist/docs/get-started/installation.md +141 -0
- package/dist/docs/hooks/best-practices.md +856 -0
- package/dist/docs/hooks/index.md +723 -0
- package/dist/docs/hooks/reference.md +178 -0
- package/dist/docs/hooks/writing-hooks.md +1044 -0
- package/dist/docs/ide-integration/ide-companion-spec.md +267 -0
- package/dist/docs/ide-integration/index.md +201 -0
- package/dist/docs/index.md +147 -0
- package/dist/docs/integration-tests.md +211 -0
- package/dist/docs/issue-and-pr-automation.md +134 -0
- package/dist/docs/local-development.md +128 -0
- package/dist/docs/mcp_integration.md +160 -0
- package/dist/docs/mermaid/context.mmd +103 -0
- package/dist/docs/mermaid/render-path.mmd +64 -0
- package/dist/docs/npm.md +62 -0
- package/dist/docs/quota-and-pricing.md +158 -0
- package/dist/docs/release-confidence.md +164 -0
- package/dist/docs/releases.md +540 -0
- package/dist/docs/sidebar.json +301 -0
- package/dist/docs/tools/file-system.md +217 -0
- package/dist/docs/tools/index.md +95 -0
- package/dist/docs/tools/mcp-server.md +1045 -0
- package/dist/docs/tools/memory.md +54 -0
- package/dist/docs/tools/shell.md +260 -0
- package/dist/docs/tools/todos.md +56 -0
- package/dist/docs/tools/web-fetch.md +59 -0
- package/dist/docs/tools/web-search.md +42 -0
- package/dist/docs/tos-privacy.md +96 -0
- package/dist/docs/troubleshooting.md +162 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +7 -4
- package/dist/src/agents/a2a-client-manager.d.ts +82 -0
- package/dist/src/agents/a2a-client-manager.js +295 -0
- package/dist/src/agents/a2a-client-manager.js.map +1 -0
- package/dist/src/agents/a2a-client-manager.test.js +281 -0
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
- package/dist/src/agents/a2aUtils.d.ts +29 -0
- package/dist/src/agents/a2aUtils.js +113 -0
- package/dist/src/agents/a2aUtils.js.map +1 -0
- package/dist/src/agents/a2aUtils.test.js +147 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -0
- package/dist/src/agents/agentLoader.d.ts +68 -0
- package/dist/src/agents/agentLoader.js +255 -0
- package/dist/src/agents/agentLoader.js.map +1 -0
- package/dist/src/agents/agentLoader.test.js +307 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +24 -0
- package/dist/src/agents/cli-help-agent.js +85 -0
- package/dist/src/agents/cli-help-agent.js.map +1 -0
- package/dist/src/agents/cli-help-agent.test.d.ts +6 -0
- package/dist/src/agents/cli-help-agent.test.js +65 -0
- package/dist/src/agents/cli-help-agent.test.js.map +1 -0
- package/dist/src/agents/codebase-investigator.d.ts +2 -2
- package/dist/src/agents/codebase-investigator.js +14 -8
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.d.ts +19 -0
- package/dist/src/agents/delegate-to-agent-tool.js +122 -0
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -0
- package/dist/src/agents/delegate-to-agent-tool.test.d.ts +6 -0
- package/dist/src/agents/delegate-to-agent-tool.test.js +213 -0
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -0
- package/dist/src/agents/{executor.d.ts → local-executor.d.ts} +5 -11
- package/dist/src/agents/{executor.js → local-executor.js} +124 -63
- package/dist/src/agents/local-executor.js.map +1 -0
- package/dist/src/agents/local-executor.test.d.ts +6 -0
- package/dist/src/agents/{executor.test.js → local-executor.test.js} +136 -58
- package/dist/src/agents/local-executor.test.js.map +1 -0
- package/dist/src/agents/{invocation.d.ts → local-invocation.d.ts} +6 -7
- package/dist/src/agents/{invocation.js → local-invocation.js} +9 -10
- package/dist/src/agents/local-invocation.js.map +1 -0
- package/dist/src/agents/local-invocation.test.d.ts +6 -0
- package/dist/src/agents/{invocation.test.js → local-invocation.test.js} +29 -20
- package/dist/src/agents/local-invocation.test.js.map +1 -0
- package/dist/src/agents/registry.d.ts +37 -1
- package/dist/src/agents/registry.js +240 -27
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +465 -30
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +35 -0
- package/dist/src/agents/remote-invocation.js +126 -0
- package/dist/src/agents/remote-invocation.js.map +1 -0
- package/dist/src/agents/remote-invocation.test.d.ts +6 -0
- package/dist/src/agents/remote-invocation.test.js +201 -0
- package/dist/src/agents/remote-invocation.test.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
- package/dist/src/agents/subagent-tool-wrapper.js +11 -6
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +33 -19
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +21 -15
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/errorClassification.d.ts +7 -0
- package/dist/src/availability/errorClassification.js +20 -0
- package/dist/src/availability/errorClassification.js.map +1 -0
- package/dist/src/availability/fallbackIntegration.test.d.ts +6 -0
- package/dist/src/availability/fallbackIntegration.test.js +58 -0
- package/dist/src/availability/fallbackIntegration.test.js.map +1 -0
- package/dist/src/availability/modelAvailabilityService.d.ts +3 -1
- package/dist/src/availability/modelAvailabilityService.js +3 -0
- package/dist/src/availability/modelAvailabilityService.js.map +1 -1
- package/dist/src/availability/modelPolicy.d.ts +8 -1
- package/dist/src/availability/policyCatalog.d.ts +1 -0
- package/dist/src/availability/policyCatalog.js +6 -7
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +2 -2
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.d.ts +34 -3
- package/dist/src/availability/policyHelpers.js +104 -13
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +143 -13
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/availability/testUtils.d.ts +10 -0
- package/dist/src/availability/testUtils.js +22 -0
- package/dist/src/availability/testUtils.js.map +1 -0
- package/dist/src/code_assist/experiments/client_metadata.js +2 -1
- package/dist/src/code_assist/experiments/client_metadata.js.map +1 -1
- package/dist/src/code_assist/experiments/client_metadata.test.js +7 -10
- package/dist/src/code_assist/experiments/client_metadata.test.js.map +1 -1
- package/dist/src/code_assist/experiments/experiments.d.ts +1 -1
- package/dist/src/code_assist/experiments/experiments.js +21 -0
- package/dist/src/code_assist/experiments/experiments.js.map +1 -1
- package/dist/src/code_assist/experiments/experiments_local.test.d.ts +6 -0
- package/dist/src/code_assist/experiments/experiments_local.test.js +110 -0
- package/dist/src/code_assist/experiments/experiments_local.test.js.map +1 -0
- package/dist/src/code_assist/oauth-credential-storage.js +3 -4
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +2 -0
- package/dist/src/code_assist/oauth2.js +70 -14
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +224 -22
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +9 -1
- package/dist/src/code_assist/server.js +74 -11
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +199 -27
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/setup.js +6 -4
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +63 -0
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/telemetry.d.ts +14 -0
- package/dist/src/code_assist/telemetry.js +157 -0
- package/dist/src/code_assist/telemetry.js.map +1 -0
- package/dist/src/code_assist/telemetry.test.d.ts +6 -0
- package/dist/src/code_assist/telemetry.test.js +301 -0
- package/dist/src/code_assist/telemetry.test.js.map +1 -0
- package/dist/src/code_assist/types.d.ts +77 -1
- package/dist/src/code_assist/types.js +28 -0
- package/dist/src/code_assist/types.js.map +1 -1
- package/dist/src/commands/init.d.ts +7 -0
- package/dist/src/commands/init.js +53 -0
- package/dist/src/commands/init.js.map +1 -0
- package/dist/src/commands/init.test.d.ts +6 -0
- package/dist/src/commands/init.test.js +25 -0
- package/dist/src/commands/init.test.js.map +1 -0
- package/dist/src/commands/memory.d.ts +11 -0
- package/dist/src/commands/memory.js +80 -0
- package/dist/src/commands/memory.js.map +1 -0
- package/dist/src/commands/memory.test.d.ts +6 -0
- package/dist/src/commands/memory.test.js +155 -0
- package/dist/src/commands/memory.test.js.map +1 -0
- package/dist/src/commands/restore.d.ts +9 -0
- package/dist/src/commands/restore.js +46 -0
- package/dist/src/commands/restore.js.map +1 -0
- package/dist/src/commands/restore.test.d.ts +6 -0
- package/dist/src/commands/restore.test.js +137 -0
- package/dist/src/commands/restore.test.js.map +1 -0
- package/dist/src/commands/types.d.ts +41 -0
- package/dist/src/commands/types.js +7 -0
- package/dist/src/commands/types.js.map +1 -0
- package/dist/src/config/config.d.ts +145 -25
- package/dist/src/config/config.js +370 -132
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +416 -50
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +21 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +11 -35
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +36 -15
- package/dist/src/config/models.js +89 -28
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +107 -77
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +5 -0
- package/dist/src/config/storage.js +17 -2
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +16 -0
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.js +3 -1
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +4 -0
- package/dist/src/core/baseLlmClient.d.ts +3 -1
- package/dist/src/core/baseLlmClient.js +60 -22
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +177 -7
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +7 -1
- package/dist/src/core/client.js +261 -96
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +397 -67
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/clientHookTriggers.js +2 -2
- package/dist/src/core/clientHookTriggers.js.map +1 -1
- package/dist/src/core/contentGenerator.js +6 -4
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +24 -23
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +9 -5
- package/dist/src/core/coreToolHookTriggers.js +119 -21
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.d.ts +6 -0
- package/dist/src/core/coreToolHookTriggers.test.js +191 -0
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -0
- package/dist/src/core/coreToolScheduler.d.ts +7 -93
- package/dist/src/core/coreToolScheduler.js +139 -333
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +304 -348
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +26 -1
- package/dist/src/core/geminiChat.js +144 -80
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +334 -253
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChatHookTriggers.d.ts +8 -4
- package/dist/src/core/geminiChatHookTriggers.js +34 -12
- package/dist/src/core/geminiChatHookTriggers.js.map +1 -1
- package/dist/src/core/geminiChatHookTriggers.test.d.ts +6 -0
- package/dist/src/core/geminiChatHookTriggers.test.js +153 -0
- package/dist/src/core/geminiChatHookTriggers.test.js.map +1 -0
- package/dist/src/core/geminiChat_network_retry.test.d.ts +6 -0
- package/dist/src/core/geminiChat_network_retry.test.js +196 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +19 -2
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +30 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +7 -8
- package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
- package/dist/src/core/prompts.js +48 -22
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +66 -11
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/tokenLimits.js +6 -12
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/core/tokenLimits.test.js +8 -4
- package/dist/src/core/tokenLimits.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +21 -21
- package/dist/src/core/turn.js +32 -22
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +79 -5
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/fallback/handler.js +55 -120
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +115 -288
- package/dist/src/fallback/handler.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +3 -3
- package/dist/src/generated/git-commit.js +3 -3
- package/dist/src/hooks/hookAggregator.js +7 -0
- package/dist/src/hooks/hookAggregator.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.d.ts +9 -5
- package/dist/src/hooks/hookEventHandler.js +120 -16
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +231 -9
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookPlanner.d.ts +1 -5
- package/dist/src/hooks/hookPlanner.js +2 -7
- package/dist/src/hooks/hookPlanner.js.map +1 -1
- package/dist/src/hooks/hookPlanner.test.js +62 -2
- package/dist/src/hooks/hookPlanner.test.js.map +1 -1
- package/dist/src/hooks/hookRegistry.d.ts +6 -18
- package/dist/src/hooks/hookRegistry.js +49 -35
- package/dist/src/hooks/hookRegistry.js.map +1 -1
- package/dist/src/hooks/hookRegistry.test.js +167 -8
- package/dist/src/hooks/hookRegistry.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.d.ts +5 -3
- package/dist/src/hooks/hookRunner.js +68 -18
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +173 -36
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.d.ts +10 -6
- package/dist/src/hooks/hookSystem.js +36 -16
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/hookSystem.test.js +123 -18
- package/dist/src/hooks/hookSystem.test.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +2 -1
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/index.d.ts +2 -1
- package/dist/src/hooks/index.js +1 -0
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/trustedHooks.d.ts +28 -0
- package/dist/src/hooks/trustedHooks.js +90 -0
- package/dist/src/hooks/trustedHooks.js.map +1 -0
- package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
- package/dist/src/hooks/trustedHooks.test.js +154 -0
- package/dist/src/hooks/trustedHooks.test.js.map +1 -0
- package/dist/src/hooks/types.d.ts +42 -11
- package/dist/src/hooks/types.js +31 -42
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/hooks/types.test.js +9 -52
- package/dist/src/hooks/types.test.js.map +1 -1
- package/dist/src/ide/detect-ide.d.ts +4 -0
- package/dist/src/ide/detect-ide.js +7 -2
- package/dist/src/ide/detect-ide.js.map +1 -1
- package/dist/src/ide/detect-ide.test.js +42 -1
- package/dist/src/ide/detect-ide.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +6 -1
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.js +2 -2
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/ide-installer.test.js +12 -3
- package/dist/src/ide/ide-installer.test.js.map +1 -1
- package/dist/src/index.d.ts +23 -1
- package/dist/src/index.js +25 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +7 -3
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +4 -1
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +8 -1
- package/dist/src/mcp/oauth-utils.js +31 -2
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +42 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/mcp/token-storage/file-token-storage.js +2 -2
- package/dist/src/mcp/token-storage/file-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.js +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/output/json-formatter.d.ts +2 -2
- package/dist/src/output/json-formatter.js +6 -3
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/output/json-formatter.test.js +37 -9
- package/dist/src/output/json-formatter.test.js.map +1 -1
- package/dist/src/output/stream-json-formatter.js +6 -0
- package/dist/src/output/stream-json-formatter.js.map +1 -1
- package/dist/src/output/stream-json-formatter.test.js +98 -100
- package/dist/src/output/stream-json-formatter.test.js.map +1 -1
- package/dist/src/output/types.d.ts +3 -0
- package/dist/src/output/types.js.map +1 -1
- package/dist/src/policy/config.js +140 -15
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +24 -2
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/persistence.test.d.ts +6 -0
- package/dist/src/policy/persistence.test.js +154 -0
- package/dist/src/policy/persistence.test.js.map +1 -0
- package/dist/src/policy/policies/agent.toml +31 -0
- package/dist/src/policy/policies/write.toml +5 -0
- package/dist/src/policy/policies/yolo.toml +1 -0
- package/dist/src/policy/policy-engine.d.ts +14 -1
- package/dist/src/policy/policy-engine.js +165 -7
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +315 -3
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/policy-updater.test.d.ts +6 -0
- package/dist/src/policy/policy-updater.test.js +116 -0
- package/dist/src/policy/policy-updater.test.js.map +1 -0
- package/dist/src/policy/shell-safety.test.d.ts +6 -0
- package/dist/src/policy/shell-safety.test.js +438 -0
- package/dist/src/policy/shell-safety.test.js.map +1 -0
- package/dist/src/policy/toml-loader.d.ts +3 -5
- package/dist/src/policy/toml-loader.js +43 -60
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +41 -7
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +25 -0
- package/dist/src/policy/utils.d.ts +21 -0
- package/dist/src/policy/utils.js +45 -0
- package/dist/src/policy/utils.js.map +1 -0
- package/dist/src/policy/utils.test.d.ts +6 -0
- package/dist/src/policy/utils.test.js +92 -0
- package/dist/src/policy/utils.test.js.map +1 -0
- package/dist/src/resources/resource-registry.d.ts +30 -0
- package/dist/src/resources/resource-registry.js +57 -0
- package/dist/src/resources/resource-registry.js.map +1 -0
- package/dist/src/resources/resource-registry.test.d.ts +6 -0
- package/dist/src/resources/resource-registry.test.js +54 -0
- package/dist/src/resources/resource-registry.test.js.map +1 -0
- package/dist/src/routing/modelRouterService.js +0 -15
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +0 -62
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/routingStrategy.d.ts +2 -0
- package/dist/src/routing/strategies/classifierStrategy.js +10 -21
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +18 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/compositeStrategy.js +4 -2
- package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
- package/dist/src/routing/strategies/compositeStrategy.test.js +11 -10
- package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +21 -13
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +76 -39
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.d.ts +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +5 -4
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.test.js +14 -0
- package/dist/src/routing/strategies/overrideStrategy.test.js.map +1 -1
- package/dist/src/safety/checker-runner.js +17 -6
- package/dist/src/safety/checker-runner.js.map +1 -1
- package/dist/src/scheduler/tool-executor.d.ts +22 -0
- package/dist/src/scheduler/tool-executor.js +198 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -0
- package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
- package/dist/src/scheduler/tool-executor.test.js +231 -0
- package/dist/src/scheduler/tool-executor.test.js.map +1 -0
- package/dist/src/scheduler/tool-modifier.d.ts +23 -0
- package/dist/src/scheduler/tool-modifier.js +50 -0
- package/dist/src/scheduler/tool-modifier.js.map +1 -0
- package/dist/src/scheduler/tool-modifier.test.d.ts +6 -0
- package/dist/src/scheduler/tool-modifier.test.js +159 -0
- package/dist/src/scheduler/tool-modifier.test.js.map +1 -0
- package/dist/src/scheduler/types.d.ts +95 -0
- package/dist/src/scheduler/types.js +7 -0
- package/dist/src/scheduler/types.js.map +1 -0
- package/dist/src/services/chatCompressionService.js +8 -1
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/chatCompressionService.test.js +3 -0
- package/dist/src/services/chatCompressionService.test.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +21 -1
- package/dist/src/services/chatRecordingService.js +57 -2
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +43 -0
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/contextManager.d.ts +5 -11
- package/dist/src/services/contextManager.js +20 -17
- package/dist/src/services/contextManager.js.map +1 -1
- package/dist/src/services/contextManager.test.js +40 -41
- package/dist/src/services/contextManager.test.js.map +1 -1
- package/dist/src/services/environmentSanitization.d.ts +15 -0
- package/dist/src/services/environmentSanitization.js +142 -0
- package/dist/src/services/environmentSanitization.js.map +1 -0
- package/dist/src/services/environmentSanitization.test.d.ts +6 -0
- package/dist/src/services/environmentSanitization.test.js +284 -0
- package/dist/src/services/environmentSanitization.test.js.map +1 -0
- package/dist/src/services/fileSystemService.d.ts +0 -9
- package/dist/src/services/fileSystemService.js +0 -11
- package/dist/src/services/fileSystemService.js.map +1 -1
- package/dist/src/services/gitService.js +15 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +56 -2
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +4 -3
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +14 -8
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/modelConfig.golden.test.js +32 -0
- package/dist/src/services/modelConfig.golden.test.js.map +1 -1
- package/dist/src/services/modelConfig.integration.test.js +3 -3
- package/dist/src/services/modelConfig.integration.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +41 -4
- package/dist/src/services/modelConfigService.js +135 -75
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +226 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/modelConfigServiceTestUtils.d.ts +10 -0
- package/dist/src/services/modelConfigServiceTestUtils.js +17 -0
- package/dist/src/services/modelConfigServiceTestUtils.js.map +1 -0
- package/dist/src/services/sessionSummaryService.d.ts +28 -0
- package/dist/src/services/sessionSummaryService.js +131 -0
- package/dist/src/services/sessionSummaryService.js.map +1 -0
- package/dist/src/services/sessionSummaryService.test.d.ts +6 -0
- package/dist/src/services/sessionSummaryService.test.js +785 -0
- package/dist/src/services/sessionSummaryService.test.js.map +1 -0
- package/dist/src/services/sessionSummaryUtils.d.ts +16 -0
- package/dist/src/services/sessionSummaryUtils.js +129 -0
- package/dist/src/services/sessionSummaryUtils.js.map +1 -0
- package/dist/src/services/sessionSummaryUtils.test.d.ts +6 -0
- package/dist/src/services/sessionSummaryUtils.test.js +137 -0
- package/dist/src/services/sessionSummaryUtils.test.js.map +1 -0
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +34 -72
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +114 -8
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +238 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +16 -0
- package/dist/src/skills/skillLoader.d.ts +31 -0
- package/dist/src/skills/skillLoader.js +77 -0
- package/dist/src/skills/skillLoader.js.map +1 -0
- package/dist/src/skills/skillLoader.test.d.ts +6 -0
- package/dist/src/skills/skillLoader.test.js +75 -0
- package/dist/src/skills/skillLoader.test.js.map +1 -0
- package/dist/src/skills/skillManager.d.ts +69 -0
- package/dist/src/skills/skillManager.js +127 -0
- package/dist/src/skills/skillManager.js.map +1 -0
- package/dist/src/skills/skillManager.test.d.ts +6 -0
- package/dist/src/skills/skillManager.test.js +210 -0
- package/dist/src/skills/skillManager.test.js.map +1 -0
- package/dist/src/telemetry/activity-detector.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +19 -9
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +261 -164
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +223 -27
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +12 -3
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +26 -5
- package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
- package/dist/src/telemetry/config.js +2 -0
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/config.test.js +25 -0
- package/dist/src/telemetry/config.test.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.d.ts +4 -3
- package/dist/src/telemetry/gcp-exporters.js +8 -4
- package/dist/src/telemetry/gcp-exporters.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -1
- package/dist/src/telemetry/index.js +1 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +4 -3
- package/dist/src/telemetry/loggers.js +351 -340
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +1 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +71 -15
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/sdk.d.ts +9 -2
- package/dist/src/telemetry/sdk.js +142 -17
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/sdk.test.js +130 -28
- package/dist/src/telemetry/sdk.test.js.map +1 -1
- package/dist/src/telemetry/startupProfiler.js +26 -3
- package/dist/src/telemetry/startupProfiler.js.map +1 -1
- package/dist/src/telemetry/startupProfiler.test.js +49 -7
- package/dist/src/telemetry/startupProfiler.test.js.map +1 -1
- package/dist/src/telemetry/telemetry.test.js +10 -3
- package/dist/src/telemetry/telemetry.test.js.map +1 -1
- package/dist/src/telemetry/trace.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +37 -12
- package/dist/src/telemetry/types.js +61 -20
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.d.ts +1 -0
- package/dist/src/telemetry/uiTelemetry.js +2 -0
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +4 -0
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
- package/dist/src/test-utils/mock-message-bus.js +29 -0
- package/dist/src/test-utils/mock-message-bus.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +5 -3
- package/dist/src/test-utils/mock-tool.js +11 -10
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/activate-skill.d.ts +27 -0
- package/dist/src/tools/activate-skill.js +133 -0
- package/dist/src/tools/activate-skill.js.map +1 -0
- package/dist/src/tools/activate-skill.test.d.ts +6 -0
- package/dist/src/tools/activate-skill.test.js +113 -0
- package/dist/src/tools/activate-skill.test.js.map +1 -0
- package/dist/src/tools/confirmation-policy.test.d.ts +6 -0
- package/dist/src/tools/confirmation-policy.test.js +143 -0
- package/dist/src/tools/confirmation-policy.test.js.map +1 -0
- package/dist/src/tools/edit.d.ts +27 -5
- package/dist/src/tools/edit.js +460 -136
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +292 -526
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/get-internal-docs.d.ts +27 -0
- package/dist/src/tools/get-internal-docs.js +122 -0
- package/dist/src/tools/get-internal-docs.js.map +1 -0
- package/dist/src/tools/get-internal-docs.test.d.ts +6 -0
- package/dist/src/tools/get-internal-docs.test.js +57 -0
- package/dist/src/tools/get-internal-docs.test.js.map +1 -0
- package/dist/src/tools/glob.d.ts +2 -2
- package/dist/src/tools/glob.js +1 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +2 -1
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.d.ts +2 -2
- package/dist/src/tools/grep.js +1 -1
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +5 -4
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +2 -2
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +2 -1
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +2 -1
- package/dist/src/tools/mcp-client-manager.js +32 -9
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +41 -10
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +43 -6
- package/dist/src/tools/mcp-client.js +443 -176
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +664 -39
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +20 -5
- package/dist/src/tools/mcp-tool.js +21 -8
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +35 -5
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +3 -3
- package/dist/src/tools/memoryTool.js +3 -4
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +5 -2
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/message-bus-integration.test.js +10 -37
- package/dist/src/tools/message-bus-integration.test.js.map +1 -1
- package/dist/src/tools/modifiable-tool.js.map +1 -1
- package/dist/src/tools/modifiable-tool.test.js +22 -13
- package/dist/src/tools/modifiable-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.d.ts +2 -2
- package/dist/src/tools/read-file.js +2 -2
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +3 -2
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +2 -2
- package/dist/src/tools/read-many-files.js +7 -6
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +4 -3
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +3 -2
- package/dist/src/tools/ripGrep.js +18 -7
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +60 -4
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +5 -7
- package/dist/src/tools/shell.js +35 -49
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +36 -59
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +6 -1
- package/dist/src/tools/tool-error.js +6 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +17 -0
- package/dist/src/tools/tool-names.js +59 -0
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-names.test.d.ts +6 -0
- package/dist/src/tools/tool-names.test.js +43 -0
- package/dist/src/tools/tool-names.test.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +11 -7
- package/dist/src/tools/tool-registry.js +15 -10
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +16 -11
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +27 -6
- package/dist/src/tools/tools.js +44 -25
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/tools.test.js +3 -1
- package/dist/src/tools/tools.test.js.map +1 -1
- package/dist/src/tools/web-fetch.d.ts +2 -2
- package/dist/src/tools/web-fetch.js +21 -8
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +18 -19
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.d.ts +2 -2
- package/dist/src/tools/web-search.js +5 -5
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +2 -1
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +2 -2
- package/dist/src/tools/write-file.js +14 -6
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +49 -7
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +2 -2
- package/dist/src/tools/write-todos.js +5 -4
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/tools/write-todos.test.js +2 -1
- package/dist/src/tools/write-todos.test.js.map +1 -1
- package/dist/src/utils/apiConversionUtils.d.ts +12 -0
- package/dist/src/utils/apiConversionUtils.js +46 -0
- package/dist/src/utils/apiConversionUtils.js.map +1 -0
- package/dist/src/utils/apiConversionUtils.test.d.ts +6 -0
- package/dist/src/utils/apiConversionUtils.test.js +150 -0
- package/dist/src/utils/apiConversionUtils.test.js.map +1 -0
- package/dist/src/utils/bfsFileSearch.d.ts +8 -0
- package/dist/src/utils/bfsFileSearch.js +63 -23
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +65 -1
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/checkpointUtils.d.ts +82 -0
- package/dist/src/utils/checkpointUtils.js +117 -0
- package/dist/src/utils/checkpointUtils.js.map +1 -0
- package/dist/src/utils/checkpointUtils.test.d.ts +6 -0
- package/dist/src/utils/checkpointUtils.test.js +229 -0
- package/dist/src/utils/checkpointUtils.test.js.map +1 -0
- package/dist/src/utils/debugLogger.d.ts +3 -0
- package/dist/src/utils/debugLogger.js +28 -0
- package/dist/src/utils/debugLogger.js.map +1 -1
- package/dist/src/utils/editCorrector.d.ts +3 -3
- package/dist/src/utils/editCorrector.js +27 -10
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +27 -23
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/editor.d.ts +10 -1
- package/dist/src/utils/editor.js +48 -19
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +27 -4
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +1 -0
- package/dist/src/utils/environmentContext.js +4 -0
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +2 -0
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/errorReporting.d.ts +1 -1
- package/dist/src/utils/errorReporting.js +13 -12
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +17 -14
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +8 -0
- package/dist/src/utils/errors.js +39 -2
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/errors.test.d.ts +6 -0
- package/dist/src/utils/errors.test.js +155 -0
- package/dist/src/utils/errors.test.js.map +1 -0
- package/dist/src/utils/events.d.ts +71 -19
- package/dist/src/utils/events.js +35 -9
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +25 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +2 -2
- package/dist/src/utils/extensionLoader.js +5 -6
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +11 -0
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +1 -1
- package/dist/src/utils/fetch.js +3 -3
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fileDiffUtils.d.ts +18 -0
- package/dist/src/utils/fileDiffUtils.js +37 -0
- package/dist/src/utils/fileDiffUtils.js.map +1 -0
- package/dist/src/utils/fileDiffUtils.test.d.ts +6 -0
- package/dist/src/utils/fileDiffUtils.test.js +84 -0
- package/dist/src/utils/fileDiffUtils.test.js.map +1 -0
- package/dist/src/utils/fileUtils.d.ts +4 -0
- package/dist/src/utils/fileUtils.js +53 -0
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +127 -1
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/crawlCache.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +1 -1
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/geminiIgnoreParser.d.ts +11 -0
- package/dist/src/utils/geminiIgnoreParser.js +20 -0
- package/dist/src/utils/geminiIgnoreParser.js.map +1 -1
- package/dist/src/utils/geminiIgnoreParser.test.js +48 -0
- package/dist/src/utils/geminiIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.d.ts +3 -1
- package/dist/src/utils/generateContentResponseUtilities.js +106 -0
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.test.js +279 -2
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.js +7 -2
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +9 -10
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/googleErrors.js +31 -18
- package/dist/src/utils/googleErrors.js.map +1 -1
- package/dist/src/utils/googleErrors.test.js +10 -2
- package/dist/src/utils/googleErrors.test.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.d.ts +3 -3
- package/dist/src/utils/googleQuotaErrors.js +32 -6
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +94 -2
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/installationManager.test.js +11 -3
- package/dist/src/utils/installationManager.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +3 -4
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +12 -1
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/nextSpeakerChecker.test.js +4 -0
- package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -1
- package/dist/src/utils/partUtils.js +1 -1
- package/dist/src/utils/partUtils.js.map +1 -1
- package/dist/src/utils/pathCorrector.js +12 -2
- package/dist/src/utils/pathCorrector.js.map +1 -1
- package/dist/src/utils/pathCorrector.test.js +6 -2
- package/dist/src/utils/pathCorrector.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +10 -0
- package/dist/src/utils/paths.js +20 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/retry.d.ts +12 -0
- package/dist/src/utils/retry.js +70 -17
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +181 -21
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +16 -47
- package/dist/src/utils/shell-utils.js +98 -194
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +99 -288
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/summarizer.test.js +3 -2
- package/dist/src/utils/summarizer.test.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +4 -0
- package/dist/src/utils/terminal.js +12 -0
- package/dist/src/utils/terminal.js.map +1 -1
- package/dist/src/utils/terminalSerializer.test.js +17 -0
- package/dist/src/utils/terminalSerializer.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.js +20 -5
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +11 -2
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +9 -0
- package/dist/src/utils/tool-utils.js +29 -0
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +17 -2
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/src/utils/userAccountManager.test.js +5 -5
- package/dist/src/utils/userAccountManager.test.js.map +1 -1
- package/dist/src/utils/version.d.ts +6 -0
- package/dist/src/utils/version.js +15 -0
- package/dist/src/utils/version.js.map +1 -0
- package/dist/src/utils/version.test.d.ts +6 -0
- package/dist/src/utils/version.test.js +39 -0
- package/dist/src/utils/version.test.js.map +1 -0
- package/dist/src/utils/workspaceContext.test.js +1 -1
- package/dist/src/utils/workspaceContext.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -6
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -717
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/agents/{executor.test.d.ts → a2a-client-manager.test.d.ts} +0 -0
- /package/dist/src/agents/{invocation.test.d.ts → a2aUtils.test.d.ts} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
752
|
-
if (errorString.includes('401') && hasNetworkTransport(mcpServerConfig)) {
|
|
1074
|
+
if (isAuthenticationError(error) && hasNetworkTransport(mcpServerConfig)) {
|
|
753
1075
|
mcpServerRequiresOAuth.set(mcpServerName, true);
|
|
754
|
-
// Only trigger automatic OAuth
|
|
755
|
-
//
|
|
756
|
-
const shouldTriggerOAuth = mcpServerConfig.
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
813
|
-
|
|
814
|
-
|
|
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
|
|
852
|
-
|
|
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
|
-
|
|
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
|
|
899
|
-
|
|
900
|
-
|
|
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
|
-
|
|
925
|
-
|
|
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
|
-
//
|
|
940
|
-
|
|
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
|
-
|
|
1249
|
+
const hasOAuthConfig = mcpServerConfig.oauth?.enabled;
|
|
974
1250
|
if (authProvider === undefined) {
|
|
975
1251
|
// Check if we have OAuth configuration or stored tokens
|
|
976
|
-
if (
|
|
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
|
-
|
|
982
|
-
|
|
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
|
-
|
|
988
|
-
|
|
989
|
-
|
|
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 (
|
|
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,
|