@humain/terminal 0.0.2 → 0.0.3-beta.1
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 +251 -24
- package/README.md +143 -119
- package/dist/cli/args.d.ts +4 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +37 -39
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +103 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -2
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts +5 -15
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +42 -83
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/auth.d.ts +16 -0
- package/dist/cli/experimental/auth.d.ts.map +1 -0
- package/dist/cli/experimental/auth.js +13 -0
- package/dist/cli/experimental/auth.js.map +1 -0
- package/dist/cli/experimental/cli.d.ts +6 -0
- package/dist/cli/experimental/cli.d.ts.map +1 -0
- package/dist/cli/experimental/cli.js +5 -0
- package/dist/cli/experimental/cli.js.map +1 -0
- package/dist/cli/experimental/command-options.d.ts +17 -0
- package/dist/cli/experimental/command-options.d.ts.map +1 -0
- package/dist/cli/experimental/command-options.js +35 -0
- package/dist/cli/experimental/command-options.js.map +1 -0
- package/dist/cli/experimental/command.d.ts +63 -0
- package/dist/cli/experimental/command.d.ts.map +1 -0
- package/dist/cli/experimental/command.js +130 -0
- package/dist/cli/experimental/command.js.map +1 -0
- package/dist/cli/experimental/commands/client.d.ts +13 -0
- package/dist/cli/experimental/commands/client.d.ts.map +1 -0
- package/dist/cli/experimental/commands/client.js +25 -0
- package/dist/cli/experimental/commands/client.js.map +1 -0
- package/dist/cli/experimental/commands/pi.d.ts +15 -0
- package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
- package/dist/cli/experimental/commands/pi.js +28 -0
- package/dist/cli/experimental/commands/pi.js.map +1 -0
- package/dist/cli/experimental/commands/server.d.ts +13 -0
- package/dist/cli/experimental/commands/server.d.ts.map +1 -0
- package/dist/cli/experimental/commands/server.js +25 -0
- package/dist/cli/experimental/commands/server.js.map +1 -0
- package/dist/cli/experimental/transport-address.d.ts +10 -0
- package/dist/cli/experimental/transport-address.d.ts.map +1 -0
- package/dist/cli/experimental/transport-address.js +38 -0
- package/dist/cli/experimental/transport-address.js.map +1 -0
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +2 -2
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/remote-session.d.ts +53 -0
- package/dist/client/remote-session.d.ts.map +1 -0
- package/dist/client/remote-session.js +340 -0
- package/dist/client/remote-session.js.map +1 -0
- package/dist/client/transcript.d.ts +12 -0
- package/dist/client/transcript.d.ts.map +1 -0
- package/dist/client/transcript.js +98 -0
- package/dist/client/transcript.js.map +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -3
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -10
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +72 -70
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +25 -9
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +237 -39
- package/dist/core/auth-storage.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 +60 -41
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +2 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +27 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +45 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +29 -5
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +4 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +13 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +4 -3
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +42 -10
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +30 -13
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +233 -73
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +12 -7
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +83 -14
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/package-manager.d.ts +6 -3
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +80 -61
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts +8 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +28 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/provider-composer.d.ts +4 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +36 -15
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +73 -67
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +5 -5
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +11 -8
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +3 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +40 -16
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +8 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +5 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -15
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +4 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +11 -7
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +7 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +16 -19
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +4 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +5 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts +4 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +7 -3
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +4 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +6 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +11 -2
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +21 -7
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/humain/agent-execution-protocol.d.ts +218 -0
- package/dist/humain/agent-execution-protocol.d.ts.map +1 -0
- package/dist/humain/agent-execution-protocol.js +204 -0
- package/dist/humain/agent-execution-protocol.js.map +1 -0
- package/dist/humain/agent-execution-runtime.d.ts +35 -0
- package/dist/humain/agent-execution-runtime.d.ts.map +1 -0
- package/dist/humain/agent-execution-runtime.js +170 -0
- package/dist/humain/agent-execution-runtime.js.map +1 -0
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js +8 -7
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +673 -0
- package/dist/humain/mcp-adapter/vendor/LICENSE +21 -0
- package/dist/humain/mcp-adapter/vendor/README.md +736 -0
- package/dist/humain/mcp-adapter/vendor/abort.ts +34 -0
- package/dist/humain/mcp-adapter/vendor/agent-dir.ts +68 -0
- package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +377 -0
- package/dist/humain/mcp-adapter/vendor/app-bridge.bundle.js +67 -0
- package/dist/humain/mcp-adapter/vendor/banner.png +0 -0
- package/dist/humain/mcp-adapter/vendor/cli.js +230 -0
- package/dist/humain/mcp-adapter/vendor/commands.ts +627 -0
- package/dist/humain/mcp-adapter/vendor/config.ts +1226 -0
- package/dist/humain/mcp-adapter/vendor/consent-manager.ts +64 -0
- package/dist/humain/mcp-adapter/vendor/direct-tools.ts +607 -0
- package/dist/humain/mcp-adapter/vendor/elicitation-handler.ts +348 -0
- package/dist/humain/mcp-adapter/vendor/error-signal.ts +21 -0
- package/dist/humain/mcp-adapter/vendor/errors.ts +223 -0
- package/dist/humain/mcp-adapter/vendor/glimpse-ui.ts +80 -0
- package/dist/humain/mcp-adapter/vendor/host-html-template.ts +461 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.d.mts +4 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +16279 -0
- package/dist/humain/mcp-adapter/vendor/index.ts +898 -0
- package/dist/humain/mcp-adapter/vendor/init.ts +649 -0
- package/dist/humain/mcp-adapter/vendor/json-schema-validator.ts +69 -0
- package/dist/humain/mcp-adapter/vendor/lifecycle.ts +147 -0
- package/dist/humain/mcp-adapter/vendor/logger.ts +169 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +993 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +1000 -0
- package/dist/humain/mcp-adapter/vendor/mcp-callback-server.ts +510 -0
- package/dist/humain/mcp-adapter/vendor/mcp-code.ts +354 -0
- package/dist/humain/mcp-adapter/vendor/mcp-keyring-helper.cjs +89 -0
- package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +616 -0
- package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +408 -0
- package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +1015 -0
- package/dist/humain/mcp-adapter/vendor/mcp-probe.ts +187 -0
- package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +130 -0
- package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +667 -0
- package/dist/humain/mcp-adapter/vendor/mcp-status.ts +109 -0
- package/dist/humain/mcp-adapter/vendor/mcp-trace.ts +306 -0
- package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +363 -0
- package/dist/humain/mcp-adapter/vendor/npx-resolver.ts +543 -0
- package/dist/humain/mcp-adapter/vendor/oauth-handler.ts +30 -0
- package/dist/humain/mcp-adapter/vendor/oauth.ts +48 -0
- package/dist/humain/mcp-adapter/vendor/onboarding-state.ts +76 -0
- package/dist/humain/mcp-adapter/vendor/package.json +179 -0
- package/dist/humain/mcp-adapter/vendor/panel-keys.ts +53 -0
- package/dist/humain/mcp-adapter/vendor/prompts.ts +353 -0
- package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +1331 -0
- package/dist/humain/mcp-adapter/vendor/request-headers-command.ts +336 -0
- package/dist/humain/mcp-adapter/vendor/resource-tools.ts +17 -0
- package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +91 -0
- package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +284 -0
- package/dist/humain/mcp-adapter/vendor/search-ranking.ts +206 -0
- package/dist/humain/mcp-adapter/vendor/server-manager.ts +1129 -0
- package/dist/humain/mcp-adapter/vendor/session-recovery.ts +151 -0
- package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/humain/mcp-adapter/vendor/state.ts +62 -0
- package/dist/humain/mcp-adapter/vendor/tool-approval.ts +182 -0
- package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +296 -0
- package/dist/humain/mcp-adapter/vendor/tool-registrar.ts +253 -0
- package/dist/humain/mcp-adapter/vendor/tool-result-renderer.ts +423 -0
- package/dist/humain/mcp-adapter/vendor/ts-shape.ts +149 -0
- package/dist/humain/mcp-adapter/vendor/types.ts +942 -0
- package/dist/humain/mcp-adapter/vendor/ui-app-bridge-helpers.ts +40 -0
- package/dist/humain/mcp-adapter/vendor/ui-resource-handler.ts +250 -0
- package/dist/humain/mcp-adapter/vendor/ui-server.ts +866 -0
- package/dist/humain/mcp-adapter/vendor/ui-session.ts +570 -0
- package/dist/humain/mcp-adapter/vendor/ui-stream-types.ts +89 -0
- package/dist/humain/mcp-adapter/vendor/ui-tool-visibility.ts +25 -0
- package/dist/humain/mcp-adapter/vendor/unix-socket-transport.ts +85 -0
- package/dist/humain/mcp-adapter/vendor/utils.ts +310 -0
- package/dist/humain/mcp-adapter.d.ts +3 -0
- package/dist/humain/mcp-adapter.d.ts.map +1 -0
- package/dist/humain/mcp-adapter.js +5 -0
- package/dist/humain/mcp-adapter.js.map +1 -0
- package/dist/humain/pi-agent-execution-host.d.ts +34 -0
- package/dist/humain/pi-agent-execution-host.d.ts.map +1 -0
- package/dist/humain/pi-agent-execution-host.js +77 -0
- package/dist/humain/pi-agent-execution-host.js.map +1 -0
- package/dist/humain/web-access/host.d.ts +4 -0
- package/dist/humain/web-access/host.d.ts.map +1 -0
- package/dist/humain/web-access/host.js +3 -0
- package/dist/humain/web-access/host.js.map +1 -0
- package/dist/humain/web-access/index.d.ts +3 -0
- package/dist/humain/web-access/index.d.ts.map +1 -0
- package/dist/humain/web-access/index.js +5 -0
- package/dist/humain/web-access/index.js.map +1 -0
- package/dist/humain/web-access/vendor/activity.d.ts +34 -0
- package/dist/humain/web-access/vendor/activity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/activity.js +68 -0
- package/dist/humain/web-access/vendor/activity.js.map +1 -0
- package/dist/humain/web-access/vendor/anysearch.d.ts +8 -0
- package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/anysearch.js +167 -0
- package/dist/humain/web-access/vendor/anysearch.js.map +1 -0
- package/dist/humain/web-access/vendor/auth-fetch.d.ts +13 -0
- package/dist/humain/web-access/vendor/auth-fetch.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/auth-fetch.js +134 -0
- package/dist/humain/web-access/vendor/auth-fetch.js.map +1 -0
- package/dist/humain/web-access/vendor/bocha.d.ts +4 -0
- package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/bocha.js +219 -0
- package/dist/humain/web-access/vendor/bocha.js.map +1 -0
- package/dist/humain/web-access/vendor/brave.d.ts +4 -0
- package/dist/humain/web-access/vendor/brave.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brave.js +194 -0
- package/dist/humain/web-access/vendor/brave.js.map +1 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts +12 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.js +230 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -0
- package/dist/humain/web-access/vendor/brightdata.d.ts +8 -0
- package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brightdata.js +519 -0
- package/dist/humain/web-access/vendor/brightdata.js.map +1 -0
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts +23 -0
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/chrome-cookies.js +522 -0
- package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -0
- package/dist/humain/web-access/vendor/content-find.d.ts +11 -0
- package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/content-find.js +117 -0
- package/dist/humain/web-access/vendor/content-find.js.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts +28 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.js +151 -0
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-page.d.ts +30 -0
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-page.js +3556 -0
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts +94 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.js +690 -0
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts +60 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.js +416 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/declared-web-links.d.ts +16 -0
- package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/declared-web-links.js +168 -0
- package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -0
- package/dist/humain/web-access/vendor/duckduckgo.d.ts +4 -0
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/duckduckgo.js +123 -0
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -0
- package/dist/humain/web-access/vendor/exa.d.ts +10 -0
- package/dist/humain/web-access/vendor/exa.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/exa.js +426 -0
- package/dist/humain/web-access/vendor/exa.js.map +1 -0
- package/dist/humain/web-access/vendor/extract.d.ts +48 -0
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/extract.js +1126 -0
- package/dist/humain/web-access/vendor/extract.js.map +1 -0
- package/dist/humain/web-access/vendor/feature-config.d.ts +3 -0
- package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/feature-config.js +27 -0
- package/dist/humain/web-access/vendor/feature-config.js.map +1 -0
- package/dist/humain/web-access/vendor/fetch-params.d.ts +27 -0
- package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/fetch-params.js +71 -0
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -0
- package/dist/humain/web-access/vendor/firecrawl.d.ts +19 -0
- package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/firecrawl.js +370 -0
- package/dist/humain/web-access/vendor/firecrawl.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-api.d.ts +27 -0
- package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-api.js +230 -0
- package/dist/humain/web-access/vendor/gemini-api.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts +9 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.js +85 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-search.d.ts +40 -0
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-search.js +832 -0
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts +4 -0
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-url-context.js +101 -0
- package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts +4 -0
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web-config.js +42 -0
- package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web.d.ts +18 -0
- package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web.js +385 -0
- package/dist/humain/web-access/vendor/gemini-web.js.map +1 -0
- package/dist/humain/web-access/vendor/github-api.d.ts +7 -0
- package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/github-api.js +160 -0
- package/dist/humain/web-access/vendor/github-api.js.map +1 -0
- package/dist/humain/web-access/vendor/github-extract.d.ts +13 -0
- package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/github-extract.js +635 -0
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/index.d.ts +4 -0
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/index.js +3076 -0
- package/dist/humain/web-access/vendor/index.js.map +1 -0
- package/dist/humain/web-access/vendor/jina-search.d.ts +8 -0
- package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/jina-search.js +255 -0
- package/dist/humain/web-access/vendor/jina-search.js.map +1 -0
- package/dist/humain/web-access/vendor/kagi.d.ts +15 -0
- package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/kagi.js +262 -0
- package/dist/humain/web-access/vendor/kagi.js.map +1 -0
- package/dist/humain/web-access/vendor/ollama.d.ts +15 -0
- package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/ollama.js +216 -0
- package/dist/humain/web-access/vendor/ollama.js.map +1 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts +15 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/openai-search.js +459 -0
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -0
- package/dist/humain/web-access/vendor/page-query.d.ts +16 -0
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/page-query.js +79 -0
- package/dist/humain/web-access/vendor/page-query.js.map +1 -0
- package/dist/humain/web-access/vendor/parallel.d.ts +12 -0
- package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/parallel.js +343 -0
- package/dist/humain/web-access/vendor/parallel.js.map +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts +44 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.js +298 -0
- package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts +20 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.js +159 -0
- package/dist/humain/web-access/vendor/perplexity.js.map +1 -0
- package/dist/humain/web-access/vendor/querit.d.ts +10 -0
- package/dist/humain/web-access/vendor/querit.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/querit.js +335 -0
- package/dist/humain/web-access/vendor/querit.js.map +1 -0
- package/dist/humain/web-access/vendor/render-search-error.d.ts +57 -0
- package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/render-search-error.js +130 -0
- package/dist/humain/web-access/vendor/render-search-error.js.map +1 -0
- package/dist/humain/web-access/vendor/rsc-extract.d.ts +12 -0
- package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/rsc-extract.js +329 -0
- package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/search1api.d.ts +10 -0
- package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/search1api.js +251 -0
- package/dist/humain/web-access/vendor/search1api.js.map +1 -0
- package/dist/humain/web-access/vendor/searchinfinity.d.ts +8 -0
- package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/searchinfinity.js +229 -0
- package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -0
- package/dist/humain/web-access/vendor/searxng.d.ts +4 -0
- package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/searxng.js +238 -0
- package/dist/humain/web-access/vendor/searxng.js.map +1 -0
- package/dist/humain/web-access/vendor/serpbase.d.ts +4 -0
- package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpbase.js +211 -0
- package/dist/humain/web-access/vendor/serpbase.js.map +1 -0
- package/dist/humain/web-access/vendor/serpdive.d.ts +8 -0
- package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpdive.js +267 -0
- package/dist/humain/web-access/vendor/serpdive.js.map +1 -0
- package/dist/humain/web-access/vendor/source-check.d.ts +99 -0
- package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/source-check.js +205 -0
- package/dist/humain/web-access/vendor/source-check.js.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts +50 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.js +466 -0
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -0
- package/dist/humain/web-access/vendor/storage.d.ts +55 -0
- package/dist/humain/web-access/vendor/storage.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/storage.js +485 -0
- package/dist/humain/web-access/vendor/storage.js.map +1 -0
- package/dist/humain/web-access/vendor/summary-model-scope.d.ts +25 -0
- package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/summary-model-scope.js +98 -0
- package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -0
- package/dist/humain/web-access/vendor/summary-review.d.ts +26 -0
- package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/summary-review.js +344 -0
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -0
- package/dist/humain/web-access/vendor/tavily.d.ts +8 -0
- package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/tavily.js +194 -0
- package/dist/humain/web-access/vendor/tavily.js.map +1 -0
- package/dist/humain/web-access/vendor/tinyfish.d.ts +11 -0
- package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/tinyfish.js +331 -0
- package/dist/humain/web-access/vendor/tinyfish.js.map +1 -0
- package/dist/humain/web-access/vendor/utils.d.ts +20 -0
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/utils.js +91 -0
- package/dist/humain/web-access/vendor/utils.js.map +1 -0
- package/dist/humain/web-access/vendor/video-extract.d.ts +16 -0
- package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/video-extract.js +335 -0
- package/dist/humain/web-access/vendor/video-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/xai-search.d.ts +13 -0
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/xai-search.js +331 -0
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -0
- package/dist/humain/web-access/vendor/youtube-extract.d.ts +27 -0
- package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/youtube-extract.js +282 -0
- package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -2
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +169 -102
- package/dist/main.js.map +1 -1
- package/dist/modes/agent-exec-mode.d.ts +14 -0
- package/dist/modes/agent-exec-mode.d.ts.map +1 -0
- package/dist/modes/agent-exec-mode.js +92 -0
- package/dist/modes/agent-exec-mode.js.map +1 -0
- package/dist/modes/index.d.ts +4 -2
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +2 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +7 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +11 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +75 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +16 -4
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +30 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +3 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +9 -2
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +45 -9
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +581 -211
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +10 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +5 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +24 -6
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +28 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +12 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +12 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +12 -5
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +55 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +13 -3
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +15 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -9
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js +3 -2
- package/dist/rpc-entry.js.map +1 -1
- package/dist/server/create-harness.d.ts +26 -0
- package/dist/server/create-harness.d.ts.map +1 -0
- package/dist/server/create-harness.js +104 -0
- package/dist/server/create-harness.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +48 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +22 -2
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/management-http.d.ts +23 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +50 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +23 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts +19 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +45 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +13 -25
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +4 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +23 -5
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +2 -2
- package/docs/custom-provider.md +7 -5
- package/docs/extensions.md +30 -5
- package/docs/humain-terminal.md +21 -1
- package/docs/json.md +24 -19
- package/docs/keybindings.md +46 -14
- package/docs/models.md +32 -11
- package/docs/providers.md +9 -1
- package/docs/quickstart.md +39 -37
- package/docs/rpc.md +31 -11
- package/docs/sdk.md +21 -2
- package/docs/security.md +21 -21
- package/docs/session-format.md +14 -14
- package/docs/settings.md +4 -1
- package/docs/themes.md +5 -3
- package/docs/usage.md +7 -0
- package/examples/extensions/custom-compaction.ts +3 -18
- package/examples/extensions/custom-provider-anthropic/index.ts +5 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +5 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -13
- package/examples/extensions/qna.ts +5 -9
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/summarize.ts +9 -20
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-extension-ui.ts +11 -2
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +2771 -535
- package/package.json +40 -11
- package/src/humain/mcp-adapter/UPSTREAM.md +15 -0
- package/src/humain/mcp-adapter/upstream.json +7 -0
- package/src/humain/mcp-adapter/vendor/CHANGELOG.md +673 -0
- package/src/humain/mcp-adapter/vendor/LICENSE +21 -0
- package/src/humain/web-access/UPSTREAM.md +17 -0
- package/src/humain/web-access/upstream.json +23 -0
- package/src/humain/web-access/vendor/LICENSE +21 -0
|
@@ -0,0 +1,898 @@
|
|
|
1
|
+
import type { AgentToolUpdateCallback, ExtensionAPI, ExtensionContext, ToolInfo } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import type { McpExtensionState } from "./state.ts";
|
|
3
|
+
import type { DirectToolSpec, McpAdapterOptions, McpConfig, PromptMetadata } from "./types.ts";
|
|
4
|
+
import type { McpOAuthRuntime } from "./mcp-auth-flow.ts";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import type { TSchema } from "typebox";
|
|
7
|
+
import { showStatus, showTools, showPrompts, reconnectServer, reconnectServers, authenticateServer, logoutServer, openMcpAuthPanel, openMcpPanel, openMcpSetup } from "./commands.ts";
|
|
8
|
+
import { cloneMcpConfig, loadMcpConfig, writeProjectServerDisabledOverride } from "./config.ts";
|
|
9
|
+
import { buildProxyDescription, createDirectToolExecutor, getMissingConfiguredDirectToolServers, resolveDirectTools } from "./direct-tools.ts";
|
|
10
|
+
import { flushMetadataCache, initializeMcp, updateStatusBar } from "./init.ts";
|
|
11
|
+
import { loadMetadataCache, type MetadataCache } from "./metadata-cache.ts";
|
|
12
|
+
import { createPromptCommand, resolveCachedPrompts } from "./prompts.ts";
|
|
13
|
+
import { logger } from "./logger.ts";
|
|
14
|
+
import { executeAuthComplete, executeAuthStart, executeCall, executeConnect, executeDescribe, executeInstructions, executeList, executeSearch, executeStatus, executeUiMessages } from "./proxy-modes.ts";
|
|
15
|
+
import { formatTerminalError, getConfigPathFromArgv, normalizeDirectToolInputSchema, truncateAtWord } from "./utils.ts";
|
|
16
|
+
import { createOAuthRuntime, shutdownOAuth } from "./mcp-auth-flow.ts";
|
|
17
|
+
import { createMcpDirectToolCallRenderer, createMcpProxyToolCallRenderer, createMcpToolResultRenderer, resolveMcpToolRenderOptions } from "./tool-result-renderer.ts";
|
|
18
|
+
import { toolErrorOverride } from "./error-signal.ts";
|
|
19
|
+
import { createMcpRuntimeOwner, createOwnedUi, isAbortError, type McpRuntimeOwner } from "./runtime-owner.ts";
|
|
20
|
+
import { publishMcpStatusShutdown } from "./mcp-status.ts";
|
|
21
|
+
import { runMcpScript } from "./mcp-code.ts";
|
|
22
|
+
import { cleanupMaterializedBinaryResources } from "./tool-registrar.ts";
|
|
23
|
+
|
|
24
|
+
export type { McpAdapterOptions } from "./types.ts";
|
|
25
|
+
export {
|
|
26
|
+
MCP_STATUS_EVENT,
|
|
27
|
+
MCP_STATUS_SNAPSHOT_VERSION,
|
|
28
|
+
MCP_TOOL_APPROVAL_REQUEST_EVENT,
|
|
29
|
+
type McpServerRuntimeStatus,
|
|
30
|
+
type McpServerStatusSnapshot,
|
|
31
|
+
type McpStatusSnapshot,
|
|
32
|
+
type McpToolApprovalDecision,
|
|
33
|
+
type McpToolApprovalHandler,
|
|
34
|
+
type McpToolApprovalOrigin,
|
|
35
|
+
type McpToolApprovalRequest,
|
|
36
|
+
} from "./types.ts";
|
|
37
|
+
|
|
38
|
+
const INIT_WAIT_TIMEOUT_MS = 30_000;
|
|
39
|
+
const INIT_WAIT_TIMED_OUT: unique symbol = Symbol("init-wait-timed-out");
|
|
40
|
+
|
|
41
|
+
async function awaitWithTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T | typeof INIT_WAIT_TIMED_OUT> {
|
|
42
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
43
|
+
try {
|
|
44
|
+
return await Promise.race([
|
|
45
|
+
promise,
|
|
46
|
+
new Promise<typeof INIT_WAIT_TIMED_OUT>((resolve) => {
|
|
47
|
+
timer = setTimeout(() => resolve(INIT_WAIT_TIMED_OUT), timeoutMs);
|
|
48
|
+
timer.unref?.();
|
|
49
|
+
}),
|
|
50
|
+
]);
|
|
51
|
+
} finally {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// TypeBox 1.x annotates raw objects passed to Type.Optional with an enumerable
|
|
57
|
+
// "~optional" key that survives serialization into provider tool schemas (Gemini
|
|
58
|
+
// rejects it with 400 INVALID_ARGUMENT). Prefer a real Type.Number schema; fall
|
|
59
|
+
// back to a plain raw schema for host TypeBox shims that omit Type.Number, since
|
|
60
|
+
// a property left out of `required` is optional by default.
|
|
61
|
+
function optionalNumber(options: { minimum?: number; description: string }): TSchema {
|
|
62
|
+
const number = (Type as { Number?: (opts: typeof options) => TSchema }).Number;
|
|
63
|
+
return typeof number === "function"
|
|
64
|
+
? Type.Optional(number(options))
|
|
65
|
+
: ({ type: "number", ...options } as unknown as TSchema);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function installMcpAdapter(pi: ExtensionAPI, options: McpAdapterOptions) {
|
|
69
|
+
const sessionConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
|
|
70
|
+
const programmaticConfig = sessionConfig !== undefined;
|
|
71
|
+
let state: McpExtensionState | null = null;
|
|
72
|
+
let initPromise: Promise<McpExtensionState> | null = null;
|
|
73
|
+
let currentOwner: McpRuntimeOwner | null = null;
|
|
74
|
+
let currentOAuthRuntime: McpOAuthRuntime | null = null;
|
|
75
|
+
let lifecycleGeneration = 0;
|
|
76
|
+
|
|
77
|
+
async function shutdownState(currentState: McpExtensionState | null, reason: string): Promise<void> {
|
|
78
|
+
if (!currentState) {
|
|
79
|
+
publishMcpStatusShutdown(pi.events);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
publishMcpStatusShutdown(currentState.statusEvents);
|
|
84
|
+
|
|
85
|
+
if (currentState.uiServer) {
|
|
86
|
+
currentState.uiServer.close(reason);
|
|
87
|
+
currentState.uiServer = null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let flushError: unknown;
|
|
91
|
+
try {
|
|
92
|
+
flushMetadataCache(currentState);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
flushError = error;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
if (currentState.owner) {
|
|
99
|
+
await currentState.owner.stop(reason);
|
|
100
|
+
} else {
|
|
101
|
+
await currentState.lifecycle.gracefulShutdown();
|
|
102
|
+
}
|
|
103
|
+
} catch (error) {
|
|
104
|
+
if (flushError) {
|
|
105
|
+
console.error(`MCP: graceful shutdown failed after metadata flush error: ${formatTerminalError(error)}`);
|
|
106
|
+
} else {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (flushError) {
|
|
112
|
+
throw flushError;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const earlyConfigPath = programmaticConfig
|
|
117
|
+
? undefined
|
|
118
|
+
: options.configPath ?? getConfigPathFromArgv();
|
|
119
|
+
const earlyConfig = programmaticConfig
|
|
120
|
+
? cloneMcpConfig(sessionConfig)
|
|
121
|
+
: loadMcpConfig(earlyConfigPath);
|
|
122
|
+
const earlyCache = loadMetadataCache();
|
|
123
|
+
const envRaw = process.env.MCP_DIRECT_TOOLS;
|
|
124
|
+
const envDirectToolOverride = envRaw?.split(",").map(s => s.trim()).filter(Boolean);
|
|
125
|
+
const registeredDirectTools = new Map<string, string>();
|
|
126
|
+
const fallbackDeactivatedTools = new Set<string>();
|
|
127
|
+
const toolRenderOptions = resolveMcpToolRenderOptions(earlyConfig.settings);
|
|
128
|
+
const toolRenderShell = toolRenderOptions.resultRendering === "compact" ? "self" : "default";
|
|
129
|
+
const renderMcpToolResult = createMcpToolResultRenderer(toolRenderOptions);
|
|
130
|
+
let proxyToolRegistered = false;
|
|
131
|
+
let proxyToolDescription: string | null = null;
|
|
132
|
+
let directToolsFrozen = false;
|
|
133
|
+
|
|
134
|
+
// OMP remaps `typebox` to a host shim that historically lacked Type.Unsafe.
|
|
135
|
+
// Prefer Unsafe when present (real TypeBox / fixed OMP shim); otherwise pass
|
|
136
|
+
// the normalized JSON Schema through as a plain object so toolWireSchema and
|
|
137
|
+
// validateToolArguments still treat it as JSON Schema.
|
|
138
|
+
const toToolParameters = (schema: Record<string, unknown>) =>
|
|
139
|
+
typeof (Type as { Unsafe?: (value: never) => unknown }).Unsafe === "function"
|
|
140
|
+
? (Type as { Unsafe: (value: never) => unknown }).Unsafe(schema as never)
|
|
141
|
+
: schema;
|
|
142
|
+
|
|
143
|
+
function directToolFingerprint(spec: DirectToolSpec): string {
|
|
144
|
+
return JSON.stringify({
|
|
145
|
+
serverName: spec.serverName,
|
|
146
|
+
originalName: spec.originalName,
|
|
147
|
+
prefixedName: spec.prefixedName,
|
|
148
|
+
description: spec.description,
|
|
149
|
+
inputSchema: spec.inputSchema,
|
|
150
|
+
resourceUri: spec.resourceUri,
|
|
151
|
+
uiResourceUri: spec.uiResourceUri,
|
|
152
|
+
uiStreamMode: spec.uiStreamMode,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function registerDirectTool(spec: DirectToolSpec): void {
|
|
157
|
+
(pi.registerTool as (tool: unknown) => unknown)({
|
|
158
|
+
name: spec.prefixedName,
|
|
159
|
+
label: `MCP: ${spec.originalName}`,
|
|
160
|
+
description: spec.description || "(no description)",
|
|
161
|
+
promptSnippet: truncateAtWord(spec.description, 100) || `MCP tool from ${spec.serverName}`,
|
|
162
|
+
parameters: toToolParameters(normalizeDirectToolInputSchema(spec.inputSchema)),
|
|
163
|
+
execute: createDirectToolExecutor(() => state, () => initPromise, spec),
|
|
164
|
+
renderShell: toolRenderShell,
|
|
165
|
+
renderCall: createMcpDirectToolCallRenderer(spec.prefixedName, toolRenderOptions),
|
|
166
|
+
renderResult: renderMcpToolResult,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function resolveCurrentDirectTools(config: McpConfig, cache: MetadataCache | null): DirectToolSpec[] {
|
|
171
|
+
if (envRaw === "__none__") return [];
|
|
172
|
+
const prefix = config.settings?.toolPrefix ?? "server";
|
|
173
|
+
return resolveDirectTools(config, cache, prefix, envDirectToolOverride);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function getActiveToolsIfReady(): string[] | undefined {
|
|
177
|
+
try {
|
|
178
|
+
return pi.getActiveTools?.();
|
|
179
|
+
} catch (error) {
|
|
180
|
+
if (error instanceof Error
|
|
181
|
+
&& error.message.includes("Action methods cannot be called during extension loading")) return undefined;
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function deactivateTools(toolNames: string[]): string[] {
|
|
187
|
+
if (toolNames.length === 0) return [];
|
|
188
|
+
const unregisterTool = (pi as ExtensionAPI & { unregisterTool?: (name: string) => boolean }).unregisterTool;
|
|
189
|
+
const unregistered = toolNames.filter((toolName) => unregisterTool?.(toolName) === true);
|
|
190
|
+
const fallbackNames = toolNames.filter((toolName) => !unregistered.includes(toolName));
|
|
191
|
+
const remove = new Set(toolNames);
|
|
192
|
+
const activeTools = getActiveToolsIfReady();
|
|
193
|
+
if (!activeTools || activeTools.length === 0) {
|
|
194
|
+
for (const toolName of fallbackNames) fallbackDeactivatedTools.add(toolName);
|
|
195
|
+
return unregistered;
|
|
196
|
+
}
|
|
197
|
+
const nextActiveTools = activeTools.filter((name) => !remove.has(name));
|
|
198
|
+
if (nextActiveTools.length !== activeTools.length) {
|
|
199
|
+
for (const toolName of fallbackNames) fallbackDeactivatedTools.add(toolName);
|
|
200
|
+
pi.setActiveTools(nextActiveTools);
|
|
201
|
+
}
|
|
202
|
+
return unregistered;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function syncDirectTools(config: McpConfig, cache: MetadataCache | null): {
|
|
206
|
+
specs: DirectToolSpec[];
|
|
207
|
+
added: string[];
|
|
208
|
+
updated: string[];
|
|
209
|
+
deactivated: string[];
|
|
210
|
+
} {
|
|
211
|
+
const specs = resolveCurrentDirectTools(config, cache);
|
|
212
|
+
const nextNames = new Set(specs.map((spec) => spec.prefixedName));
|
|
213
|
+
const added: string[] = [];
|
|
214
|
+
const updated: string[] = [];
|
|
215
|
+
const deactivated: string[] = [];
|
|
216
|
+
|
|
217
|
+
for (const spec of specs) {
|
|
218
|
+
const fingerprint = directToolFingerprint(spec);
|
|
219
|
+
const previous = registeredDirectTools.get(spec.prefixedName);
|
|
220
|
+
if (previous !== fingerprint) {
|
|
221
|
+
registerDirectTool(spec);
|
|
222
|
+
registeredDirectTools.set(spec.prefixedName, fingerprint);
|
|
223
|
+
if (fallbackDeactivatedTools.delete(spec.prefixedName)) {
|
|
224
|
+
const activeTools = getActiveToolsIfReady();
|
|
225
|
+
if (activeTools && !activeTools.includes(spec.prefixedName)) {
|
|
226
|
+
pi.setActiveTools([...activeTools, spec.prefixedName]);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
(previous ? updated : added).push(spec.prefixedName);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
for (const toolName of [...registeredDirectTools.keys()]) {
|
|
234
|
+
if (nextNames.has(toolName)) continue;
|
|
235
|
+
registeredDirectTools.delete(toolName);
|
|
236
|
+
deactivated.push(toolName);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
deactivateTools(deactivated);
|
|
240
|
+
return { specs, added, updated, deactivated };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function applyDirectToolConfigChanges(changes: Map<string, true | string[] | false>): void {
|
|
244
|
+
if (!state) return;
|
|
245
|
+
for (const [serverName, value] of changes) {
|
|
246
|
+
const definition = state.config.mcpServers[serverName];
|
|
247
|
+
if (!definition) continue;
|
|
248
|
+
state.config.mcpServers[serverName] = { ...definition, directTools: value };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function syncToolSurface(ctx?: ExtensionContext): void {
|
|
253
|
+
const config = state?.config ?? earlyConfig;
|
|
254
|
+
const cache = loadMetadataCache();
|
|
255
|
+
const result = syncDirectTools(config, cache);
|
|
256
|
+
syncProxyTool(config, cache, result.specs);
|
|
257
|
+
const changed = result.added.length + result.updated.length + result.deactivated.length;
|
|
258
|
+
if (changed > 0 && ctx?.hasUI) {
|
|
259
|
+
ctx.ui.notify(
|
|
260
|
+
`MCP: direct tools refreshed (+${result.added.length}, ~${result.updated.length}, -${result.deactivated.length})`,
|
|
261
|
+
"info",
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const registeredPromptCommands = new Set<string>();
|
|
267
|
+
|
|
268
|
+
function registerPromptCommands(specs: Iterable<PromptMetadata>): void {
|
|
269
|
+
for (const spec of specs) {
|
|
270
|
+
if (registeredPromptCommands.has(spec.commandName)) {
|
|
271
|
+
logger.debug(`MCP: prompt "${spec.originalName}" on ${spec.serverName} skipped; /${spec.commandName} is already registered`);
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
registeredPromptCommands.add(spec.commandName);
|
|
275
|
+
pi.registerCommand(spec.commandName, createPromptCommand(pi, () => state, spec));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function syncPromptCommands(): void {
|
|
280
|
+
registerPromptCommands([...(state?.promptMetadata?.values() ?? [])].flat());
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
registerPromptCommands(resolveCachedPrompts(earlyConfig));
|
|
284
|
+
|
|
285
|
+
const getPiTools = (): ToolInfo[] => pi.getAllTools();
|
|
286
|
+
|
|
287
|
+
pi.registerFlag("mcp-config", {
|
|
288
|
+
description: "Path to MCP config file",
|
|
289
|
+
type: "string",
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
function startInitialization(ctx: ExtensionContext, owner: McpRuntimeOwner, oauthRuntime: McpOAuthRuntime, generation: number, staleReason: string): Promise<void> {
|
|
293
|
+
owner.addCleanup(() => cleanupMaterializedBinaryResources(owner.signal));
|
|
294
|
+
const promise = initializeMcp(pi, ctx, owner, {
|
|
295
|
+
...(programmaticConfig || options.configPath !== undefined
|
|
296
|
+
? {
|
|
297
|
+
...(earlyConfigPath !== undefined ? { configPath: earlyConfigPath } : {}),
|
|
298
|
+
...(sessionConfig !== undefined ? { config: sessionConfig } : {}),
|
|
299
|
+
}
|
|
300
|
+
: {}),
|
|
301
|
+
oauthRuntime,
|
|
302
|
+
statusEvents: pi.events,
|
|
303
|
+
});
|
|
304
|
+
initPromise = promise;
|
|
305
|
+
|
|
306
|
+
return promise.then(async (nextState) => {
|
|
307
|
+
if (!owner.isActive() || generation !== lifecycleGeneration || initPromise !== promise) {
|
|
308
|
+
try {
|
|
309
|
+
await shutdownState(nextState, staleReason);
|
|
310
|
+
} catch (error) {
|
|
311
|
+
console.error(`MCP: failed to clean stale initialization state: ${formatTerminalError(error)}`);
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
state = nextState;
|
|
317
|
+
nextState.onToolMetadataUpdated = (_serverName, _reason) => {
|
|
318
|
+
if (state !== nextState || !owner.isActive()) return;
|
|
319
|
+
syncPromptCommands();
|
|
320
|
+
if (directToolsFrozen) {
|
|
321
|
+
logger.debug(`MCP: metadata update for ${_serverName} (${_reason}) skipped — directTools frozen`);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
syncToolSurface(ctx);
|
|
325
|
+
};
|
|
326
|
+
syncPromptCommands();
|
|
327
|
+
syncToolSurface(ctx);
|
|
328
|
+
updateStatusBar(nextState);
|
|
329
|
+
initPromise = null;
|
|
330
|
+
if (earlyConfig.settings?.freezeDirectTools === true) {
|
|
331
|
+
directToolsFrozen = true;
|
|
332
|
+
logger.info("MCP: direct tools frozen after initial sync — reconnects won't rebuild the system prompt; use mcp({ connect: \"server\" }) to rediscover");
|
|
333
|
+
}
|
|
334
|
+
}).catch(async err => {
|
|
335
|
+
if (!owner.isActive() || generation !== lifecycleGeneration) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
if (initPromise !== promise && initPromise !== null) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
console.error(`MCP initialization failed: ${formatTerminalError(err)}`);
|
|
342
|
+
initPromise = null;
|
|
343
|
+
if (state) return;
|
|
344
|
+
|
|
345
|
+
try {
|
|
346
|
+
await Promise.all([
|
|
347
|
+
owner.stop("MCP initialization failed"),
|
|
348
|
+
shutdownOAuth(oauthRuntime),
|
|
349
|
+
]);
|
|
350
|
+
} catch (error) {
|
|
351
|
+
console.error(`MCP: failed to clean rejected initialization: ${formatTerminalError(error)}`);
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function startLoadTimeInitialization(): void {
|
|
357
|
+
const hasStartupServer = Object.values(earlyConfig.mcpServers).some((definition) => {
|
|
358
|
+
if (definition.disabled === true) return false;
|
|
359
|
+
return definition.lifecycle === "eager" || definition.lifecycle === "keep-alive";
|
|
360
|
+
});
|
|
361
|
+
if (!hasStartupServer) return;
|
|
362
|
+
setImmediate(() => {
|
|
363
|
+
if (lifecycleGeneration !== 0 || state || initPromise) return;
|
|
364
|
+
const generation = ++lifecycleGeneration;
|
|
365
|
+
const owner = createMcpRuntimeOwner();
|
|
366
|
+
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
367
|
+
currentOwner = owner;
|
|
368
|
+
currentOAuthRuntime = oauthRuntime;
|
|
369
|
+
startInitialization({
|
|
370
|
+
mode: "print",
|
|
371
|
+
hasUI: false,
|
|
372
|
+
cwd: process.cwd(),
|
|
373
|
+
model: undefined,
|
|
374
|
+
modelRegistry: undefined,
|
|
375
|
+
signal: undefined,
|
|
376
|
+
} as unknown as ExtensionContext, owner, oauthRuntime, generation, "stale_load_time_initialization");
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
381
|
+
const generation = ++lifecycleGeneration;
|
|
382
|
+
const previousState = state;
|
|
383
|
+
const previousOwner = currentOwner;
|
|
384
|
+
const previousOAuthRuntime = currentOAuthRuntime;
|
|
385
|
+
const owner = createMcpRuntimeOwner();
|
|
386
|
+
const oauthRuntime = createOAuthRuntime(owner.signal);
|
|
387
|
+
currentOwner = owner;
|
|
388
|
+
currentOAuthRuntime = oauthRuntime;
|
|
389
|
+
state = null;
|
|
390
|
+
initPromise = null;
|
|
391
|
+
|
|
392
|
+
// Abort synchronously before awaiting cleanup so old callbacks and startup
|
|
393
|
+
// work cannot resume into a stale ExtensionContext.
|
|
394
|
+
const stopPrevious = previousOwner?.stop("MCP extension session restarted") ?? Promise.resolve();
|
|
395
|
+
try {
|
|
396
|
+
await Promise.all([
|
|
397
|
+
stopPrevious,
|
|
398
|
+
shutdownState(previousState, "session_restart"),
|
|
399
|
+
previousOAuthRuntime ? shutdownOAuth(previousOAuthRuntime) : Promise.resolve(),
|
|
400
|
+
]);
|
|
401
|
+
} catch (error) {
|
|
402
|
+
console.error(`MCP: failed to shut down previous session state: ${formatTerminalError(error)}`);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
if (generation !== lifecycleGeneration || !owner.isActive()) return;
|
|
406
|
+
|
|
407
|
+
const initialization = startInitialization(ctx, owner, oauthRuntime, generation, "stale_session_start");
|
|
408
|
+
if (envRaw !== undefined && envRaw !== "__none__") {
|
|
409
|
+
const missingEnvDirectTools = getMissingConfiguredDirectToolServers(
|
|
410
|
+
earlyConfig,
|
|
411
|
+
loadMetadataCache(),
|
|
412
|
+
envDirectToolOverride,
|
|
413
|
+
);
|
|
414
|
+
if (missingEnvDirectTools.length > 0) {
|
|
415
|
+
await initialization;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
pi.on("session_shutdown", async () => {
|
|
421
|
+
++lifecycleGeneration;
|
|
422
|
+
const currentState = state;
|
|
423
|
+
const owner = currentOwner;
|
|
424
|
+
const oauthRuntime = currentOAuthRuntime;
|
|
425
|
+
currentOwner = null;
|
|
426
|
+
currentOAuthRuntime = null;
|
|
427
|
+
state = null;
|
|
428
|
+
initPromise = null;
|
|
429
|
+
|
|
430
|
+
// Abort before awaiting cleanup so delayed initialization cannot touch stale
|
|
431
|
+
// Pi context after session shutdown.
|
|
432
|
+
const stopOwner = owner?.stop("MCP extension session shutdown") ?? Promise.resolve();
|
|
433
|
+
try {
|
|
434
|
+
await Promise.all([
|
|
435
|
+
stopOwner,
|
|
436
|
+
shutdownState(currentState, "session_shutdown"),
|
|
437
|
+
oauthRuntime ? shutdownOAuth(oauthRuntime) : Promise.resolve(),
|
|
438
|
+
]);
|
|
439
|
+
} catch (error) {
|
|
440
|
+
console.error(`MCP: session shutdown cleanup failed: ${formatTerminalError(error)}`);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
// Re-flag returned MCP tool failures so pi registers them as errors (see toolErrorOverride).
|
|
445
|
+
pi.on("tool_result", (event) => toolErrorOverride(event.details));
|
|
446
|
+
|
|
447
|
+
pi.registerCommand("mcp", {
|
|
448
|
+
description: "Show MCP server status",
|
|
449
|
+
getArgumentCompletions: (prefix: string) => {
|
|
450
|
+
const normalized = prefix.trimStart();
|
|
451
|
+
const argumentMatch = normalized.match(/^(\S+)\s+(.*)$/);
|
|
452
|
+
if (!argumentMatch) {
|
|
453
|
+
const subcommands = [
|
|
454
|
+
{ value: "reconnect", label: "reconnect — Reconnect servers" },
|
|
455
|
+
{ value: "tools", label: "tools — List all tools" },
|
|
456
|
+
{ value: "prompts", label: "prompts — List all MCP prompts" },
|
|
457
|
+
{ value: "setup", label: "setup — Configure MCP servers" },
|
|
458
|
+
{ value: "logout", label: "logout — Clear server credentials" },
|
|
459
|
+
{ value: "disable", label: "disable — Disable a server" },
|
|
460
|
+
{ value: "enable", label: "enable — Enable a server" },
|
|
461
|
+
{ value: "status", label: "status — Show server status" },
|
|
462
|
+
].filter(({ value }) => value.startsWith(normalized));
|
|
463
|
+
return subcommands.length > 0 ? subcommands : null;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
const [, subcommand, argumentPrefix] = argumentMatch;
|
|
467
|
+
if (
|
|
468
|
+
(subcommand !== "reconnect" && subcommand !== "logout" && subcommand !== "disable" && subcommand !== "enable")
|
|
469
|
+
|| argumentPrefix === undefined
|
|
470
|
+
|| !state
|
|
471
|
+
) return null;
|
|
472
|
+
|
|
473
|
+
const servers = Object.keys(state.config.mcpServers)
|
|
474
|
+
.filter((serverName) => serverName.startsWith(argumentPrefix.trimStart()))
|
|
475
|
+
.map((serverName) => ({ value: `${subcommand} ${serverName}`, label: serverName }));
|
|
476
|
+
return servers.length > 0 ? servers : null;
|
|
477
|
+
},
|
|
478
|
+
handler: async (args, ctx) => {
|
|
479
|
+
const commandOwner = currentOwner;
|
|
480
|
+
const commandReload = typeof ctx.reload === "function" ? ctx.reload.bind(ctx) : async () => {};
|
|
481
|
+
const commandHasUI = ctx.hasUI;
|
|
482
|
+
const commandCtx = {
|
|
483
|
+
hasUI: commandHasUI,
|
|
484
|
+
ui: commandHasUI
|
|
485
|
+
? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui
|
|
486
|
+
: undefined,
|
|
487
|
+
cwd: ctx.cwd,
|
|
488
|
+
mode: ctx.mode,
|
|
489
|
+
signal: commandOwner?.signal ?? ctx.signal,
|
|
490
|
+
} as unknown as ExtensionContext;
|
|
491
|
+
if (!state && initPromise) {
|
|
492
|
+
try {
|
|
493
|
+
const initialized = await initPromise;
|
|
494
|
+
commandOwner?.throwIfInactive();
|
|
495
|
+
state = initialized;
|
|
496
|
+
} catch (error) {
|
|
497
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
498
|
+
if (commandCtx.hasUI) commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
if (!state) {
|
|
503
|
+
if (commandCtx.hasUI) commandCtx.ui?.notify("MCP not initialized", "error");
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const parts = args?.trim()?.split(/\s+/) ?? [];
|
|
508
|
+
const subcommand = parts[0] ?? "";
|
|
509
|
+
const targetServer = parts[1];
|
|
510
|
+
const rest = parts.slice(1).join(" ");
|
|
511
|
+
|
|
512
|
+
switch (subcommand) {
|
|
513
|
+
case "reconnect":
|
|
514
|
+
commandOwner?.throwIfInactive();
|
|
515
|
+
await reconnectServers(state, commandCtx, targetServer);
|
|
516
|
+
if (directToolsFrozen) syncToolSurface(commandCtx);
|
|
517
|
+
break;
|
|
518
|
+
case "tools":
|
|
519
|
+
await showTools(state, commandCtx);
|
|
520
|
+
break;
|
|
521
|
+
case "prompts":
|
|
522
|
+
await showPrompts(state, commandCtx);
|
|
523
|
+
break;
|
|
524
|
+
case "setup": {
|
|
525
|
+
commandOwner?.throwIfInactive();
|
|
526
|
+
if (programmaticConfig) {
|
|
527
|
+
commandCtx.ui?.notify("MCP setup is unavailable when config is supplied by createMcpAdapter().", "info");
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
const result = await openMcpSetup(state, pi, commandCtx, earlyConfigPath, "setup");
|
|
531
|
+
if (result?.configChanged) {
|
|
532
|
+
commandOwner?.throwIfInactive();
|
|
533
|
+
await commandReload();
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
case "logout": {
|
|
539
|
+
const serverName = rest;
|
|
540
|
+
if (!serverName) {
|
|
541
|
+
if (commandCtx.hasUI) commandCtx.ui?.notify("Usage: /mcp logout <server>", "error");
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
commandOwner?.throwIfInactive();
|
|
545
|
+
await logoutServer(serverName, state, commandCtx);
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
case "disable":
|
|
549
|
+
case "enable": {
|
|
550
|
+
const serverName = rest;
|
|
551
|
+
if (programmaticConfig) {
|
|
552
|
+
commandCtx.ui?.notify(`/mcp ${subcommand} is unavailable when config is supplied by createMcpAdapter().`, "info");
|
|
553
|
+
break;
|
|
554
|
+
}
|
|
555
|
+
if (!serverName) {
|
|
556
|
+
commandCtx.ui?.notify(`Usage: /mcp ${subcommand} <server>`, "error");
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
559
|
+
if (!state.config.mcpServers[serverName]) {
|
|
560
|
+
commandCtx.ui?.notify(`Server "${serverName}" not found in effective config`, "error");
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
commandOwner?.throwIfInactive();
|
|
564
|
+
const result = writeProjectServerDisabledOverride(earlyConfigPath, commandCtx.cwd, serverName, subcommand === "disable");
|
|
565
|
+
if (result.changed) {
|
|
566
|
+
commandCtx.ui?.notify(`${subcommand === "disable" ? "Disabled" : "Enabled"} server "${serverName}" in ${result.path} — run /reload to apply`, "info");
|
|
567
|
+
} else {
|
|
568
|
+
commandCtx.ui?.notify(`Server "${serverName}" is already ${subcommand === "disable" ? "disabled" : "enabled"}`, "info");
|
|
569
|
+
}
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
case "status":
|
|
573
|
+
case "":
|
|
574
|
+
default:
|
|
575
|
+
if (commandCtx.hasUI) {
|
|
576
|
+
commandOwner?.throwIfInactive();
|
|
577
|
+
if (programmaticConfig) {
|
|
578
|
+
commandCtx.ui?.notify("MCP status is shown from the in-memory SDK config; configuration discovery is unavailable.", "info");
|
|
579
|
+
await showStatus(state, commandCtx);
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
const result = await openMcpPanel(state, pi, commandCtx, earlyConfigPath, (changes) => {
|
|
583
|
+
applyDirectToolConfigChanges(changes);
|
|
584
|
+
syncToolSurface(commandCtx);
|
|
585
|
+
});
|
|
586
|
+
if (result?.configChanged) {
|
|
587
|
+
commandOwner?.throwIfInactive();
|
|
588
|
+
await commandReload();
|
|
589
|
+
return;
|
|
590
|
+
}
|
|
591
|
+
} else {
|
|
592
|
+
await showStatus(state, commandCtx);
|
|
593
|
+
}
|
|
594
|
+
break;
|
|
595
|
+
}
|
|
596
|
+
},
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
pi.registerCommand("mcp-auth", {
|
|
600
|
+
description: "Authenticate with an MCP server (OAuth)",
|
|
601
|
+
handler: async (args, ctx) => {
|
|
602
|
+
const commandOwner = currentOwner;
|
|
603
|
+
const commandHasUI = ctx.hasUI;
|
|
604
|
+
const commandCtx = {
|
|
605
|
+
hasUI: commandHasUI,
|
|
606
|
+
ui: commandHasUI
|
|
607
|
+
? commandOwner ? createOwnedUi(ctx.ui, commandOwner) : ctx.ui
|
|
608
|
+
: undefined,
|
|
609
|
+
cwd: ctx.cwd,
|
|
610
|
+
mode: ctx.mode,
|
|
611
|
+
signal: commandOwner?.signal ?? ctx.signal,
|
|
612
|
+
} as unknown as ExtensionContext;
|
|
613
|
+
const serverName = args?.trim();
|
|
614
|
+
if (!serverName && !commandCtx.hasUI) {
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
if (!state && initPromise) {
|
|
619
|
+
try {
|
|
620
|
+
const initialized = await initPromise;
|
|
621
|
+
commandOwner?.throwIfInactive();
|
|
622
|
+
state = initialized;
|
|
623
|
+
} catch (error) {
|
|
624
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
625
|
+
if (commandCtx.hasUI) commandCtx.ui?.notify(`MCP initialization failed: ${message}`, "error");
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
if (!state) {
|
|
630
|
+
if (commandCtx.hasUI) commandCtx.ui?.notify("MCP not initialized", "error");
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (!serverName) {
|
|
635
|
+
if (programmaticConfig) {
|
|
636
|
+
commandCtx.ui?.notify("Use /mcp-auth <server> to authenticate a server from the in-memory SDK config.", "info");
|
|
637
|
+
return;
|
|
638
|
+
}
|
|
639
|
+
await openMcpAuthPanel(state, pi, commandCtx, earlyConfigPath);
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
const result = await authenticateServer(serverName, state.config, commandCtx, commandCtx.signal, state.oauthRuntime);
|
|
644
|
+
if (result.ok) {
|
|
645
|
+
commandOwner?.throwIfInactive();
|
|
646
|
+
await reconnectServer(state, commandCtx, serverName);
|
|
647
|
+
}
|
|
648
|
+
},
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
if (earlyConfig.settings?.scriptMode !== false) {
|
|
652
|
+
(pi.registerTool as (tool: unknown) => unknown)({
|
|
653
|
+
name: "mcpScript",
|
|
654
|
+
label: "MCP Script",
|
|
655
|
+
description: "Run trusted JavaScript that makes multiple MCP tool calls in one request — loop, filter, chain, or fan out between calls. For a single MCP call, search, describe, status check, or auth action, use the mcp tool instead. Discover with await tools.search({ query }) — resolves to { items: [{ path, name, server, description? }], total, hasMore, nextOffset }, not an { ok, data } envelope. Inspect with await tools.describe({ path }) — resolves to the tool descriptor with inputTypeScript, or { path, error: { code, message, suggestions } }. Then call tools.call(path, args) — resolves to { ok: true, data } or { ok: false, error: { code, message } } — or use direct flat calls when the name is already known; use emit(value) for user-visible output. Load the mcp-scripting skill for the full workflow guide.",
|
|
656
|
+
promptSnippet: "Batch multiple MCP tool calls in one JavaScript request (loop, filter, chain)",
|
|
657
|
+
parameters: Type.Object({
|
|
658
|
+
code: Type.String({ description: "Trusted JavaScript MCP script. Use tools.<prefixedToolName>(args) and emit(value)." }),
|
|
659
|
+
timeoutMs: optionalNumber({ minimum: 1, description: "Execution timeout in milliseconds (default: 30000)" }),
|
|
660
|
+
}),
|
|
661
|
+
renderResult: renderMcpToolResult,
|
|
662
|
+
async execute(_toolCallId: string, params: { code: string; timeoutMs?: number }, signal: AbortSignal | undefined) {
|
|
663
|
+
const executeOwner = currentOwner;
|
|
664
|
+
if (!state && initPromise) {
|
|
665
|
+
try {
|
|
666
|
+
const initialized = await awaitWithTimeout(initPromise, INIT_WAIT_TIMEOUT_MS);
|
|
667
|
+
if (initialized === INIT_WAIT_TIMED_OUT) {
|
|
668
|
+
return {
|
|
669
|
+
content: [{ type: "text" as const, text: "MCP initialization is still in progress. Try again shortly." }],
|
|
670
|
+
details: { mode: "script", error: "init_timeout", timeoutMs: INIT_WAIT_TIMEOUT_MS },
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
executeOwner?.throwIfInactive();
|
|
674
|
+
state = initialized;
|
|
675
|
+
} catch (error) {
|
|
676
|
+
if (executeOwner && isAbortError(error, executeOwner.signal)) throw error;
|
|
677
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
678
|
+
return {
|
|
679
|
+
content: [{ type: "text" as const, text: `MCP initialization failed: ${message}` }],
|
|
680
|
+
details: { mode: "script", error: "init_failed", message },
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
if (!state) {
|
|
685
|
+
return {
|
|
686
|
+
content: [{ type: "text" as const, text: "MCP not initialized" }],
|
|
687
|
+
details: { mode: "script", error: "not_initialized" },
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
executeOwner?.throwIfInactive();
|
|
691
|
+
return runMcpScript(state, params.code, params.timeoutMs, getPiTools, signal);
|
|
692
|
+
},
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
function registerProxyTool(description: string): void {
|
|
697
|
+
(pi.registerTool as (tool: unknown) => unknown)({
|
|
698
|
+
name: "mcp",
|
|
699
|
+
label: "MCP",
|
|
700
|
+
description,
|
|
701
|
+
promptSnippet: "MCP gateway — status, search, describe, auth, and single MCP tool calls",
|
|
702
|
+
renderShell: toolRenderShell,
|
|
703
|
+
renderCall: createMcpProxyToolCallRenderer(toolRenderOptions),
|
|
704
|
+
parameters: Type.Object({
|
|
705
|
+
tool: Type.Optional(Type.String({ description: "Tool name to call (e.g., 'xcodebuild_list_sims')" })),
|
|
706
|
+
args: Type.Optional(Type.Union([
|
|
707
|
+
Type.String({ description: "Arguments as a JSON string (e.g., '{\"key\": \"value\"}')" }),
|
|
708
|
+
Type.Object({}, {
|
|
709
|
+
additionalProperties: true,
|
|
710
|
+
description: 'Arguments as a JSON object (e.g., { "key": "value" })',
|
|
711
|
+
}),
|
|
712
|
+
], { description: "Tool arguments as a JSON object, or as a JSON string encoding one" })),
|
|
713
|
+
connect: Type.Optional(Type.String({ description: "Server name to connect (lazy connect + metadata refresh)" })),
|
|
714
|
+
describe: Type.Optional(Type.String({ description: "Tool name to describe (shows parameters)" })),
|
|
715
|
+
instructions: Type.Optional(Type.String({ description: "Server name to show that server's usage instructions" })),
|
|
716
|
+
search: Type.Optional(Type.String({ description: "Search tools by name/description" })),
|
|
717
|
+
regex: Type.Optional(Type.Boolean({ description: "Treat search as regex (default: substring match)" })),
|
|
718
|
+
includeSchemas: Type.Optional(Type.Boolean({ description: "Include parameter schemas in search results (default: true)" })),
|
|
719
|
+
limit: optionalNumber({ minimum: 1, description: "Maximum search results to return (default: 12)" }),
|
|
720
|
+
offset: optionalNumber({ minimum: 0, description: "Search result offset (default: 0)" }),
|
|
721
|
+
server: Type.Optional(Type.String({ description: "Filter to specific server (also disambiguates tool calls)" })),
|
|
722
|
+
action: Type.Optional(Type.String({ description: "Action: 'ui-messages', 'auth-start', or 'auth-complete'" })),
|
|
723
|
+
}),
|
|
724
|
+
renderResult: renderMcpToolResult,
|
|
725
|
+
async execute(_toolCallId: string, params: {
|
|
726
|
+
tool?: string;
|
|
727
|
+
args?: string | Record<string, unknown>;
|
|
728
|
+
connect?: string;
|
|
729
|
+
describe?: string;
|
|
730
|
+
instructions?: string;
|
|
731
|
+
search?: string;
|
|
732
|
+
regex?: boolean;
|
|
733
|
+
includeSchemas?: boolean;
|
|
734
|
+
limit?: number;
|
|
735
|
+
offset?: number;
|
|
736
|
+
server?: string;
|
|
737
|
+
action?: string;
|
|
738
|
+
}, signal: AbortSignal | undefined, _onUpdate: AgentToolUpdateCallback<Record<string, unknown>> | undefined, _ctx: ExtensionContext) {
|
|
739
|
+
const executeOwner = currentOwner;
|
|
740
|
+
let parsedArgs: Record<string, unknown> | undefined;
|
|
741
|
+
if (params.args !== undefined && params.args !== "") {
|
|
742
|
+
let args: unknown;
|
|
743
|
+
if (typeof params.args === "string") {
|
|
744
|
+
try {
|
|
745
|
+
args = JSON.parse(params.args);
|
|
746
|
+
} catch (error) {
|
|
747
|
+
if (error instanceof SyntaxError) {
|
|
748
|
+
throw new Error(`Invalid args JSON: ${error.message}`, { cause: error });
|
|
749
|
+
}
|
|
750
|
+
throw error;
|
|
751
|
+
}
|
|
752
|
+
} else {
|
|
753
|
+
args = params.args;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
if (typeof args !== "object" || args === null || Array.isArray(args)) {
|
|
757
|
+
const gotType = Array.isArray(args) ? "array" : args === null ? "null" : typeof args;
|
|
758
|
+
throw new Error(`Invalid args: expected a JSON object, got ${gotType}`);
|
|
759
|
+
}
|
|
760
|
+
parsedArgs = args as Record<string, unknown>;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
if (!state && initPromise) {
|
|
764
|
+
try {
|
|
765
|
+
const initialized = await awaitWithTimeout(initPromise, INIT_WAIT_TIMEOUT_MS);
|
|
766
|
+
if (initialized === INIT_WAIT_TIMED_OUT) {
|
|
767
|
+
return {
|
|
768
|
+
content: [{ type: "text" as const, text: "MCP initialization is still in progress. Try again shortly." }],
|
|
769
|
+
details: { error: "init_timeout", timeoutMs: INIT_WAIT_TIMEOUT_MS },
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
executeOwner?.throwIfInactive();
|
|
773
|
+
state = initialized;
|
|
774
|
+
} catch (error) {
|
|
775
|
+
if (executeOwner && isAbortError(error, executeOwner.signal)) throw error;
|
|
776
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
777
|
+
return {
|
|
778
|
+
content: [{ type: "text" as const, text: `MCP initialization failed: ${message}` }],
|
|
779
|
+
details: { error: "init_failed", message },
|
|
780
|
+
};
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (!state) {
|
|
784
|
+
return {
|
|
785
|
+
content: [{ type: "text" as const, text: "MCP not initialized" }],
|
|
786
|
+
details: { error: "not_initialized" },
|
|
787
|
+
};
|
|
788
|
+
}
|
|
789
|
+
executeOwner?.throwIfInactive();
|
|
790
|
+
|
|
791
|
+
if (params.action === "ui-messages") {
|
|
792
|
+
return executeUiMessages(state);
|
|
793
|
+
}
|
|
794
|
+
if (params.action === "auth-start") {
|
|
795
|
+
if (!params.server) {
|
|
796
|
+
return {
|
|
797
|
+
content: [{ type: "text" as const, text: "auth-start requires `server`. Example: mcp({ action: \"auth-start\", server: \"linear-server\" })" }],
|
|
798
|
+
details: { mode: "auth-start", error: "missing_server" },
|
|
799
|
+
};
|
|
800
|
+
}
|
|
801
|
+
return signal
|
|
802
|
+
? executeAuthStart(state, params.server, signal)
|
|
803
|
+
: executeAuthStart(state, params.server);
|
|
804
|
+
}
|
|
805
|
+
if (params.action === "auth-complete") {
|
|
806
|
+
if (!params.server) {
|
|
807
|
+
return {
|
|
808
|
+
content: [{ type: "text" as const, text: "auth-complete requires `server`." }],
|
|
809
|
+
details: { mode: "auth-complete", error: "missing_server" },
|
|
810
|
+
};
|
|
811
|
+
}
|
|
812
|
+
const input = parsedArgs?.redirectUrl ?? parsedArgs?.code ?? parsedArgs?.input;
|
|
813
|
+
if (typeof input !== "string" || input.trim().length === 0) {
|
|
814
|
+
return {
|
|
815
|
+
content: [{ type: "text" as const, text: "auth-complete requires args with `redirectUrl`, `code`, or `input`." }],
|
|
816
|
+
details: { mode: "auth-complete", error: "missing_input" },
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
return signal
|
|
820
|
+
? executeAuthComplete(state, params.server, input, signal)
|
|
821
|
+
: executeAuthComplete(state, params.server, input);
|
|
822
|
+
}
|
|
823
|
+
if (params.tool) {
|
|
824
|
+
return executeCall(state, params.tool, parsedArgs, params.server, getPiTools, signal);
|
|
825
|
+
}
|
|
826
|
+
if (params.connect) {
|
|
827
|
+
const result = await executeConnect(state, params.connect, signal);
|
|
828
|
+
syncToolSurface(_ctx as ExtensionContext);
|
|
829
|
+
return result;
|
|
830
|
+
}
|
|
831
|
+
if (params.describe) {
|
|
832
|
+
return executeDescribe(state, params.describe);
|
|
833
|
+
}
|
|
834
|
+
if (params.instructions) {
|
|
835
|
+
return executeInstructions(state, params.instructions);
|
|
836
|
+
}
|
|
837
|
+
if (params.search !== undefined) {
|
|
838
|
+
return executeSearch(state, params.search, params.regex, params.server, params.includeSchemas, params.limit, params.offset);
|
|
839
|
+
}
|
|
840
|
+
if (params.server) {
|
|
841
|
+
return executeList(state, params.server);
|
|
842
|
+
}
|
|
843
|
+
return executeStatus(state);
|
|
844
|
+
},
|
|
845
|
+
});
|
|
846
|
+
proxyToolRegistered = true;
|
|
847
|
+
proxyToolDescription = description;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
function syncProxyTool(config: McpConfig, cache: MetadataCache | null, directSpecs: DirectToolSpec[]): void {
|
|
851
|
+
const missingConfiguredDirectToolServers = getMissingConfiguredDirectToolServers(
|
|
852
|
+
config,
|
|
853
|
+
cache,
|
|
854
|
+
envRaw === undefined || envRaw === "__none__" ? undefined : envDirectToolOverride,
|
|
855
|
+
);
|
|
856
|
+
const shouldRegisterProxyTool =
|
|
857
|
+
config.settings?.disableProxyTool !== true
|
|
858
|
+
|| directSpecs.length === 0
|
|
859
|
+
|| missingConfiguredDirectToolServers.length > 0;
|
|
860
|
+
|
|
861
|
+
if (shouldRegisterProxyTool) {
|
|
862
|
+
const description = buildProxyDescription(config, cache, directSpecs);
|
|
863
|
+
if (!proxyToolRegistered || proxyToolDescription !== description) {
|
|
864
|
+
registerProxyTool(description);
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
const activeTools = getActiveToolsIfReady();
|
|
868
|
+
if (activeTools && !activeTools.includes("mcp")) {
|
|
869
|
+
pi.setActiveTools([...activeTools, "mcp"]);
|
|
870
|
+
}
|
|
871
|
+
return;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
if (proxyToolRegistered) {
|
|
875
|
+
const unregistered = deactivateTools(["mcp"]);
|
|
876
|
+
if (unregistered.includes("mcp")) {
|
|
877
|
+
proxyToolRegistered = false;
|
|
878
|
+
proxyToolDescription = null;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
const initialDirectTools = syncDirectTools(earlyConfig, earlyCache).specs;
|
|
884
|
+
syncProxyTool(earlyConfig, earlyCache, initialDirectTools);
|
|
885
|
+
startLoadTimeInitialization();
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
export function createMcpAdapter(options: McpAdapterOptions = {}) {
|
|
889
|
+
const factoryConfig = options.config !== undefined ? cloneMcpConfig(options.config) : undefined;
|
|
890
|
+
return function mcpAdapter(pi: ExtensionAPI) {
|
|
891
|
+
installMcpAdapter(pi, {
|
|
892
|
+
...(options.configPath !== undefined ? { configPath: options.configPath } : {}),
|
|
893
|
+
...(factoryConfig !== undefined ? { config: cloneMcpConfig(factoryConfig) } : {}),
|
|
894
|
+
});
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
export default createMcpAdapter();
|