@akon-labs/nexus-cli 0.1.9 → 0.1.11-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/LICENSE +1 -0
- package/README.md +3 -2
- package/dist/app-bridge.bundle.js +67 -0
- package/dist/cli/require-login.d.ts.map +1 -1
- package/dist/cli/require-login.js +2 -2
- package/dist/cli/require-login.js.map +1 -1
- package/dist/cli.js +20866 -1882
- package/dist/core/agent-session.d.ts +3 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +5 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auto-model.d.ts +1 -1
- package/dist/core/auto-model.d.ts.map +1 -1
- package/dist/core/auto-model.js +1 -1
- package/dist/core/auto-model.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +6 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +7 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +14 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +18 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +3 -3
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/package-manager.d.ts +15 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +50 -0
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +3 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +5 -5
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +3 -3
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/extensions/gitnexus/config.d.ts +15 -1
- package/dist/extensions/gitnexus/config.d.ts.map +1 -1
- package/dist/extensions/gitnexus/config.js +86 -2
- package/dist/extensions/gitnexus/config.js.map +1 -1
- package/dist/extensions/gitnexus/gateway.d.ts +6 -6
- package/dist/extensions/gitnexus/gateway.d.ts.map +1 -1
- package/dist/extensions/gitnexus/gateway.js +4 -4
- package/dist/extensions/gitnexus/gateway.js.map +1 -1
- package/dist/extensions/gitnexus/index.d.ts.map +1 -1
- package/dist/extensions/gitnexus/index.js +6 -4
- package/dist/extensions/gitnexus/index.js.map +1 -1
- package/dist/extensions/gitnexus/observatory.d.ts.map +1 -1
- package/dist/extensions/gitnexus/observatory.js +2 -2
- package/dist/extensions/gitnexus/observatory.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/mcp/abort.d.ts +3 -0
- package/dist/extensions/mcp/abort.d.ts.map +1 -0
- package/dist/extensions/mcp/abort.js +41 -0
- package/dist/extensions/mcp/abort.js.map +1 -0
- package/dist/extensions/mcp/agent-dir.d.ts +6 -0
- package/dist/extensions/mcp/agent-dir.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-dir.js +18 -0
- package/dist/extensions/mcp/agent-dir.js.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts +9 -0
- package/dist/extensions/mcp/agent-plugin-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/agent-plugin-loader.js +384 -0
- package/dist/extensions/mcp/agent-plugin-loader.js.map +1 -0
- package/dist/extensions/mcp/app-bridge.bundle.js +67 -0
- package/dist/extensions/mcp/commands.d.ts +47 -0
- package/dist/extensions/mcp/commands.d.ts.map +1 -0
- package/dist/extensions/mcp/commands.js +821 -0
- package/dist/extensions/mcp/commands.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +123 -38
- package/dist/extensions/mcp/config.d.ts.map +1 -1
- package/dist/extensions/mcp/config.js +1035 -70
- package/dist/extensions/mcp/config.js.map +1 -1
- package/dist/extensions/mcp/consent-manager.d.ts +14 -0
- package/dist/extensions/mcp/consent-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/consent-manager.js +60 -0
- package/dist/extensions/mcp/consent-manager.js.map +1 -0
- package/dist/extensions/mcp/direct-tools.d.ts +11 -0
- package/dist/extensions/mcp/direct-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/direct-tools.js +562 -0
- package/dist/extensions/mcp/direct-tools.js.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts +18 -0
- package/dist/extensions/mcp/elicitation-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/elicitation-handler.js +320 -0
- package/dist/extensions/mcp/elicitation-handler.js.map +1 -0
- package/dist/extensions/mcp/error-signal.d.ts +16 -0
- package/dist/extensions/mcp/error-signal.d.ts.map +1 -0
- package/dist/extensions/mcp/error-signal.js +22 -0
- package/dist/extensions/mcp/error-signal.js.map +1 -0
- package/dist/extensions/mcp/errors.d.ts +104 -0
- package/dist/extensions/mcp/errors.d.ts.map +1 -0
- package/dist/extensions/mcp/errors.js +171 -0
- package/dist/extensions/mcp/errors.js.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts +10 -0
- package/dist/extensions/mcp/glimpse-ui.d.ts.map +1 -0
- package/dist/extensions/mcp/glimpse-ui.js +67 -0
- package/dist/extensions/mcp/glimpse-ui.js.map +1 -0
- package/dist/extensions/mcp/host-html-template.d.ts +17 -0
- package/dist/extensions/mcp/host-html-template.d.ts.map +1 -0
- package/dist/extensions/mcp/host-html-template.js +442 -0
- package/dist/extensions/mcp/host-html-template.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +20 -15
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +1113 -82
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/init.d.ts +28 -0
- package/dist/extensions/mcp/init.d.ts.map +1 -0
- package/dist/extensions/mcp/init.js +631 -0
- package/dist/extensions/mcp/init.js.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts +3 -0
- package/dist/extensions/mcp/json-schema-validator.d.ts.map +1 -0
- package/dist/extensions/mcp/json-schema-validator.js +53 -0
- package/dist/extensions/mcp/json-schema-validator.js.map +1 -0
- package/dist/extensions/mcp/lifecycle.d.ts +56 -0
- package/dist/extensions/mcp/lifecycle.d.ts.map +1 -0
- package/dist/extensions/mcp/lifecycle.js +395 -0
- package/dist/extensions/mcp/lifecycle.js.map +1 -0
- package/dist/extensions/mcp/logger.d.ts +52 -0
- package/dist/extensions/mcp/logger.d.ts.map +1 -0
- package/dist/extensions/mcp/logger.js +134 -0
- package/dist/extensions/mcp/logger.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts +117 -0
- package/dist/extensions/mcp/mcp-auth-flow.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth-flow.js +869 -0
- package/dist/extensions/mcp/mcp-auth-flow.js.map +1 -0
- package/dist/extensions/mcp/mcp-auth.d.ts +162 -0
- package/dist/extensions/mcp/mcp-auth.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-auth.js +897 -0
- package/dist/extensions/mcp/mcp-auth.js.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts +25 -0
- package/dist/extensions/mcp/mcp-bearer-store.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-bearer-store.js +350 -0
- package/dist/extensions/mcp/mcp-bearer-store.js.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts +54 -0
- package/dist/extensions/mcp/mcp-callback-server.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-callback-server.js +454 -0
- package/dist/extensions/mcp/mcp-callback-server.js.map +1 -0
- package/dist/extensions/mcp/mcp-code.d.ts +48 -0
- package/dist/extensions/mcp/mcp-code.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-code.js +358 -0
- package/dist/extensions/mcp/mcp-code.js.map +1 -0
- package/dist/extensions/mcp/mcp-keyring-helper.cjs +89 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts +135 -0
- package/dist/extensions/mcp/mcp-oauth-provider.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js +491 -0
- package/dist/extensions/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts +59 -0
- package/dist/extensions/mcp/mcp-output-guard.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-output-guard.js +343 -0
- package/dist/extensions/mcp/mcp-output-guard.js.map +1 -0
- package/dist/extensions/mcp/mcp-panel.d.ts +71 -0
- package/dist/extensions/mcp/mcp-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-panel.js +973 -0
- package/dist/extensions/mcp/mcp-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-probe.d.ts +7 -0
- package/dist/extensions/mcp/mcp-probe.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-probe.js +155 -0
- package/dist/extensions/mcp/mcp-probe.js.map +1 -0
- package/dist/extensions/mcp/mcp-script-worker.mjs +130 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts +146 -0
- package/dist/extensions/mcp/mcp-setup-panel.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-setup-panel.js +1104 -0
- package/dist/extensions/mcp/mcp-setup-panel.js.map +1 -0
- package/dist/extensions/mcp/mcp-status.d.ts +12 -0
- package/dist/extensions/mcp/mcp-status.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-status.js +98 -0
- package/dist/extensions/mcp/mcp-status.js.map +1 -0
- package/dist/extensions/mcp/mcp-trace.d.ts +95 -0
- package/dist/extensions/mcp/mcp-trace.d.ts.map +1 -0
- package/dist/extensions/mcp/mcp-trace.js +252 -0
- package/dist/extensions/mcp/mcp-trace.js.map +1 -0
- package/dist/extensions/mcp/metadata-cache.d.ts +20 -0
- package/dist/extensions/mcp/metadata-cache.d.ts.map +1 -0
- package/dist/extensions/mcp/metadata-cache.js +318 -0
- package/dist/extensions/mcp/metadata-cache.js.map +1 -0
- package/dist/extensions/mcp/npx-resolver.d.ts +7 -0
- package/dist/extensions/mcp/npx-resolver.d.ts.map +1 -0
- package/dist/extensions/mcp/npx-resolver.js +505 -0
- package/dist/extensions/mcp/npx-resolver.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +21 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +15 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/onboarding-state.d.ts +13 -0
- package/dist/extensions/mcp/onboarding-state.d.ts.map +1 -0
- package/dist/extensions/mcp/onboarding-state.js +65 -0
- package/dist/extensions/mcp/onboarding-state.js.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts +3 -0
- package/dist/extensions/mcp/package-mcp-loader.d.ts.map +1 -0
- package/dist/extensions/mcp/package-mcp-loader.js +170 -0
- package/dist/extensions/mcp/package-mcp-loader.js.map +1 -0
- package/dist/extensions/mcp/panel-keys.d.ts +21 -0
- package/dist/extensions/mcp/panel-keys.d.ts.map +1 -0
- package/dist/extensions/mcp/panel-keys.js +29 -0
- package/dist/extensions/mcp/panel-keys.js.map +1 -0
- package/dist/extensions/mcp/prompts.d.ts +63 -0
- package/dist/extensions/mcp/prompts.d.ts.map +1 -0
- package/dist/extensions/mcp/prompts.js +297 -0
- package/dist/extensions/mcp/prompts.js.map +1 -0
- package/dist/extensions/mcp/proxy-modes.d.ts +15 -0
- package/dist/extensions/mcp/proxy-modes.d.ts.map +1 -0
- package/dist/extensions/mcp/proxy-modes.js +1421 -0
- package/dist/extensions/mcp/proxy-modes.js.map +1 -0
- package/dist/extensions/mcp/request-headers-command.d.ts +11 -0
- package/dist/extensions/mcp/request-headers-command.d.ts.map +1 -0
- package/dist/extensions/mcp/request-headers-command.js +334 -0
- package/dist/extensions/mcp/request-headers-command.js.map +1 -0
- package/dist/extensions/mcp/resource-tools.d.ts +2 -0
- package/dist/extensions/mcp/resource-tools.d.ts.map +1 -0
- package/dist/extensions/mcp/resource-tools.js +15 -0
- package/dist/extensions/mcp/resource-tools.js.map +1 -0
- package/dist/extensions/mcp/runtime-owner.d.ts +14 -0
- package/dist/extensions/mcp/runtime-owner.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime-owner.js +84 -0
- package/dist/extensions/mcp/runtime-owner.js.map +1 -0
- package/dist/extensions/mcp/sampling-handler.d.ts +18 -0
- package/dist/extensions/mcp/sampling-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/sampling-handler.js +229 -0
- package/dist/extensions/mcp/sampling-handler.js.map +1 -0
- package/dist/extensions/mcp/search-ranking.d.ts +25 -0
- package/dist/extensions/mcp/search-ranking.d.ts.map +1 -0
- package/dist/extensions/mcp/search-ranking.js +234 -0
- package/dist/extensions/mcp/search-ranking.js.map +1 -0
- package/dist/extensions/mcp/server-manager.d.ts +116 -0
- package/dist/extensions/mcp/server-manager.d.ts.map +1 -0
- package/dist/extensions/mcp/server-manager.js +1052 -0
- package/dist/extensions/mcp/server-manager.js.map +1 -0
- package/dist/extensions/mcp/session-recovery.d.ts +27 -0
- package/dist/extensions/mcp/session-recovery.d.ts.map +1 -0
- package/dist/extensions/mcp/session-recovery.js +140 -0
- package/dist/extensions/mcp/session-recovery.js.map +1 -0
- package/dist/extensions/mcp/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/extensions/mcp/state.d.ts +62 -0
- package/dist/extensions/mcp/state.d.ts.map +1 -0
- package/dist/extensions/mcp/state.js +2 -0
- package/dist/extensions/mcp/state.js.map +1 -0
- package/dist/extensions/mcp/tool-approval.d.ts +11 -0
- package/dist/extensions/mcp/tool-approval.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-approval.js +156 -0
- package/dist/extensions/mcp/tool-approval.js.map +1 -0
- package/dist/extensions/mcp/tool-metadata.d.ts +11 -0
- package/dist/extensions/mcp/tool-metadata.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-metadata.js +264 -0
- package/dist/extensions/mcp/tool-metadata.js.map +1 -0
- package/dist/extensions/mcp/tool-registrar.d.ts +21 -0
- package/dist/extensions/mcp/tool-registrar.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-registrar.js +229 -0
- package/dist/extensions/mcp/tool-registrar.js.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts +83 -0
- package/dist/extensions/mcp/tool-result-renderer.d.ts.map +1 -0
- package/dist/extensions/mcp/tool-result-renderer.js +345 -0
- package/dist/extensions/mcp/tool-result-renderer.js.map +1 -0
- package/dist/extensions/mcp/ts-shape.d.ts +3 -0
- package/dist/extensions/mcp/ts-shape.d.ts.map +1 -0
- package/dist/extensions/mcp/ts-shape.js +160 -0
- package/dist/extensions/mcp/ts-shape.js.map +1 -0
- package/dist/extensions/mcp/types.d.ts +521 -0
- package/dist/extensions/mcp/types.d.ts.map +1 -0
- package/dist/extensions/mcp/types.js +294 -0
- package/dist/extensions/mcp/types.js.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts +7 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js +37 -0
- package/dist/extensions/mcp/ui-app-bridge-helpers.js.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts +18 -0
- package/dist/extensions/mcp/ui-resource-handler.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-resource-handler.js +210 -0
- package/dist/extensions/mcp/ui-resource-handler.js.map +1 -0
- package/dist/extensions/mcp/ui-server.d.ts +52 -0
- package/dist/extensions/mcp/ui-server.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-server.js +740 -0
- package/dist/extensions/mcp/ui-server.js.map +1 -0
- package/dist/extensions/mcp/ui-session.d.ts +40 -0
- package/dist/extensions/mcp/ui-session.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-session.js +477 -0
- package/dist/extensions/mcp/ui-session.js.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts +105 -0
- package/dist/extensions/mcp/ui-stream-types.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-stream-types.js +61 -0
- package/dist/extensions/mcp/ui-stream-types.js.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts +5 -0
- package/dist/extensions/mcp/ui-tool-visibility.d.ts.map +1 -0
- package/dist/extensions/mcp/ui-tool-visibility.js +27 -0
- package/dist/extensions/mcp/ui-tool-visibility.js.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts +15 -0
- package/dist/extensions/mcp/unix-socket-transport.d.ts.map +1 -0
- package/dist/extensions/mcp/unix-socket-transport.js +85 -0
- package/dist/extensions/mcp/unix-socket-transport.js.map +1 -0
- package/dist/extensions/mcp/utils.d.ts +32 -0
- package/dist/extensions/mcp/utils.d.ts.map +1 -0
- package/dist/extensions/mcp/utils.js +336 -0
- package/dist/extensions/mcp/utils.js.map +1 -0
- package/dist/extensions/subagent/index.d.ts +62 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +195 -9
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent-render.d.ts +3 -0
- package/dist/extensions/subagent-render.d.ts.map +1 -0
- package/dist/extensions/subagent-render.js +39 -0
- package/dist/extensions/subagent-render.js.map +1 -0
- package/dist/extensions/web-access.d.ts.map +1 -1
- package/dist/extensions/web-access.js +1 -1
- package/dist/extensions/web-access.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20992 -2003
- package/dist/index.js.map +1 -1
- package/dist/mcp-keyring-helper.cjs +89 -0
- package/dist/mcp-script-worker.mjs +130 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts +1 -1
- package/dist/modes/interactive/components/response-separator.d.ts.map +1 -1
- package/dist/modes/interactive/components/response-separator.js +1 -1
- package/dist/modes/interactive/components/response-separator.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +3 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +14 -8
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/rpc-entry.js +20866 -1882
- package/dist/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/utils/hidden-spawn.d.ts +29 -0
- package/dist/utils/hidden-spawn.d.ts.map +1 -0
- package/dist/utils/hidden-spawn.js +101 -0
- package/dist/utils/hidden-spawn.js.map +1 -0
- package/dist/vendor/ai.js +110 -35
- package/docs/mcp.md +178 -0
- package/docs/pi-subagents.md +75 -0
- package/docs/quickstart.md +1 -1
- package/docs/usage.md +2 -1
- package/examples/extensions/pi-subagents-worker-policy.ts +86 -0
- package/native/win32/build.mjs +95 -0
- package/native/win32/prebuilds/win32-x64/hidden-spawn.exe +0 -0
- package/native/win32/src/hidden-spawn.c +157 -0
- package/npm-shrinkwrap.json +728 -6
- package/package.json +21 -6
- package/dist/extensions/mcp/client.d.ts +0 -86
- package/dist/extensions/mcp/client.d.ts.map +0 -1
- package/dist/extensions/mcp/client.js +0 -275
- package/dist/extensions/mcp/client.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-setup-panel.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-setup-panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAEN,oBAAoB,GAGpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAyC,MAAM,iBAAiB,CAAC;AAazF,MAAM,aAAa,GAAe;IACjC,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,GAAG;IACT,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,KAAK;CACZ,CAAC;AAEF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,SAAS,EAAE,CAAC,IAAY,EAAE,IAAY,EAAU;IAC/C,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,CACnD;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa,EAAY;IACxD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACxD,IAAI,YAAY,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;YACtC,OAAO,GAAG,SAAS,CAAC;YACpB,SAAS;QACV,CAAC;QACD,IAAI,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAAA,CACvC;AA4CD,MAAM,UAAU,GAAmD;IAClE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACnC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjC,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;CACvC,CAAC;AAuBF,sHAAsH;AACtH,wHAAwH;AACxH,SAAS,gBAAgB,CAAC,IAAY,EAAU;IAC/C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAChB,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG;gBAAE,GAAG,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI;iBAChB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;iBACrB,SAAS,EAAE;iBACX,UAAU,CAAC,GAAG,CAAC,CAAC;YAClB,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;YAChB,SAAS;QACV,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC1D,MAAM,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC;YACJ,SAAS;QACV,CAAC;QACD,MAAM,IAAI,EAAE,CAAC;QACb,CAAC,EAAE,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,sFAAsF;AACtF,SAAS,aAAa,CAAC,IAAY,EAAsB;IACxD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACjE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,qIAAqI;AACrI,SAAS,mBAAmB,CAAC,IAAY,EAAU;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,gDAAgD,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChF,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAAA,CACvB,CAAC,CAAC;AAAA,CACH;AAED,wJAAwJ;AACxJ,MAAM,oBAAoB,GAA2B;IACpD,QAAQ,EAAE,UAAU,EAAE,YAAY;IAClC,QAAQ,EAAE,SAAS,EAAE,OAAO;IAC5B,MAAM,EAAE,UAAU,EAAE,SAAS;IAC7B,MAAM,EAAE,UAAU,EAAE,SAAS;IAC7B,iBAAiB,EAAE,UAAU,EAAE,OAAO;CACtC,CAAC;AAEF,SAAS,YAAY,CAAC,MAAyB,EAAU;IACxD,OAAO,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AAAA,CAC/C;AAED,MAAM,OAAO,aAAa;IACjB,MAAM,CAAS;IACf,SAAS,CAAW;IACpB,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,GAAG,CAAC,CAAC;IACjB,UAAU,GAAG,CAAC,CAAC;IACf,cAAc,GAAG,CAAC,CAAC;IACnB,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,IAAI,GAAG,KAAK,CAAC;IACb,MAAM,GAAmE,IAAI,CAAC;IAC9E,aAAa,CAAqB;IAClC,SAAS,CAAqB;IAC9B,GAAG,CAA4B;IAC/B,CAAC,GAAG,aAAa,CAAC;IAClB,IAAI,CAAY;IAChB,iBAAiB,GAAyC,IAAI,CAAC;IAC/D,SAAS,CAAsB;IAC/B,SAAS,CAAsB;IAC/B,OAAO,CAAoB;IACnC,6MAA6M;IACrM,gBAAgB,CAAyB;IACzC,IAAI,CAAa;IACjB,MAAM,CAAU,aAAa,GAAG,MAAM,CAAC;IAE/C,YACC,SAA8B,EAC9B,SAA8B,EAC9B,OAA0B,EAC1B,GAA8B,EAC9B,IAAgB,EACf;QACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAAA,CAC9B;IAEO,sBAAsB,GAAS;QACtC,IAAI,IAAI,CAAC,iBAAiB;YAAE,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;QAAA,CACZ,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAAA,CAChC;IAEO,OAAO,GAAS;QACvB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC/B,CAAC;IAAA,CACD;IAED,qIAAmI;IAC3H,kBAAkB,GAAa;QACtC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,eAAe;gBACnB,KAAK,EAAE,sCAAsC;gBAC7C,WAAW,EAAE,0FAA0F,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,UAAU,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS;aACrM,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,gCAAgC;YACvC,WAAW,EAAE,4DAA4D;SACzE,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,eAAe,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9F,OAAO,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,oCAAoC;gBAC3C,WAAW,EAAE,8DAA8D;aAC3E,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,iBAAiB;YACrB,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE,oEAAoE;SACjF,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,YAAY;gBAChB,KAAK,EAAE,4BAA4B;gBACnC,WAAW,EAAE,uEAAuE;aACpF,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAEO,oBAAoB,GAAa;QACxC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,oBAAoB,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACnG,CAAC;QACD,IACC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU;YACrC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc;YACxC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU;YACpC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK;YAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,EACnC,CAAC;YACF,OAAO,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,gBAAgB;gBACpB,KAAK,EAAE,oCAAoC;gBAC3C,WAAW,EACV,gGAAgG;aACjG,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAEO,mBAAmB,GAAa;QACvC,OAAO;YACN;gBACC,EAAE,EAAE,kBAAkB;gBACtB,KAAK,EAAE,+BAA+B;gBACtC,WAAW,EAAE,mEAAmE;aAChF;YACD;gBACC,EAAE,EAAE,gBAAgB;gBACpB,KAAK,EAAE,8BAA8B;gBACrC,WAAW,EAAE,sCAAsC;aACnD;YACD;gBACC,EAAE,EAAE,eAAe;gBACnB,KAAK,EAAE,qBAAqB;gBAC5B,WAAW,EAAE,0FAA0F;aACvG;SACD,CAAC;IAAA,CACF;IAEO,sBAAsB,GAAa;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACN;oBACC,EAAE,EAAE,uBAAuB;oBAC3B,KAAK,EAAE,4BAA4B;oBACnC,WAAW,EAAE,yCAAyC;iBACtD;aACD,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC/B,EAAE,EAAE,uBAAgC;YACpC,KAAK,EAAE,MAAM,CAAC,IAAI;YAClB,WAAW,EAAE,MAAM,CAAC,QAAQ;gBAC3B,CAAC,CAAC,mCAAmC;gBACrC,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ;oBACvC,CAAC,CAAC,gCAAgC;oBAClC,CAAC,CAAC,iCAAiC;YACrC,SAAS,EAAE,MAAM;SACjB,CAAC,CAAC,CAAC;IAAA,CACJ;IAED;;;;OAIG;IACK,UAAU,CAAC,MAAc,EAAU;QAC1C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAO,CAAC,EAAE,CAAC,CAAC;YAC5F,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,MAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxF,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ;gBAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,MAAI,CAAC,CAAC;YAC7D,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;gBAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAChG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,MAAI,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,CAAC;IAAA,CACV;IAEO,UAAU,GAAa;QAC9B,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,KAAK,SAAS;gBACb,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpC,KAAK,QAAQ;gBACZ,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnC,KAAK,WAAW;gBACf,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACvC,CAAC;IAAA,CACD;IAEO,QAAQ,CAAC,SAAiB,EAAQ;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAa,CAAC;QACtF,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAAA,CACzB;IAEO,gBAAgB,GAAa;QACpC,MAAM,KAAK,GAAG;YACb,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;YACxF,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SACpD,CAAC;QACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAAA,CAC3B;IAED,WAAW,CAAC,IAAY,EAAQ;QAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnC,IAAI,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC1D,gHAA8G;gBAC9G,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO;YACR,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACpE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC9D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO;QAEtB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACR,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAClB,OAAO;QACR,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QACD,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;YACtE,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC1C,IAAI,QAAQ;gBAAE,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IAAA,CACD;IAEO,kBAAkB,CAAC,IAAY,EAAQ;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClC,CAAC;IAAA,CACD;IAEO,gBAAgB,CAAC,IAAY,EAAQ;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAAA,CAC9D,CAAC,CAAC;QACJ,CAAC;IAAA,CACD;IAEO,mBAAmB,CAAC,IAAY,EAAQ;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;IAAA,CACD;IAEO,wBAAwB,CAAC,IAAY,EAAQ;QACpD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAClC,CAAC;IAAA,CACD;IAED,oGAAoG;IAC5F,iBAAiB,GAAuB;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAAA,CAClC;IAED,2HAA2H;IACnH,qBAAqB,CAAC,KAA2B,EAAQ;QAChE,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;YAC/C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IAAA,CAC1C;IAEO,KAAK,CAAC,oBAAoB,GAAkB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,MAAM,CAAC,EAAE,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;gBACpD,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBACpC,IAAI,CAAC,qBAAqB,CAAC;oBAC1B,IAAI,EAAE,MAAM,CAAC,UAAU;oBACvB,QAAQ,EAAE,KAAK;oBACf,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,KAAK;oBAClB,QAAQ,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG;oBACb,IAAI,EAAE,SAAS,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,IAAI,8CAA8C;oBAChG,IAAI,EAAE,SAAS;iBACf,CAAC;YAAA,CACF,CAAC,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,EAAE,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YAClD,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,OAAiB,CAAC,CAAC,CAAE,MAAgB,CAAC;gBAC3E,IAAI,CAAC,qBAAqB,CAAC;oBAC1B,IAAI,EAAE,MAAM,CAAC,UAAU;oBACvB,QAAQ,EAAE,KAAK;oBACf,IAAI;oBACJ,WAAW;oBACX,QAAQ,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,WAAW,EAAE,CAAC;oBAClB,IAAI,CAAC,MAAM,GAAG;wBACb,IAAI,EAAE,SAAS,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,IAAI,8CAA8C;wBAChG,IAAI,EAAE,SAAS;qBACf,CAAC;oBACF,OAAO;gBACR,CAAC;gBACD,+EAA6E;gBAC7E,mEAAmE;gBACnE,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,MAAM,CAAC,UAAU,sCAAoC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACtG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5F,IAAI,CAAC,qBAAqB,CAAC;oBAC1B,IAAI,EAAE,MAAM,CAAC,UAAU;oBACvB,QAAQ,EAAE,KAAK;oBACf,IAAI;oBACJ,WAAW;oBACX,QAAQ,EAAE,UAAU,CAAC,EAAE;iBACvB,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE;oBAC1B,CAAC,CAAC;wBACA,IAAI,EAAE,0BAA0B,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,+CAA+C;wBAChH,IAAI,EAAE,SAAS;qBACf;oBACF,CAAC,CAAC;wBACA,IAAI,EAAE,SAAS,MAAM,CAAC,UAAU,OAAO,MAAM,CAAC,IAAI,gCAAgC,UAAU,CAAC,OAAO,oDAAoD;wBACxJ,IAAI,EAAE,SAAS;qBACf,CAAC;YAAA,CACJ,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAAA,CACzB;IAEO,KAAK,CAAC,SAAS,CAAC,MAAc,EAAiB;QACtD,IAAI,MAAM,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,kBAAkB,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,CAAC;gBAC5D,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,GAAG;oBACb,IAAI,EAAE,2BAA2B,MAAM,CAAC,IAAI,8CAA8C;oBAC1F,IAAI,EAAE,SAAS;iBACf,CAAC;YAAA,CACF,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,gBAAgB,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,kBAAkB,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC;YAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,kBAAkB,IAAI,MAAM,CAAC,EAAE,KAAK,gBAAgB,EAAE,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,2BAA2B,CAAC;YAC3G,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,uBAAuB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;YAChC,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBACpF,IAAI,CAAC,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;gBAClE,IAAI,CAAC,MAAM,GAAG;oBACb,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,IAAI,4BAA0B;oBAC3G,IAAI,EAAE,SAAS;iBACf,CAAC;YAAA,CACF,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG;YACb,IAAI,EAAE,oFAAoF;YAC1F,IAAI,EAAE,OAAO;SACb,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAAA,CACzB;IAEO,KAAK,CAAC,oBAAoB,GAAkB;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;aACrC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,iDAAiD,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YAC3F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM;gBACV,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC;wBACA,IAAI,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,8CAA8C;wBACtG,IAAI,EAAE,SAAS;qBACf;oBACF,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACpE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;QAAA,CACxB,CAAC,CAAC;IAAA,CACH;IAEO,gBAAgB,GAAS;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAAA,CAC7D,CAAC,CAAC;IAAA,CACH;IAEO,oBAAoB,GAAS;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,EAAE,SAAS,CAAC;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,uCAAuC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC9F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,uCAAuC,MAAM,CAAC,IAAI,MAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC9F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,CAAC,qBAAqB,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QAAA,CAChF,CAAC,CAAC;IAAA,CACH;IAEO,KAAK,CAAC,OAAO,CAAC,EAAuB,EAAiB;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACJ,MAAM,EAAE,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,GAAG;gBACb,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC5D,IAAI,EAAE,SAAS;aACf,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC1B,CAAC;IAAA,CACD;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,KAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,MAAI,MAAM,KAAG,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;YACpE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,GACT,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;gBAC7B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;gBAChB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;oBAC/B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;oBAChB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBACzD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,MAAI,MAAM,KAAG,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,MAAI,MAAM,KAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAAA,CAC/C;IAED,YAAY,CAAC,KAAa,EAAQ;QACjC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAAA,CACvB;IAED;;;;;OAKG;IACK,WAAW,CAAC,KAAe,EAAE,MAAc,EAAE,OAAe,EAAY;QAC/E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,8EAA8E;QAC9E,mFAAiF;QACjF,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO;YACN,GAAG,IAAI;YACP,IAAI,CAAC,OAAO,CACX,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,OAAK,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,EAC5F,MAAM,CACN;YACD,MAAM;YACN,OAAO;SACP,CAAC;IAAA,CACF;IAEO,YAAY,GAAW;QAC9B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7B,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAC1G,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAAA,CACZ;IAEO,aAAa,CAAC,MAAc,EAAY;QAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC;QACvC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAE7G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAErC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,OAAK,KAAK,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC;YAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7G,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS;gBACtC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;oBAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;oBACd,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;wBAC3D,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;wBAChB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;gBAClB,CAAC,CAAC,SAAS,CAAC;YACb,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM;gBAClC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;gBACxC,CAAC,CAAC,cAAc;oBACf,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;oBAC3B,CAAC,CAAC,KAAK,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,OAAK,OAAO,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAErC,kFAAgF;QAChF,4EAA4E;QAC5E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3F,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,YAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,+BAA8B,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/G,MAAM,QAAQ,GACb,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;YAC3F,CAAC,CAAC,eAAc;YAChB,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,OAAO;YACnB,CAAC,CAAC,+BAA0B,QAAQ,cAAa;YACjD,CAAC,CAAC,gBAAgB,WAAW,wBAAoB,QAAQ,GAAG,SAAS,GAAG,QAAQ,iCAAiC,CAAC;QACnH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,aAAa,CAAC,MAAc,EAAY;QAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,0EAA0E,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACpE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACtE,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO;aACrC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,kBAAkB,CACzC,oCAAoC,EACpC,OAAO,EACP,EAAE,EACF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CACzB,EAAE,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,WAAW,CAAC,MAAc,EAAY;QAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,uEAAuE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,cAAc,CAAC,MAAc,EAAY;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5G,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,0DAAwD,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9G,CAAC;QACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9E,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,0FAAwF;QACxF,wEAAwE;QACxE,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/F,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,mDAAmD,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxG,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,mBAAmB,CAAC,MAAc,EAAY;QACrD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QACtG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,yBAAyB,QAAQ,mBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACxG,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,oBAAoB,GAAW;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAClC,OAAO,EAAE,CACR,IAAI,CAAC,CAAC,CAAC,OAAO,EACd,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,cAAc;gBAC1C,CAAC,CAAC,sCAAsC;gBACxC,CAAC,CAAC,8BAA8B,CACjC,CAAC;QACH,CAAC;QAED,IACC,IAAI,CAAC,SAAS,CAAC,gBAAgB,KAAK,CAAC;YACrC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC,EAChF,CAAC;YACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,0EAA0E,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACnG,OAAO,EAAE,CACR,IAAI,CAAC,CAAC,CAAC,IAAI,EACX,YAAY,IAAI,CAAC,SAAS,CAAC,gBAAgB,8BAA8B,iBAAiB,gBAAgB,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAC/I,CAAC;IAAA,CACF;IAEO,oBAAoB,GAAW;QACtC,MAAM,QAAQ,GACb,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACpC,CAAC,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,mBAAmB,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY;YAC7K,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,YAAY,GACjB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YAClC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,sBAAsB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY;YACvH,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YAClC,OAAO,wFAAwF,QAAQ,GAAG,YAAY,EAAE,CAAC;QAC1H,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,gBAAgB,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChF,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,+BAA+B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,2DAA2D,QAAQ,GAAG,YAAY,EAAE,CAAC;QACnN,CAAC;QACD,OAAO,iGAAiG,QAAQ,GAAG,YAAY,EAAE,CAAC;IAAA,CAClI;IAEO,kBAAkB,CAAC,KAAa,EAAkC;QACzE,IAAI,KAAK,IAAI,mBAAmB;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,mBAAmB,CAAC,CAAC,CAAC;QACxG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAAC,EAAE,CAAC;IAAA,CACpE;IAEO,YAAY,CAAC,MAAc,EAAU;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IAAA,CAC/B;IAEO,YAAY,CAAC,MAAc,EAAU;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAAA,CAChF;IAEO,gBAAgB,CAAC,MAAe,EAAE,QAAQ,GAAG,qBAAqB,EAAY;QACrF,QAAQ,MAAM,EAAE,EAAE,EAAE,CAAC;YACpB,KAAK,eAAe;gBACnB,OAAO,IAAI,CAAC,kBAAkB,CAC7B,oCAAoC,EACpC,IAAI,CAAC,SAAS,CAAC,cAAc,CAC5B,IAAI,CAAC,SAAS,CAAC,OAAO;qBACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACvD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAC5B,EACD;oBACC,qBAAqB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACvH,iFAAiF;iBACjF,EACD,QAAQ,CACR,CAAC;YACH,KAAK,cAAc;gBAClB,OAAO;oBACN,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,kCAAkC,CAAC,EAAE,QAAQ,CAAC;oBACrE,yEAAyE;oBACzE,GAAG;wBACF,GAAG;wBACH,mBAAmB;wBACnB,0BAA0B;wBAC1B,yBAAyB;wBACzB,mDAAmD;wBACnD,OAAO;wBACP,KAAK;wBACL,GAAG;qBACH,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAG,CAAC,CAAC,CAAC;oBACvE,GAAG,IAAI,CAAC,aAAa,CACpB;wBACC,EAAE;wBACF,2GAA2G;qBAC3G,EACD,QAAQ,CACR;iBACD,CAAC;YACH,KAAK,iBAAiB,EAAE,CAAC;gBACxB,MAAM,QAAQ,GACb,IAAI,CAAC,SAAS,CAAC,mBAAmB,KAAK,KAAK;oBAC3C,CAAC,CAAC,qOAAmO;oBACrO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,KAAK,QAAQ;wBAChD,CAAC,CAAC,qNAAmN;wBACrN,CAAC,CAAC,yLAAuL,CAAC;gBAC7L,MAAM,YAAY,GACjB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;oBACpC,CAAC,CAAC,2GAA2G;oBAC7G,CAAC,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,0GAAwG,CAAC;gBAC/N,OAAO,IAAI,CAAC,aAAa,CACxB;oBACC,mKAAmK;oBACnK,EAAE;oBACF,oFAAkF;oBAClF,qFAAmF;oBACnF,oBAAkB,gBAAgB,EAAE,mEAAmE;oBACvG,EAAE;oBACF,QAAQ;oBACR,EAAE;oBACF,0KAA0K;oBAC1K,EAAE;oBACF,YAAY;oBACZ,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS;yBACzB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;yBACX,GAAG,CACH,CAAC,QAAQ,EAAE,EAAE,CACZ,KAAK,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAC7H;iBACF,EACD,QAAQ,CACR,CAAC;YACH,CAAC;YACD,KAAK,YAAY;gBAChB,OAAO,IAAI,CAAC,aAAa,CACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,GAAG,CAAC;oBACjC,CAAC,CAAC,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACjD,CAAC,CAAC,CAAC,gCAAgC,CAAC,EACrC,QAAQ,CACR,CAAC;YACH,KAAK,gBAAgB,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,CAAC;gBACnD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,4DAA4D,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACrG,CAAC;gBACD,OAAO,IAAI,CAAC,kBAAkB,CAC7B,0BAA0B,EAC1B,OAAO,EACP;oBACC,eAAe,UAAU,CAAC,cAAc,IAAI,WAAW,EAAE;oBACzD,WAAW,UAAU,CAAC,UAAU,IAAI,KAAK,EAAE;oBAC3C,gBAAgB,UAAU,CAAC,UAAU,IAAI,YAAY,EAAE;iBACvD,EACD,QAAQ,CACR,CAAC;YACH,CAAC;YACD,KAAK,kBAAkB,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;gBAC7B,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,qCAAqC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1F,OAAO,IAAI,CAAC,kBAAkB,CAC7B,GAAG,MAAM,CAAC,IAAI,gBAAgB,EAC9B,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,EACzC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACnG,QAAQ,CACR,CAAC;YACH,CAAC;YACD,KAAK,kBAAkB;gBACtB,OAAO,IAAI,CAAC,kBAAkB,CAC7B,iDAAiD,EACjD,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,EACtC;oBACC,gBAAgB,gBAAgB,EAAE,yNAAuN;oBACzP,EAAE;oBACF,yPAAyP;iBACzP,EACD,QAAQ,CACR,CAAC;YACH,KAAK,kBAAkB;gBACtB,OAAO;oBACN,GAAG,IAAI,CAAC,aAAa,CACpB,CAAC,iFAA+E,CAAC,EACjF,QAAQ,CACR;oBACD,EAAE;oBACF,mBAAmB,CAAC,eAAe,CAAC,wCAAwC,EAAE,QAAQ,EAAE,KAAG,CAAC,CAAC;oBAC7F,EAAE;oBACF,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,2BAA2B,CAAC;oBAC7C,mBAAmB,CAClB,eAAe,CAAC,8DAA8D,EAAE,QAAQ,EAAE,KAAG,CAAC,CAC9F;oBACD,EAAE;oBACF,GAAG,IAAI,CAAC,aAAa,CACpB;wBACC,4FAA0F;wBAC1F,sEAAsE;qBACtE,EACD,QAAQ,CACR;iBACD,CAAC;YACH,KAAK,gBAAgB;gBACpB,OAAO;oBACN,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,4CAA4C,CAAC,EAAE,QAAQ,CAAC;oBAC/E,EAAE;oBACF,mBAAmB,CAClB,eAAe,CACd,qFAAqF,EACrF,QAAQ,EACR,KAAG,CACH,CACD;oBACD,EAAE;oBACF,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,2BAA2B,CAAC;oBAC7C,mBAAmB,CAClB,eAAe,CAAC,sDAAsD,EAAE,QAAQ,EAAE,KAAG,CAAC,CACtF;oBACD,EAAE;oBACF,GAAG,IAAI,CAAC,aAAa,CACpB;wBACC,+FAA6F;wBAC7F,sEAAsE;qBACtE,EACD,QAAQ,CACR;iBACD,CAAC;YACH,KAAK,uBAAuB,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;gBAChC,IAAI,CAAC,MAAM;oBACV,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,6DAA6D,CAAC,EAAE,QAAQ,CAAC,CAAC;gBACtG,OAAO,IAAI,CAAC,aAAa,CACxB;oBACC,GAAG,MAAM,CAAC,IAAI,QAAM,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,eAAe,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;oBAC9N,EAAE;oBACF,kBAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,uCAAuC;oBAC/F,GAAG,CAAC,MAAM,CAAC,WAAW;wBACrB,CAAC,CAAC;4BACA,EAAE;4BACF,MAAM,CAAC,QAAQ;gCACd,CAAC,CAAC,mFAAmF;gCACrF,CAAC,CAAC,uLAAqL;yBACxL;wBACF,CAAC,CAAC,EAAE,CAAC;iBACN,EACD,QAAQ,CACR,CAAC;YACH,CAAC;YACD;gBACC,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,uBAAuB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjE,CAAC;IAAA,CACD;IAEO,aAAa,CAAC,KAAe,EAAE,KAAK,GAAG,qBAAqB,EAAY;QAC/E,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAEO,kBAAkB,CACzB,KAAa,EACb,OAA2B,EAC3B,KAAK,GAAa,EAAE,EACpB,KAAK,GAAG,qBAAqB,EAClB;QACX,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,KAAK,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CACT,GAAG,QAAQ,CACV,OAAO,CAAC,OAAO;YACd,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,uDAAuD,EAC1D,KAAK,CACL,CACD,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,qEAAqE;YACrE,qCAAqC;YACrC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAG,CAAC,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CACT,GAAG,QAAQ,CACV,OAAK,SAAS,CAAC,MAAM,GAAG,QAAQ,kBAAkB,SAAS,CAAC,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAChG,KAAK,CACL,CACD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,OAAO,CAAC,IAAY,EAAE,MAAc,EAAU;QACrD,MAAM,KAAK,GAAG,CAAC,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAG,EAAE,IAAI,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC,CAAC;QACnD,OAAO,MAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAG,CAAC;IAAA,CACnF;IAED,UAAU,GAAS,EAAC,CAAC;IAErB,OAAO,GAAS;QACf,IAAI,CAAC,OAAO,EAAE,CAAC;IAAA,CACf;CACD;AAED,MAAM,UAAU,mBAAmB,CAClC,SAA8B,EAC9B,SAA8B,EAC9B,OAA0B,EAC1B,GAA8B,EAC9B,IAAgB,EACsB;IACtC,OAAO,IAAI,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,CACnE","sourcesContent":["import { matchesKey, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { getConfigDirName } from \"./agent-dir.ts\";\nimport {\n\ttype ConfigWritePreview,\n\tKNOWN_SERVER_PRESETS,\n\ttype KnownServerPreset,\n\ttype McpDiscoverySummary,\n} from \"./config.ts\";\nimport type { McpOnboardingState } from \"./onboarding-state.ts\";\nimport { createPanelKeys, type PanelKeybindings, type PanelKeys } from \"./panel-keys.ts\";\nimport type { ImportKind, ServerEntry } from \"./types.ts\";\n\ninterface SetupTheme {\n\tborder: string;\n\ttitle: string;\n\tselected: string;\n\thint: string;\n\tsuccess: string;\n\twarning: string;\n\tmuted: string;\n}\n\nconst DEFAULT_THEME: SetupTheme = {\n\tborder: \"2\",\n\ttitle: \"36\",\n\tselected: \"32\",\n\thint: \"2\",\n\tsuccess: \"32\",\n\twarning: \"33\",\n\tmuted: \"2;3\",\n};\n\nconst MIN_PANEL_WIDTH = 24;\nconst COMPACT_WIDTH = 60;\nconst COMPACT_ACTION_ROWS = 7;\nconst DESKTOP_PREVIEW_WIDTH = 74;\n\nfunction fg(code: string, text: string): string {\n\treturn code ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n}\n\nfunction wrapText(text: string, width: number): string[] {\n\tif (width <= 8) return [text];\n\tconst words = text.split(/\\s+/).filter(Boolean);\n\tconst lines: string[] = [];\n\tlet current = \"\";\n\tfor (const word of words) {\n\t\tconst candidate = current ? `${current} ${word}` : word;\n\t\tif (visibleWidth(candidate) <= width) {\n\t\t\tcurrent = candidate;\n\t\t\tcontinue;\n\t\t}\n\t\tif (current) lines.push(current);\n\t\tcurrent = word;\n\t}\n\tif (current) lines.push(current);\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\nexport interface SetupPanelCallbacks {\n\tpreviewImports: (imports: ImportKind[]) => ConfigWritePreview;\n\tpreviewStarterProject: () => ConfigWritePreview;\n\tpreviewRepoPrompt: () => ConfigWritePreview | null;\n\tpreviewKnownServer: (preset: KnownServerPreset) => ConfigWritePreview;\n\tadoptImports: (imports: ImportKind[]) => Promise<{ added: ImportKind[]; path: string }>;\n\tscaffoldProjectConfig: () => Promise<{ path: string }>;\n\taddRepoPrompt: () => Promise<{ path: string; serverName: string }>;\n\taddKnownServer: (preset: KnownServerPreset) => Promise<{ path: string; serverName: string }>;\n\topenPath: (path: string) => Promise<void>;\n\tmarkSetupCompleted: () => void;\n\t/** Replace the main chat input with `text`, so the user lands on a ready-to-edit command after this panel closes. */\n\tseedEditor: (text: string) => void;\n\t/** Flip a configured server's disabled flag in the project config. */\n\ttoggleServerDisabled: (serverName: string, disabled: boolean) => Promise<{ path: string; changed: boolean }>;\n\t/** Run the actual OAuth sign-in flow (opens a browser) for an already-loaded, OAuth-capable server. */\n\t/** `fallbackEntry` lets a server just written this session (not yet in the live config) authenticate immediately, before /reload. */\n\tauthenticateServer: (serverName: string, fallbackEntry?: ServerEntry) => Promise<{ ok: boolean; message: string }>;\n}\n\nexport interface InstalledServerEntry {\n\tname: string;\n\tdisabled: boolean;\n\tkind: \"stdio\" | \"http\";\n\t/** Whether this server is configured for OAuth, so the Installed tab can offer a sign-in action. */\n\tauthCapable: boolean;\n\t/** Whether OAuth tokens actually exist for this server right now. Meaningless (false) when authCapable is false. */\n\tsignedIn: boolean;\n}\n\nexport interface SetupPanelOptions {\n\tmode: \"empty\" | \"setup\";\n\tonboardingState: McpOnboardingState;\n\tkeybindings?: PanelKeybindings;\n\t/** Effective, already-configured servers (from every source), for the Installed tab and the Presets \"active\" marker. */\n\tinstalledServers: InstalledServerEntry[];\n}\n\ntype Screen = \"empty\" | \"setup\" | \"imports\" | \"paths\" | \"confirm-preset\" | \"advanced\";\n\ntype SetupTab = \"presets\" | \"custom\" | \"installed\";\n\nconst SETUP_TABS: ReadonlyArray<{ id: SetupTab; label: string }> = [\n\t{ id: \"presets\", label: \"Presets\" },\n\t{ id: \"custom\", label: \"Custom\" },\n\t{ id: \"installed\", label: \"Installed\" },\n];\n\ntype ActionId =\n\t| \"adopt-imports\"\n\t| \"view-example\"\n\t| \"show-precedence\"\n\t| \"open-paths\"\n\t| \"add-repoprompt\"\n\t| \"add-known-server\"\n\t| \"add-custom-stdio\"\n\t| \"add-custom-url\"\n\t| \"open-advanced\"\n\t| \"scaffold-project\"\n\t| \"view-installed-server\";\n\ninterface Action {\n\tid: ActionId;\n\tlabel: string;\n\tdescription: string;\n\tpreset?: KnownServerPreset;\n\tinstalled?: InstalledServerEntry;\n}\n\n/** Server-type tag shown next to a preset row; color must survive any terminal, so it's always plain colored text. */\n/** Color a JSON-ish line: keys cyan, string values green, braces/brackets dim. Safe only for short, unwrapped lines. */\nfunction colorizeJsonLine(line: string): string {\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ch = line[i]!;\n\t\tif (ch === '\"') {\n\t\t\tlet end = i + 1;\n\t\t\twhile (end < line.length && line[end] !== '\"') end++;\n\t\t\tconst str = line.slice(i, Math.min(end + 1, line.length));\n\t\t\tconst isKey = line\n\t\t\t\t.slice(i + str.length)\n\t\t\t\t.trimStart()\n\t\t\t\t.startsWith(\":\");\n\t\t\tresult += fg(isKey ? \"36\" : \"32\", str);\n\t\t\ti += str.length;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === \"{\" || ch === \"}\" || ch === \"[\" || ch === \"]\") {\n\t\t\tresult += fg(\"2\", ch);\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += ch;\n\t\ti++;\n\t}\n\treturn result;\n}\n\n/** Diff-line color by prefix, or undefined for a context line that needs no color. */\nfunction diffLineColor(line: string): string | undefined {\n\tif (line.startsWith(\"+++\") || line.startsWith(\"---\")) return \"2\";\n\tif (line.startsWith(\"+\")) return \"32\";\n\tif (line.startsWith(\"-\")) return \"31\";\n\treturn undefined;\n}\n\n/** Color `/mcp add` command syntax: the command itself cyan, --flags yellow, <placeholders> dim italic. Leaves spacing untouched. */\nfunction colorizeCommandLine(line: string): string {\n\treturn line.replace(/(\\/mcp add\\b|--[a-zA-Z-]+|<[^>]+>|\\[[^\\]]+\\])/g, (match) => {\n\t\tif (match.startsWith(\"<\") || match.startsWith(\"[\")) return fg(\"2;3\", match);\n\t\tif (match.startsWith(\"--\")) return fg(\"33\", match);\n\t\treturn fg(\"36\", match);\n\t});\n}\n\n/** Per-preset accent color for the name, so the list scans by identity, not just by type. 256-color codes, distinct from the type-tag palette above. */\nconst PRESET_ACCENT_COLORS: Record<string, string> = {\n\tdeepwiki: \"38;5;111\", // soft blue\n\tcontext7: \"38;5;80\", // teal\n\tnotion: \"38;5;141\", // purple\n\tgithub: \"38;5;215\", // orange\n\t\"chrome-devtools\": \"38;5;211\", // pink\n};\n\nfunction presetAccent(preset: KnownServerPreset): string {\n\treturn PRESET_ACCENT_COLORS[preset.id] ?? \"37\";\n}\n\nexport class McpSetupPanel {\n\tprivate screen: Screen;\n\tprivate activeTab: SetupTab;\n\tprivate actionCursor = 0;\n\tprivate importCursor = 0;\n\tprivate pathCursor = 0;\n\tprivate advancedCursor = 0;\n\tprivate selectedImports = new Set<ImportKind>();\n\tprivate busy = false;\n\tprivate notice: { text: string; tone: \"success\" | \"warning\" | \"muted\" } | null = null;\n\tprivate pendingAction: Action | undefined;\n\tprivate maxHeight: number | undefined;\n\tprivate tui: { requestRender(): void };\n\tprivate t = DEFAULT_THEME;\n\tprivate keys: PanelKeys;\n\tprivate inactivityTimeout: ReturnType<typeof setTimeout> | null = null;\n\tprivate discovery: McpDiscoverySummary;\n\tprivate callbacks: SetupPanelCallbacks;\n\tprivate options: SetupPanelOptions;\n\t/** Mutable copy of options.installedServers, updated in-place after a successful add so the Installed tab and Presets \"active\" tag reflect it immediately, without needing to close and reopen the panel. */\n\tprivate installedServers: InstalledServerEntry[];\n\tprivate done: () => void;\n\tprivate static readonly INACTIVITY_MS = 60_000;\n\n\tconstructor(\n\t\tdiscovery: McpDiscoverySummary,\n\t\tcallbacks: SetupPanelCallbacks,\n\t\toptions: SetupPanelOptions,\n\t\ttui: { requestRender(): void },\n\t\tdone: () => void,\n\t) {\n\t\tthis.discovery = discovery;\n\t\tthis.callbacks = callbacks;\n\t\tthis.options = options;\n\t\tthis.installedServers = [...options.installedServers];\n\t\tthis.done = done;\n\t\tthis.tui = tui;\n\t\tthis.keys = createPanelKeys(options.keybindings);\n\t\tthis.screen = options.mode;\n\t\tthis.activeTab = \"presets\";\n\t\tfor (const entry of discovery.imports) {\n\t\t\tthis.selectedImports.add(entry.kind);\n\t\t}\n\t\tthis.resetInactivityTimeout();\n\t}\n\n\tprivate resetInactivityTimeout(): void {\n\t\tif (this.inactivityTimeout) clearTimeout(this.inactivityTimeout);\n\t\tthis.inactivityTimeout = setTimeout(() => {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t}, McpSetupPanel.INACTIVITY_MS);\n\t}\n\n\tprivate cleanup(): void {\n\t\tif (this.inactivityTimeout) {\n\t\t\tclearTimeout(this.inactivityTimeout);\n\t\t\tthis.inactivityTimeout = null;\n\t\t}\n\t}\n\n\t/** The old \"Setup\" tab's contents — now a sub-screen opened from Custom's \"Advanced options...\", not a permanent top-level tab. */\n\tprivate getAdvancedActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tif (this.discovery.imports.length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"adopt-imports\",\n\t\t\t\tlabel: \"Adopt detected compatibility imports\",\n\t\t\t\tdescription: `Choose which host-specific MCP configs Nexus should import into its own override file. ${this.discovery.imports.length} source${this.discovery.imports.length === 1 ? \"\" : \"s\"} found.`,\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"view-example\",\n\t\t\tlabel: \"View example `.nexus/mcp.json`\",\n\t\t\tdescription: \"Preview a working Nexus MCP config you can paste or adapt.\",\n\t\t});\n\t\tif (!this.discovery.sources.some((source) => source.id === \"nexus-project\" && source.exists)) {\n\t\t\tactions.push({\n\t\t\t\tid: \"scaffold-project\",\n\t\t\t\tlabel: \"Scaffold project `.nexus/mcp.json`\",\n\t\t\t\tdescription: \"Write a minimal Nexus project MCP config, then reload Nexus.\",\n\t\t\t});\n\t\t}\n\t\tactions.push({\n\t\t\tid: \"show-precedence\",\n\t\t\tlabel: \"Explain config precedence\",\n\t\t\tdescription: \"Show the read order and where Nexus writes compatibility settings.\",\n\t\t});\n\t\tif (this.getDetectedPaths().length > 0) {\n\t\t\tactions.push({\n\t\t\t\tid: \"open-paths\",\n\t\t\t\tlabel: \"Open detected config paths\",\n\t\t\t\tdescription: \"Browse the actual config files that Nexus discovered on this machine.\",\n\t\t\t});\n\t\t}\n\t\treturn actions;\n\t}\n\n\tprivate getPresetsTabActions(): Action[] {\n\t\tconst actions: Action[] = [];\n\t\tfor (const preset of KNOWN_SERVER_PRESETS) {\n\t\t\tactions.push({ id: \"add-known-server\", label: preset.name, description: preset.summary, preset });\n\t\t}\n\t\tif (\n\t\t\t!this.discovery.repoPrompt.configured &&\n\t\t\tthis.discovery.repoPrompt.executablePath &&\n\t\t\tthis.discovery.repoPrompt.targetPath &&\n\t\t\tthis.discovery.repoPrompt.entry &&\n\t\t\tthis.discovery.repoPrompt.serverName\n\t\t) {\n\t\t\tactions.push({\n\t\t\t\tid: \"add-repoprompt\",\n\t\t\t\tlabel: \"Add RepoPrompt to Nexus MCP config\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Write an MCP entry for RepoPrompt to the recommended Nexus target, then reload MCP in-session.\",\n\t\t\t});\n\t\t}\n\t\treturn actions;\n\t}\n\n\tprivate getCustomTabActions(): Action[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tid: \"add-custom-stdio\",\n\t\t\t\tlabel: \"Add a local server (stdio)...\",\n\t\t\t\tdescription: \"Runs a command on your machine, e.g. an npx-installed MCP server.\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"add-custom-url\",\n\t\t\t\tlabel: \"Add a remote server (URL)...\",\n\t\t\t\tdescription: \"Connects to an MCP server over HTTP.\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"open-advanced\",\n\t\t\t\tlabel: \"Advanced options...\",\n\t\t\t\tdescription: \"Import from other tools, scaffold an empty config, or check how config precedence works.\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate getInstalledTabActions(): Action[] {\n\t\tconst servers = this.installedServers;\n\t\tif (servers.length === 0) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tid: \"view-installed-server\",\n\t\t\t\t\tlabel: \"No servers configured yet.\",\n\t\t\t\t\tdescription: \"Add one from the Presets or Custom tab.\",\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\t\treturn servers.map((server) => ({\n\t\t\tid: \"view-installed-server\" as const,\n\t\t\tlabel: server.name,\n\t\t\tdescription: server.disabled\n\t\t\t\t? \"Disabled in the effective config.\"\n\t\t\t\t: server.authCapable && !server.signedIn\n\t\t\t\t\t? \"Active, but not signed in yet.\"\n\t\t\t\t\t: \"Active in the effective config.\",\n\t\t\tinstalled: server,\n\t\t}));\n\t}\n\n\t/**\n\t * Single-glyph prefix instead of a tag chip: ✓ for a preset you already have\n\t * (dim if you've disabled it), ✓/⊘ for an Installed-tab row's active state.\n\t * No mark at all for a preset you don't have yet, to keep the list scannable.\n\t */\n\tprivate getRowMark(action: Action): string {\n\t\tif (action.preset) {\n\t\t\tconst installed = this.installedServers.find((server) => server.name === action.preset!.id);\n\t\t\treturn installed ? fg(installed.disabled ? this.t.muted : this.t.success, \"✓ \") : \" \";\n\t\t}\n\t\tif (action.installed) {\n\t\t\tif (action.installed.disabled) return fg(this.t.muted, \"⊘ \");\n\t\t\tif (action.installed.authCapable && !action.installed.signedIn) return fg(this.t.warning, \"! \");\n\t\t\treturn fg(this.t.success, \"✓ \");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tprivate getActions(): Action[] {\n\t\tswitch (this.activeTab) {\n\t\t\tcase \"presets\":\n\t\t\t\treturn this.getPresetsTabActions();\n\t\t\tcase \"custom\":\n\t\t\t\treturn this.getCustomTabActions();\n\t\t\tcase \"installed\":\n\t\t\t\treturn this.getInstalledTabActions();\n\t\t}\n\t}\n\n\tprivate cycleTab(direction: 1 | -1): void {\n\t\tconst order = SETUP_TABS.map((tab) => tab.id);\n\t\tconst index = order.indexOf(this.activeTab);\n\t\tthis.activeTab = order[(index + direction + order.length) % order.length] as SetupTab;\n\t\tthis.actionCursor = 0;\n\t\tthis.notice = null;\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate getDetectedPaths(): string[] {\n\t\tconst paths = [\n\t\t\t...this.discovery.sources.filter((source) => source.exists).map((source) => source.path),\n\t\t\t...this.discovery.imports.map((entry) => entry.path),\n\t\t];\n\t\treturn [...new Set(paths)];\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.resetInactivityTimeout();\n\t\tif (!this.busy) this.notice = null;\n\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"escape\")) {\n\t\t\tif (this.screen === \"imports\" || this.screen === \"paths\") {\n\t\t\t\t// Both are only reachable from the Advanced sub-screen now — back out one level, not all the way to the tabs.\n\t\t\t\tthis.screen = \"advanced\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.screen === \"confirm-preset\" || this.screen === \"advanced\") {\n\t\t\t\tthis.pendingAction = undefined;\n\t\t\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.busy) return;\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tthis.handleImportsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"paths\") {\n\t\t\tthis.handlePathsInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"confirm-preset\") {\n\t\t\tthis.handleConfirmPresetInput(data);\n\t\t\treturn;\n\t\t}\n\t\tif (this.screen === \"advanced\") {\n\t\t\tthis.handleAdvancedInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (matchesKey(data, \"left\")) {\n\t\t\tthis.cycleTab(-1);\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"right\")) {\n\t\t\tthis.cycleTab(1);\n\t\t\treturn;\n\t\t}\n\n\t\tconst actions = this.getActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.actionCursor = Math.max(0, this.actionCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.actionCursor = Math.min(actions.length - 1, this.actionCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \"o\" || data === \"O\") {\n\t\t\tthis.openSelectedDocs();\n\t\t\treturn;\n\t\t}\n\t\tif ((data === \"a\" || data === \"A\") && this.activeTab === \"installed\") {\n\t\t\tthis.authenticateSelected();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = this.getSelectedAction();\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleImportsInput(data: string): void {\n\t\tconst imports = this.discovery.imports;\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.importCursor = Math.max(0, this.importCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.importCursor = Math.min(imports.length - 1, this.importCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"space\")) {\n\t\t\tconst current = imports[this.importCursor];\n\t\t\tif (!current) return;\n\t\t\tif (this.selectedImports.has(current.kind)) {\n\t\t\t\tthis.selectedImports.delete(current.kind);\n\t\t\t} else {\n\t\t\t\tthis.selectedImports.add(current.kind);\n\t\t\t}\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.applySelectedImports();\n\t\t}\n\t}\n\n\tprivate handlePathsInput(data: string): void {\n\t\tconst paths = this.getDetectedPaths();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.pathCursor = Math.max(0, this.pathCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.pathCursor = Math.min(paths.length - 1, this.pathCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = paths[this.pathCursor];\n\t\t\tif (!selected) return;\n\t\t\tvoid this.runBusy(async () => {\n\t\t\t\tawait this.callbacks.openPath(selected);\n\t\t\t\tthis.notice = { text: `Opened ${selected}`, tone: \"success\" };\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleAdvancedInput(data: string): void {\n\t\tconst actions = this.getAdvancedActions();\n\t\tif (this.keys.selectUp(data)) {\n\t\t\tthis.advancedCursor = Math.max(0, this.advancedCursor - 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectDown(data)) {\n\t\t\tthis.advancedCursor = Math.min(actions.length - 1, this.advancedCursor + 1);\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tconst selected = actions[this.advancedCursor];\n\t\t\tif (selected) void this.runAction(selected);\n\t\t}\n\t}\n\n\tprivate handleConfirmPresetInput(data: string): void {\n\t\tif (data === \"o\" || data === \"O\") {\n\t\t\tthis.openSelectedDocs();\n\t\t\treturn;\n\t\t}\n\t\tif (this.keys.selectConfirm(data)) {\n\t\t\tvoid this.confirmPendingAction();\n\t\t}\n\t}\n\n\t/** Getter used by openSelectedDocs while the confirm screen is up (no action-list cursor there). */\n\tprivate getSelectedAction(): Action | undefined {\n\t\tif (this.screen === \"confirm-preset\") return this.pendingAction;\n\t\tconst actions = this.getActions();\n\t\treturn actions[this.actionCursor];\n\t}\n\n\t/** Add or replace an entry so the Installed tab and Presets \"active\" tag update immediately, without closing the panel. */\n\tprivate upsertInstalledServer(entry: InstalledServerEntry): void {\n\t\tconst index = this.installedServers.findIndex((server) => server.name === entry.name);\n\t\tif (index === -1) this.installedServers.push(entry);\n\t\telse this.installedServers[index] = entry;\n\t}\n\n\tprivate async confirmPendingAction(): Promise<void> {\n\t\tconst action = this.pendingAction;\n\t\tif (!action) return;\n\t\tif (action.id === \"add-repoprompt\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addRepoPrompt();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind: \"stdio\",\n\t\t\t\t\tauthCapable: false,\n\t\t\t\t\tsignedIn: false,\n\t\t\t\t});\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t} else if (action.id === \"add-known-server\" && action.preset) {\n\t\t\tconst preset = action.preset;\n\t\t\tconst authCapable = preset.entry.auth === \"oauth\";\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.addKnownServer(preset);\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tconst kind = preset.entry.command ? (\"stdio\" as const) : (\"http\" as const);\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind,\n\t\t\t\t\tauthCapable,\n\t\t\t\t\tsignedIn: false,\n\t\t\t\t});\n\t\t\t\tif (!authCapable) {\n\t\t\t\t\tthis.notice = {\n\t\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t};\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Sign in right now, in the same flow — this is the whole point of a preset:\n\t\t\t\t// don't make the user hunt down a separate command after the fact.\n\t\t\t\tthis.notice = { text: `Added ${result.serverName}. Opening your browser to sign in…`, tone: \"muted\" };\n\t\t\t\tthis.tui.requestRender();\n\t\t\t\tconst authResult = await this.callbacks.authenticateServer(result.serverName, preset.entry);\n\t\t\t\tthis.upsertInstalledServer({\n\t\t\t\t\tname: result.serverName,\n\t\t\t\t\tdisabled: false,\n\t\t\t\t\tkind,\n\t\t\t\t\tauthCapable,\n\t\t\t\t\tsignedIn: authResult.ok,\n\t\t\t\t});\n\t\t\t\tthis.notice = authResult.ok\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added and signed in to ${result.serverName} (${result.path}). Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\ttext: `Added ${result.serverName} to ${result.path}, but sign-in didn't finish: ${authResult.message} Retry anytime from the Installed tab (press \"a\").`,\n\t\t\t\t\t\t\ttone: \"warning\",\n\t\t\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\tthis.pendingAction = undefined;\n\t\tthis.screen = this.discovery.hasAnyConfig ? \"setup\" : \"empty\";\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async runAction(action: Action): Promise<void> {\n\t\tif (action.id === \"adopt-imports\") {\n\t\t\tthis.screen = \"imports\";\n\t\t\tthis.importCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-paths\") {\n\t\t\tthis.screen = \"paths\";\n\t\t\tthis.pathCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"scaffold-project\") {\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.scaffoldProjectConfig();\n\t\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `Wrote starter config to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-repoprompt\" || (action.id === \"add-known-server\" && action.preset)) {\n\t\t\tthis.pendingAction = action;\n\t\t\tthis.screen = \"confirm-preset\";\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"add-custom-stdio\" || action.id === \"add-custom-url\") {\n\t\t\tconst template = action.id === \"add-custom-stdio\" ? \"/mcp add my-server -- \" : \"/mcp add my-server --url \";\n\t\t\tthis.callbacks.seedEditor(template);\n\t\t\tthis.cleanup();\n\t\t\tthis.done();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"open-advanced\") {\n\t\t\tthis.screen = \"advanced\";\n\t\t\tthis.advancedCursor = 0;\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tif (action.id === \"view-installed-server\" && action.installed) {\n\t\t\tconst server = action.installed;\n\t\t\tconst nextDisabled = !server.disabled;\n\t\t\tawait this.runBusy(async () => {\n\t\t\t\tconst result = await this.callbacks.toggleServerDisabled(server.name, nextDisabled);\n\t\t\t\tthis.upsertInstalledServer({ ...server, disabled: nextDisabled });\n\t\t\t\tthis.notice = {\n\t\t\t\t\ttext: `${nextDisabled ? \"Disabled\" : \"Enabled\"} \"${server.name}\" in ${result.path} — run /reload to apply.`,\n\t\t\t\t\ttone: \"success\",\n\t\t\t\t};\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tthis.notice = {\n\t\t\ttext: \"Review the details below. Press Enter on an action with a side effect to apply it.\",\n\t\t\ttone: \"muted\",\n\t\t};\n\t\tthis.tui.requestRender();\n\t}\n\n\tprivate async applySelectedImports(): Promise<void> {\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tif (selected.length === 0) {\n\t\t\tthis.notice = { text: \"Select at least one compatibility import first.\", tone: \"warning\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBusy(async () => {\n\t\t\tconst result = await this.callbacks.adoptImports(selected);\n\t\t\tthis.callbacks.markSetupCompleted();\n\t\t\tthis.notice =\n\t\t\t\tresult.added.length > 0\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttext: `Added ${result.added.join(\", \")} to ${result.path}. Nexus will reload after this panel closes.`,\n\t\t\t\t\t\t\ttone: \"success\",\n\t\t\t\t\t\t}\n\t\t\t\t\t: { text: `No changes needed in ${result.path}.`, tone: \"muted\" };\n\t\t\tthis.screen = \"advanced\";\n\t\t\tthis.advancedCursor = 0;\n\t\t});\n\t}\n\n\tprivate openSelectedDocs(): void {\n\t\tconst selected = this.getSelectedAction();\n\t\tconst docsUrl = selected?.preset?.docsUrl;\n\t\tif (!docsUrl) {\n\t\t\tthis.notice = { text: \"No docs link for this item.\", tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tvoid this.runBusy(async () => {\n\t\t\tawait this.callbacks.openPath(docsUrl);\n\t\t\tthis.notice = { text: `Opened ${docsUrl}`, tone: \"success\" };\n\t\t});\n\t}\n\n\tprivate authenticateSelected(): void {\n\t\tconst selected = this.getSelectedAction();\n\t\tconst server = selected?.installed;\n\t\tif (!server) return;\n\t\tif (!server.authCapable) {\n\t\t\tthis.notice = { text: `\"${server.name}\" isn't configured for OAuth sign-in.`, tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\treturn;\n\t\t}\n\t\tvoid this.runBusy(async () => {\n\t\t\tthis.notice = { text: `Opening your browser to sign in to \"${server.name}\"…`, tone: \"muted\" };\n\t\t\tthis.tui.requestRender();\n\t\t\tconst result = await this.callbacks.authenticateServer(server.name);\n\t\t\tthis.upsertInstalledServer({ ...server, signedIn: result.ok });\n\t\t\tthis.notice = { text: result.message, tone: result.ok ? \"success\" : \"warning\" };\n\t\t});\n\t}\n\n\tprivate async runBusy(fn: () => Promise<void>): Promise<void> {\n\t\tthis.busy = true;\n\t\tthis.notice = { text: \"Working...\", tone: \"muted\" };\n\t\tthis.tui.requestRender();\n\t\ttry {\n\t\t\tawait fn();\n\t\t} catch (error) {\n\t\t\tthis.notice = {\n\t\t\t\ttext: error instanceof Error ? error.message : String(error),\n\t\t\t\ttone: \"warning\",\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.busy = false;\n\t\t\tthis.tui.requestRender();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst panelW = Math.max(MIN_PANEL_WIDTH, width);\n\t\tconst innerW = panelW - 2;\n\t\tconst contentW = this.contentWidth(innerW);\n\t\tconst lines: string[] = [];\n\t\tconst border = fg(this.t.border, \"─\".repeat(innerW));\n\t\tlines.push(`┌${border}┐`);\n\t\tlines.push(this.padLine(fg(this.t.title, \"MCP setup\"), innerW));\n\t\tfor (const line of wrapText(this.discoverySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tfor (const line of wrapText(this.secondarySummaryLine(), contentW)) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, line), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (this.notice) {\n\t\t\tconst tone =\n\t\t\t\tthis.notice.tone === \"success\"\n\t\t\t\t\t? this.t.success\n\t\t\t\t\t: this.notice.tone === \"warning\"\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.hint;\n\t\t\tfor (const line of wrapText(this.notice.text, contentW)) {\n\t\t\t\tlines.push(this.padLine(fg(tone, line), innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\n\t\tlines.push(`├${border}┤`);\n\n\t\tif (this.screen === \"imports\") {\n\t\t\tlines.push(...this.renderImports(innerW));\n\t\t} else if (this.screen === \"paths\") {\n\t\t\tlines.push(...this.renderPaths(innerW));\n\t\t} else if (this.screen === \"confirm-preset\") {\n\t\t\tlines.push(...this.renderConfirmPreset(innerW));\n\t\t} else if (this.screen === \"advanced\") {\n\t\t\tlines.push(...this.renderAdvanced(innerW));\n\t\t} else {\n\t\t\tlines.push(...this.renderActions(innerW));\n\t\t}\n\n\t\tlines.push(`└${border}┘`);\n\t\treturn this.clampHeight(lines, innerW, border);\n\t}\n\n\tsetMaxHeight(lines: number): void {\n\t\tthis.maxHeight = lines;\n\t}\n\n\t/**\n\t * The overlay host may cap total rows and, absent this hook, would slice\n\t * blindly from the bottom — cutting off the closing border and leaving the\n\t * box looking broken. Truncate the content instead, keeping the header and\n\t * action list (the interactive part) and dropping preview/diff lines first.\n\t */\n\tprivate clampHeight(lines: string[], innerW: number, _border: string): string[] {\n\t\tif (this.maxHeight === undefined || lines.length <= this.maxHeight) return lines;\n\t\tconst budget = Math.max(5, this.maxHeight);\n\t\t// The last line is the closing border, the one before it is the hint/controls\n\t\t// line — both must always stay visible, or the panel loses its own instructions.\n\t\tconst closing = lines[lines.length - 1]!;\n\t\tconst footer = lines[lines.length - 2]!;\n\t\tconst head = lines.slice(0, Math.max(1, budget - 3));\n\t\tconst hidden = lines.length - head.length - 2;\n\t\tif (hidden <= 0) return lines;\n\t\treturn [\n\t\t\t...head,\n\t\t\tthis.padLine(\n\t\t\t\tfg(this.t.muted, `… ${hidden} more line${hidden === 1 ? \"\" : \"s\"} hidden to fit the window`),\n\t\t\t\tinnerW,\n\t\t\t),\n\t\t\tfooter,\n\t\t\tclosing,\n\t\t];\n\t}\n\n\tprivate renderTabBar(): string {\n\t\treturn SETUP_TABS.map((tab) =>\n\t\t\ttab.id === this.activeTab ? fg(this.t.selected, `[ ${tab.label} ]`) : fg(this.t.muted, ` ${tab.label} `),\n\t\t).join(\" \");\n\t}\n\n\tprivate renderActions(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getActions();\n\t\tconst compact = innerW < COMPACT_WIDTH;\n\t\tconst { start, end } = compact ? this.visibleActionRange(actions.length) : { start: 0, end: actions.length };\n\n\t\tlines.push(this.padLine(this.renderTabBar(), innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\tif (start > 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${start} more above`), innerW));\n\t\t}\n\t\tfor (let index = start; index < end; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tconst selected = index === this.actionCursor;\n\t\t\tconst cursor = selected ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst mark = this.getRowMark(action);\n\t\t\tconst label = truncateToWidth(action.label, Math.max(1, this.contentWidth(innerW) - 2 - visibleWidth(mark)));\n\t\t\tconst installedColor = action.installed\n\t\t\t\t? action.installed.disabled\n\t\t\t\t\t? this.t.muted\n\t\t\t\t\t: action.installed.authCapable && !action.installed.signedIn\n\t\t\t\t\t\t? this.t.warning\n\t\t\t\t\t\t: this.t.success\n\t\t\t\t: undefined;\n\t\t\tconst labelRendered = action.preset\n\t\t\t\t? fg(presetAccent(action.preset), label)\n\t\t\t\t: installedColor\n\t\t\t\t\t? fg(installedColor, label)\n\t\t\t\t\t: label;\n\t\t\tlines.push(this.padLine(`${cursor} ${mark}${labelRendered}`, innerW));\n\t\t}\n\t\tif (end < actions.length) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, `… ${actions.length - end} more below`), innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\n\t\t// Presets stay a clean, scannable list — no inline summary/diff while browsing.\n\t\t// The write preview only shows on the confirm screen, after pressing Enter.\n\t\tif (this.activeTab !== \"presets\") {\n\t\t\tconst preview = this.getActionPreview(this.getSelectedAction(), this.previewWidth(innerW));\n\t\t\tfor (const line of preview) {\n\t\t\t\tlines.push(this.padLine(line, innerW));\n\t\t\t}\n\t\t\tlines.push(this.padLine(\"\", innerW));\n\t\t}\n\t\tconst docsHint = this.activeTab === \"presets\" ? \" · o docs\" : \"\";\n\t\tconst confirmHint = this.activeTab === \"presets\" ? \" · enter to review & confirm\" : \"\";\n\t\tconst checkHint = this.activeTab === \"presets\" && this.installedServers.length > 0 ? \" · ✓ already added\" : \"\";\n\t\tconst authHint =\n\t\t\tthis.activeTab === \"installed\" && this.installedServers.some((server) => server.authCapable)\n\t\t\t\t? \" · a sign in\"\n\t\t\t\t: \"\";\n\t\tconst hint = compact\n\t\t\t? `Enter select · ←/→ tabs${docsHint} · Esc back`\n\t\t\t: `Enter selects${confirmHint}, ←/→ switch tabs${docsHint}${checkHint}${authHint}, Esc goes back, Ctrl+C closes.`;\n\t\tlines.push(this.padLine(fg(this.t.muted, hint), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderImports(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select compatibility imports. Space toggles, Enter saves, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tfor (let index = 0; index < this.discovery.imports.length; index++) {\n\t\t\tconst entry = this.discovery.imports[index];\n\t\t\tif (!entry) continue;\n\t\t\tconst selected = this.selectedImports.has(entry.kind) ? \"[x]\" : \"[ ]\";\n\t\t\tconst cursor = index === this.importCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tlines.push(this.padLine(`${cursor} ${selected} ${entry.kind} ${entry.path}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst selected = this.discovery.imports\n\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t.map((entry) => entry.kind);\n\t\tconst preview = this.callbacks.previewImports(selected);\n\t\tfor (const line of this.formatWritePreview(\n\t\t\t\"Compatibility import write preview\",\n\t\t\tpreview,\n\t\t\t[],\n\t\t\tthis.previewWidth(innerW),\n\t\t)) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderPaths(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tlines.push(this.padLine(\"Select a detected config path to open. Enter opens it, Esc goes back.\", innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst paths = this.getDetectedPaths();\n\t\tfor (let index = 0; index < paths.length; index++) {\n\t\t\tconst cursor = index === this.pathCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst path = paths[index];\n\t\t\tif (path !== undefined) lines.push(this.padLine(`${cursor} ${path}`, innerW));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate renderAdvanced(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst actions = this.getAdvancedActions();\n\t\tlines.push(this.padLine(`${fg(this.t.muted, \"Custom\")} > ${fg(this.t.title, \"Advanced options\")}`, innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tif (actions.length === 0) {\n\t\t\tlines.push(this.padLine(fg(this.t.muted, \"Nothing here right now — nice, config is already tidy.\"), innerW));\n\t\t}\n\t\tfor (let index = 0; index < actions.length; index++) {\n\t\t\tconst action = actions[index];\n\t\t\tif (!action) continue;\n\t\t\tconst cursor = index === this.advancedCursor ? fg(this.t.selected, \"›\") : \" \";\n\t\t\tconst label = truncateToWidth(action.label, Math.max(1, this.contentWidth(innerW) - 2));\n\t\t\tlines.push(this.padLine(`${cursor} ${label}`, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\t// This is the one screen where showing the full explanation on highlight is the point —\n\t\t// you only ever get here by deliberately asking for \"Advanced options\".\n\t\tconst preview = this.getActionPreview(actions[this.advancedCursor], this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tlines.push(this.padLine(fg(this.t.muted, \"Enter selects, Esc back to Custom, Ctrl+C closes.\"), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate renderConfirmPreset(innerW: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tconst action = this.pendingAction;\n\t\tconst name = action?.preset?.name ?? (action?.id === \"add-repoprompt\" ? \"RepoPrompt\" : \"this server\");\n\t\tlines.push(this.padLine(fg(this.t.title, `Confirm: add ${name}`), innerW));\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst preview = this.getActionPreview(action, this.previewWidth(innerW));\n\t\tfor (const line of preview) {\n\t\t\tlines.push(this.padLine(line, innerW));\n\t\t}\n\t\tlines.push(this.padLine(\"\", innerW));\n\t\tconst docsHint = action?.preset?.docsUrl ? \" · o docs\" : \"\";\n\t\tlines.push(this.padLine(fg(this.t.muted, `Enter writes this file${docsHint} · Esc goes back`), innerW));\n\t\treturn lines;\n\t}\n\n\tprivate discoverySummaryLine(): string {\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn fg(\n\t\t\t\tthis.t.warning,\n\t\t\t\tthis.options.onboardingState.setupCompleted\n\t\t\t\t\t? \"No MCP servers are active right now.\"\n\t\t\t\t\t: \"No MCP config is active yet.\",\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\tthis.discovery.totalServerCount === 0 &&\n\t\t\t(this.discovery.imports.length > 0 || !!this.discovery.repoPrompt.executablePath)\n\t\t) {\n\t\t\treturn fg(this.t.warning, \"Nexus found MCP-related setup options, but none are active in Nexus yet.\");\n\t\t}\n\n\t\tconst configuredSources = this.discovery.sources.filter((source) => source.serverCount > 0).length;\n\t\treturn fg(\n\t\t\tthis.t.hint,\n\t\t\t`Detected ${this.discovery.totalServerCount} configured servers across ${configuredSources} Nexus source${configuredSources === 1 ? \"\" : \"s\"}.`,\n\t\t);\n\t}\n\n\tprivate secondarySummaryLine(): string {\n\t\tconst hostNote =\n\t\t\tthis.discovery.hostConfigs.length > 0\n\t\t\t\t? ` Host discovery is ${this.discovery.hostConfigDiscovery}; ${this.discovery.hostConfigs.length} host source${this.discovery.hostConfigs.length === 1 ? \"\" : \"s\"} detected.`\n\t\t\t\t: \"\";\n\t\tconst conflictNote =\n\t\t\tthis.discovery.conflicts.length > 0\n\t\t\t\t? ` ${this.discovery.conflicts.length} same-name conflict${this.discovery.conflicts.length === 1 ? \"\" : \"s\"} reported.`\n\t\t\t\t: \"\";\n\t\tif (!this.discovery.hasAnyConfig) {\n\t\t\treturn `Create .nexus/mcp.json, adopt host imports, or quick-add RepoPrompt from this screen.${hostNote}${conflictNote}`;\n\t\t}\n\t\tif (this.discovery.totalServerCount === 0 && this.discovery.imports.length > 0) {\n\t\t\treturn `Detected ${this.discovery.imports.length} compatibility import source${this.discovery.imports.length === 1 ? \"\" : \"s\"}. Adopt them into Nexus or inspect the underlying files.${hostNote}${conflictNote}`;\n\t\t}\n\t\treturn `Nexus MCP files contain server definitions, compatibility imports, and MCP-specific overrides.${hostNote}${conflictNote}`;\n\t}\n\n\tprivate visibleActionRange(total: number): { start: number; end: number } {\n\t\tif (total <= COMPACT_ACTION_ROWS) return { start: 0, end: total };\n\t\tconst half = Math.floor(COMPACT_ACTION_ROWS / 2);\n\t\tconst start = Math.min(Math.max(0, this.actionCursor - half), Math.max(0, total - COMPACT_ACTION_ROWS));\n\t\treturn { start, end: Math.min(total, start + COMPACT_ACTION_ROWS) };\n\t}\n\n\tprivate contentWidth(innerW: number): number {\n\t\treturn Math.max(8, innerW - 4);\n\t}\n\n\tprivate previewWidth(innerW: number): number {\n\t\treturn Math.max(12, Math.min(DESKTOP_PREVIEW_WIDTH, this.contentWidth(innerW)));\n\t}\n\n\tprivate getActionPreview(action?: Action, previewW = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tswitch (action?.id) {\n\t\t\tcase \"adopt-imports\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Compatibility import write preview\",\n\t\t\t\t\tthis.callbacks.previewImports(\n\t\t\t\t\t\tthis.discovery.imports\n\t\t\t\t\t\t\t.filter((entry) => this.selectedImports.has(entry.kind))\n\t\t\t\t\t\t\t.map((entry) => entry.kind),\n\t\t\t\t\t),\n\t\t\t\t\t[\n\t\t\t\t\t\t`Detected imports: ${this.discovery.imports.map((entry) => `${entry.kind} (${entry.serverCount} servers)`).join(\", \")}`,\n\t\t\t\t\t\t\"Selected imports are written to the Nexus global MCP configuration shown above.\",\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"view-example\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview([\"Example Nexus `.nexus/mcp.json`:\"], previewW),\n\t\t\t\t\t// Truncate, don't word-wrap: wrapText would collapse JSON's indentation.\n\t\t\t\t\t...[\n\t\t\t\t\t\t\"{\",\n\t\t\t\t\t\t' \"mcpServers\": {',\n\t\t\t\t\t\t' \"chrome-devtools\": {',\n\t\t\t\t\t\t' \"command\": \"npx\",',\n\t\t\t\t\t\t' \"args\": [\"-y\", \"chrome-devtools-mcp@1.6.0\"]',\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\" }\",\n\t\t\t\t\t\t\"}\",\n\t\t\t\t\t].map((line) => colorizeJsonLine(truncateToWidth(line, previewW, \"…\"))),\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\t\"Use Scaffold project `.nexus/mcp.json` when you want a safe empty shell instead of a live example server.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"show-precedence\": {\n\t\t\t\tconst hostNote =\n\t\t\t\t\tthis.discovery.hostConfigDiscovery === \"off\"\n\t\t\t\t\t\t? \"Configs from other tools (Cursor, Claude Code, VS Code, etc.) are NOT being read right now — Nexus only looks at its own two files above. You can turn that on if you'd rather not redefine servers you already set up elsewhere.\"\n\t\t\t\t\t\t: this.discovery.hostConfigDiscovery === \"prompt\"\n\t\t\t\t\t\t\t? \"Nexus will ask before reading configs from other tools (Cursor, Claude Code, VS Code, etc.). If you say yes, they're used as a fallback — only for a server name that isn't already defined in either file above.\"\n\t\t\t\t\t\t\t: \"Nexus is also reading configs from other tools (Cursor, Claude Code, VS Code, etc.) as a fallback — they only apply to a server name that isn't already defined in either file above.\";\n\t\t\t\tconst conflictNote =\n\t\t\t\t\tthis.discovery.conflicts.length === 0\n\t\t\t\t\t\t? \"Right now no server name is defined in more than one place, so there's nothing actually being overridden.\"\n\t\t\t\t\t\t: `Right now ${this.discovery.conflicts.length} server name${this.discovery.conflicts.length === 1 ? \" is\" : \"s are\"} defined in more than one place — whichever file is read last wins, and the loser is silently ignored:`;\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t\"Nexus can load MCP servers from a few different places, so when the same server name shows up twice, something has to decide which definition actually gets used.\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"It reads, in this order — each one can override a server name defined before it:\",\n\t\t\t\t\t\t\" 1. Global — ~/.config/nexus/mcp.json (applies to every project on this machine)\",\n\t\t\t\t\t\t` 2. Project — ${getConfigDirName()}/mcp.json (just this project; wins over global for the same name)`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\thostNote,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"Everything you add from this panel (a preset, a custom server) gets written to the project file, so it's scoped to this project and takes priority over anything global.\",\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\tconflictNote,\n\t\t\t\t\t\t...this.discovery.conflicts\n\t\t\t\t\t\t\t.slice(0, 8)\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(conflict) =>\n\t\t\t\t\t\t\t\t\t` ${conflict.serverName}: ${conflict.sources.map((source) => source.path).join(\" then \")} — \"${conflict.winner.path}\" wins`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"open-paths\":\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\tthis.getDetectedPaths().length > 0\n\t\t\t\t\t\t? [\"Detected paths:\", ...this.getDetectedPaths()]\n\t\t\t\t\t\t: [\"No config paths were detected.\"],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-repoprompt\": {\n\t\t\t\tconst repoPrompt = this.discovery.repoPrompt;\n\t\t\t\tconst preview = this.callbacks.previewRepoPrompt();\n\t\t\t\tif (!preview) {\n\t\t\t\t\treturn this.formatPreview([\"RepoPrompt is not available to add from this setup screen.\"], previewW);\n\t\t\t\t}\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"RepoPrompt write preview\",\n\t\t\t\t\tpreview,\n\t\t\t\t\t[\n\t\t\t\t\t\t`Executable: ${repoPrompt.executablePath ?? \"not found\"}`,\n\t\t\t\t\t\t`Target: ${repoPrompt.targetPath ?? \"n/a\"}`,\n\t\t\t\t\t\t`Server name: ${repoPrompt.serverName ?? \"repoprompt\"}`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"add-known-server\": {\n\t\t\t\tconst preset = action.preset;\n\t\t\t\tif (!preset) return this.formatPreview([\"Known server preset is unavailable.\"], previewW);\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t`${preset.name} write preview`,\n\t\t\t\t\tthis.callbacks.previewKnownServer(preset),\n\t\t\t\t\t[preset.summary, ...(preset.docsUrl ? [`Docs: ${preset.docsUrl}`, 'Press \"o\" to open docs.'] : [])],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"scaffold-project\":\n\t\t\t\treturn this.formatWritePreview(\n\t\t\t\t\t\"Starter project `.nexus/mcp.json` write preview\",\n\t\t\t\t\tthis.callbacks.previewStarterProject(),\n\t\t\t\t\t[\n\t\t\t\t\t\t`This creates ${getConfigDirName()}/mcp.json right here in this project — the file everything you add from the Presets or Custom tab actually gets written into. If you already have one, this action doesn't show up (check the Installed tab instead).`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`It starts out empty on purpose (just an empty \"mcpServers\" list). A fake placeholder server would fail the moment Nexus tried to connect to it on your very next reload, so this just gives you a valid, empty file to add real servers into afterward.`,\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\tcase \"add-custom-stdio\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\"Runs a command on your machine over stdio — e.g. an npx-installed MCP server.\"],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\tcolorizeCommandLine(truncateToWidth(\"/mcp add <name> -- <command> [args...]\", previewW, \"…\")),\n\t\t\t\t\t\"\",\n\t\t\t\t\tfg(this.t.muted, \"Example (real, runnable):\"),\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\"/mcp add chrome-devtools -- npx -y chrome-devtools-mcp@1.6.0\", previewW, \"…\"),\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'Enter fills in \"/mcp add my-server -- \" into the chat input below — finish typing there.',\n\t\t\t\t\t\t\t\"Run `/mcp add` with no arguments (from chat) for the full flag list.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"add-custom-url\":\n\t\t\t\treturn [\n\t\t\t\t\t...this.formatPreview([\"Connects to a remote MCP server over HTTP.\"], previewW),\n\t\t\t\t\t\"\",\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\n\t\t\t\t\t\t\t\"/mcp add <name> --url <url> [--header K=V] [--auth oauth|bearer] [--bearer-env VAR]\",\n\t\t\t\t\t\t\tpreviewW,\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\t\"\",\n\t\t\t\t\tfg(this.t.muted, \"Example (real, runnable):\"),\n\t\t\t\t\tcolorizeCommandLine(\n\t\t\t\t\t\ttruncateToWidth(\"/mcp add context7 --url https://mcp.context7.com/mcp\", previewW, \"…\"),\n\t\t\t\t\t),\n\t\t\t\t\t\"\",\n\t\t\t\t\t...this.formatPreview(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\t'Enter fills in \"/mcp add my-server --url \" into the chat input below — finish typing there.',\n\t\t\t\t\t\t\t\"Run `/mcp add` with no arguments (from chat) for the full flag list.\",\n\t\t\t\t\t\t],\n\t\t\t\t\t\tpreviewW,\n\t\t\t\t\t),\n\t\t\t\t];\n\t\t\tcase \"view-installed-server\": {\n\t\t\t\tconst server = action.installed;\n\t\t\t\tif (!server)\n\t\t\t\t\treturn this.formatPreview([\"Add a server from the Presets or Custom tab to see it here.\"], previewW);\n\t\t\t\treturn this.formatPreview(\n\t\t\t\t\t[\n\t\t\t\t\t\t`${server.name} — ${server.kind === \"stdio\" ? \"local (stdio)\" : \"remote (HTTP)\"}, currently ${server.disabled ? \"disabled\" : \"active\"}${server.authCapable ? (server.signedIn ? \", signed in\" : \", NOT signed in yet\") : \"\"}.`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t`Press Enter to ${server.disabled ? \"enable\" : \"disable\"} it here. Takes effect after /reload.`,\n\t\t\t\t\t\t...(server.authCapable\n\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\tserver.signedIn\n\t\t\t\t\t\t\t\t\t\t? 'Press \"a\" to sign in again (e.g. to switch accounts). This re-opens your browser.'\n\t\t\t\t\t\t\t\t\t\t: 'Press \"a\" to sign in now — opens your browser for this server\\'s OAuth login. Tokens refresh automatically after that; you should not need to repeat this unless access is revoked.',\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t\tpreviewW,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn this.formatPreview([\"Close the setup flow.\"], previewW);\n\t\t}\n\t}\n\n\tprivate formatPreview(lines: string[], width = DESKTOP_PREVIEW_WIDTH): string[] {\n\t\tconst preview: string[] = [];\n\t\tfor (const line of lines) {\n\t\t\tpreview.push(...wrapText(line, width));\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate formatWritePreview(\n\t\ttitle: string,\n\t\tpreview: ConfigWritePreview,\n\t\tintro: string[] = [],\n\t\twidth = DESKTOP_PREVIEW_WIDTH,\n\t): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const line of intro) {\n\t\t\tlines.push(...wrapText(line, width));\n\t\t}\n\t\tif (intro.length > 0) lines.push(\"\");\n\t\tlines.push(...wrapText(`${title}: ${preview.path}`, width));\n\t\tlines.push(\n\t\t\t...wrapText(\n\t\t\t\tpreview.existed\n\t\t\t\t\t? \"Existing file detected. Showing exact before/after diff.\"\n\t\t\t\t\t: \"New file will be created. Showing exact content diff.\",\n\t\t\t\twidth,\n\t\t\t),\n\t\t);\n\t\tlines.push(\"\");\n\t\tconst diffLines = preview.diffText.split(\"\\n\");\n\t\tconst maxLines = 12;\n\t\tconst shown = diffLines.slice(0, maxLines);\n\t\tfor (const line of shown) {\n\t\t\t// Truncate, don't word-wrap: wrapText collapses whitespace and would\n\t\t\t// destroy JSON's nested indentation.\n\t\t\tconst color = diffLineColor(line);\n\t\t\tconst truncated = truncateToWidth(line, width, \"…\");\n\t\t\tlines.push(color ? fg(color, truncated) : colorizeJsonLine(truncated));\n\t\t}\n\t\tif (diffLines.length > maxLines) {\n\t\t\tlines.push(\n\t\t\t\t...wrapText(\n\t\t\t\t\t`… ${diffLines.length - maxLines} more diff line${diffLines.length - maxLines === 1 ? \"\" : \"s\"}`,\n\t\t\t\t\twidth,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate padLine(text: string, innerW: number): string {\n\t\tconst inset = 2;\n\t\tconst contentW = Math.max(0, innerW - inset * 2);\n\t\tconst fitted = truncateToWidth(text, contentW, \"…\", true);\n\t\tconst plainWidth = visibleWidth(fitted);\n\t\tconst padding = Math.max(0, contentW - plainWidth);\n\t\treturn `│${\" \".repeat(inset)}${fitted}${\" \".repeat(padding)}${\" \".repeat(inset)}│`;\n\t}\n\n\tinvalidate(): void {}\n\n\tdispose(): void {\n\t\tthis.cleanup();\n\t}\n}\n\nexport function createMcpSetupPanel(\n\tdiscovery: McpDiscoverySummary,\n\tcallbacks: SetupPanelCallbacks,\n\toptions: SetupPanelOptions,\n\ttui: { requestRender(): void },\n\tdone: () => void,\n): McpSetupPanel & { dispose(): void } {\n\treturn new McpSetupPanel(discovery, callbacks, options, tui, done);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { McpExtensionState } from "./state.ts";
|
|
2
|
+
import { type McpStatusSnapshot } from "./types.ts";
|
|
3
|
+
export interface McpStatusEventBus {
|
|
4
|
+
emit(channel: string, data: unknown): void;
|
|
5
|
+
}
|
|
6
|
+
/** Build a sanitized snapshot without connecting or querying any MCP server. */
|
|
7
|
+
export declare function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot;
|
|
8
|
+
export declare function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void;
|
|
9
|
+
export declare function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void;
|
|
10
|
+
export type { McpServerStatusSnapshot, McpStatusSnapshot } from "./types.ts";
|
|
11
|
+
export { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from "./types.ts";
|
|
12
|
+
//# sourceMappingURL=mcp-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-status.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAIN,KAAK,iBAAiB,EACtB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C;AAUD,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAsDnF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAQrG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAcpF;AAED,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC","sourcesContent":["import type { McpExtensionState } from \"./state.ts\";\nimport {\n\tMCP_STATUS_EVENT,\n\tMCP_STATUS_SNAPSHOT_VERSION,\n\ttype McpServerStatusSnapshot,\n\ttype McpStatusSnapshot,\n} from \"./types.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport interface McpStatusEventBus {\n\temit(channel: string, data: unknown): void;\n}\n\nfunction getActiveFailureAgeSeconds(state: McpExtensionState, serverName: string): number | undefined {\n\tconst failedAt = state.failureTracker.get(serverName);\n\tif (!failedAt) return undefined;\n\tconst ageMs = Date.now() - failedAt;\n\tif (ageMs > FAILURE_BACKOFF_MS) return undefined;\n\treturn Math.round(ageMs / 1000);\n}\n\n/** Build a sanitized snapshot without connecting or querying any MCP server. */\nexport function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot {\n\tconst servers: McpServerStatusSnapshot[] = [];\n\tlet totalTools = 0;\n\tlet totalResources = 0;\n\tlet connectedCount = 0;\n\tlet disabledCount = 0;\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tconst disabled = definition?.disabled === true;\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 ?? (connection?.status === \"connected\" ? connection.tools.length : 0);\n\t\tconst resourceCount = disabled\n\t\t\t? undefined\n\t\t\t: (state.resourceCounts?.get(name) ??\n\t\t\t\t(connection?.status === \"connected\" ? connection.resources.length : undefined));\n\t\tconst failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);\n\n\t\tlet status: McpServerStatusSnapshot[\"status\"] = \"not-connected\";\n\t\tif (disabled) {\n\t\t\tstatus = \"disabled\";\n\t\t\tdisabledCount++;\n\t\t} else if (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tconnectedCount++;\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs-auth\";\n\t\t} else if (failedAgoSeconds !== undefined) {\n\t\t\tstatus = \"failed\";\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\ttotalTools += disabled ? 0 : toolCount;\n\t\tif (!disabled && resourceCount !== undefined) totalResources += resourceCount;\n\t\tservers.push({\n\t\t\tname,\n\t\t\tstatus,\n\t\t\ttoolCount,\n\t\t\t...(resourceCount !== undefined ? { resourceCount } : {}),\n\t\t\t...(status === \"failed\" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),\n\t\t\tdisabled,\n\t\t});\n\t}\n\n\treturn {\n\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\tservers,\n\t\ttotalTools,\n\t\ttotalResources,\n\t\tconnectedCount,\n\t\tdisabledCount,\n\t};\n}\n\nexport function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void {\n\tconst events = state.statusEvents;\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP operations.\n\t}\n}\n\nexport function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void {\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, {\n\t\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\t\tservers: [],\n\t\t\ttotalTools: 0,\n\t\t\ttotalResources: 0,\n\t\t\tconnectedCount: 0,\n\t\t\tdisabledCount: 0,\n\t\t} satisfies McpStatusSnapshot);\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP shutdown.\n\t}\n}\n\nexport type { McpServerStatusSnapshot, McpStatusSnapshot } from \"./types.ts\";\nexport { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION, } from "./types.js";
|
|
2
|
+
const FAILURE_BACKOFF_MS = 60 * 1000;
|
|
3
|
+
function getActiveFailureAgeSeconds(state, serverName) {
|
|
4
|
+
const failedAt = state.failureTracker.get(serverName);
|
|
5
|
+
if (!failedAt)
|
|
6
|
+
return undefined;
|
|
7
|
+
const ageMs = Date.now() - failedAt;
|
|
8
|
+
if (ageMs > FAILURE_BACKOFF_MS)
|
|
9
|
+
return undefined;
|
|
10
|
+
return Math.round(ageMs / 1000);
|
|
11
|
+
}
|
|
12
|
+
/** Build a sanitized snapshot without connecting or querying any MCP server. */
|
|
13
|
+
export function createMcpStatusSnapshot(state) {
|
|
14
|
+
const servers = [];
|
|
15
|
+
let totalTools = 0;
|
|
16
|
+
let totalResources = 0;
|
|
17
|
+
let connectedCount = 0;
|
|
18
|
+
let disabledCount = 0;
|
|
19
|
+
for (const name of Object.keys(state.config.mcpServers)) {
|
|
20
|
+
const definition = state.config.mcpServers[name];
|
|
21
|
+
const disabled = definition?.disabled === true;
|
|
22
|
+
const connection = disabled ? undefined : state.manager.getConnection(name);
|
|
23
|
+
const metadata = disabled ? undefined : state.toolMetadata.get(name);
|
|
24
|
+
const toolCount = metadata?.length ?? (connection?.status === "connected" ? connection.tools.length : 0);
|
|
25
|
+
const resourceCount = disabled
|
|
26
|
+
? undefined
|
|
27
|
+
: (state.resourceCounts?.get(name) ??
|
|
28
|
+
(connection?.status === "connected" ? connection.resources.length : undefined));
|
|
29
|
+
const failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);
|
|
30
|
+
let status = "not-connected";
|
|
31
|
+
if (disabled) {
|
|
32
|
+
status = "disabled";
|
|
33
|
+
disabledCount++;
|
|
34
|
+
}
|
|
35
|
+
else if (connection?.status === "connected") {
|
|
36
|
+
status = "connected";
|
|
37
|
+
connectedCount++;
|
|
38
|
+
}
|
|
39
|
+
else if (connection?.status === "needs-auth") {
|
|
40
|
+
status = "needs-auth";
|
|
41
|
+
}
|
|
42
|
+
else if (failedAgoSeconds !== undefined) {
|
|
43
|
+
status = "failed";
|
|
44
|
+
}
|
|
45
|
+
else if (metadata !== undefined) {
|
|
46
|
+
status = "cached";
|
|
47
|
+
}
|
|
48
|
+
totalTools += disabled ? 0 : toolCount;
|
|
49
|
+
if (!disabled && resourceCount !== undefined)
|
|
50
|
+
totalResources += resourceCount;
|
|
51
|
+
servers.push({
|
|
52
|
+
name,
|
|
53
|
+
status,
|
|
54
|
+
toolCount,
|
|
55
|
+
...(resourceCount !== undefined ? { resourceCount } : {}),
|
|
56
|
+
...(status === "failed" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),
|
|
57
|
+
disabled,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
version: MCP_STATUS_SNAPSHOT_VERSION,
|
|
62
|
+
servers,
|
|
63
|
+
totalTools,
|
|
64
|
+
totalResources,
|
|
65
|
+
connectedCount,
|
|
66
|
+
disabledCount,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function publishMcpStatusSnapshot(state, snapshot) {
|
|
70
|
+
const events = state.statusEvents;
|
|
71
|
+
if (!events)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
events.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Event consumers must not be able to interrupt MCP operations.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function publishMcpStatusShutdown(events) {
|
|
81
|
+
if (!events)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
events.emit(MCP_STATUS_EVENT, {
|
|
85
|
+
version: MCP_STATUS_SNAPSHOT_VERSION,
|
|
86
|
+
servers: [],
|
|
87
|
+
totalTools: 0,
|
|
88
|
+
totalResources: 0,
|
|
89
|
+
connectedCount: 0,
|
|
90
|
+
disabledCount: 0,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Event consumers must not be able to interrupt MCP shutdown.
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from "./types.js";
|
|
98
|
+
//# sourceMappingURL=mcp-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-status.js","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-status.ts"],"names":[],"mappings":"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","sourcesContent":["import type { McpExtensionState } from \"./state.ts\";\nimport {\n\tMCP_STATUS_EVENT,\n\tMCP_STATUS_SNAPSHOT_VERSION,\n\ttype McpServerStatusSnapshot,\n\ttype McpStatusSnapshot,\n} from \"./types.ts\";\n\nconst FAILURE_BACKOFF_MS = 60 * 1000;\n\nexport interface McpStatusEventBus {\n\temit(channel: string, data: unknown): void;\n}\n\nfunction getActiveFailureAgeSeconds(state: McpExtensionState, serverName: string): number | undefined {\n\tconst failedAt = state.failureTracker.get(serverName);\n\tif (!failedAt) return undefined;\n\tconst ageMs = Date.now() - failedAt;\n\tif (ageMs > FAILURE_BACKOFF_MS) return undefined;\n\treturn Math.round(ageMs / 1000);\n}\n\n/** Build a sanitized snapshot without connecting or querying any MCP server. */\nexport function createMcpStatusSnapshot(state: McpExtensionState): McpStatusSnapshot {\n\tconst servers: McpServerStatusSnapshot[] = [];\n\tlet totalTools = 0;\n\tlet totalResources = 0;\n\tlet connectedCount = 0;\n\tlet disabledCount = 0;\n\n\tfor (const name of Object.keys(state.config.mcpServers)) {\n\t\tconst definition = state.config.mcpServers[name];\n\t\tconst disabled = definition?.disabled === true;\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 ?? (connection?.status === \"connected\" ? connection.tools.length : 0);\n\t\tconst resourceCount = disabled\n\t\t\t? undefined\n\t\t\t: (state.resourceCounts?.get(name) ??\n\t\t\t\t(connection?.status === \"connected\" ? connection.resources.length : undefined));\n\t\tconst failedAgoSeconds = disabled ? undefined : getActiveFailureAgeSeconds(state, name);\n\n\t\tlet status: McpServerStatusSnapshot[\"status\"] = \"not-connected\";\n\t\tif (disabled) {\n\t\t\tstatus = \"disabled\";\n\t\t\tdisabledCount++;\n\t\t} else if (connection?.status === \"connected\") {\n\t\t\tstatus = \"connected\";\n\t\t\tconnectedCount++;\n\t\t} else if (connection?.status === \"needs-auth\") {\n\t\t\tstatus = \"needs-auth\";\n\t\t} else if (failedAgoSeconds !== undefined) {\n\t\t\tstatus = \"failed\";\n\t\t} else if (metadata !== undefined) {\n\t\t\tstatus = \"cached\";\n\t\t}\n\n\t\ttotalTools += disabled ? 0 : toolCount;\n\t\tif (!disabled && resourceCount !== undefined) totalResources += resourceCount;\n\t\tservers.push({\n\t\t\tname,\n\t\t\tstatus,\n\t\t\ttoolCount,\n\t\t\t...(resourceCount !== undefined ? { resourceCount } : {}),\n\t\t\t...(status === \"failed\" && failedAgoSeconds !== undefined ? { failedAgoSeconds } : {}),\n\t\t\tdisabled,\n\t\t});\n\t}\n\n\treturn {\n\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\tservers,\n\t\ttotalTools,\n\t\ttotalResources,\n\t\tconnectedCount,\n\t\tdisabledCount,\n\t};\n}\n\nexport function publishMcpStatusSnapshot(state: McpExtensionState, snapshot?: McpStatusSnapshot): void {\n\tconst events = state.statusEvents;\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, snapshot ?? createMcpStatusSnapshot(state));\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP operations.\n\t}\n}\n\nexport function publishMcpStatusShutdown(events: McpStatusEventBus | undefined): void {\n\tif (!events) return;\n\ttry {\n\t\tevents.emit(MCP_STATUS_EVENT, {\n\t\t\tversion: MCP_STATUS_SNAPSHOT_VERSION,\n\t\t\tservers: [],\n\t\t\ttotalTools: 0,\n\t\t\ttotalResources: 0,\n\t\t\tconnectedCount: 0,\n\t\t\tdisabledCount: 0,\n\t\t} satisfies McpStatusSnapshot);\n\t} catch {\n\t\t// Event consumers must not be able to interrupt MCP shutdown.\n\t}\n}\n\nexport type { McpServerStatusSnapshot, McpStatusSnapshot } from \"./types.ts\";\nexport { MCP_STATUS_EVENT, MCP_STATUS_SNAPSHOT_VERSION } from \"./types.ts\";\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { JSONRPCMessage, Transport } from "@modelcontextprotocol/client";
|
|
2
|
+
export declare const MCP_TRACE_SCHEMA_VERSION = 1;
|
|
3
|
+
export declare const DEFAULT_MCP_TRACE_MAX_BYTES: number;
|
|
4
|
+
export declare const DEFAULT_MCP_TRACE_MAX_EVENTS = 10000;
|
|
5
|
+
export type McpTraceDirection = "outbound" | "inbound";
|
|
6
|
+
export type McpTraceTransport = "stdio" | "unix-socket" | "sse" | "streamable-http" | "unknown";
|
|
7
|
+
export type McpTraceMessageKind = "request" | "response" | "notification";
|
|
8
|
+
export interface McpTraceSettings {
|
|
9
|
+
/** Enable metadata-only protocol tracing for all servers unless overridden. */
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
/** JSONL destination. Relative paths are resolved from the session cwd. */
|
|
12
|
+
file?: string;
|
|
13
|
+
/** Maximum bytes retained in the per-session JSONL file. */
|
|
14
|
+
maxBytes?: number;
|
|
15
|
+
/** Maximum events retained in the per-session JSONL file. */
|
|
16
|
+
maxEvents?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface McpTraceEvent {
|
|
19
|
+
version: typeof MCP_TRACE_SCHEMA_VERSION;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
direction: McpTraceDirection;
|
|
22
|
+
server: string;
|
|
23
|
+
transport: McpTraceTransport;
|
|
24
|
+
kind: McpTraceMessageKind;
|
|
25
|
+
status: "sent" | "received" | "error";
|
|
26
|
+
method?: string;
|
|
27
|
+
id?: string | number | null;
|
|
28
|
+
relatedRequestId?: string | number;
|
|
29
|
+
errorCode?: number | string;
|
|
30
|
+
bytes?: number;
|
|
31
|
+
durationMs?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface McpTraceWriterOptions {
|
|
34
|
+
filePath: string;
|
|
35
|
+
maxBytes?: number;
|
|
36
|
+
maxEvents?: number;
|
|
37
|
+
appendFile?: (path: string, data: string, options: {
|
|
38
|
+
encoding: "utf8";
|
|
39
|
+
}) => Promise<void>;
|
|
40
|
+
writeFile?: (path: string, data: string, options: {
|
|
41
|
+
encoding: "utf8";
|
|
42
|
+
}) => Promise<void>;
|
|
43
|
+
mkdir?: (path: string, options: {
|
|
44
|
+
recursive: true;
|
|
45
|
+
}) => Promise<string | undefined>;
|
|
46
|
+
}
|
|
47
|
+
/** Redact strings before they can become durable trace metadata. */
|
|
48
|
+
export declare function redactTraceText(value: string, maxLength?: number): string;
|
|
49
|
+
export declare function createMcpTraceEvent(direction: McpTraceDirection, server: string, transport: McpTraceTransport, message: JSONRPCMessage, status: "sent" | "received" | "error", options?: {
|
|
50
|
+
relatedRequestId?: unknown;
|
|
51
|
+
durationMs?: number;
|
|
52
|
+
}): McpTraceEvent;
|
|
53
|
+
export declare class McpTraceWriter {
|
|
54
|
+
private readonly maxBytes;
|
|
55
|
+
private readonly maxEvents;
|
|
56
|
+
private readonly append;
|
|
57
|
+
private readonly resetFile;
|
|
58
|
+
private readonly makeDirectory;
|
|
59
|
+
private bytesWritten;
|
|
60
|
+
private eventsWritten;
|
|
61
|
+
private queue;
|
|
62
|
+
private disabled;
|
|
63
|
+
private initializationFailed;
|
|
64
|
+
private readonly fileReady;
|
|
65
|
+
private readonly options;
|
|
66
|
+
constructor(options: McpTraceWriterOptions);
|
|
67
|
+
get filePath(): string;
|
|
68
|
+
get isDisabled(): boolean;
|
|
69
|
+
get stats(): {
|
|
70
|
+
bytes: number;
|
|
71
|
+
events: number;
|
|
72
|
+
};
|
|
73
|
+
write(event: McpTraceEvent): void;
|
|
74
|
+
flush(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export declare function createMcpTraceWriter(sessionCwd: string | undefined, settings?: McpTraceSettings, randomSuffix?: string): McpTraceWriter;
|
|
77
|
+
export interface McpTraceObserver {
|
|
78
|
+
record(event: McpTraceEvent): void;
|
|
79
|
+
}
|
|
80
|
+
export declare function isMcpTraceEnabled(definition: {
|
|
81
|
+
trace?: boolean;
|
|
82
|
+
}, settings?: McpTraceSettings): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Compose the SDK's transport callbacks in place instead of replacing the
|
|
85
|
+
* transport object. SDK v2 detects its base stdio transport before connect so
|
|
86
|
+
* it can run `server/discover` on a disposable sibling process; returning a
|
|
87
|
+
* wrapper hides that identity and makes tracing change negotiation behavior.
|
|
88
|
+
*/
|
|
89
|
+
export declare function wrapTransportWithMcpTrace(transport: Transport, server: string, transportKind: McpTraceTransport, observer: McpTraceObserver): Transport;
|
|
90
|
+
export declare function traceTransportKind(definition: {
|
|
91
|
+
command?: string;
|
|
92
|
+
url?: string;
|
|
93
|
+
socket?: string;
|
|
94
|
+
}, transport: Transport): McpTraceTransport;
|
|
95
|
+
//# sourceMappingURL=mcp-trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-trace.d.ts","sourceRoot":"","sources":["../../../src/extensions/mcp/mcp-trace.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { appendFile, mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, resolve } from \"node:path\";\nimport type { JSONRPCMessage, MessageExtraInfo, Transport } from \"@modelcontextprotocol/client\";\n\nexport const MCP_TRACE_SCHEMA_VERSION = 1;\nexport const DEFAULT_MCP_TRACE_MAX_BYTES = 256 * 1024;\nexport const DEFAULT_MCP_TRACE_MAX_EVENTS = 10_000;\n\nexport type McpTraceDirection = \"outbound\" | \"inbound\";\nexport type McpTraceTransport = \"stdio\" | \"unix-socket\" | \"sse\" | \"streamable-http\" | \"unknown\";\nexport type McpTraceMessageKind = \"request\" | \"response\" | \"notification\";\n\nexport interface McpTraceSettings {\n\t/** Enable metadata-only protocol tracing for all servers unless overridden. */\n\tenabled?: boolean;\n\t/** JSONL destination. Relative paths are resolved from the session cwd. */\n\tfile?: string;\n\t/** Maximum bytes retained in the per-session JSONL file. */\n\tmaxBytes?: number;\n\t/** Maximum events retained in the per-session JSONL file. */\n\tmaxEvents?: number;\n}\n\nexport interface McpTraceEvent {\n\tversion: typeof MCP_TRACE_SCHEMA_VERSION;\n\ttimestamp: string;\n\tdirection: McpTraceDirection;\n\tserver: string;\n\ttransport: McpTraceTransport;\n\tkind: McpTraceMessageKind;\n\tstatus: \"sent\" | \"received\" | \"error\";\n\tmethod?: string;\n\tid?: string | number | null;\n\trelatedRequestId?: string | number;\n\terrorCode?: number | string;\n\tbytes?: number;\n\tdurationMs?: number;\n}\n\nexport interface McpTraceWriterOptions {\n\tfilePath: string;\n\tmaxBytes?: number;\n\tmaxEvents?: number;\n\tappendFile?: (path: string, data: string, options: { encoding: \"utf8\" }) => Promise<void>;\n\twriteFile?: (path: string, data: string, options: { encoding: \"utf8\" }) => Promise<void>;\n\tmkdir?: (path: string, options: { recursive: true }) => Promise<string | undefined>;\n}\n\nfunction boundedPositiveInteger(value: number | undefined, fallback: number): number {\n\tif (!Number.isFinite(value) || value === undefined || value <= 0) return fallback;\n\treturn Math.floor(value);\n}\n\n/** Redact strings before they can become durable trace metadata. */\nexport function redactTraceText(value: string, maxLength = 160): string {\n\tlet redacted = value\n\t\t.replace(/\\b[a-z][a-z\\d+.-]*:\\/\\/[^\\s\"'<>]+/gi, \"[REDACTED_URL]\")\n\t\t.replace(/\\b(?:bearer|basic)\\s+[A-Za-z0-9._~+/=-]+/gi, \"[REDACTED_AUTH]\")\n\t\t.replace(\n\t\t\t/\\b(token|secret|password|passwd|api[_-]?key|authorization|cookie)\\s*[:=]\\s*[^\\s,;]+/gi,\n\t\t\t\"$1=[REDACTED]\",\n\t\t);\n\tif (redacted === value && /\\b(?:token|secret|password|passwd|api[_-]?key|authorization|cookie)\\b/i.test(value)) {\n\t\treturn \"[REDACTED]\";\n\t}\n\tif (redacted.length > maxLength) redacted = `${redacted.slice(0, maxLength - 1)}…`;\n\treturn redacted;\n}\n\nfunction messageKind(message: JSONRPCMessage): McpTraceMessageKind {\n\tif (\"method\" in message) return \"id\" in message ? \"request\" : \"notification\";\n\treturn \"response\";\n}\n\nfunction traceId(value: unknown): string | number | null | undefined {\n\tif (value === null) return null;\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tif (typeof value === \"string\") return \"[REDACTED_ID]\";\n\treturn undefined;\n}\n\nfunction messageBytes(message: JSONRPCMessage): number | undefined {\n\ttry {\n\t\treturn Buffer.byteLength(JSON.stringify(message), \"utf8\");\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function createMcpTraceEvent(\n\tdirection: McpTraceDirection,\n\tserver: string,\n\ttransport: McpTraceTransport,\n\tmessage: JSONRPCMessage,\n\tstatus: \"sent\" | \"received\" | \"error\",\n\toptions?: { relatedRequestId?: unknown; durationMs?: number },\n): McpTraceEvent {\n\tconst kind = messageKind(message);\n\tconst bytes = messageBytes(message);\n\tconst event: McpTraceEvent = {\n\t\tversion: MCP_TRACE_SCHEMA_VERSION,\n\t\ttimestamp: new Date().toISOString(),\n\t\tdirection,\n\t\tserver: redactTraceText(server, 120),\n\t\ttransport,\n\t\tkind,\n\t\tstatus,\n\t\t...(bytes !== undefined ? { bytes } : {}),\n\t};\n\tif (\"method\" in message) event.method = redactTraceText(message.method, 120);\n\tif (\"id\" in message) event.id = traceId(message.id) ?? null;\n\tconst relatedRequestId = traceId(options?.relatedRequestId);\n\tif (relatedRequestId !== undefined && relatedRequestId !== null) event.relatedRequestId = relatedRequestId;\n\tif (\"error\" in message && message.error && typeof message.error.code === \"number\") {\n\t\tevent.errorCode = message.error.code;\n\t}\n\tif (options?.durationMs !== undefined && Number.isFinite(options.durationMs)) {\n\t\tevent.durationMs = Math.max(0, Math.round(options.durationMs * 100) / 100);\n\t}\n\treturn event;\n}\n\nexport class McpTraceWriter {\n\tprivate readonly maxBytes: number;\n\tprivate readonly maxEvents: number;\n\tprivate readonly append: NonNullable<McpTraceWriterOptions[\"appendFile\"]>;\n\tprivate readonly resetFile: NonNullable<McpTraceWriterOptions[\"writeFile\"]>;\n\tprivate readonly makeDirectory: NonNullable<McpTraceWriterOptions[\"mkdir\"]>;\n\tprivate bytesWritten = 0;\n\tprivate eventsWritten = 0;\n\tprivate queue = Promise.resolve();\n\tprivate disabled = false;\n\tprivate initializationFailed = false;\n\tprivate readonly fileReady: Promise<void>;\n\tprivate readonly options: McpTraceWriterOptions;\n\n\tconstructor(options: McpTraceWriterOptions) {\n\t\tthis.options = options;\n\t\tthis.maxBytes = boundedPositiveInteger(options.maxBytes, DEFAULT_MCP_TRACE_MAX_BYTES);\n\t\tthis.maxEvents = boundedPositiveInteger(options.maxEvents, DEFAULT_MCP_TRACE_MAX_EVENTS);\n\t\tthis.append =\n\t\t\toptions.appendFile ??\n\t\t\t(async (path, data, appendOptions) => {\n\t\t\t\tawait appendFile(path, data, appendOptions);\n\t\t\t});\n\t\tthis.resetFile =\n\t\t\toptions.writeFile ??\n\t\t\t(async (path, data, writeOptions) => {\n\t\t\t\tawait writeFile(path, data, writeOptions);\n\t\t\t});\n\t\tthis.makeDirectory =\n\t\t\toptions.mkdir ??\n\t\t\t(async (path) => {\n\t\t\t\tawait mkdir(path, { recursive: true });\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\tthis.fileReady = this.makeDirectory(dirname(this.options.filePath), { recursive: true })\n\t\t\t.then(() => this.resetFile(this.options.filePath, \"\", { encoding: \"utf8\" }))\n\t\t\t.catch(() => {\n\t\t\t\t// Tracing must never change MCP request/response behavior.\n\t\t\t\tthis.initializationFailed = true;\n\t\t\t\tthis.disabled = true;\n\t\t\t});\n\t}\n\n\tget filePath(): string {\n\t\treturn this.options.filePath;\n\t}\n\n\tget isDisabled(): boolean {\n\t\treturn this.disabled;\n\t}\n\n\tget stats(): { bytes: number; events: number } {\n\t\treturn { bytes: this.bytesWritten, events: this.eventsWritten };\n\t}\n\n\twrite(event: McpTraceEvent): void {\n\t\tif (this.disabled || this.eventsWritten >= this.maxEvents) return;\n\t\tlet line: string;\n\t\ttry {\n\t\t\tline = `${JSON.stringify(event)}\\n`;\n\t\t} catch {\n\t\t\tthis.disabled = true;\n\t\t\treturn;\n\t\t}\n\t\tconst bytes = Buffer.byteLength(line, \"utf8\");\n\t\tif (bytes > this.maxBytes - this.bytesWritten) {\n\t\t\tthis.disabled = true;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.bytesWritten += bytes;\n\t\tthis.eventsWritten += 1;\n\t\tthis.queue = this.queue\n\t\t\t.then(async () => {\n\t\t\t\tawait this.fileReady;\n\t\t\t\tif (this.initializationFailed) return;\n\t\t\t\tawait this.append(this.options.filePath, line, { encoding: \"utf8\" });\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t// Tracing must never change MCP request/response behavior.\n\t\t\t\tthis.disabled = true;\n\t\t\t});\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tawait this.fileReady;\n\t\tawait this.queue;\n\t}\n}\n\nexport function createMcpTraceWriter(\n\tsessionCwd: string | undefined,\n\tsettings: McpTraceSettings = {},\n\trandomSuffix = Math.random().toString(36).slice(2, 10),\n): McpTraceWriter {\n\tconst timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n\tconst configuredPath = settings.file;\n\tconst filePath = configuredPath\n\t\t? isAbsolute(configuredPath)\n\t\t\t? configuredPath\n\t\t\t: resolve(sessionCwd ?? process.cwd(), configuredPath)\n\t\t: resolve(sessionCwd ?? process.cwd(), \".nexus\", \"mcp-traces\", `mcp-${timestamp}-${randomSuffix}.jsonl`);\n\treturn new McpTraceWriter({\n\t\tfilePath,\n\t\t...(settings.maxBytes !== undefined ? { maxBytes: settings.maxBytes } : {}),\n\t\t...(settings.maxEvents !== undefined ? { maxEvents: settings.maxEvents } : {}),\n\t});\n}\n\nexport interface McpTraceObserver {\n\trecord(event: McpTraceEvent): void;\n}\n\nexport function isMcpTraceEnabled(definition: { trace?: boolean }, settings?: McpTraceSettings): boolean {\n\treturn definition.trace ?? settings?.enabled === true;\n}\n\n/**\n * Compose the SDK's transport callbacks in place instead of replacing the\n * transport object. SDK v2 detects its base stdio transport before connect so\n * it can run `server/discover` on a disposable sibling process; returning a\n * wrapper hides that identity and makes tracing change negotiation behavior.\n */\nexport function wrapTransportWithMcpTrace(\n\ttransport: Transport,\n\tserver: string,\n\ttransportKind: McpTraceTransport,\n\tobserver: McpTraceObserver,\n): Transport {\n\tlet messageHandler = transport.onmessage;\n\tlet tracedMessageHandler: Transport[\"onmessage\"];\n\tconst originalSend = transport.send;\n\tconst record = (event: McpTraceEvent): void => {\n\t\ttry {\n\t\t\tobserver.record(event);\n\t\t} catch {\n\t\t\t// An observer failure must never alter SDK transport behavior.\n\t\t}\n\t};\n\n\ttry {\n\t\tObject.defineProperty(transport, \"onmessage\", {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tget() {\n\t\t\t\treturn tracedMessageHandler;\n\t\t\t},\n\t\t\tset(handler: Transport[\"onmessage\"]) {\n\t\t\t\tmessageHandler = handler;\n\t\t\t\ttracedMessageHandler = handler\n\t\t\t\t\t? (message: JSONRPCMessage, extra?: MessageExtraInfo) => {\n\t\t\t\t\t\t\trecord(createMcpTraceEvent(\"inbound\", server, transportKind, message, \"received\"));\n\t\t\t\t\t\t\thandler(message, extra);\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t},\n\t\t});\n\t\ttransport.onmessage = messageHandler;\n\t} catch {\n\t\t// Some future transport may make onmessage non-configurable. Keep tracing\n\t\t// best-effort rather than changing connection behavior.\n\t}\n\n\ttransport.send = async (message: JSONRPCMessage, options?: Parameters<Transport[\"send\"]>[1]) => {\n\t\tconst started = performance.now();\n\t\tconst messages = Array.isArray(message) ? message : [message];\n\t\ttry {\n\t\t\tawait originalSend.call(transport, message, options);\n\t\t\tfor (const item of messages) {\n\t\t\t\trecord(\n\t\t\t\t\tcreateMcpTraceEvent(\"outbound\", server, transportKind, item, \"sent\", {\n\t\t\t\t\t\tdurationMs: performance.now() - started,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tfor (const item of messages) {\n\t\t\t\trecord(\n\t\t\t\t\tcreateMcpTraceEvent(\"outbound\", server, transportKind, item, \"error\", {\n\t\t\t\t\t\tdurationMs: performance.now() - started,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\treturn transport;\n}\n\nexport function traceTransportKind(\n\tdefinition: { command?: string; url?: string; socket?: string },\n\ttransport: Transport,\n): McpTraceTransport {\n\tif (definition.command) return \"stdio\";\n\tif (definition.socket) return \"unix-socket\";\n\tconst constructorName = transport.constructor?.name.toLowerCase() ?? \"\";\n\tif (constructorName.includes(\"sse\")) return \"sse\";\n\tif (constructorName.includes(\"streamable\")) return \"streamable-http\";\n\treturn definition.url ? \"streamable-http\" : \"unknown\";\n}\n"]}
|