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