@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-tools.js","sourceRoot":"","sources":["../../../src/extensions/mcp/direct-tools.ts"],"names":[],"mappings":"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","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"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Client } from "@modelcontextprotocol/client";
|
|
2
|
+
import { type ElicitRequest, type ElicitRequestFormParams, type ElicitRequestURLParams, type ElicitResult } from "@modelcontextprotocol/client";
|
|
3
|
+
import type { ExtensionUIContext } from "../../core/extensions/types.ts";
|
|
4
|
+
export type ElicitationValue = string | number | boolean | string[] | undefined;
|
|
5
|
+
export type ElicitationUIContext = Pick<ExtensionUIContext, "select" | "input" | "notify">;
|
|
6
|
+
export interface ElicitationHandlerOptions {
|
|
7
|
+
serverName: string;
|
|
8
|
+
ui: ElicitationUIContext;
|
|
9
|
+
allowUrl: boolean;
|
|
10
|
+
onUrlAccepted?: (elicitationId: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export type ServerElicitationConfig = Omit<ElicitationHandlerOptions, "serverName" | "onUrlAccepted">;
|
|
13
|
+
export declare function registerElicitationHandler(client: Client, options: ElicitationHandlerOptions): void;
|
|
14
|
+
export declare function handleElicitationRequest(options: ElicitationHandlerOptions, request: ElicitRequest): Promise<ElicitResult>;
|
|
15
|
+
export declare function handleFormElicitation(options: ElicitationHandlerOptions, params: ElicitRequestFormParams): Promise<ElicitResult>;
|
|
16
|
+
export declare function coerceAndValidateFormValues(params: ElicitRequestFormParams, values: Record<string, ElicitationValue>): Record<string, string | number | boolean | string[]>;
|
|
17
|
+
export declare function handleUrlElicitation(options: ElicitationHandlerOptions, params: ElicitRequestURLParams): Promise<ElicitResult>;
|
|
18
|
+
//# sourceMappingURL=elicitation-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation-handler.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/elicitation-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EAGjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAIhF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;AAE3F,MAAM,WAAW,yBAAyB;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,oBAAoB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,yBAAyB,EAAE,YAAY,GAAG,eAAe,CAAC,CAAC;AAEtG,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAEnG;AAED,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,yBAAyB,EAClC,OAAO,EAAE,aAAa,GACpB,OAAO,CAAC,YAAY,CAAC,CAIvB;AAED,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,uBAAuB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAsCvB;AAkHD,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,uBAAuB,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAsEtD;AA2CD,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,sBAAsB,GAC5B,OAAO,CAAC,YAAY,CAAC,CA0CvB","sourcesContent":["import type { Client, JsonSchemaType } from \"@modelcontextprotocol/client\";\nimport {\n\ttype ElicitRequest,\n\ttype ElicitRequestFormParams,\n\ttype ElicitRequestURLParams,\n\ttype ElicitResult,\n\tProtocolError,\n\tProtocolErrorCode,\n} from \"@modelcontextprotocol/client\";\nimport { AjvJsonSchemaValidator } from \"@modelcontextprotocol/client/validators/ajv\";\nimport open from \"open\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\n\nexport type ElicitationValue = string | number | boolean | string[] | undefined;\ntype FormProperty = ElicitRequestFormParams[\"requestedSchema\"][\"properties\"][string];\ntype FieldCollectionResult = { status: \"cancelled\" } | { status: \"collected\"; value: ElicitationValue };\n\nexport type ElicitationUIContext = Pick<ExtensionUIContext, \"select\" | \"input\" | \"notify\">;\n\nexport interface ElicitationHandlerOptions {\n\tserverName: string;\n\tui: ElicitationUIContext;\n\tallowUrl: boolean;\n\tonUrlAccepted?: (elicitationId: string) => void;\n}\n\nexport type ServerElicitationConfig = Omit<ElicitationHandlerOptions, \"serverName\" | \"onUrlAccepted\">;\n\nexport function registerElicitationHandler(client: Client, options: ElicitationHandlerOptions): void {\n\tclient.setRequestHandler(\"elicitation/create\", (request) => handleElicitationRequest(options, request));\n}\n\nexport async function handleElicitationRequest(\n\toptions: ElicitationHandlerOptions,\n\trequest: ElicitRequest,\n): Promise<ElicitResult> {\n\treturn request.params.mode === \"url\"\n\t\t? handleUrlElicitation(options, request.params)\n\t\t: handleFormElicitation(options, request.params);\n}\n\nexport async function handleFormElicitation(\n\toptions: ElicitationHandlerOptions,\n\tparams: ElicitRequestFormParams,\n): Promise<ElicitResult> {\n\tconst properties = Object.entries(params.requestedSchema.properties);\n\tconst decision = await options.ui.select(`MCP Input Request\\nServer: ${options.serverName}\\n\\n${params.message}`, [\n\t\t\"Continue\",\n\t\t\"Decline\",\n\t]);\n\tif (decision === undefined) return { action: \"cancel\" };\n\tif (decision === \"Decline\") return { action: \"decline\" };\n\tif (properties.length === 0) return { action: \"accept\", content: {} };\n\n\tconst values: Record<string, ElicitationValue> = {};\n\tfor (const [name, schema] of properties) {\n\t\tconst value = await collectValidField(options.ui, params, name, schema);\n\t\tif (value.status === \"cancelled\") return { action: \"cancel\" };\n\t\tvalues[name] = value.value;\n\t}\n\n\twhile (true) {\n\t\tconst content = coerceAndValidateFormValues(params, values);\n\t\tconst action = await options.ui.select(formatReview(options.serverName, properties, content), [\n\t\t\t\"Submit\",\n\t\t\t\"Edit\",\n\t\t\t\"Decline\",\n\t\t]);\n\t\tif (action === undefined) return { action: \"cancel\" };\n\t\tif (action === \"Decline\") return { action: \"decline\" };\n\t\tif (action === \"Submit\") return { action: \"accept\", content };\n\n\t\tconst labels = properties.map(([name, schema]) => `${schema.title ?? humanizeName(name)} (${name})`);\n\t\tconst selected = await options.ui.select(\"Choose a field to edit\", labels);\n\t\tif (selected === undefined) return { action: \"cancel\" };\n\t\tconst property = properties[labels.indexOf(selected)];\n\t\tif (!property) continue;\n\t\tconst [name, schema] = property;\n\t\tconst value = await collectValidField(options.ui, params, name, schema, values[name]);\n\t\tif (value.status === \"cancelled\") return { action: \"cancel\" };\n\t\tvalues[name] = value.value;\n\t}\n}\n\nasync function collectValidField(\n\tui: ElicitationUIContext,\n\tparams: ElicitRequestFormParams,\n\tname: string,\n\tschema: FormProperty,\n\tcurrent?: ElicitationValue,\n): Promise<FieldCollectionResult> {\n\tconst required = params.requestedSchema.required?.includes(name) === true;\n\twhile (true) {\n\t\tconst result = await collectField(ui, params, name, schema, current);\n\t\tif (result.status === \"cancelled\") return result;\n\t\ttry {\n\t\t\tcoerceAndValidateFormValues(\n\t\t\t\t{\n\t\t\t\t\t...params,\n\t\t\t\t\trequestedSchema: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: { [name]: schema },\n\t\t\t\t\t\t...(required ? { required: [name] } : {}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ [name]: result.value },\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\tcurrent = result.value;\n\t\t}\n\t}\n}\n\nasync function collectField(\n\tui: ElicitationUIContext,\n\tparams: ElicitRequestFormParams,\n\tname: string,\n\tschema: FormProperty,\n\tcurrent?: ElicitationValue,\n): Promise<FieldCollectionResult> {\n\tconst required = params.requestedSchema.required?.includes(name) === true;\n\tconst title = [schema.title ?? humanizeName(name), required ? \"(required)\" : \"\", schema.description]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\tif (schema.type === \"string\" && (\"enum\" in schema || \"oneOf\" in schema)) {\n\t\tconst choices =\n\t\t\t\"oneOf\" in schema\n\t\t\t\t? schema.oneOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))\n\t\t\t\t: schema.enum.map((value, index) => ({\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tdisplay: formatChoice(value, \"enumNames\" in schema ? schema.enumNames?.[index] : undefined),\n\t\t\t\t\t}));\n\t\tconst displays = uniqueLabels(choices.map((choice) => choice.display));\n\t\tconst actions = [...displays];\n\t\tconst useDefault = schema.default === undefined ? undefined : uniqueAction(\"Use default\", actions);\n\t\tif (useDefault) actions.push(useDefault);\n\t\tconst omit = required ? undefined : uniqueAction(\"Omit\", actions);\n\t\tif (omit) actions.push(omit);\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === useDefault) return { status: \"collected\", value: schema.default };\n\t\tif (action === omit) return { status: \"collected\", value: undefined };\n\t\treturn { status: \"collected\", value: choices[displays.indexOf(action)]?.value };\n\t}\n\n\tif (schema.type === \"boolean\") {\n\t\tconst actions = [\"Yes\", \"No\"];\n\t\tif (schema.default !== undefined) actions.push(\"Use default\");\n\t\tif (!required) actions.push(\"Omit\");\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\t\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\t\treturn { status: \"collected\", value: action === \"Yes\" };\n\t}\n\n\tif (schema.type === \"array\") {\n\t\tconst actions = [\"Choose values\"];\n\t\tif (schema.default !== undefined) actions.push(\"Use default\");\n\t\tif (!required) actions.push(\"Omit\");\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\t\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\n\t\tconst choices = extractMultiSelectOptions(schema);\n\t\tconst selected = new Set(Array.isArray(current) ? current : []);\n\t\twhile (true) {\n\t\t\tconst displays = uniqueLabels(\n\t\t\t\tchoices.map((choice) => (selected.has(choice.value) ? `✓ ${choice.display}` : choice.display)),\n\t\t\t);\n\t\t\tconst done = uniqueAction(\"Done\", displays);\n\t\t\tconst picked = await ui.select(title, [...displays, done]);\n\t\t\tif (picked === undefined) return { status: \"cancelled\" };\n\t\t\tif (picked === done) return { status: \"collected\", value: [...selected] };\n\t\t\tconst choice = choices[displays.indexOf(picked)];\n\t\t\tif (!choice) continue;\n\t\t\tif (selected.has(choice.value)) selected.delete(choice.value);\n\t\t\telse selected.add(choice.value);\n\t\t}\n\t}\n\n\tconst actions = [\"Enter value\"];\n\tif (schema.default !== undefined) actions.push(\"Use default\");\n\tif (!required) actions.push(\"Omit\");\n\tconst action = await ui.select(title, actions);\n\tif (action === undefined) return { status: \"cancelled\" };\n\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\tconst entered = await ui.input(title, current === undefined ? undefined : String(current));\n\treturn entered === undefined ? { status: \"cancelled\" } : { status: \"collected\", value: entered };\n}\n\nexport function coerceAndValidateFormValues(\n\tparams: ElicitRequestFormParams,\n\tvalues: Record<string, ElicitationValue>,\n): Record<string, string | number | boolean | string[]> {\n\tconst output: Record<string, string | number | boolean | string[]> = {};\n\tconst required = new Set(params.requestedSchema.required ?? []);\n\tfor (const [name, schema] of Object.entries(params.requestedSchema.properties)) {\n\t\tconst value = values[name];\n\t\tif (value === undefined) {\n\t\t\tif (required.has(name)) throw new Error(`Missing required elicitation field: ${name}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"string\") {\n\t\t\tconst stringValue = String(value);\n\t\t\tconst limits = schema as typeof schema & { minLength?: number; maxLength?: number };\n\t\t\tif (limits.minLength !== undefined && stringValue.length < limits.minLength) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is shorter than minimum length ${limits.minLength}`);\n\t\t\t}\n\t\t\tif (limits.maxLength !== undefined && stringValue.length > limits.maxLength) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is longer than maximum length ${limits.maxLength}`);\n\t\t\t}\n\t\t\tif (\"enum\" in schema && !schema.enum.includes(stringValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is not an allowed value`);\n\t\t\t}\n\t\t\tif (\"oneOf\" in schema && !schema.oneOf.some((option) => option.const === stringValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is not an allowed value`);\n\t\t\t}\n\t\t\toutput[name] = stringValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"number\" || schema.type === \"integer\") {\n\t\t\tif (typeof value === \"string\" && value.trim() === \"\") {\n\t\t\t\tthrow new Error(`Elicitation field ${name} must be a number`);\n\t\t\t}\n\t\t\tconst numberValue = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (!Number.isFinite(numberValue)) throw new Error(`Elicitation field ${name} must be a number`);\n\t\t\tif (schema.type === \"integer\" && !Number.isInteger(numberValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} must be an integer`);\n\t\t\t}\n\t\t\tif (schema.minimum !== undefined && numberValue < schema.minimum) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is below minimum ${schema.minimum}`);\n\t\t\t}\n\t\t\tif (schema.maximum !== undefined && numberValue > schema.maximum) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is above maximum ${schema.maximum}`);\n\t\t\t}\n\t\t\toutput[name] = numberValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"boolean\") {\n\t\t\toutput[name] = typeof value === \"boolean\" ? value : value === \"true\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"array\") {\n\t\t\tif (!Array.isArray(value)) throw new Error(`Elicitation field ${name} must be a list`);\n\t\t\tconst allowed = new Set(extractMultiSelectOptions(schema).map((option) => option.value));\n\t\t\tconst arrayValue = value.map(String);\n\t\t\tif (schema.minItems !== undefined && arrayValue.length < schema.minItems) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} has fewer than ${schema.minItems} selections`);\n\t\t\t}\n\t\t\tif (schema.maxItems !== undefined && arrayValue.length > schema.maxItems) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} has more than ${schema.maxItems} selections`);\n\t\t\t}\n\t\t\tif (arrayValue.some((item) => !allowed.has(item))) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} contains an invalid selection`);\n\t\t\t}\n\t\t\toutput[name] = arrayValue;\n\t\t}\n\t}\n\tconst validation = new AjvJsonSchemaValidator().getValidator(params.requestedSchema as JsonSchemaType)(output);\n\tif (!validation.valid) {\n\t\tthrow new Error(`Invalid elicitation response: ${validation.errorMessage}`);\n\t}\n\treturn output;\n}\n\nfunction formatChoice(value: string, title?: string): string {\n\treturn title && title !== value ? `${title} (${value})` : value;\n}\n\nfunction uniqueLabels(labels: string[]): string[] {\n\tconst used = new Set<string>();\n\treturn labels.map((label) => {\n\t\tlet unique = label;\n\t\twhile (used.has(unique)) unique += \"…\";\n\t\tused.add(unique);\n\t\treturn unique;\n\t});\n}\n\nfunction uniqueAction(label: string, choices: string[]): string {\n\tlet unique = label;\n\twhile (choices.includes(unique)) unique += \"…\";\n\treturn unique;\n}\n\nfunction extractMultiSelectOptions(\n\tschema: Extract<FormProperty, { type: \"array\" }>,\n): Array<{ value: string; display: string }> {\n\tconst items = schema.items as { enum?: string[]; anyOf?: Array<{ const: string; title: string }> };\n\treturn items.anyOf\n\t\t? items.anyOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))\n\t\t: (items.enum ?? []).map((value) => ({ value, display: value }));\n}\n\nfunction formatReview(\n\tserverName: string,\n\tproperties: Array<[string, FormProperty]>,\n\tcontent: Record<string, string | number | boolean | string[]>,\n): string {\n\tconst rows = properties.map(\n\t\t([name, schema]) =>\n\t\t\t`${schema.title ?? humanizeName(name)}: ${content[name] === undefined ? \"(omitted)\" : String(content[name])}`,\n\t);\n\treturn [`Review input for ${serverName}`, \"\", ...rows].join(\"\\n\");\n}\n\nexport async function handleUrlElicitation(\n\toptions: ElicitationHandlerOptions,\n\tparams: ElicitRequestURLParams,\n): Promise<ElicitResult> {\n\tif (!options.allowUrl) throw new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation is not supported\");\n\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(params.url);\n\t} catch {\n\t\tthrow new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation supplied an invalid URL\");\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation only supports HTTP and HTTPS URLs\");\n\t}\n\n\tconst decision = await options.ui.select(\n\t\t[\n\t\t\t\"MCP Browser Request\",\n\t\t\t`Server: ${options.serverName}`,\n\t\t\t\"\",\n\t\t\tparams.message,\n\t\t\t\"\",\n\t\t\t`Host: ${parsed.host}`,\n\t\t\t`Full URL: ${params.url}`,\n\t\t\t\"\",\n\t\t\t\"Open this URL in your browser?\",\n\t\t].join(\"\\n\"),\n\t\t[\"Open\", \"Decline\"],\n\t);\n\tif (decision === undefined) return { action: \"cancel\" };\n\tif (decision === \"Decline\") return { action: \"decline\" };\n\n\ttry {\n\t\tawait open(params.url);\n\t} catch (error) {\n\t\toptions.ui.notify(\n\t\t\t`Could not open MCP elicitation URL: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { action: \"cancel\" };\n\t}\n\toptions.onUrlAccepted?.(params.elicitationId);\n\toptions.ui.notify(\"Opened browser for MCP elicitation.\", \"info\");\n\treturn { action: \"accept\" };\n}\n\nfunction humanizeName(name: string): string {\n\treturn name\n\t\t.replace(/[_-]+/g, \" \")\n\t\t.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/^./, (char) => char.toUpperCase());\n}\n"]}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { ProtocolError, ProtocolErrorCode, } from "@modelcontextprotocol/client";
|
|
2
|
+
import { AjvJsonSchemaValidator } from "@modelcontextprotocol/client/validators/ajv";
|
|
3
|
+
import open from "open";
|
|
4
|
+
export function registerElicitationHandler(client, options) {
|
|
5
|
+
client.setRequestHandler("elicitation/create", (request) => handleElicitationRequest(options, request));
|
|
6
|
+
}
|
|
7
|
+
export async function handleElicitationRequest(options, request) {
|
|
8
|
+
return request.params.mode === "url"
|
|
9
|
+
? handleUrlElicitation(options, request.params)
|
|
10
|
+
: handleFormElicitation(options, request.params);
|
|
11
|
+
}
|
|
12
|
+
export async function handleFormElicitation(options, params) {
|
|
13
|
+
const properties = Object.entries(params.requestedSchema.properties);
|
|
14
|
+
const decision = await options.ui.select(`MCP Input Request\nServer: ${options.serverName}\n\n${params.message}`, [
|
|
15
|
+
"Continue",
|
|
16
|
+
"Decline",
|
|
17
|
+
]);
|
|
18
|
+
if (decision === undefined)
|
|
19
|
+
return { action: "cancel" };
|
|
20
|
+
if (decision === "Decline")
|
|
21
|
+
return { action: "decline" };
|
|
22
|
+
if (properties.length === 0)
|
|
23
|
+
return { action: "accept", content: {} };
|
|
24
|
+
const values = {};
|
|
25
|
+
for (const [name, schema] of properties) {
|
|
26
|
+
const value = await collectValidField(options.ui, params, name, schema);
|
|
27
|
+
if (value.status === "cancelled")
|
|
28
|
+
return { action: "cancel" };
|
|
29
|
+
values[name] = value.value;
|
|
30
|
+
}
|
|
31
|
+
while (true) {
|
|
32
|
+
const content = coerceAndValidateFormValues(params, values);
|
|
33
|
+
const action = await options.ui.select(formatReview(options.serverName, properties, content), [
|
|
34
|
+
"Submit",
|
|
35
|
+
"Edit",
|
|
36
|
+
"Decline",
|
|
37
|
+
]);
|
|
38
|
+
if (action === undefined)
|
|
39
|
+
return { action: "cancel" };
|
|
40
|
+
if (action === "Decline")
|
|
41
|
+
return { action: "decline" };
|
|
42
|
+
if (action === "Submit")
|
|
43
|
+
return { action: "accept", content };
|
|
44
|
+
const labels = properties.map(([name, schema]) => `${schema.title ?? humanizeName(name)} (${name})`);
|
|
45
|
+
const selected = await options.ui.select("Choose a field to edit", labels);
|
|
46
|
+
if (selected === undefined)
|
|
47
|
+
return { action: "cancel" };
|
|
48
|
+
const property = properties[labels.indexOf(selected)];
|
|
49
|
+
if (!property)
|
|
50
|
+
continue;
|
|
51
|
+
const [name, schema] = property;
|
|
52
|
+
const value = await collectValidField(options.ui, params, name, schema, values[name]);
|
|
53
|
+
if (value.status === "cancelled")
|
|
54
|
+
return { action: "cancel" };
|
|
55
|
+
values[name] = value.value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function collectValidField(ui, params, name, schema, current) {
|
|
59
|
+
const required = params.requestedSchema.required?.includes(name) === true;
|
|
60
|
+
while (true) {
|
|
61
|
+
const result = await collectField(ui, params, name, schema, current);
|
|
62
|
+
if (result.status === "cancelled")
|
|
63
|
+
return result;
|
|
64
|
+
try {
|
|
65
|
+
coerceAndValidateFormValues({
|
|
66
|
+
...params,
|
|
67
|
+
requestedSchema: {
|
|
68
|
+
type: "object",
|
|
69
|
+
properties: { [name]: schema },
|
|
70
|
+
...(required ? { required: [name] } : {}),
|
|
71
|
+
},
|
|
72
|
+
}, { [name]: result.value });
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
ui.notify(error instanceof Error ? error.message : String(error), "error");
|
|
77
|
+
current = result.value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function collectField(ui, params, name, schema, current) {
|
|
82
|
+
const required = params.requestedSchema.required?.includes(name) === true;
|
|
83
|
+
const title = [schema.title ?? humanizeName(name), required ? "(required)" : "", schema.description]
|
|
84
|
+
.filter(Boolean)
|
|
85
|
+
.join(" ");
|
|
86
|
+
if (schema.type === "string" && ("enum" in schema || "oneOf" in schema)) {
|
|
87
|
+
const choices = "oneOf" in schema
|
|
88
|
+
? schema.oneOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))
|
|
89
|
+
: schema.enum.map((value, index) => ({
|
|
90
|
+
value,
|
|
91
|
+
display: formatChoice(value, "enumNames" in schema ? schema.enumNames?.[index] : undefined),
|
|
92
|
+
}));
|
|
93
|
+
const displays = uniqueLabels(choices.map((choice) => choice.display));
|
|
94
|
+
const actions = [...displays];
|
|
95
|
+
const useDefault = schema.default === undefined ? undefined : uniqueAction("Use default", actions);
|
|
96
|
+
if (useDefault)
|
|
97
|
+
actions.push(useDefault);
|
|
98
|
+
const omit = required ? undefined : uniqueAction("Omit", actions);
|
|
99
|
+
if (omit)
|
|
100
|
+
actions.push(omit);
|
|
101
|
+
const action = await ui.select(title, actions);
|
|
102
|
+
if (action === undefined)
|
|
103
|
+
return { status: "cancelled" };
|
|
104
|
+
if (action === useDefault)
|
|
105
|
+
return { status: "collected", value: schema.default };
|
|
106
|
+
if (action === omit)
|
|
107
|
+
return { status: "collected", value: undefined };
|
|
108
|
+
return { status: "collected", value: choices[displays.indexOf(action)]?.value };
|
|
109
|
+
}
|
|
110
|
+
if (schema.type === "boolean") {
|
|
111
|
+
const actions = ["Yes", "No"];
|
|
112
|
+
if (schema.default !== undefined)
|
|
113
|
+
actions.push("Use default");
|
|
114
|
+
if (!required)
|
|
115
|
+
actions.push("Omit");
|
|
116
|
+
const action = await ui.select(title, actions);
|
|
117
|
+
if (action === undefined)
|
|
118
|
+
return { status: "cancelled" };
|
|
119
|
+
if (action === "Use default")
|
|
120
|
+
return { status: "collected", value: schema.default };
|
|
121
|
+
if (action === "Omit")
|
|
122
|
+
return { status: "collected", value: undefined };
|
|
123
|
+
return { status: "collected", value: action === "Yes" };
|
|
124
|
+
}
|
|
125
|
+
if (schema.type === "array") {
|
|
126
|
+
const actions = ["Choose values"];
|
|
127
|
+
if (schema.default !== undefined)
|
|
128
|
+
actions.push("Use default");
|
|
129
|
+
if (!required)
|
|
130
|
+
actions.push("Omit");
|
|
131
|
+
const action = await ui.select(title, actions);
|
|
132
|
+
if (action === undefined)
|
|
133
|
+
return { status: "cancelled" };
|
|
134
|
+
if (action === "Use default")
|
|
135
|
+
return { status: "collected", value: schema.default };
|
|
136
|
+
if (action === "Omit")
|
|
137
|
+
return { status: "collected", value: undefined };
|
|
138
|
+
const choices = extractMultiSelectOptions(schema);
|
|
139
|
+
const selected = new Set(Array.isArray(current) ? current : []);
|
|
140
|
+
while (true) {
|
|
141
|
+
const displays = uniqueLabels(choices.map((choice) => (selected.has(choice.value) ? `✓ ${choice.display}` : choice.display)));
|
|
142
|
+
const done = uniqueAction("Done", displays);
|
|
143
|
+
const picked = await ui.select(title, [...displays, done]);
|
|
144
|
+
if (picked === undefined)
|
|
145
|
+
return { status: "cancelled" };
|
|
146
|
+
if (picked === done)
|
|
147
|
+
return { status: "collected", value: [...selected] };
|
|
148
|
+
const choice = choices[displays.indexOf(picked)];
|
|
149
|
+
if (!choice)
|
|
150
|
+
continue;
|
|
151
|
+
if (selected.has(choice.value))
|
|
152
|
+
selected.delete(choice.value);
|
|
153
|
+
else
|
|
154
|
+
selected.add(choice.value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const actions = ["Enter value"];
|
|
158
|
+
if (schema.default !== undefined)
|
|
159
|
+
actions.push("Use default");
|
|
160
|
+
if (!required)
|
|
161
|
+
actions.push("Omit");
|
|
162
|
+
const action = await ui.select(title, actions);
|
|
163
|
+
if (action === undefined)
|
|
164
|
+
return { status: "cancelled" };
|
|
165
|
+
if (action === "Use default")
|
|
166
|
+
return { status: "collected", value: schema.default };
|
|
167
|
+
if (action === "Omit")
|
|
168
|
+
return { status: "collected", value: undefined };
|
|
169
|
+
const entered = await ui.input(title, current === undefined ? undefined : String(current));
|
|
170
|
+
return entered === undefined ? { status: "cancelled" } : { status: "collected", value: entered };
|
|
171
|
+
}
|
|
172
|
+
export function coerceAndValidateFormValues(params, values) {
|
|
173
|
+
const output = {};
|
|
174
|
+
const required = new Set(params.requestedSchema.required ?? []);
|
|
175
|
+
for (const [name, schema] of Object.entries(params.requestedSchema.properties)) {
|
|
176
|
+
const value = values[name];
|
|
177
|
+
if (value === undefined) {
|
|
178
|
+
if (required.has(name))
|
|
179
|
+
throw new Error(`Missing required elicitation field: ${name}`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (schema.type === "string") {
|
|
183
|
+
const stringValue = String(value);
|
|
184
|
+
const limits = schema;
|
|
185
|
+
if (limits.minLength !== undefined && stringValue.length < limits.minLength) {
|
|
186
|
+
throw new Error(`Elicitation field ${name} is shorter than minimum length ${limits.minLength}`);
|
|
187
|
+
}
|
|
188
|
+
if (limits.maxLength !== undefined && stringValue.length > limits.maxLength) {
|
|
189
|
+
throw new Error(`Elicitation field ${name} is longer than maximum length ${limits.maxLength}`);
|
|
190
|
+
}
|
|
191
|
+
if ("enum" in schema && !schema.enum.includes(stringValue)) {
|
|
192
|
+
throw new Error(`Elicitation field ${name} is not an allowed value`);
|
|
193
|
+
}
|
|
194
|
+
if ("oneOf" in schema && !schema.oneOf.some((option) => option.const === stringValue)) {
|
|
195
|
+
throw new Error(`Elicitation field ${name} is not an allowed value`);
|
|
196
|
+
}
|
|
197
|
+
output[name] = stringValue;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (schema.type === "number" || schema.type === "integer") {
|
|
201
|
+
if (typeof value === "string" && value.trim() === "") {
|
|
202
|
+
throw new Error(`Elicitation field ${name} must be a number`);
|
|
203
|
+
}
|
|
204
|
+
const numberValue = typeof value === "number" ? value : Number(value);
|
|
205
|
+
if (!Number.isFinite(numberValue))
|
|
206
|
+
throw new Error(`Elicitation field ${name} must be a number`);
|
|
207
|
+
if (schema.type === "integer" && !Number.isInteger(numberValue)) {
|
|
208
|
+
throw new Error(`Elicitation field ${name} must be an integer`);
|
|
209
|
+
}
|
|
210
|
+
if (schema.minimum !== undefined && numberValue < schema.minimum) {
|
|
211
|
+
throw new Error(`Elicitation field ${name} is below minimum ${schema.minimum}`);
|
|
212
|
+
}
|
|
213
|
+
if (schema.maximum !== undefined && numberValue > schema.maximum) {
|
|
214
|
+
throw new Error(`Elicitation field ${name} is above maximum ${schema.maximum}`);
|
|
215
|
+
}
|
|
216
|
+
output[name] = numberValue;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (schema.type === "boolean") {
|
|
220
|
+
output[name] = typeof value === "boolean" ? value : value === "true";
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
if (schema.type === "array") {
|
|
224
|
+
if (!Array.isArray(value))
|
|
225
|
+
throw new Error(`Elicitation field ${name} must be a list`);
|
|
226
|
+
const allowed = new Set(extractMultiSelectOptions(schema).map((option) => option.value));
|
|
227
|
+
const arrayValue = value.map(String);
|
|
228
|
+
if (schema.minItems !== undefined && arrayValue.length < schema.minItems) {
|
|
229
|
+
throw new Error(`Elicitation field ${name} has fewer than ${schema.minItems} selections`);
|
|
230
|
+
}
|
|
231
|
+
if (schema.maxItems !== undefined && arrayValue.length > schema.maxItems) {
|
|
232
|
+
throw new Error(`Elicitation field ${name} has more than ${schema.maxItems} selections`);
|
|
233
|
+
}
|
|
234
|
+
if (arrayValue.some((item) => !allowed.has(item))) {
|
|
235
|
+
throw new Error(`Elicitation field ${name} contains an invalid selection`);
|
|
236
|
+
}
|
|
237
|
+
output[name] = arrayValue;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const validation = new AjvJsonSchemaValidator().getValidator(params.requestedSchema)(output);
|
|
241
|
+
if (!validation.valid) {
|
|
242
|
+
throw new Error(`Invalid elicitation response: ${validation.errorMessage}`);
|
|
243
|
+
}
|
|
244
|
+
return output;
|
|
245
|
+
}
|
|
246
|
+
function formatChoice(value, title) {
|
|
247
|
+
return title && title !== value ? `${title} (${value})` : value;
|
|
248
|
+
}
|
|
249
|
+
function uniqueLabels(labels) {
|
|
250
|
+
const used = new Set();
|
|
251
|
+
return labels.map((label) => {
|
|
252
|
+
let unique = label;
|
|
253
|
+
while (used.has(unique))
|
|
254
|
+
unique += "…";
|
|
255
|
+
used.add(unique);
|
|
256
|
+
return unique;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function uniqueAction(label, choices) {
|
|
260
|
+
let unique = label;
|
|
261
|
+
while (choices.includes(unique))
|
|
262
|
+
unique += "…";
|
|
263
|
+
return unique;
|
|
264
|
+
}
|
|
265
|
+
function extractMultiSelectOptions(schema) {
|
|
266
|
+
const items = schema.items;
|
|
267
|
+
return items.anyOf
|
|
268
|
+
? items.anyOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))
|
|
269
|
+
: (items.enum ?? []).map((value) => ({ value, display: value }));
|
|
270
|
+
}
|
|
271
|
+
function formatReview(serverName, properties, content) {
|
|
272
|
+
const rows = properties.map(([name, schema]) => `${schema.title ?? humanizeName(name)}: ${content[name] === undefined ? "(omitted)" : String(content[name])}`);
|
|
273
|
+
return [`Review input for ${serverName}`, "", ...rows].join("\n");
|
|
274
|
+
}
|
|
275
|
+
export async function handleUrlElicitation(options, params) {
|
|
276
|
+
if (!options.allowUrl)
|
|
277
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidParams, "URL elicitation is not supported");
|
|
278
|
+
let parsed;
|
|
279
|
+
try {
|
|
280
|
+
parsed = new URL(params.url);
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidParams, "URL elicitation supplied an invalid URL");
|
|
284
|
+
}
|
|
285
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
286
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidParams, "URL elicitation only supports HTTP and HTTPS URLs");
|
|
287
|
+
}
|
|
288
|
+
const decision = await options.ui.select([
|
|
289
|
+
"MCP Browser Request",
|
|
290
|
+
`Server: ${options.serverName}`,
|
|
291
|
+
"",
|
|
292
|
+
params.message,
|
|
293
|
+
"",
|
|
294
|
+
`Host: ${parsed.host}`,
|
|
295
|
+
`Full URL: ${params.url}`,
|
|
296
|
+
"",
|
|
297
|
+
"Open this URL in your browser?",
|
|
298
|
+
].join("\n"), ["Open", "Decline"]);
|
|
299
|
+
if (decision === undefined)
|
|
300
|
+
return { action: "cancel" };
|
|
301
|
+
if (decision === "Decline")
|
|
302
|
+
return { action: "decline" };
|
|
303
|
+
try {
|
|
304
|
+
await open(params.url);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
options.ui.notify(`Could not open MCP elicitation URL: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
308
|
+
return { action: "cancel" };
|
|
309
|
+
}
|
|
310
|
+
options.onUrlAccepted?.(params.elicitationId);
|
|
311
|
+
options.ui.notify("Opened browser for MCP elicitation.", "info");
|
|
312
|
+
return { action: "accept" };
|
|
313
|
+
}
|
|
314
|
+
function humanizeName(name) {
|
|
315
|
+
return name
|
|
316
|
+
.replace(/[_-]+/g, " ")
|
|
317
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
318
|
+
.replace(/^./, (char) => char.toUpperCase());
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=elicitation-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation-handler.js","sourceRoot":"","sources":["../../../src/extensions/mcp/elicitation-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Client, JsonSchemaType } from \"@modelcontextprotocol/client\";\nimport {\n\ttype ElicitRequest,\n\ttype ElicitRequestFormParams,\n\ttype ElicitRequestURLParams,\n\ttype ElicitResult,\n\tProtocolError,\n\tProtocolErrorCode,\n} from \"@modelcontextprotocol/client\";\nimport { AjvJsonSchemaValidator } from \"@modelcontextprotocol/client/validators/ajv\";\nimport open from \"open\";\nimport type { ExtensionUIContext } from \"../../core/extensions/types.ts\";\n\nexport type ElicitationValue = string | number | boolean | string[] | undefined;\ntype FormProperty = ElicitRequestFormParams[\"requestedSchema\"][\"properties\"][string];\ntype FieldCollectionResult = { status: \"cancelled\" } | { status: \"collected\"; value: ElicitationValue };\n\nexport type ElicitationUIContext = Pick<ExtensionUIContext, \"select\" | \"input\" | \"notify\">;\n\nexport interface ElicitationHandlerOptions {\n\tserverName: string;\n\tui: ElicitationUIContext;\n\tallowUrl: boolean;\n\tonUrlAccepted?: (elicitationId: string) => void;\n}\n\nexport type ServerElicitationConfig = Omit<ElicitationHandlerOptions, \"serverName\" | \"onUrlAccepted\">;\n\nexport function registerElicitationHandler(client: Client, options: ElicitationHandlerOptions): void {\n\tclient.setRequestHandler(\"elicitation/create\", (request) => handleElicitationRequest(options, request));\n}\n\nexport async function handleElicitationRequest(\n\toptions: ElicitationHandlerOptions,\n\trequest: ElicitRequest,\n): Promise<ElicitResult> {\n\treturn request.params.mode === \"url\"\n\t\t? handleUrlElicitation(options, request.params)\n\t\t: handleFormElicitation(options, request.params);\n}\n\nexport async function handleFormElicitation(\n\toptions: ElicitationHandlerOptions,\n\tparams: ElicitRequestFormParams,\n): Promise<ElicitResult> {\n\tconst properties = Object.entries(params.requestedSchema.properties);\n\tconst decision = await options.ui.select(`MCP Input Request\\nServer: ${options.serverName}\\n\\n${params.message}`, [\n\t\t\"Continue\",\n\t\t\"Decline\",\n\t]);\n\tif (decision === undefined) return { action: \"cancel\" };\n\tif (decision === \"Decline\") return { action: \"decline\" };\n\tif (properties.length === 0) return { action: \"accept\", content: {} };\n\n\tconst values: Record<string, ElicitationValue> = {};\n\tfor (const [name, schema] of properties) {\n\t\tconst value = await collectValidField(options.ui, params, name, schema);\n\t\tif (value.status === \"cancelled\") return { action: \"cancel\" };\n\t\tvalues[name] = value.value;\n\t}\n\n\twhile (true) {\n\t\tconst content = coerceAndValidateFormValues(params, values);\n\t\tconst action = await options.ui.select(formatReview(options.serverName, properties, content), [\n\t\t\t\"Submit\",\n\t\t\t\"Edit\",\n\t\t\t\"Decline\",\n\t\t]);\n\t\tif (action === undefined) return { action: \"cancel\" };\n\t\tif (action === \"Decline\") return { action: \"decline\" };\n\t\tif (action === \"Submit\") return { action: \"accept\", content };\n\n\t\tconst labels = properties.map(([name, schema]) => `${schema.title ?? humanizeName(name)} (${name})`);\n\t\tconst selected = await options.ui.select(\"Choose a field to edit\", labels);\n\t\tif (selected === undefined) return { action: \"cancel\" };\n\t\tconst property = properties[labels.indexOf(selected)];\n\t\tif (!property) continue;\n\t\tconst [name, schema] = property;\n\t\tconst value = await collectValidField(options.ui, params, name, schema, values[name]);\n\t\tif (value.status === \"cancelled\") return { action: \"cancel\" };\n\t\tvalues[name] = value.value;\n\t}\n}\n\nasync function collectValidField(\n\tui: ElicitationUIContext,\n\tparams: ElicitRequestFormParams,\n\tname: string,\n\tschema: FormProperty,\n\tcurrent?: ElicitationValue,\n): Promise<FieldCollectionResult> {\n\tconst required = params.requestedSchema.required?.includes(name) === true;\n\twhile (true) {\n\t\tconst result = await collectField(ui, params, name, schema, current);\n\t\tif (result.status === \"cancelled\") return result;\n\t\ttry {\n\t\t\tcoerceAndValidateFormValues(\n\t\t\t\t{\n\t\t\t\t\t...params,\n\t\t\t\t\trequestedSchema: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: { [name]: schema },\n\t\t\t\t\t\t...(required ? { required: [name] } : {}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{ [name]: result.value },\n\t\t\t);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tui.notify(error instanceof Error ? error.message : String(error), \"error\");\n\t\t\tcurrent = result.value;\n\t\t}\n\t}\n}\n\nasync function collectField(\n\tui: ElicitationUIContext,\n\tparams: ElicitRequestFormParams,\n\tname: string,\n\tschema: FormProperty,\n\tcurrent?: ElicitationValue,\n): Promise<FieldCollectionResult> {\n\tconst required = params.requestedSchema.required?.includes(name) === true;\n\tconst title = [schema.title ?? humanizeName(name), required ? \"(required)\" : \"\", schema.description]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\n\tif (schema.type === \"string\" && (\"enum\" in schema || \"oneOf\" in schema)) {\n\t\tconst choices =\n\t\t\t\"oneOf\" in schema\n\t\t\t\t? schema.oneOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))\n\t\t\t\t: schema.enum.map((value, index) => ({\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\tdisplay: formatChoice(value, \"enumNames\" in schema ? schema.enumNames?.[index] : undefined),\n\t\t\t\t\t}));\n\t\tconst displays = uniqueLabels(choices.map((choice) => choice.display));\n\t\tconst actions = [...displays];\n\t\tconst useDefault = schema.default === undefined ? undefined : uniqueAction(\"Use default\", actions);\n\t\tif (useDefault) actions.push(useDefault);\n\t\tconst omit = required ? undefined : uniqueAction(\"Omit\", actions);\n\t\tif (omit) actions.push(omit);\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === useDefault) return { status: \"collected\", value: schema.default };\n\t\tif (action === omit) return { status: \"collected\", value: undefined };\n\t\treturn { status: \"collected\", value: choices[displays.indexOf(action)]?.value };\n\t}\n\n\tif (schema.type === \"boolean\") {\n\t\tconst actions = [\"Yes\", \"No\"];\n\t\tif (schema.default !== undefined) actions.push(\"Use default\");\n\t\tif (!required) actions.push(\"Omit\");\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\t\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\t\treturn { status: \"collected\", value: action === \"Yes\" };\n\t}\n\n\tif (schema.type === \"array\") {\n\t\tconst actions = [\"Choose values\"];\n\t\tif (schema.default !== undefined) actions.push(\"Use default\");\n\t\tif (!required) actions.push(\"Omit\");\n\t\tconst action = await ui.select(title, actions);\n\t\tif (action === undefined) return { status: \"cancelled\" };\n\t\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\t\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\n\t\tconst choices = extractMultiSelectOptions(schema);\n\t\tconst selected = new Set(Array.isArray(current) ? current : []);\n\t\twhile (true) {\n\t\t\tconst displays = uniqueLabels(\n\t\t\t\tchoices.map((choice) => (selected.has(choice.value) ? `✓ ${choice.display}` : choice.display)),\n\t\t\t);\n\t\t\tconst done = uniqueAction(\"Done\", displays);\n\t\t\tconst picked = await ui.select(title, [...displays, done]);\n\t\t\tif (picked === undefined) return { status: \"cancelled\" };\n\t\t\tif (picked === done) return { status: \"collected\", value: [...selected] };\n\t\t\tconst choice = choices[displays.indexOf(picked)];\n\t\t\tif (!choice) continue;\n\t\t\tif (selected.has(choice.value)) selected.delete(choice.value);\n\t\t\telse selected.add(choice.value);\n\t\t}\n\t}\n\n\tconst actions = [\"Enter value\"];\n\tif (schema.default !== undefined) actions.push(\"Use default\");\n\tif (!required) actions.push(\"Omit\");\n\tconst action = await ui.select(title, actions);\n\tif (action === undefined) return { status: \"cancelled\" };\n\tif (action === \"Use default\") return { status: \"collected\", value: schema.default };\n\tif (action === \"Omit\") return { status: \"collected\", value: undefined };\n\tconst entered = await ui.input(title, current === undefined ? undefined : String(current));\n\treturn entered === undefined ? { status: \"cancelled\" } : { status: \"collected\", value: entered };\n}\n\nexport function coerceAndValidateFormValues(\n\tparams: ElicitRequestFormParams,\n\tvalues: Record<string, ElicitationValue>,\n): Record<string, string | number | boolean | string[]> {\n\tconst output: Record<string, string | number | boolean | string[]> = {};\n\tconst required = new Set(params.requestedSchema.required ?? []);\n\tfor (const [name, schema] of Object.entries(params.requestedSchema.properties)) {\n\t\tconst value = values[name];\n\t\tif (value === undefined) {\n\t\t\tif (required.has(name)) throw new Error(`Missing required elicitation field: ${name}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"string\") {\n\t\t\tconst stringValue = String(value);\n\t\t\tconst limits = schema as typeof schema & { minLength?: number; maxLength?: number };\n\t\t\tif (limits.minLength !== undefined && stringValue.length < limits.minLength) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is shorter than minimum length ${limits.minLength}`);\n\t\t\t}\n\t\t\tif (limits.maxLength !== undefined && stringValue.length > limits.maxLength) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is longer than maximum length ${limits.maxLength}`);\n\t\t\t}\n\t\t\tif (\"enum\" in schema && !schema.enum.includes(stringValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is not an allowed value`);\n\t\t\t}\n\t\t\tif (\"oneOf\" in schema && !schema.oneOf.some((option) => option.const === stringValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is not an allowed value`);\n\t\t\t}\n\t\t\toutput[name] = stringValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"number\" || schema.type === \"integer\") {\n\t\t\tif (typeof value === \"string\" && value.trim() === \"\") {\n\t\t\t\tthrow new Error(`Elicitation field ${name} must be a number`);\n\t\t\t}\n\t\t\tconst numberValue = typeof value === \"number\" ? value : Number(value);\n\t\t\tif (!Number.isFinite(numberValue)) throw new Error(`Elicitation field ${name} must be a number`);\n\t\t\tif (schema.type === \"integer\" && !Number.isInteger(numberValue)) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} must be an integer`);\n\t\t\t}\n\t\t\tif (schema.minimum !== undefined && numberValue < schema.minimum) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is below minimum ${schema.minimum}`);\n\t\t\t}\n\t\t\tif (schema.maximum !== undefined && numberValue > schema.maximum) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} is above maximum ${schema.maximum}`);\n\t\t\t}\n\t\t\toutput[name] = numberValue;\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"boolean\") {\n\t\t\toutput[name] = typeof value === \"boolean\" ? value : value === \"true\";\n\t\t\tcontinue;\n\t\t}\n\t\tif (schema.type === \"array\") {\n\t\t\tif (!Array.isArray(value)) throw new Error(`Elicitation field ${name} must be a list`);\n\t\t\tconst allowed = new Set(extractMultiSelectOptions(schema).map((option) => option.value));\n\t\t\tconst arrayValue = value.map(String);\n\t\t\tif (schema.minItems !== undefined && arrayValue.length < schema.minItems) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} has fewer than ${schema.minItems} selections`);\n\t\t\t}\n\t\t\tif (schema.maxItems !== undefined && arrayValue.length > schema.maxItems) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} has more than ${schema.maxItems} selections`);\n\t\t\t}\n\t\t\tif (arrayValue.some((item) => !allowed.has(item))) {\n\t\t\t\tthrow new Error(`Elicitation field ${name} contains an invalid selection`);\n\t\t\t}\n\t\t\toutput[name] = arrayValue;\n\t\t}\n\t}\n\tconst validation = new AjvJsonSchemaValidator().getValidator(params.requestedSchema as JsonSchemaType)(output);\n\tif (!validation.valid) {\n\t\tthrow new Error(`Invalid elicitation response: ${validation.errorMessage}`);\n\t}\n\treturn output;\n}\n\nfunction formatChoice(value: string, title?: string): string {\n\treturn title && title !== value ? `${title} (${value})` : value;\n}\n\nfunction uniqueLabels(labels: string[]): string[] {\n\tconst used = new Set<string>();\n\treturn labels.map((label) => {\n\t\tlet unique = label;\n\t\twhile (used.has(unique)) unique += \"…\";\n\t\tused.add(unique);\n\t\treturn unique;\n\t});\n}\n\nfunction uniqueAction(label: string, choices: string[]): string {\n\tlet unique = label;\n\twhile (choices.includes(unique)) unique += \"…\";\n\treturn unique;\n}\n\nfunction extractMultiSelectOptions(\n\tschema: Extract<FormProperty, { type: \"array\" }>,\n): Array<{ value: string; display: string }> {\n\tconst items = schema.items as { enum?: string[]; anyOf?: Array<{ const: string; title: string }> };\n\treturn items.anyOf\n\t\t? items.anyOf.map((option) => ({ value: option.const, display: formatChoice(option.const, option.title) }))\n\t\t: (items.enum ?? []).map((value) => ({ value, display: value }));\n}\n\nfunction formatReview(\n\tserverName: string,\n\tproperties: Array<[string, FormProperty]>,\n\tcontent: Record<string, string | number | boolean | string[]>,\n): string {\n\tconst rows = properties.map(\n\t\t([name, schema]) =>\n\t\t\t`${schema.title ?? humanizeName(name)}: ${content[name] === undefined ? \"(omitted)\" : String(content[name])}`,\n\t);\n\treturn [`Review input for ${serverName}`, \"\", ...rows].join(\"\\n\");\n}\n\nexport async function handleUrlElicitation(\n\toptions: ElicitationHandlerOptions,\n\tparams: ElicitRequestURLParams,\n): Promise<ElicitResult> {\n\tif (!options.allowUrl) throw new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation is not supported\");\n\n\tlet parsed: URL;\n\ttry {\n\t\tparsed = new URL(params.url);\n\t} catch {\n\t\tthrow new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation supplied an invalid URL\");\n\t}\n\tif (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n\t\tthrow new ProtocolError(ProtocolErrorCode.InvalidParams, \"URL elicitation only supports HTTP and HTTPS URLs\");\n\t}\n\n\tconst decision = await options.ui.select(\n\t\t[\n\t\t\t\"MCP Browser Request\",\n\t\t\t`Server: ${options.serverName}`,\n\t\t\t\"\",\n\t\t\tparams.message,\n\t\t\t\"\",\n\t\t\t`Host: ${parsed.host}`,\n\t\t\t`Full URL: ${params.url}`,\n\t\t\t\"\",\n\t\t\t\"Open this URL in your browser?\",\n\t\t].join(\"\\n\"),\n\t\t[\"Open\", \"Decline\"],\n\t);\n\tif (decision === undefined) return { action: \"cancel\" };\n\tif (decision === \"Decline\") return { action: \"decline\" };\n\n\ttry {\n\t\tawait open(params.url);\n\t} catch (error) {\n\t\toptions.ui.notify(\n\t\t\t`Could not open MCP elicitation URL: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t\treturn { action: \"cancel\" };\n\t}\n\toptions.onUrlAccepted?.(params.elicitationId);\n\toptions.ui.notify(\"Opened browser for MCP elicitation.\", \"info\");\n\treturn { action: \"accept\" };\n}\n\nfunction humanizeName(name: string): string {\n\treturn name\n\t\t.replace(/[_-]+/g, \" \")\n\t\t.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n\t\t.replace(/^./, (char) => char.toUpperCase());\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decide the `isError` override for a finished tool result in the `tool_result` hook.
|
|
3
|
+
*
|
|
4
|
+
* A failed MCP tool call is *returned* (not thrown), tagged `details.error: "tool_error"` (the server
|
|
5
|
+
* returned an error result) or `"call_failed"` (the call itself threw and was caught). nexus never reads a
|
|
6
|
+
* result-level `isError`, so without this such a call is recorded as a success. Returning
|
|
7
|
+
* `{ isError: true }` (and nothing else) flips the flag; nexus's field-by-field merge keeps the original
|
|
8
|
+
* `content` and `details` intact.
|
|
9
|
+
*
|
|
10
|
+
* Limited to those two codes: the adapter's other `details.error` values (`auth_required`, connection
|
|
11
|
+
* states, search/validation feedback, ...) are not failed tool calls, so they get no override.
|
|
12
|
+
*/
|
|
13
|
+
export declare function toolErrorOverride(details: unknown): {
|
|
14
|
+
isError: true;
|
|
15
|
+
} | undefined;
|
|
16
|
+
//# sourceMappingURL=error-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-signal.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/error-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAQjF","sourcesContent":["/**\n * Decide the `isError` override for a finished tool result in the `tool_result` hook.\n *\n * A failed MCP tool call is *returned* (not thrown), tagged `details.error: \"tool_error\"` (the server\n * returned an error result) or `\"call_failed\"` (the call itself threw and was caught). nexus never reads a\n * result-level `isError`, so without this such a call is recorded as a success. Returning\n * `{ isError: true }` (and nothing else) flips the flag; nexus's field-by-field merge keeps the original\n * `content` and `details` intact.\n *\n * Limited to those two codes: the adapter's other `details.error` values (`auth_required`, connection\n * states, search/validation feedback, ...) are not failed tool calls, so they get no override.\n */\nexport function toolErrorOverride(details: unknown): { isError: true } | undefined {\n\tif (details && typeof details === \"object\" && \"error\" in details) {\n\t\tconst code = (details as { error?: unknown }).error;\n\t\tif (code === \"tool_error\" || code === \"call_failed\") {\n\t\t\treturn { isError: true };\n\t\t}\n\t}\n\treturn undefined;\n}\n"]}
|