@1mcp/agent 0.35.0-beta.1 → 0.35.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/build/admin/assets/{admin-console-CX5GzncA.css → admin-console-C5_zD_qW.css} +1 -1
- package/build/admin/assets/{admin-console-CkZ5lBKg.js → admin-console-CbHHoqLr.js} +6 -6
- package/build/admin/index.html +2 -2
- package/build/application/services/healthService.d.ts +32 -0
- package/build/application/services/healthService.d.ts.map +1 -1
- package/build/application/services/healthService.js +49 -0
- package/build/application/services/healthService.js.map +1 -1
- package/build/commands/mcp/index.d.ts.map +1 -1
- package/build/commands/mcp/index.js +10 -0
- package/build/commands/mcp/index.js.map +1 -1
- package/build/commands/mcp/restart.d.ts +69 -0
- package/build/commands/mcp/restart.d.ts.map +1 -0
- package/build/commands/mcp/restart.js +259 -0
- package/build/commands/mcp/restart.js.map +1 -0
- package/build/commands/mcp/status.d.ts +24 -1
- package/build/commands/mcp/status.d.ts.map +1 -1
- package/build/commands/mcp/status.js +158 -14
- package/build/commands/mcp/status.js.map +1 -1
- package/build/commands/serve/index.d.ts +8 -0
- package/build/commands/serve/index.d.ts.map +1 -1
- package/build/commands/serve/index.js +12 -0
- package/build/commands/serve/index.js.map +1 -1
- package/build/commands/serve/serve.d.ts +13 -0
- package/build/commands/serve/serve.d.ts.map +1 -1
- package/build/commands/serve/serve.js +111 -57
- package/build/commands/serve/serve.js.map +1 -1
- package/build/commands/serve/serveBackground.d.ts +48 -26
- package/build/commands/serve/serveBackground.d.ts.map +1 -1
- package/build/commands/serve/serveBackground.js +230 -61
- package/build/commands/serve/serveBackground.js.map +1 -1
- package/build/commands/serve/serveRestart.d.ts +1 -1
- package/build/commands/serve/serveRestart.js +1 -1
- package/build/commands/serve/serveStatus.d.ts +20 -10
- package/build/commands/serve/serveStatus.d.ts.map +1 -1
- package/build/commands/serve/serveStatus.js +174 -13
- package/build/commands/serve/serveStatus.js.map +1 -1
- package/build/commands/serve/serveStop.d.ts +13 -4
- package/build/commands/serve/serveStop.d.ts.map +1 -1
- package/build/commands/serve/serveStop.js +212 -23
- package/build/commands/serve/serveStop.js.map +1 -1
- package/build/config/configManager.d.ts +2 -0
- package/build/config/configManager.d.ts.map +1 -1
- package/build/config/configManager.js +19 -8
- package/build/config/configManager.js.map +1 -1
- package/build/config/mcpConfigMerge.d.ts.map +1 -1
- package/build/config/mcpConfigMerge.js +13 -2
- package/build/config/mcpConfigMerge.js.map +1 -1
- package/build/constants/mcp.d.ts +1 -1
- package/build/constants/mcp.js +1 -1
- package/build/core/client/clientManager.d.ts +24 -1
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +268 -2
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/client/connectionHandler.d.ts.map +1 -1
- package/build/core/client/connectionHandler.js +18 -1
- package/build/core/client/connectionHandler.js.map +1 -1
- package/build/core/configChangeHandler.d.ts +1 -0
- package/build/core/configChangeHandler.d.ts.map +1 -1
- package/build/core/configChangeHandler.js +14 -0
- package/build/core/configChangeHandler.js.map +1 -1
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -1
- package/build/core/loading/mcpLoadingManager.js +16 -4
- package/build/core/loading/mcpLoadingManager.js.map +1 -1
- package/build/core/server/backendStdioSupervisor.d.ts +73 -0
- package/build/core/server/backendStdioSupervisor.d.ts.map +1 -0
- package/build/core/server/backendStdioSupervisor.js +191 -0
- package/build/core/server/backendStdioSupervisor.js.map +1 -0
- package/build/core/server/backgroundLaunchConfig.d.ts +15 -0
- package/build/core/server/backgroundLaunchConfig.d.ts.map +1 -0
- package/build/core/server/backgroundLaunchConfig.js +46 -0
- package/build/core/server/backgroundLaunchConfig.js.map +1 -0
- package/build/core/server/backgroundRuntimeSupervisor.d.ts +44 -0
- package/build/core/server/backgroundRuntimeSupervisor.d.ts.map +1 -0
- package/build/core/server/backgroundRuntimeSupervisor.js +252 -0
- package/build/core/server/backgroundRuntimeSupervisor.js.map +1 -0
- package/build/core/server/backgroundRuntimeSupervisorState.d.ts +30 -0
- package/build/core/server/backgroundRuntimeSupervisorState.d.ts.map +1 -0
- package/build/core/server/backgroundRuntimeSupervisorState.js +81 -0
- package/build/core/server/backgroundRuntimeSupervisorState.js.map +1 -0
- package/build/core/server/clientInstanceFactory.d.ts.map +1 -1
- package/build/core/server/clientInstanceFactory.js +1 -0
- package/build/core/server/clientInstanceFactory.js.map +1 -1
- package/build/core/server/clientInstancePool.d.ts +17 -5
- package/build/core/server/clientInstancePool.d.ts.map +1 -1
- package/build/core/server/clientInstancePool.js +198 -33
- package/build/core/server/clientInstancePool.js.map +1 -1
- package/build/core/server/clientInstancePoolTypes.d.ts +7 -1
- package/build/core/server/clientInstancePoolTypes.d.ts.map +1 -1
- package/build/core/server/clientInstancePoolTypes.js.map +1 -1
- package/build/core/server/runtimeScopeOwnership.d.ts +61 -0
- package/build/core/server/runtimeScopeOwnership.d.ts.map +1 -0
- package/build/core/server/runtimeScopeOwnership.js +544 -0
- package/build/core/server/runtimeScopeOwnership.js.map +1 -0
- package/build/core/server/serverManager.d.ts +2 -0
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +30 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/core/server/templateIdentity.d.ts +10 -0
- package/build/core/server/templateIdentity.d.ts.map +1 -1
- package/build/core/server/templateIdentity.js +33 -0
- package/build/core/server/templateIdentity.js.map +1 -1
- package/build/core/server/templateServerCleanup.d.ts.map +1 -1
- package/build/core/server/templateServerCleanup.js +7 -1
- package/build/core/server/templateServerCleanup.js.map +1 -1
- package/build/core/server/templateServerManager.d.ts +13 -0
- package/build/core/server/templateServerManager.d.ts.map +1 -1
- package/build/core/server/templateServerManager.js +129 -4
- package/build/core/server/templateServerManager.js.map +1 -1
- package/build/core/tools/handlers/serverManagementHandler.d.ts +111 -5
- package/build/core/tools/handlers/serverManagementHandler.d.ts.map +1 -1
- package/build/core/tools/handlers/serverManagementHandler.js +103 -45
- package/build/core/tools/handlers/serverManagementHandler.js.map +1 -1
- package/build/core/tools/internal/adapters/management/managementAdapter.d.ts +2 -2
- package/build/core/tools/internal/adapters/management/managementAdapter.d.ts.map +1 -1
- package/build/core/tools/internal/adapters/management/managementAdapter.js +45 -26
- package/build/core/tools/internal/adapters/management/managementAdapter.js.map +1 -1
- package/build/core/tools/internal/adapters/management/types.d.ts +21 -2
- package/build/core/tools/internal/adapters/management/types.d.ts.map +1 -1
- package/build/core/tools/internal/managementHandlers.d.ts.map +1 -1
- package/build/core/tools/internal/managementHandlers.js +73 -22
- package/build/core/tools/internal/managementHandlers.js.map +1 -1
- package/build/core/tools/internal/schemas/discovery.d.ts +2 -2
- package/build/core/tools/internal/schemas/edit.js +1 -1
- package/build/core/tools/internal/schemas/edit.js.map +1 -1
- package/build/core/tools/internal/schemas/index.d.ts +77 -6
- package/build/core/tools/internal/schemas/index.d.ts.map +1 -1
- package/build/core/tools/internal/schemas/management.d.ts +75 -4
- package/build/core/tools/internal/schemas/management.d.ts.map +1 -1
- package/build/core/tools/internal/schemas/management.js +69 -2
- package/build/core/tools/internal/schemas/management.js.map +1 -1
- package/build/core/types/client.d.ts +9 -2
- package/build/core/types/client.d.ts.map +1 -1
- package/build/core/types/client.js +4 -0
- package/build/core/types/client.js.map +1 -1
- package/build/core/types/transport.d.ts +25 -1
- package/build/core/types/transport.d.ts.map +1 -1
- package/build/core/types/transport.js +21 -3
- package/build/core/types/transport.js.map +1 -1
- package/build/domains/admin/adminBackendRestartService.d.ts +41 -0
- package/build/domains/admin/adminBackendRestartService.d.ts.map +1 -0
- package/build/domains/admin/adminBackendRestartService.js +22 -0
- package/build/domains/admin/adminBackendRestartService.js.map +1 -0
- package/build/domains/admin/adminDomain.d.ts +7 -0
- package/build/domains/admin/adminDomain.d.ts.map +1 -1
- package/build/domains/admin/adminDomain.js +13 -0
- package/build/domains/admin/adminDomain.js.map +1 -1
- package/build/domains/admin/adminOAuthService.d.ts +26 -0
- package/build/domains/admin/adminOAuthService.d.ts.map +1 -0
- package/build/domains/admin/adminOAuthService.js +71 -0
- package/build/domains/admin/adminOAuthService.js.map +1 -0
- 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 +39 -14
- package/build/domains/admin/adminOperationService.js.map +1 -1
- package/build/domains/admin/runtimeServerManagerBackendRestartService.d.ts +20 -0
- package/build/domains/admin/runtimeServerManagerBackendRestartService.d.ts.map +1 -0
- package/build/domains/admin/runtimeServerManagerBackendRestartService.js +78 -0
- package/build/domains/admin/runtimeServerManagerBackendRestartService.js.map +1 -0
- package/build/server.d.ts.map +1 -1
- package/build/server.js +18 -2
- package/build/server.js.map +1 -1
- package/build/transport/http/routes/adminRoutes.d.ts +4 -0
- package/build/transport/http/routes/adminRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/adminRoutes.js +280 -22
- package/build/transport/http/routes/adminRoutes.js.map +1 -1
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/healthRoutes.js +70 -2
- package/build/transport/http/routes/healthRoutes.js.map +1 -1
- package/build/transport/http/routes/oauthRoutes.d.ts +3 -2
- package/build/transport/http/routes/oauthRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/oauthRoutes.js +10 -8
- package/build/transport/http/routes/oauthRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +13 -4
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +27 -15
- package/build/transport/transportFactory.js.map +1 -1
- package/build/transport/transportFactory.testSetup.js +2 -0
- package/build/transport/transportFactory.testSetup.js.map +1 -1
- package/build/utils/core/errorTypes.d.ts +3 -0
- package/build/utils/core/errorTypes.d.ts.map +1 -1
- package/build/utils/core/errorTypes.js +7 -0
- package/build/utils/core/errorTypes.js.map +1 -1
- package/package.json +1 -1
package/build/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wDAAwD,CAAC;AACnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAoBnE;;;GAGG;AACH,KAAK,UAAU,WAAW,CAAC,cAAuB,EAAE,OAAqB;IACvE,IAAI,CAAC;QACH,sDAAsD;QACtD,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAE3E,MAAM,aAAa,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,mBAAmB,CAAC,UAAU,EAAE,CAAC;QAEvC,oEAAoE;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,oBAAoB,GAAG,uBAAuB,EAAE,CAAC;YACvD,OAAO,GAAG,oBAAoB,CAAC,UAAU,EAAE,CAAC;QAC9C,CAAC;QAED,gFAAgF;QAChF,iFAAiF;QACjF,6FAA6F;QAC7F,MAAM,SAAS,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAC;QAErD,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACrD,MAAM,mBAAmB,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;QAEpE,sCAAsC;QACtC,8DAA8D;QAC9D,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,MAAM,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAExC,yFAAyF;QACzF,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CACT,WAAW,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,kEAAkE,CAC5G,CAAC;QAEF,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { BackendOAuthDashboardResult } from '../../../auth/oauthAuthorizationFlow.js';
|
|
2
2
|
import { RuntimeIdentity } from '../../../core/runtime/runtimeIdentityService.js';
|
|
3
|
+
import type { AdminBackendRestartOperations } from '../../../domains/admin/adminBackendRestartService.js';
|
|
3
4
|
import { type AdminConfiguredServerOperations } from '../../../domains/admin/adminConfiguredServerService.js';
|
|
4
5
|
import { AdminIdentityService } from '../../../domains/admin/adminIdentityService.js';
|
|
6
|
+
import type { AdminOAuthOperations } from '../../../domains/admin/adminOAuthService.js';
|
|
5
7
|
import { type AdminPresetOperations } from '../../../domains/admin/adminPresetService.js';
|
|
6
8
|
import type { AdminMutationAvailability } from '../../../domains/admin/runtimeScopeAdminLock.js';
|
|
7
9
|
import { Router } from 'express';
|
|
@@ -9,7 +11,9 @@ interface AdminRoutesOptions {
|
|
|
9
11
|
adminEnabled: boolean;
|
|
10
12
|
adminService: AdminIdentityService;
|
|
11
13
|
configuredServerService?: AdminConfiguredServerOperations;
|
|
14
|
+
backendRestartService?: AdminBackendRestartOperations;
|
|
12
15
|
presetService?: AdminPresetOperations;
|
|
16
|
+
oauthService?: AdminOAuthOperations;
|
|
13
17
|
adminMutationAvailability?: AdminMutationAvailability;
|
|
14
18
|
getRuntimeIdentity: () => RuntimeIdentity;
|
|
15
19
|
getOAuthDashboard?: () => BackendOAuthDashboardResult;
|
|
@@ -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;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,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;AACvF,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,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;AAI7F,OAAgB,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AA6D7D,UAAU,kBAAkB;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,oBAAoB,CAAC;IACnC,uBAAuB,CAAC,EAAE,+BAA+B,CAAC;IAC1D,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;CAChC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CA4a5E;AAUD,wBAAgB,mCAAmC,IAAI,MAAM,CAE5D;AAqcD,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgE;gBAGtE,GAAG,GAAE,MAAM,MAAiB,EAC5B,aAAa,SAA+B,EAC5C,QAAQ,SAAyB;IAGpD,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"}
|
|
@@ -1,17 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHmac } from 'node:crypto';
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { parseTemplateConnectionKey } from '../../../core/server/templateIdentity.js';
|
|
5
6
|
import { AdminConfiguredServerApplyError, AdminConfiguredServerNotFoundError, } from '../../../domains/admin/adminConfiguredServerService.js';
|
|
6
7
|
import { ADMIN_SESSION_COOKIE_NAME, AdminIdentityError, } from '../../../domains/admin/adminIdentityService.js';
|
|
7
8
|
import { AdminPresetConflictError, AdminPresetNotFoundError, } from '../../../domains/admin/adminPresetService.js';
|
|
9
|
+
import { sensitiveOperationLimiter } from '../../../transport/http/middlewares/securityMiddleware.js';
|
|
8
10
|
import { sanitizeErrorMessage } from '../../../utils/validation/sanitization.js';
|
|
9
11
|
import express, { Router } from 'express';
|
|
12
|
+
import rateLimit from 'express-rate-limit';
|
|
10
13
|
import { createRequire } from 'node:module';
|
|
11
14
|
import { z } from 'zod';
|
|
12
15
|
const FAILED_LOGIN_LIMIT = 5;
|
|
13
16
|
const FAILED_LOGIN_WINDOW_MS = 15 * 60 * 1000;
|
|
14
17
|
const FAILED_LOGIN_MAX_ACTIVE_KEYS = 10_000;
|
|
18
|
+
const ADMIN_AUTH_RATE_LIMIT = 30;
|
|
19
|
+
const ADMIN_AUTH_RATE_LIMIT_WINDOW_MS = 15 * 60 * 1000;
|
|
20
|
+
const ADMIN_STATUS_RATE_LIMIT = 120;
|
|
21
|
+
const ADMIN_STATUS_RATE_LIMIT_WINDOW_MS = 60 * 1000;
|
|
15
22
|
const ADMIN_USERNAME_MAX_LENGTH = 256;
|
|
16
23
|
const ADMIN_PASSWORD_MAX_LENGTH = 4096;
|
|
17
24
|
const CLI_ADMIN_PROTOCOL_VERSION = '1';
|
|
@@ -19,16 +26,30 @@ const CLI_ADMIN_RESPONSE_MAX_BYTES = 256 * 1024;
|
|
|
19
26
|
const CLI_ADMIN_RESPONSE_TOO_LARGE_MESSAGE = 'CLI Admin response exceeded the maximum supported size; use a narrower or paginated request.';
|
|
20
27
|
const CLI_SESSION_OPERATIONS = ['admin.login', 'admin.status', 'admin.logout'];
|
|
21
28
|
const ADMIN_API_PROTOCOL_VERSION = '1';
|
|
29
|
+
const TEMPLATE_INSTANCE_ID_DISPLAY_LENGTH = 12;
|
|
22
30
|
const packageMetadata = createRequire(import.meta.url)('../../../../package.json');
|
|
23
|
-
const
|
|
31
|
+
const CLI_CONFIGURED_SERVER_OPERATIONS = ['mcp.enable', 'mcp.disable'];
|
|
32
|
+
const CLI_BACKEND_RESTART_OPERATION = 'mcp.restart';
|
|
24
33
|
const adminLoginBodySchema = z.object({
|
|
25
34
|
username: z.string().trim().min(1).max(ADMIN_USERNAME_MAX_LENGTH),
|
|
26
35
|
password: z.string().min(1).max(ADMIN_PASSWORD_MAX_LENGTH),
|
|
27
36
|
});
|
|
37
|
+
const adminOAuthServiceParamsSchema = z.object({
|
|
38
|
+
serviceId: z.string().trim().min(1).max(256),
|
|
39
|
+
});
|
|
28
40
|
const cliConfiguredServerMutationBodySchema = z.object({
|
|
29
41
|
targetName: z.string().trim().min(1).max(256),
|
|
30
42
|
dryRun: z.boolean().optional(),
|
|
31
43
|
});
|
|
44
|
+
const cliBackendRestartBodySchema = z
|
|
45
|
+
.object({
|
|
46
|
+
targetName: z.string().trim().min(1).max(256),
|
|
47
|
+
instance: z.string().trim().min(1).max(64).optional(),
|
|
48
|
+
allInstances: z.boolean().optional(),
|
|
49
|
+
})
|
|
50
|
+
.refine((value) => !(value.instance !== undefined && value.allInstances === true), {
|
|
51
|
+
message: 'instance and allInstances are mutually exclusive',
|
|
52
|
+
});
|
|
32
53
|
export function createAdminRoutes(options) {
|
|
33
54
|
if (!options.adminEnabled) {
|
|
34
55
|
options.adminService.revokeAllSessions();
|
|
@@ -36,6 +57,18 @@ export function createAdminRoutes(options) {
|
|
|
36
57
|
}
|
|
37
58
|
const router = Router();
|
|
38
59
|
const failedLoginLimiter = new FailedLoginLimiter();
|
|
60
|
+
const authenticationLimiter = rateLimit({
|
|
61
|
+
windowMs: ADMIN_AUTH_RATE_LIMIT_WINDOW_MS,
|
|
62
|
+
max: ADMIN_AUTH_RATE_LIMIT,
|
|
63
|
+
standardHeaders: true,
|
|
64
|
+
legacyHeaders: false,
|
|
65
|
+
});
|
|
66
|
+
const statusLimiter = rateLimit({
|
|
67
|
+
windowMs: ADMIN_STATUS_RATE_LIMIT_WINDOW_MS,
|
|
68
|
+
max: ADMIN_STATUS_RATE_LIMIT,
|
|
69
|
+
standardHeaders: true,
|
|
70
|
+
legacyHeaders: false,
|
|
71
|
+
});
|
|
39
72
|
const adminConsoleAssets = resolveAdminConsoleAssets(options.adminConsoleAssetsDir);
|
|
40
73
|
options.adminService.bootstrapFirstAdminFromEnvironment();
|
|
41
74
|
router.get('/cli/v1/capabilities', (req, res) => {
|
|
@@ -43,9 +76,18 @@ export function createAdminRoutes(options) {
|
|
|
43
76
|
const setupRequired = !options.adminService.hasAdminAccount();
|
|
44
77
|
const mutationAvailability = cliMutationAvailability(options, setupRequired);
|
|
45
78
|
const configuredServerOperationsSupported = Boolean(options.configuredServerService);
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const
|
|
79
|
+
const backendRestartSupported = Boolean(options.backendRestartService);
|
|
80
|
+
const mcpMutationsReady = (configuredServerOperationsSupported || backendRestartSupported) && mutationAvailability.available;
|
|
81
|
+
const mcpOperations = [
|
|
82
|
+
...(configuredServerOperationsSupported ? [...CLI_CONFIGURED_SERVER_OPERATIONS] : []),
|
|
83
|
+
...(backendRestartSupported ? [CLI_BACKEND_RESTART_OPERATION] : []),
|
|
84
|
+
];
|
|
85
|
+
const mcpMutationOperations = mutationAvailability.available
|
|
86
|
+
? [
|
|
87
|
+
...(configuredServerOperationsSupported ? ['enable', 'disable'] : []),
|
|
88
|
+
...(backendRestartSupported ? ['restart'] : []),
|
|
89
|
+
]
|
|
90
|
+
: [];
|
|
49
91
|
const mcpReadinessStatus = cliMcpReadinessStatus(mutationAvailability);
|
|
50
92
|
sendCliSuccess(req, res, {
|
|
51
93
|
runtime: toCliRuntimeIdentity(identity),
|
|
@@ -67,11 +109,12 @@ export function createAdminRoutes(options) {
|
|
|
67
109
|
adminSessions: true,
|
|
68
110
|
bearerSessionAuth: true,
|
|
69
111
|
csrfTokens: true,
|
|
70
|
-
mcpEnableDisable:
|
|
112
|
+
mcpEnableDisable: configuredServerOperationsSupported && mutationAvailability.available,
|
|
113
|
+
mcpRestart: backendRestartSupported && mutationAvailability.available,
|
|
71
114
|
},
|
|
72
115
|
});
|
|
73
116
|
});
|
|
74
|
-
router.post('/cli/v1/session/login', async (req, res) => {
|
|
117
|
+
router.post('/cli/v1/session/login', authenticationLimiter, async (req, res) => {
|
|
75
118
|
const parsedBody = adminLoginBodySchema.safeParse(req.body);
|
|
76
119
|
if (!parsedBody.success) {
|
|
77
120
|
sendCliError(req, res, {
|
|
@@ -143,7 +186,10 @@ export function createAdminRoutes(options) {
|
|
|
143
186
|
router.post('/cli/v1/operations/disable-server', async (req, res) => {
|
|
144
187
|
await handleCliConfiguredServerMutation(req, res, options, 'disableConfiguredServer');
|
|
145
188
|
});
|
|
146
|
-
router.post('/
|
|
189
|
+
router.post('/cli/v1/operations/restart-server', async (req, res) => {
|
|
190
|
+
await handleCliBackendRestart(req, res, options);
|
|
191
|
+
});
|
|
192
|
+
router.post('/api/session/login', authenticationLimiter, async (req, res) => {
|
|
147
193
|
const parsedBody = adminLoginBodySchema.safeParse(req.body);
|
|
148
194
|
if (!parsedBody.success) {
|
|
149
195
|
res.status(400).json({ error: 'admin_login_request_invalid' });
|
|
@@ -205,7 +251,7 @@ export function createAdminRoutes(options) {
|
|
|
205
251
|
clearAdminSessionCookie(res, options.getRuntimeIdentity().externalUrl);
|
|
206
252
|
res.status(200).json({ ok: true });
|
|
207
253
|
});
|
|
208
|
-
router.get('/api/status', (req, res) => {
|
|
254
|
+
router.get('/api/status', statusLimiter, (req, res) => {
|
|
209
255
|
const session = options.adminService.validateSession(getAdminSessionCookie(req));
|
|
210
256
|
if (!session) {
|
|
211
257
|
res.status(401).json({ authenticated: false });
|
|
@@ -231,6 +277,34 @@ export function createAdminRoutes(options) {
|
|
|
231
277
|
}),
|
|
232
278
|
});
|
|
233
279
|
});
|
|
280
|
+
router.post('/api/oauth/:serviceId/authorize', sensitiveOperationLimiter, async (req, res) => {
|
|
281
|
+
if (!options.oauthService) {
|
|
282
|
+
res.status(503).json({ error: 'backend_oauth_runtime_unavailable' });
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const serviceId = parseAdminOAuthServiceId(req, res);
|
|
286
|
+
if (!serviceId)
|
|
287
|
+
return;
|
|
288
|
+
const result = await options.oauthService.authorizeService({
|
|
289
|
+
context: buildAdminOperationContext(req, options, { type: 'backend_oauth_service', id: serviceId }),
|
|
290
|
+
serviceId,
|
|
291
|
+
});
|
|
292
|
+
sendAdminOAuthOperationResult(res, result);
|
|
293
|
+
});
|
|
294
|
+
router.post('/api/oauth/:serviceId/restart', sensitiveOperationLimiter, async (req, res) => {
|
|
295
|
+
if (!options.oauthService) {
|
|
296
|
+
res.status(503).json({ error: 'backend_oauth_runtime_unavailable' });
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const serviceId = parseAdminOAuthServiceId(req, res);
|
|
300
|
+
if (!serviceId)
|
|
301
|
+
return;
|
|
302
|
+
const result = await options.oauthService.restartService({
|
|
303
|
+
context: buildAdminOperationContext(req, options, { type: 'backend_oauth_service', id: serviceId }),
|
|
304
|
+
serviceId,
|
|
305
|
+
});
|
|
306
|
+
sendAdminOAuthOperationResult(res, result);
|
|
307
|
+
});
|
|
234
308
|
router.get('/api/presets', async (req, res) => {
|
|
235
309
|
if (!options.presetService)
|
|
236
310
|
return void res.status(404).json({ error: 'admin_presets_unavailable' });
|
|
@@ -374,7 +448,7 @@ function sendAdminConsoleIndex(res, indexPath) {
|
|
|
374
448
|
res.status(503).type('text/plain').send('Admin Console assets are not available. Run the package build first.');
|
|
375
449
|
return;
|
|
376
450
|
}
|
|
377
|
-
res.status(200).sendFile(indexPath);
|
|
451
|
+
res.status(200).sendFile(indexPath, { dotfiles: 'allow' });
|
|
378
452
|
}
|
|
379
453
|
function unauthenticatedAdminApiResponse(options) {
|
|
380
454
|
return options.adminService.hasAdminAccount()
|
|
@@ -452,6 +526,109 @@ async function handleCliConfiguredServerMutation(req, res, options, operationNam
|
|
|
452
526
|
: await options.configuredServerService.disableConfiguredServer(input);
|
|
453
527
|
sendCliAdminOperationResult(req, res, result);
|
|
454
528
|
}
|
|
529
|
+
async function handleCliBackendRestart(req, res, options) {
|
|
530
|
+
if (!options.backendRestartService) {
|
|
531
|
+
sendCliError(req, res, {
|
|
532
|
+
status: 404,
|
|
533
|
+
code: 'backend_restart_unavailable',
|
|
534
|
+
message: 'Backend restart administration is unavailable',
|
|
535
|
+
retryable: false,
|
|
536
|
+
});
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
if (isMutationLocked(options)) {
|
|
540
|
+
sendCliError(req, res, {
|
|
541
|
+
status: 409,
|
|
542
|
+
code: 'runtime_scope_locked',
|
|
543
|
+
message: 'Runtime scope admin mutations are locked by another writer',
|
|
544
|
+
retryable: true,
|
|
545
|
+
details: { operationName: 'restartBackend', reason: 'writer_lock_unavailable' },
|
|
546
|
+
});
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
const sessionToken = getBearerSessionToken(req);
|
|
550
|
+
const session = sessionToken ? options.adminService.validateSession(sessionToken) : null;
|
|
551
|
+
if (!sessionToken || !session) {
|
|
552
|
+
sendCliError(req, res, {
|
|
553
|
+
status: 401,
|
|
554
|
+
code: 'admin_session_required',
|
|
555
|
+
message: 'A valid admin session bearer token is required',
|
|
556
|
+
retryable: false,
|
|
557
|
+
});
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
const parsedBody = cliBackendRestartBodySchema.safeParse(req.body);
|
|
561
|
+
if (!parsedBody.success) {
|
|
562
|
+
sendCliError(req, res, {
|
|
563
|
+
status: 400,
|
|
564
|
+
code: 'validation_request_invalid',
|
|
565
|
+
message: 'Backend targetName and restart selectors must have valid, mutually exclusive values',
|
|
566
|
+
retryable: false,
|
|
567
|
+
});
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
const { targetName, instance, allInstances = false } = parsedBody.data;
|
|
571
|
+
const selection = instance
|
|
572
|
+
? { mode: 'instance', instanceIdOrPrefix: instance }
|
|
573
|
+
: allInstances
|
|
574
|
+
? { mode: 'all_instances' }
|
|
575
|
+
: { mode: 'target_default' };
|
|
576
|
+
const context = buildCliAdminOperationContext(req, options, session.account, sessionToken, {
|
|
577
|
+
type: 'backend',
|
|
578
|
+
id: targetName,
|
|
579
|
+
});
|
|
580
|
+
const result = await options.backendRestartService.restartBackend({
|
|
581
|
+
context,
|
|
582
|
+
targetName,
|
|
583
|
+
selection,
|
|
584
|
+
confirmationRequirements: cliBackendRestartConfirmationRequirements(options, targetName),
|
|
585
|
+
});
|
|
586
|
+
if (result.ok && isBackendRestartFailureResult(result.result)) {
|
|
587
|
+
sendCliBackendRestartOutcome(req, res, result.result);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
sendCliAdminOperationResult(req, res, result);
|
|
591
|
+
}
|
|
592
|
+
function sendCliBackendRestartOutcome(req, res, result) {
|
|
593
|
+
const response = backendRestartFailure(result.outcome);
|
|
594
|
+
sendCliError(req, res, {
|
|
595
|
+
status: response.status,
|
|
596
|
+
code: response.code,
|
|
597
|
+
message: response.message,
|
|
598
|
+
retryable: false,
|
|
599
|
+
details: {
|
|
600
|
+
targetName: result.targetName,
|
|
601
|
+
...(result.candidateInstanceIds ? { candidateInstanceIds: result.candidateInstanceIds } : {}),
|
|
602
|
+
},
|
|
603
|
+
});
|
|
604
|
+
}
|
|
605
|
+
function isBackendRestartFailureResult(result) {
|
|
606
|
+
return result.outcome !== 'restarted';
|
|
607
|
+
}
|
|
608
|
+
function backendRestartFailure(outcome) {
|
|
609
|
+
switch (outcome) {
|
|
610
|
+
case 'target_not_found':
|
|
611
|
+
return { status: 404, code: 'backend_not_found', message: 'Backend target was not found' };
|
|
612
|
+
case 'target_disabled':
|
|
613
|
+
return { status: 409, code: 'backend_disabled', message: 'Backend target is disabled' };
|
|
614
|
+
case 'instance_not_found':
|
|
615
|
+
return { status: 404, code: 'backend_instance_not_found', message: 'Backend instance was not found' };
|
|
616
|
+
case 'instance_ambiguous':
|
|
617
|
+
return { status: 409, code: 'backend_instance_ambiguous', message: 'Backend instance prefix is ambiguous' };
|
|
618
|
+
case 'no_active_instances':
|
|
619
|
+
return {
|
|
620
|
+
status: 409,
|
|
621
|
+
code: 'backend_no_active_instances',
|
|
622
|
+
message: 'Backend has no active instances to restart',
|
|
623
|
+
};
|
|
624
|
+
case 'no_unhealthy_instances':
|
|
625
|
+
return {
|
|
626
|
+
status: 409,
|
|
627
|
+
code: 'backend_no_unhealthy_instances',
|
|
628
|
+
message: 'Backend has no unhealthy active instances to restart by default',
|
|
629
|
+
};
|
|
630
|
+
}
|
|
631
|
+
}
|
|
455
632
|
async function handleConfiguredServerDetail(req, res, options) {
|
|
456
633
|
if (!options.configuredServerService) {
|
|
457
634
|
res.status(404).json({ error: 'admin_configured_servers_unavailable' });
|
|
@@ -623,7 +800,7 @@ async function handleConfiguredServerMutation(req, res, options, operationName)
|
|
|
623
800
|
sendAdminOperationResult(res, result);
|
|
624
801
|
}
|
|
625
802
|
function cliMutationAvailability(options, setupRequired) {
|
|
626
|
-
if (!options.configuredServerService) {
|
|
803
|
+
if (!options.configuredServerService && !options.backendRestartService) {
|
|
627
804
|
return {
|
|
628
805
|
available: false,
|
|
629
806
|
reason: 'mutation_service_unavailable',
|
|
@@ -745,9 +922,20 @@ function getBearerSessionToken(req) {
|
|
|
745
922
|
if (!authorization) {
|
|
746
923
|
return undefined;
|
|
747
924
|
}
|
|
748
|
-
const
|
|
749
|
-
|
|
750
|
-
|
|
925
|
+
const bearerScheme = 'Bearer';
|
|
926
|
+
if (authorization.length <= bearerScheme.length ||
|
|
927
|
+
authorization.slice(0, bearerScheme.length).toLowerCase() !== bearerScheme.toLowerCase()) {
|
|
928
|
+
return undefined;
|
|
929
|
+
}
|
|
930
|
+
let tokenStart = bearerScheme.length;
|
|
931
|
+
if (authorization.charCodeAt(tokenStart) !== 0x20) {
|
|
932
|
+
return undefined;
|
|
933
|
+
}
|
|
934
|
+
while (authorization.charCodeAt(tokenStart) === 0x20) {
|
|
935
|
+
tokenStart += 1;
|
|
936
|
+
}
|
|
937
|
+
const token = authorization.slice(tokenStart);
|
|
938
|
+
return token && !/\s/u.test(token) ? token : undefined;
|
|
751
939
|
}
|
|
752
940
|
function isHttpsRuntime(externalUrl) {
|
|
753
941
|
try {
|
|
@@ -864,6 +1052,26 @@ function sendAdminOperationResult(res, result) {
|
|
|
864
1052
|
const status = result.status === 'idempotency_key_required' ? 400 : result.status === 'mutation_failed' ? 409 : 409;
|
|
865
1053
|
res.status(status).json(result);
|
|
866
1054
|
}
|
|
1055
|
+
function sendAdminOAuthOperationResult(res, result) {
|
|
1056
|
+
if (!result.ok && result.status === 'mutation_failed') {
|
|
1057
|
+
const status = result.error === 'backend_oauth_service_not_found'
|
|
1058
|
+
? 404
|
|
1059
|
+
: result.error === 'backend_oauth_runtime_unavailable'
|
|
1060
|
+
? 503
|
|
1061
|
+
: 502;
|
|
1062
|
+
res.status(status).json({ ok: false, error: result.error });
|
|
1063
|
+
return;
|
|
1064
|
+
}
|
|
1065
|
+
sendAdminOperationResult(res, result);
|
|
1066
|
+
}
|
|
1067
|
+
function parseAdminOAuthServiceId(req, res) {
|
|
1068
|
+
const parsed = adminOAuthServiceParamsSchema.safeParse(req.params);
|
|
1069
|
+
if (!parsed.success) {
|
|
1070
|
+
res.status(400).json({ error: 'backend_oauth_service_id_invalid' });
|
|
1071
|
+
return null;
|
|
1072
|
+
}
|
|
1073
|
+
return parsed.data.serviceId;
|
|
1074
|
+
}
|
|
867
1075
|
async function handlePresetMutation(req, res, options, action) {
|
|
868
1076
|
if (!options.presetService) {
|
|
869
1077
|
res.status(404).json({ error: 'admin_presets_unavailable' });
|
|
@@ -972,7 +1180,9 @@ function buildAdminOperationContext(req, options, target) {
|
|
|
972
1180
|
jsonMode: true,
|
|
973
1181
|
},
|
|
974
1182
|
idempotencyKey: req.header('Idempotency-Key'),
|
|
975
|
-
requestFingerprint:
|
|
1183
|
+
requestFingerprint: target.type === 'backend_oauth_service'
|
|
1184
|
+
? backendOAuthRequestFingerprint(operationName, target.id)
|
|
1185
|
+
: configuredServerRequestFingerprint(operationName, target.id, req.body),
|
|
976
1186
|
confirmationFacts: getBodyRecord(req.body, 'confirmationFacts'),
|
|
977
1187
|
};
|
|
978
1188
|
}
|
|
@@ -1016,6 +1226,19 @@ function cliConfiguredServerConfirmationRequirements(options, targetName, operat
|
|
|
1016
1226
|
},
|
|
1017
1227
|
];
|
|
1018
1228
|
}
|
|
1229
|
+
function cliBackendRestartConfirmationRequirements(options, targetName) {
|
|
1230
|
+
const identity = options.getRuntimeIdentity();
|
|
1231
|
+
if (isLoopbackRuntimeUrl(identity.externalUrl)) {
|
|
1232
|
+
return [];
|
|
1233
|
+
}
|
|
1234
|
+
const target = { type: 'backend', id: targetName };
|
|
1235
|
+
return [
|
|
1236
|
+
{ code: 'confirm_non_loopback_runtime', expected: true, target },
|
|
1237
|
+
{ code: 'confirmedOperation', expected: 'mcp.restart', target },
|
|
1238
|
+
{ code: 'confirmedRuntimeScopeId', expected: identity.runtimeScopeId, target },
|
|
1239
|
+
{ code: 'confirmationSource', expected: 'cli_flag', target },
|
|
1240
|
+
];
|
|
1241
|
+
}
|
|
1019
1242
|
function buildCliAdminOperationContext(req, options, account, sessionToken, target) {
|
|
1020
1243
|
const runtimeIdentity = options.getRuntimeIdentity();
|
|
1021
1244
|
const operationName = operationNameForRequest(req);
|
|
@@ -1036,31 +1259,51 @@ function buildCliAdminOperationContext(req, options, account, sessionToken, targ
|
|
|
1036
1259
|
jsonMode: true,
|
|
1037
1260
|
},
|
|
1038
1261
|
idempotencyKey: req.header('Idempotency-Key'),
|
|
1039
|
-
requestFingerprint: configuredServerRequestFingerprint(operationName, target.id),
|
|
1262
|
+
requestFingerprint: configuredServerRequestFingerprint(operationName, target.id, req.body),
|
|
1040
1263
|
confirmationFacts: getBodyRecord(req.body, 'confirmationFacts'),
|
|
1041
1264
|
};
|
|
1042
1265
|
}
|
|
1043
1266
|
function configuredServerRequestFingerprint(operationName, targetName, body) {
|
|
1267
|
+
const previewFingerprint = getBodyString(body, 'previewFingerprint');
|
|
1044
1268
|
const normalized = stableJsonStringify({
|
|
1045
1269
|
schemaVersion: 1,
|
|
1046
1270
|
operationName,
|
|
1047
1271
|
target: {
|
|
1048
|
-
type: 'configured_server',
|
|
1272
|
+
type: operationName === 'restartBackend' ? 'backend' : 'configured_server',
|
|
1049
1273
|
id: targetName ?? '',
|
|
1050
1274
|
},
|
|
1051
1275
|
...(operationName === 'applyConfiguredServerEdit'
|
|
1052
1276
|
? {
|
|
1053
|
-
previewFingerprint
|
|
1054
|
-
editDigest:
|
|
1055
|
-
|
|
1056
|
-
|
|
1277
|
+
previewFingerprint,
|
|
1278
|
+
editDigest: keyedRequestFingerprint(previewFingerprint, 'configured-server-edit', stableJsonStringify(getBodyValue(body, 'edit') ?? {})),
|
|
1279
|
+
}
|
|
1280
|
+
: {}),
|
|
1281
|
+
...(operationName === 'restartBackend'
|
|
1282
|
+
? {
|
|
1283
|
+
restartSelection: {
|
|
1284
|
+
instance: getBodyString(body, 'instance'),
|
|
1285
|
+
allInstances: getBodyValue(body, 'allInstances') === true,
|
|
1286
|
+
},
|
|
1057
1287
|
}
|
|
1058
1288
|
: {}),
|
|
1059
1289
|
});
|
|
1060
1290
|
return operationName === 'applyConfiguredServerEdit'
|
|
1061
|
-
? `configured_server_apply_${
|
|
1291
|
+
? `configured_server_apply_${keyedRequestFingerprint(previewFingerprint, 'configured-server-apply', normalized)}`
|
|
1062
1292
|
: normalized;
|
|
1063
1293
|
}
|
|
1294
|
+
function keyedRequestFingerprint(key, domain, value) {
|
|
1295
|
+
return createHmac('sha256', key).update(domain).update('\0').update(value).digest('hex');
|
|
1296
|
+
}
|
|
1297
|
+
function backendOAuthRequestFingerprint(operationName, serviceId) {
|
|
1298
|
+
return stableJsonStringify({
|
|
1299
|
+
schemaVersion: 1,
|
|
1300
|
+
operationName,
|
|
1301
|
+
target: {
|
|
1302
|
+
type: 'backend_oauth_service',
|
|
1303
|
+
id: serviceId ?? '',
|
|
1304
|
+
},
|
|
1305
|
+
});
|
|
1306
|
+
}
|
|
1064
1307
|
function stableJsonStringify(value) {
|
|
1065
1308
|
if (Array.isArray(value)) {
|
|
1066
1309
|
return `[${value.map((item) => stableJsonStringify(item)).join(',')}]`;
|
|
@@ -1130,6 +1373,12 @@ function cliOperationErrorDetails(result) {
|
|
|
1130
1373
|
return details;
|
|
1131
1374
|
}
|
|
1132
1375
|
function operationNameForRequest(req) {
|
|
1376
|
+
if (req.path.startsWith('/api/oauth/')) {
|
|
1377
|
+
return req.path.endsWith('/restart') ? 'restartBackendOAuth' : 'authorizeBackendOAuth';
|
|
1378
|
+
}
|
|
1379
|
+
if (req.path.endsWith('/restart-server')) {
|
|
1380
|
+
return 'restartBackend';
|
|
1381
|
+
}
|
|
1133
1382
|
if (req.path.endsWith('/enable') || req.path.endsWith('/enable-server')) {
|
|
1134
1383
|
return 'enableConfiguredServer';
|
|
1135
1384
|
}
|
|
@@ -1179,10 +1428,19 @@ function sanitizeOAuthDashboard(dashboard) {
|
|
|
1179
1428
|
...dashboard,
|
|
1180
1429
|
services: dashboard.services.map((service) => ({
|
|
1181
1430
|
...service,
|
|
1431
|
+
id: service.name,
|
|
1432
|
+
displayName: backendOAuthServiceDisplayName(service.name),
|
|
1182
1433
|
lastError: service.lastError ? sanitizeErrorMessage(service.lastError) : undefined,
|
|
1183
1434
|
})),
|
|
1184
1435
|
};
|
|
1185
1436
|
}
|
|
1437
|
+
function backendOAuthServiceDisplayName(serviceId) {
|
|
1438
|
+
const identity = parseTemplateConnectionKey(serviceId);
|
|
1439
|
+
if (identity.kind !== 'rendered' || identity.renderedHash.length <= TEMPLATE_INSTANCE_ID_DISPLAY_LENGTH) {
|
|
1440
|
+
return serviceId;
|
|
1441
|
+
}
|
|
1442
|
+
return `${identity.templateName}:${identity.renderedHash.slice(0, TEMPLATE_INSTANCE_ID_DISPLAY_LENGTH)}`;
|
|
1443
|
+
}
|
|
1186
1444
|
function getBodyValue(body, key) {
|
|
1187
1445
|
if (!body || typeof body !== 'object') {
|
|
1188
1446
|
return undefined;
|