@1mcp/agent 0.28.1 → 0.29.0-beta2
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/build/auth/sessionTypes.d.ts +19 -0
- package/build/auth/sessionTypes.d.ts.map +1 -1
- package/build/commands/app/backups.d.ts.map +1 -1
- package/build/commands/app/backups.js +52 -42
- package/build/commands/app/backups.js.map +1 -1
- package/build/commands/app/consolidate.d.ts.map +1 -1
- package/build/commands/app/consolidate.js +66 -55
- package/build/commands/app/consolidate.js.map +1 -1
- package/build/commands/app/discover.d.ts.map +1 -1
- package/build/commands/app/discover.js +32 -25
- package/build/commands/app/discover.js.map +1 -1
- package/build/commands/app/index.d.ts.map +1 -1
- package/build/commands/app/index.js +2 -1
- package/build/commands/app/index.js.map +1 -1
- package/build/commands/app/list.d.ts.map +1 -1
- package/build/commands/app/list.js +35 -28
- package/build/commands/app/list.js.map +1 -1
- package/build/commands/app/restore.d.ts.map +1 -1
- package/build/commands/app/restore.js +74 -63
- package/build/commands/app/restore.js.map +1 -1
- package/build/commands/app/status.d.ts.map +1 -1
- package/build/commands/app/status.js +51 -43
- package/build/commands/app/status.js.map +1 -1
- package/build/commands/mcp/add.d.ts.map +1 -1
- package/build/commands/mcp/add.js +29 -23
- package/build/commands/mcp/add.js.map +1 -1
- package/build/commands/mcp/enable.d.ts.map +1 -1
- package/build/commands/mcp/enable.js +16 -15
- package/build/commands/mcp/enable.js.map +1 -1
- package/build/commands/mcp/index.d.ts.map +1 -1
- package/build/commands/mcp/index.js +2 -1
- package/build/commands/mcp/index.js.map +1 -1
- package/build/commands/mcp/install.d.ts.map +1 -1
- package/build/commands/mcp/install.js +44 -46
- package/build/commands/mcp/install.js.map +1 -1
- package/build/commands/mcp/list.d.ts.map +1 -1
- package/build/commands/mcp/list.js +51 -37
- package/build/commands/mcp/list.js.map +1 -1
- package/build/commands/mcp/remove.d.ts.map +1 -1
- package/build/commands/mcp/remove.js +23 -16
- package/build/commands/mcp/remove.js.map +1 -1
- package/build/commands/mcp/status.d.ts.map +1 -1
- package/build/commands/mcp/status.js +81 -73
- package/build/commands/mcp/status.js.map +1 -1
- package/build/commands/mcp/tokens.d.ts.map +1 -1
- package/build/commands/mcp/tokens.js +46 -47
- package/build/commands/mcp/tokens.js.map +1 -1
- package/build/commands/mcp/uninstall.d.ts.map +1 -1
- package/build/commands/mcp/uninstall.js +8 -6
- package/build/commands/mcp/uninstall.js.map +1 -1
- package/build/commands/mcp/update.d.ts.map +1 -1
- package/build/commands/mcp/update.js +11 -8
- package/build/commands/mcp/update.js.map +1 -1
- package/build/commands/mcp/utils/installWizard.d.ts.map +1 -1
- package/build/commands/mcp/utils/installWizard.js +3 -2
- package/build/commands/mcp/utils/installWizard.js.map +1 -1
- package/build/commands/mcp/utils/serverUtils.d.ts +8 -4
- package/build/commands/mcp/utils/serverUtils.d.ts.map +1 -1
- package/build/commands/mcp/utils/serverUtils.js +0 -3
- package/build/commands/mcp/utils/serverUtils.js.map +1 -1
- package/build/commands/mcp/wizard/components/serverDetailsDisplay.d.ts.map +1 -1
- package/build/commands/mcp/wizard/components/serverDetailsDisplay.js +4 -3
- package/build/commands/mcp/wizard/components/serverDetailsDisplay.js.map +1 -1
- package/build/commands/mcp/wizard/components/stepIndicator.d.ts.map +1 -1
- package/build/commands/mcp/wizard/components/stepIndicator.js +3 -2
- package/build/commands/mcp/wizard/components/stepIndicator.js.map +1 -1
- package/build/commands/mcp/wizard/components/welcomeScreen.d.ts.map +1 -1
- package/build/commands/mcp/wizard/components/welcomeScreen.js +2 -1
- package/build/commands/mcp/wizard/components/welcomeScreen.js.map +1 -1
- package/build/commands/mcp/wizard/configuration.d.ts.map +1 -1
- package/build/commands/mcp/wizard/configuration.js +10 -9
- package/build/commands/mcp/wizard/configuration.js.map +1 -1
- package/build/commands/mcp/wizard/display.d.ts.map +1 -1
- package/build/commands/mcp/wizard/display.js +9 -8
- package/build/commands/mcp/wizard/display.js.map +1 -1
- package/build/commands/mcp/wizard/search.d.ts.map +1 -1
- package/build/commands/mcp/wizard/search.js +4 -3
- package/build/commands/mcp/wizard/search.js.map +1 -1
- package/build/commands/preset/create.d.ts.map +1 -1
- package/build/commands/preset/create.js +7 -6
- package/build/commands/preset/create.js.map +1 -1
- package/build/commands/preset/delete.d.ts.map +1 -1
- package/build/commands/preset/delete.js +4 -2
- package/build/commands/preset/delete.js.map +1 -1
- package/build/commands/preset/edit.d.ts.map +1 -1
- package/build/commands/preset/edit.js +8 -5
- package/build/commands/preset/edit.js.map +1 -1
- package/build/commands/preset/interactive.d.ts.map +1 -1
- package/build/commands/preset/interactive.js +24 -15
- package/build/commands/preset/interactive.js.map +1 -1
- package/build/commands/preset/list.d.ts.map +1 -1
- package/build/commands/preset/list.js +12 -10
- package/build/commands/preset/list.js.map +1 -1
- package/build/commands/preset/show.d.ts.map +1 -1
- package/build/commands/preset/show.js +3 -2
- package/build/commands/preset/show.js.map +1 -1
- package/build/commands/preset/test.d.ts.map +1 -1
- package/build/commands/preset/test.js +2 -1
- package/build/commands/preset/test.js.map +1 -1
- package/build/commands/preset/url.d.ts.map +1 -1
- package/build/commands/preset/url.js +2 -1
- package/build/commands/preset/url.js.map +1 -1
- package/build/commands/proxy/index.d.ts.map +1 -1
- package/build/commands/proxy/index.js +5 -0
- package/build/commands/proxy/index.js.map +1 -1
- package/build/commands/proxy/proxy.d.ts.map +1 -1
- package/build/commands/proxy/proxy.js +1 -0
- package/build/commands/proxy/proxy.js.map +1 -1
- package/build/commands/registry/index.d.ts.map +1 -1
- package/build/commands/registry/index.js +2 -1
- package/build/commands/registry/index.js.map +1 -1
- package/build/commands/registry/search.d.ts.map +1 -1
- package/build/commands/registry/search.js +42 -37
- package/build/commands/registry/search.js.map +1 -1
- package/build/commands/registry/show.d.ts.map +1 -1
- package/build/commands/registry/show.js +8 -7
- package/build/commands/registry/show.js.map +1 -1
- package/build/commands/registry/status.d.ts.map +1 -1
- package/build/commands/registry/status.js +26 -16
- package/build/commands/registry/status.js.map +1 -1
- package/build/commands/registry/versions.d.ts.map +1 -1
- package/build/commands/registry/versions.js +8 -7
- package/build/commands/registry/versions.js.map +1 -1
- package/build/config/configChangeDetector.d.ts +8 -0
- package/build/config/configChangeDetector.d.ts.map +1 -0
- package/build/config/configChangeDetector.js +49 -0
- package/build/config/configChangeDetector.js.map +1 -0
- package/build/config/configLoader.d.ts +16 -0
- package/build/config/configLoader.d.ts.map +1 -0
- package/build/config/configLoader.js +155 -0
- package/build/config/configLoader.js.map +1 -0
- package/build/config/configManager.d.ts +49 -86
- package/build/config/configManager.d.ts.map +1 -1
- package/build/config/configManager.js +188 -301
- package/build/config/configManager.js.map +1 -1
- package/build/config/configWatcher.d.ts +18 -0
- package/build/config/configWatcher.d.ts.map +1 -0
- package/build/config/configWatcher.js +78 -0
- package/build/config/configWatcher.js.map +1 -0
- package/build/config/projectConfigTypes.d.ts +40 -0
- package/build/config/projectConfigTypes.d.ts.map +1 -1
- package/build/config/projectConfigTypes.js +21 -0
- package/build/config/projectConfigTypes.js.map +1 -1
- package/build/config/templateProcessor.d.ts +14 -0
- package/build/config/templateProcessor.d.ts.map +1 -0
- package/build/config/templateProcessor.js +102 -0
- package/build/config/templateProcessor.js.map +1 -0
- package/build/config/types.d.ts +36 -0
- package/build/config/types.d.ts.map +1 -0
- package/build/config/types.js +14 -0
- package/build/config/types.js.map +1 -0
- package/build/constants/mcp.d.ts +1 -1
- package/build/constants/mcp.d.ts.map +1 -1
- package/build/constants/mcp.js +1 -1
- package/build/constants/mcp.js.map +1 -1
- package/build/core/client/clientFactory.d.ts +7 -0
- package/build/core/client/clientFactory.d.ts.map +1 -0
- package/build/core/client/clientFactory.js +36 -0
- package/build/core/client/clientFactory.js.map +1 -0
- package/build/core/client/clientManager.d.ts +13 -101
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +115 -418
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/client/connectionHandler.d.ts +8 -0
- package/build/core/client/connectionHandler.d.ts.map +1 -0
- package/build/core/client/connectionHandler.js +80 -0
- package/build/core/client/connectionHandler.js.map +1 -0
- package/build/core/client/oauthFlowHandler.d.ts +10 -0
- package/build/core/client/oauthFlowHandler.d.ts.map +1 -0
- package/build/core/client/oauthFlowHandler.js +81 -0
- package/build/core/client/oauthFlowHandler.js.map +1 -0
- package/build/core/client/transportRecreator.d.ts +5 -0
- package/build/core/client/transportRecreator.d.ts.map +1 -0
- package/build/core/client/transportRecreator.js +23 -0
- package/build/core/client/transportRecreator.js.map +1 -0
- package/build/core/client/types.d.ts +7 -0
- package/build/core/client/types.d.ts.map +1 -0
- package/build/core/client/types.js +11 -0
- package/build/core/client/types.js.map +1 -0
- package/build/core/configChangeHandler.d.ts.map +1 -1
- package/build/core/configChangeHandler.js +11 -5
- package/build/core/configChangeHandler.js.map +1 -1
- package/build/core/context/globalContextManager.d.ts +58 -0
- package/build/core/context/globalContextManager.d.ts.map +1 -0
- package/build/core/context/globalContextManager.js +190 -0
- package/build/core/context/globalContextManager.js.map +1 -0
- package/build/core/filtering/clientFiltering.d.ts +1 -2
- package/build/core/filtering/clientFiltering.d.ts.map +1 -1
- package/build/core/filtering/clientTemplateTracker.d.ts +116 -0
- package/build/core/filtering/clientTemplateTracker.d.ts.map +1 -0
- package/build/core/filtering/clientTemplateTracker.js +286 -0
- package/build/core/filtering/clientTemplateTracker.js.map +1 -0
- package/build/core/filtering/filterCache.d.ts +121 -0
- package/build/core/filtering/filterCache.d.ts.map +1 -0
- package/build/core/filtering/filterCache.js +359 -0
- package/build/core/filtering/filterCache.js.map +1 -0
- package/build/core/filtering/index.d.ts +16 -0
- package/build/core/filtering/index.d.ts.map +1 -0
- package/build/core/filtering/index.js +16 -0
- package/build/core/filtering/index.js.map +1 -0
- package/build/core/filtering/templateFilteringService.d.ts +72 -0
- package/build/core/filtering/templateFilteringService.d.ts.map +1 -0
- package/build/core/filtering/templateFilteringService.js +293 -0
- package/build/core/filtering/templateFilteringService.js.map +1 -0
- package/build/core/filtering/templateIndex.d.ts +132 -0
- package/build/core/filtering/templateIndex.d.ts.map +1 -0
- package/build/core/filtering/templateIndex.js +368 -0
- package/build/core/filtering/templateIndex.js.map +1 -0
- package/build/core/flags/flagManager.d.ts +8 -4
- package/build/core/flags/flagManager.d.ts.map +1 -1
- package/build/core/flags/flagManager.js.map +1 -1
- package/build/core/protocol/requestHandlers.d.ts.map +1 -1
- package/build/core/protocol/requestHandlers.js +208 -46
- package/build/core/protocol/requestHandlers.js.map +1 -1
- package/build/core/server/clientInstancePool.d.ts +146 -0
- package/build/core/server/clientInstancePool.d.ts.map +1 -0
- package/build/core/server/clientInstancePool.js +407 -0
- package/build/core/server/clientInstancePool.js.map +1 -0
- package/build/core/server/connectionManager.d.ts +70 -0
- package/build/core/server/connectionManager.d.ts.map +1 -0
- package/build/core/server/connectionManager.js +240 -0
- package/build/core/server/connectionManager.js.map +1 -0
- package/build/core/server/mcpServerLifecycleManager.d.ts +55 -0
- package/build/core/server/mcpServerLifecycleManager.d.ts.map +1 -0
- package/build/core/server/mcpServerLifecycleManager.js +272 -0
- package/build/core/server/mcpServerLifecycleManager.js.map +1 -0
- package/build/core/server/serverManager.d.ts +56 -56
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +160 -431
- package/build/core/server/serverManager.js.map +1 -1
- package/build/core/server/templateConfigurationManager.d.ts +51 -0
- package/build/core/server/templateConfigurationManager.d.ts.map +1 -0
- package/build/core/server/templateConfigurationManager.js +160 -0
- package/build/core/server/templateConfigurationManager.js.map +1 -0
- package/build/core/server/templateServerManager.d.ts +92 -0
- package/build/core/server/templateServerManager.d.ts.map +1 -0
- package/build/core/server/templateServerManager.js +367 -0
- package/build/core/server/templateServerManager.js.map +1 -0
- package/build/core/tools/handlers/serverManagementHandler.d.ts +51 -1
- package/build/core/tools/handlers/serverManagementHandler.d.ts.map +1 -1
- package/build/core/tools/handlers/serverManagementHandler.js +42 -0
- package/build/core/tools/handlers/serverManagementHandler.js.map +1 -1
- package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts +11 -1
- package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts.map +1 -1
- package/build/core/tools/internal/adapters/installation/types.d.ts +2 -4
- package/build/core/tools/internal/adapters/installation/types.d.ts.map +1 -1
- package/build/core/tools/internal/adapters/installationAdapter.d.ts +2 -4
- package/build/core/tools/internal/adapters/installationAdapter.d.ts.map +1 -1
- package/build/core/tools/internal/adapters/installationAdapter.js.map +1 -1
- package/build/core/tools/internal/adapters/management/managementAdapter.d.ts +2 -5
- package/build/core/tools/internal/adapters/management/managementAdapter.d.ts.map +1 -1
- package/build/core/tools/internal/adapters/management/managementAdapter.js.map +1 -1
- package/build/core/tools/internal/adapters/management/types.d.ts +8 -4
- package/build/core/tools/internal/adapters/management/types.d.ts.map +1 -1
- package/build/core/tools/internal/index.d.ts +0 -31
- package/build/core/tools/internal/index.d.ts.map +1 -1
- package/build/core/tools/internal/index.js +4 -3
- package/build/core/tools/internal/index.js.map +1 -1
- package/build/core/tools/internal/schemas/index.d.ts +3 -3
- package/build/core/tools/internal/schemas/management.d.ts +3 -3
- package/build/core/types/server.d.ts +19 -0
- package/build/core/types/server.d.ts.map +1 -1
- package/build/core/types/server.js.map +1 -1
- package/build/core/types/transport.d.ts +178 -0
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +34 -0
- package/build/core/types/transport.js.map +1 -1
- package/build/core/validation/CustomJsonSchemaValidator.d.ts.map +1 -1
- package/build/core/validation/CustomJsonSchemaValidator.js +4 -3
- package/build/core/validation/CustomJsonSchemaValidator.js.map +1 -1
- package/build/domains/discovery/appPresets.d.ts.map +1 -1
- package/build/domains/discovery/appPresets.js +9 -7
- package/build/domains/discovery/appPresets.js.map +1 -1
- package/build/domains/installation/configurators/cliArgsConfigurator.d.ts.map +1 -1
- package/build/domains/installation/configurators/cliArgsConfigurator.js +8 -4
- package/build/domains/installation/configurators/cliArgsConfigurator.js.map +1 -1
- package/build/domains/installation/configurators/envVarConfigurator.d.ts.map +1 -1
- package/build/domains/installation/configurators/envVarConfigurator.js +8 -4
- package/build/domains/installation/configurators/envVarConfigurator.js.map +1 -1
- package/build/domains/installation/configurators/tagsConfigurator.d.ts +2 -4
- package/build/domains/installation/configurators/tagsConfigurator.d.ts.map +1 -1
- package/build/domains/installation/configurators/tagsConfigurator.js +4 -7
- package/build/domains/installation/configurators/tagsConfigurator.js.map +1 -1
- package/build/domains/installation/validators/conflictDetector.d.ts +6 -4
- package/build/domains/installation/validators/conflictDetector.d.ts.map +1 -1
- package/build/domains/installation/validators/conflictDetector.js +0 -3
- package/build/domains/installation/validators/conflictDetector.js.map +1 -1
- package/build/domains/preset/manager/presetManager.js +1 -1
- package/build/domains/preset/manager/presetManager.js.map +1 -1
- package/build/domains/preset/parsers/tagQueryEvaluator.d.ts +8 -4
- package/build/domains/preset/parsers/tagQueryEvaluator.d.ts.map +1 -1
- package/build/domains/preset/parsers/tagQueryEvaluator.js.map +1 -1
- package/build/domains/preset/services/presetErrorHandler.d.ts +0 -7
- package/build/domains/preset/services/presetErrorHandler.d.ts.map +1 -1
- package/build/domains/preset/services/presetErrorHandler.js +10 -37
- package/build/domains/preset/services/presetErrorHandler.js.map +1 -1
- package/build/domains/registry/cacheManager.d.ts +11 -1
- package/build/domains/registry/cacheManager.d.ts.map +1 -1
- package/build/domains/registry/cacheManager.js +21 -3
- package/build/domains/registry/cacheManager.js.map +1 -1
- package/build/domains/registry/formatters/serverDetailFormatter.d.ts.map +1 -1
- package/build/domains/registry/formatters/serverDetailFormatter.js +57 -8
- package/build/domains/registry/formatters/serverDetailFormatter.js.map +1 -1
- package/build/domains/registry/formatters/versionsFormatter.d.ts.map +1 -1
- package/build/domains/registry/formatters/versionsFormatter.js +8 -3
- package/build/domains/registry/formatters/versionsFormatter.js.map +1 -1
- package/build/logger/logger.d.ts +8 -4
- package/build/logger/logger.d.ts.map +1 -1
- package/build/logger/logger.js.map +1 -1
- package/build/server.d.ts +2 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +16 -7
- package/build/server.js.map +1 -1
- package/build/template/handlebarsTemplateRenderer.d.ts +34 -0
- package/build/template/handlebarsTemplateRenderer.d.ts.map +1 -0
- package/build/template/handlebarsTemplateRenderer.js +92 -0
- package/build/template/handlebarsTemplateRenderer.js.map +1 -0
- package/build/template/index.d.ts +2 -0
- package/build/template/index.d.ts.map +1 -0
- package/build/template/index.js +3 -0
- package/build/template/index.js.map +1 -0
- package/build/transport/http/middlewares/securityMiddleware.js +1 -1
- package/build/transport/http/middlewares/securityMiddleware.js.map +1 -1
- package/build/transport/http/restorableStreamableTransport.d.ts +8 -4
- package/build/transport/http/restorableStreamableTransport.d.ts.map +1 -1
- package/build/transport/http/restorableStreamableTransport.js.map +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +15 -0
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +88 -12
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts +1 -0
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +1 -0
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/http/storage/streamableSessionRepository.d.ts.map +1 -1
- package/build/transport/http/storage/streamableSessionRepository.js +2 -0
- package/build/transport/http/storage/streamableSessionRepository.js.map +1 -1
- package/build/transport/http/utils/contextExtractor.d.ts +23 -0
- package/build/transport/http/utils/contextExtractor.d.ts.map +1 -0
- package/build/transport/http/utils/contextExtractor.js +58 -0
- package/build/transport/http/utils/contextExtractor.js.map +1 -0
- package/build/transport/restartableStdioTransport.d.ts +8 -4
- package/build/transport/restartableStdioTransport.d.ts.map +1 -1
- package/build/transport/restartableStdioTransport.js.map +1 -1
- package/build/transport/stdioProxyTransport.d.ts +29 -0
- package/build/transport/stdioProxyTransport.d.ts.map +1 -1
- package/build/transport/stdioProxyTransport.js +236 -53
- package/build/transport/stdioProxyTransport.js.map +1 -1
- package/build/transport/transportFactory.d.ts +8 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +47 -0
- package/build/transport/transportFactory.js.map +1 -1
- package/build/types/context.d.ts +120 -0
- package/build/types/context.d.ts.map +1 -0
- package/build/types/context.js +4 -0
- package/build/types/context.js.map +1 -0
- package/build/types/validation.d.ts +30 -0
- package/build/types/validation.d.ts.map +1 -0
- package/build/types/validation.js +5 -0
- package/build/types/validation.js.map +1 -0
- package/build/utils/client/clientInfoExtractor.d.ts +26 -0
- package/build/utils/client/clientInfoExtractor.d.ts.map +1 -0
- package/build/utils/client/clientInfoExtractor.js +65 -0
- package/build/utils/client/clientInfoExtractor.js.map +1 -0
- package/build/utils/core/errorHandling.d.ts +9 -5
- package/build/utils/core/errorHandling.d.ts.map +1 -1
- package/build/utils/core/errorHandling.js.map +1 -1
- package/build/utils/core/parsing.d.ts +8 -4
- package/build/utils/core/parsing.d.ts.map +1 -1
- package/build/utils/core/parsing.js.map +1 -1
- package/build/utils/crypto.d.ts +10 -0
- package/build/utils/crypto.d.ts.map +1 -0
- package/build/utils/crypto.js +20 -0
- package/build/utils/crypto.js.map +1 -0
- package/build/utils/ui/interactiveSelector.d.ts +16 -6
- package/build/utils/ui/interactiveSelector.d.ts.map +1 -1
- package/build/utils/ui/interactiveSelector.js +7 -31
- package/build/utils/ui/interactiveSelector.js.map +1 -1
- package/build/utils/ui/pagination.d.ts +6 -2
- package/build/utils/ui/pagination.d.ts.map +1 -1
- package/build/utils/ui/pagination.js.map +1 -1
- package/build/utils/ui/printer.d.ts +76 -0
- package/build/utils/ui/printer.d.ts.map +1 -0
- package/build/utils/ui/printer.js +172 -0
- package/build/utils/ui/printer.js.map +1 -0
- package/build/utils/ui/spinner.d.ts +19 -0
- package/build/utils/ui/spinner.d.ts.map +1 -0
- package/build/utils/ui/spinner.js +51 -0
- package/build/utils/ui/spinner.js.map +1 -0
- package/build/utils/ui/table.d.ts +16 -0
- package/build/utils/ui/table.d.ts.map +1 -0
- package/build/utils/ui/table.js +70 -0
- package/build/utils/ui/table.js.map +1 -0
- package/build/utils/validation/validationHelpers.d.ts +7 -3
- package/build/utils/validation/validationHelpers.d.ts.map +1 -1
- package/build/utils/validation/validationHelpers.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,22 +1,29 @@
|
|
|
1
|
-
import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
2
|
-
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
3
|
-
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
4
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
5
|
-
import { CONNECTION_RETRY, MCP_CLIENT_CAPABILITIES, MCP_SERVER_NAME, MCP_SERVER_VERSION } from '../../constants.js';
|
|
6
|
-
import { AgentConfigManager } from '../../core/server/agentConfig.js';
|
|
7
1
|
import { ClientStatus, } from '../../core/types/index.js';
|
|
8
|
-
import { CustomJsonSchemaValidator } from '../../core/validation/CustomJsonSchemaValidator.js';
|
|
9
2
|
import logger, { debugIf } from '../../logger/logger.js';
|
|
10
3
|
import { CapabilityError, ClientConnectionError, ClientNotFoundError } from '../../utils/core/errorTypes.js';
|
|
11
4
|
import { executeOperation } from '../../utils/core/operationExecution.js';
|
|
12
|
-
import {
|
|
5
|
+
import { ClientFactory } from './clientFactory.js';
|
|
6
|
+
import { ConnectionHandler } from './connectionHandler.js';
|
|
7
|
+
import { OAuthFlowHandler } from './oauthFlowHandler.js';
|
|
8
|
+
import { TransportRecreator } from './transportRecreator.js';
|
|
9
|
+
import { OAuthRequiredError } from './types.js';
|
|
10
|
+
export { OAuthRequiredError };
|
|
13
11
|
export class ClientManager {
|
|
14
12
|
static instance;
|
|
15
13
|
outboundConns = new Map();
|
|
16
14
|
transports = {};
|
|
17
15
|
connectionSemaphore = new Map();
|
|
18
16
|
instructionAggregator;
|
|
19
|
-
|
|
17
|
+
clientFactory;
|
|
18
|
+
connectionHandler;
|
|
19
|
+
oauthFlowHandler;
|
|
20
|
+
transportRecreator;
|
|
21
|
+
constructor() {
|
|
22
|
+
this.clientFactory = new ClientFactory();
|
|
23
|
+
this.connectionHandler = new ConnectionHandler();
|
|
24
|
+
this.oauthFlowHandler = new OAuthFlowHandler();
|
|
25
|
+
this.transportRecreator = new TransportRecreator();
|
|
26
|
+
}
|
|
20
27
|
static getOrCreateInstance() {
|
|
21
28
|
if (!ClientManager.instance) {
|
|
22
29
|
ClientManager.instance = new ClientManager();
|
|
@@ -26,31 +33,19 @@ export class ClientManager {
|
|
|
26
33
|
static get current() {
|
|
27
34
|
return ClientManager.instance;
|
|
28
35
|
}
|
|
29
|
-
// Test utility method to reset singleton state
|
|
30
36
|
static resetInstance() {
|
|
31
37
|
ClientManager.instance = undefined;
|
|
32
38
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Set the instruction aggregator instance
|
|
35
|
-
* @param aggregator The instruction aggregator to use
|
|
36
|
-
*/
|
|
37
39
|
setInstructionAggregator(aggregator) {
|
|
38
40
|
this.instructionAggregator = aggregator;
|
|
39
41
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Extract and cache instructions from a connected client
|
|
42
|
-
* @param name The client name
|
|
43
|
-
* @param client The connected client instance
|
|
44
|
-
*/
|
|
45
42
|
extractAndCacheInstructions(name, client) {
|
|
46
43
|
try {
|
|
47
44
|
const instructions = client.getInstructions();
|
|
48
|
-
// Update the connection info with instructions
|
|
49
45
|
const connectionInfo = this.outboundConns.get(name);
|
|
50
46
|
if (connectionInfo) {
|
|
51
47
|
connectionInfo.instructions = instructions;
|
|
52
48
|
}
|
|
53
|
-
// Update the instruction aggregator if available
|
|
54
49
|
if (this.instructionAggregator) {
|
|
55
50
|
this.instructionAggregator.setInstructions(name, instructions);
|
|
56
51
|
}
|
|
@@ -68,207 +63,71 @@ export class ClientManager {
|
|
|
68
63
|
logger.warn(`Failed to extract instructions from ${name}: ${error}`);
|
|
69
64
|
}
|
|
70
65
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
jsonSchemaValidator: customValidator,
|
|
84
|
-
debouncedNotificationMethods: [
|
|
85
|
-
'notifications/tools/list_changed',
|
|
86
|
-
'notifications/resources/list_changed',
|
|
87
|
-
'notifications/prompts/list_changed',
|
|
88
|
-
],
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Creates a new MCP client instance for external use (e.g., OAuth testing)
|
|
93
|
-
* @returns A new Client instance
|
|
94
|
-
*/
|
|
95
|
-
createClientInstance() {
|
|
96
|
-
return this.createClient();
|
|
66
|
+
setupConnectionHandlers(name, client) {
|
|
67
|
+
client.onclose = () => {
|
|
68
|
+
const clientInfo = this.outboundConns.get(name);
|
|
69
|
+
if (clientInfo) {
|
|
70
|
+
clientInfo.status = ClientStatus.Disconnected;
|
|
71
|
+
}
|
|
72
|
+
this.instructionAggregator?.removeServer(name);
|
|
73
|
+
logger.info(`Client ${name} disconnected`);
|
|
74
|
+
};
|
|
75
|
+
client.onerror = (error) => {
|
|
76
|
+
logger.error(`Client ${name} error: ${error}`);
|
|
77
|
+
};
|
|
97
78
|
}
|
|
98
|
-
/**
|
|
99
|
-
* Creates client instances for all transports with retry logic
|
|
100
|
-
* @param transports Record of transport instances
|
|
101
|
-
* @returns Record of client instances
|
|
102
|
-
*/
|
|
103
79
|
async createClients(transports) {
|
|
104
80
|
this.transports = transports;
|
|
105
81
|
this.outboundConns.clear();
|
|
106
82
|
for (const [name, transport] of Object.entries(transports)) {
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
const client = this.createClient();
|
|
110
|
-
// Connect with retry logic
|
|
111
|
-
const connectedClient = await this.connectWithRetry(client, transport, name);
|
|
112
|
-
this.outboundConns.set(name, {
|
|
113
|
-
name,
|
|
114
|
-
transport,
|
|
115
|
-
client: connectedClient,
|
|
116
|
-
status: ClientStatus.Connected,
|
|
117
|
-
lastConnected: new Date(),
|
|
118
|
-
});
|
|
119
|
-
logger.info(`Client created for ${name}`);
|
|
120
|
-
// Extract and cache instructions after successful connection
|
|
121
|
-
this.extractAndCacheInstructions(name, connectedClient);
|
|
122
|
-
connectedClient.onclose = () => {
|
|
123
|
-
const clientInfo = this.outboundConns.get(name);
|
|
124
|
-
if (clientInfo) {
|
|
125
|
-
clientInfo.status = ClientStatus.Disconnected;
|
|
126
|
-
}
|
|
127
|
-
// Remove instructions from aggregator when client disconnects
|
|
128
|
-
if (this.instructionAggregator) {
|
|
129
|
-
this.instructionAggregator.removeServer(name);
|
|
130
|
-
}
|
|
131
|
-
logger.info(`Client ${name} disconnected`);
|
|
132
|
-
};
|
|
133
|
-
connectedClient.onerror = (error) => {
|
|
134
|
-
logger.error(`Client ${name} error: ${error}`);
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
if (error instanceof OAuthRequiredError) {
|
|
139
|
-
// Handle OAuth required - set client to AwaitingOAuth status
|
|
140
|
-
logger.info(`OAuth authorization required for ${name}`);
|
|
141
|
-
// Try to get authorization URL from OAuth provider
|
|
142
|
-
let authorizationUrl;
|
|
143
|
-
try {
|
|
144
|
-
// Extract OAuth provider from transport if available
|
|
145
|
-
const oauthProvider = transport.oauthProvider;
|
|
146
|
-
if (oauthProvider && typeof oauthProvider.getAuthorizationUrl === 'function') {
|
|
147
|
-
authorizationUrl = oauthProvider.getAuthorizationUrl();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (urlError) {
|
|
151
|
-
logger.warn(`Could not extract authorization URL for ${name}:`, urlError);
|
|
152
|
-
}
|
|
153
|
-
this.outboundConns.set(name, {
|
|
154
|
-
name,
|
|
155
|
-
transport,
|
|
156
|
-
client: error.client,
|
|
157
|
-
status: ClientStatus.AwaitingOAuth,
|
|
158
|
-
authorizationUrl,
|
|
159
|
-
oauthStartTime: new Date(),
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
logger.error(`Failed to create client for ${name}: ${error}`);
|
|
164
|
-
this.outboundConns.set(name, {
|
|
165
|
-
name,
|
|
166
|
-
transport,
|
|
167
|
-
client: this.createClient(),
|
|
168
|
-
status: ClientStatus.Error,
|
|
169
|
-
lastError: error instanceof Error ? error : new Error(String(error)),
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
83
|
+
await this.createClient(name, transport);
|
|
173
84
|
}
|
|
174
85
|
return this.outboundConns;
|
|
175
86
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
if (i < CONNECTION_RETRY.MAX_ATTEMPTS - 1) {
|
|
219
|
-
logger.info(`Retrying in ${retryDelay}ms...`);
|
|
220
|
-
// Clean up failed transport
|
|
221
|
-
try {
|
|
222
|
-
await currentTransport.close();
|
|
223
|
-
}
|
|
224
|
-
catch (closeError) {
|
|
225
|
-
debugIf(() => ({ message: `Error closing transport during retry: ${closeError}` }));
|
|
226
|
-
}
|
|
227
|
-
// Implement cancellable delay
|
|
228
|
-
await new Promise((resolve, reject) => {
|
|
229
|
-
const timeoutId = setTimeout(resolve, retryDelay);
|
|
230
|
-
if (abortSignal) {
|
|
231
|
-
const abortHandler = () => {
|
|
232
|
-
clearTimeout(timeoutId);
|
|
233
|
-
reject(new Error(`Connection retry aborted: ${abortSignal.reason || 'Request cancelled'}`));
|
|
234
|
-
};
|
|
235
|
-
if (abortSignal.aborted) {
|
|
236
|
-
clearTimeout(timeoutId);
|
|
237
|
-
reject(new Error(`Connection retry aborted: ${abortSignal.reason || 'Request cancelled'}`));
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
abortSignal.addEventListener('abort', abortHandler, { once: true });
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
retryDelay *= 2; // Exponential backoff
|
|
245
|
-
// For HTTP/SSE transports, we need to recreate both client and transport
|
|
246
|
-
// because these transports cannot be restarted once started
|
|
247
|
-
if (currentTransport instanceof StreamableHTTPClientTransport ||
|
|
248
|
-
currentTransport instanceof SSEClientTransport) {
|
|
249
|
-
currentTransport = this.recreateHttpTransport(currentTransport);
|
|
250
|
-
currentClient = this.createClient();
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
// For STDIO transports, we can reuse the transport but need a new client
|
|
254
|
-
currentClient = this.createClient();
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
throw new ClientConnectionError(name, error instanceof Error ? error : new Error(String(error)));
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
87
|
+
async createClient(name, transport) {
|
|
88
|
+
logger.info(`Creating client for ${name}`);
|
|
89
|
+
try {
|
|
90
|
+
const client = this.clientFactory.createClient();
|
|
91
|
+
const connectedClient = await this.connectionHandler.connectWithRetry(client, transport, name, undefined, (t) => this.transportRecreator.recreateHttpTransport(t));
|
|
92
|
+
this.outboundConns.set(name, {
|
|
93
|
+
name,
|
|
94
|
+
transport,
|
|
95
|
+
client: connectedClient,
|
|
96
|
+
status: ClientStatus.Connected,
|
|
97
|
+
lastConnected: new Date(),
|
|
98
|
+
});
|
|
99
|
+
logger.info(`Client created for ${name}`);
|
|
100
|
+
this.extractAndCacheInstructions(name, connectedClient);
|
|
101
|
+
this.setupConnectionHandlers(name, connectedClient);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.handleClientCreationError(name, transport, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
handleClientCreationError(name, transport, error) {
|
|
108
|
+
if (error instanceof OAuthRequiredError) {
|
|
109
|
+
logger.info(`OAuth authorization required for ${name}`);
|
|
110
|
+
const authorizationUrl = this.oauthFlowHandler.extractAuthorizationUrl(transport);
|
|
111
|
+
this.outboundConns.set(name, {
|
|
112
|
+
name,
|
|
113
|
+
transport,
|
|
114
|
+
client: error.client,
|
|
115
|
+
status: ClientStatus.AwaitingOAuth,
|
|
116
|
+
authorizationUrl,
|
|
117
|
+
oauthStartTime: new Date(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
logger.error(`Failed to create client for ${name}: ${error}`);
|
|
122
|
+
this.outboundConns.set(name, {
|
|
123
|
+
name,
|
|
124
|
+
transport,
|
|
125
|
+
client: this.clientFactory.createClient(),
|
|
126
|
+
status: ClientStatus.Error,
|
|
127
|
+
lastError: error instanceof Error ? error : new Error(String(error)),
|
|
128
|
+
});
|
|
262
129
|
}
|
|
263
|
-
// This should never be reached due to the throw in the else block above
|
|
264
|
-
throw new ClientConnectionError(name, new Error('Max retries exceeded'));
|
|
265
130
|
}
|
|
266
|
-
/**
|
|
267
|
-
* Gets a client by name with error handling
|
|
268
|
-
* @param clientName The name of the client to get
|
|
269
|
-
* @returns The client instance
|
|
270
|
-
* @throws ClientNotFoundError if the client is not found
|
|
271
|
-
*/
|
|
272
131
|
getClient(clientName) {
|
|
273
132
|
const client = this.outboundConns.get(clientName);
|
|
274
133
|
if (!client) {
|
|
@@ -276,32 +135,18 @@ export class ClientManager {
|
|
|
276
135
|
}
|
|
277
136
|
return client;
|
|
278
137
|
}
|
|
279
|
-
/**
|
|
280
|
-
* Gets all outbound connections
|
|
281
|
-
* @returns Map of all outbound connections
|
|
282
|
-
*/
|
|
283
138
|
getClients() {
|
|
284
139
|
return this.outboundConns;
|
|
285
140
|
}
|
|
286
|
-
/**
|
|
287
|
-
* Creates a single client for async loading (used by McpLoadingManager)
|
|
288
|
-
* @param name The name of the client
|
|
289
|
-
* @param transport The transport to connect to
|
|
290
|
-
* @param abortSignal Optional AbortSignal to cancel the operation
|
|
291
|
-
* @returns Promise that resolves when client is connected
|
|
292
|
-
*/
|
|
293
141
|
async createSingleClient(name, transport, abortSignal) {
|
|
294
|
-
// Prevent concurrent creation of the same client
|
|
295
142
|
const existingPromise = this.connectionSemaphore.get(name);
|
|
296
143
|
if (existingPromise) {
|
|
297
144
|
await existingPromise;
|
|
298
145
|
return;
|
|
299
146
|
}
|
|
300
|
-
// Check if operation was aborted before starting
|
|
301
147
|
if (abortSignal?.aborted) {
|
|
302
148
|
throw new Error(`Operation aborted: ${abortSignal.reason || 'Request cancelled'}`);
|
|
303
149
|
}
|
|
304
|
-
// Create connection promise
|
|
305
150
|
const connectionPromise = this.createSingleClientInternal(name, transport, abortSignal);
|
|
306
151
|
this.connectionSemaphore.set(name, connectionPromise);
|
|
307
152
|
try {
|
|
@@ -311,21 +156,15 @@ export class ClientManager {
|
|
|
311
156
|
this.connectionSemaphore.delete(name);
|
|
312
157
|
}
|
|
313
158
|
}
|
|
314
|
-
/**
|
|
315
|
-
* Internal method to create and connect a single client
|
|
316
|
-
*/
|
|
317
159
|
async createSingleClientInternal(name, transport, abortSignal) {
|
|
318
160
|
logger.info(`Creating client for ${name}`);
|
|
319
|
-
// Store transport reference
|
|
320
161
|
this.transports[name] = transport;
|
|
321
162
|
try {
|
|
322
|
-
// Check if operation was aborted
|
|
323
163
|
if (abortSignal?.aborted) {
|
|
324
164
|
throw new Error(`Operation aborted: ${abortSignal.reason || 'Request cancelled'}`);
|
|
325
165
|
}
|
|
326
|
-
const client = this.createClient();
|
|
327
|
-
|
|
328
|
-
const connectedClient = await this.connectWithRetry(client, transport, name, abortSignal);
|
|
166
|
+
const client = this.clientFactory.createClient();
|
|
167
|
+
const connectedClient = await this.connectionHandler.connectWithRetry(client, transport, name, abortSignal, (t) => this.transportRecreator.recreateHttpTransport(t));
|
|
329
168
|
this.outboundConns.set(name, {
|
|
330
169
|
name,
|
|
331
170
|
transport,
|
|
@@ -334,190 +173,63 @@ export class ClientManager {
|
|
|
334
173
|
lastConnected: new Date(),
|
|
335
174
|
});
|
|
336
175
|
logger.info(`Client created for ${name}`);
|
|
337
|
-
// Extract and cache instructions after successful connection
|
|
338
176
|
this.extractAndCacheInstructions(name, connectedClient);
|
|
339
|
-
|
|
340
|
-
const clientInfo = this.outboundConns.get(name);
|
|
341
|
-
if (clientInfo) {
|
|
342
|
-
clientInfo.status = ClientStatus.Disconnected;
|
|
343
|
-
}
|
|
344
|
-
// Remove instructions from aggregator when client disconnects
|
|
345
|
-
if (this.instructionAggregator) {
|
|
346
|
-
this.instructionAggregator.removeServer(name);
|
|
347
|
-
}
|
|
348
|
-
logger.info(`Client ${name} disconnected`);
|
|
349
|
-
};
|
|
350
|
-
connectedClient.onerror = (error) => {
|
|
351
|
-
logger.error(`Client ${name} error: ${error}`);
|
|
352
|
-
};
|
|
177
|
+
this.setupConnectionHandlers(name, connectedClient);
|
|
353
178
|
}
|
|
354
179
|
catch (error) {
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
logger.error(`Failed to create client for ${name}: ${error}`);
|
|
383
|
-
this.outboundConns.set(name, {
|
|
384
|
-
name,
|
|
385
|
-
transport,
|
|
386
|
-
client: this.createClient(),
|
|
387
|
-
status: ClientStatus.Error,
|
|
388
|
-
lastError: error instanceof Error ? error : new Error(String(error)),
|
|
389
|
-
});
|
|
390
|
-
// Re-throw error for loading manager to handle
|
|
391
|
-
throw error;
|
|
392
|
-
}
|
|
180
|
+
this.handleSingleClientError(name, transport, error);
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
handleSingleClientError(name, transport, error) {
|
|
185
|
+
if (error instanceof OAuthRequiredError) {
|
|
186
|
+
logger.info(`OAuth authorization required for ${name}`);
|
|
187
|
+
const authorizationUrl = this.oauthFlowHandler.extractAuthorizationUrl(transport);
|
|
188
|
+
this.outboundConns.set(name, {
|
|
189
|
+
name,
|
|
190
|
+
transport,
|
|
191
|
+
client: error.client,
|
|
192
|
+
status: ClientStatus.AwaitingOAuth,
|
|
193
|
+
authorizationUrl,
|
|
194
|
+
oauthStartTime: new Date(),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
logger.error(`Failed to create client for ${name}: ${error}`);
|
|
199
|
+
this.outboundConns.set(name, {
|
|
200
|
+
name,
|
|
201
|
+
transport,
|
|
202
|
+
client: this.clientFactory.createClient(),
|
|
203
|
+
status: ClientStatus.Error,
|
|
204
|
+
lastError: error instanceof Error ? error : new Error(String(error)),
|
|
205
|
+
});
|
|
393
206
|
}
|
|
394
207
|
}
|
|
395
|
-
/**
|
|
396
|
-
* Initialize clients storage without connecting (for async loading)
|
|
397
|
-
* @param transports Record of transport instances
|
|
398
|
-
* @returns Empty connections map (to be populated by async loading)
|
|
399
|
-
*/
|
|
400
208
|
initializeClientsAsync(transports) {
|
|
401
209
|
this.transports = transports;
|
|
402
210
|
this.outboundConns.clear();
|
|
403
211
|
logger.info(`Initialized client storage for ${Object.keys(transports).length} transports`);
|
|
404
212
|
return this.outboundConns;
|
|
405
213
|
}
|
|
406
|
-
/**
|
|
407
|
-
* Get transport by name (used by loading manager for retries)
|
|
408
|
-
* @param name The transport name
|
|
409
|
-
* @returns The transport instance or undefined
|
|
410
|
-
*/
|
|
411
214
|
getTransport(name) {
|
|
412
215
|
return this.transports[name];
|
|
413
216
|
}
|
|
414
|
-
/**
|
|
415
|
-
* Get all transport names
|
|
416
|
-
* @returns Array of transport names
|
|
417
|
-
*/
|
|
418
217
|
getTransportNames() {
|
|
419
218
|
return Object.keys(this.transports);
|
|
420
219
|
}
|
|
421
|
-
/**
|
|
422
|
-
* Recreates an HTTP or SSE transport with the same configuration
|
|
423
|
-
* This is necessary because HTTP transports cannot be restarted once started
|
|
424
|
-
* @param transport The original transport to recreate
|
|
425
|
-
* @returns A new transport instance with the same configuration
|
|
426
|
-
*/
|
|
427
|
-
recreateHttpTransport(transport) {
|
|
428
|
-
// Type guard for HTTP-based transports
|
|
429
|
-
if (!(transport instanceof StreamableHTTPClientTransport) && !(transport instanceof SSEClientTransport)) {
|
|
430
|
-
throw new Error('Transport recreation only supported for HTTP and SSE transports');
|
|
431
|
-
}
|
|
432
|
-
const transportUrl = transport._url;
|
|
433
|
-
// Get OAuth provider from AuthProviderTransport
|
|
434
|
-
const authTransport = transport;
|
|
435
|
-
const oauthProvider = authTransport.oauthProvider;
|
|
436
|
-
// Create new transport based on original type
|
|
437
|
-
let newTransport;
|
|
438
|
-
if (transport instanceof StreamableHTTPClientTransport) {
|
|
439
|
-
const httpTransport = new StreamableHTTPClientTransport(transportUrl, {
|
|
440
|
-
authProvider: oauthProvider,
|
|
441
|
-
});
|
|
442
|
-
newTransport = httpTransport;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
const sseTransport = new SSEClientTransport(transportUrl, {
|
|
446
|
-
authProvider: oauthProvider,
|
|
447
|
-
});
|
|
448
|
-
newTransport = sseTransport;
|
|
449
|
-
}
|
|
450
|
-
// Copy transport properties from AuthProviderTransport
|
|
451
|
-
newTransport.oauthProvider = oauthProvider;
|
|
452
|
-
newTransport.connectionTimeout = authTransport.connectionTimeout;
|
|
453
|
-
newTransport.requestTimeout = authTransport.requestTimeout;
|
|
454
|
-
newTransport.timeout = authTransport.timeout; // Keep for backward compatibility
|
|
455
|
-
newTransport.tags = authTransport.tags;
|
|
456
|
-
return newTransport;
|
|
457
|
-
}
|
|
458
|
-
/**
|
|
459
|
-
* Complete OAuth flow and reconnect client with fresh transport
|
|
460
|
-
* This recreates both transport and client since HTTP transports cannot be restarted
|
|
461
|
-
* @param serverName The name of the server to reconnect
|
|
462
|
-
* @param authorizationCode The OAuth authorization code from the callback
|
|
463
|
-
* @throws ClientNotFoundError if the client is not found
|
|
464
|
-
* @throws Error if transport does not support OAuth or reconnection fails
|
|
465
|
-
*/
|
|
466
220
|
async completeOAuthAndReconnect(serverName, authorizationCode) {
|
|
467
221
|
const clientInfo = this.outboundConns.get(serverName);
|
|
468
222
|
if (!clientInfo) {
|
|
469
223
|
throw new ClientNotFoundError(serverName);
|
|
470
224
|
}
|
|
471
|
-
|
|
472
|
-
const
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
// 1. Complete OAuth flow
|
|
479
|
-
await transport.finishAuth(authorizationCode);
|
|
480
|
-
// 2. Close old transport
|
|
481
|
-
await transport.close();
|
|
482
|
-
// 3. Create new transport using helper
|
|
483
|
-
const newTransport = this.recreateHttpTransport(transport);
|
|
484
|
-
// 4. Create and connect new client with timeout
|
|
485
|
-
// Priority: connectionTimeout > timeout (deprecated fallback)
|
|
486
|
-
const newClient = this.createClient();
|
|
487
|
-
const timeout = getConnectionTimeout(newTransport);
|
|
488
|
-
await newClient.connect(newTransport, timeout ? { timeout } : undefined);
|
|
489
|
-
// 5. Discover capabilities
|
|
490
|
-
const capabilities = newClient.getServerCapabilities();
|
|
491
|
-
// 6. Cache instructions
|
|
492
|
-
this.extractAndCacheInstructions(serverName, newClient);
|
|
493
|
-
// 7. Update connection info (create new object to handle readonly properties)
|
|
494
|
-
const updatedInfo = {
|
|
495
|
-
name: serverName,
|
|
496
|
-
transport: newTransport,
|
|
497
|
-
client: newClient,
|
|
498
|
-
status: ClientStatus.Connected,
|
|
499
|
-
lastConnected: new Date(),
|
|
500
|
-
capabilities,
|
|
501
|
-
instructions: clientInfo.instructions, // Preserve existing instructions if any
|
|
502
|
-
lastError: undefined,
|
|
503
|
-
};
|
|
504
|
-
this.outboundConns.set(serverName, updatedInfo);
|
|
505
|
-
// 8. Update transports map
|
|
506
|
-
this.transports[serverName] = newTransport;
|
|
507
|
-
logger.info(`OAuth reconnection completed successfully for ${serverName}`);
|
|
508
|
-
}
|
|
509
|
-
catch (error) {
|
|
510
|
-
logger.error(`OAuth reconnection failed for ${serverName}:`, error);
|
|
511
|
-
throw error;
|
|
512
|
-
}
|
|
225
|
+
const oldTransport = clientInfo.transport;
|
|
226
|
+
const newTransport = this.transportRecreator.recreateHttpTransport(oldTransport, serverName);
|
|
227
|
+
const updatedInfo = await this.oauthFlowHandler.completeOAuthAndReconnect(serverName, oldTransport, newTransport, authorizationCode, clientInfo);
|
|
228
|
+
this.outboundConns.set(serverName, updatedInfo);
|
|
229
|
+
this.transports[serverName] = newTransport;
|
|
230
|
+
this.extractAndCacheInstructions(serverName, updatedInfo.client);
|
|
231
|
+
this.setupConnectionHandlers(serverName, updatedInfo.client);
|
|
513
232
|
}
|
|
514
|
-
/**
|
|
515
|
-
* Executes a client operation with error handling and retry logic
|
|
516
|
-
* @param clientName The name of the client to use
|
|
517
|
-
* @param operation The operation to execute
|
|
518
|
-
* @param options Operation options including timeout and retry settings
|
|
519
|
-
* @param requiredCapability The capability required for this operation
|
|
520
|
-
*/
|
|
521
233
|
async executeClientOperation(clientName, operation, options = {}, requiredCapability) {
|
|
522
234
|
const outboundConn = this.getClient(clientName);
|
|
523
235
|
if (outboundConn.status !== ClientStatus.Connected || !outboundConn.client.transport) {
|
|
@@ -528,10 +240,12 @@ export class ClientManager {
|
|
|
528
240
|
}
|
|
529
241
|
return executeOperation(() => operation(outboundConn), `client ${clientName}`, options);
|
|
530
242
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
243
|
+
createClientInstance() {
|
|
244
|
+
return this.clientFactory.createClientInstance();
|
|
245
|
+
}
|
|
246
|
+
createPooledClientInstance() {
|
|
247
|
+
return this.clientFactory.createPooledClientInstance();
|
|
248
|
+
}
|
|
535
249
|
async removeClient(name) {
|
|
536
250
|
const clientInfo = this.outboundConns.get(name);
|
|
537
251
|
if (!clientInfo) {
|
|
@@ -539,7 +253,6 @@ export class ClientManager {
|
|
|
539
253
|
}
|
|
540
254
|
logger.info(`Removing client ${name}...`);
|
|
541
255
|
try {
|
|
542
|
-
// Close transport if connected
|
|
543
256
|
if (clientInfo.transport) {
|
|
544
257
|
try {
|
|
545
258
|
await clientInfo.transport.close();
|
|
@@ -548,13 +261,9 @@ export class ClientManager {
|
|
|
548
261
|
logger.warn(`Error closing transport for ${name}: ${error}`);
|
|
549
262
|
}
|
|
550
263
|
}
|
|
551
|
-
// Remove from collections
|
|
552
264
|
this.outboundConns.delete(name);
|
|
553
265
|
delete this.transports[name];
|
|
554
|
-
|
|
555
|
-
if (this.instructionAggregator) {
|
|
556
|
-
this.instructionAggregator.removeServer(name);
|
|
557
|
-
}
|
|
266
|
+
this.instructionAggregator?.removeServer(name);
|
|
558
267
|
logger.info(`Client ${name} removed successfully`);
|
|
559
268
|
}
|
|
560
269
|
catch (error) {
|
|
@@ -563,17 +272,5 @@ export class ClientManager {
|
|
|
563
272
|
}
|
|
564
273
|
}
|
|
565
274
|
}
|
|
566
|
-
|
|
567
|
-
* Custom error class for OAuth authorization required
|
|
568
|
-
*/
|
|
569
|
-
export class OAuthRequiredError extends Error {
|
|
570
|
-
serverName;
|
|
571
|
-
client;
|
|
572
|
-
constructor(serverName, client) {
|
|
573
|
-
super(`OAuth authorization required for ${serverName}`);
|
|
574
|
-
this.serverName = serverName;
|
|
575
|
-
this.client = client;
|
|
576
|
-
this.name = 'OAuthRequiredError';
|
|
577
|
-
}
|
|
578
|
-
}
|
|
275
|
+
export default ClientManager;
|
|
579
276
|
//# sourceMappingURL=clientManager.js.map
|