@akon-labs/nexus-cli 0.1.9 → 0.1.10
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.js +20263 -2158
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -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/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/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/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 +4 -2
- package/dist/extensions/gitnexus/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 +27 -0
- package/dist/extensions/mcp/commands.d.ts.map +1 -0
- package/dist/extensions/mcp/commands.js +629 -0
- package/dist/extensions/mcp/commands.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +121 -38
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +1030 -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 +1064 -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 +85 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-setup-panel.js +618 -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 +61 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +177 -4
- package/dist/extensions/subagent/index.js.map +1 -1
- 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 +20057 -1947
- 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/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +7 -5
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +20263 -2158
- package/dist/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/vendor/ai.js +280 -205
- 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/npm-shrinkwrap.json +763 -6
- package/package.json +15 -4
- 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":"proxy-modes.js","sourceRoot":"","sources":["../../../src/extensions/mcp/proxy-modes.ts"],"names":[],"mappings":"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","sourcesContent":["import { type CallToolResult, type Client, UrlElicitationRequiredError } from \"@modelcontextprotocol/client\";\nimport { checkSync, type Diagnostics } from \"recheck\";\nimport type { AgentToolResult, ToolInfo } from \"../../core/extensions/types.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\nimport {\n\tclearFailure,\n\tgetFailureAgeSeconds,\n\tlazyConnect,\n\tmarkKeepAliveAfterConnect,\n\tnotifyToolMetadataUpdated,\n\trecordFailure,\n\tupdateMetadataCache,\n\tupdateServerMetadata,\n\tupdateStatusBar,\n} from \"./init.ts\";\nimport { authenticate, completeAuthFromInput, startAuth, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { guardedMcpDetails, guardMcpOutput, resolveMcpOutputGuardOptions } from \"./mcp-output-guard.ts\";\nimport { reconstructPromptMetadata } from \"./metadata-cache.ts\";\nimport { combineAbortSignals, isAbortError } from \"./runtime-owner.ts\";\nimport { paginate, rankSuggestions, rankToolMatches, resolveSearchKeywords } from \"./search-ranking.ts\";\nimport { SessionRecoveryAuthRequiredError, withSessionRecovery } from \"./session-recovery.ts\";\nimport type { McpExtensionState } from \"./state.ts\";\nimport { ensureToolCallApproved, isToolCallApprovalRequired } from \"./tool-approval.ts\";\nimport { buildToolMetadata, findToolByName, formatSchema, getToolNames } from \"./tool-metadata.ts\";\nimport { resolveMcpResultContent, transformMcpContent, transformMcpResourceContents } from \"./tool-registrar.ts\";\nimport { renderTsShape } from \"./ts-shape.ts\";\nimport type { McpContent, ToolMetadata } from \"./types.ts\";\nimport { getServerPrefix, isServerDisabled, parseUiPromptHandoff } from \"./types.ts\";\nimport { maybeStartUiSession, summarizeUiSessionResult, type UiSessionRuntime } from \"./ui-session.ts\";\nimport {\n\tformatAuthRequiredMessage,\n\tformatMcpStatus,\n\tnormalizeToolArguments,\n\tresolveServerUrl,\n\ttruncateAtWord,\n} from \"./utils.ts\";\n\ntype ProxyToolResult = AgentToolResult<Record<string, unknown>>;\ntype ClientCallToolResult = Awaited<ReturnType<Client[\"callTool\"]>>;\ntype ClientReadResourceResult = Awaited<ReturnType<Client[\"readResource\"]>>;\n\nconst MAX_REGEX_SEARCH_QUERY_LENGTH = 256;\nconst INSTRUCTIONS_PREVIEW_LENGTH = 300;\nconst REGEX_SAFETY_CHECK_PARAMS = {\n\tattackTimeout: 50,\n\tincubationTimeout: 50,\n\ttimeout: 250,\n} as const;\n\ntype AutoAuthResult = { status: \"skipped\" } | { status: \"success\" } | { status: \"failed\"; message: string };\n\nfunction getToolMatches(metadata: ToolMetadata[] | undefined, toolName: string, exact: boolean): ToolMetadata[] {\n\tif (!metadata) return [];\n\tif (exact) return metadata.filter((tool) => tool.name === toolName);\n\tconst normalizedName = toolName.replace(/-/g, \"_\");\n\treturn metadata.filter((tool) => tool.name.replace(/-/g, \"_\") === normalizedName);\n}\n\nfunction getEnabledToolMatches(\n\tstate: McpExtensionState,\n\ttoolName: string,\n\texact: boolean,\n): { server: string; tool: ToolMetadata }[] {\n\tconst matches: { server: string; tool: ToolMetadata }[] = [];\n\tfor (const [server, metadata] of state.toolMetadata) {\n\t\tif (isServerDisabled(state.config.mcpServers[server])) continue;\n\t\tfor (const tool of getToolMatches(metadata, toolName, exact)) matches.push({ server, tool });\n\t}\n\treturn matches;\n}\n\nfunction getSingleToolMatch(\n\tmetadata: ToolMetadata[] | undefined,\n\ttoolName: string,\n): ToolMetadata | \"ambiguous\" | undefined {\n\tconst exactMatches = getToolMatches(metadata, toolName, true);\n\tconst matches = exactMatches.length > 0 ? exactMatches : getToolMatches(metadata, toolName, false);\n\treturn matches.length > 1 ? \"ambiguous\" : matches[0];\n}\n\nfunction ambiguousToolResult(mode: \"call\" | \"describe\", toolName: string): ProxyToolResult {\n\tconst message = `Tool \"${toolName}\" matches multiple servers. Specify a server.`;\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\tdetails: { mode, error: \"ambiguous_tool\", requestedTool: toolName, message },\n\t};\n}\n\nfunction disabledResult(mode: string, serverName: string): ProxyToolResult {\n\tconst message = `Server \"${serverName}\" is disabled. Run /mcp enable ${serverName} and /reload to enable it.`;\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\tdetails: { mode, error: \"server_disabled\", server: serverName, message },\n\t};\n}\n\nfunction getAuthRequiredMessage(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tdefaultMessage = `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 getAuthFailedMessage(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}. ${getAuthRequiredMessage(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\nfunction getRedirectPort(authorizationUrl: string): number | undefined {\n\ttry {\n\t\tconst redirectUri = new URL(authorizationUrl).searchParams.get(\"redirect_uri\");\n\t\tif (!redirectUri) return undefined;\n\t\tconst port = Number.parseInt(new URL(redirectUri).port, 10);\n\t\treturn Number.isInteger(port) ? port : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction formatManualAuthInstructions(serverName: string, authorizationUrl: string): string {\n\tconst port = getRedirectPort(authorizationUrl);\n\tconst portNote = port\n\t\t? `\\nThe redirect URL will use local port ${port}. On a remote server it is expected for that localhost page to fail locally; copy the address bar URL anyway.`\n\t\t: \"\";\n\n\treturn [\n\t\t`MCP OAuth required for \"${serverName}\".`,\n\t\t\"\",\n\t\t\"Open this URL in your local browser:\",\n\t\t\"\",\n\t\tauthorizationUrl,\n\t\t\"\",\n\t\t\"After approving, copy the full redirected localhost URL from your browser address bar and send it back with:\",\n\t\t`mcp({ action: \"auth-complete\", server: \"${serverName}\", args: { redirectUrl: \"PASTE_REDIRECT_URL_HERE\" } })`,\n\t\t\"\",\n\t\t'You can also pass just the `code` query parameter as `args: { code: \"PASTE_CODE_HERE\" }`. JSON-string args remain supported.',\n\t\tportNote.trimEnd(),\n\t]\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\");\n}\n\nasync function attemptAutoAuth(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tsignal?: AbortSignal,\n): Promise<AutoAuthResult> {\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: getAuthFailedMessage(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: getAuthRequiredMessage(\n\t\t\t\tstate,\n\t\t\t\tserverName,\n\t\t\t\t`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\tif (signal) {\n\t\t\t\tawait authenticate(serverName, serverUrl, definition, { signal, runtime: state.oauthRuntime });\n\t\t\t} else {\n\t\t\t\tawait authenticate(serverName, serverUrl, definition, { runtime: 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: getAuthFailedMessage(state, serverName, message),\n\t\t};\n\t}\n}\n\nexport function executeUiMessages(state: McpExtensionState): ProxyToolResult {\n\tconst sessions = state.completedUiSessions;\n\n\tif (sessions.length === 0) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: \"No UI session messages available.\" }],\n\t\t\tdetails: { sessions: 0 },\n\t\t};\n\t}\n\n\tconst output: string[] = [];\n\toutput.push(`UI Session Messages (${sessions.length} session${sessions.length > 1 ? \"s\" : \"\"}):\\n`);\n\n\tconst allPrompts: string[] = [];\n\tconst allIntents = sessions.flatMap((session) => session.messages.intents);\n\tconst allContexts = sessions.flatMap((session) => session.messages.contexts);\n\tconst parsedHandoffs: Array<{ intent: string; params: Record<string, unknown>; raw: string }> = [];\n\n\tfor (const session of sessions) {\n\t\tconst timestamp = session.completedAt.toLocaleTimeString();\n\t\toutput.push(`\\n## ${session.serverName} / ${session.toolName} (${timestamp}, ${session.reason})`);\n\n\t\tconst plainPrompts: string[] = [];\n\t\tfor (const prompt of session.messages.prompts) {\n\t\t\tallPrompts.push(prompt);\n\t\t\tconst handoff = parseUiPromptHandoff(prompt);\n\t\t\tif (handoff) {\n\t\t\t\tparsedHandoffs.push(handoff);\n\t\t\t} else {\n\t\t\t\tplainPrompts.push(prompt);\n\t\t\t}\n\t\t}\n\n\t\tif (plainPrompts.length > 0) {\n\t\t\toutput.push(\"\\n### Prompts:\");\n\t\t\tfor (const prompt of plainPrompts) {\n\t\t\t\toutput.push(`- ${prompt}`);\n\t\t\t}\n\t\t}\n\n\t\tconst intentsForSession = [\n\t\t\t...session.messages.intents,\n\t\t\t...session.messages.prompts\n\t\t\t\t.map((prompt) => parseUiPromptHandoff(prompt))\n\t\t\t\t.filter((handoff): handoff is NonNullable<typeof handoff> => !!handoff)\n\t\t\t\t.map((handoff) => ({ intent: handoff.intent, params: handoff.params })),\n\t\t];\n\n\t\tif (intentsForSession.length > 0) {\n\t\t\toutput.push(\"\\n### Intents:\");\n\t\t\tfor (const intent of intentsForSession) {\n\t\t\t\tconst params = intent.params ? ` (${JSON.stringify(intent.params)})` : \"\";\n\t\t\t\toutput.push(`- ${intent.intent}${params}`);\n\t\t\t}\n\t\t}\n\n\t\tconst contexts = session.messages.contexts;\n\t\tif (contexts.length > 0) {\n\t\t\toutput.push(\"\\n### Context updates:\");\n\t\t\tfor (const context of contexts) {\n\t\t\t\toutput.push(`- ${context.summary}${context.truncated ? \" (truncated)\" : \"\"}`);\n\t\t\t}\n\t\t}\n\n\t\tif (session.messages.notifications.length > 0) {\n\t\t\toutput.push(\"\\n### Notifications:\");\n\t\t\tfor (const notification of session.messages.notifications) {\n\t\t\t\toutput.push(`- ${notification}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst count = sessions.length;\n\tstate.completedUiSessions = [];\n\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: output.join(\"\\n\") }],\n\t\tdetails: {\n\t\t\tsessions: count,\n\t\t\tprompts: allPrompts,\n\t\t\tintents: [...allIntents, ...parsedHandoffs.map(({ intent, params }) => ({ intent, params }))],\n\t\t\tcontexts: allContexts,\n\t\t\thandoffs: parsedHandoffs,\n\t\t\tcleared: true,\n\t\t},\n\t};\n}\n\nexport function executeStatus(state: McpExtensionState): ProxyToolResult {\n\tconst servers: Array<{\n\t\tname: string;\n\t\tstatus: string;\n\t\ttoolCount: number;\n\t\tfailedAgo: number | null;\n\t\tdisabled?: boolean;\n\t}> = [];\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tconst disabled = isServerDisabled(definition);\n\t\tconst connection = disabled ? undefined : state.manager.getConnection(name);\n\t\tconst metadata = disabled ? undefined : state.toolMetadata.get(name);\n\t\tconst toolCount = metadata?.length ?? 0;\n\t\tconst failedAgo = disabled ? null : getFailureAgeSeconds(state, name);\n\t\tlet status = disabled ? \"disabled\" : \"not connected\";\n\t\tif (!disabled && connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t} else if (!disabled && connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs-auth\";\n\t\t} else if (!disabled && failedAgo !== null) {\n\t\t\tstatus = \"failed\";\n\t\t} else if (!disabled && metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\tservers.push({ name, status, toolCount, failedAgo, ...(disabled ? { disabled: true } : {}) });\n\t}\n\n\tconst disabledCount = servers.filter((s) => s.disabled).length;\n\tconst enabledServers = servers.filter((s) => !s.disabled);\n\tconst totalTools = enabledServers.reduce((sum, s) => sum + s.toolCount, 0);\n\tconst connectedCount = enabledServers.filter((s) => s.status === \"connected\").length;\n\n\tlet text = `MCP: ${connectedCount}/${enabledServers.length} servers, ${totalTools} tools`;\n\tif (disabledCount > 0) text += ` (${disabledCount} disabled)`;\n\ttext += \"\\n\\n\";\n\tfor (const server of servers) {\n\t\tif (server.disabled) {\n\t\t\ttext += `⊘ ${server.name} (disabled)\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (server.status === \"connected\") {\n\t\t\ttext += `✓ ${server.name} (${server.toolCount} tools)\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (server.status === \"needs-auth\") {\n\t\t\ttext += `⚠ ${server.name} (needs auth)\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (server.status === \"cached\") {\n\t\t\ttext += `○ ${server.name} (${server.toolCount} tools, cached)\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\tif (server.status === \"failed\") {\n\t\t\ttext += `✗ ${server.name} (failed ${server.failedAgo ?? 0}s ago)\\n`;\n\t\t\tcontinue;\n\t\t}\n\t\ttext += `○ ${server.name} (not connected)\\n`;\n\t}\n\n\tif (servers.length > 0) {\n\t\ttext += `\\nmcp({ server: \"name\" }) to list tools, mcp({ search: \"...\" }) to search`;\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: text.trim() }],\n\t\tdetails: { mode: \"status\", servers, totalTools, connectedCount, disabledCount },\n\t};\n}\n\nexport async function executeAuthStart(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tsignal?: AbortSignal,\n): Promise<ProxyToolResult> {\n\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\tthrowIfAborted(ownedSignal);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${serverName}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"auth-start\", error: \"not_found\", server: serverName },\n\t\t};\n\t}\n\tif (isServerDisabled(definition)) return disabledResult(\"auth-start\", serverName);\n\n\ttry {\n\t\tconst serverUrl = resolveServerUrl(definition);\n\t\tif (!serverUrl || !supportsOAuth(definition)) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `Server \"${serverName}\" is not configured for OAuth over HTTP.` }],\n\t\t\t\tdetails: { mode: \"auth-start\", error: \"oauth_not_supported\", server: serverName },\n\t\t\t};\n\t\t}\n\n\t\tconst { authorizationUrl } = state.authStorageOptions\n\t\t\t? ownedSignal\n\t\t\t\t? await startAuth(serverName, serverUrl, definition, {\n\t\t\t\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\t\t\t\tsignal: ownedSignal,\n\t\t\t\t\t\truntime: state.oauthRuntime,\n\t\t\t\t\t})\n\t\t\t\t: await startAuth(serverName, serverUrl, definition, {\n\t\t\t\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\t\t\t\truntime: state.oauthRuntime,\n\t\t\t\t\t})\n\t\t\t: ownedSignal\n\t\t\t\t? await startAuth(serverName, serverUrl, definition, { signal: ownedSignal, runtime: state.oauthRuntime })\n\t\t\t\t: await startAuth(serverName, serverUrl, definition, { runtime: state.oauthRuntime });\n\t\tif (!authorizationUrl) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `OAuth authentication successful for \"${serverName}\".` }],\n\t\t\t\tdetails: { mode: \"auth-start\", server: serverName, authenticated: true },\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: formatManualAuthInstructions(serverName, authorizationUrl) }],\n\t\t\tdetails: { mode: \"auth-start\", server: serverName, authorizationUrl },\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `Failed to start OAuth for \"${serverName}\": ${message}` }],\n\t\t\tdetails: { mode: \"auth-start\", error: \"auth_start_failed\", server: serverName, message },\n\t\t};\n\t}\n}\n\nexport async function executeAuthComplete(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tinput: string,\n\tsignal?: AbortSignal,\n): Promise<ProxyToolResult> {\n\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\tthrowIfAborted(ownedSignal);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${serverName}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"auth-complete\", error: \"not_found\", server: serverName },\n\t\t};\n\t}\n\tif (isServerDisabled(definition)) return disabledResult(\"auth-complete\", serverName);\n\n\ttry {\n\t\tconst status = state.authStorageOptions\n\t\t\t? ownedSignal\n\t\t\t\t? await completeAuthFromInput(serverName, input, {\n\t\t\t\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\t\t\t\tsignal: ownedSignal,\n\t\t\t\t\t\truntime: state.oauthRuntime,\n\t\t\t\t\t})\n\t\t\t\t: await completeAuthFromInput(serverName, input, {\n\t\t\t\t\t\tauthStorageOptions: state.authStorageOptions,\n\t\t\t\t\t\truntime: state.oauthRuntime,\n\t\t\t\t\t})\n\t\t\t: ownedSignal\n\t\t\t\t? await completeAuthFromInput(serverName, input, { signal: ownedSignal, runtime: state.oauthRuntime })\n\t\t\t\t: await completeAuthFromInput(serverName, input, { runtime: state.oauthRuntime });\n\t\tif (status !== \"authenticated\") {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `OAuth authentication did not complete for \"${serverName}\".` }],\n\t\t\t\tdetails: { mode: \"auth-complete\", error: \"not_authenticated\", server: serverName, status },\n\t\t\t};\n\t\t}\n\n\t\tawait state.manager.close(serverName);\n\t\tclearFailure(state, serverName);\n\t\tupdateStatusBar(state);\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\ttext: `OAuth authentication successful for \"${serverName}\". Run mcp({ connect: \"${serverName}\" }) to connect with the new token.`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { mode: \"auth-complete\", server: serverName, authenticated: true },\n\t\t};\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `Failed to complete OAuth for \"${serverName}\": ${message}` }],\n\t\t\tdetails: { mode: \"auth-complete\", error: \"auth_complete_failed\", server: serverName, message },\n\t\t};\n\t}\n}\n\nexport function executeDescribe(state: McpExtensionState, toolName: string): ProxyToolResult {\n\tconst exactMatches = getEnabledToolMatches(state, toolName, true);\n\tif (exactMatches.length > 1) return ambiguousToolResult(\"describe\", toolName);\n\tif (exactMatches.length === 0 && getEnabledToolMatches(state, toolName, false).length > 1) {\n\t\treturn ambiguousToolResult(\"describe\", toolName);\n\t}\n\n\tlet serverName = exactMatches[0]?.server;\n\tlet toolMeta = exactMatches[0]?.tool;\n\tlet disabledMatch: string | undefined;\n\n\tif (!toolMeta) {\n\t\tfor (const [server, metadata] of state.toolMetadata.entries()) {\n\t\t\tconst found = findToolByName(metadata, toolName);\n\t\t\tif (!found) continue;\n\t\t\tif (isServerDisabled(state.config.mcpServers[server])) {\n\t\t\t\tdisabledMatch ??= server;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tserverName = server;\n\t\t\ttoolMeta = found;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!serverName || !toolMeta) {\n\t\tif (disabledMatch) return disabledResult(\"describe\", disabledMatch);\n\t\tconst suggestions = rankSuggestions(state, toolName, 5);\n\t\tconst suggestionText = suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}` : \"\";\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\ttext: `Tool \"${toolName}\" not found. Use mcp({ search: \"...\" }) to search.${suggestionText}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: { mode: \"describe\", error: \"tool_not_found\", requestedTool: toolName, suggestions },\n\t\t};\n\t}\n\n\tconst approvalMarker = isToolCallApprovalRequired(state.config, serverName, toolMeta, state.toolMetadata)\n\t\t? \" (requires approval)\"\n\t\t: \"\";\n\tlet text = `${toolMeta.name}${approvalMarker}\\n`;\n\ttext += `Server: ${serverName}\\n`;\n\tif (toolMeta.resourceUri) {\n\t\ttext += `Type: Resource (reads from ${toolMeta.resourceUri})\\n`;\n\t}\n\ttext += `\\n${toolMeta.description || \"(no description)\"}\\n`;\n\n\tif (toolMeta.inputSchema && !toolMeta.resourceUri) {\n\t\tconst shape = renderTsShape(toolMeta.inputSchema);\n\t\ttext += shape === null ? `\\nParameters:\\n${formatSchema(toolMeta.inputSchema)}` : `\\nShape:\\n${shape}`;\n\t} else if (toolMeta.resourceUri) {\n\t\ttext += `\\nNo parameters required (resource tool).`;\n\t} else {\n\t\ttext += `\\nNo parameters defined.`;\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: text.trim() }],\n\t\tdetails: { mode: \"describe\", tool: toolMeta, server: serverName },\n\t};\n}\n\nexport function executeSearch(\n\tstate: McpExtensionState,\n\tquery: string,\n\tregex?: boolean,\n\tserver?: string,\n\tincludeSchemas?: boolean,\n\tlimit = 12,\n\toffset = 0,\n): ProxyToolResult {\n\tconst showSchemas = includeSchemas !== false;\n\tif (server && isServerDisabled(state.config.mcpServers[server])) return disabledResult(\"search\", server);\n\n\tlet matches: Array<{ server: string; tool: ToolMetadata; score: number }>;\n\tif (regex) {\n\t\tlet pattern: RegExp;\n\t\ttry {\n\t\t\tif (query.length > MAX_REGEX_SEARCH_QUERY_LENGTH) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Regex query is too long; maximum length is ${MAX_REGEX_SEARCH_QUERY_LENGTH} characters.`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { mode: \"search\", error: \"query_too_long\", query, maxLength: MAX_REGEX_SEARCH_QUERY_LENGTH },\n\t\t\t\t};\n\t\t\t}\n\t\t\tpattern = new RegExp(query, \"i\");\n\t\t\tlet safety: Diagnostics;\n\t\t\ttry {\n\t\t\t\tsafety = checkSync(query, \"i\", REGEX_SAFETY_CHECK_PARAMS);\n\t\t\t} catch (error) {\n\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"Regex query rejected because safety analysis failed.\" }],\n\t\t\t\t\tdetails: { mode: \"search\", error: \"unsafe_pattern\", query, reason },\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (safety.status !== \"safe\") {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `Regex query rejected as unsafe (${safety.status}).` }],\n\t\t\t\t\tdetails: { mode: \"search\", error: \"unsafe_pattern\", query, safetyStatus: safety.status },\n\t\t\t\t};\n\t\t\t}\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `Invalid regex: ${query}` }],\n\t\t\t\tdetails: { mode: \"search\", error: \"invalid_pattern\", query },\n\t\t\t};\n\t\t}\n\n\t\tmatches = [];\n\t\tconst globalPrefix = state.config.settings?.toolPrefix ?? \"server\";\n\t\tfor (const [serverName, metadata] of state.toolMetadata.entries()) {\n\t\t\tconst definition = state.config.mcpServers[serverName];\n\t\t\tif (isServerDisabled(definition)) continue;\n\t\t\tif (server && serverName !== server) continue;\n\t\t\tfor (const tool of metadata) {\n\t\t\t\tconst matched =\n\t\t\t\t\tpattern.test(tool.name) ||\n\t\t\t\t\tpattern.test(tool.description) ||\n\t\t\t\t\tresolveSearchKeywords(definition, tool.originalName, serverName, globalPrefix).some((keyword) =>\n\t\t\t\t\t\tpattern.test(keyword),\n\t\t\t\t\t);\n\t\t\t\tif (matched) matches.push({ server: serverName, tool, score: 0 });\n\t\t\t}\n\t\t}\n\t} else if (query.trim().length === 0) {\n\t\tif (!server) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: \"Search query cannot be empty\" }],\n\t\t\t\tdetails: { mode: \"search\", error: \"empty_query\" },\n\t\t\t};\n\t\t}\n\t\tmatches = (state.toolMetadata.get(server) ?? [])\n\t\t\t.map((tool) => ({ server, tool, score: 0 }))\n\t\t\t.sort((a, b) => a.tool.name.localeCompare(b.tool.name));\n\t} else {\n\t\tmatches = rankToolMatches(state, query, server);\n\t}\n\n\tconst page = paginate(matches, offset, limit);\n\tif (page.total === 0) {\n\t\tconst connectingServers = server\n\t\t\t? state.config.mcpServers[server] && state.manager.isConnecting(server)\n\t\t\t\t? [server]\n\t\t\t\t: []\n\t\t\t: Object.keys(state.config.mcpServers)\n\t\t\t\t\t.filter((name) => !isServerDisabled(state.config.mcpServers[name]) && state.manager.isConnecting(name))\n\t\t\t\t\t.sort((a, b) => a.localeCompare(b));\n\t\tconst msg = server ? `No tools matching \"${query}\" in \"${server}\"` : `No tools matching \"${query}\"`;\n\t\tconst connectingMessage =\n\t\t\tconnectingServers.length === 1\n\t\t\t\t? ` Server \"${connectingServers[0]}\" is still connecting; retry in a moment.`\n\t\t\t\t: connectingServers.length > 1\n\t\t\t\t\t? ` Servers ${connectingServers.map((name) => `\"${name}\"`).join(\", \")} are still connecting; retry in a moment.`\n\t\t\t\t\t: \"\";\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `${msg}${connectingMessage}` }],\n\t\t\tdetails: {\n\t\t\t\tmode: \"search\",\n\t\t\t\tmatches: [],\n\t\t\t\tcount: 0,\n\t\t\t\thasMore: false,\n\t\t\t\tnextOffset: null,\n\t\t\t\tquery,\n\t\t\t\t...(connectingServers.length > 0 ? { connectingServers } : {}),\n\t\t\t},\n\t\t};\n\t}\n\n\tlet text = `Found ${page.total} tool${page.total === 1 ? \"\" : \"s\"} matching \"${query}\":\\n\\n`;\n\tfor (const match of page.items) {\n\t\tconst approvalMarker = isToolCallApprovalRequired(state.config, match.server, match.tool, state.toolMetadata)\n\t\t\t? \" (requires approval)\"\n\t\t\t: \"\";\n\t\tif (showSchemas) {\n\t\t\ttext += `${match.tool.name}${approvalMarker}\\n`;\n\t\t\ttext += ` ${match.tool.description || \"(no description)\"}\\n`;\n\t\t\tif (match.tool.inputSchema && !match.tool.resourceUri) {\n\t\t\t\tconst shape = renderTsShape(match.tool.inputSchema);\n\t\t\t\ttext +=\n\t\t\t\t\tshape === null\n\t\t\t\t\t\t? `\\n Parameters:\\n${formatSchema(match.tool.inputSchema, \" \")}\\n`\n\t\t\t\t\t\t: `\\n Shape:\\n${shape\n\t\t\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t\t\t.map((line) => ` ${line}`)\n\t\t\t\t\t\t\t\t.join(\"\\n\")}\\n`;\n\t\t\t} else if (match.tool.resourceUri) {\n\t\t\t\ttext += \" No parameters (resource tool).\\n\";\n\t\t\t}\n\t\t\ttext += \"\\n\";\n\t\t} else {\n\t\t\ttext += `- ${match.tool.name}${approvalMarker}`;\n\t\t\tif (match.tool.description) text += ` - ${truncateAtWord(match.tool.description, 50)}`;\n\t\t\ttext += \"\\n\";\n\t\t}\n\t}\n\tif (page.hasMore) text += `\\n${page.items.length} of ${page.total} — offset: ${page.nextOffset} for more\\n`;\n\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: text.trim() }],\n\t\tdetails: {\n\t\t\tmode: \"search\",\n\t\t\tmatches: page.items.map((match) => ({ server: match.server, tool: match.tool.name, score: match.score })),\n\t\t\tcount: page.total,\n\t\t\thasMore: page.hasMore,\n\t\t\tnextOffset: page.nextOffset,\n\t\t\tquery,\n\t\t},\n\t};\n}\n\nexport function executeList(state: McpExtensionState, server: string): ProxyToolResult {\n\tconst definition = state.config.mcpServers[server];\n\tif (!definition) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${server}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"list\", server, tools: [], count: 0, error: \"not_found\" },\n\t\t};\n\t}\n\tif (isServerDisabled(definition)) return disabledResult(\"list\", server);\n\n\tconst metadata = state.toolMetadata.get(server);\n\tconst toolNames = metadata?.map((m) => m.name) ?? [];\n\tconst connection = state.manager.getConnection(server);\n\tconst instructions = state.serverInstructions.get(server);\n\tlet instructionsText = \"\";\n\tif (instructions) {\n\t\tconst preview = truncateAtWord(instructions, INSTRUCTIONS_PREVIEW_LENGTH);\n\t\tinstructionsText = `\\n\\nServer instructions:\\n${preview}`;\n\t\tif (preview !== instructions) {\n\t\t\tinstructionsText += `\\nUse mcp({ instructions: \"${server}\" }) for the full text.`;\n\t\t}\n\t}\n\n\tif (toolNames.length === 0) {\n\t\tif (connection?.status === \"connected\") {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `Server \"${server}\" has no tools.${instructionsText}` }],\n\t\t\t\tdetails: { mode: \"list\", server, tools: [], count: 0, hasInstructions: Boolean(instructions) },\n\t\t\t};\n\t\t}\n\t\tif (metadata !== undefined) {\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: `Server \"${server}\" has no cached tools (not connected).${instructionsText}`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"list\",\n\t\t\t\t\tserver,\n\t\t\t\t\ttools: [],\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tcached: true,\n\t\t\t\t\thasInstructions: Boolean(instructions),\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\ttext: `Server \"${server}\" is configured but not connected. Use mcp({ connect: \"${server}\" }) or /mcp reconnect ${server} to retry.${instructionsText}`,\n\t\t\t\t},\n\t\t\t],\n\t\t\tdetails: {\n\t\t\t\tmode: \"list\",\n\t\t\t\tserver,\n\t\t\t\ttools: [],\n\t\t\t\tcount: 0,\n\t\t\t\terror: \"not_connected\",\n\t\t\t\thasInstructions: Boolean(instructions),\n\t\t\t},\n\t\t};\n\t}\n\n\tconst cachedNote = connection?.status === \"connected\" ? \"\" : \" (not connected, cached)\";\n\tlet text = `${server} (${toolNames.length} tools${cachedNote}):\\n\\n`;\n\n\tconst descMap = new Map<string, string>();\n\tif (metadata) {\n\t\tfor (const m of metadata) {\n\t\t\tdescMap.set(m.name, m.description);\n\t\t}\n\t}\n\n\tfor (const tool of toolNames) {\n\t\tconst desc = descMap.get(tool) ?? \"\";\n\t\tconst truncated = truncateAtWord(desc, 50);\n\t\ttext += `- ${tool}`;\n\t\tif (truncated) text += ` - ${truncated}`;\n\t\ttext += \"\\n\";\n\t}\n\n\ttext += instructionsText;\n\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: text.trim() }],\n\t\tdetails: {\n\t\t\tmode: \"list\",\n\t\t\tserver,\n\t\t\ttools: toolNames,\n\t\t\tcount: toolNames.length,\n\t\t\thasInstructions: Boolean(instructions),\n\t\t},\n\t};\n}\n\nexport function executeInstructions(state: McpExtensionState, server: string): ProxyToolResult {\n\tconst definition = state.config.mcpServers[server];\n\tif (!definition) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${server}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"instructions\", server, error: \"not_found\" },\n\t\t};\n\t}\n\tif (isServerDisabled(definition)) return disabledResult(\"instructions\", server);\n\n\tconst instructions = state.serverInstructions.get(server);\n\tif (instructions) {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `${server} instructions:\\n\\n${instructions}` }],\n\t\t\tdetails: { mode: \"instructions\", server, length: instructions.length },\n\t\t};\n\t}\n\n\tconst connection = state.manager.getConnection(server);\n\tif (connection?.status === \"connected\") {\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `Server \"${server}\" does not provide instructions.` }],\n\t\t\tdetails: { mode: \"instructions\", server, error: \"no_instructions\" },\n\t\t};\n\t}\n\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\" as const,\n\t\t\t\ttext: `No instructions cached for \"${server}\". Use mcp({ connect: \"${server}\" }) to connect and refresh.`,\n\t\t\t},\n\t\t],\n\t\tdetails: { mode: \"instructions\", server, error: \"not_connected\" },\n\t};\n}\n\nexport async function executeConnect(\n\tstate: McpExtensionState,\n\tserverName: string,\n\tsignal?: AbortSignal,\n): Promise<ProxyToolResult> {\n\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\tthrowIfAborted(ownedSignal);\n\tconst definition = state.config.mcpServers[serverName];\n\tif (!definition) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${serverName}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"connect\", error: \"not_found\", server: serverName },\n\t\t};\n\t}\n\tif (isServerDisabled(definition)) return disabledResult(\"connect\", serverName);\n\n\ttry {\n\t\tif (state.ui) {\n\t\t\tstate.ui.setStatus(\"mcp\", formatMcpStatus(state.config, `connecting to ${serverName}...`));\n\t\t}\n\t\tconst currentConnection = state.manager.getConnection(serverName);\n\t\tlet connection =\n\t\t\tcurrentConnection?.status === \"connected\"\n\t\t\t\t? await state.manager.reconnect(serverName, definition, currentConnection, ownedSignal)\n\t\t\t\t: await state.manager.connect(serverName, definition, ownedSignal);\n\t\tif (connection.status === \"needs-auth\") {\n\t\t\tconst autoAuth = await attemptAutoAuth(state, 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: { mode: \"connect\", error: \"auth_required\", server: 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(serverName);\n\t\t\t\tthrowIfAborted(ownedSignal);\n\t\t\t\tconnection = ownedSignal\n\t\t\t\t\t? await state.manager.connect(serverName, definition, ownedSignal)\n\t\t\t\t\t: await state.manager.connect(serverName, definition);\n\t\t\t}\n\t\t\tif (connection.status === \"needs-auth\") {\n\t\t\t\tconst message = getAuthRequiredMessage(state, serverName);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\tdetails: { mode: \"connect\", error: \"auth_required\", server: serverName, message },\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tconst prefix = state.config.settings?.toolPrefix ?? \"server\";\n\t\tconst { metadata } = buildToolMetadata(\n\t\t\tconnection.tools,\n\t\t\tconnection.resources,\n\t\t\tdefinition,\n\t\t\tserverName,\n\t\t\tprefix,\n\t\t\tstate.config.mcpServers,\n\t\t\tstate.toolMetadata,\n\t\t);\n\t\tstate.toolMetadata.set(serverName, metadata);\n\t\tif (!connection.promptDiscoveryFailed) {\n\t\t\tstate.promptMetadata?.set(\n\t\t\t\tserverName,\n\t\t\t\treconstructPromptMetadata(serverName, connection.prompts ?? [], prefix, definition),\n\t\t\t);\n\t\t\tstate.promptMetadataLive?.add(serverName);\n\t\t}\n\t\tif (connection.instructions) {\n\t\t\tstate.serverInstructions.set(serverName, connection.instructions);\n\t\t} else {\n\t\t\tstate.serverInstructions.delete(serverName);\n\t\t}\n\t\tupdateMetadataCache(state, serverName);\n\t\tnotifyToolMetadataUpdated(state, serverName, \"proxy-connect\");\n\t\tmarkKeepAliveAfterConnect(state, serverName);\n\t\tclearFailure(state, serverName);\n\t\tupdateStatusBar(state);\n\t\treturn executeList(state, serverName);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tif (!isAbortError(error, ownedSignal)) recordFailure(state, serverName, message);\n\t\tupdateStatusBar(state);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: `Failed to connect to \"${serverName}\": ${message}` }],\n\t\t\tdetails: {\n\t\t\t\tmode: \"connect\",\n\t\t\t\terror: isAbortError(error, ownedSignal) ? \"aborted\" : \"connect_failed\",\n\t\t\t\tserver: serverName,\n\t\t\t\tmessage,\n\t\t\t},\n\t\t};\n\t}\n}\n\nexport async function executeCall(\n\tstate: McpExtensionState,\n\ttoolName: string,\n\targs?: Record<string, unknown>,\n\tserverOverride?: string,\n\tgetNexusTools?: () => ToolInfo[],\n\tsignal?: AbortSignal,\n\torigin?: \"proxy\" | \"script\",\n): Promise<ProxyToolResult> {\n\tconst ownedSignal = combineAbortSignals(state.owner?.signal, signal);\n\tthrowIfAborted(ownedSignal);\n\tlet serverName: string | undefined = serverOverride;\n\tlet toolMeta: ToolMetadata | undefined;\n\tlet autoAuthAttempted = false;\n\tconst prefixMode = state.config.settings?.toolPrefix ?? \"server\";\n\tconst disabledCallResult = (disabledServer: string, metadata?: ToolMetadata): ProxyToolResult => {\n\t\tif (!metadata) {\n\t\t\tconst message = `Server \"${disabledServer}\" is disabled. Run /mcp enable ${disabledServer} 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: {\n\t\t\t\t\tmode: \"call\",\n\t\t\t\t\terror: \"server_disabled\",\n\t\t\t\t\tserver: disabledServer,\n\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\tconst message = `Server \"${disabledServer}\" is disabled. Run /mcp enable ${disabledServer} and /reload to enable it.`;\n\t\tconst identity = metadata.resourceUri\n\t\t\t? { server: disabledServer, resourceUri: metadata.resourceUri }\n\t\t\t: { server: disabledServer, tool: metadata.originalName };\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\tdetails: { mode: \"call\", error: \"server_disabled\", ...identity, message },\n\t\t};\n\t};\n\n\tif (serverName && !state.config.mcpServers[serverName]) {\n\t\treturn {\n\t\t\tcontent: [\n\t\t\t\t{ type: \"text\" as const, text: `Server \"${serverName}\" not found. Use mcp({}) to see available servers.` },\n\t\t\t],\n\t\t\tdetails: { mode: \"call\", error: \"server_not_found\", server: serverName, requestedTool: toolName },\n\t\t};\n\t}\n\tif (serverName) {\n\t\tconst match = getSingleToolMatch(state.toolMetadata.get(serverName), toolName);\n\t\tif (match === \"ambiguous\") return ambiguousToolResult(\"call\", toolName);\n\t\ttoolMeta = match;\n\t\tif (isServerDisabled(state.config.mcpServers[serverName])) {\n\t\t\treturn disabledCallResult(serverName, toolMeta);\n\t\t}\n\t} else {\n\t\tconst exactMatches = getEnabledToolMatches(state, toolName, true);\n\t\tif (exactMatches.length > 1) return ambiguousToolResult(\"call\", toolName);\n\t\tif (exactMatches.length === 0 && getEnabledToolMatches(state, toolName, false).length > 1) {\n\t\t\treturn ambiguousToolResult(\"call\", toolName);\n\t\t}\n\n\t\tlet disabledMatch: { serverName: string; toolMeta: ToolMetadata } | undefined;\n\t\tfor (const [server, metadata] of state.toolMetadata.entries()) {\n\t\t\tconst found = metadata.find((tool) => tool.name === toolName);\n\t\t\tif (!found) continue;\n\t\t\tif (isServerDisabled(state.config.mcpServers[server])) {\n\t\t\t\tdisabledMatch ??= { serverName: server, toolMeta: found };\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tserverName = server;\n\t\t\ttoolMeta = found;\n\t\t\tbreak;\n\t\t}\n\t\tif (!toolMeta && !disabledMatch) {\n\t\t\tfor (const [server, metadata] of state.toolMetadata.entries()) {\n\t\t\t\tconst found = findToolByName(metadata, toolName);\n\t\t\t\tif (!found) continue;\n\t\t\t\tif (isServerDisabled(state.config.mcpServers[server])) {\n\t\t\t\t\tdisabledMatch ??= { serverName: server, toolMeta: found };\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tserverName = server;\n\t\t\t\ttoolMeta = found;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!toolMeta && disabledMatch) return disabledCallResult(disabledMatch.serverName, disabledMatch.toolMeta);\n\t}\n\n\tif (serverName && !toolMeta) {\n\t\tconst connected = await lazyConnect(state, serverName, ownedSignal);\n\t\tif (connected) {\n\t\t\tconst match = getSingleToolMatch(state.toolMetadata.get(serverName), toolName);\n\t\t\tif (match === \"ambiguous\") return ambiguousToolResult(\"call\", toolName);\n\t\t\ttoolMeta = match;\n\t\t} else {\n\t\t\tconst needsAuthConnection = state.manager.getConnection(serverName);\n\t\t\tif (needsAuthConnection?.status === \"needs-auth\") {\n\t\t\t\tif (!autoAuthAttempted) {\n\t\t\t\t\tautoAuthAttempted = true;\n\t\t\t\t\tconst autoAuth = await attemptAutoAuth(state, serverName, ownedSignal);\n\t\t\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: autoAuth.message }],\n\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\tmode: \"call\",\n\t\t\t\t\t\t\t\terror: \"auth_required\",\n\t\t\t\t\t\t\t\tserver: serverName,\n\t\t\t\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\t\t\t\tmessage: autoAuth.message,\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\tif (autoAuth.status === \"success\") {\n\t\t\t\t\t\tawait state.manager.close(serverName);\n\t\t\t\t\t\tclearFailure(state, serverName);\n\t\t\t\t\t\tconst connectedAfterAuth = await lazyConnect(state, serverName, ownedSignal);\n\t\t\t\t\t\tif (connectedAfterAuth) {\n\t\t\t\t\t\t\tconst match = getSingleToolMatch(state.toolMetadata.get(serverName), toolName);\n\t\t\t\t\t\t\tif (match === \"ambiguous\") return ambiguousToolResult(\"call\", toolName);\n\t\t\t\t\t\t\ttoolMeta = match;\n\t\t\t\t\t\t\tif (!toolMeta) {\n\t\t\t\t\t\t\t\tconst suggestions = rankSuggestions(state, toolName, 5);\n\t\t\t\t\t\t\t\tconst suggestionText = suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}` : \"\";\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\t\t\t\ttext: `Tool \"${toolName}\" not found on \"${serverName}\" after reconnect.${suggestionText}`,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\t\t\t\tmode: \"call\",\n\t\t\t\t\t\t\t\t\t\terror: \"tool_not_found_after_reconnect\",\n\t\t\t\t\t\t\t\t\t\tserver: serverName,\n\t\t\t\t\t\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\t\t\t\t\t\tsuggestions,\n\t\t\t\t\t\t\t\t\t},\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}\n\t\t\t\t}\n\n\t\t\t\tif (!toolMeta && state.manager.getConnection(serverName)?.status === \"needs-auth\") {\n\t\t\t\t\tconst message = getAuthRequiredMessage(state, serverName);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tmode: \"call\",\n\t\t\t\t\t\t\terror: \"auth_required\",\n\t\t\t\t\t\t\tserver: serverName,\n\t\t\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!toolMeta) {\n\t\t\t\tconst failedAgo = getFailureAgeSeconds(state, serverName);\n\t\t\t\tif (failedAgo !== null) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `Server \"${serverName}\" not available (last failed ${failedAgo}s ago)`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { mode: \"call\", error: \"server_backoff\", server: serverName, requestedTool: toolName },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tlet prefixMatchedServer: string | undefined;\n\n\tif (!serverName && !toolMeta && prefixMode !== \"none\") {\n\t\tconst lazyExactMatches: { serverName: string; toolMeta: ToolMetadata }[] = [];\n\t\tconst lazyFallbackMatches: { serverName: string; toolMeta: ToolMetadata }[] = [];\n\t\tconst candidates = Object.keys(state.config.mcpServers)\n\t\t\t.filter((name) => !isServerDisabled(state.config.mcpServers[name]))\n\t\t\t.map((name) => ({ name, prefix: getServerPrefix(name, prefixMode) }))\n\t\t\t.filter((c) => c.prefix && toolName.startsWith(`${c.prefix}_`))\n\t\t\t.sort((a, b) => b.prefix.length - a.prefix.length);\n\n\t\tfor (const { name: configuredServer } of candidates) {\n\t\t\tconst existingConnection = state.manager.getConnection(configuredServer);\n\t\t\tconst failedAgo = getFailureAgeSeconds(state, configuredServer);\n\t\t\tif (failedAgo !== null && existingConnection?.status !== \"needs-auth\") continue;\n\n\t\t\tlet connected = await lazyConnect(state, configuredServer, ownedSignal);\n\t\t\tif (\n\t\t\t\t!connected &&\n\t\t\t\tstate.manager.getConnection(configuredServer)?.status === \"needs-auth\" &&\n\t\t\t\t!autoAuthAttempted\n\t\t\t) {\n\t\t\t\tautoAuthAttempted = true;\n\t\t\t\tconst autoAuth = await attemptAutoAuth(state, configuredServer, ownedSignal);\n\t\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: autoAuth.message }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tmode: \"call\",\n\t\t\t\t\t\t\terror: \"auth_required\",\n\t\t\t\t\t\t\tserver: configuredServer,\n\t\t\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\t\t\tmessage: autoAuth.message,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (autoAuth.status === \"success\") {\n\t\t\t\t\tawait state.manager.close(configuredServer);\n\t\t\t\t\tclearFailure(state, configuredServer);\n\t\t\t\t\tconnected = await lazyConnect(state, configuredServer, ownedSignal);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!connected) continue;\n\t\t\tif (!prefixMatchedServer) prefixMatchedServer = configuredServer;\n\t\t\tconst metadata = state.toolMetadata.get(configuredServer);\n\t\t\tconst exactMatches = getToolMatches(metadata, toolName, true);\n\t\t\tif (exactMatches.length > 1) return ambiguousToolResult(\"call\", toolName);\n\t\t\tif (exactMatches.length === 1) {\n\t\t\t\tlazyExactMatches.push({ serverName: configuredServer, toolMeta: exactMatches[0]! });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst fallbackMatches = getToolMatches(metadata, toolName, false);\n\t\t\tif (fallbackMatches.length > 1) return ambiguousToolResult(\"call\", toolName);\n\t\t\tif (fallbackMatches.length === 1)\n\t\t\t\tlazyFallbackMatches.push({ serverName: configuredServer, toolMeta: fallbackMatches[0]! });\n\t\t}\n\t\tconst lazyMatches = lazyExactMatches.length > 0 ? lazyExactMatches : lazyFallbackMatches;\n\t\tif (lazyMatches.length > 1) return ambiguousToolResult(\"call\", toolName);\n\t\tif (lazyMatches.length === 1) {\n\t\t\tserverName = lazyMatches[0]!.serverName;\n\t\t\ttoolMeta = lazyMatches[0]!.toolMeta;\n\t\t}\n\t}\n\n\tif (!serverName || !toolMeta) {\n\t\tconst nativeTool = !serverOverride\n\t\t\t? getNexusTools?.().find((tool) => tool.name === toolName && tool.name !== \"mcp\")\n\t\t\t: undefined;\n\t\tif (nativeTool) {\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: `\"${toolName}\" is a native Nexus tool. Call ${toolName} directly instead of using mcp({ tool: \"${toolName}\" }).`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { mode: \"call\", error: \"native_tool\", requestedTool: toolName },\n\t\t\t};\n\t\t}\n\n\t\tconst hintServer = serverName ?? prefixMatchedServer;\n\t\tconst available = hintServer ? getToolNames(state, hintServer) : [];\n\t\tlet msg = `Tool \"${toolName}\" not found.`;\n\t\tif (available.length > 0) {\n\t\t\tmsg += ` Server \"${hintServer}\" has: ${available.join(\", \")}`;\n\t\t} else {\n\t\t\tmsg += ` Use mcp({ search: \"...\" }) to search.`;\n\t\t}\n\t\tconst suggestions = rankSuggestions(state, toolName, 5);\n\t\tif (suggestions.length > 0) msg += ` Did you mean: ${suggestions.join(\", \")}`;\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: msg }],\n\t\t\tdetails: { mode: \"call\", error: \"tool_not_found\", requestedTool: toolName, hintServer, suggestions },\n\t\t};\n\t}\n\n\tconst callIdentity = toolMeta.resourceUri\n\t\t? { server: serverName, resourceUri: toolMeta.resourceUri }\n\t\t: { server: serverName, tool: toolMeta.originalName };\n\n\tlet connection = state.manager.getConnection(serverName);\n\tif (connection?.status === \"needs-auth\") {\n\t\tif (!autoAuthAttempted) {\n\t\t\tautoAuthAttempted = true;\n\t\t\tconst autoAuth = await attemptAutoAuth(state, 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: { mode: \"call\", error: \"auth_required\", ...callIdentity, 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(serverName);\n\t\t\t\tclearFailure(state, serverName);\n\t\t\t\tconnection = state.manager.getConnection(serverName);\n\t\t\t}\n\t\t}\n\n\t\tif (connection?.status === \"needs-auth\") {\n\t\t\tconst message = getAuthRequiredMessage(state, serverName);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\tdetails: { mode: \"call\", error: \"auth_required\", ...callIdentity, message },\n\t\t\t};\n\t\t}\n\t}\n\tif (!connection || connection.status !== \"connected\") {\n\t\tconst failedAgo = getFailureAgeSeconds(state, serverName);\n\t\tif (failedAgo !== null) {\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{ type: \"text\" as const, text: `Server \"${serverName}\" not available (last failed ${failedAgo}s ago)` },\n\t\t\t\t],\n\t\t\t\tdetails: { mode: \"call\", error: \"server_backoff\", ...callIdentity },\n\t\t\t};\n\t\t}\n\n\t\tconst definition = state.config.mcpServers[serverName];\n\t\tif (!definition) {\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `Server \"${serverName}\" not connected` }],\n\t\t\t\tdetails: { mode: \"call\", error: \"server_not_connected\", ...callIdentity },\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tif (state.ui) {\n\t\t\t\tstate.ui.setStatus(\"mcp\", formatMcpStatus(state.config, `connecting to ${serverName}...`));\n\t\t\t}\n\t\t\tconnection = await state.manager.connect(serverName, definition, ownedSignal);\n\t\t\tif (connection.status === \"needs-auth\") {\n\t\t\t\tif (!autoAuthAttempted) {\n\t\t\t\t\tautoAuthAttempted = true;\n\t\t\t\t\tconst autoAuth = await attemptAutoAuth(state, serverName, ownedSignal);\n\t\t\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: autoAuth.message }],\n\t\t\t\t\t\t\tdetails: { mode: \"call\", error: \"auth_required\", ...callIdentity, message: autoAuth.message },\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (autoAuth.status === \"success\") {\n\t\t\t\t\t\tawait state.manager.close(serverName);\n\t\t\t\t\t\tconnection = await state.manager.connect(serverName, definition, ownedSignal);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (connection.status === \"needs-auth\") {\n\t\t\t\t\tconst message = getAuthRequiredMessage(state, serverName);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\t\t\tdetails: { mode: \"call\", error: \"auth_required\", ...callIdentity, message },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\tclearFailure(state, serverName);\n\t\t\tupdateServerMetadata(state, serverName);\n\t\t\tupdateMetadataCache(state, serverName);\n\t\t\tnotifyToolMetadataUpdated(state, serverName, \"proxy-call-reconnect\");\n\t\t\tmarkKeepAliveAfterConnect(state, serverName);\n\t\t\tupdateStatusBar(state);\n\t\t\tconst match = getSingleToolMatch(state.toolMetadata.get(serverName), toolName);\n\t\t\tif (match === \"ambiguous\") return ambiguousToolResult(\"call\", toolName);\n\t\t\ttoolMeta = match;\n\t\t\tif (!toolMeta) {\n\t\t\t\tconst available = getToolNames(state, serverName);\n\t\t\t\tconst hint =\n\t\t\t\t\tavailable.length > 0\n\t\t\t\t\t\t? `Available tools on \"${serverName}\": ${available.join(\", \")}`\n\t\t\t\t\t\t: `Server \"${serverName}\" has no tools.`;\n\t\t\t\tconst suggestions = rankSuggestions(state, toolName, 5);\n\t\t\t\tconst suggestionText = suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}` : \"\";\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `Tool \"${toolName}\" not found on \"${serverName}\" after reconnect. ${hint}${suggestionText}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmode: \"call\",\n\t\t\t\t\t\terror: \"tool_not_found_after_reconnect\",\n\t\t\t\t\t\tserver: serverName,\n\t\t\t\t\t\trequestedTool: toolName,\n\t\t\t\t\t\tsuggestions,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tif (!isAbortError(error, ownedSignal)) recordFailure(state, serverName, message);\n\t\t\tupdateStatusBar(state);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: `Failed to connect to \"${serverName}\": ${message}` }],\n\t\t\t\tdetails: {\n\t\t\t\t\tmode: \"call\",\n\t\t\t\t\terror: isAbortError(error, ownedSignal) ? \"aborted\" : \"connect_failed\",\n\t\t\t\t\t...callIdentity,\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tif (isServerDisabled(state.config.mcpServers[serverName])) {\n\t\treturn disabledCallResult(serverName, toolMeta);\n\t}\n\n\tconst normalizedArgs = toolMeta.resourceUri ? (args ?? {}) : normalizeToolArguments(args);\n\tconst approval = await ensureToolCallApproved(\n\t\tstate,\n\t\tserverName,\n\t\ttoolMeta,\n\t\tnormalizedArgs,\n\t\townedSignal,\n\t\torigin ?? (toolMeta.resourceUri ? \"resource\" : \"proxy\"),\n\t);\n\tif (approval.ok === false) {\n\t\tconst denied = approval.reason === \"denied\";\n\t\tconst message = denied\n\t\t\t? `The user declined approval to run MCP tool \"${toolMeta.originalName}\" on server \"${serverName}\".`\n\t\t\t: `MCP tool \"${toolMeta.originalName}\" on server \"${serverName}\" is approval-gated and requires an interactive session.`;\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\tdetails: {\n\t\t\t\tmode: \"call\",\n\t\t\t\terror: denied ? \"approval_denied\" : \"approval_required\",\n\t\t\t\tserver: serverName,\n\t\t\t\ttool: toolMeta.originalName,\n\t\t\t},\n\t\t};\n\t}\n\n\tlet uiSession: UiSessionRuntime | null = null;\n\tconst requestOptions =\n\t\tstate.manager.getRequestOptions?.(serverName, ownedSignal) ?? (ownedSignal ? { signal: ownedSignal } : undefined);\n\n\tconst outputGuardOptions = resolveMcpOutputGuardOptions(state.config.settings);\n\tconst recoverAuthConnection = async () => {\n\t\tconst current = state.manager.getConnection(serverName);\n\t\tif (current?.status === \"connected\") return current;\n\n\t\tif (!autoAuthAttempted) {\n\t\t\tautoAuthAttempted = true;\n\t\t\tconst autoAuth = await attemptAutoAuth(state, serverName, ownedSignal);\n\t\t\tif (autoAuth.status === \"failed\") {\n\t\t\t\tthrow new SessionRecoveryAuthRequiredError(serverName, autoAuth.message);\n\t\t\t}\n\t\t\tif (autoAuth.status === \"success\") {\n\t\t\t\tconst definition = state.config.mcpServers[serverName];\n\t\t\t\tif (!definition) return undefined;\n\t\t\t\tconst afterAuth = state.manager.getConnection(serverName);\n\t\t\t\tif (afterAuth?.status === \"connected\") return afterAuth;\n\t\t\t\tif (afterAuth?.status === \"needs-auth\") {\n\t\t\t\t\tawait state.manager.close(serverName);\n\t\t\t\t}\n\t\t\t\tclearFailure(state, serverName);\n\t\t\t\tconnection = await state.manager.connect(serverName, definition, ownedSignal);\n\t\t\t\treturn connection;\n\t\t\t}\n\t\t}\n\t\treturn state.manager.getConnection(serverName);\n\t};\n\n\ttry {\n\t\tstate.manager.touch(serverName);\n\t\tstate.manager.incrementInFlight(serverName);\n\n\t\tif (toolMeta.resourceUri) {\n\t\t\tconst result = await withSessionRecovery<ClientReadResourceResult>(\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\tserverName,\n\t\t\t\t(conn) => conn.client.readResource({ uri: toolMeta.resourceUri! }, requestOptions),\n\t\t\t);\n\t\t\tconst content = transformMcpResourceContents(result.contents ?? [], state.owner?.signal);\n\t\t\tconst guarded = await guardMcpOutput(\n\t\t\t\tcontent.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty resource)\" }],\n\t\t\t\toutputGuardOptions,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tcontent: guarded.content,\n\t\t\t\tdetails: { mode: \"call\", ...callIdentity, ...guardedMcpDetails(guarded) },\n\t\t\t};\n\t\t}\n\n\t\tuiSession = toolMeta.uiResourceUri\n\t\t\t? await maybeStartUiSession(state, {\n\t\t\t\t\tserverName,\n\t\t\t\t\ttoolName: toolMeta.originalName,\n\t\t\t\t\ttoolArgs: normalizedArgs,\n\t\t\t\t\tuiResourceUri: toolMeta.uiResourceUri,\n\t\t\t\t\t...(toolMeta.uiStreamMode !== undefined ? { streamMode: toolMeta.uiStreamMode } : {}),\n\t\t\t\t\t...(signal ? { signal } : {}),\n\t\t\t\t\tonNeedsAuth: recoverAuthConnection,\n\t\t\t\t})\n\t\t\t: null;\n\n\t\tconst result = await withSessionRecovery<ClientCallToolResult>(\n\t\t\t{\n\t\t\t\tmanager: state.manager,\n\t\t\t\tconfig: state.config,\n\t\t\t\t...(ownedSignal ? { signal: ownedSignal } : {}),\n\t\t\t\tonNeedsAuth: recoverAuthConnection,\n\t\t\t},\n\t\t\tserverName,\n\t\t\t(conn) =>\n\t\t\t\tabortable(\n\t\t\t\t\tconn.client.callTool(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: toolMeta.originalName,\n\t\t\t\t\t\t\targuments: normalizedArgs,\n\t\t\t\t\t\t\t_meta: uiSession?.requestMeta,\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequestOptions,\n\t\t\t\t\t),\n\t\t\t\t\townedSignal,\n\t\t\t\t),\n\t\t);\n\n\t\tif (toolMeta.uiResourceUri) {\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 = toolMeta.inputSchema\n\t\t\t\t\t? `\\n\\nExpected parameters:\\n${formatSchema(toolMeta.inputSchema)}`\n\t\t\t\t\t: \"\";\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\trawMcpResult: result,\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: guarded.content,\n\t\t\t\t\tdetails: { mode: \"call\", error: \"tool_error\", ...callIdentity, ...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\tconst uiSummary = summarizeUiSessionResult(uiSession);\n\t\t\tconst guarded = await guardMcpOutput(outputContent, {\n\t\t\t\t...outputGuardOptions,\n\t\t\t\tsuffix: `\\n\\n${uiSummary.message}`,\n\t\t\t\trawMcpResult: result,\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\tmode: \"call\",\n\t\t\t\t\t...guardedMcpDetails(guarded),\n\t\t\t\t\t...callIdentity,\n\t\t\t\t\tuiOpen: uiSummary.uiOpen,\n\t\t\t\t\tuiViewer: uiSummary.uiViewer,\n\t\t\t\t\tuiUrl: uiSummary.uiUrl,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (result.isError) {\n\t\t\tconst mcpContent = (result.content ?? []) as McpContent[];\n\t\t\tconst content = transformMcpContent(mcpContent, state.owner?.signal);\n\t\t\tconst outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n\t\t\tconst schemaText = toolMeta.inputSchema\n\t\t\t\t? `\\n\\nExpected parameters:\\n${formatSchema(toolMeta.inputSchema)}`\n\t\t\t\t: \"\";\n\t\t\tconst guarded = await guardMcpOutput(outputContent, {\n\t\t\t\t...outputGuardOptions,\n\t\t\t\tprefix: \"Error: \",\n\t\t\t\tsuffix: schemaText,\n\t\t\t\temptyTextFallback: \"Tool execution failed\",\n\t\t\t\trawMcpResult: result,\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: guarded.content,\n\t\t\t\tdetails: { mode: \"call\", error: \"tool_error\", ...callIdentity, ...guardedMcpDetails(guarded) },\n\t\t\t};\n\t\t}\n\n\t\tconst content = resolveMcpResultContent(result as Record<string, unknown>, state.owner?.signal);\n\t\tconst outputContent = content.length > 0 ? content : [{ type: \"text\" as const, text: \"(empty result)\" }];\n\t\tconst guarded = await guardMcpOutput(outputContent, { ...outputGuardOptions, rawMcpResult: result });\n\t\treturn {\n\t\t\tcontent: guarded.content,\n\t\t\tdetails: { mode: \"call\", ...guardedMcpDetails(guarded), ...callIdentity },\n\t\t};\n\t} catch (error) {\n\t\tif (error instanceof SessionRecoveryAuthRequiredError) {\n\t\t\tconst message = error.authMessage ?? getAuthRequiredMessage(state, serverName);\n\t\t\tuiSession?.sendToolCancelled(message);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\tdetails: { mode: \"call\", error: \"auth_required\", ...callIdentity, message, autoAuthAttempted },\n\t\t\t};\n\t\t}\n\t\tif (error instanceof UrlElicitationRequiredError) {\n\t\t\tconst action = await state.manager.handleUrlElicitationRequired(serverName, error);\n\t\t\tconst message =\n\t\t\t\taction === \"accept\"\n\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: `The URL interaction was ${action === \"decline\" ? \"declined\" : \"cancelled\"}.`;\n\t\t\tuiSession?.sendToolCancelled(message);\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\" as const, text: message }],\n\t\t\t\tdetails: { mode: \"call\", error: \"url_elicitation_required\", ...callIdentity, action },\n\t\t\t};\n\t\t}\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tuiSession?.sendToolCancelled(message);\n\n\t\tconst schemaText = toolMeta.inputSchema ? `\\n\\nExpected parameters:\\n${formatSchema(toolMeta.inputSchema)}` : \"\";\n\t\tconst guarded = await guardMcpOutput([{ type: \"text\" as const, text: message }], {\n\t\t\t...outputGuardOptions,\n\t\t\tprefix: \"Failed to call tool: \",\n\t\t\tsuffix: schemaText,\n\t\t});\n\n\t\treturn {\n\t\t\tcontent: guarded.content,\n\t\t\tdetails: {\n\t\t\t\tmode: \"call\",\n\t\t\t\terror: isAbortError(error, ownedSignal) ? \"aborted\" : \"call_failed\",\n\t\t\t\t...callIdentity,\n\t\t\t\tmessage: guarded.outputGuard ? \"output truncated; see outputGuard.fullOutputPath\" : message,\n\t\t\t\t...guardedMcpDetails(guarded),\n\t\t\t},\n\t\t};\n\t} finally {\n\t\tif (uiSession?.reused) {\n\t\t\tuiSession.close();\n\t\t}\n\t\tstate.manager.decrementInFlight(serverName);\n\t\tstate.manager.touch(serverName);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FetchLike } from "@modelcontextprotocol/client";
|
|
2
|
+
import type { HttpRequestHeadersCommand } from "./types.ts";
|
|
3
|
+
export interface HttpRequestCommandEnvelope {
|
|
4
|
+
version: 1;
|
|
5
|
+
method: string;
|
|
6
|
+
url: string;
|
|
7
|
+
bodyBase64: string;
|
|
8
|
+
}
|
|
9
|
+
/** Wrap fetch so a trusted command can derive headers from the exact request. */
|
|
10
|
+
export declare function createRequestHeadersCommandFetch(config: HttpRequestHeadersCommand, delegate?: FetchLike): FetchLike;
|
|
11
|
+
//# sourceMappingURL=request-headers-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-headers-command.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/request-headers-command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAkJ5D,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACnB;AA8KD,iFAAiF;AACjF,wBAAgB,gCAAgC,CAC/C,MAAM,EAAE,yBAAyB,EACjC,QAAQ,GAAE,SAA4B,GACpC,SAAS,CAsCX","sourcesContent":["import { type ChildProcess, spawn, spawnSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport type { FetchLike } from \"@modelcontextprotocol/client\";\nimport type { HttpRequestHeadersCommand } from \"./types.ts\";\nimport { interpolateEnvVars } from \"./utils.ts\";\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst MAX_OUTPUT_BYTES = 64 * 1024;\nconst USE_PROCESS_GROUP = process.platform !== \"win32\";\nconst CLEANUP_TOKEN_ENV = \"NEXUS_MCP_REQUEST_HEADERS_CLEANUP_TOKEN\";\n// Busy hosts can exceed spawnSync's 1 MiB default when `ps axeww` dumps each\n// process environment. Keep discovery below a bounded cap instead of letting\n// `ps` get SIGTERM'd and reporting a false cleanup failure.\nconst PS_MAX_BUFFER_BYTES = 8 * 1024 * 1024;\n\nfunction isNoSuchProcessError(error: unknown): boolean {\n\treturn (\n\t\ttypeof error === \"object\" &&\n\t\terror !== null &&\n\t\t\"code\" in error &&\n\t\t(error as NodeJS.ErrnoException).code === \"ESRCH\"\n\t);\n}\n\nfunction runPosixPs(args: string[]): { status: number | null; signal: NodeJS.Signals | null; stdout: string } {\n\tif (process.env.NEXUS_MCP_TEST_FAIL_PS === \"1\") return { status: 1, signal: null, stdout: \"\" };\n\tconst result = spawnSync(\"ps\", args, { encoding: \"utf8\", maxBuffer: PS_MAX_BUFFER_BYTES });\n\treturn { status: result.status, signal: result.signal, stdout: result.stdout };\n}\n\nfunction psFailureReason(result: { status: number | null; signal: NodeJS.Signals | null }): string {\n\treturn result.status === null\n\t\t? `ps was killed by signal ${result.signal ?? \"unknown\"}`\n\t\t: `ps exited with code ${result.status}`;\n}\n\nfunction collectPosixProcessPids(rootPid: number, cleanupToken?: string): number[] {\n\tconst result = runPosixPs([\"axeww\", \"-o\", \"pid=,ppid=,command=\"]);\n\tif (result.status !== 0) {\n\t\tthrow new Error(`HTTP request headers command cleanup failed: ${psFailureReason(result)}`);\n\t}\n\n\tconst childrenByParent = new Map<number, number[]>();\n\tconst processPids = new Set<number>();\n\tconst needle = cleanupToken ? `${CLEANUP_TOKEN_ENV}=${cleanupToken}` : undefined;\n\tfor (const line of result.stdout.split(\"\\n\")) {\n\t\tconst match = /^\\s*(\\d+)\\s+(\\d+)(?:\\s+(.*))?$/.exec(line);\n\t\tif (!match) continue;\n\t\tconst pid = Number(match[1]);\n\t\tconst ppid = Number(match[2]);\n\t\tif (!Number.isInteger(pid) || !Number.isInteger(ppid)) continue;\n\t\tconst children = childrenByParent.get(ppid);\n\t\tif (children) children.push(pid);\n\t\telse childrenByParent.set(ppid, [pid]);\n\t\tif (needle && pid !== process.pid && match[3]?.includes(needle)) processPids.add(pid);\n\t}\n\n\tconst stack = [...(childrenByParent.get(rootPid) ?? [])];\n\twhile (stack.length > 0) {\n\t\tconst pid = stack.pop()!;\n\t\tprocessPids.add(pid);\n\t\tstack.push(...(childrenByParent.get(pid) ?? []));\n\t}\n\treturn [...processPids];\n}\n\nfunction assertPosixProcessDiscoveryAvailable(): void {\n\tconst result = runPosixPs([\"axeww\", \"-o\", \"pid=,ppid=,command=\"]);\n\tif (result.status !== 0) {\n\t\tthrow new Error(`HTTP request headers command cleanup failed: ${psFailureReason(result)}`);\n\t}\n}\n\nfunction isTaskkillNoSuchProcess(result: ReturnType<typeof spawnSync>): boolean {\n\treturn `${result.stdout ?? \"\"}\\n${result.stderr ?? \"\"}`.toLowerCase().includes(\"not found\");\n}\n\nfunction signalPid(pid: number, signal: NodeJS.Signals): void {\n\ttry {\n\t\tprocess.kill(pid, signal);\n\t} catch (error) {\n\t\tif (!isNoSuchProcessError(error)) throw error;\n\t}\n}\n\nfunction signalProcessGroup(pid: number, signal: NodeJS.Signals): void {\n\ttry {\n\t\tprocess.kill(-pid, signal);\n\t} catch (error) {\n\t\tif (!isNoSuchProcessError(error)) throw error;\n\t}\n}\n\nfunction killRequestHeadersCommand(\n\tchild: ChildProcess,\n\ttrackedPosixDescendantPids = new Set<number>(),\n\tcleanupToken?: string,\n): void {\n\tif (process.platform === \"win32\" && child.pid !== undefined) {\n\t\tconst result = spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], {\n\t\t\tencoding: \"utf8\",\n\t\t\twindowsHide: true,\n\t\t});\n\t\tif (result.status === 0 || isTaskkillNoSuchProcess(result)) return;\n\t\tthrow new Error(\n\t\t\t`HTTP request headers command cleanup failed: taskkill exited with code ${result.status ?? \"unknown\"}`,\n\t\t);\n\t}\n\n\tif (USE_PROCESS_GROUP && child.pid !== undefined) {\n\t\tconst frozenPids = new Set<number>();\n\t\tlet cleanupError: Error | undefined;\n\t\ttry {\n\t\t\tsignalProcessGroup(child.pid, \"SIGSTOP\");\n\t\t\tfor (const pid of trackedPosixDescendantPids) {\n\t\t\t\tsignalPid(pid, \"SIGSTOP\");\n\t\t\t\tfrozenPids.add(pid);\n\t\t\t}\n\t\t\tlet stablePasses = 0;\n\t\t\tfor (let pass = 0; pass < 16; pass++) {\n\t\t\t\tconst candidates = collectPosixProcessPids(child.pid, cleanupToken);\n\t\t\t\tconst newPids = candidates.filter((pid) => !frozenPids.has(pid));\n\t\t\t\tif (newPids.length === 0) {\n\t\t\t\t\tstablePasses++;\n\t\t\t\t\tif (stablePasses >= 2) return;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstablePasses = 0;\n\t\t\t\tfor (const pid of newPids) {\n\t\t\t\t\tsignalPid(pid, \"SIGSTOP\");\n\t\t\t\t\tfrozenPids.add(pid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcleanupError = new Error(\n\t\t\t\t\"HTTP request headers command cleanup failed: descendant process tree did not stabilize\",\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tcleanupError = error instanceof Error ? error : new Error(String(error));\n\t\t} finally {\n\t\t\tsignalProcessGroup(child.pid, \"SIGKILL\");\n\t\t\tfor (const pid of frozenPids) signalPid(pid, \"SIGKILL\");\n\t\t}\n\t\tif (cleanupError) throw cleanupError;\n\t\treturn;\n\t}\n\n\tchild.kill(\"SIGKILL\");\n}\n\nexport interface HttpRequestCommandEnvelope {\n\tversion: 1;\n\tmethod: string;\n\turl: string;\n\tbodyBase64: string;\n}\n\ntype CommandResult = { status: \"error\"; error: Error } | { status: \"success\"; headers: Headers };\n\nfunction resolvedCommand(config: HttpRequestHeadersCommand): {\n\tcommand: string;\n\targs: string[];\n\tenv: NodeJS.ProcessEnv;\n\ttimeoutMs: number;\n} {\n\tif (!config || typeof config !== \"object\" || Array.isArray(config)) {\n\t\tthrow new Error(\"HTTP request headers command must be an object\");\n\t}\n\tif (typeof config.command !== \"string\" || config.command.trim() === \"\") {\n\t\tthrow new Error(\"HTTP request headers command requires a non-empty command\");\n\t}\n\tif (\n\t\tconfig.args !== undefined &&\n\t\t(!Array.isArray(config.args) || config.args.some((arg) => typeof arg !== \"string\"))\n\t) {\n\t\tthrow new Error(\"HTTP request headers command args must be strings\");\n\t}\n\tif (\n\t\tconfig.env !== undefined &&\n\t\t(typeof config.env !== \"object\" ||\n\t\t\tArray.isArray(config.env) ||\n\t\t\tObject.values(config.env).some((value) => typeof value !== \"string\"))\n\t) {\n\t\tthrow new Error(\"HTTP request headers command env values must be strings\");\n\t}\n\tconst timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\tif (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 60_000) {\n\t\tthrow new Error(\"HTTP request headers command timeoutMs must be an integer between 1 and 60000\");\n\t}\n\treturn {\n\t\tcommand: interpolateEnvVars(config.command),\n\t\targs: (config.args ?? []).map(interpolateEnvVars),\n\t\tenv: {\n\t\t\t...process.env,\n\t\t\t...Object.fromEntries(\n\t\t\t\tObject.entries(config.env ?? {}).map(([key, value]) => [key, interpolateEnvVars(value)]),\n\t\t\t),\n\t\t},\n\t\ttimeoutMs,\n\t};\n}\n\nasync function invokeRequestHeadersCommand(\n\tconfig: HttpRequestHeadersCommand,\n\tenvelope: HttpRequestCommandEnvelope,\n\tsignal: AbortSignal,\n): Promise<Headers> {\n\tconst resolved = resolvedCommand(config);\n\tif (USE_PROCESS_GROUP) assertPosixProcessDiscoveryAvailable();\n\treturn new Promise<Headers>((resolve, reject) => {\n\t\tlet stdout = Buffer.alloc(0);\n\t\tlet settled = false;\n\t\tconst cleanupToken = randomUUID();\n\t\tconst child = spawn(resolved.command, resolved.args, {\n\t\t\tenv: { ...resolved.env, [CLEANUP_TOKEN_ENV]: cleanupToken },\n\t\t\tstdio: [\"pipe\", \"pipe\", \"ignore\"],\n\t\t\twindowsHide: true,\n\t\t\tdetached: USE_PROCESS_GROUP,\n\t\t});\n\n\t\tconst trackedPosixDescendantPids = new Set<number>();\n\t\tlet trackingError: Error | undefined;\n\t\tconst trackPosixDescendants = () => {\n\t\t\tif (!USE_PROCESS_GROUP || child.pid === undefined || settled || trackingError) return;\n\t\t\ttry {\n\t\t\t\tfor (const pid of collectPosixProcessPids(child.pid, cleanupToken)) trackedPosixDescendantPids.add(pid);\n\t\t\t} catch (error) {\n\t\t\t\ttrackingError = error instanceof Error ? error : new Error(String(error));\n\t\t\t}\n\t\t};\n\t\tconst descendantTracker = USE_PROCESS_GROUP ? setInterval(trackPosixDescendants, 50) : undefined;\n\t\tdescendantTracker?.unref();\n\n\t\tconst finish = (result: CommandResult) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\tif (descendantTracker) clearInterval(descendantTracker);\n\t\t\tsignal.removeEventListener(\"abort\", abort);\n\t\t\tif (result.status === \"error\") reject(result.error);\n\t\t\telse resolve(result.headers);\n\t\t};\n\t\tconst finishAfterKill = (result: CommandResult) => {\n\t\t\ttry {\n\t\t\t\tkillRequestHeadersCommand(child, trackedPosixDescendantPids, cleanupToken);\n\t\t\t\tfinish(result);\n\t\t\t} catch (cleanupError) {\n\t\t\t\tfinish({\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: cleanupError instanceof Error ? cleanupError : new Error(String(cleanupError)),\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t\tconst failAfterKill = (message: string) => {\n\t\t\tfinishAfterKill({ status: \"error\", error: trackingError ?? new Error(message) });\n\t\t};\n\t\tconst abort = () => {\n\t\t\tfailAfterKill(\"HTTP request headers command aborted\");\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tfailAfterKill(`HTTP request headers command timed out after ${resolved.timeoutMs}ms`);\n\t\t}, resolved.timeoutMs);\n\n\t\tsignal.addEventListener(\"abort\", abort, { once: true });\n\t\tif (signal.aborted) {\n\t\t\tabort();\n\t\t\treturn;\n\t\t}\n\n\t\tchild.on(\"error\", () =>\n\t\t\tfinish({ status: \"error\", error: new Error(\"HTTP request headers command failed to start\") }),\n\t\t);\n\t\tchild.stdout.on(\"data\", (chunk: Buffer | string) => {\n\t\t\tif (settled) return;\n\t\t\tstdout = Buffer.concat([stdout, Buffer.from(chunk)]);\n\t\t\tif (stdout.byteLength > MAX_OUTPUT_BYTES) {\n\t\t\t\tfailAfterKill(\"HTTP request headers command output exceeded 64 KiB\");\n\t\t\t}\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (settled) return;\n\t\t\tif (trackingError) {\n\t\t\t\tfailAfterKill(trackingError.message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (code !== 0) {\n\t\t\t\tfailAfterKill(`HTTP request headers command exited with code ${code ?? \"unknown\"}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet parsed: unknown;\n\t\t\ttry {\n\t\t\t\tparsed = JSON.parse(stdout.toString(\"utf8\"));\n\t\t\t} catch {\n\t\t\t\tfinishAfterKill({\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: new Error(\"HTTP request headers command returned invalid JSON\"),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\t\t\tfinishAfterKill({\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: new Error(\"HTTP request headers command must return a JSON object\"),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst entries = Object.entries(parsed);\n\t\t\tif (entries.some(([, value]) => typeof value !== \"string\")) {\n\t\t\t\tfinishAfterKill({\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: new Error(\"HTTP request headers command values must be strings\"),\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tfinishAfterKill({ status: \"success\", headers: new Headers(entries as Array<[string, string]>) });\n\t\t\t} catch {\n\t\t\t\tfinishAfterKill({\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\terror: new Error(\"HTTP request headers command returned an invalid header\"),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tchild.stdin.on(\"error\", () => {});\n\t\tchild.stdin.end(JSON.stringify(envelope));\n\t});\n}\n\n/** Wrap fetch so a trusted command can derive headers from the exact request. */\nexport function createRequestHeadersCommandFetch(\n\tconfig: HttpRequestHeadersCommand,\n\tdelegate: FetchLike = globalThis.fetch,\n): FetchLike {\n\t// Validate static configuration before the first request.\n\tresolvedCommand(config);\n\treturn async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n\t\tconst request = new Request(input, init);\n\t\tconst body = Buffer.from(await request.clone().arrayBuffer());\n\t\tconst derived = await invokeRequestHeadersCommand(\n\t\t\tconfig,\n\t\t\t{\n\t\t\t\tversion: 1,\n\t\t\t\tmethod: request.method.toUpperCase(),\n\t\t\t\turl: request.url,\n\t\t\t\tbodyBase64: body.toString(\"base64\"),\n\t\t\t},\n\t\t\trequest.signal,\n\t\t);\n\t\tconst headers = new Headers(request.headers);\n\t\tderived.forEach((value, name) => {\n\t\t\theaders.set(name, value);\n\t\t});\n\t\tconst forwardedInit: RequestInit = {\n\t\t\tmethod: request.method,\n\t\t\theaders,\n\t\t\t...(request.method === \"GET\" || request.method === \"HEAD\" ? {} : { body }),\n\t\t\tsignal: request.signal,\n\t\t};\n\t\tObject.assign(forwardedInit, {\n\t\t\tcache: request.cache,\n\t\t\tcredentials: request.credentials,\n\t\t\tintegrity: request.integrity,\n\t\t\tkeepalive: request.keepalive,\n\t\t\tmode: request.mode,\n\t\t\tredirect: request.redirect,\n\t\t\treferrer: request.referrer,\n\t\t\treferrerPolicy: request.referrerPolicy,\n\t\t});\n\t\treturn delegate(new URL(request.url), forwardedInit);\n\t};\n}\n"]}
|