@akon-labs/nexus-cli 0.1.9 → 0.1.11-rc.2
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/CHANGELOG.md +21 -0
- package/LICENSE +1 -0
- package/README.md +3 -2
- package/dist/app-bridge.bundle.js +67 -0
- package/dist/cli/require-login.d.ts.map +1 -1
- package/dist/cli/require-login.js +2 -2
- package/dist/cli/require-login.js.map +1 -1
- package/dist/cli.js +20866 -1882
- package/dist/core/agent-session.d.ts +3 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auto-model.d.ts +1 -1
- package/dist/core/auto-model.d.ts.map +1 -1
- package/dist/core/auto-model.js +1 -1
- package/dist/core/auto-model.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +14 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +18 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +15 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +50 -0
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +5 -5
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +3 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/extensions/gitnexus/config.d.ts +15 -1
- package/dist/extensions/gitnexus/config.d.ts.map +1 -1
- package/dist/extensions/gitnexus/config.js +86 -2
- package/dist/extensions/gitnexus/config.js.map +1 -1
- package/dist/extensions/gitnexus/gateway.d.ts +6 -6
- package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
- package/dist/extensions/gitnexus/gateway.js +4 -4
- package/dist/extensions/gitnexus/gateway.js.map +1 -1
- package/dist/extensions/gitnexus/index.d.ts.map +1 -1
- package/dist/extensions/gitnexus/index.js +6 -4
- package/dist/extensions/gitnexus/index.js.map +1 -1
- package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
- package/dist/extensions/gitnexus/observatory.js +2 -2
- package/dist/extensions/gitnexus/observatory.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/abort.d.ts +3 -0
- package/dist/extensions/mcp/abort.d.ts.map +1 -0
- package/dist/extensions/mcp/abort.js +41 -0
- package/dist/extensions/mcp/abort.js.map +1 -0
- package/dist/extensions/mcp/agent-dir.d.ts +6 -0
- package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-dir.js +18 -0
- package/dist/extensions/mcp/agent-dir.js.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
- package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
- package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
- package/dist/extensions/mcp/commands.d.ts +47 -0
- package/dist/extensions/mcp/commands.d.ts.map +1 -0
- package/dist/extensions/mcp/commands.js +821 -0
- package/dist/extensions/mcp/commands.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +123 -38
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +1035 -70
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/consent-manager.d.ts +14 -0
- package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/consent-manager.js +60 -0
- package/dist/extensions/mcp/consent-manager.js.map +1 -0
- package/dist/extensions/mcp/direct-tools.d.ts +11 -0
- package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/direct-tools.js +562 -0
- package/dist/extensions/mcp/direct-tools.js.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.js +320 -0
- package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
- package/dist/extensions/mcp/error-signal.d.ts +16 -0
- package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
- package/dist/extensions/mcp/error-signal.js +22 -0
- package/dist/extensions/mcp/error-signal.js.map +1 -0
- package/dist/extensions/mcp/errors.d.ts +104 -0
- package/dist/extensions/mcp/errors.d.ts.map +1 -0
- package/dist/extensions/mcp/errors.js +171 -0
- package/dist/extensions/mcp/errors.js.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.js +67 -0
- package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
- package/dist/extensions/mcp/host-html-template.d.ts +17 -0
- package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
- package/dist/extensions/mcp/host-html-template.js +442 -0
- package/dist/extensions/mcp/host-html-template.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +20 -15
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +1113 -82
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/init.d.ts +28 -0
- package/dist/extensions/mcp/init.d.ts.map +1 -0
- package/dist/extensions/mcp/init.js +631 -0
- package/dist/extensions/mcp/init.js.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.js +53 -0
- package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
- package/dist/extensions/mcp/lifecycle.d.ts +56 -0
- package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
- package/dist/extensions/mcp/lifecycle.js +395 -0
- package/dist/extensions/mcp/lifecycle.js.map +1 -0
- package/dist/extensions/mcp/logger.d.ts +52 -0
- package/dist/extensions/mcp/logger.d.ts.map +1 -0
- package/dist/extensions/mcp/logger.js +134 -0
- package/dist/extensions/mcp/logger.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
- package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
- package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth.js +897 -0
- package/dist/extensions/mcp/mcp-auth.js.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
- package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.js +454 -0
- package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
- package/dist/extensions/mcp/mcp-code.d.ts +48 -0
- package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-code.js +358 -0
- package/dist/extensions/mcp/mcp-code.js.map +1 -0
- package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.js +343 -0
- package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
- package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
- package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-panel.js +973 -0
- package/dist/extensions/mcp/mcp-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
- package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-probe.js +155 -0
- package/dist/extensions/mcp/mcp-probe.js.map +1 -0
- package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts +146 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-setup-panel.js +1104 -0
- package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-status.d.ts +12 -0
- package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-status.js +98 -0
- package/dist/extensions/mcp/mcp-status.js.map +1 -0
- package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
- package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-trace.js +252 -0
- package/dist/extensions/mcp/mcp-trace.js.map +1 -0
- package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
- package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
- package/dist/extensions/mcp/metadata-cache.js +318 -0
- package/dist/extensions/mcp/metadata-cache.js.map +1 -0
- package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
- package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
- package/dist/extensions/mcp/npx-resolver.js +505 -0
- package/dist/extensions/mcp/npx-resolver.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +21 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +15 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
- package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
- package/dist/extensions/mcp/onboarding-state.js +65 -0
- package/dist/extensions/mcp/onboarding-state.js.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.js +170 -0
- package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
- package/dist/extensions/mcp/panel-keys.d.ts +21 -0
- package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
- package/dist/extensions/mcp/panel-keys.js +29 -0
- package/dist/extensions/mcp/panel-keys.js.map +1 -0
- package/dist/extensions/mcp/prompts.d.ts +63 -0
- package/dist/extensions/mcp/prompts.d.ts.map +1 -0
- package/dist/extensions/mcp/prompts.js +297 -0
- package/dist/extensions/mcp/prompts.js.map +1 -0
- package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
- package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
- package/dist/extensions/mcp/proxy-modes.js +1421 -0
- package/dist/extensions/mcp/proxy-modes.js.map +1 -0
- package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
- package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
- package/dist/extensions/mcp/request-headers-command.js +334 -0
- package/dist/extensions/mcp/request-headers-command.js.map +1 -0
- package/dist/extensions/mcp/resource-tools.d.ts +2 -0
- package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/resource-tools.js +15 -0
- package/dist/extensions/mcp/resource-tools.js.map +1 -0
- package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
- package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime-owner.js +84 -0
- package/dist/extensions/mcp/runtime-owner.js.map +1 -0
- package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
- package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/sampling-handler.js +229 -0
- package/dist/extensions/mcp/sampling-handler.js.map +1 -0
- package/dist/extensions/mcp/search-ranking.d.ts +25 -0
- package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
- package/dist/extensions/mcp/search-ranking.js +234 -0
- package/dist/extensions/mcp/search-ranking.js.map +1 -0
- package/dist/extensions/mcp/server-manager.d.ts +116 -0
- package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/server-manager.js +1052 -0
- package/dist/extensions/mcp/server-manager.js.map +1 -0
- package/dist/extensions/mcp/session-recovery.d.ts +27 -0
- package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
- package/dist/extensions/mcp/session-recovery.js +140 -0
- package/dist/extensions/mcp/session-recovery.js.map +1 -0
- package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/extensions/mcp/state.d.ts +62 -0
- package/dist/extensions/mcp/state.d.ts.map +1 -0
- package/dist/extensions/mcp/state.js +2 -0
- package/dist/extensions/mcp/state.js.map +1 -0
- package/dist/extensions/mcp/tool-approval.d.ts +11 -0
- package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-approval.js +156 -0
- package/dist/extensions/mcp/tool-approval.js.map +1 -0
- package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
- package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-metadata.js +264 -0
- package/dist/extensions/mcp/tool-metadata.js.map +1 -0
- package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
- package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-registrar.js +229 -0
- package/dist/extensions/mcp/tool-registrar.js.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.js +345 -0
- package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
- package/dist/extensions/mcp/ts-shape.d.ts +3 -0
- package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
- package/dist/extensions/mcp/ts-shape.js +160 -0
- package/dist/extensions/mcp/ts-shape.js.map +1 -0
- package/dist/extensions/mcp/types.d.ts +521 -0
- package/dist/extensions/mcp/types.d.ts.map +1 -0
- package/dist/extensions/mcp/types.js +294 -0
- package/dist/extensions/mcp/types.js.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.js +210 -0
- package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
- package/dist/extensions/mcp/ui-server.d.ts +52 -0
- package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-server.js +740 -0
- package/dist/extensions/mcp/ui-server.js.map +1 -0
- package/dist/extensions/mcp/ui-session.d.ts +40 -0
- package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-session.js +477 -0
- package/dist/extensions/mcp/ui-session.js.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.js +61 -0
- package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
- package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.js +85 -0
- package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
- package/dist/extensions/mcp/utils.d.ts +32 -0
- package/dist/extensions/mcp/utils.d.ts.map +1 -0
- package/dist/extensions/mcp/utils.js +336 -0
- package/dist/extensions/mcp/utils.js.map +1 -0
- package/dist/extensions/subagent/index.d.ts +62 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +195 -9
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent-render.d.ts +3 -0
- package/dist/extensions/subagent-render.d.ts.map +1 -0
- package/dist/extensions/subagent-render.js +39 -0
- package/dist/extensions/subagent-render.js.map +1 -0
- package/dist/extensions/web-access.d.ts.map +1 -1
- package/dist/extensions/web-access.js +1 -1
- package/dist/extensions/web-access.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20992 -2003
- package/dist/index.js.map +1 -1
- package/dist/mcp-keyring-helper.cjs +89 -0
- package/dist/mcp-script-worker.mjs +130 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
- package/dist/modes/interactive/components/response-separator.js +1 -1
- package/dist/modes/interactive/components/response-separator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +14 -8
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +20866 -1882
- package/dist/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/utils/hidden-spawn.d.ts +29 -0
- package/dist/utils/hidden-spawn.d.ts.map +1 -0
- package/dist/utils/hidden-spawn.js +101 -0
- package/dist/utils/hidden-spawn.js.map +1 -0
- package/dist/vendor/ai.js +110 -35
- package/docs/mcp.md +178 -0
- package/docs/pi-subagents.md +75 -0
- package/docs/quickstart.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
- package/native/win32/build.mjs +95 -0
- package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
- package/native/win32/src/hidden-spawn.c +157 -0
- package/npm-shrinkwrap.json +728 -6
- package/package.json +21 -6
- package/dist/extensions/mcp/client.d.ts +0 -86
- package/dist/extensions/mcp/client.d.ts.map +0 -1
- package/dist/extensions/mcp/client.js +0 -275
- package/dist/extensions/mcp/client.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/extensions/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../config.ts\";\n\n/**\n * MCP server configuration.\n *\n * The file format is Claude Code's `mcpServers` map, deliberately: users\n * already have these configs, and copying one over should just work. A server\n * is stdio when it has `command` and HTTP when it has `url`.\n *\n * Project config wins over user config for the same server name, so a repo can\n * pin a server its contributors need without editing anyone's home directory.\n */\n\nexport interface McpStdioServer {\n\ttype: \"stdio\";\n\tname: string;\n\tcommand: string;\n\targs: string[];\n\tenv: Record<string, string>;\n\tcwd?: string;\n\tenabled: boolean;\n}\n\nexport interface McpHttpServer {\n\ttype: \"http\";\n\tname: string;\n\turl: string;\n\theaders: Record<string, string>;\n\tenabled: boolean;\n}\n\nexport type McpServerConfig = McpStdioServer | McpHttpServer;\n\nexport interface McpConfigResult {\n\tservers: McpServerConfig[];\n\t/** Human-readable problems; surfaced rather than thrown, so one bad entry cannot block startup. */\n\tdiagnostics: string[];\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n\tif (!value || typeof value !== \"object\") return {};\n\tconst out: Record<string, string> = {};\n\tfor (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n\t\tif (typeof item === \"string\") out[key] = item;\n\t}\n\treturn out;\n}\n\n/** Parse one `mcpServers` entry. Returns a diagnostic string when unusable. */\nexport function parseServerEntry(name: string, raw: unknown): McpServerConfig | string {\n\tif (!raw || typeof raw !== \"object\") return `MCP server \"${name}\": entry is not an object`;\n\tconst entry = raw as Record<string, unknown>;\n\t// `disabled` is the Claude Code spelling; accept `enabled` too so either reads naturally.\n\tconst enabled = entry.disabled === true ? false : entry.enabled !== false;\n\n\tif (typeof entry.command === \"string\" && entry.command.trim()) {\n\t\treturn {\n\t\t\ttype: \"stdio\",\n\t\t\tname,\n\t\t\tcommand: entry.command.trim(),\n\t\t\targs: Array.isArray(entry.args) ? entry.args.filter((a): a is string => typeof a === \"string\") : [],\n\t\t\tenv: stringRecord(entry.env),\n\t\t\tcwd: typeof entry.cwd === \"string\" ? entry.cwd : undefined,\n\t\t\tenabled,\n\t\t};\n\t}\n\n\tconst url =\n\t\ttypeof entry.url === \"string\" ? entry.url : typeof entry.httpUrl === \"string\" ? entry.httpUrl : undefined;\n\tif (url?.trim()) {\n\t\treturn { type: \"http\", name, url: url.trim(), headers: stringRecord(entry.headers), enabled };\n\t}\n\n\treturn `MCP server \"${name}\": needs either \"command\" (stdio) or \"url\" (http)`;\n}\n\n/** Parse a whole config document. */\nexport function parseMcpConfig(text: string, source: string): McpConfigResult {\n\tconst diagnostics: string[] = [];\n\tlet document: unknown;\n\ttry {\n\t\tdocument = JSON.parse(text);\n\t} catch (error) {\n\t\treturn { servers: [], diagnostics: [`${source}: ${error instanceof Error ? error.message : String(error)}`] };\n\t}\n\tconst map = (document as { mcpServers?: unknown } | null)?.mcpServers;\n\tif (!map || typeof map !== \"object\") return { servers: [], diagnostics };\n\n\tconst servers: McpServerConfig[] = [];\n\tfor (const [name, raw] of Object.entries(map as Record<string, unknown>)) {\n\t\tconst parsed = parseServerEntry(name, raw);\n\t\tif (typeof parsed === \"string\") diagnostics.push(`${source}: ${parsed}`);\n\t\telse servers.push(parsed);\n\t}\n\treturn { servers, diagnostics };\n}\n\n/** Config paths, lowest precedence first: user config, then this project's. */\nexport function mcpConfigPaths(cwd: string, home: string = homedir()): string[] {\n\treturn [join(home, \".config\", \"nexus\", \"mcp.json\"), join(cwd, CONFIG_DIR_NAME, \"mcp.json\")];\n}\n\n/** Load and merge user then project config. Later files win on name collisions. */\nexport function loadMcpConfig(\n\tcwd: string,\n\treadFile: (path: string) => string = (path) => readFileSync(path, \"utf8\"),\n\thome?: string,\n): McpConfigResult {\n\tconst byName = new Map<string, McpServerConfig>();\n\tconst diagnostics: string[] = [];\n\tfor (const path of mcpConfigPaths(cwd, home)) {\n\t\tlet text: string;\n\t\ttry {\n\t\t\ttext = readFile(path);\n\t\t} catch {\n\t\t\tcontinue; // Absent config is the normal case, not an error.\n\t\t}\n\t\tconst parsed = parseMcpConfig(text, path);\n\t\tdiagnostics.push(...parsed.diagnostics);\n\t\tfor (const server of parsed.servers) byName.set(server.name, server);\n\t}\n\treturn { servers: [...byName.values()], diagnostics };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/extensions/mcp/config.ts"],"names":[],"mappings":"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","sourcesContent":["// config.ts - Config loading with import support\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse as parseToml } from \"smol-toml\";\nimport stripJsonComments from \"strip-json-comments\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport { type AgentPluginSummary, getAgentPluginSummaries, loadAgentPluginConfigs } from \"./agent-plugin-loader.ts\";\nimport { loadPackageMcpConfigs } from \"./package-mcp-loader.ts\";\nimport {\n\ttype HostConfigDiscovery,\n\ttype ImportKind,\n\tisServerDisabled,\n\ttype McpConfig,\n\ttype McpSettings,\n\ttype ServerEntry,\n\ttype ServerProvenance,\n} from \"./types.ts\";\nimport { toStringRecord } from \"./utils.ts\";\n\nconst NEXUS_GLOBAL_CONFIG_PATH = join(homedir(), \".config\", \"nexus\", \"mcp.json\");\nconst PROJECT_CONFIG_NAME = \"mcp.json\";\nconst REPOPROMPT_BINARY_CANDIDATES = [\n\tjoin(homedir(), \"RepoPrompt\", \"repoprompt_cli\"),\n\t\"/Applications/Repo Prompt.app/Contents/MacOS/repoprompt-mcp\",\n];\n\nexport interface KnownServerPreset {\n\tid: string;\n\tname: string;\n\tsummary: string;\n\tentry: ServerEntry;\n\t/** Optional \"learn more\" link shown in the setup panel. Not used for anything functional. */\n\tdocsUrl?: string;\n}\n\nexport const KNOWN_SERVER_PRESETS: readonly KnownServerPreset[] = [\n\t{\n\t\tid: \"deepwiki\",\n\t\tname: \"DeepWiki\",\n\t\tsummary: \"Ask questions about public GitHub repositories.\",\n\t\tentry: { url: \"https://mcp.deepwiki.com/mcp\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://docs.devin.ai/work-with-devin/deepwiki-mcp\",\n\t},\n\t{\n\t\tid: \"context7\",\n\t\tname: \"Context7\",\n\t\tsummary: \"Look up current library documentation and examples.\",\n\t\tentry: { url: \"https://mcp.context7.com/mcp\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://context7.com\",\n\t},\n\t{\n\t\tid: \"notion\",\n\t\tname: \"Notion\",\n\t\tsummary: \"Search and work with your Notion workspace.\",\n\t\tentry: { url: \"https://mcp.notion.com/mcp\", auth: \"oauth\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://developers.notion.com/docs/mcp\",\n\t},\n\t{\n\t\tid: \"github\",\n\t\tname: \"GitHub\",\n\t\tsummary: \"Work with GitHub through your Copilot account.\",\n\t\tentry: { url: \"https://api.githubcopilot.com/mcp\", auth: \"oauth\", protocolVersion: \"auto\" },\n\t\tdocsUrl: \"https://github.com/github/github-mcp-server\",\n\t},\n\t{\n\t\tid: \"chrome-devtools\",\n\t\tname: \"Chrome DevTools\",\n\t\tsummary: \"Inspect and automate a local Chrome browser.\",\n\t\tentry: { command: \"npx\", args: [\"-y\", \"chrome-devtools-mcp@1.6.0\"] },\n\t\tdocsUrl: \"https://github.com/ChromeDevTools/chrome-devtools-mcp\",\n\t},\n];\n\nconst IMPORT_PATHS: Record<ImportKind, string[]> = {\n\tcursor: [join(homedir(), \".cursor\", \"mcp.json\")],\n\t\"claude-code\": [\n\t\tjoin(homedir(), \".claude\", \"mcp.json\"),\n\t\tjoin(homedir(), \".claude.json\"),\n\t\tjoin(homedir(), \".claude\", \"claude_desktop_config.json\"),\n\t],\n\t\"claude-desktop\": [join(homedir(), \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\")],\n\tcodex: [join(homedir(), \".codex\", \"config.toml\"), join(homedir(), \".codex\", \"config.json\")],\n\topencode: [join(homedir(), \".config\", \"opencode\", \"opencode.json\"), \"./opencode.json\"],\n\twindsurf: [join(homedir(), \".windsurf\", \"mcp.json\")],\n\tvscode: [\".vscode/mcp.json\"],\n};\n\ninterface ConfigSourceSpec {\n\tid: \"nexus-global\" | \"nexus-project\";\n\tlabel: string;\n\treadPath: string;\n\twritePath: string;\n\tkind: \"user\" | \"project\" | \"import\";\n\timportKind?: string;\n\tshared: boolean;\n\tscope: \"global\" | \"project\";\n}\n\nexport interface ConfigDiscoveryPath {\n\tlabel: string;\n\tpath: string;\n\texists: boolean;\n}\n\nexport interface DiscoveredImportConfig {\n\tkind: ImportKind;\n\tpath: string;\n}\n\nexport interface ConfigDiscoverySource extends ConfigDiscoveryPath {\n\tid: ConfigSourceSpec[\"id\"];\n\tscope: ConfigSourceSpec[\"scope\"];\n\tkind: \"shared\" | \"nexus\";\n\tserverCount: number;\n}\n\nexport interface ImportConfigSummary extends DiscoveredImportConfig {\n\tserverCount: number;\n}\n\nexport interface HostConfigSummary extends ImportConfigSummary {\n\tactive: boolean;\n}\n\nexport interface McpConfigConflict {\n\tserverName: string;\n\tsources: Array<{ kind: \"shared\" | \"nexus\" | \"host\"; path: string }>;\n\twinner: { kind: \"shared\" | \"nexus\" | \"host\"; path: string };\n}\n\nexport interface RepoPromptDiscovery {\n\tconfigured: boolean;\n\tconfiguredPath?: string;\n\texecutablePath?: string;\n\ttargetPath?: string;\n\tserverName?: string;\n\tentry?: ServerEntry;\n}\n\nexport interface McpDiscoverySummary {\n\tsources: ConfigDiscoverySource[];\n\timports: ImportConfigSummary[];\n\thostConfigs: HostConfigSummary[];\n\thostConfigDiscovery: HostConfigDiscovery;\n\tagentPlugins: AgentPluginSummary[];\n\tconflicts: McpConfigConflict[];\n\thasAnyConfig: boolean;\n\thasAnyDetectedPaths: boolean;\n\thasSharedServers: boolean;\n\thasNexusOwnedServers: boolean;\n\ttotalServerCount: number;\n\tfingerprint: string;\n\trepoPrompt: RepoPromptDiscovery;\n}\n\nexport interface McpStandardConfigSummary {\n\tsources: ConfigDiscoverySource[];\n\thasSharedServers: boolean;\n\tfingerprint: string;\n}\n\nexport interface ConfigWritePreview {\n\tpath: string;\n\texisted: boolean;\n\tchanged: boolean;\n\tbeforeText: string;\n\tafterText: string;\n\tdiffText: string;\n}\n\nexport function getNexusGlobalConfigPath(overridePath?: string): string {\n\treturn overridePath ? resolve(overridePath) : NEXUS_GLOBAL_CONFIG_PATH;\n}\n\nexport function getGenericGlobalConfigPath(): string {\n\treturn NEXUS_GLOBAL_CONFIG_PATH;\n}\n\nexport function getProjectConfigPath(cwd = process.cwd()): string {\n\treturn resolve(cwd, getConfigDirName(), PROJECT_CONFIG_NAME);\n}\n\nexport function getProjectNexusConfigPath(cwd = process.cwd()): string {\n\treturn getProjectConfigPath(cwd);\n}\n\nexport function getConfigDiscoveryPaths(overridePath?: string, cwd = process.cwd()): ConfigDiscoveryPath[] {\n\treturn getConfigSources(overridePath, cwd).map((source) => ({\n\t\tlabel: source.label,\n\t\tpath: source.readPath,\n\t\texists: existsSync(source.readPath),\n\t}));\n}\n\nexport function findAvailableImportConfigs(cwd = process.cwd()): DiscoveredImportConfig[] {\n\tconst discovered: DiscoveredImportConfig[] = [];\n\n\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\tconst importPath = resolveImportPath(importKind, cwd);\n\t\tif (importPath) {\n\t\t\tdiscovered.push({ kind: importKind, path: importPath });\n\t\t}\n\t}\n\n\treturn discovered;\n}\n\nfunction getConfigSourceSummaries(sourceSpecs: ConfigSourceSpec[]): ConfigDiscoverySource[] {\n\treturn sourceSpecs.map((source) => {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\treturn {\n\t\t\tid: source.id,\n\t\t\tlabel: source.label,\n\t\t\tpath: source.readPath,\n\t\t\texists: existsSync(source.readPath),\n\t\t\tscope: source.scope,\n\t\t\tkind: source.shared ? \"shared\" : \"nexus\",\n\t\t\tserverCount: loaded ? Object.keys(loaded.mcpServers).length : 0,\n\t\t} satisfies ConfigDiscoverySource;\n\t});\n}\n\nexport function getMcpStandardConfigSummary(overridePath?: string, cwd = process.cwd()): McpStandardConfigSummary {\n\tconst sources = getConfigSourceSummaries(getConfigSources(overridePath, cwd));\n\treturn {\n\t\tsources,\n\t\thasSharedServers: sources.some((source) => source.kind === \"shared\" && source.serverCount > 0),\n\t\tfingerprint: JSON.stringify({ sources: sources.map((source) => [source.id, source.exists, source.serverCount]) }),\n\t};\n}\n\nexport function getMcpDiscoverySummary(\n\toverridePath?: string,\n\tcwd = process.cwd(),\n\toptions: { includeHostConfigs?: boolean } = {},\n): McpDiscoverySummary {\n\tconst sourceSpecs = getConfigSources(overridePath, cwd);\n\tconst sources = getConfigSourceSummaries(sourceSpecs);\n\tconst includeHostConfigs = options.includeHostConfigs !== false;\n\n\tconst imports = includeHostConfigs\n\t\t? (Object.keys(IMPORT_PATHS) as ImportKind[])\n\t\t\t\t.map((kind) => {\n\t\t\t\t\tconst imported = loadImportedConfig(kind, cwd, `Failed to inspect imported MCP config from ${kind}:`);\n\t\t\t\t\tif (!imported) return null;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind,\n\t\t\t\t\t\tpath: imported.path,\n\t\t\t\t\t\tserverCount: Object.keys(extractServers(imported.value, kind)).length,\n\t\t\t\t\t} satisfies ImportConfigSummary;\n\t\t\t\t})\n\t\t\t\t.filter((value): value is ImportConfigSummary => value !== null)\n\t\t: [];\n\tconst hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd);\n\tconst hostConfigs = imports.map((entry) => ({ ...entry, active: hostConfigDiscovery === \"on\" }));\n\tconst settings = getMergedSettings(overridePath, cwd);\n\tconst agentPlugins = getAgentPluginSummaries(settings?.agentPluginPaths, cwd);\n\tconst totalServerCount =\n\t\tsources.reduce((sum, source) => sum + source.serverCount, 0) +\n\t\tagentPlugins.reduce((sum, plugin) => sum + plugin.serverCount, 0);\n\tconst hasSharedServers =\n\t\tsources.some((source) => source.kind === \"shared\" && source.serverCount > 0) ||\n\t\tagentPlugins.some((plugin) => plugin.serverCount > 0);\n\tconst hasNexusOwnedServers = sources.some((source) => source.kind === \"nexus\" && source.serverCount > 0);\n\tconst hasAnyDetectedPaths = sources.some((source) => source.exists) || imports.length > 0 || agentPlugins.length > 0;\n\tconst hasAnyConfig = totalServerCount > 0 || imports.some((entry) => entry.serverCount > 0) || hasAnyDetectedPaths;\n\n\tconst summaryWithoutRepoPrompt = {\n\t\tsources,\n\t\timports,\n\t\thostConfigs,\n\t\thostConfigDiscovery,\n\t\tagentPlugins,\n\t\tconflicts: getConfigConflicts(sourceSpecs, imports, cwd),\n\t\thasAnyConfig,\n\t\thasAnyDetectedPaths,\n\t\thasSharedServers,\n\t\thasNexusOwnedServers,\n\t\ttotalServerCount,\n\t};\n\n\tconst fingerprint = JSON.stringify({\n\t\tsources: sources.map((source) => [source.id, source.exists, source.serverCount]),\n\t\timports: imports.map((entry) => [entry.kind, entry.path, entry.serverCount]),\n\t\tagentPlugins: agentPlugins.map((entry) => [entry.path, entry.name, entry.serverCount]),\n\t\thostConfigDiscovery,\n\t\tconflicts: summaryWithoutRepoPrompt.conflicts,\n\t});\n\n\treturn {\n\t\t...summaryWithoutRepoPrompt,\n\t\tfingerprint,\n\t\trepoPrompt: detectRepoPrompt(summaryWithoutRepoPrompt, cwd),\n\t};\n}\n\nexport function cloneMcpConfig(config: McpConfig): McpConfig {\n\treturn structuredClone(config);\n}\n\nexport function loadMcpConfig(overridePath?: string, cwd = process.cwd(), includeProject = true): McpConfig {\n\tconst sourceSpecs = getConfigSources(overridePath, cwd, includeProject);\n\tconst hostConfigDiscovery = getConfiguredHostConfigDiscovery(overridePath, cwd, includeProject);\n\t// Host files are a lower-precedence fallback. This ordering means an opt-in\n\t// discovery cannot override a shared or Nexus-owned definition, and all normal\n\t// URL-bound credential stripping remains in mergeServerMaps.\n\tlet config: McpConfig = hostConfigDiscovery === \"on\" ? loadDiscoveredHostConfigs(cwd) : { mcpServers: {} };\n\n\tfor (const source of sourceSpecs) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\t\tconfig = mergeConfigs(config, expandImports(loaded, cwd));\n\t}\n\n\tconst packageConfig = loadPackageMcpConfigs(cwd, includeProject);\n\tconst pluginConfig = loadAgentPluginConfigs(config.settings?.agentPluginPaths, cwd);\n\tconst packageServers = Object.fromEntries(\n\t\tObject.entries(packageConfig.mcpServers).filter(([name]) => !Object.hasOwn(pluginConfig.mcpServers, name)),\n\t);\n\treturn mergeConfigs({ mcpServers: packageServers }, mergeConfigs(pluginConfig, config));\n}\n\nfunction getMergedSettings(overridePath?: string, cwd = process.cwd(), includeProject = true): McpSettings | undefined {\n\tlet settings: McpSettings | undefined;\n\tfor (const source of getConfigSources(overridePath, cwd, includeProject)) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (loaded?.settings) settings = { ...settings, ...loaded.settings };\n\t}\n\treturn settings;\n}\n\nfunction getConfiguredHostConfigDiscovery(\n\toverridePath?: string,\n\tcwd = process.cwd(),\n\tincludeProject = true,\n): HostConfigDiscovery {\n\tlet configured: HostConfigDiscovery = \"off\";\n\tconst settings = getMergedSettings(overridePath, cwd, includeProject);\n\tconst value = settings?.hostConfigDiscovery;\n\tif (value === \"off\" || value === \"prompt\" || value === \"on\") configured = value;\n\treturn configured;\n}\n\nfunction loadDiscoveredHostConfigs(cwd: string): McpConfig {\n\tlet config: McpConfig = { mcpServers: {} };\n\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\tconst imported = loadImportedConfig(\n\t\t\timportKind,\n\t\t\tcwd,\n\t\t\t`Failed to discover imported MCP config from ${importKind}:`,\n\t\t);\n\t\tif (!imported) continue;\n\t\tconfig = mergeConfigs(config, {\n\t\t\tmcpServers: extractServers(imported.value, importKind),\n\t\t});\n\t}\n\treturn config;\n}\n\nfunction getConfigConflicts(\n\tsourceSpecs: ConfigSourceSpec[],\n\timports: ImportConfigSummary[],\n\tcwd: string,\n): McpConfigConflict[] {\n\tconst seen = new Map<string, Array<{ kind: \"shared\" | \"nexus\" | \"host\"; path: string }>>();\n\tconst record = (name: string, source: { kind: \"shared\" | \"nexus\" | \"host\"; path: string }): void => {\n\t\tconst entries = seen.get(name) ?? [];\n\t\tif (!entries.some((entry) => entry.kind === source.kind && entry.path === source.path)) entries.push(source);\n\t\tseen.set(name, entries);\n\t};\n\n\t// Host candidates are listed first because, when enabled, they are the\n\t// lowest-precedence fallback. The fixed IMPORT_PATHS order is deterministic.\n\tfor (const entry of imports) {\n\t\tconst imported = loadImportedConfig(entry.kind, cwd, `Failed to inspect imported MCP config from ${entry.kind}:`);\n\t\tif (!imported) continue;\n\t\tfor (const name of Object.keys(extractServers(imported.value, entry.kind))) {\n\t\t\trecord(name, { kind: \"host\", path: imported.path });\n\t\t}\n\t}\n\tfor (const source of sourceSpecs) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\t\tif (loaded.imports?.length) {\n\t\t\tfor (const importKind of loaded.imports) {\n\t\t\t\tconst imported = loadImportedConfig(\n\t\t\t\t\timportKind,\n\t\t\t\t\tcwd,\n\t\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t\t);\n\t\t\t\tif (!imported) continue;\n\t\t\t\tfor (const name of Object.keys(extractServers(imported.value, importKind))) {\n\t\t\t\t\trecord(name, { kind: \"host\", path: imported.path });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of Object.keys(loaded.mcpServers)) {\n\t\t\trecord(name, {\n\t\t\t\tkind: source.shared ? \"shared\" : \"nexus\",\n\t\t\t\tpath: source.readPath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn [...seen.entries()]\n\t\t.filter(([, sources]) => sources.length > 1)\n\t\t.map(([serverName, sources]) => ({ serverName, sources, winner: sources[sources.length - 1]! }))\n\t\t.sort((left, right) => left.serverName.localeCompare(right.serverName));\n}\n\nfunction getConfigSources(overridePath?: string, cwd = process.cwd(), includeProject = true): ConfigSourceSpec[] {\n\tconst userPath = getNexusGlobalConfigPath(overridePath);\n\tconst sources: ConfigSourceSpec[] = [\n\t\t{\n\t\t\tid: \"nexus-global\",\n\t\t\tlabel: \"Nexus global MCP\",\n\t\t\treadPath: userPath,\n\t\t\twritePath: userPath,\n\t\t\tkind: \"user\",\n\t\t\tshared: false,\n\t\t\tscope: \"global\",\n\t\t},\n\t];\n\n\tconst projectPath = getProjectConfigPath(cwd);\n\tif (includeProject && projectPath !== userPath) {\n\t\tsources.push({\n\t\t\tid: \"nexus-project\",\n\t\t\tlabel: \"Nexus project MCP\",\n\t\t\treadPath: projectPath,\n\t\t\twritePath: projectPath,\n\t\t\tkind: \"project\",\n\t\t\tshared: false,\n\t\t\tscope: \"project\",\n\t\t});\n\t}\n\n\treturn sources;\n}\n\nfunction mergeConfigs(base: McpConfig, next: McpConfig): McpConfig {\n\tconst imports = mergeImports(base.imports, next.imports);\n\tconst settings = next.settings ? { ...base.settings, ...next.settings } : base.settings;\n\treturn {\n\t\tmcpServers: mergeServerMaps(base.mcpServers, next.mcpServers),\n\t\t...(imports !== undefined ? { imports } : {}),\n\t\t...(settings !== undefined ? { settings } : {}),\n\t};\n}\n\n// Credential-bearing fields whose value is bound to a specific server `url`.\n// When a higher-precedence config source repoints an existing server at a\n// different url, these MUST NOT be inherited from the lower-precedence entry —\n// otherwise the original endpoint's credentials would be shipped to the new\n// url. See the SECURITY note in mergeServerMaps.\nconst URL_BOUND_AUTH_FIELDS = [\n\t\"headers\",\n\t\"bearerToken\",\n\t\"bearerTokenEnv\",\n\t\"bearerTokenStore\",\n\t\"requestHeadersCommand\",\n] as const;\n\nfunction mergeServerMaps(\n\tbase: Record<string, ServerEntry>,\n\tnext: Record<string, ServerEntry>,\n): Record<string, ServerEntry> {\n\tconst merged = { ...base };\n\tfor (const [name, definition] of Object.entries(next)) {\n\t\tconst existing = merged[name];\n\t\t// SECURITY (credential/url binding): the merge is per-field, so a\n\t\t// higher-precedence source that supplies only a new `url` for an existing\n\t\t// server would otherwise retain the lower-precedence entry's auth material\n\t\t// (Authorization header, bearer token, OAuth config) and send it to the new\n\t\t// url — a credential-exfiltration vector when the higher-precedence source\n\t\t// is less trusted than the one that first defined the server. Bind auth to\n\t\t// the url that supplied it: when the url changes, drop inherited auth\n\t\t// material before merging. Auth explicitly re-supplied by `definition` still\n\t\t// applies (it is spread last). Behaviour is unchanged when the url is\n\t\t// identical or the override omits `url` (partial overrides still inherit).\n\t\tlet baseEntry: ServerEntry = existing ?? {};\n\t\tif (existing && typeof definition.command === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\n\t\t\t\t\"url\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"requestHeadersCommand\",\n\t\t\t\t\"auth\",\n\t\t\t\t\"bearerToken\",\n\t\t\t\t\"bearerTokenEnv\",\n\t\t\t\t\"oauth\",\n\t\t\t\t\"httpTransport\",\n\t\t\t\t\"socket\",\n\t\t\t] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t} else if (existing && typeof definition.url === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\"command\", \"args\", \"env\", \"cwd\", \"pluginDataDir\", \"literalEnv\", \"socket\"] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t} else if (existing && typeof definition.socket === \"string\") {\n\t\t\tbaseEntry = { ...existing };\n\t\t\tfor (const field of [\n\t\t\t\t\"command\",\n\t\t\t\t\"args\",\n\t\t\t\t\"env\",\n\t\t\t\t\"cwd\",\n\t\t\t\t\"pluginDataDir\",\n\t\t\t\t\"literalEnv\",\n\t\t\t\t\"url\",\n\t\t\t\t\"headers\",\n\t\t\t\t\"requestHeadersCommand\",\n\t\t\t\t\"auth\",\n\t\t\t\t\"bearerToken\",\n\t\t\t\t\"bearerTokenEnv\",\n\t\t\t\t\"oauth\",\n\t\t\t\t\"httpTransport\",\n\t\t\t] as const) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t}\n\t\tif (existing && typeof definition.url === \"string\" && definition.url !== existing.url) {\n\t\t\tif (baseEntry === existing) baseEntry = { ...existing };\n\t\t\tfor (const field of URL_BOUND_AUTH_FIELDS) {\n\t\t\t\tdelete baseEntry[field];\n\t\t\t}\n\t\t\tif (baseEntry.oauth !== false) {\n\t\t\t\tdelete baseEntry.oauth;\n\t\t\t}\n\t\t}\n\t\tmerged[name] = { ...baseEntry, ...definition };\n\t}\n\treturn merged;\n}\n\nfunction mergeImports(left: ImportKind[] | undefined, right: ImportKind[] | undefined): ImportKind[] | undefined {\n\tconst merged = [...(left ?? []), ...(right ?? [])];\n\tif (merged.length === 0) return undefined;\n\treturn [...new Set(merged)];\n}\n\nfunction expandImports(config: McpConfig, cwd = process.cwd()): McpConfig {\n\tif (!config.imports?.length) return config;\n\n\tconst importedServers: Record<string, ServerEntry> = {};\n\tfor (const importKind of config.imports) {\n\t\tconst imported = loadImportedConfig(importKind, cwd, `Failed to import MCP config from ${importKind}:`);\n\t\tif (!imported) continue;\n\n\t\tconst servers = extractServers(imported.value, importKind);\n\t\tfor (const [name, definition] of Object.entries(servers)) {\n\t\t\tif (!importedServers[name]) {\n\t\t\t\timportedServers[name] = definition;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\timports: config.imports,\n\t\t...(config.settings !== undefined ? { settings: config.settings } : {}),\n\t\tmcpServers: mergeServerMaps(importedServers, config.mcpServers),\n\t};\n}\n\nfunction resolveImportCandidates(importKind: ImportKind, cwd: string): string[] {\n\treturn (IMPORT_PATHS[importKind] ?? []).map((candidate) => {\n\t\tif (importKind === \"opencode\" && candidate === \"./opencode.json\") {\n\t\t\tconst start = resolve(cwd);\n\t\t\tlet gitRoot: string | undefined;\n\t\t\tlet current = start;\n\t\t\twhile (true) {\n\t\t\t\tif (existsSync(join(current, \".git\"))) {\n\t\t\t\t\tgitRoot = current;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst parent = dirname(current);\n\t\t\t\tif (parent === current) break;\n\t\t\t\tcurrent = parent;\n\t\t\t}\n\n\t\t\tif (!gitRoot) return join(start, \"opencode.json\");\n\t\t\tcurrent = start;\n\t\t\twhile (true) {\n\t\t\t\tconst projectConfig = join(current, \"opencode.json\");\n\t\t\t\tif (existsSync(projectConfig) || current === gitRoot) return projectConfig;\n\t\t\t\tcurrent = dirname(current);\n\t\t\t}\n\t\t}\n\t\treturn candidate.startsWith(\".\") ? resolve(cwd, candidate) : candidate;\n\t});\n}\n\nfunction parseJsonConfig(raw: string): unknown {\n\treturn JSON.parse(stripJsonComments(raw, { trailingCommas: true }));\n}\n\nfunction readImportedConfig(path: string): unknown {\n\tconst raw = readFileSync(path, \"utf-8\");\n\treturn path.endsWith(\".toml\") ? parseToml(raw) : parseJsonConfig(raw);\n}\n\nfunction loadImportedConfig(\n\timportKind: ImportKind,\n\tcwd: string,\n\twarningPrefix: string,\n): { path: string; value: unknown } | null {\n\tif (importKind === \"opencode\") {\n\t\tlet merged: Record<string, unknown> = {};\n\t\tlet highestPrecedencePath: string | undefined;\n\n\t\tfor (const path of resolveImportCandidates(importKind, cwd)) {\n\t\t\tif (!existsSync(path)) continue;\n\n\t\t\ttry {\n\t\t\t\tconst value = readImportedConfig(path);\n\t\t\t\tif (value && typeof value === \"object\" && !Array.isArray(value)) {\n\t\t\t\t\tmerged = mergeOpenCodeConfigs(merged, value as Record<string, unknown>);\n\t\t\t\t\thighestPrecedencePath = path;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(warningPrefix, error);\n\t\t\t}\n\t\t}\n\n\t\treturn highestPrecedencePath ? { path: highestPrecedencePath, value: merged } : null;\n\t}\n\n\tfor (const path of resolveImportCandidates(importKind, cwd)) {\n\t\tif (!existsSync(path)) continue;\n\n\t\ttry {\n\t\t\treturn { path, value: readImportedConfig(path) };\n\t\t} catch (error) {\n\t\t\tconsole.warn(warningPrefix, error);\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction resolveImportPath(importKind: ImportKind, cwd = process.cwd()): string | null {\n\treturn (\n\t\tloadImportedConfig(importKind, cwd, `Failed to discover imported MCP config from ${importKind}:`)?.path ?? null\n\t);\n}\n\nfunction readValidatedConfig(path: string, label: string): McpConfig | null {\n\tif (!existsSync(path)) return null;\n\n\ttry {\n\t\treturn validateConfig(parseJsonConfig(readFileSync(path, \"utf-8\")));\n\t} catch (error) {\n\t\tconsole.warn(`Failed to load ${label}:`, error);\n\t\treturn null;\n\t}\n}\n\nfunction validateConfig(raw: unknown): McpConfig {\n\tif (!isRecord(raw)) {\n\t\treturn { mcpServers: {} };\n\t}\n\n\treturn {\n\t\tmcpServers: toServerEntries(raw.mcpServers ?? raw[\"mcp-servers\"]),\n\t\t...(Array.isArray(raw.imports) ? { imports: raw.imports as ImportKind[] } : {}),\n\t\t...(raw.settings !== undefined ? { settings: raw.settings as McpSettings } : {}),\n\t};\n}\n\nfunction toServerEntries(servers: unknown): Record<string, ServerEntry> {\n\tif (!isRecord(servers)) return {};\n\tconst entries: Record<string, ServerEntry> = {};\n\tfor (const [name, entry] of Object.entries(servers)) {\n\t\tif (isServerEntry(entry)) entries[name] = entry;\n\t}\n\treturn entries;\n}\n\nfunction isServerEntry(value: unknown): value is ServerEntry {\n\treturn isRecord(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction mergeOpenCodeConfigs(base: Record<string, unknown>, next: Record<string, unknown>): Record<string, unknown> {\n\tconst baseMcp = base.mcp;\n\tconst nextMcp = next.mcp;\n\tconst mergedMcp: Record<string, unknown> = {\n\t\t...(baseMcp && typeof baseMcp === \"object\" && !Array.isArray(baseMcp) ? baseMcp : {}),\n\t};\n\n\tif (nextMcp && typeof nextMcp === \"object\" && !Array.isArray(nextMcp)) {\n\t\tfor (const [name, nextEntry] of Object.entries(nextMcp)) {\n\t\t\tconst baseEntry = mergedMcp[name];\n\t\t\tif (\n\t\t\t\tbaseEntry &&\n\t\t\t\ttypeof baseEntry === \"object\" &&\n\t\t\t\t!Array.isArray(baseEntry) &&\n\t\t\t\tnextEntry &&\n\t\t\t\ttypeof nextEntry === \"object\" &&\n\t\t\t\t!Array.isArray(nextEntry)\n\t\t\t) {\n\t\t\t\tconst safeBase = { ...(baseEntry as Record<string, unknown>) };\n\t\t\t\tconst override = nextEntry as Record<string, unknown>;\n\t\t\t\tif (typeof override.type === \"string\" && override.type !== safeBase.type) {\n\t\t\t\t\tfor (const field of [\"command\", \"environment\", \"cwd\", \"url\", \"headers\", \"auth\", \"oauth\"])\n\t\t\t\t\t\tdelete safeBase[field];\n\t\t\t\t}\n\t\t\t\tif (typeof override.url === \"string\" && override.url !== safeBase.url) {\n\t\t\t\t\tdelete safeBase.headers;\n\t\t\t\t\tdelete safeBase.auth;\n\t\t\t\t\tdelete safeBase.oauth;\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(override.command)) {\n\t\t\t\t\tconst baseCommand = safeBase.command;\n\t\t\t\t\tconst commandChanged =\n\t\t\t\t\t\t!Array.isArray(baseCommand) ||\n\t\t\t\t\t\toverride.command.length !== baseCommand.length ||\n\t\t\t\t\t\toverride.command.some((value, index) => value !== baseCommand[index]);\n\t\t\t\t\tif (commandChanged) {\n\t\t\t\t\t\tdelete safeBase.environment;\n\t\t\t\t\t\tdelete safeBase.cwd;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst mergedEntry = { ...safeBase, ...override };\n\t\t\t\tfor (const field of [\"environment\", \"headers\", \"oauth\"]) {\n\t\t\t\t\tconst baseField = safeBase[field];\n\t\t\t\t\tconst nextField = override[field];\n\t\t\t\t\tif (\n\t\t\t\t\t\tbaseField &&\n\t\t\t\t\t\ttypeof baseField === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(baseField) &&\n\t\t\t\t\t\tnextField &&\n\t\t\t\t\t\ttypeof nextField === \"object\" &&\n\t\t\t\t\t\t!Array.isArray(nextField)\n\t\t\t\t\t) {\n\t\t\t\t\t\tmergedEntry[field] = {\n\t\t\t\t\t\t\t...(baseField as Record<string, unknown>),\n\t\t\t\t\t\t\t...(nextField as Record<string, unknown>),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmergedMcp[name] = mergedEntry;\n\t\t\t} else {\n\t\t\t\tmergedMcp[name] = nextEntry;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { ...base, ...next, mcp: mergedMcp };\n}\n\nfunction extractServers(config: unknown, kind: ImportKind): Record<string, ServerEntry> {\n\tif (!config || typeof config !== \"object\") return {};\n\n\tconst obj = config as Record<string, unknown>;\n\n\tlet servers: unknown;\n\tswitch (kind) {\n\t\tcase \"claude-desktop\":\n\t\tcase \"claude-code\":\n\t\t\tservers = obj.mcpServers;\n\t\t\tbreak;\n\t\tcase \"codex\":\n\t\t\tservers = obj.mcp_servers ?? obj.mcpServers;\n\t\t\tbreak;\n\t\tcase \"cursor\":\n\t\tcase \"windsurf\":\n\t\tcase \"vscode\":\n\t\t\tservers = obj.mcpServers ?? obj[\"mcp-servers\"];\n\t\t\tbreak;\n\t\tcase \"opencode\":\n\t\t\tservers = obj.mcp;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn {};\n\t}\n\n\tif (!servers || typeof servers !== \"object\" || Array.isArray(servers)) {\n\t\treturn {};\n\t}\n\n\tconst mappedServers: Record<string, ServerEntry> = {};\n\tfor (const [name, entry] of Object.entries(servers)) {\n\t\tif (kind === \"opencode\") {\n\t\t\tif (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n\t\t\tconst raw = entry as Record<string, unknown>;\n\t\t\tif (raw.enabled === false) continue;\n\n\t\t\tif (\n\t\t\t\traw.type === \"local\" &&\n\t\t\t\tArray.isArray(raw.command) &&\n\t\t\t\traw.command.length > 0 &&\n\t\t\t\traw.command.every((value): value is string => typeof value === \"string\")\n\t\t\t) {\n\t\t\t\tconst env = toStringRecord(raw.environment);\n\t\t\t\tconst command = raw.command[0];\n\t\t\t\tif (command === undefined) continue;\n\t\t\t\tconst mapped: ServerEntry = {\n\t\t\t\t\tcommand,\n\t\t\t\t\targs: raw.command.slice(1),\n\t\t\t\t\t...(env ? { env } : {}),\n\t\t\t\t\t...(typeof raw.cwd === \"string\" ? { cwd: raw.cwd } : {}),\n\t\t\t\t};\n\t\t\t\tmappedServers[name] = mapped;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (raw.type === \"remote\" && typeof raw.url === \"string\") {\n\t\t\t\tconst headers = toStringRecord(raw.headers);\n\t\t\t\tconst mapped: ServerEntry = {\n\t\t\t\t\turl: raw.url,\n\t\t\t\t\t...(headers ? { headers } : {}),\n\t\t\t\t};\n\t\t\t\tif (raw.oauth === false) {\n\t\t\t\t\tmapped.oauth = false;\n\t\t\t\t} else if (raw.oauth && typeof raw.oauth === \"object\" && !Array.isArray(raw.oauth)) {\n\t\t\t\t\tconst oauth = raw.oauth as Record<string, unknown>;\n\t\t\t\t\tmapped.auth = \"oauth\";\n\t\t\t\t\tmapped.oauth = {\n\t\t\t\t\t\t...(typeof oauth.clientId === \"string\" ? { clientId: oauth.clientId } : {}),\n\t\t\t\t\t\t...(typeof oauth.clientSecret === \"string\" ? { clientSecret: oauth.clientSecret } : {}),\n\t\t\t\t\t\t...(typeof oauth.scope === \"string\" ? { scope: oauth.scope } : {}),\n\t\t\t\t\t\t...(typeof oauth.skipIssuerMetadataValidation === \"boolean\"\n\t\t\t\t\t\t\t? { skipIssuerMetadataValidation: oauth.skipIssuerMetadataValidation }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tmappedServers[name] = mapped;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!isRecord(entry)) continue;\n\t\tif (kind !== \"codex\") {\n\t\t\tmappedServers[name] = entry;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst mapped = { ...entry };\n\t\tconst bearerTokenEnv = mapped.bearer_token_env_var;\n\t\tconst httpHeaders = mapped.http_headers;\n\t\tconst envHttpHeaders = mapped.env_http_headers;\n\n\t\tif (typeof bearerTokenEnv === \"string\") {\n\t\t\tmapped.bearerTokenEnv = bearerTokenEnv;\n\t\t\tif (mapped.auth === undefined) mapped.auth = \"bearer\";\n\t\t}\n\t\tif (httpHeaders && typeof httpHeaders === \"object\" && !Array.isArray(httpHeaders)) {\n\t\t\tmapped.headers = {\n\t\t\t\t...(mapped.headers as Record<string, string> | undefined),\n\t\t\t\t...(httpHeaders as Record<string, string>),\n\t\t\t};\n\t\t}\n\t\tif (envHttpHeaders && typeof envHttpHeaders === \"object\" && !Array.isArray(envHttpHeaders)) {\n\t\t\tconst headers = { ...(mapped.headers as Record<string, string> | undefined) };\n\t\t\tfor (const [header, envVar] of Object.entries(envHttpHeaders)) {\n\t\t\t\tif (typeof envVar === \"string\" && headers[header] === undefined) headers[header] = `$env:${envVar}`;\n\t\t\t}\n\t\t\tmapped.headers = headers;\n\t\t}\n\n\t\tdelete mapped.bearer_token_env_var;\n\t\tdelete mapped.http_headers;\n\t\tdelete mapped.env_http_headers;\n\t\tmappedServers[name] = mapped as ServerEntry;\n\t}\n\n\treturn mappedServers;\n}\n\nfunction serializeRawConfig(raw: Record<string, unknown>): string {\n\treturn `${JSON.stringify(raw, null, 2)}\\n`;\n}\n\nfunction buildUnifiedDiff(beforeText: string, afterText: string): string {\n\tif (beforeText === afterText) return \"(no changes)\";\n\n\tconst before = beforeText.split(\"\\n\");\n\tconst after = afterText.split(\"\\n\");\n\tconst rows = before.length;\n\tconst cols = after.length;\n\tconst lcs = Array.from({ length: rows + 1 }, () => Array<number>(cols + 1).fill(0));\n\n\tfor (let i = rows - 1; i >= 0; i--) {\n\t\tfor (let j = cols - 1; j >= 0; j--) {\n\t\t\tconst row = lcs[i];\n\t\t\tconst nextRow = lcs[i + 1];\n\t\t\tif (!row || !nextRow) continue;\n\t\t\trow[j] = before[i] === after[j] ? (nextRow[j + 1] ?? 0) + 1 : Math.max(nextRow[j] ?? 0, row[j + 1] ?? 0);\n\t\t}\n\t}\n\n\tconst lines: string[] = [];\n\tlet i = 0;\n\tlet j = 0;\n\twhile (i < rows || j < cols) {\n\t\tif (i < rows && j < cols && before[i] === after[j]) {\n\t\t\tlines.push(` ${before[i]}`);\n\t\t\ti++;\n\t\t\tj++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (j < cols && (i === rows || (lcs[i]?.[j + 1] ?? 0) >= (lcs[i + 1]?.[j] ?? 0))) {\n\t\t\tlines.push(`+ ${after[j]}`);\n\t\t\tj++;\n\t\t\tcontinue;\n\t\t}\n\t\tif (i < rows) {\n\t\t\tlines.push(`- ${before[i]}`);\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nfunction buildConfigWritePreview(filePath: string, nextRaw: Record<string, unknown>): ConfigWritePreview {\n\tconst existed = existsSync(filePath);\n\tconst beforeRaw = readRawConfigObject(filePath);\n\tconst beforeText = existed ? serializeRawConfig(beforeRaw) : \"\";\n\tconst afterText = serializeRawConfig(nextRaw);\n\treturn {\n\t\tpath: filePath,\n\t\texisted,\n\t\tchanged: beforeText !== afterText,\n\t\tbeforeText,\n\t\tafterText,\n\t\tdiffText: buildUnifiedDiff(beforeText, afterText),\n\t};\n}\n\nfunction readRawConfigObject(filePath: string): Record<string, unknown> {\n\tif (!existsSync(filePath)) return {};\n\n\ttry {\n\t\tconst raw = parseJsonConfig(readFileSync(filePath, \"utf-8\"));\n\t\treturn raw && typeof raw === \"object\" && !Array.isArray(raw) ? (raw as Record<string, unknown>) : {};\n\t} catch {\n\t\treturn {};\n\t}\n}\n\nfunction writeRawConfigObject(filePath: string, raw: Record<string, unknown>): void {\n\tmkdirSync(dirname(filePath), { recursive: true });\n\tconst tmpPath = `${filePath}.${process.pid}.tmp`;\n\twriteFileSync(tmpPath, `${JSON.stringify(raw, null, 2)}\\n`, \"utf-8\");\n\trenameSync(tmpPath, filePath);\n}\n\nfunction getServersObject(raw: Record<string, unknown>): Record<string, ServerEntry> {\n\tconst existing = raw.mcpServers ?? raw[\"mcp-servers\"] ?? {};\n\tif (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n\t\treturn {};\n\t}\n\treturn existing as Record<string, ServerEntry>;\n}\n\nfunction setServersObject(raw: Record<string, unknown>, servers: Record<string, ServerEntry>): void {\n\tdelete raw[\"mcp-servers\"];\n\traw.mcpServers = servers;\n}\n\nexport interface ServerDisabledOverrideResult {\n\tpath: string;\n\tchanged: boolean;\n}\n\n/**\n * Persist only the disabled field in the project Nexus layer. Enabling writes an\n * explicit false only when a lower-precedence source is itself disabled; this\n * writer never copies a server definition or its credentials into the file.\n */\nexport function writeProjectServerDisabledOverride(\n\toverridePath: string | undefined,\n\tcwd: string,\n\tserverName: string,\n\tdisabled: boolean,\n): ServerDisabledOverrideResult {\n\tconst filePath = getProjectNexusConfigPath(cwd);\n\tlet raw: Record<string, unknown> = {};\n\tif (existsSync(filePath)) {\n\t\ttry {\n\t\t\tconst parsed = parseJsonConfig(readFileSync(filePath, \"utf-8\"));\n\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\tthrow new Error(\"root value must be an object\");\n\t\t\t}\n\t\t\traw = parsed as Record<string, unknown>;\n\t\t} catch (error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to read project MCP override at ${filePath}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t}\n\n\tconst serverKey =\n\t\traw.mcpServers !== undefined ? \"mcpServers\" : raw[\"mcp-servers\"] !== undefined ? \"mcp-servers\" : \"mcpServers\";\n\tconst rawServers = raw[serverKey];\n\tif (rawServers !== undefined && (!rawServers || typeof rawServers !== \"object\" || Array.isArray(rawServers))) {\n\t\tthrow new Error(`Failed to update project MCP override at ${filePath}: ${serverKey} must be an object`);\n\t}\n\tconst servers = (rawServers ?? {}) as Record<string, unknown>;\n\tconst previous = servers[serverName];\n\tif (previous !== undefined && (!previous || typeof previous !== \"object\" || Array.isArray(previous))) {\n\t\tthrow new Error(`Failed to update project MCP override at ${filePath}: server \"${serverName}\" must be an object`);\n\t}\n\tconst existing = previous as Record<string, unknown> | undefined;\n\n\tlet next: Record<string, unknown>;\n\tif (disabled) {\n\t\tnext = { ...existing, disabled: true };\n\t} else {\n\t\tnext = Object.fromEntries(Object.entries(existing ?? {}).filter(([key]) => key !== \"disabled\"));\n\t\tlet lowerConfig: McpConfig = { mcpServers: {} };\n\t\tfor (const source of getConfigSources(overridePath, cwd)) {\n\t\t\tif (source.readPath === filePath) continue;\n\t\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\t\tif (loaded) lowerConfig = mergeConfigs(lowerConfig, expandImports(loaded, cwd));\n\t\t}\n\t\tif (raw.imports !== undefined) {\n\t\t\tif (\n\t\t\t\t!Array.isArray(raw.imports) ||\n\t\t\t\traw.imports.some((kind) => typeof kind !== \"string\" || !Object.hasOwn(IMPORT_PATHS, kind))\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to update project MCP override at ${filePath}: imports contains an unsupported config kind`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlowerConfig = mergeConfigs(\n\t\t\t\tlowerConfig,\n\t\t\t\texpandImports({ mcpServers: {}, imports: raw.imports as ImportKind[] }, cwd),\n\t\t\t);\n\t\t}\n\t\tif (isServerDisabled(lowerConfig.mcpServers[serverName])) next.disabled = false;\n\t}\n\n\tif ((!existing && Object.keys(next).length === 0) || JSON.stringify(existing) === JSON.stringify(next)) {\n\t\treturn { path: filePath, changed: false };\n\t}\n\tif (Object.keys(next).length === 0) delete servers[serverName];\n\telse servers[serverName] = next;\n\n\traw[serverKey] = servers;\n\twriteRawConfigObject(filePath, raw);\n\treturn { path: filePath, changed: true };\n}\n\nfunction isRepoPromptServer(name: string, entry: ServerEntry): boolean {\n\tconst normalizedName = name.toLowerCase();\n\tif (normalizedName.includes(\"repoprompt\") || normalizedName === \"rp\") {\n\t\treturn true;\n\t}\n\n\tconst command = entry.command?.toLowerCase() ?? \"\";\n\tif (command.includes(\"repoprompt\") || command.includes(\"rp-mcp\") || command.endsWith(\"repoprompt_cli\")) {\n\t\treturn true;\n\t}\n\n\treturn (entry.args ?? []).some((arg) => typeof arg === \"string\" && arg.toLowerCase().includes(\"repoprompt\"));\n}\n\nfunction findProjectRoot(cwd = process.cwd()): string | null {\n\tlet current = resolve(cwd);\n\twhile (true) {\n\t\tif (\n\t\t\texistsSync(join(current, \".git\")) ||\n\t\t\texistsSync(join(current, \"package.json\")) ||\n\t\t\texistsSync(getProjectConfigPath(current)) ||\n\t\t\texistsSync(join(current, getConfigDirName()))\n\t\t) {\n\t\t\treturn current;\n\t\t}\n\n\t\tconst parent = dirname(current);\n\t\tif (parent === current) return null;\n\t\tcurrent = parent;\n\t}\n}\n\nfunction buildRepoPromptEntry(executablePath: string): ServerEntry {\n\treturn {\n\t\tcommand: executablePath,\n\t\targs: [],\n\t\tlifecycle: \"lazy\",\n\t};\n}\n\nfunction detectRepoPrompt(\n\tsummary: Omit<McpDiscoverySummary, \"fingerprint\" | \"repoPrompt\">,\n\tcwd = process.cwd(),\n): RepoPromptDiscovery {\n\tfor (const source of summary.sources) {\n\t\tif (source.serverCount === 0) continue;\n\t\tconst config = readValidatedConfig(source.path, `MCP config from ${source.path}`);\n\t\tif (!config) continue;\n\t\tfor (const [name, entry] of Object.entries(config.mcpServers)) {\n\t\t\tif (isRepoPromptServer(name, entry)) {\n\t\t\t\treturn { configured: true, configuredPath: source.path };\n\t\t\t}\n\t\t}\n\t}\n\n\tconst executablePath = REPOPROMPT_BINARY_CANDIDATES.find((candidate) => existsSync(candidate));\n\tif (!executablePath) {\n\t\treturn { configured: false };\n\t}\n\n\tconst projectRoot = findProjectRoot(cwd);\n\tconst targetPath = projectRoot ? getProjectConfigPath(projectRoot) : NEXUS_GLOBAL_CONFIG_PATH;\n\treturn {\n\t\tconfigured: false,\n\t\texecutablePath,\n\t\ttargetPath,\n\t\tserverName: \"repoprompt\",\n\t\tentry: buildRepoPromptEntry(executablePath),\n\t};\n}\n\nexport function previewCompatibilityImports(importKinds: ImportKind[], overridePath?: string): ConfigWritePreview {\n\tconst targetPath = getNexusGlobalConfigPath(overridePath);\n\tconst raw = readRawConfigObject(targetPath);\n\tconst currentImports = Array.isArray(raw.imports)\n\t\t? raw.imports.filter((value): value is ImportKind => typeof value === \"string\")\n\t\t: [];\n\tconst merged = [...new Set([...currentImports, ...importKinds])];\n\tconst nextRaw = { ...raw, imports: merged };\n\tsetServersObject(nextRaw, getServersObject(nextRaw));\n\treturn buildConfigWritePreview(targetPath, nextRaw);\n}\n\nexport function ensureCompatibilityImports(\n\timportKinds: ImportKind[],\n\toverridePath?: string,\n): { path: string; added: ImportKind[] } {\n\tconst targetPath = getNexusGlobalConfigPath(overridePath);\n\tconst raw = readRawConfigObject(targetPath);\n\tconst currentImports = Array.isArray(raw.imports)\n\t\t? raw.imports.filter((value): value is ImportKind => typeof value === \"string\")\n\t\t: [];\n\tconst merged = [...new Set([...currentImports, ...importKinds])];\n\tconst added = merged.filter((kind) => !currentImports.includes(kind));\n\tif (added.length === 0) {\n\t\treturn { path: targetPath, added: [] };\n\t}\n\n\traw.imports = merged;\n\tconst servers = getServersObject(raw);\n\tsetServersObject(raw, servers);\n\twriteRawConfigObject(targetPath, raw);\n\treturn { path: targetPath, added };\n}\n\nexport function buildStarterProjectConfig(): McpConfig {\n\treturn {\n\t\tmcpServers: {},\n\t};\n}\n\nexport function previewStarterProjectConfig(cwd = process.cwd()): ConfigWritePreview {\n\tconst targetPath = getProjectConfigPath(cwd);\n\tconst nextRaw = { mcpServers: buildStarterProjectConfig().mcpServers };\n\treturn buildConfigWritePreview(targetPath, nextRaw);\n}\n\nexport function writeStarterProjectConfig(cwd = process.cwd()): string {\n\tconst targetPath = getProjectConfigPath(cwd);\n\tconst raw = { mcpServers: buildStarterProjectConfig().mcpServers };\n\twriteRawConfigObject(targetPath, raw);\n\treturn targetPath;\n}\n\nexport function previewSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): ConfigWritePreview {\n\tconst raw = readRawConfigObject(filePath);\n\tconst nextRaw = { ...raw };\n\tconst servers = getServersObject(nextRaw);\n\tservers[serverName] = entry;\n\tsetServersObject(nextRaw, servers);\n\treturn buildConfigWritePreview(filePath, nextRaw);\n}\n\nexport function writeSharedServerEntry(filePath: string, serverName: string, entry: ServerEntry): string {\n\tconst raw = readRawConfigObject(filePath);\n\tconst servers = getServersObject(raw);\n\tservers[serverName] = entry;\n\tsetServersObject(raw, servers);\n\twriteRawConfigObject(filePath, raw);\n\treturn filePath;\n}\n\nexport function getServerProvenance(overridePath?: string, cwd = process.cwd()): Map<string, ServerProvenance> {\n\tconst provenance = new Map<string, ServerProvenance>();\n\tconst userPath = getNexusGlobalConfigPath(overridePath);\n\n\tif (getConfiguredHostConfigDiscovery(overridePath, cwd) === \"on\") {\n\t\tfor (const importKind of Object.keys(IMPORT_PATHS) as ImportKind[]) {\n\t\t\tconst imported = loadImportedConfig(\n\t\t\t\timportKind,\n\t\t\t\tcwd,\n\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t);\n\t\t\tif (!imported) continue;\n\t\t\tfor (const name of Object.keys(extractServers(imported.value, importKind))) {\n\t\t\t\t// Keep writes inside Nexus-owned storage even though the source is external.\n\t\t\t\t// Later import kinds win in the same deterministic order as loadDiscoveredHostConfigs.\n\t\t\t\tprovenance.set(name, { path: userPath, kind: \"import\", importKind });\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const source of getConfigSources(overridePath, cwd)) {\n\t\tconst loaded = readValidatedConfig(source.readPath, `MCP config from ${source.readPath}`);\n\t\tif (!loaded) continue;\n\n\t\tif (loaded.imports?.length) {\n\t\t\tfor (const importKind of loaded.imports) {\n\t\t\t\tconst imported = loadImportedConfig(\n\t\t\t\t\timportKind,\n\t\t\t\t\tcwd,\n\t\t\t\t\t`Failed to inspect imported MCP config from ${importKind}:`,\n\t\t\t\t);\n\t\t\t\tif (!imported) continue;\n\n\t\t\t\tconst servers = extractServers(imported.value, importKind);\n\t\t\t\tfor (const name of Object.keys(servers)) {\n\t\t\t\t\t// Sources and their imports are visited from lower to higher precedence.\n\t\t\t\t\t// Always replace the prior provenance so writes follow the definition\n\t\t\t\t\t// that actually won the merge.\n\t\t\t\t\tprovenance.set(name, { path: userPath, kind: \"import\", importKind });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const name of Object.keys(loaded.mcpServers)) {\n\t\t\tprovenance.set(name, {\n\t\t\t\tpath: source.writePath,\n\t\t\t\tkind: source.kind,\n\t\t\t\t...(source.importKind !== undefined ? { importKind: source.importKind } : {}),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn provenance;\n}\n\nexport function writeDirectToolsConfig(\n\tchanges: Map<string, true | string[] | false>,\n\tprovenance: Map<string, ServerProvenance>,\n): void {\n\tconst byPath = new Map<string, { name: string; value: true | string[] | false; prov: ServerProvenance }[]>();\n\n\tfor (const [serverName, value] of changes) {\n\t\tconst prov = provenance.get(serverName);\n\t\tif (!prov) continue;\n\n\t\tconst targetPath = prov.path;\n\n\t\tif (!byPath.has(targetPath)) byPath.set(targetPath, []);\n\t\tbyPath.get(targetPath)!.push({ name: serverName, value, prov });\n\t}\n\n\tfor (const [filePath, entries] of byPath) {\n\t\tconst raw = readRawConfigObject(filePath);\n\t\tconst servers = getServersObject(raw);\n\n\t\tfor (const { name, value, prov } of entries) {\n\t\t\tif (prov.kind === \"import\") {\n\t\t\t\t// Imported definitions can contain credentials. Persist only Nexus's\n\t\t\t\t// field-level override and let mergeServerMaps inherit the definition\n\t\t\t\t// from the selected compatibility source on the next load.\n\t\t\t\tservers[name] = { ...(servers[name] ?? {}), directTools: value };\n\t\t\t} else if (servers[name]) {\n\t\t\t\tservers[name] = { ...servers[name], directTools: value };\n\t\t\t}\n\t\t}\n\n\t\tsetServersObject(raw, servers);\n\t\twriteRawConfigObject(filePath, raw);\n\t}\n}\n\nexport function resolveConfiguredOAuthDir(raw: unknown, cwd = process.cwd()): string | undefined {\n\tif (raw === undefined || raw === null) return undefined;\n\tif (typeof raw !== \"string\") {\n\t\tthrow new Error(\"settings.oauthDir must be a string\");\n\t}\n\n\tconst trimmed = raw.trim();\n\tif (!trimmed) return undefined;\n\treturn resolve(cwd, trimmed);\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ToolConsentMode = "never" | "once-per-server" | "always";
|
|
2
|
+
export declare class ConsentManager {
|
|
3
|
+
private approvedServers;
|
|
4
|
+
private deniedServers;
|
|
5
|
+
private log;
|
|
6
|
+
private mode;
|
|
7
|
+
constructor(mode?: ToolConsentMode);
|
|
8
|
+
requiresPrompt(serverName: string): boolean;
|
|
9
|
+
shouldCacheConsent(): boolean;
|
|
10
|
+
registerDecision(serverName: string, approved: boolean): void;
|
|
11
|
+
ensureApproved(serverName: string): void;
|
|
12
|
+
clear(serverName?: string): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=consent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-manager.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/consent-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAErE,qBAAa,cAAc;IAC1B,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,GAAG,CAAiD;IAC5D,OAAO,CAAC,IAAI,CAAkB;IAE9B,YAAY,IAAI,GAAE,eAAmC,EAGpD;IAED,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAK1C;IAED,kBAAkB,IAAI,OAAO,CAE5B;IAED,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAY5D;IAED,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAWvC;IAED,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAU/B;CACD","sourcesContent":["import { ConsentError } from \"./errors.ts\";\nimport { logger } from \"./logger.ts\";\n\nexport type ToolConsentMode = \"never\" | \"once-per-server\" | \"always\";\n\nexport class ConsentManager {\n\tprivate approvedServers = new Set<string>();\n\tprivate deniedServers = new Set<string>();\n\tprivate log = logger.child({ component: \"ConsentManager\" });\n\tprivate mode: ToolConsentMode;\n\n\tconstructor(mode: ToolConsentMode = \"once-per-server\") {\n\t\tthis.mode = mode;\n\t\tthis.log.debug(\"Initialized\", { mode });\n\t}\n\n\trequiresPrompt(serverName: string): boolean {\n\t\tif (this.mode === \"never\") return false;\n\t\tif (this.deniedServers.has(serverName)) return true;\n\t\tif (this.mode === \"always\") return true;\n\t\treturn !this.approvedServers.has(serverName);\n\t}\n\n\tshouldCacheConsent(): boolean {\n\t\treturn this.mode !== \"always\";\n\t}\n\n\tregisterDecision(serverName: string, approved: boolean): void {\n\t\tthis.deniedServers.delete(serverName);\n\t\tthis.approvedServers.delete(serverName);\n\n\t\tif (approved) {\n\t\t\tthis.approvedServers.add(serverName);\n\t\t\tthis.log.debug(\"Consent granted\", { server: serverName });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.deniedServers.add(serverName);\n\t\tthis.log.debug(\"Consent denied\", { server: serverName });\n\t}\n\n\tensureApproved(serverName: string): void {\n\t\tif (this.mode === \"never\") return;\n\t\tif (this.deniedServers.has(serverName)) {\n\t\t\tthrow new ConsentError(serverName, { denied: true });\n\t\t}\n\t\tif (!this.approvedServers.has(serverName)) {\n\t\t\tthrow new ConsentError(serverName, { requiresApproval: true });\n\t\t}\n\t\tif (this.mode === \"always\") {\n\t\t\tthis.approvedServers.delete(serverName);\n\t\t}\n\t}\n\n\tclear(serverName?: string): void {\n\t\tif (serverName) {\n\t\t\tthis.approvedServers.delete(serverName);\n\t\t\tthis.deniedServers.delete(serverName);\n\t\t\tthis.log.debug(\"Cleared consent for server\", { server: serverName });\n\t\t\treturn;\n\t\t}\n\t\tthis.approvedServers.clear();\n\t\tthis.deniedServers.clear();\n\t\tthis.log.debug(\"Cleared all consent records\");\n\t}\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ConsentError } from "./errors.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
export class ConsentManager {
|
|
4
|
+
approvedServers = new Set();
|
|
5
|
+
deniedServers = new Set();
|
|
6
|
+
log = logger.child({ component: "ConsentManager" });
|
|
7
|
+
mode;
|
|
8
|
+
constructor(mode = "once-per-server") {
|
|
9
|
+
this.mode = mode;
|
|
10
|
+
this.log.debug("Initialized", { mode });
|
|
11
|
+
}
|
|
12
|
+
requiresPrompt(serverName) {
|
|
13
|
+
if (this.mode === "never")
|
|
14
|
+
return false;
|
|
15
|
+
if (this.deniedServers.has(serverName))
|
|
16
|
+
return true;
|
|
17
|
+
if (this.mode === "always")
|
|
18
|
+
return true;
|
|
19
|
+
return !this.approvedServers.has(serverName);
|
|
20
|
+
}
|
|
21
|
+
shouldCacheConsent() {
|
|
22
|
+
return this.mode !== "always";
|
|
23
|
+
}
|
|
24
|
+
registerDecision(serverName, approved) {
|
|
25
|
+
this.deniedServers.delete(serverName);
|
|
26
|
+
this.approvedServers.delete(serverName);
|
|
27
|
+
if (approved) {
|
|
28
|
+
this.approvedServers.add(serverName);
|
|
29
|
+
this.log.debug("Consent granted", { server: serverName });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.deniedServers.add(serverName);
|
|
33
|
+
this.log.debug("Consent denied", { server: serverName });
|
|
34
|
+
}
|
|
35
|
+
ensureApproved(serverName) {
|
|
36
|
+
if (this.mode === "never")
|
|
37
|
+
return;
|
|
38
|
+
if (this.deniedServers.has(serverName)) {
|
|
39
|
+
throw new ConsentError(serverName, { denied: true });
|
|
40
|
+
}
|
|
41
|
+
if (!this.approvedServers.has(serverName)) {
|
|
42
|
+
throw new ConsentError(serverName, { requiresApproval: true });
|
|
43
|
+
}
|
|
44
|
+
if (this.mode === "always") {
|
|
45
|
+
this.approvedServers.delete(serverName);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
clear(serverName) {
|
|
49
|
+
if (serverName) {
|
|
50
|
+
this.approvedServers.delete(serverName);
|
|
51
|
+
this.deniedServers.delete(serverName);
|
|
52
|
+
this.log.debug("Cleared consent for server", { server: serverName });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.approvedServers.clear();
|
|
56
|
+
this.deniedServers.clear();
|
|
57
|
+
this.log.debug("Cleared all consent records");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=consent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-manager.js","sourceRoot":"","sources":["../../../src/extensions/mcp/consent-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConsentError } from \"./errors.ts\";\nimport { logger } from \"./logger.ts\";\n\nexport type ToolConsentMode = \"never\" | \"once-per-server\" | \"always\";\n\nexport class ConsentManager {\n\tprivate approvedServers = new Set<string>();\n\tprivate deniedServers = new Set<string>();\n\tprivate log = logger.child({ component: \"ConsentManager\" });\n\tprivate mode: ToolConsentMode;\n\n\tconstructor(mode: ToolConsentMode = \"once-per-server\") {\n\t\tthis.mode = mode;\n\t\tthis.log.debug(\"Initialized\", { mode });\n\t}\n\n\trequiresPrompt(serverName: string): boolean {\n\t\tif (this.mode === \"never\") return false;\n\t\tif (this.deniedServers.has(serverName)) return true;\n\t\tif (this.mode === \"always\") return true;\n\t\treturn !this.approvedServers.has(serverName);\n\t}\n\n\tshouldCacheConsent(): boolean {\n\t\treturn this.mode !== \"always\";\n\t}\n\n\tregisterDecision(serverName: string, approved: boolean): void {\n\t\tthis.deniedServers.delete(serverName);\n\t\tthis.approvedServers.delete(serverName);\n\n\t\tif (approved) {\n\t\t\tthis.approvedServers.add(serverName);\n\t\t\tthis.log.debug(\"Consent granted\", { server: serverName });\n\t\t\treturn;\n\t\t}\n\n\t\tthis.deniedServers.add(serverName);\n\t\tthis.log.debug(\"Consent denied\", { server: serverName });\n\t}\n\n\tensureApproved(serverName: string): void {\n\t\tif (this.mode === \"never\") return;\n\t\tif (this.deniedServers.has(serverName)) {\n\t\t\tthrow new ConsentError(serverName, { denied: true });\n\t\t}\n\t\tif (!this.approvedServers.has(serverName)) {\n\t\t\tthrow new ConsentError(serverName, { requiresApproval: true });\n\t\t}\n\t\tif (this.mode === \"always\") {\n\t\t\tthis.approvedServers.delete(serverName);\n\t\t}\n\t}\n\n\tclear(serverName?: string): void {\n\t\tif (serverName) {\n\t\t\tthis.approvedServers.delete(serverName);\n\t\t\tthis.deniedServers.delete(serverName);\n\t\t\tthis.log.debug(\"Cleared consent for server\", { server: serverName });\n\t\t\treturn;\n\t\t}\n\t\tthis.approvedServers.clear();\n\t\tthis.deniedServers.clear();\n\t\tthis.log.debug(\"Cleared all consent records\");\n\t}\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AgentToolResult, AgentToolUpdateCallback, ExtensionContext } from "../../core/extensions/types.ts";
|
|
2
|
+
import type { MetadataCache } from "./metadata-cache.ts";
|
|
3
|
+
import type { McpExtensionState } from "./state.ts";
|
|
4
|
+
import type { DirectToolSpec, McpConfig, ToolPrefix } from "./types.ts";
|
|
5
|
+
export { getMissingConfiguredDirectToolServers } from "./metadata-cache.ts";
|
|
6
|
+
export declare const DIRECT_TOOLS_ADVISORY_THRESHOLD = 75;
|
|
7
|
+
export declare function resolveDirectTools(config: McpConfig, cache: MetadataCache | null, prefix: ToolPrefix, envOverride?: string[]): DirectToolSpec[];
|
|
8
|
+
export declare function buildProxyDescription(config: McpConfig, cache: MetadataCache | null, directSpecs: DirectToolSpec[]): string;
|
|
9
|
+
type DirectToolExecute = (toolCallId: string, params: Record<string, unknown>, signal: AbortSignal | undefined, onUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Record<string, unknown>>>;
|
|
10
|
+
export declare function createDirectToolExecutor(getState: () => McpExtensionState | null, getInitPromise: () => Promise<McpExtensionState> | null, spec: DirectToolSpec): DirectToolExecute;
|
|
11
|
+
//# sourceMappingURL=direct-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-tools.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/direct-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGjH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAc,UAAU,EAAE,MAAM,YAAY,CAAC;AAEpF,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AA2B5E,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAoFlD,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,MAAM,EAAE,UAAU,EAClB,WAAW,CAAC,EAAE,MAAM,EAAE,GACpB,cAAc,EAAE,CA+IlB;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,aAAa,GAAG,IAAI,EAC3B,WAAW,EAAE,cAAc,EAAE,GAC3B,MAAM,CAoIR;AAED,KAAK,iBAAiB,GAAG,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,EACtE,GAAG,EAAE,gBAAgB,KACjB,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAEvD,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,iBAAiB,GAAG,IAAI,EACxC,cAAc,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,EACvD,IAAI,EAAE,cAAc,GAClB,iBAAiB,CAuSnB","sourcesContent":["import { type CallToolResult, type Client, UrlElicitationRequiredError } from \"@modelcontextprotocol/client\";\nimport type { AgentToolResult, AgentToolUpdateCallback, ExtensionContext } from \"../../core/extensions/types.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\nimport { clearFailure, getFailureAgeSeconds, lazyConnect } from \"./init.ts\";\nimport type { MetadataCache } from \"./metadata-cache.ts\";\nimport { isServerCacheValid, parseDirectToolSelectors } from \"./metadata-cache.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport type { DirectToolSpec, McpConfig, McpContent, ToolPrefix } from \"./types.ts\";\n\nexport { getMissingConfiguredDirectToolServers } from \"./metadata-cache.ts\";\n\nimport { authenticate, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { guardedMcpDetails, guardMcpOutput, resolveMcpOutputGuardOptions } from \"./mcp-output-guard.ts\";\nimport { resourceNameToToolName } from \"./resource-tools.ts\";\nimport { combineAbortSignals, isAbortError } from \"./runtime-owner.ts\";\nimport { SessionRecoveryAuthRequiredError, withSessionRecovery } from \"./session-recovery.ts\";\nimport { ensureToolCallApproved } from \"./tool-approval.ts\";\nimport { formatSchema } from \"./tool-metadata.ts\";\nimport { resolveMcpResultContent, transformMcpContent, transformMcpResourceContents } from \"./tool-registrar.ts\";\nimport {\n\tcreateToolSelectorCandidateIndex,\n\tformatToolName,\n\tgetToolNameCandidates,\n\tisServerDisabled,\n\tisToolAllowed,\n\tresolveToolPrefix,\n} from \"./types.ts\";\nimport { maybeStartUiSession, summarizeUiSessionResult, type UiSessionRuntime } from \"./ui-session.ts\";\nimport { isUiToolVisibleToModel } from \"./ui-tool-visibility.ts\";\nimport { formatAuthRequiredMessage, normalizeToolArguments, resolveServerUrl, truncateAtWord } from \"./utils.ts\";\n\ntype ClientCallToolResult = Awaited<ReturnType<Client[\"callTool\"]>>;\ntype ClientReadResourceResult = Awaited<ReturnType<Client[\"readResource\"]>>;\n\nconst BUILTIN_NAMES = new Set([\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\", \"mcp\"]);\nconst INSTRUCTIONS_SNIPPET_LENGTH = 150;\nexport const DIRECT_TOOLS_ADVISORY_THRESHOLD = 75;\n\ntype DirectAutoAuthResult = { status: \"skipped\" } | { status: \"success\" } | { status: \"failed\"; message: string };\n\nfunction getDirectAuthRequiredMessage(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tdefaultMessage = `MCP server \"${serverName}\" requires OAuth authentication. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`,\n): string {\n\treturn formatAuthRequiredMessage(state.config, serverName, defaultMessage);\n}\n\nfunction getDirectAuthFailedMessage(state: McpExtensionState, serverName: string, message: string): string {\n\tconst customGuidance = state.config.settings?.authRequiredMessage;\n\tif (customGuidance) {\n\t\treturn `OAuth authentication failed for \"${serverName}\": ${message}. ${getDirectAuthRequiredMessage(state, serverName)}`;\n\t}\n\treturn `OAuth authentication failed for \"${serverName}\": ${message}. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`;\n}\n\nasync function attemptDirectAutoAuth(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tsignal?: AbortSignal,\n): Promise<DirectAutoAuthResult> {\n\tif (state.config.settings?.autoAuth !== true) {\n\t\treturn { status: \"skipped\" };\n\t}\n\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition || isServerDisabled(definition) || !supportsOAuth(definition)) {\n\t\treturn { status: \"skipped\" };\n\t}\n\n\tlet serverUrl: string | undefined;\n\ttry {\n\t\tserverUrl = resolveServerUrl(definition);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { status: \"failed\", message: getDirectAuthFailedMessage(state, serverName, message) };\n\t}\n\tif (!serverUrl) {\n\t\treturn { status: \"skipped\" };\n\t}\n\n\tconst grantType = definition.oauth ? (definition.oauth.grantType ?? \"authorization_code\") : \"authorization_code\";\n\tif (!state.ui && grantType !== \"client_credentials\") {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: getDirectAuthRequiredMessage(\n\t\t\t\tstate,\n\t\t\t\tserverName,\n\t\t\t\t`MCP server \"${serverName}\" requires OAuth authentication. Run mcp({ action: \"auth-start\", server: \"${serverName}\" }) to get a browser URL, or /mcp-auth ${serverName} in an interactive local session.`,\n\t\t\t),\n\t\t};\n\t}\n\n\ttry {\n\t\tif (state.authStorageOptions) {\n\t\t\tawait authenticate(\n\t\t\t\tserverName,\n\t\t\t\tserverUrl,\n\t\t\t\tdefinition,\n\t\t\t\tsignal\n\t\t\t\t\t? { authStorageOptions: state.authStorageOptions, signal, runtime: state.oauthRuntime }\n\t\t\t\t\t: { authStorageOptions: state.authStorageOptions, runtime: state.oauthRuntime },\n\t\t\t);\n\t\t} else {\n\t\t\tawait authenticate(serverName, serverUrl, definition, {\n\t\t\t\t...(signal ? { signal } : {}),\n\t\t\t\truntime: state.oauthRuntime,\n\t\t\t});\n\t\t}\n\t\treturn { status: \"success\" };\n\t} catch (error) {\n\t\tif (isAbortError(error, signal)) throw error;\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tmessage: getDirectAuthFailedMessage(state, serverName, message),\n\t\t};\n\t}\n}\n\nexport function resolveDirectTools(\n\tconfig: McpConfig,\n\tcache: MetadataCache | null,\n\tprefix: ToolPrefix,\n\tenvOverride?: string[],\n): DirectToolSpec[] {\n\tconst specs: DirectToolSpec[] = [];\n\tif (!cache) return specs;\n\n\tconst seenNames = new Set<string>();\n\n\tconst envSelection = envOverride ? parseDirectToolSelectors(envOverride) : null;\n\tconst globalDirect = config.settings?.directTools;\n\n\tfor (const [serverName, definition] of Object.entries(config.mcpServers)) {\n\t\tif (isServerDisabled(definition)) continue;\n\t\tconst serverCache = cache.servers[serverName];\n\t\tif (!serverCache || !isServerCacheValid(serverCache, definition)) continue;\n\n\t\tlet toolFilter: true | string[] | false = false;\n\n\t\tif (envSelection) {\n\t\t\tif (envSelection.servers.has(serverName)) {\n\t\t\t\ttoolFilter = true;\n\t\t\t} else if (envSelection.tools.has(serverName)) {\n\t\t\t\ttoolFilter = [...envSelection.tools.get(serverName)!];\n\t\t\t}\n\t\t} else {\n\t\t\tif (definition.directTools !== undefined) {\n\t\t\t\ttoolFilter = definition.directTools;\n\t\t\t} else if (globalDirect) {\n\t\t\t\ttoolFilter = globalDirect;\n\t\t\t}\n\t\t}\n\n\t\tif (!toolFilter) continue;\n\n\t\tconst effectivePrefix = resolveToolPrefix(definition, prefix);\n\t\tconst hasToolFilters =\n\t\t\t(Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||\n\t\t\t(Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);\n\t\tconst selectorCandidateIndex = hasToolFilters\n\t\t\t? (() => {\n\t\t\t\t\tconst candidates = new Set<string>();\n\t\t\t\t\tfor (const [otherServerName, otherDefinition] of Object.entries(config.mcpServers)) {\n\t\t\t\t\t\tconst otherCache = cache.servers[otherServerName];\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!otherCache ||\n\t\t\t\t\t\t\t!isServerCacheValid(otherCache, otherDefinition) ||\n\t\t\t\t\t\t\tisServerDisabled(otherDefinition)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\tconst otherPrefix = resolveToolPrefix(otherDefinition, prefix);\n\t\t\t\t\t\tfor (const otherTool of otherCache.tools ?? []) {\n\t\t\t\t\t\t\tif (!isUiToolVisibleToModel(otherTool.uiVisibility)) continue;\n\t\t\t\t\t\t\tfor (const candidate of getToolNameCandidates(otherTool.name, otherServerName, otherPrefix, false))\n\t\t\t\t\t\t\t\tcandidates.add(candidate);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (otherDefinition.exposeResources !== false) {\n\t\t\t\t\t\t\tfor (const resource of otherCache.resources ?? []) {\n\t\t\t\t\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\t\t\t\tfor (const candidate of getToolNameCandidates(baseName, otherServerName, otherPrefix, false))\n\t\t\t\t\t\t\t\t\tcandidates.add(candidate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn createToolSelectorCandidateIndex(candidates);\n\t\t\t\t})()\n\t\t\t: undefined;\n\n\t\tfor (const tool of serverCache.tools ?? []) {\n\t\t\tif (!isUiToolVisibleToModel(tool.uiVisibility)) continue;\n\t\t\tif (toolFilter !== true && !toolFilter.includes(tool.name)) continue;\n\t\t\tif (\n\t\t\t\t!isToolAllowed(\n\t\t\t\t\ttool.name,\n\t\t\t\t\tserverName,\n\t\t\t\t\teffectivePrefix,\n\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\tselectorCandidateIndex,\n\t\t\t\t)\n\t\t\t)\n\t\t\t\tcontinue;\n\t\t\tconst prefixedName = formatToolName(tool.name, serverName, effectivePrefix);\n\t\t\tif (BUILTIN_NAMES.has(prefixedName)) {\n\t\t\t\tconsole.warn(`MCP: skipping direct tool \"${prefixedName}\" (collides with builtin)`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (seenNames.has(prefixedName)) {\n\t\t\t\tconsole.warn(`MCP: skipping duplicate direct tool \"${prefixedName}\" from \"${serverName}\"`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tseenNames.add(prefixedName);\n\t\t\tspecs.push({\n\t\t\t\tserverName,\n\t\t\t\toriginalName: tool.name,\n\t\t\t\tprefixedName,\n\t\t\t\tdescription: tool.description ?? \"\",\n\t\t\t\t...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),\n\t\t\t\t...(tool.uiResourceUri !== undefined ? { uiResourceUri: tool.uiResourceUri } : {}),\n\t\t\t\t...(tool.uiStreamMode !== undefined ? { uiStreamMode: tool.uiStreamMode } : {}),\n\t\t\t});\n\t\t}\n\n\t\tif (definition.exposeResources !== false) {\n\t\t\tfor (const resource of serverCache.resources ?? []) {\n\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\tif (toolFilter !== true && !toolFilter.includes(baseName)) continue;\n\t\t\t\tif (\n\t\t\t\t\t!isToolAllowed(\n\t\t\t\t\t\tbaseName,\n\t\t\t\t\t\tserverName,\n\t\t\t\t\t\teffectivePrefix,\n\t\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\t\tselectorCandidateIndex,\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t\tcontinue;\n\t\t\t\tconst prefixedName = formatToolName(baseName, serverName, effectivePrefix);\n\t\t\t\tif (BUILTIN_NAMES.has(prefixedName)) {\n\t\t\t\t\tconsole.warn(`MCP: skipping direct resource tool \"${prefixedName}\" (collides with builtin)`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (seenNames.has(prefixedName)) {\n\t\t\t\t\tconsole.warn(`MCP: skipping duplicate direct resource tool \"${prefixedName}\" from \"${serverName}\"`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tseenNames.add(prefixedName);\n\t\t\t\tspecs.push({\n\t\t\t\t\tserverName,\n\t\t\t\t\toriginalName: baseName,\n\t\t\t\t\tprefixedName,\n\t\t\t\t\tdescription: resource.description ?? `Read resource: ${resource.uri}`,\n\t\t\t\t\tresourceUri: resource.uri,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tif (config.settings?.warnOnLargeDirectTools !== false && specs.length >= DIRECT_TOOLS_ADVISORY_THRESHOLD) {\n\t\tconsole.warn(\n\t\t\t`MCP: ${specs.length} direct tools resolved. Each direct tool adds prompt context; README guidance recommends targeted sets of 5-20 tools and using the proxy or an explicit string[] when 75+ direct tools would be registered.`,\n\t\t);\n\t}\n\n\treturn specs;\n}\n\nexport function buildProxyDescription(\n\tconfig: McpConfig,\n\tcache: MetadataCache | null,\n\tdirectSpecs: DirectToolSpec[],\n): string {\n\tconst prefix = config.settings?.toolPrefix ?? \"server\";\n\tlet desc = `MCP gateway — server status, tool search/describe, auth, and single MCP tool calls. When one request needs several MCP calls with logic between them, use mcpScript. Non-MCP Nexus tools should be called directly, not through mcp.\\n`;\n\n\tconst directByServer = new Map<string, number>();\n\tfor (const spec of directSpecs) {\n\t\tdirectByServer.set(spec.serverName, (directByServer.get(spec.serverName) ?? 0) + 1);\n\t}\n\tif (directByServer.size > 0) {\n\t\tconst parts = [...directByServer.entries()].map(([server, count]) => `${server} (${count})`);\n\t\tdesc += `\\nDirect tools available (call as normal tools): ${parts.join(\", \")}\\n`;\n\t}\n\n\tconst serverSummaries: string[] = [];\n\tfor (const serverName of Object.keys(config.mcpServers)) {\n\t\tconst definition = config.mcpServers[serverName];\n\t\tif (!definition || isServerDisabled(definition)) continue;\n\t\tconst cachedEntry = cache?.servers?.[serverName];\n\t\tconst entry = cachedEntry && isServerCacheValid(cachedEntry, definition) ? cachedEntry : undefined;\n\t\tconst effectivePrefix = resolveToolPrefix(definition, prefix);\n\t\tconst hasToolFilters =\n\t\t\t(Array.isArray(definition.includeTools) && definition.includeTools.length > 0) ||\n\t\t\t(Array.isArray(definition.excludeTools) && definition.excludeTools.length > 0);\n\t\tconst selectorCandidateIndex =\n\t\t\thasToolFilters && cache\n\t\t\t\t? (() => {\n\t\t\t\t\t\tconst candidates = new Set<string>();\n\t\t\t\t\t\tfor (const [otherServerName, otherDefinition] of Object.entries(config.mcpServers)) {\n\t\t\t\t\t\t\tconst otherEntry = cache.servers[otherServerName];\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!otherEntry ||\n\t\t\t\t\t\t\t\t!isServerCacheValid(otherEntry, otherDefinition) ||\n\t\t\t\t\t\t\t\tisServerDisabled(otherDefinition)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\tconst otherPrefix = resolveToolPrefix(otherDefinition, prefix);\n\t\t\t\t\t\t\tfor (const otherTool of otherEntry.tools ?? []) {\n\t\t\t\t\t\t\t\tif (!isUiToolVisibleToModel(otherTool.uiVisibility)) continue;\n\t\t\t\t\t\t\t\tfor (const candidate of getToolNameCandidates(\n\t\t\t\t\t\t\t\t\totherTool.name,\n\t\t\t\t\t\t\t\t\totherServerName,\n\t\t\t\t\t\t\t\t\totherPrefix,\n\t\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\tcandidates.add(candidate);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (otherDefinition.exposeResources !== false) {\n\t\t\t\t\t\t\t\tfor (const resource of otherEntry.resources ?? []) {\n\t\t\t\t\t\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\t\t\t\t\tfor (const candidate of getToolNameCandidates(baseName, otherServerName, otherPrefix, false))\n\t\t\t\t\t\t\t\t\t\tcandidates.add(candidate);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn createToolSelectorCandidateIndex(candidates);\n\t\t\t\t\t})()\n\t\t\t\t: undefined;\n\t\tconst toolCount = (entry?.tools ?? []).filter(\n\t\t\t(tool) =>\n\t\t\t\tisUiToolVisibleToModel(tool.uiVisibility) &&\n\t\t\t\tisToolAllowed(\n\t\t\t\t\ttool.name,\n\t\t\t\t\tserverName,\n\t\t\t\t\teffectivePrefix,\n\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\tselectorCandidateIndex,\n\t\t\t\t),\n\t\t).length;\n\t\tconst resourceCount =\n\t\t\tdefinition?.exposeResources !== false\n\t\t\t\t? (entry?.resources ?? []).filter((resource) => {\n\t\t\t\t\t\tconst baseName = `read_${resourceNameToToolName(resource.name)}`;\n\t\t\t\t\t\treturn isToolAllowed(\n\t\t\t\t\t\t\tbaseName,\n\t\t\t\t\t\t\tserverName,\n\t\t\t\t\t\t\teffectivePrefix,\n\t\t\t\t\t\t\tdefinition.includeTools,\n\t\t\t\t\t\t\tdefinition.excludeTools,\n\t\t\t\t\t\t\tselectorCandidateIndex,\n\t\t\t\t\t\t);\n\t\t\t\t\t}).length\n\t\t\t\t: 0;\n\t\tconst totalItems = toolCount + resourceCount;\n\t\tif (totalItems === 0) continue;\n\t\tconst directCount = directByServer.get(serverName) ?? 0;\n\t\tconst proxyCount = totalItems - directCount;\n\t\tif (proxyCount > 0) {\n\t\t\tserverSummaries.push(`${serverName} (${proxyCount} tools)`);\n\t\t}\n\t}\n\n\tif (serverSummaries.length > 0) {\n\t\tdesc += `\\nServers: ${serverSummaries.join(\", \")}\\n`;\n\t}\n\n\tconst disabledServers = Object.entries(config.mcpServers)\n\t\t.filter(([, definition]) => isServerDisabled(definition))\n\t\t.map(([serverName]) => serverName);\n\tif (disabledServers.length > 0) {\n\t\tdesc += `\\nDisabled servers (enable with /mcp enable <server> and /reload): ${disabledServers.join(\", \")}\\n`;\n\t}\n\n\tconst instructionSummaries: string[] = [];\n\tfor (const serverName of Object.keys(config.mcpServers)) {\n\t\tif (isServerDisabled(config.mcpServers[serverName])) continue;\n\t\tconst definition = config.mcpServers[serverName];\n\t\tconst entry = definition && cache?.servers?.[serverName];\n\t\tconst instructions =\n\t\t\tentry && definition && isServerCacheValid(entry, definition) ? entry.instructions : undefined;\n\t\tif (!instructions) continue;\n\t\tconst snippet = truncateAtWord(instructions.replace(/\\s+/g, \" \").trim(), INSTRUCTIONS_SNIPPET_LENGTH);\n\t\tinstructionSummaries.push(` ${serverName}: ${snippet}`);\n\t}\n\tif (instructionSummaries.length > 0) {\n\t\tdesc += `\\nServer instructions (truncated - full text via mcp({ instructions: \"name\" })):\\n${instructionSummaries.join(\"\\n\")}\\n`;\n\t}\n\n\tdesc += `\\nUsage:\\n`;\n\tdesc += ` mcp({ }) → Show server status\\n`;\n\tdesc += ` mcp({ server: \"name\" }) → List tools from server\\n`;\n\tdesc += ` mcp({ search: \"query\" }) → Search MCP tools by name/description\\n`;\n\tdesc += ` mcp({ describe: \"tool_name\" }) → Show tool details and parameters\\n`;\n\tdesc += ` mcp({ instructions: \"name\" }) → Show full server usage instructions\\n`;\n\tdesc += ` mcp({ connect: \"server-name\" }) → Connect to a server and refresh metadata\\n`;\n\tdesc += ` mcp({ tool: \"name\", args: { key: \"value\" } }) → Call a tool (object args; JSON string also accepted)\\n`;\n\tdesc += ` mcp({ action: \"ui-messages\" }) → Retrieve accumulated messages from completed UI sessions\\n`;\n\tdesc += ` mcp({ action: \"auth-start\", server: \"name\" }) → Start manual OAuth and get a browser URL\\n`;\n\tdesc += ` mcp({ action: \"auth-complete\", server: \"name\", args: { redirectUrl: \"...\" } }) → Complete manual OAuth\\n`;\n\tdesc += `\\nMode: action > tool (call) > connect > describe > instructions > search > server (list) > nothing (status)`;\n\n\treturn desc;\n}\n\ntype DirectToolExecute = (\n\ttoolCallId: string,\n\tparams: Record<string, unknown>,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined,\n\tctx: ExtensionContext,\n) => Promise<AgentToolResult<Record<string, unknown>>>;\n\nexport function createDirectToolExecutor(\n\tgetState: () => McpExtensionState | null,\n\tgetInitPromise: () => Promise<McpExtensionState> | null,\n\tspec: DirectToolSpec,\n): DirectToolExecute {\n\treturn async function execute(_toolCallId, params, signal) {\n\t\tthrowIfAborted(signal);\n\t\tlet state = getState();\n\t\tconst initPromise = getInitPromise();\n\n\t\tif (!state && initPromise) {\n\t\t\ttry {\n\t\t\t\tstate = await initPromise;\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `MCP initialization failed: ${message}` }],\n\t\t\t\t\tdetails: { error: \"init_failed\", message },\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (!state) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: \"MCP not initialized\" }],\n\t\t\t\tdetails: { error: \"not_initialized\" },\n\t\t\t};\n\t\t}\n\n\t\tconst definition = state.config.mcpServers[spec.serverName];\n\t\tif (isServerDisabled(definition)) {\n\t\t\tconst message = `MCP server \"${spec.serverName}\" is disabled. Run /mcp enable ${spec.serverName} and /reload to enable it.`;\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\tdetails: { error: \"server_disabled\", server: spec.serverName, message },\n\t\t\t};\n\t\t}\n\n\t\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\t\tthrowIfAborted(ownedSignal);\n\t\tlet connected = await lazyConnect(state, spec.serverName, ownedSignal);\n\t\tlet autoAuthAttempted = false;\n\n\t\tif (!connected && state.manager.getConnection(spec.serverName)?.status === \"needs-auth\") {\n\t\t\tautoAuthAttempted = true;\n\t\t\tconst autoAuth = await attemptDirectAutoAuth(state, spec.serverName, ownedSignal);\n\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: autoAuth.message }],\n\t\t\t\t\tdetails: { error: \"auth_required\", server: spec.serverName, message: autoAuth.message },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (autoAuth.status === \"success\") {\n\t\t\t\tawait state.manager.close(spec.serverName);\n\t\t\t\tclearFailure(state, spec.serverName);\n\t\t\t\tconnected = await lazyConnect(state, spec.serverName, ownedSignal);\n\t\t\t}\n\t\t}\n\n\t\tif (!connected) {\n\t\t\tconst authConnection = state.manager.getConnection(spec.serverName);\n\t\t\tif (authConnection?.status === \"needs-auth\") {\n\t\t\t\tconst message = getDirectAuthRequiredMessage(state, spec.serverName);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\tdetails: { error: \"auth_required\", server: spec.serverName, message, autoAuthAttempted },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst failedAgo = getFailureAgeSeconds(state, spec.serverName);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: `MCP server \"${spec.serverName}\" not available${failedAgo !== null ? ` (failed ${failedAgo}s ago)` : \"\"}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { error: \"server_unavailable\", server: spec.serverName },\n\t\t\t};\n\t\t}\n\n\t\tconst connection = state.manager.getConnection(spec.serverName);\n\t\tif (!connection || connection.status !== \"connected\") {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `MCP server \"${spec.serverName}\" not connected` }],\n\t\t\t\tdetails: { error: \"not_connected\", server: spec.serverName },\n\t\t\t};\n\t\t}\n\n\t\tconst normalizedParams = spec.resourceUri ? params : normalizeToolArguments(params);\n\t\tconst approval = await ensureToolCallApproved(\n\t\t\tstate,\n\t\t\tspec.serverName,\n\t\t\t{\n\t\t\t\tname: spec.prefixedName,\n\t\t\t\toriginalName: spec.originalName,\n\t\t\t\tdescription: spec.description,\n\t\t\t\t...(spec.inputSchema !== undefined ? { inputSchema: spec.inputSchema } : {}),\n\t\t\t\t...(spec.resourceUri !== undefined ? { resourceUri: spec.resourceUri } : {}),\n\t\t\t\t...(spec.uiResourceUri !== undefined ? { uiResourceUri: spec.uiResourceUri } : {}),\n\t\t\t\t...(spec.uiStreamMode !== undefined ? { uiStreamMode: spec.uiStreamMode } : {}),\n\t\t\t},\n\t\t\tnormalizedParams,\n\t\t\townedSignal,\n\t\t\tspec.resourceUri ? \"resource\" : \"direct\",\n\t\t);\n\t\tif (approval.ok === false) {\n\t\t\tconst denied = approval.reason === \"denied\";\n\t\t\tconst message = denied\n\t\t\t\t? `The user declined approval to run MCP tool \"${spec.originalName}\" on server \"${spec.serverName}\".`\n\t\t\t\t: `MCP tool \"${spec.originalName}\" on server \"${spec.serverName}\" is approval-gated and requires an interactive session.`;\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\tdetails: {\n\t\t\t\t\terror: denied ? \"approval_denied\" : \"approval_required\",\n\t\t\t\t\tserver: spec.serverName,\n\t\t\t\t\ttool: spec.originalName,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tlet uiSession: UiSessionRuntime | null = null;\n\t\tconst requestOptions =\n\t\t\tstate.manager.getRequestOptions?.(spec.serverName, ownedSignal) ??\n\t\t\t(ownedSignal ? { signal: ownedSignal } : undefined);\n\n\t\tconst outputGuardOptions = resolveMcpOutputGuardOptions(state.config.settings);\n\t\tconst recoverAuthConnection = async () => {\n\t\t\tconst current = state.manager.getConnection(spec.serverName);\n\t\t\tif (current?.status === \"connected\") return current;\n\n\t\t\tif (!autoAuthAttempted) {\n\t\t\t\tautoAuthAttempted = true;\n\t\t\t\tconst autoAuth = await attemptDirectAutoAuth(state, spec.serverName, ownedSignal);\n\t\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\t\tthrow new SessionRecoveryAuthRequiredError(spec.serverName, autoAuth.message);\n\t\t\t\t}\n\t\t\t\tif (autoAuth.status === \"success\") {\n\t\t\t\t\tconst afterAuth = state.manager.getConnection(spec.serverName);\n\t\t\t\t\tif (afterAuth?.status === \"connected\") return afterAuth;\n\t\t\t\t\tif (afterAuth?.status === \"needs-auth\") {\n\t\t\t\t\t\tawait state.manager.close(spec.serverName);\n\t\t\t\t\t}\n\t\t\t\t\tclearFailure(state, spec.serverName);\n\t\t\t\t\tconst reconnected = await lazyConnect(state, spec.serverName, ownedSignal);\n\t\t\t\t\treturn reconnected ? state.manager.getConnection(spec.serverName) : undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn state.manager.getConnection(spec.serverName);\n\t\t};\n\n\t\ttry {\n\t\t\tstate.manager.touch(spec.serverName);\n\t\t\tstate.manager.incrementInFlight(spec.serverName);\n\n\t\t\tif (spec.resourceUri) {\n\t\t\t\tconst result = await withSessionRecovery<ClientReadResourceResult>(\n\t\t\t\t\t{\n\t\t\t\t\t\tmanager: state.manager,\n\t\t\t\t\t\tconfig: state.config,\n\t\t\t\t\t\t...(ownedSignal ? { signal: ownedSignal } : {}),\n\t\t\t\t\t\tonNeedsAuth: recoverAuthConnection,\n\t\t\t\t\t},\n\t\t\t\t\tspec.serverName,\n\t\t\t\t\t(conn) => conn.client.readResource({ uri: spec.resourceUri! }, requestOptions),\n\t\t\t\t);\n\t\t\t\tconst content = transformMcpResourceContents(result.contents ?? [], state.owner?.signal);\n\t\t\t\tconst guarded = await guardMcpOutput(\n\t\t\t\t\tcontent.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty resource)\" }],\n\t\t\t\t\toutputGuardOptions,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: guarded.content,\n\t\t\t\t\tdetails: { server: spec.serverName, resourceUri: spec.resourceUri, ...guardedMcpDetails(guarded) },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst hasUi = !!spec.uiResourceUri;\n\t\t\tuiSession = hasUi\n\t\t\t\t? await maybeStartUiSession(state, {\n\t\t\t\t\t\tserverName: spec.serverName,\n\t\t\t\t\t\ttoolName: spec.originalName,\n\t\t\t\t\t\ttoolArgs: normalizedParams,\n\t\t\t\t\t\tuiResourceUri: spec.uiResourceUri!,\n\t\t\t\t\t\t...(spec.uiStreamMode !== undefined ? { streamMode: spec.uiStreamMode } : {}),\n\t\t\t\t\t\t...(signal ? { signal } : {}),\n\t\t\t\t\t\tonNeedsAuth: recoverAuthConnection,\n\t\t\t\t\t})\n\t\t\t\t: null;\n\n\t\t\tconst result = await withSessionRecovery<ClientCallToolResult>(\n\t\t\t\t{\n\t\t\t\t\tmanager: state.manager,\n\t\t\t\t\tconfig: state.config,\n\t\t\t\t\t...(ownedSignal ? { signal: ownedSignal } : {}),\n\t\t\t\t\tonNeedsAuth: recoverAuthConnection,\n\t\t\t\t},\n\t\t\t\tspec.serverName,\n\t\t\t\t(conn) =>\n\t\t\t\t\tabortable(\n\t\t\t\t\t\tconn.client.callTool(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tname: spec.originalName,\n\t\t\t\t\t\t\t\targuments: normalizedParams,\n\t\t\t\t\t\t\t\t_meta: uiSession?.requestMeta,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\trequestOptions,\n\t\t\t\t\t\t),\n\t\t\t\t\t\townedSignal,\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tuiSession?.sendToolResult(result as unknown as CallToolResult);\n\n\t\t\tif (result.isError) {\n\t\t\t\tconst mcpContent = (result.content ?? []) as McpContent[];\n\t\t\t\tconst content = transformMcpContent(mcpContent, state.owner?.signal);\n\t\t\t\tconst outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n\t\t\t\tconst schemaText = spec.inputSchema ? `\\n\\nExpected parameters:\\n${formatSchema(spec.inputSchema)}` : \"\";\n\t\t\t\tconst guarded = await guardMcpOutput(outputContent, {\n\t\t\t\t\t...outputGuardOptions,\n\t\t\t\t\tprefix: \"Error: \",\n\t\t\t\t\tsuffix: schemaText,\n\t\t\t\t\temptyTextFallback: \"Tool execution failed\",\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: guarded.content,\n\t\t\t\t\tdetails: { error: \"tool_error\", server: spec.serverName, ...guardedMcpDetails(guarded) },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst content = resolveMcpResultContent(result as Record<string, unknown>, state.owner?.signal);\n\t\t\tconst outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n\t\t\tif (hasUi) {\n\t\t\t\tconst uiSummary = summarizeUiSessionResult(uiSession);\n\t\t\t\tconst guarded = await guardMcpOutput(outputContent, {\n\t\t\t\t\t...outputGuardOptions,\n\t\t\t\t\tsuffix: `\\n\\n${uiSummary.message}`,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: guarded.content,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tserver: spec.serverName,\n\t\t\t\t\t\ttool: spec.originalName,\n\t\t\t\t\t\tuiOpen: uiSummary.uiOpen,\n\t\t\t\t\t\tuiViewer: uiSummary.uiViewer,\n\t\t\t\t\t\tuiUrl: uiSummary.uiUrl,\n\t\t\t\t\t\t...guardedMcpDetails(guarded),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions });\n\t\t\treturn {\n\t\t\t\tcontent: guarded.content,\n\t\t\t\tdetails: { server: spec.serverName, tool: spec.originalName, ...guardedMcpDetails(guarded) },\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (error instanceof SessionRecoveryAuthRequiredError) {\n\t\t\t\tconst message = error.authMessage ?? getDirectAuthRequiredMessage(state, spec.serverName);\n\t\t\t\tuiSession?.sendToolCancelled(message);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\tdetails: { error: \"auth_required\", server: spec.serverName, message, autoAuthAttempted },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (error instanceof UrlElicitationRequiredError) {\n\t\t\t\tconst action = await state.manager.handleUrlElicitationRequired(spec.serverName, error);\n\t\t\t\tconst message =\n\t\t\t\t\taction === \"accept\"\n\t\t\t\t\t\t? \"The original MCP tool did not run. Complete the opened browser interaction, then retry the tool.\"\n\t\t\t\t\t\t: `The URL interaction was ${action === \"decline\" ? \"declined\" : \"cancelled\"}.`;\n\t\t\t\tuiSession?.sendToolCancelled(message);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\tdetails: { error: \"url_elicitation_required\", server: spec.serverName, action },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tuiSession?.sendToolCancelled(message);\n\t\t\tconst schemaText = spec.inputSchema ? `\\n\\nExpected parameters:\\n${formatSchema(spec.inputSchema)}` : \"\";\n\t\t\tconst guarded = await guardMcpOutput([{ type: \"text\" as const, text: message }], {\n\t\t\t\t...outputGuardOptions,\n\t\t\t\tprefix: \"Failed to call tool: \",\n\t\t\t\tsuffix: schemaText,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: guarded.content,\n\t\t\t\tdetails: {\n\t\t\t\t\terror: isAbortError(error, ownedSignal) ? \"aborted\" : \"call_failed\",\n\t\t\t\t\tserver: spec.serverName,\n\t\t\t\t\t...guardedMcpDetails(guarded),\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tif (uiSession?.reused) {\n\t\t\t\tuiSession.close();\n\t\t\t}\n\t\t\tstate.manager.decrementInFlight(spec.serverName);\n\t\t\tstate.manager.touch(spec.serverName);\n\t\t}\n\t};\n}\n"]}
|