@1mcp/agent 0.36.0 → 0.37.0
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/admin/assets/{admin-OAuthServicesWorkspace-BCGj2hP4.js → admin-OAuthServicesWorkspace-BHyDoEos.js} +1 -1
- package/build/admin/assets/admin-console-DnlZpz5X.js +3 -0
- package/build/admin/assets/admin-vendor-62eL-qdH.js +1 -0
- package/build/admin/assets/admin-vendor-BbMrl7MK.js +3 -0
- package/build/admin/assets/admin-vendor-DpjVwd81.js +62 -0
- package/build/admin/index.html +4 -1
- package/build/auth/sdkOAuthServerProvider.d.ts.map +1 -1
- package/build/auth/sdkOAuthServerProvider.js +49 -48
- package/build/auth/sdkOAuthServerProvider.js.map +1 -1
- package/build/auth/storage/authCodeRepository.js +2 -2
- package/build/auth/storage/authCodeRepository.js.map +1 -1
- package/build/auth/storage/authRequestRepository.js +2 -2
- package/build/auth/storage/authRequestRepository.js.map +1 -1
- package/build/auth/storage/fileStorageService.d.ts +39 -0
- package/build/auth/storage/fileStorageService.d.ts.map +1 -1
- package/build/auth/storage/fileStorageService.js +171 -38
- package/build/auth/storage/fileStorageService.js.map +1 -1
- package/build/auth/storage/oauthStorageService.d.ts +5 -0
- package/build/auth/storage/oauthStorageService.d.ts.map +1 -1
- package/build/auth/storage/oauthStorageService.js +6 -0
- package/build/auth/storage/oauthStorageService.js.map +1 -1
- package/build/commands/mcp/install.d.ts +47 -3
- package/build/commands/mcp/install.d.ts.map +1 -1
- package/build/commands/mcp/install.js +22 -14
- package/build/commands/mcp/install.js.map +1 -1
- package/build/commands/registry/options.d.ts +3 -0
- package/build/commands/registry/options.d.ts.map +1 -1
- package/build/commands/registry/options.js +27 -0
- package/build/commands/registry/options.js.map +1 -1
- package/build/commands/registry/search.d.ts.map +1 -1
- package/build/commands/registry/search.js +2 -10
- 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 +2 -10
- 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 +2 -10
- 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 +2 -10
- package/build/commands/registry/versions.js.map +1 -1
- package/build/commands/serve/asyncLoadingOptions.d.ts +16 -0
- package/build/commands/serve/asyncLoadingOptions.d.ts.map +1 -1
- package/build/commands/serve/asyncLoadingOptions.js +29 -0
- package/build/commands/serve/asyncLoadingOptions.js.map +1 -1
- package/build/commands/serve/index.d.ts +24 -0
- package/build/commands/serve/index.d.ts.map +1 -1
- package/build/commands/serve/index.js +24 -0
- package/build/commands/serve/index.js.map +1 -1
- package/build/commands/serve/serve.d.ts +6 -0
- package/build/commands/serve/serve.d.ts.map +1 -1
- package/build/commands/serve/serve.js +45 -2
- package/build/commands/serve/serve.js.map +1 -1
- package/build/commands/serve/serveBackground.d.ts +2 -1
- package/build/commands/serve/serveBackground.d.ts.map +1 -1
- package/build/commands/serve/serveBackground.js +6 -0
- package/build/commands/serve/serveBackground.js.map +1 -1
- package/build/commands/wait/wait.js +1 -1
- package/build/commands/wait/wait.js.map +1 -1
- package/build/config/configManager.d.ts.map +1 -1
- package/build/config/configManager.js +19 -6
- package/build/config/configManager.js.map +1 -1
- package/build/config/configuredServerTargets.d.ts +1 -0
- package/build/config/configuredServerTargets.d.ts.map +1 -1
- package/build/config/configuredServerTargets.js +6 -0
- package/build/config/configuredServerTargets.js.map +1 -1
- package/build/constants/mcp.d.ts +1 -1
- package/build/constants/mcp.js +1 -1
- package/build/core/loading/backendLoadingPolicy.d.ts +11 -0
- package/build/core/loading/backendLoadingPolicy.d.ts.map +1 -0
- package/build/core/loading/backendLoadingPolicy.js +10 -0
- package/build/core/loading/backendLoadingPolicy.js.map +1 -0
- package/build/core/loading/mcpLoadingManager.d.ts +8 -24
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -1
- package/build/core/loading/mcpLoadingManager.js +116 -70
- package/build/core/loading/mcpLoadingManager.js.map +1 -1
- package/build/core/server/agentConfig.d.ts +26 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +11 -0
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/clientInstancePool.d.ts +4 -6
- package/build/core/server/clientInstancePool.d.ts.map +1 -1
- package/build/core/server/clientInstancePool.js +63 -63
- package/build/core/server/clientInstancePool.js.map +1 -1
- package/build/core/server/clientInstancePoolTypes.d.ts +9 -2
- package/build/core/server/clientInstancePoolTypes.d.ts.map +1 -1
- package/build/core/server/clientInstancePoolTypes.js +8 -3
- package/build/core/server/clientInstancePoolTypes.js.map +1 -1
- package/build/core/server/requestContextPreparation.d.ts.map +1 -1
- package/build/core/server/requestContextPreparation.js +2 -1
- package/build/core/server/requestContextPreparation.js.map +1 -1
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +2 -1
- package/build/core/server/serverManager.js.map +1 -1
- package/build/core/server/templateServerManager.d.ts +14 -1
- package/build/core/server/templateServerManager.d.ts.map +1 -1
- package/build/core/server/templateServerManager.js +64 -9
- package/build/core/server/templateServerManager.js.map +1 -1
- package/build/core/tools/internal/schemas/index.d.ts +1 -1
- package/build/core/tools/internal/schemas/installation.d.ts +1 -1
- package/build/core/types/transport.d.ts +82 -2
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +72 -0
- package/build/core/types/transport.js.map +1 -1
- package/build/domains/admin/adminConfiguredServerService.d.ts +146 -2
- package/build/domains/admin/adminConfiguredServerService.d.ts.map +1 -1
- package/build/domains/admin/adminConfiguredServerService.js +729 -81
- package/build/domains/admin/adminConfiguredServerService.js.map +1 -1
- package/build/domains/admin/adminDomain.d.ts +5 -0
- package/build/domains/admin/adminDomain.d.ts.map +1 -1
- package/build/domains/admin/adminDomain.js +11 -0
- package/build/domains/admin/adminDomain.js.map +1 -1
- package/build/domains/admin/adminOperationService.d.ts +1 -0
- package/build/domains/admin/adminOperationService.d.ts.map +1 -1
- package/build/domains/admin/adminOperationService.js +6 -2
- package/build/domains/admin/adminOperationService.js.map +1 -1
- package/build/domains/admin/templateServerDefinitionAnalyzer.d.ts +26 -0
- package/build/domains/admin/templateServerDefinitionAnalyzer.d.ts.map +1 -0
- package/build/domains/admin/templateServerDefinitionAnalyzer.js +148 -0
- package/build/domains/admin/templateServerDefinitionAnalyzer.js.map +1 -0
- package/build/domains/config-change/configChange.d.ts +1 -1
- package/build/domains/config-change/configChange.d.ts.map +1 -1
- package/build/domains/config-change/configChange.js +168 -49
- package/build/domains/config-change/configChange.js.map +1 -1
- package/build/domains/config-change/types.d.ts +16 -2
- package/build/domains/config-change/types.d.ts.map +1 -1
- package/build/domains/registry/mcpRegistryClient.d.ts +3 -3
- package/build/domains/registry/mcpRegistryClient.d.ts.map +1 -1
- package/build/domains/registry/mcpRegistryClient.js +8 -7
- package/build/domains/registry/mcpRegistryClient.js.map +1 -1
- package/build/logger/secureLogger.d.ts.map +1 -1
- package/build/logger/secureLogger.js +160 -23
- package/build/logger/secureLogger.js.map +1 -1
- package/build/server.d.ts +2 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +8 -7
- package/build/server.js.map +1 -1
- package/build/transport/http/middlewares/securityMiddleware.d.ts +6 -0
- package/build/transport/http/middlewares/securityMiddleware.d.ts.map +1 -1
- package/build/transport/http/middlewares/securityMiddleware.js +35 -29
- package/build/transport/http/middlewares/securityMiddleware.js.map +1 -1
- package/build/transport/http/routes/adminRoutes.d.ts +17 -1
- package/build/transport/http/routes/adminRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/adminRoutes.js +281 -17
- package/build/transport/http/routes/adminRoutes.js.map +1 -1
- package/build/transport/http/routes/healthRoutes.d.ts +6 -1
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/healthRoutes.js +7 -3
- package/build/transport/http/routes/healthRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +21 -3
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/http/storage/streamableSessionRepository.d.ts +1 -0
- package/build/transport/http/storage/streamableSessionRepository.d.ts.map +1 -1
- package/build/transport/http/storage/streamableSessionRepository.js +6 -3
- package/build/transport/http/storage/streamableSessionRepository.js.map +1 -1
- package/package.json +1 -1
- package/build/admin/assets/admin-console-xbgqUjbT.js +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityMiddleware.js","sourceRoot":"","sources":["../../../../src/transport/http/middlewares/securityMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAG3C,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC7E,uBAAuB;IACvB,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAEnD,wBAAwB;IACxB,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAEnD,2BAA2B;IAC3B,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;IAEpE,6EAA6E;IAC7E,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,SAAS,CACX,yBAAyB,EACzB,sIAAsI,CACvI,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAEjC,IAAI,EAAE,CAAC;AACT,CAAC;
|
|
1
|
+
{"version":3,"file":"securityMiddleware.js","sourceRoot":"","sources":["../../../../src/transport/http/middlewares/securityMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAG3C,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC7E,uBAAuB;IACvB,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAEnD,wBAAwB;IACxB,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAEnD,2BAA2B;IAC3B,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;IAEpE,6EAA6E;IAC7E,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,SAAS,CACX,yBAAyB,EACzB,sIAAsI,CACvI,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAEjC,IAAI,EAAE,CAAC;AACT,CAAC;AAUD,MAAM,CAAC,MAAM,6CAA6C,GAAsC;IAC9F,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACxB,WAAW,EAAE,EAAE;CAChB,CAAC;AAEF,MAAM,UAAU,+BAA+B,CAC7C,SAA4C,6CAA6C;IAEzF,OAAO,SAAS,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,WAAW;QACvB,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE;YACP,KAAK,EAAE,qBAAqB;YAC5B,iBAAiB,EAAE,wDAAwD;SAC5E;QACD,IAAI,EAAE,CAAC,GAAY,EAAE,EAAE;YACrB,mEAAmE;YACnE,OAAO,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;YACvC,MAAM,OAAO,GAA4B;gBACvC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;gBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,OAAO,CAAC,CAAC;YAEpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,qBAAqB;gBAC5B,iBAAiB,EAAE,wDAAwD;aAC5E,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,+BAA+B,EAAE,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC7E,iDAAiD;IACjD,MAAM,kBAAkB,GAAG;QACzB,UAAU,EAAE,oBAAoB;QAChC,mBAAmB,EAAE,gCAAgC;QACrD,cAAc,EAAE,sBAAsB;QACtC,MAAM,EAAE,iBAAiB;QACzB,IAAI,EAAE,sBAAsB;QAC5B,gBAAgB,EAAE,gBAAgB;QAClC,YAAY,EAAE,iBAAiB;KAChC,CAAC;IAEF,MAAM,wBAAwB,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAW,EAAE;QAC5E,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACzC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,GAA4B;oBACvC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,2BAA2B;oBAC3D,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;oBAC3B,EAAE,EAAE,GAAG,CAAC,EAAE;oBACV,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;oBAChC,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,kCAAkC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,gBAAgB;IAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAkC,CAAC,EAAE,CAAC;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,iBAAiB;gBACxB,iBAAiB,EAAE,qCAAqC;aACzD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAgC,CAAC,EAAE,CAAC;QAChF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACjF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,iBAAiB;gBACxB,iBAAiB,EAAE,qCAAqC;aACzD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC/E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC;gBAChF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,iBAAiB;oBACxB,iBAAiB,EAAE,qCAAqC;iBACzD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC7E,sDAAsD;IACtD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,uDAAuD,CAAC,CAAC;IACxF,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACpC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC9B,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAE/C,+CAA+C;IAC/C,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,yCAAyC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,iCAAiC;IACjC,MAAM,kBAAkB,GACtB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,GAAG,CAAC,MAAM,KAAK,MAAM;QACrB,GAAG,CAAC,MAAM,KAAK,KAAK;QACpB,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;IAE1B,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,OAAO,GAA4B;YACvC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC;YAChC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;YACpC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB;YAC9D,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS;SAC3E,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,GAAG,UAA0B,IAAa;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,OAAO,GAA4B;gBACvC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ;gBACR,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,kFAAkF;IAClF,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnF,IAAI,cAAc,EAAE,CAAC;QACnB,iEAAiE;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAEvG,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,GAAG,CAAC,IAAI,GAAG,UAA0B,IAAa;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;YAE1D,UAAU,CAAC,GAAG,EAAE;gBACd,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,CAAC,EAAE,cAAc,CAAC,CAAC;YAEnB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,CAAC,CAAC;AAC1G,CAAC"}
|
|
@@ -8,7 +8,21 @@ import type { AdminOAuthOperations } from '../../../domains/admin/adminOAuthServ
|
|
|
8
8
|
import { type AdminPresetOperations } from '../../../domains/admin/adminPresetService.js';
|
|
9
9
|
import type { AdminMutationAvailability } from '../../../domains/admin/runtimeScopeAdminLock.js';
|
|
10
10
|
import type { BackendLogBroker } from '../../../domains/backend-logs/backendLogBroker.js';
|
|
11
|
+
import { type SensitiveOperationRateLimitPolicy } from '../../../transport/http/middlewares/securityMiddleware.js';
|
|
11
12
|
import { Router } from 'express';
|
|
13
|
+
export interface AdminRateLimitPolicy {
|
|
14
|
+
login: {
|
|
15
|
+
windowMs: number;
|
|
16
|
+
maxRequests: number;
|
|
17
|
+
maxFailedAttempts: number;
|
|
18
|
+
};
|
|
19
|
+
status: {
|
|
20
|
+
windowMs: number;
|
|
21
|
+
maxRequests: number;
|
|
22
|
+
};
|
|
23
|
+
sensitive: SensitiveOperationRateLimitPolicy;
|
|
24
|
+
}
|
|
25
|
+
export declare const DEFAULT_ADMIN_RATE_LIMIT_POLICY: AdminRateLimitPolicy;
|
|
12
26
|
interface AdminRoutesOptions {
|
|
13
27
|
adminEnabled: boolean;
|
|
14
28
|
adminService: AdminIdentityService;
|
|
@@ -22,6 +36,7 @@ interface AdminRoutesOptions {
|
|
|
22
36
|
getOAuthDashboard?: () => BackendOAuthDashboardResult;
|
|
23
37
|
adminConsoleAssetsDir?: string;
|
|
24
38
|
getBackendLogBroker?: () => BackendLogBroker;
|
|
39
|
+
rateLimit?: AdminRateLimitPolicy;
|
|
25
40
|
}
|
|
26
41
|
export declare function createAdminRoutes(options: AdminRoutesOptions): Router | null;
|
|
27
42
|
export declare function resolveDefaultAdminConsoleAssetsDir(): string;
|
|
@@ -29,8 +44,9 @@ export declare class FailedLoginLimiter {
|
|
|
29
44
|
private readonly now;
|
|
30
45
|
private readonly maxActiveKeys;
|
|
31
46
|
private readonly windowMs;
|
|
47
|
+
private readonly maxFailedAttempts;
|
|
32
48
|
private readonly attempts;
|
|
33
|
-
constructor(now?: () => number, maxActiveKeys?: number, windowMs?: number);
|
|
49
|
+
constructor(now?: () => number, maxActiveKeys?: number, windowMs?: number, maxFailedAttempts?: number);
|
|
34
50
|
isLimited(username: string, origin: string): boolean;
|
|
35
51
|
recordFailure(username: string, origin: string): void;
|
|
36
52
|
reset(username: string, origin: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adminRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/adminRoutes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE9E,OAAO,KAAK,EACV,6BAA6B,EAI9B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAGL,KAAK,+BAA+B,EACrC,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAIL,oBAAoB,EACrB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAEL,KAAK,kCAAkC,EACxC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAMpF,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"adminRoutes.d.ts","sourceRoot":"","sources":["../../../../src/transport/http/routes/adminRoutes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE9E,OAAO,KAAK,EACV,6BAA6B,EAI9B,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAGL,KAAK,+BAA+B,EACrC,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAIL,oBAAoB,EACrB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAEL,KAAK,kCAAkC,EACxC,MAAM,uDAAuD,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAMpF,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAQtF,OAAO,EAGL,KAAK,iCAAiC,EACvC,MAAM,uDAAuD,CAAC;AAG/D,OAAgB,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAmI7D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,EAAE,iCAAiC,CAAC;CAC9C;AAED,eAAO,MAAM,+BAA+B,EAAE,oBAW7C,CAAC;AAEF,UAAU,kBAAkB;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,oBAAoB,CAAC;IACnC,uBAAuB,CAAC,EAAE,+BAA+B,CAAC;IAC1D,0BAA0B,CAAC,EAAE,kCAAkC,CAAC;IAChE,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,kBAAkB,EAAE,MAAM,eAAe,CAAC;IAC1C,iBAAiB,CAAC,EAAE,MAAM,2BAA2B,CAAC;IACtD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,gBAAgB,CAAC;IAC7C,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAukB5E;AAqQD,wBAAgB,mCAAmC,IAAI,MAAM,CAE5D;AA80BD,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgE;gBAGtE,GAAG,GAAE,MAAM,MAAiB,EAC5B,aAAa,SAA+B,EAC5C,QAAQ,SAAyB,EACjC,iBAAiB,SAAqB;IAGzD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IASpD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAWrD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI7C,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,YAAY;CAQrB"}
|
|
@@ -8,7 +8,7 @@ import { AdminConfiguredServerApplyError, AdminConfiguredServerNotFoundError, }
|
|
|
8
8
|
import { ADMIN_SESSION_COOKIE_NAME, AdminIdentityError, } from '../../../domains/admin/adminIdentityService.js';
|
|
9
9
|
import { AdminInstructionTemplateNotFoundError, } from '../../../domains/admin/adminInstructionTemplateService.js';
|
|
10
10
|
import { AdminPresetConflictError, AdminPresetNotFoundError, } from '../../../domains/admin/adminPresetService.js';
|
|
11
|
-
import {
|
|
11
|
+
import { createSensitiveOperationLimiter, DEFAULT_SENSITIVE_OPERATION_RATE_LIMIT_POLICY, } from '../../../transport/http/middlewares/securityMiddleware.js';
|
|
12
12
|
import { sanitizeErrorMessage } from '../../../utils/validation/sanitization.js';
|
|
13
13
|
import express, { Router } from 'express';
|
|
14
14
|
import rateLimit from 'express-rate-limit';
|
|
@@ -117,25 +117,52 @@ const requestContextSchema = z
|
|
|
117
117
|
})
|
|
118
118
|
.strict();
|
|
119
119
|
const configuredServerSourceSchema = z.enum(['mcpServers', 'mcpTemplates']);
|
|
120
|
+
const configuredServerDeleteApplySchema = z
|
|
121
|
+
.object({
|
|
122
|
+
previewFingerprint: z.string().trim().min(1).max(256),
|
|
123
|
+
confirmationFacts: z
|
|
124
|
+
.object({
|
|
125
|
+
previewConfirmed: z.string().trim().min(1).max(256),
|
|
126
|
+
targetIdentityConfirmed: z.string().trim().min(1).max(512),
|
|
127
|
+
})
|
|
128
|
+
.strict(),
|
|
129
|
+
})
|
|
130
|
+
.strict();
|
|
131
|
+
const configuredServerLifecyclePreviewSchema = z.object({ enabled: z.boolean() }).strict();
|
|
132
|
+
const configuredServerLifecycleApplySchema = configuredServerDeleteApplySchema.extend({ enabled: z.boolean() }).strict();
|
|
133
|
+
export const DEFAULT_ADMIN_RATE_LIMIT_POLICY = {
|
|
134
|
+
login: {
|
|
135
|
+
windowMs: ADMIN_AUTH_RATE_LIMIT_WINDOW_MS,
|
|
136
|
+
maxRequests: ADMIN_AUTH_RATE_LIMIT,
|
|
137
|
+
maxFailedAttempts: FAILED_LOGIN_LIMIT,
|
|
138
|
+
},
|
|
139
|
+
status: {
|
|
140
|
+
windowMs: ADMIN_STATUS_RATE_LIMIT_WINDOW_MS,
|
|
141
|
+
maxRequests: ADMIN_STATUS_RATE_LIMIT,
|
|
142
|
+
},
|
|
143
|
+
sensitive: { ...DEFAULT_SENSITIVE_OPERATION_RATE_LIMIT_POLICY },
|
|
144
|
+
};
|
|
120
145
|
export function createAdminRoutes(options) {
|
|
121
146
|
if (!options.adminEnabled) {
|
|
122
147
|
options.adminService.revokeAllSessions();
|
|
123
148
|
return null;
|
|
124
149
|
}
|
|
125
150
|
const router = Router();
|
|
126
|
-
const
|
|
151
|
+
const rateLimitPolicy = options.rateLimit ?? DEFAULT_ADMIN_RATE_LIMIT_POLICY;
|
|
152
|
+
const failedLoginLimiter = new FailedLoginLimiter(Date.now, FAILED_LOGIN_MAX_ACTIVE_KEYS, rateLimitPolicy.login.windowMs, rateLimitPolicy.login.maxFailedAttempts);
|
|
127
153
|
const authenticationLimiter = rateLimit({
|
|
128
|
-
windowMs:
|
|
129
|
-
max:
|
|
154
|
+
windowMs: rateLimitPolicy.login.windowMs,
|
|
155
|
+
max: rateLimitPolicy.login.maxRequests,
|
|
130
156
|
standardHeaders: true,
|
|
131
157
|
legacyHeaders: false,
|
|
132
158
|
});
|
|
133
159
|
const statusLimiter = rateLimit({
|
|
134
|
-
windowMs:
|
|
135
|
-
max:
|
|
160
|
+
windowMs: rateLimitPolicy.status.windowMs,
|
|
161
|
+
max: rateLimitPolicy.status.maxRequests,
|
|
136
162
|
standardHeaders: true,
|
|
137
163
|
legacyHeaders: false,
|
|
138
164
|
});
|
|
165
|
+
const sensitiveOperationLimiter = createSensitiveOperationLimiter(rateLimitPolicy.sensitive);
|
|
139
166
|
const adminConsoleAssets = resolveAdminConsoleAssets(options.adminConsoleAssetsDir);
|
|
140
167
|
options.adminService.bootstrapFirstAdminFromEnvironment();
|
|
141
168
|
router.get('/cli/v1/capabilities', (req, res) => {
|
|
@@ -562,6 +589,24 @@ export function createAdminRoutes(options) {
|
|
|
562
589
|
return void res.status(400).json({ error: 'configured_server_source_invalid' });
|
|
563
590
|
await handleConfiguredServerApply(req, res, options, source.data);
|
|
564
591
|
});
|
|
592
|
+
router.post('/api/configured-servers/:source/:name/delete-preview', async (req, res) => {
|
|
593
|
+
const source = configuredServerSourceSchema.safeParse(req.params.source);
|
|
594
|
+
if (!source.success)
|
|
595
|
+
return void res.status(400).json({ error: 'configured_server_source_invalid' });
|
|
596
|
+
await handleConfiguredServerDeletePreview(req, res, options, source.data);
|
|
597
|
+
});
|
|
598
|
+
router.post('/api/configured-servers/mcpTemplates/:name/lifecycle-preview', async (req, res) => {
|
|
599
|
+
await handleConfiguredServerLifecyclePreview(req, res, options);
|
|
600
|
+
});
|
|
601
|
+
router.post('/api/configured-servers/mcpTemplates/:name/lifecycle', async (req, res) => {
|
|
602
|
+
await handleConfiguredServerLifecycleApply(req, res, options);
|
|
603
|
+
});
|
|
604
|
+
router.delete('/api/configured-servers/:source/:name', async (req, res) => {
|
|
605
|
+
const source = configuredServerSourceSchema.safeParse(req.params.source);
|
|
606
|
+
if (!source.success)
|
|
607
|
+
return void res.status(400).json({ error: 'configured_server_source_invalid' });
|
|
608
|
+
await handleConfiguredServerDelete(req, res, options, source.data);
|
|
609
|
+
});
|
|
565
610
|
router.post('/api/configured-servers/mcpServers/:name/enable', async (req, res) => {
|
|
566
611
|
await handleConfiguredServerMutation(req, res, options, 'enableConfiguredServer', 'mcpServers');
|
|
567
612
|
});
|
|
@@ -1037,7 +1082,7 @@ async function handleConfiguredServerDetail(req, res, options, targetSource) {
|
|
|
1037
1082
|
const result = await options.configuredServerService.getConfiguredServerDetail({
|
|
1038
1083
|
context: buildAdminOperationContext(req, options, {
|
|
1039
1084
|
type: 'configured_server',
|
|
1040
|
-
id: `${targetSource ?? 'mcpServers'}
|
|
1085
|
+
id: `${targetSource ?? 'mcpServers'}/${targetName}`,
|
|
1041
1086
|
}),
|
|
1042
1087
|
targetName,
|
|
1043
1088
|
...(targetSource ? { targetSource } : {}),
|
|
@@ -1062,7 +1107,7 @@ async function handleConfiguredServerDetail(req, res, options, targetSource) {
|
|
|
1062
1107
|
error: error.code,
|
|
1063
1108
|
code: error.code,
|
|
1064
1109
|
message: 'Configured server target was not found',
|
|
1065
|
-
target: { type: 'configured_server', id: error.targetName },
|
|
1110
|
+
target: { type: 'configured_server', id: `${targetSource ?? 'mcpServers'}/${error.targetName}` },
|
|
1066
1111
|
});
|
|
1067
1112
|
return;
|
|
1068
1113
|
}
|
|
@@ -1084,7 +1129,7 @@ async function handleConfiguredToolInventoryRefresh(req, res, options, targetSou
|
|
|
1084
1129
|
const result = await options.configuredServerService.refreshConfiguredToolInventory({
|
|
1085
1130
|
context: buildAdminOperationContext(req, options, {
|
|
1086
1131
|
type: 'configured_server',
|
|
1087
|
-
id: `${targetSource}
|
|
1132
|
+
id: `${targetSource}/${targetName}`,
|
|
1088
1133
|
}),
|
|
1089
1134
|
targetName,
|
|
1090
1135
|
targetSource,
|
|
@@ -1107,7 +1152,7 @@ async function handleConfiguredToolInventoryRefresh(req, res, options, targetSou
|
|
|
1107
1152
|
error: error.code,
|
|
1108
1153
|
code: error.code,
|
|
1109
1154
|
message: 'Configured server target was not found',
|
|
1110
|
-
target: { type: 'configured_server', id: `${targetSource}
|
|
1155
|
+
target: { type: 'configured_server', id: `${targetSource}/${targetName}` },
|
|
1111
1156
|
});
|
|
1112
1157
|
return;
|
|
1113
1158
|
}
|
|
@@ -1210,7 +1255,7 @@ async function handleConfiguredServerPreview(req, res, options, targetSource) {
|
|
|
1210
1255
|
const result = await options.configuredServerService.previewConfiguredServerEdit({
|
|
1211
1256
|
context: buildAdminOperationContext(req, options, {
|
|
1212
1257
|
type: 'configured_server',
|
|
1213
|
-
id: `${targetSource ?? 'mcpServers'}
|
|
1258
|
+
id: `${targetSource ?? 'mcpServers'}/${targetName}`,
|
|
1214
1259
|
}),
|
|
1215
1260
|
targetName,
|
|
1216
1261
|
...(targetSource ? { targetSource } : {}),
|
|
@@ -1235,7 +1280,7 @@ async function handleConfiguredServerPreview(req, res, options, targetSource) {
|
|
|
1235
1280
|
error: error.code,
|
|
1236
1281
|
code: error.code,
|
|
1237
1282
|
message: 'Configured server target was not found',
|
|
1238
|
-
target: { type: 'configured_server', id: error.targetName },
|
|
1283
|
+
target: { type: 'configured_server', id: `${targetSource ?? 'mcpServers'}/${error.targetName}` },
|
|
1239
1284
|
});
|
|
1240
1285
|
return;
|
|
1241
1286
|
}
|
|
@@ -1264,7 +1309,7 @@ async function handleConfiguredServerApply(req, res, options, targetSource) {
|
|
|
1264
1309
|
const result = await options.configuredServerService.applyConfiguredServerEdit({
|
|
1265
1310
|
context: buildAdminOperationContext(req, options, {
|
|
1266
1311
|
type: 'configured_server',
|
|
1267
|
-
id: `${targetSource ?? 'mcpServers'}
|
|
1312
|
+
id: `${targetSource ?? 'mcpServers'}/${targetName}`,
|
|
1268
1313
|
}),
|
|
1269
1314
|
targetName,
|
|
1270
1315
|
...(targetSource ? { targetSource } : {}),
|
|
@@ -1290,6 +1335,180 @@ async function handleConfiguredServerApply(req, res, options, targetSource) {
|
|
|
1290
1335
|
throw error;
|
|
1291
1336
|
}
|
|
1292
1337
|
}
|
|
1338
|
+
async function handleConfiguredServerDeletePreview(req, res, options, targetSource) {
|
|
1339
|
+
if (!options.configuredServerService?.previewConfiguredServerDelete) {
|
|
1340
|
+
res.status(404).json({ error: 'admin_configured_server_delete_unavailable' });
|
|
1341
|
+
return;
|
|
1342
|
+
}
|
|
1343
|
+
const targetName = req.params.name;
|
|
1344
|
+
try {
|
|
1345
|
+
const result = await options.configuredServerService.previewConfiguredServerDelete({
|
|
1346
|
+
context: buildAdminOperationContext(req, options, {
|
|
1347
|
+
type: 'configured_server',
|
|
1348
|
+
id: `${targetSource}/${targetName}`,
|
|
1349
|
+
}),
|
|
1350
|
+
targetName,
|
|
1351
|
+
targetSource,
|
|
1352
|
+
});
|
|
1353
|
+
if (!result.ok) {
|
|
1354
|
+
if (result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
|
|
1355
|
+
sendConfiguredServerApplyError(res, result.error);
|
|
1356
|
+
return;
|
|
1357
|
+
}
|
|
1358
|
+
sendAdminOperationResult(res, result);
|
|
1359
|
+
return;
|
|
1360
|
+
}
|
|
1361
|
+
res.status(200).json({ ok: true, operationId: result.operationId, preview: result.result });
|
|
1362
|
+
}
|
|
1363
|
+
catch (error) {
|
|
1364
|
+
if (error instanceof AdminConfiguredServerNotFoundError) {
|
|
1365
|
+
sendConfiguredServerApplyError(res, error.code);
|
|
1366
|
+
return;
|
|
1367
|
+
}
|
|
1368
|
+
if (error instanceof AdminConfiguredServerApplyError) {
|
|
1369
|
+
sendConfiguredServerApplyError(res, error.code);
|
|
1370
|
+
return;
|
|
1371
|
+
}
|
|
1372
|
+
throw error;
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
async function handleConfiguredServerDelete(req, res, options, targetSource) {
|
|
1376
|
+
if (!options.configuredServerService?.deleteConfiguredServer) {
|
|
1377
|
+
res.status(404).json({ error: 'admin_configured_server_delete_unavailable' });
|
|
1378
|
+
return;
|
|
1379
|
+
}
|
|
1380
|
+
if (!req.header('Idempotency-Key')?.trim()) {
|
|
1381
|
+
res.status(400).json({ ok: false, error: 'idempotency_key_required', code: 'idempotency_key_required' });
|
|
1382
|
+
return;
|
|
1383
|
+
}
|
|
1384
|
+
if (isMutationLocked(options)) {
|
|
1385
|
+
sendAdminOperationResult(res, {
|
|
1386
|
+
ok: false,
|
|
1387
|
+
status: 'runtime_scope_locked',
|
|
1388
|
+
code: 'runtime_scope_locked',
|
|
1389
|
+
retryable: true,
|
|
1390
|
+
operationName: 'deleteConfiguredServer',
|
|
1391
|
+
reason: 'writer_lock_unavailable',
|
|
1392
|
+
});
|
|
1393
|
+
return;
|
|
1394
|
+
}
|
|
1395
|
+
const targetName = req.params.name;
|
|
1396
|
+
const parsedBody = configuredServerDeleteApplySchema.safeParse(req.body);
|
|
1397
|
+
if (!parsedBody.success) {
|
|
1398
|
+
res.status(400).json({
|
|
1399
|
+
ok: false,
|
|
1400
|
+
error: 'configured_server_delete_request_invalid',
|
|
1401
|
+
code: 'configured_server_delete_request_invalid',
|
|
1402
|
+
message: 'Delete requires a current preview fingerprint and exact source-qualified confirmation facts.',
|
|
1403
|
+
});
|
|
1404
|
+
return;
|
|
1405
|
+
}
|
|
1406
|
+
try {
|
|
1407
|
+
const result = await options.configuredServerService.deleteConfiguredServer({
|
|
1408
|
+
context: buildAdminOperationContext(req, options, {
|
|
1409
|
+
type: 'configured_server',
|
|
1410
|
+
id: `${targetSource}/${targetName}`,
|
|
1411
|
+
}),
|
|
1412
|
+
targetName,
|
|
1413
|
+
targetSource,
|
|
1414
|
+
previewFingerprint: parsedBody.data.previewFingerprint,
|
|
1415
|
+
});
|
|
1416
|
+
if (!result.ok && result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
|
|
1417
|
+
sendConfiguredServerApplyError(res, result.error);
|
|
1418
|
+
return;
|
|
1419
|
+
}
|
|
1420
|
+
sendAdminOperationResult(res, result);
|
|
1421
|
+
}
|
|
1422
|
+
catch (error) {
|
|
1423
|
+
if (error instanceof AdminConfiguredServerNotFoundError || error instanceof AdminConfiguredServerApplyError) {
|
|
1424
|
+
sendConfiguredServerApplyError(res, error.code);
|
|
1425
|
+
return;
|
|
1426
|
+
}
|
|
1427
|
+
throw error;
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
async function handleConfiguredServerLifecyclePreview(req, res, options) {
|
|
1431
|
+
if (!options.configuredServerService?.previewConfiguredServerLifecycle) {
|
|
1432
|
+
res.status(404).json({ error: 'admin_configured_server_lifecycle_unavailable' });
|
|
1433
|
+
return;
|
|
1434
|
+
}
|
|
1435
|
+
const body = configuredServerLifecyclePreviewSchema.safeParse(req.body);
|
|
1436
|
+
if (!body.success) {
|
|
1437
|
+
res.status(400).json({ ok: false, error: 'configured_server_lifecycle_request_invalid' });
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
try {
|
|
1441
|
+
const result = await options.configuredServerService.previewConfiguredServerLifecycle({
|
|
1442
|
+
context: buildAdminOperationContext(req, options, {
|
|
1443
|
+
type: 'configured_server',
|
|
1444
|
+
id: `mcpTemplates/${req.params.name}`,
|
|
1445
|
+
}),
|
|
1446
|
+
targetName: req.params.name,
|
|
1447
|
+
targetSource: 'mcpTemplates',
|
|
1448
|
+
enabled: body.data.enabled,
|
|
1449
|
+
});
|
|
1450
|
+
if (!result.ok)
|
|
1451
|
+
return void sendAdminOperationResult(res, result);
|
|
1452
|
+
res.status(200).json({ ok: true, operationId: result.operationId, preview: result.result });
|
|
1453
|
+
}
|
|
1454
|
+
catch (error) {
|
|
1455
|
+
if (error instanceof AdminConfiguredServerNotFoundError || error instanceof AdminConfiguredServerApplyError) {
|
|
1456
|
+
sendConfiguredServerApplyError(res, error.code);
|
|
1457
|
+
return;
|
|
1458
|
+
}
|
|
1459
|
+
throw error;
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
async function handleConfiguredServerLifecycleApply(req, res, options) {
|
|
1463
|
+
if (!options.configuredServerService?.applyConfiguredServerLifecycle) {
|
|
1464
|
+
res.status(404).json({ error: 'admin_configured_server_lifecycle_unavailable' });
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
if (!req.header('Idempotency-Key')?.trim()) {
|
|
1468
|
+
res.status(400).json({ ok: false, error: 'idempotency_key_required', code: 'idempotency_key_required' });
|
|
1469
|
+
return;
|
|
1470
|
+
}
|
|
1471
|
+
if (isMutationLocked(options)) {
|
|
1472
|
+
sendAdminOperationResult(res, {
|
|
1473
|
+
ok: false,
|
|
1474
|
+
status: 'runtime_scope_locked',
|
|
1475
|
+
code: 'runtime_scope_locked',
|
|
1476
|
+
retryable: true,
|
|
1477
|
+
operationName: 'applyConfiguredServerLifecycle',
|
|
1478
|
+
reason: 'writer_lock_unavailable',
|
|
1479
|
+
});
|
|
1480
|
+
return;
|
|
1481
|
+
}
|
|
1482
|
+
const body = configuredServerLifecycleApplySchema.safeParse(req.body);
|
|
1483
|
+
if (!body.success) {
|
|
1484
|
+
res.status(400).json({ ok: false, error: 'configured_server_lifecycle_request_invalid' });
|
|
1485
|
+
return;
|
|
1486
|
+
}
|
|
1487
|
+
try {
|
|
1488
|
+
const result = await options.configuredServerService.applyConfiguredServerLifecycle({
|
|
1489
|
+
context: buildAdminOperationContext(req, options, {
|
|
1490
|
+
type: 'configured_server',
|
|
1491
|
+
id: `mcpTemplates/${req.params.name}`,
|
|
1492
|
+
}),
|
|
1493
|
+
targetName: req.params.name,
|
|
1494
|
+
targetSource: 'mcpTemplates',
|
|
1495
|
+
enabled: body.data.enabled,
|
|
1496
|
+
previewFingerprint: body.data.previewFingerprint,
|
|
1497
|
+
});
|
|
1498
|
+
if (!result.ok && result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
|
|
1499
|
+
sendConfiguredServerApplyError(res, result.error);
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
sendAdminOperationResult(res, result);
|
|
1503
|
+
}
|
|
1504
|
+
catch (error) {
|
|
1505
|
+
if (error instanceof AdminConfiguredServerNotFoundError || error instanceof AdminConfiguredServerApplyError) {
|
|
1506
|
+
sendConfiguredServerApplyError(res, error.code);
|
|
1507
|
+
return;
|
|
1508
|
+
}
|
|
1509
|
+
throw error;
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1293
1512
|
function isConfiguredServerApplyErrorCode(value) {
|
|
1294
1513
|
return value.startsWith('configured_server_');
|
|
1295
1514
|
}
|
|
@@ -1320,6 +1539,12 @@ function configuredServerApplyErrorMessage(code) {
|
|
|
1320
1539
|
return 'The configured server could not be persisted. Inspect the Runtime Scope configuration and retry with a new idempotency key.';
|
|
1321
1540
|
case 'configured_server_not_found':
|
|
1322
1541
|
return 'Configured server target was not found.';
|
|
1542
|
+
case 'configured_server_already_removed':
|
|
1543
|
+
return 'This source-qualified configured server target was already removed. Refresh the server inventory.';
|
|
1544
|
+
case 'configured_server_source_changed':
|
|
1545
|
+
return 'The requested source no longer owns this configured server target. Refresh the inventory; the same name in the other source was not changed.';
|
|
1546
|
+
case 'configured_server_delete_failed':
|
|
1547
|
+
return 'The configured server target could not be deleted. The recovery backup and original definition were preserved.';
|
|
1323
1548
|
default:
|
|
1324
1549
|
return 'The configured server edit could not be applied.';
|
|
1325
1550
|
}
|
|
@@ -1343,7 +1568,7 @@ async function handleConfiguredServerMutation(req, res, options, operationName,
|
|
|
1343
1568
|
const targetName = req.params.name;
|
|
1344
1569
|
const context = buildAdminOperationContext(req, options, {
|
|
1345
1570
|
type: 'configured_server',
|
|
1346
|
-
id: `${targetSource ?? 'mcpServers'}
|
|
1571
|
+
id: `${targetSource ?? 'mcpServers'}/${targetName}`,
|
|
1347
1572
|
});
|
|
1348
1573
|
const input = { context, targetName, ...(targetSource ? { targetSource } : {}) };
|
|
1349
1574
|
const result = operationName === 'enableConfiguredServer'
|
|
@@ -1382,17 +1607,19 @@ export class FailedLoginLimiter {
|
|
|
1382
1607
|
now;
|
|
1383
1608
|
maxActiveKeys;
|
|
1384
1609
|
windowMs;
|
|
1610
|
+
maxFailedAttempts;
|
|
1385
1611
|
attempts = new Map();
|
|
1386
|
-
constructor(now = Date.now, maxActiveKeys = FAILED_LOGIN_MAX_ACTIVE_KEYS, windowMs = FAILED_LOGIN_WINDOW_MS) {
|
|
1612
|
+
constructor(now = Date.now, maxActiveKeys = FAILED_LOGIN_MAX_ACTIVE_KEYS, windowMs = FAILED_LOGIN_WINDOW_MS, maxFailedAttempts = FAILED_LOGIN_LIMIT) {
|
|
1387
1613
|
this.now = now;
|
|
1388
1614
|
this.maxActiveKeys = maxActiveKeys;
|
|
1389
1615
|
this.windowMs = windowMs;
|
|
1616
|
+
this.maxFailedAttempts = maxFailedAttempts;
|
|
1390
1617
|
}
|
|
1391
1618
|
isLimited(username, origin) {
|
|
1392
1619
|
this.pruneExpired();
|
|
1393
1620
|
const attempt = this.getAttempt(username, origin);
|
|
1394
1621
|
if (attempt) {
|
|
1395
|
-
return attempt.count >=
|
|
1622
|
+
return attempt.count >= this.maxFailedAttempts;
|
|
1396
1623
|
}
|
|
1397
1624
|
return this.attempts.size >= this.maxActiveKeys;
|
|
1398
1625
|
}
|
|
@@ -1437,7 +1664,7 @@ function isUnsafeMethod(method) {
|
|
|
1437
1664
|
return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS';
|
|
1438
1665
|
}
|
|
1439
1666
|
function getLoginSource(req) {
|
|
1440
|
-
return req.ip ??
|
|
1667
|
+
return req.ip ?? 'unknown';
|
|
1441
1668
|
}
|
|
1442
1669
|
function setAdminSessionCookie(res, externalUrl, sessionToken, expiresAt) {
|
|
1443
1670
|
res.cookie(ADMIN_SESSION_COOKIE_NAME, sessionToken, {
|
|
@@ -1830,6 +2057,25 @@ function configuredServerRequestFingerprint(operationName, targetName, body) {
|
|
|
1830
2057
|
draftDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-create-draft', stableJsonStringify(getBodyValue(body, 'draft') ?? {})),
|
|
1831
2058
|
}
|
|
1832
2059
|
: {}),
|
|
2060
|
+
...(operationName === 'deleteConfiguredServer'
|
|
2061
|
+
? {
|
|
2062
|
+
previewFingerprint,
|
|
2063
|
+
deleteDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-delete-body', stableJsonStringify({
|
|
2064
|
+
previewFingerprint,
|
|
2065
|
+
confirmationFacts: getBodyRecord(body, 'confirmationFacts') ?? {},
|
|
2066
|
+
})),
|
|
2067
|
+
}
|
|
2068
|
+
: {}),
|
|
2069
|
+
...(operationName === 'applyConfiguredServerLifecycle'
|
|
2070
|
+
? {
|
|
2071
|
+
previewFingerprint,
|
|
2072
|
+
lifecycleDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-lifecycle-body', stableJsonStringify({
|
|
2073
|
+
enabled: getBodyValue(body, 'enabled') === true,
|
|
2074
|
+
previewFingerprint,
|
|
2075
|
+
confirmationFacts: getBodyRecord(body, 'confirmationFacts') ?? {},
|
|
2076
|
+
})),
|
|
2077
|
+
}
|
|
2078
|
+
: {}),
|
|
1833
2079
|
...(operationName === 'restartBackend'
|
|
1834
2080
|
? {
|
|
1835
2081
|
restartSelection: {
|
|
@@ -1847,6 +2093,12 @@ function configuredServerRequestFingerprint(operationName, targetName, body) {
|
|
|
1847
2093
|
if (operationName === 'applyConfiguredServerCreate') {
|
|
1848
2094
|
return `configured_server_create_${keyedRequestFingerprint(previewFingerprint, 'configured-server-create', normalized)}`;
|
|
1849
2095
|
}
|
|
2096
|
+
if (operationName === 'deleteConfiguredServer') {
|
|
2097
|
+
return `configured_server_delete_${keyedRequestFingerprint(previewFingerprint, 'configured-server-delete', normalized)}`;
|
|
2098
|
+
}
|
|
2099
|
+
if (operationName === 'applyConfiguredServerLifecycle') {
|
|
2100
|
+
return `configured_server_lifecycle_${keyedRequestFingerprint(previewFingerprint, 'configured-server-lifecycle', normalized)}`;
|
|
2101
|
+
}
|
|
1850
2102
|
return operationName === 'applyConfiguredServerEdit'
|
|
1851
2103
|
? `configured_server_apply_${keyedRequestFingerprint(previewFingerprint, 'configured-server-apply', normalized)}`
|
|
1852
2104
|
: normalized;
|
|
@@ -1978,9 +2230,21 @@ function operationNameForRequest(req) {
|
|
|
1978
2230
|
if (req.method === 'GET' && req.path === '/api/configured-servers/create-contract') {
|
|
1979
2231
|
return 'getConfiguredServerCreateContract';
|
|
1980
2232
|
}
|
|
2233
|
+
if (req.path.endsWith('/lifecycle-preview')) {
|
|
2234
|
+
return 'previewConfiguredServerLifecycle';
|
|
2235
|
+
}
|
|
2236
|
+
if (req.path.endsWith('/lifecycle')) {
|
|
2237
|
+
return 'applyConfiguredServerLifecycle';
|
|
2238
|
+
}
|
|
1981
2239
|
if (req.path.endsWith('/preview')) {
|
|
1982
2240
|
return 'previewConfiguredServerEdit';
|
|
1983
2241
|
}
|
|
2242
|
+
if (req.path.endsWith('/delete-preview')) {
|
|
2243
|
+
return 'previewConfiguredServerDelete';
|
|
2244
|
+
}
|
|
2245
|
+
if (req.method === 'DELETE' && req.path.startsWith('/api/configured-servers/')) {
|
|
2246
|
+
return 'deleteConfiguredServer';
|
|
2247
|
+
}
|
|
1984
2248
|
if (req.path.endsWith('/apply')) {
|
|
1985
2249
|
return 'applyConfiguredServerEdit';
|
|
1986
2250
|
}
|